]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ZDC/ZDCMAPPINGda.cxx
Coverity + warning
[u/mrichter/AliRoot.git] / ZDC / ZDCMAPPINGda.cxx
1 /*\r
2 \r
3 This program reads the DAQ data files passed as argument using the monitoring library.\r
4 \r
5 The program reports about its processing progress.\r
6 \r
7 Messages on stdout are exported to DAQ log system.\r
8 \r
9 DA to write mapping for ADC modules and VME scaler\r
10 \r
11 Contact: Chiara.Oppedisano@to.infn.it\r
12 Link: \r
13 Run Type: PHYSICS\r
14 DA Type: MON\r
15 Number of events needed: at least 50% \r
16 Input Files:  none\r
17 Output Files: ZDCChMapping.dat\r
18 Trigger Types Used: different trigger types are used\r
19 \r
20 */\r
21 \r
22 #define MAPDATA_FILE  "ZDCChMapping.dat"\r
23 #define TDCDATA_FILE  "ZDCTDCCalib.dat"\r
24 #define TDCHISTO_FILE "ZDCTDCHisto.root"\r
25 \r
26 #include <stdio.h>\r
27 #include <stdlib.h>\r
28 #include <Riostream.h>\r
29 #include <signal.h>\r
30 \r
31 // DATE\r
32 #include <event.h>\r
33 #include <monitor.h>\r
34 #include <daqDA.h>\r
35 \r
36 //ROOT\r
37 #include <TROOT.h>\r
38 #include <TPluginManager.h>\r
39 #include <TH1F.h>\r
40 #include <TH2F.h>\r
41 #include <TProfile.h>\r
42 #include <TF1.h>\r
43 #include <TFile.h>\r
44 #include <TFitter.h>\r
45 #include "TMinuitMinimizer.h"\r
46 \r
47 //AliRoot\r
48 #include <AliRawReaderDate.h>\r
49 #include <AliRawEventHeaderBase.h>\r
50 #include <AliZDCRawStream.h>\r
51 \r
52 int main(int argc, char **argv) {\r
53 \r
54   gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",\r
55                                         "*",\r
56                                         "TStreamerInfo",\r
57                                         "RIO",\r
58                                         "TStreamerInfo()"); \r
59 \r
60   TMinuitMinimizer m; \r
61   gROOT->GetPluginManager()->AddHandler("ROOT::Math::Minimizer", "Minuit","TMinuitMinimizer",\r
62       "Minuit", "TMinuitMinimizer(const char *)");\r
63   TVirtualFitter::SetDefaultFitter("Minuit");\r
64 \r
65   //const Char_t* tableSOD[]  = {"ALL", "no", "SOD", "all", NULL, NULL};\r
66   //monitorDeclareTable(const_cast<char**>(tableSOD));\r
67   \r
68   char *monitor_table[] = { "ALL", "no", "PHY", "yes", "SOD", "all", NULL };\r
69   int err = monitorDeclareTable(monitor_table);\r
70   if(err){\r
71     printf("monitorDeclareTable() failed: %s\n", monitorDecodeError(err));\r
72     return -1;\r
73   } \r
74   \r
75   int status=0, nphys=0;\r
76   int const kNModules = 10;\r
77   int const kNChannels = 24;\r
78   int const kNScChannels = 32;  \r
79   int const kZDCTDCGeo = 4;\r
80   \r
81   int itdc=0, iprevtdc=-1, ihittdc=0;\r
82   float tdcData[6], tdcL0=-999.;        \r
83   for(int ij=0; ij<6; ij++) tdcData[ij]=-999.;\r
84   \r
85   Int_t iMod=-1;\r
86   Int_t modGeo[kNModules], modType[kNModules],modNCh[kNModules];\r
87   for(Int_t kl=0; kl<kNModules; kl++){\r
88      modGeo[kl]=modType[kl]=modNCh[kl]=0;\r
89   }\r
90   \r
91   Int_t ich=0;\r
92   Int_t adcMod[2*kNChannels], adcCh[2*kNChannels], sigCode[2*kNChannels];\r
93   Int_t det[2*kNChannels], sec[2*kNChannels];\r
94   for(Int_t y=0; y<2*kNChannels; y++){\r
95     adcMod[y]=adcCh[y]=sigCode[y]=det[y]=sec[y]=0;\r
96   }\r
97   \r
98   Int_t iScCh=0;\r
99   Int_t scMod[kNScChannels], scCh[kNScChannels], scSigCode[kNScChannels];\r
100   Int_t scDet[kNScChannels], scSec[kNScChannels];\r
101   for(Int_t y=0; y<kNScChannels; y++){\r
102     scMod[y]=scCh[y]=scSigCode[y]=scDet[y]=scSec[y]=0;\r
103   }\r
104       \r
105   Int_t itdcCh=0;\r
106   Int_t tdcMod[kNScChannels], tdcCh[kNScChannels], tdcSigCode[kNScChannels];\r
107   Int_t tdcDet[kNScChannels], tdcSec[kNScChannels];\r
108   for(Int_t y=0; y<kNScChannels; y++){\r
109     tdcMod[y]=tdcCh[y]=tdcSigCode[y]=tdcDet[y]=tdcSec[y]=-1;\r
110   }\r
111  \r
112   TH1F * hTDC[6]={0x0,0x0,0x0,0x0,0x0,0x0};\r
113   char ntdchist[20];\r
114   for(Int_t it=0; it<6; it++){\r
115     if(it==0)      hTDC[it] = new TH1F("TDCZNC", "TDC ZNC", 200, -200., 200.);\r
116     else if(it==1) hTDC[it] = new TH1F("TDCZNA", "TDC ZNA", 200, -200., 200.);\r
117     else if(it==2) hTDC[it] = new TH1F("TDCZPC", "TDC ZPC", 200, -200., 200.);\r
118     else if(it==3) hTDC[it] = new TH1F("TDCZPA", "TDC ZPA", 200, -200., 200.);\r
119     else if(it==4) hTDC[it] = new TH1F("TDCZEM1","TDC ZEM1",200, -200., 200.);\r
120     else if(it==5) hTDC[it] = new TH1F("TDCZEM2","TDC ZEM2",200, -200., 200.);\r
121   }\r
122   \r
123   /* log start of process */\r
124   printf("\n ZDC MAPPING program started\n");  \r
125   signal(SIGSEGV, SIG_DFL);\r
126 \r
127   /* check that we got some arguments = list of files */\r
128   if (argc<2) {\r
129     printf("Wrong number of arguments\n");\r
130     return -1;\r
131   }\r
132   \r
133   FILE *mapFile4Shuttle;\r
134 \r
135   /* read the data files */\r
136   int n;\r
137   for(n=1;n<argc;n++){\r
138    \r
139     status=monitorSetDataSource( argv[n] );\r
140     if (status!=0) {\r
141       printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));\r
142       return -1;\r
143     }\r
144     \r
145     /* declare monitoring program */\r
146     status=monitorDeclareMp( __FILE__ );\r
147     if (status!=0) {\r
148       printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));\r
149       return -1;\r
150     }\r
151     monitorSetNowait();\r
152     monitorSetNoWaitNetworkTimeout(1000);\r
153 \r
154 \r
155     int iev = 0;\r
156     //Bool_t sodRead = kFALSE;\r
157     //while(!sodRead){\r
158     \r
159     /* loop on events (infinite) */\r
160     for(;;) {\r
161 \r
162       struct eventHeaderStruct *event;\r
163       eventTypeType eventT;\r
164  \r
165       /* check shutdown condition */\r
166       if (daqDA_checkShutdown()) {break;}\r
167 \r
168       /* get next event */\r
169       status=monitorGetEventDynamic((void **)&event);\r
170       if(status==MON_ERR_EOF){\r
171         printf ("End of File detected\n");\r
172         break; /* end of monitoring file has been reached */\r
173       }\r
174       if(status!=0) {\r
175         printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));\r
176         return -1;\r
177       }\r
178 \r
179       /* retry if got no event */\r
180       if(event==NULL) continue;\r
181       \r
182       // Initalize raw-data reading and decoding\r
183       AliRawReader *reader = new AliRawReaderDate((void*)event);\r
184       reader->Reset();\r
185       reader->Select("ZDC");\r
186       // --- Reading event header\r
187       //UInt_t evtype = reader->GetType();\r
188       //printf("\t ZDCMAPPINGda -> run # %d\n",reader->GetRunNumber());\r
189       //\r
190       AliZDCRawStream *rawStreamZDC = new AliZDCRawStream(reader);\r
191         \r
192         \r
193       /* use event - here, just write event id to result file */\r
194       eventT=event->eventType;\r
195       \r
196       if(eventT==START_OF_DATA){\r
197                 \r
198         rawStreamZDC->SetSODReading(kTRUE);\r
199         \r
200         // --------------------------------------------------------\r
201         // --- Writing ascii data file for the Shuttle preprocessor\r
202         mapFile4Shuttle = fopen(MAPDATA_FILE,"w");\r
203         //if(rawStreamZDC->Next()){\r
204           while((rawStreamZDC->Next())){\r
205             if(rawStreamZDC->IsHeaderMapping()){ // mapping header\r
206                iMod++;\r
207                modGeo[iMod]  = rawStreamZDC->GetADCModule();\r
208                modType[iMod] = rawStreamZDC->GetModType();\r
209                modNCh[iMod]  = rawStreamZDC->GetADCNChannels();\r
210             }\r
211             if(rawStreamZDC->IsChMapping()){ \r
212               if(modType[iMod]==1){ // ADC mapping ----------------------\r
213                 adcMod[ich]  = rawStreamZDC->GetADCModFromMap(ich);\r
214                 adcCh[ich]   = rawStreamZDC->GetADCChFromMap(ich);\r
215                 sigCode[ich] = rawStreamZDC->GetADCSignFromMap(ich);\r
216                 det[ich]     = rawStreamZDC->GetDetectorFromMap(ich);\r
217                 sec[ich]     = rawStreamZDC->GetTowerFromMap(ich);\r
218                 ich++;\r
219               }\r
220               else if(modType[iMod]==2){ // VME scaler mapping -------------\r
221                 scMod[iScCh]     = rawStreamZDC->GetScalerModFromMap(iScCh);\r
222                 scCh[iScCh]      = rawStreamZDC->GetScalerChFromMap(iScCh);\r
223                 scSigCode[iScCh] = rawStreamZDC->GetScalerSignFromMap(iScCh);\r
224                 scDet[iScCh]     = rawStreamZDC->GetScDetectorFromMap(iScCh);\r
225                 scSec[iScCh]     = rawStreamZDC->GetScTowerFromMap(iScCh);\r
226                 iScCh++;\r
227               }\r
228               else if(modType[iMod]==6 && modGeo[iMod]==4){ // ZDC TDC mapping --------------------\r
229                 tdcMod[itdcCh]     = rawStreamZDC->GetTDCModFromMap(itdcCh);\r
230                 tdcCh[itdcCh]      = rawStreamZDC->GetTDCChFromMap(itdcCh);\r
231                 tdcSigCode[itdcCh] = rawStreamZDC->GetTDCSignFromMap(itdcCh);\r
232                 itdcCh++;\r
233               }\r
234             }\r
235           }\r
236           // Writing data on output FXS file\r
237           for(Int_t is=0; is<2*kNChannels; is++){\r
238              fprintf(mapFile4Shuttle,"\t%d\t%d\t%d\t%d\t%d\t%d\n",\r
239                is,adcMod[is],adcCh[is],sigCode[is],det[is],sec[is]);\r
240              //printf("  Mapping DA -> %d ADC: mod %d ch %d, code %d det %d, sec %d\n",\r
241              //  is,adcMod[is],adcCh[is],sigCode[is],det[is],sec[is]);\r
242           }\r
243           for(Int_t is=0; is<kNScChannels; is++){\r
244              fprintf(mapFile4Shuttle,"\t%d\t%d\t%d\t%d\t%d\t%d\n",\r
245                is,scMod[is],scCh[is],scSigCode[is],scDet[is],scSec[is]);\r
246              //if(scMod[is]!=-1) printf("  Mapping DA -> %d Scaler: mod %d ch %d, code %d det %d, sec %d\n",\r
247              //  is,scMod[is],scCh[is],scSigCode[is],scDet[is],scSec[is]);\r
248           }\r
249           for(Int_t is=0; is<kNScChannels; is++){\r
250              fprintf(mapFile4Shuttle,"\t%d\t%d\t%d\t%d\n",\r
251                is,tdcMod[is],tdcCh[is],tdcSigCode[is]);\r
252              //if(tdcMod[is]!=-1) printf("  Mapping DA -> %d TDC: mod %d ch %d, code %d\n",\r
253              //  is,tdcMod[is],tdcCh[is],tdcSigCode[is]);\r
254           }\r
255           for(Int_t is=0; is<kNModules; is++){\r
256              fprintf(mapFile4Shuttle,"\t%d\t%d\t%d\n",\r
257              modGeo[is],modType[is],modNCh[is]);\r
258              //printf("  Mapping DA -> Module mapping: geo %d type %d #ch %d\n",\r
259              //  modGeo[is],modType[is],modNCh[is]);\r
260           }\r
261           \r
262         //} //if (rawstream)\r
263         fclose(mapFile4Shuttle);\r
264       }// SOD event\r
265       else if(eventT==PHYSICS_EVENT){ \r
266 \r
267         for(int ij=0; ij<6; ij++) tdcData[ij]=-999.;\r
268         rawStreamZDC->SetSODReading(kTRUE);\r
269 \r
270         // ----- Setting ch. mapping -----\r
271         for(Int_t jk=0; jk<2*kNChannels; jk++){\r
272           rawStreamZDC->SetMapADCMod(jk, adcMod[jk]);\r
273           rawStreamZDC->SetMapADCCh(jk, adcCh[jk]);\r
274           rawStreamZDC->SetMapADCSig(jk, sigCode[jk]);\r
275           rawStreamZDC->SetMapDet(jk, det[jk]);\r
276           rawStreamZDC->SetMapTow(jk, sec[jk]);\r
277         }\r
278         \r
279         while(rawStreamZDC->Next()){\r
280          if(rawStreamZDC->GetADCModule()!=kZDCTDCGeo) continue; //skipping ADCs, scalers and trigger cards\r
281 \r
282           if(rawStreamZDC->GetADCModule()==kZDCTDCGeo && rawStreamZDC->IsZDCTDCDatum()==kTRUE){\r
283              //\r
284              itdc = rawStreamZDC->GetChannel(); \r
285              if(itdc==iprevtdc) ihittdc++;\r
286              else ihittdc=0;\r
287              iprevtdc=itdc;\r
288              //\r
289              //if(ihittdc==0) printf("   TDC%d %1.0f ns  \n",itdc, 0.025*rawStreamZDC->GetZDCTDCDatum());\r
290              //\r
291              if(((itdc>=8 && itdc<=13) || itdc==15) && ihittdc<1){\r
292                if(itdc!=15){\r
293                  tdcData[itdc-8] = 0.025*rawStreamZDC->GetZDCTDCDatum();\r
294                  //\r
295                  //printf("   **** TDC%d %1.0f ns  \n",itdc, tdcData[itdc-8]);\r
296                }\r
297                //\r
298                else if(itdc==15){\r
299                   tdcL0 = 0.025*rawStreamZDC->GetZDCTDCDatum();\r
300                   //\r
301                   //printf("   ++++ TDCL0 %1.0f ns  \n",tdcL0);\r
302                   //\r
303                   for(int ic=0; ic<6; ic++){\r
304                     if(tdcData[ic]!=-999. && tdcL0!=-999.){\r
305                       hTDC[ic]->Fill(tdcData[ic]-tdcL0);\r
306                       //printf(" -> Filling histo%d: %f ns\n",ic, tdcData[ic]-tdcL0);\r
307                     }\r
308                   }\r
309                }\r
310              }\r
311           }\r
312         }\r
313         \r
314         /*for(int ic=0; ic<6; ic++){\r
315           if(tdcData[ic]!=-999. && tdcL0!=-999.) hTDC[ic]->Fill(tdcData[ic]-tdcL0);\r
316         }*/\r
317         nphys++;\r
318         \r
319       }//(if PHYSICS_EVENT) \r
320       else if(eventT==END_OF_RUN){\r
321         printf("End Of Run detected\n");\r
322         break;\r
323       }\r
324       \r
325       delete rawStreamZDC;\r
326       rawStreamZDC = 0x0;\r
327       \r
328       iev++; \r
329 \r
330       /* free resources */\r
331       free(event);\r
332  \r
333     } // event loop    \r
334       \r
335   }\r
336   printf(" \n # of physics events analyzed = %d\n\n", nphys);\r
337 \r
338   /* Analysis of the histograms */\r
339   //\r
340   FILE *fileShuttle;\r
341   fileShuttle = fopen(TDCDATA_FILE,"w");\r
342   //\r
343   Float_t xUp=0., xLow=0., deltaX=0;\r
344   Int_t binMax=0, nBinsx=0;\r
345   Float_t mean[6]={0.,0.,0.,0.,0.,0.}, sigma[6]={0.,0.,0.,0.,0.,0.};\r
346   TF1 *fitfun[6]={0x0,0x0,0x0,0x0,0x0,0x0};\r
347   for(Int_t k=0; k<6; k++){\r
348     if(hTDC[k]->GetEntries()!=0){\r
349        binMax = hTDC[k]->GetMaximumBin();\r
350        if(binMax<=1){\r
351          printf("\n WARNING! Something wrong with det %d histo \n\n", k);\r
352          continue;\r
353        }\r
354        // \r
355        xUp = (hTDC[k]->GetXaxis())->GetXmax();\r
356        xLow = (hTDC[k]->GetXaxis())->GetXmin();\r
357        deltaX = xUp-xLow;\r
358        nBinsx = (hTDC[k]->GetXaxis())->GetNbins();\r
359        //printf(" xMax = %f\n", xLow+binMax*deltaX/nBinsx);\r
360        hTDC[k]->Fit("gaus","Q","",xLow+binMax*deltaX/nBinsx*0.75,xLow+binMax*deltaX/nBinsx*1.25);\r
361        fitfun[k] = hTDC[k]->GetFunction("gaus");\r
362        mean[k] = (Float_t) (fitfun[k]->GetParameter(1));\r
363        sigma[k] = (Float_t) (fitfun[k]->GetParameter(2));\r
364        //printf("\t Mean value from fit = %1.2f\n", mean[k]);\r
365        //\r
366        fprintf(fileShuttle,"\t%f\t%f\n",mean[k], sigma[k]);\r
367      }\r
368      else printf("  WARNING! TDC histo %d has no entries and can't be processed!\n",k);\r
369   }\r
370   //                                                   \r
371   fclose(fileShuttle);\r
372   \r
373   TFile *histofile = new TFile(TDCHISTO_FILE,"RECREATE");\r
374   histofile->cd();\r
375   for(int k=0; k<6; k++) hTDC[k]->Write();                                                     \r
376   histofile->Close();\r
377   //\r
378   for(Int_t j=0; j<6; j++) delete hTDC[j];\r
379   \r
380   /* store the result files on FES */\r
381   // [1] File with mapping\r
382   status = daqDA_FES_storeFile(MAPDATA_FILE, "MAPPING");\r
383   if(status){\r
384     printf("Failed to export file : %d\n",status);\r
385     return -1;\r
386   }\r
387   // [2] File with TDC data\r
388   status = daqDA_FES_storeFile(TDCDATA_FILE, "TDCDATA");\r
389   if(status){\r
390     printf("Failed to export TDC data file to DAQ FES\n");\r
391     return -1;\r
392   }\r
393   // [3] File with TDC histos\r
394   status = daqDA_FES_storeFile(TDCHISTO_FILE, "TDCHISTOS");\r
395   if(status){\r
396     printf("Failed to export TDC histos file to DAQ FES\n");\r
397     return -1;\r
398   }\r
399 \r
400   return status;\r
401 }\r