segmentation fault in daq machine is fixed
[u/mrichter/AliRoot.git] / PMD / PMDGAINda.cxx
1 /*
2 PMD DA for online calibration
3
4 contact: basanta@phy.iitb.ac.in
5 Link:
6 Reference run:/afs/cern.ch/user/s/sjena/public/run83496.raw
7 Run Type: PHYSICS
8 DA Type: MON
9 Number of events needed: 1 million for PB+PB, 200 milion for p+p
10 Input Files: Run0_999999999_v0_s0.root,PMD_PED.root, PMD_GAIN_CONFIGFILE, pmd_gain_tempfile.dat
11 Output Files: PMDGAINS.root, to be exported to the DAQ FES
12 Trigger types used: PHYSICS_EVENT
13
14 */
15 extern "C" {
16 #include <daqDA.h>
17 }
18
19 #include "event.h"
20 #include "monitor.h"
21
22 #include <Riostream.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25
26 //AliRoot
27 #include "AliRawReaderDate.h"
28 #include "AliPMDCalibPedestal.h"
29 #include "AliPMDCalibGain.h"
30 #include "AliLog.h"
31 #include "AliCDBManager.h"
32
33 //ROOT
34 #include "TFile.h"
35 #include "TH1F.h"
36 #include "TBenchmark.h"
37 #include "TTree.h"
38 #include "TROOT.h"
39 #include "TPluginManager.h"
40 #include "TSystem.h"
41
42
43 /* Main routine
44       Arguments: 
45       1- monitoring data source
46 */
47 int main(int argc, char **argv) {
48   
49     /* magic line from Rene */
50     gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
51                                           "*",
52                                           "TStreamerInfo",
53                                           "RIO",
54                                           "TStreamerInfo()");
55
56
57     int status = 0;
58
59
60     Int_t filestatus = -1, xvar = 5;
61     Int_t totevt = -1, maxevt = -1;
62     Int_t hotevtsize = -1;
63     Bool_t hotfilestatus = false;
64
65     // Reads the pedestal file and keep the values in memory for subtraction
66
67     AliPMDCalibGain *calibgain = new AliPMDCalibGain();
68
69     // Fetch the pedestal file - PMD_PED.root 
70
71     status = daqDA_DB_getFile("PMD_PED.root","PMD_PED.root");
72
73     if(!status)
74       {
75         printf("*** Pedestal file retrieved from DB *** \n");
76       }
77     else
78       {
79         printf("*** Pedestal file NOT retrieved from DB *** \n");
80         return -1;
81       }
82     
83     Int_t pstatus = calibgain->ExtractPedestal("PMD_PED.root");
84
85     if(pstatus == -3) return -3;
86
87     TTree *ic    = NULL;
88     TTree *meanc = NULL;
89
90     // Retrieve the PMD_GAIN_CONFIGFILE
91     status = daqDA_DB_getFile("PMD_GAIN_CONFIGFILE","PMD_GAIN_CONFIGFILE");
92
93     FILE *fp1 = NULL;
94
95     fp1 = fopen("PMD_GAIN_CONFIGFILE","r");
96
97     if (fp1 == NULL)
98       {
99         printf("*** PMD GAIN Configfile doesn't exist,Provide one ***\n");
100         return -1;
101       }
102     else
103       {
104         fscanf(fp1,"%d %d %d %d %d\n",&filestatus, &xvar, &totevt, &maxevt, &hotevtsize);
105         //printf("%d %d %d %d %d\n",filestatus, xvar, totevt, maxevt, hotevtsize);
106       }
107     fclose(fp1);
108
109     
110     if (filestatus == 1)
111       {
112         // Retrieve the Temporray ascii file from DB
113         status = daqDA_DB_getFile("pmd_gain_tempfile.dat","pmd_gain_tempfile.dat");
114         if(!status)
115           {
116             calibgain->ReadTempFile("pmd_gain_tempfile.dat");
117           }
118         else
119           {
120             printf("--- pmd_gain_tempfile.dat: not retrieved from DB ---\n");
121           }
122         // Retrieve the hot cell file from DB - PMD_HOT.root
123         status = daqDA_DB_getFile("PMD_HOT.root","PMD_HOT.root");
124         if(!status)
125           {
126             calibgain->ExtractHotChannel("PMD_HOT.root");
127           }
128         else
129           {
130             printf("--- pmd_gain_tempfile.dat: not retrieved from DB ---\n");
131           }
132       }
133
134
135     // decoding the events
136     
137
138     if (argc!=2) {
139         printf("Wrong number of arguments\n");
140         return -1;
141     }
142     
143     
144     /* define data source : this is argument 1 */  
145     status=monitorSetDataSource( argv[1] );
146     if (status!=0) {
147         printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
148         return -1;
149     }
150     
151     /* declare monitoring program */
152     status=monitorDeclareMp( __FILE__ );
153     if (status!=0) {
154         printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
155         return -1;
156     }
157     
158     /* define wait event timeout - 1s max */
159     monitorSetNowait();
160     monitorSetNoWaitNetworkTimeout(1000);
161     
162     /* log start of process */
163     printf("PMD GAIN DA - strted generating the gain of a cell\n");  
164     
165     /* init some counters */
166     int nevents_physics=0;
167     int nevents_total=0;
168     
169     struct eventHeaderStruct *event;
170     eventTypeType eventT = 0;
171
172     Int_t iev=0;
173
174     // Get run number
175
176     if (getenv("DATE_RUN_NUMBER")==0) {
177       printf("DATE_RUN_NUMBER not properly set.\n");
178       return -1;
179     }
180     int runNr = atoi(getenv("DATE_RUN_NUMBER"));
181
182     //int runNr = 0;
183
184     if (gSystem->AccessPathName("localOCDB/PMD/Calib/Mapping",kFileExists))
185       {
186         if (gSystem->mkdir("localOCDB/PMD/Calib/Mapping",kTRUE) != 0)
187           {
188             printf("Failed to create directory: localOCDB/PMD/Calib/Mapping");
189             return -1;
190           }
191       }
192     status = daqDA_DB_getFile("PMD/Calib/Mapping","localOCDB/PMD/Calib/Mapping/Run0_999999999_v0_s0.root");
193     if (status)
194       {
195         printf("Failed to get PMD-Mapping file (PMD/Calib/Mapping) from DAQdetDB, status=%d\n", status);
196         return -1;
197       }
198
199     // Global initializations
200     AliLog::SetGlobalLogLevel(AliLog::kError);
201     AliCDBManager *man = AliCDBManager::Instance();
202     man->SetDefaultStorage("local://localOCDB");
203     man->SetRun(runNr);
204
205     
206     /* main loop (infinite) */
207     for(;;) {
208         
209         /* check shutdown condition */
210         if (daqDA_checkShutdown()) {break;}
211         
212         /* get next event (blocking call until timeout) */
213         status=monitorGetEventDynamic((void **)&event);
214         if (status==MON_ERR_EOF) {
215             printf ("End of File detected\n");
216             break; /* end of monitoring file has been reached */
217         }
218         
219         if (status!=0) {
220             printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
221             break;
222         }
223         
224         /* retry if got no event */
225         if (event==NULL) {
226             continue;
227         }
228         
229         iev++; 
230         
231         /* use event - here, just write event id to result file */
232         nevents_total++;
233         eventT=event->eventType;
234         switch (event->eventType){
235       
236             /* START OF RUN */
237             case START_OF_RUN:
238                 break;
239                 /* END START OF RUN */
240                 
241                 /* END OF RUN */
242             case END_OF_RUN:
243                 break;
244                 
245             case PHYSICS_EVENT:
246                 nevents_physics++;
247                 totevt++;
248                 //if(nevents_physics%100 == 0)printf("Physis Events = %d\n",nevents_physics);
249                 AliRawReader *rawReader = new AliRawReaderDate((void*)event);
250                 TObjArray *pmdddlcont = new TObjArray();
251                 calibgain->ProcessEvent(rawReader, pmdddlcont);
252
253                 if (totevt%hotevtsize == 0) hotfilestatus = true;
254                 delete pmdddlcont;
255                 pmdddlcont = 0x0;
256                 delete rawReader;
257                 rawReader = 0x0;
258                 
259         }
260        
261         /* free resources */
262         free(event);
263         
264     }
265
266     /* exit when last event received, no need to wait for TERM signal */
267
268
269     ic    = new TTree("ic","PMD Gain tree");
270     meanc = new TTree("meanc","PMD Module mean tree");
271
272     if (filestatus == 0)
273       {
274         TFile *hotRun = new TFile ("PMD_HOT.root","RECREATE");
275
276         TTree *hot = new TTree("hot","PMD Hot cell tree");
277         
278         calibgain->FindHotCell(hot,xvar);
279         
280         hot->Write();
281         hotRun->Close();
282
283         // store the hot cell root file in the DB
284
285         status = daqDA_DB_storeFile("PMD_HOT.root","PMD_HOT.root");
286
287         // store the hot cell root file in the file exchange server
288
289         printf("root file for hot cell is created and getting exported\n");
290         status = daqDA_FES_storeFile("PMD_HOT.root","PMD_HOT.root");
291       }
292
293     if (hotfilestatus)
294       {
295         TFile *hotRun = new TFile ("PMD_HOT.root","RECREATE");
296
297         TTree *hot = new TTree("hot","PMD Hot cell tree");
298         
299         calibgain->FindHotCell(hot,xvar);
300         
301         hot->Write();
302         hotRun->Close();
303
304         // store the hot cell root file in the DB
305
306         status = daqDA_DB_storeFile("PMD_HOT.root","PMD_HOT.root");
307         
308         // store the hot cell root file in the file exchange server
309
310         printf("root file for hot cell is created and getting exported\n");
311         status = daqDA_FES_storeFile("PMD_HOT.root","PMD_HOT.root");
312       }
313
314
315     fp1 = fopen("PMD_GAIN_CONFIGFILE","w+");
316
317     if (totevt < maxevt)
318       {
319         printf("-----------------------------------------------\n");
320         printf("***  Required Number of Events not reached  ***\n");
321         printf("***  Number of Events processed = %d        ***\n",totevt);
322         printf("***  Writing the intermediate ASCII file    ***\n");
323         printf("-----------------------------------------------\n");
324
325         calibgain->WriteTempFile("pmd_gain_tempfile.dat");
326
327         // Store the Intermediate ascii file in the DB
328         status = daqDA_DB_storeFile("pmd_gain_tempfile.dat","pmd_gain_tempfile.dat");
329
330         filestatus = 1;
331         fprintf(fp1,"%d %d %d %d %d\n",filestatus,xvar,totevt,maxevt,hotevtsize);
332         fclose(fp1);
333
334         // Store the configfile in the DB
335         status = daqDA_DB_storeFile("PMD_GAIN_CONFIGFILE","PMD_GAIN_CONFIGFILE");
336
337       }
338     else if (totevt >= maxevt)
339       {
340         printf("-----------------------------------------------\n");
341         printf("***  Required Number of Events reached = %d ***\n",totevt);
342         printf("***  Writing the PMDGAINS.root file           ***\n");
343         printf("-----------------------------------------------\n");
344
345         calibgain->Analyse(ic, meanc);
346
347         TFile * gainRun = new TFile ("PMDGAINS.root","RECREATE"); 
348         ic->Write();
349         gainRun->Close();
350
351         TFile * meanRun = new TFile ("PMD_MEAN_SM.root","RECREATE"); 
352         meanc->Write();
353         meanRun->Close();
354
355
356         filestatus = 0;
357         totevt     = 0;
358         fprintf(fp1,"%d %d %d %d %d\n",filestatus,xvar,totevt,maxevt,hotevtsize);
359         fclose(fp1);
360
361         // Store the configfile in the DB
362         status = daqDA_DB_storeFile("PMD_GAIN_CONFIGFILE","PMD_GAIN_CONFIGFILE");
363       }
364     
365     delete ic;
366     ic = 0;
367
368     delete meanc;
369     meanc = 0;
370     
371     delete calibgain;
372
373     /* store the result file on FES */
374  
375     if (filestatus == 0)
376       {
377         printf("root file for cell gain is created and getting exported\n");
378         status = daqDA_FES_storeFile("PMDGAINS.root","PMDGAINS.root");
379         printf("root file for normalised means of different modules\n");
380         status = daqDA_FES_storeFile("PMD_MEAN_SM.root","PMD_MEAN_SM.root");
381       }
382
383     if (hotfilestatus)
384       {
385       }
386
387     
388     if (status) {
389       status = -2;
390     }
391
392
393
394     return status;
395 }