online gain calibration added
[u/mrichter/AliRoot.git] / PMD / PMDda.cxx
1 /*
2
3 DAcase2.c
4
5 This program connects to the DAQ data source passed as argument
6 and populates local "./result.txt" file with the ids of events received
7 during the run.
8
9 The program exits when being asked to shut down (daqDA_checkshutdown)
10 or End of Run event.
11
12 Messages on stdout are exported to DAQ log system.
13
14 contact: alice-datesupport@cern.ch
15
16 */
17 extern "C" {
18 #include <daqDA.h>
19 }
20
21 #include "event.h"
22 #include "monitor.h"
23 //#include "daqDA.h"
24
25 #include <Riostream.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28
29 //AliRoot
30 #include "AliRawReaderDate.h"
31 #include "AliPMDCalibPedestal.h"
32
33 //ROOT
34 #include "TFile.h"
35 #include "TH1F.h"
36 #include "TBenchmark.h"
37
38
39 /* Main routine
40       Arguments: 
41       1- monitoring data source
42 */
43 int main(int argc, char **argv) {
44   
45   AliPMDCalibPedestal calibped;
46
47   TTree *ped  = new TTree("ped","PMD Pedestal tree");
48   TTree *gain = new TTree("gain","PMD Gain tree");
49
50   TH1F::AddDirectory(0);
51   
52       
53   // decoding the events
54   
55   int status;
56
57   if (argc!=2) {
58     printf("Wrong number of arguments\n");
59     return -1;
60   }
61
62   /* open result file */
63   FILE *fp=NULL;
64   fp=fopen("./result.txt","a");
65   if (fp==NULL) {
66     printf("Failed to open file\n");
67     return -1;
68   }
69
70   /* define data source : this is argument 1 */  
71   status=monitorSetDataSource( argv[1] );
72   if (status!=0) {
73     printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
74     return -1;
75   }
76
77   /* declare monitoring program */
78   status=monitorDeclareMp( __FILE__ );
79   if (status!=0) {
80     printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
81     return -1;
82   }
83
84   /* define wait event timeout - 1s max */
85   monitorSetNowait();
86   monitorSetNoWaitNetworkTimeout(1000);
87   
88   /* log start of process */
89   printf("DA example case2 monitoring program started\n");  
90
91   /* init some counters */
92   int nevents_physics=0;
93   int nevents_total=0;
94
95   struct eventHeaderStruct *event;
96   eventTypeType eventT;
97   Int_t iev=0;
98
99   /* main loop (infinite) */
100   for(;;) {
101     
102     /* check shutdown condition */
103     if (daqDA_checkShutdown()) {break;}
104     
105     /* get next event (blocking call until timeout) */
106     status=monitorGetEventDynamic((void **)&event);
107     if (status==MON_ERR_EOF) {
108       printf ("End of File detected\n");
109       break; /* end of monitoring file has been reached */
110     }
111     
112     if (status!=0) {
113       printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
114       break;
115     }
116     
117     /* retry if got no event */
118     if (event==NULL) {
119       continue;
120     }
121
122     iev++; 
123
124    /* use event - here, just write event id to result file */
125     eventT=event->eventType;
126     switch (event->eventType){
127       
128       /* START OF RUN */
129     case START_OF_RUN:
130       break;
131       /* END START OF RUN */
132       
133     /* END OF RUN */
134     case END_OF_RUN:
135       break;
136       
137     case PHYSICS_EVENT:
138       printf(" event number = %i \n",iev);
139       AliRawReader *rawReader = new AliRawReaderDate((void*)event);
140       calibped.ProcessEvent(rawReader);
141
142       calibgain.ProcessEvent(rawReader);
143
144       delete rawReader;
145       rawReader = 0x0;
146
147     }
148        
149     /* free resources */
150     free(event);
151     
152     /* exit when last event received, no need to wait for TERM signal */
153     if (eventT==END_OF_RUN) {
154       printf("EOR event detected\n");
155       calibped.Analyse(ped);
156       calibgain.Analyse(gain);
157
158       break;
159     }
160   }
161   
162   //write the Run level file   
163   TFile * fileRun = new TFile ("outPMDdaRun.root","RECREATE"); 
164   TBenchmark *bench = new TBenchmark();
165   bench->Start("PMD");
166   bench->Stop("PMD");
167   bench->Print("PMD");
168   fileRun->Close();
169
170   /* write report */
171   fprintf(fp,"Run #%s, received %d physics events out of %d\n",getenv("DATE_RUN_NUMBER"),nevents_physics,nevents_total);
172
173
174   TFile * pedRun = new TFile ("pmd_ped.root","RECREATE"); 
175   ped->Write();
176   pedRun->Close();
177
178   TFile * gainRun = new TFile ("pmd_calib.root","RECREATE"); 
179   gain->Write();
180   gainRun->Close();
181
182
183
184   /* close result file */
185   fclose(fp);
186
187
188   return status;
189 }