Fix by Ruben
[u/mrichter/AliRoot.git] / ZDC / ZDCMAPPINGda.cxx
CommitLineData
76493b40 1/*\r
2\r
3This program reads the DAQ data files passed as argument using the monitoring library.\r
4\r
5The program reports about its processing progress.\r
6\r
7Messages on stdout are exported to DAQ log system.\r
8\r
9DA to write mapping for ADC modules and VME scaler\r
10\r
11Contact: Chiara.Oppedisano@to.infn.it\r
12Link: \r
13Run Type: PHYSICS\r
14DA Type: MON\r
15Number of events needed: at least 50% \r
16Input Files: none\r
17Output Files: ZDCChMapping.dat\r
18Trigger 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
52int 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
616b80bc 79 int const kZDCTDCGeo = 4;\r
76493b40 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
616b80bc 112 TH1F * hTDC[6]={0x0,0x0,0x0,0x0,0x0,0x0};\r
76493b40 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
616b80bc 280 if(rawStreamZDC->GetADCModule()!=kZDCTDCGeo) continue; //skipping ADCs, scalers and trigger cards\r
281\r
282 if(rawStreamZDC->GetADCModule()==kZDCTDCGeo && rawStreamZDC->IsZDCTDCDatum()==kTRUE){\r
76493b40 283 //\r
284 itdc = rawStreamZDC->GetChannel(); \r
616b80bc 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
76493b40 310 }\r
311 }\r
312 }\r
313 \r
616b80bc 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
76493b40 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
616b80bc 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
76493b40 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