3 This program reads the DAQ data files passed as argument using the monitoring library.
5 It computes the average event size and populates local "./result.txt" file with the
8 The program reports about its processing progress.
10 Messages on stdout are exported to DAQ log system.
12 DA for ZDC standalone pedestal runs
14 Contact: Chiara.Oppedisano@to.infn.it
16 Run Type: STANDALONE_EMD_RUN
18 Number of events needed: at least ~5*10^3
19 Input Files: ZDCPedestal.dat
20 Output Files: ZDCEMDCalib.dat, ZDCChMapping.dat
21 Trigger Types Used: Standalone Trigger
26 #include <Riostream.h>
27 #include <Riostream.h>
44 #include <AliRawReaderDate.h>
45 #include <AliRawEventHeaderBase.h>
46 #include <AliZDCRawStream.h>
51 1- monitoring data source
53 int main(int argc, char **argv) {
55 TFitter *minuitFit = new TFitter(4);
56 TVirtualFitter::SetFitter(minuitFit);
60 /* log start of process */
61 printf("ZDC EMD program started\n");
63 /* check that we got some arguments = list of files */
65 printf("Wrong number of arguments\n");
70 // --- Preparing histos for EM dissociation spectra
73 TH1F* histoEMDCorr[4];
75 char namhistr[50], namhistc[50];
76 for(Int_t i=0; i<4; i++) {
78 sprintf(namhistr,"ZN%d-EMDRaw",i+1);
79 sprintf(namhistc,"ZN%d-EMDCorr",i+1);
82 sprintf(namhistr,"ZP%d-EMDRaw",i);
83 sprintf(namhistc,"ZP%d-EMDCorr",i);
86 sprintf(namhistr,"ZN%d-EMDRaw",i);
87 sprintf(namhistc,"ZN%d-EMDCorr",i);
90 sprintf(namhistr,"ZP%d-EMDRaw",i-1);
91 sprintf(namhistc,"ZP%d-EMDCorr",i-1);
93 histoEMDRaw[i] = new TH1F(namhistr,namhistr,100,0.,4000.);
94 histoEMDCorr[i] = new TH1F(namhistc,namhistc,100,0.,4000.);
97 /* open result file */
99 fp=fopen("./result.txt","a");
101 printf("Failed to open file\n");
105 FILE *mapFile4Shuttle;
106 const char *mapfName = "ZDCChMapping.dat";
108 /* define data source : this is argument 1 */
109 status = monitorSetDataSource( argv[1] );
111 printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
116 /* declare monitoring program */
117 status = monitorDeclareMp( __FILE__ );
119 printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
124 /* define wait event timeout - 1s max */
126 monitorSetNoWaitNetworkTimeout(1000);
129 /* log start of process */
130 printf("ZDC EMD monitoring program started\n");
132 /* report progress */
133 daqDA_progressReport(10);
136 /* init some counters */
137 int nevents_physics=0;
140 /* read the data files */
144 status=monitorSetDataSource( argv[n] );
146 printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
150 /* report progress */
151 /* in this example, indexed on the number of files */
152 daqDA_progressReport(10+80*n/argc);
156 struct eventHeaderStruct *event;
157 eventTypeType eventT;
160 status=monitorGetEventDynamic((void **)&event);
161 if(status==MON_ERR_EOF) break; /* end of monitoring file has been reached */
163 printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
167 /* retry if got no event */
172 // Initalize raw-data reading and decoding
173 AliRawReader *reader = new AliRawReaderDate((void*)event);
174 reader->Select("ZDC");
175 // --- Reading event header
176 //UInt_t evtype = reader->GetType();
177 //printf("\n\t ZDCEMDda -> ev. type %d\n",evtype);
178 //printf("\t ZDCEMDda -> run # %d\n",reader->GetRunNumber());
180 AliZDCRawStream *rawStreamZDC = new AliZDCRawStream(reader);
183 /* use event - here, just write event id to result file */
184 eventT=event->eventType;
186 Int_t ich=0, adcMod[48], adcCh[48], sigCode[48], det[48], sec[48];
187 if(eventT==START_OF_DATA){
189 if(!rawStreamZDC->Next()) printf(" \t No raw data found!! \n");
191 while(rawStreamZDC->Next()){
192 if(rawStreamZDC->IsChMapping()){
193 adcMod[ich] = rawStreamZDC->GetADCModFromMap(ich);
194 adcCh[ich] = rawStreamZDC->GetADCChFromMap(ich);
195 sigCode[ich] = rawStreamZDC->GetADCSignFromMap(ich);
196 det[ich] = rawStreamZDC->GetDetectorFromMap(ich);
197 sec[ich] = rawStreamZDC->GetTowerFromMap(ich);
202 // --------------------------------------------------------
203 // --- Writing ascii data file for the Shuttle preprocessor
204 mapFile4Shuttle = fopen(mapfName,"w");
205 for(Int_t i=0; i<ich; i++){
206 fprintf(mapFile4Shuttle,"\t%d\t%d\t%d\t%d\t%d\t%d\n",i,
207 adcMod[i],adcCh[i],sigCode[i],det[i],sec[i]);
209 //printf("ZDCPEDESTALDA.cxx -> ch.%d mod %d, ch %d, code %d det %d, sec %d\n",
210 // i,adcMod[i],adcCh[i],sigCode[i],det[i],sec[i]);
212 fclose(mapFile4Shuttle);
215 if(eventT==PHYSICS_EVENT){
217 // *** To analyze EMD events you MUST have a pedestal data file!!!
218 // *** -> check if a pedestal run has been analyzied
220 filePed=fopen("./ZDCPedestal.dat","r");
222 printf("\t ERROR!!! You MUST have a ZDCPedestal.dat file!!!\n");
225 // 144 = 48 in-time + 48 out-of-time + 48 correlations
226 Float_t readValues[2][144], MeanPed[44], MeanPedWidth[44],
227 MeanPedOOT[44], MeanPedWidthOOT[44],
228 CorrCoeff0[44], CorrCoeff1[44];
230 for(int jj=0; jj<144; jj++){
231 for(int ii=0; ii<2; ii++){
232 fscanf(filePed,"%f",&readValues[ii][jj]);
235 MeanPed[jj] = readValues[0][jj];
236 MeanPedWidth[jj] = readValues[1][jj];
238 else if(jj>48 && jj<96){
239 MeanPedOOT[jj-48] = readValues[0][jj];
240 MeanPedWidthOOT[jj-48] = readValues[1][jj];
243 CorrCoeff0[jj-96] = readValues[0][jj];
244 CorrCoeff1[jj-96] = readValues[1][jj];;
249 // --- Reading data header
250 reader->ReadHeader();
251 const AliRawDataHeader* header = reader->GetDataHeader();
253 UChar_t message = header->GetAttributes();
254 if(message & 0x70){ // DEDICATED EMD RUN
255 //printf("\t STANDALONE_EMD_RUN raw data found\n");
259 printf("\t NO STANDALONE_EMD_RUN raw data found\n");
264 printf("\t ATTENTION! No Raw Data Header found!!!\n");
268 if (!rawStreamZDC->Next()) printf(" \t No raw data found!! ");
270 // ----- Setting ch. mapping -----
271 for(Int_t jk=0; jk<48; jk++){
272 rawStreamZDC->SetMapADCMod(jk, adcMod[jk]);
273 rawStreamZDC->SetMapADCCh(jk, adcCh[jk]);
274 rawStreamZDC->SetMapADCSig(jk, sigCode[jk]);
275 rawStreamZDC->SetMapDet(jk, det[jk]);
276 rawStreamZDC->SetMapTow(jk, sec[jk]);
279 Float_t ZDCRawADC[4], ZDCCorrADC[4], ZDCCorrADCSum[4];
280 for(Int_t g=0; g<4; g++){
281 ZDCCorrADCSum[g] = 0.;
285 while(rawStreamZDC->Next()){
286 if(rawStreamZDC->IsADCDataWord()){
287 Int_t DetIndex=999, PedIndex=999;
288 if(rawStreamZDC->GetSector(0) == 1 || rawStreamZDC->GetSector(0) == 2){
289 DetIndex = rawStreamZDC->GetSector(0)-1;
290 PedIndex = (rawStreamZDC->GetSector(0)+1)+4*rawStreamZDC->GetSector(1);
292 else if(rawStreamZDC->GetSector(0) == 4 || rawStreamZDC->GetSector(0) == 5){
293 DetIndex = rawStreamZDC->GetSector(0)-2;
294 PedIndex = (rawStreamZDC->GetSector(0)-2)+4*rawStreamZDC->GetSector(1)+24;
297 if(rawStreamZDC->GetADCGain() == 1){ //EMD -> LR ADC
299 ZDCRawADC[DetIndex] += (Float_t) rawStreamZDC->GetADCValue();
300 // Mean pedestal subtraction
301 Float_t Pedestal = MeanPed[PedIndex];
302 // Pedestal subtraction from correlation with out-of-time signals
303 //Float_t Pedestal = CorrCoeff0[PedIndex]+CorrCoeff1[PedIndex]*MeanPedOOT[PedIndex];
305 ZDCCorrADC[DetIndex] = (rawStreamZDC->GetADCValue()) - Pedestal;
306 ZDCCorrADCSum[DetIndex] += ZDCCorrADC[DetIndex];
308 /*printf("\t det %d quad %d res %d pedInd %d ADCCorr %d ZDCCorrADCSum[%d] = %d\n",
309 rawStreamZDC->GetSector(0),rawStreamZDC->GetSector(1),
310 rawStreamZDC->GetADCGain(),PedIndex,
311 (Int_t) (rawStreamZDC->GetADCValue() - Pedestal), DetIndex,
312 (Int_t) ZDCCorrADCSum[DetIndex]);
321 for(Int_t j=0; j<4; j++){
322 histoEMDRaw[j]->Fill(ZDCRawADC[j]);
323 histoEMDCorr[j]->Fill(ZDCCorrADCSum[j]);
332 /* exit when last event received, no need to wait for TERM signal */
333 if (eventT==END_OF_RUN) {
334 printf("EOR event detected\n");
341 /* Analysis of the histograms */
344 const char *fName = "ZDCPedestal.dat";
345 fileShuttle = fopen(fName,"w");
350 Float_t MeanFitVal[4];
352 for(Int_t k=0; k<4; k++){
353 BinMax[k] = histoEMDCorr[k]->GetMaximumBin();
354 YMax[k] = (histoEMDCorr[k]->GetXaxis())->GetXmax();
355 NBinsx[k] = (histoEMDCorr[k]->GetXaxis())->GetNbins();
356 // printf("\n\t Det%d -> BinMax = %d, ChXMax = %f\n", k+1, BinMax[k], BinMax[k]*YMax[k]/NBinsx[k]);
357 histoEMDCorr[k]->Fit("gaus","Q","",BinMax[k]*YMax[k]/NBinsx[k]*0.7,BinMax[k]*YMax[k]/NBinsx[k]*1.25);
358 fitfun[k] = histoEMDCorr[k]->GetFunction("gaus");
359 MeanFitVal[k] = (Float_t) (fitfun[k]->GetParameter(1));
360 //printf("\n\t Mean Value from gaussian fit = %f\n", MeanFitVal[k]);
363 Float_t CalibCoeff[6];
364 /*for(Int_t j=0; j<6; j++){
365 if(j<4) CalibCoeff[j] = MeanFitVal[j];
366 else CalibCoeff[j] = 1.;
367 fprintf(fileShuttle,"\t%f\n",CalibCoeff[j]);
370 // --- For the moment we have sim data only for ZN1!!!
371 for(Int_t j=0; j<6; j++){
372 if(j==0) CalibCoeff[j] = MeanFitVal[j];
373 else if(j>0 && j<4) CalibCoeff[j] = CalibCoeff[0];
374 else CalibCoeff[j] = 1.;
375 fprintf(fileShuttle,"\t%f\n",CalibCoeff[j]);
380 for(Int_t ij=0; ij<4; ij++){
381 delete histoEMDRaw[ij];
382 delete histoEMDCorr[ij];
386 TVirtualFitter::SetFitter(0);
389 fprintf(fp,"Run #%s, received %d physics events out of %d\n",getenv("DATE_RUN_NUMBER"),nevents_physics,nevents_total);
391 /* close result file */
394 /* report progress */
395 daqDA_progressReport(90);
397 /* store the result file on FES */
398 status = daqDA_FES_storeFile(mapfName,"ZDCCHMAPPING_data");
400 printf("Failed to export file : %d\n",status);
404 status = daqDA_FES_storeFile(fName,"ZDCEMD_data");
406 printf("Failed to export file : %d\n",status);
410 /* report progress */
411 daqDA_progressReport(100);