]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG1/AliAnaVZEROQA.cxx
fix warnings during train running
[u/mrichter/AliRoot.git] / PWG1 / AliAnaVZEROQA.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 //------------------------------
17 // Analysis task for quality-assurance
18 // of VZERO ESD
19 //
20 // 05/12/2009 cvetan.cheshkov@cern.ch
21 //------------------------------
22
23 #include "TChain.h"
24 #include "TROOT.h"
25 #include "TFile.h"
26 #include "TH1F.h"
27 #include "TH2F.h"
28 #include "TCanvas.h"
29 #include "AliLog.h"
30 #include "AliESDEvent.h"
31 #include "AliESDVZERO.h"
32
33 #include "AliAnaVZEROQA.h"
34
35 ClassImp(AliAnaVZEROQA)
36
37 AliAnaVZEROQA::AliAnaVZEROQA():
38 AliAnalysisTaskSE("AliAnaVZEROQA"),
39   fListOfHistos(0),
40
41   fhAdcNoTimeA(0),
42   fhAdcWithTimeA(0),
43   fhAdcNoTimeC(0),
44   fhAdcWithTimeC(0),
45
46   fhAdcPMTNoTime(0),
47   fhAdcPMTWithTime(0),
48  
49   fhTimeA(0),
50   fhTimeC(0),
51
52   fhWidthA(0),
53   fhWidthC(0),
54
55   fhTimePMT(0),
56   fhWidthPMT(0),
57
58   fhAdcWidthA(0),
59   fhAdcWidthC(0),
60
61   fhTimeCorr(0),
62
63   fhAdcTimeA(0),
64   fhAdcTimeC(0),
65
66   fV0a(0),
67   fV0c(0),
68   fV0multA(0),
69   fV0multC(0),
70   fV0ampl(0),
71
72   fhTimePMTCorr(0),
73   fhEvents(0),
74
75   fhVtxXYBB(0),
76   fhVtxZBB(0),
77   fhVtxXYBGA(0),
78   fhVtxZBGA(0),
79   fhVtxXYBGC(0),
80   fhVtxZBGC(0)
81 {
82   // Default constructor
83   // Define input and output slots here
84   // Input slot #0 works with a TChain
85   DefineInput(0, TChain::Class());
86   // Output slot #1 TList
87   DefineOutput(1, TList::Class());
88 }
89
90 AliAnaVZEROQA::AliAnaVZEROQA(const char* name):
91 AliAnalysisTaskSE(name),
92   fListOfHistos(0),
93   fhAdcNoTimeA(0),
94   fhAdcWithTimeA(0),
95   fhAdcNoTimeC(0),
96   fhAdcWithTimeC(0),
97
98   fhAdcPMTNoTime(0),
99   fhAdcPMTWithTime(0),
100  
101   fhTimeA(0),
102   fhTimeC(0),
103
104   fhWidthA(0),
105   fhWidthC(0),
106
107   fhTimePMT(0),
108   fhWidthPMT(0),
109
110   fhAdcWidthA(0),
111   fhAdcWidthC(0),
112
113   fhTimeCorr(0),
114
115   fhAdcTimeA(0),
116   fhAdcTimeC(0),
117
118   fV0a(0),
119   fV0c(0),
120   fV0multA(0),
121   fV0multC(0),
122   fV0ampl(0),
123
124   fhTimePMTCorr(0),
125   fhEvents(0),
126
127   fhVtxXYBB(0),
128   fhVtxZBB(0),
129   fhVtxXYBGA(0),
130   fhVtxZBGA(0),
131   fhVtxXYBGC(0),
132   fhVtxZBGC(0)
133 {
134   // Constructor
135   AliInfo("Constructor AliAnaVZEROQA");
136   // Define input and output slots here
137   // Input slot #0 works with a TChain
138   DefineInput(0, TChain::Class());
139   // Output slot #1 TList
140   DefineOutput(1, TList::Class());
141 }
142
143 TH1F * AliAnaVZEROQA::CreateHisto1D(const char* name, const char* title,Int_t nBins, 
144                                     Double_t xMin, Double_t xMax,
145                                     const char* xLabel, const char* yLabel)
146 {
147   // create a histogram
148   TH1F* result = new TH1F(name, title, nBins, xMin, xMax);
149   result->SetOption("E");
150   if (xLabel) result->GetXaxis()->SetTitle(xLabel);
151   if (yLabel) result->GetYaxis()->SetTitle(yLabel);
152   result->SetMarkerStyle(kFullCircle);
153   return result;
154 }
155
156 TH2F * AliAnaVZEROQA::CreateHisto2D(const char* name, const char* title,Int_t nBinsX, 
157                                     Double_t xMin, Double_t xMax,
158                                     Int_t nBinsY,
159                                     Double_t yMin, Double_t yMax,
160                                     const char* xLabel, const char* yLabel)
161 {
162   // create a histogram
163   TH2F* result = new TH2F(name, title, nBinsX, xMin, xMax, nBinsY, yMin, yMax);
164   if (xLabel) result->GetXaxis()->SetTitle(xLabel);
165   if (yLabel) result->GetYaxis()->SetTitle(yLabel);
166   return result;
167 }
168
169 void AliAnaVZEROQA::UserCreateOutputObjects()
170 {
171   // Create histograms
172   AliInfo("AliAnaVZEROQA::UserCreateOutputObjects");
173   // Create output container
174   fListOfHistos = new TList();
175   fListOfHistos->SetOwner();
176
177   fhAdcNoTimeA = CreateHisto1D("hAdcNoTimeA","ADC (no Leading Time) V0A",200,0,200,"ADC charge","Entries");
178   fhAdcWithTimeA = CreateHisto1D("hAdcWithTimeA","ADC ( with Leading Time) V0A",200,0,200,"ADC charge","Entries");
179   fhAdcNoTimeC = CreateHisto1D("hAdcNoTimeC","ADC (no Leading Time) V0C",200,0,200,"ADC charge","Entries");
180   fhAdcWithTimeC = CreateHisto1D("hAdcWithTimeC","ADC ( with Leading Time) V0C",200,0,200,"ADC charge","Entries");
181   
182   fhAdcPMTNoTime = CreateHisto2D("hadcpmtnotime","ADC vs PMT index (no leading time)",64,-0.5,63.5,200,0,200,"PMT index","ADC charge");
183   fhAdcPMTWithTime = CreateHisto2D("hadcpmtwithtime","ADC vs PMT index (with leading time)",64,-0.5,63.5,200,0,200,"PMT index","ADC charge");
184
185   fhTimeA = CreateHisto1D("htimepmtA","Time measured by TDC V0A",400,-100,100,"Leading time (ns)","Entries");
186   fhTimeC = CreateHisto1D("htimepmtC","Time measured by TDC V0C",400,-100,100,"Leading time (ns)","Entries");
187
188   fhWidthA = CreateHisto1D("hwidthA","Signal width measured by TDC V0A",200,0,100,"Signal width (ns)","Entries");
189   fhWidthC = CreateHisto1D("hwidthC","Signal width measured by TDC V0C",200,0,100,"Signal width (ns)","Entries");
190
191   fhTimePMT = CreateHisto2D("htimepmt","Time measured by TDC vs PMT index",64,-0.5,63.5,200,0,100,"PMT Index","Leading time (ns)");
192   fhWidthPMT = CreateHisto2D("hwidthpmt","Time width vs PMT index",64,-0.5,63.5,200,0,100,"PMT Index","Signal width (ns)");
193
194   fhAdcWidthA = CreateHisto2D("hadcwidthA","Time width vs ADC V0A",200,0,200,200,0,100,"ADC charge","Width (ns)");
195   fhAdcWidthC = CreateHisto2D("hadcwidthC","Time width vs ADC V0C",200,0,200,200,0,100,"ADC charge","Width (ns)");
196
197   fhTimeCorr = CreateHisto2D("htimecorr","Average time C side vs. A side",200,0,100,200,0,100,"Time V0A (ns)","Time V0C (ns");
198
199   fhAdcTimeA = CreateHisto2D("hAdcTimeA","ADC vs Time V0A",1000,-100,100,200,0,200,"Time (ns)","ADC charge");
200   fhAdcTimeC = CreateHisto2D("hAdcTimeC","ADC vs Time V0C",1000,-100,100,200,0,200,"Time (ns)","ADC charge");
201
202   fV0a = CreateHisto1D("hV0a","Number of fired PMTs (V0A)",65,-0.5,64.5);
203   fV0c = CreateHisto1D("hV0c","Number of fired PMTs (V0C)",65,-0.5,64.5);
204   fV0multA = CreateHisto1D("hV0multA","Total reconstructed multiplicity (V0A)",100,0.,1000.);
205   fV0multC = CreateHisto1D("hV0multC","Total reconstructed multiplicity (V0C)",100,0.,1000.);
206   fV0ampl  = CreateHisto1D("hV0ampl","V0 multiplicity in single channel (all V0 channels)",400,-0.5,99.5);
207
208   fhTimePMTCorr = CreateHisto2D("htimepmtcorr","Time measured by TDC (corrected for slewing, channels aligned) vs PMT index",64,-0.5,63.5,200,0,100,"PMT Index","Leading time (ns)");
209   fhEvents = CreateHisto2D("hEvents","V0C vs V0A (empty,bb,bg)",3,-0.5,2.5,3,-0.5,2.5);
210
211   fhVtxXYBB = CreateHisto2D("fhVtxXYBB","XY SPD vertex (bb)",200,-2,2,200,-2,2);
212   fhVtxZBB = CreateHisto1D("fhVtxZBB","Z SPD vertex (bb)",400,-50,50);
213   fhVtxXYBGA = CreateHisto2D("fhVtxXYBGA","XY SPD vertex (bga)",200,-2,2,200,-2,2);
214   fhVtxZBGA = CreateHisto1D("fhVtxZBGA","Z SPD vertex (bga)",400,-50,50);
215   fhVtxXYBGC = CreateHisto2D("fhVtxXYBGC","XY SPD vertex (bgc)",200,-2,2,200,-2,2);
216   fhVtxZBGC = CreateHisto1D("fhVtxZBGC","Z SPD vertex (bgc)",400,-50,50);
217
218   fListOfHistos->Add(fhAdcNoTimeA);
219   fListOfHistos->Add(fhAdcWithTimeA);
220   fListOfHistos->Add(fhAdcNoTimeC);
221   fListOfHistos->Add(fhAdcWithTimeC);
222
223   fListOfHistos->Add(fhAdcPMTNoTime);
224   fListOfHistos->Add(fhAdcPMTWithTime);
225  
226   fListOfHistos->Add(fhTimeA);
227   fListOfHistos->Add(fhTimeC);
228
229   fListOfHistos->Add(fhWidthA);
230   fListOfHistos->Add(fhWidthC);
231
232   fListOfHistos->Add(fhTimePMT);
233   fListOfHistos->Add(fhWidthPMT);
234
235   fListOfHistos->Add(fhAdcWidthA);
236   fListOfHistos->Add(fhAdcWidthC);
237
238   fListOfHistos->Add(fhTimeCorr);
239
240   fListOfHistos->Add(fhAdcTimeA);
241   fListOfHistos->Add(fhAdcTimeC);
242
243   fListOfHistos->Add(fV0a);
244   fListOfHistos->Add(fV0c);
245   fListOfHistos->Add(fV0multA);
246   fListOfHistos->Add(fV0multC);
247   fListOfHistos->Add(fV0ampl);
248
249   fListOfHistos->Add(fhTimePMTCorr);
250   fListOfHistos->Add(fhEvents);
251
252   fListOfHistos->Add(fhVtxXYBB);
253   fListOfHistos->Add(fhVtxZBB);
254   fListOfHistos->Add(fhVtxXYBGA);
255   fListOfHistos->Add(fhVtxZBGA);
256   fListOfHistos->Add(fhVtxXYBGC);
257   fListOfHistos->Add(fhVtxZBGC);
258
259   PostData(1, fListOfHistos);
260 }
261
262 void AliAnaVZEROQA::UserExec(Option_t */*option*/)
263 {
264   // Fill the QA histograms
265   // using ESD data
266   AliVEvent* event = InputEvent();
267   if (!event) {
268     Printf("ERROR: Could not retrieve event");
269     return;
270   }
271
272   AliESDEvent* esd = dynamic_cast<AliESDEvent*>(event);
273   if (!esd) {
274     Printf("ERROR: No ESD event");
275     return;
276   }
277   AliESDVZERO* esdV0 = esd->GetVZEROData();
278   if (!esdV0) {
279     Printf("ERROR: No ESD VZERO");
280     return;
281   }
282
283   Float_t timeA = 0,timeC = 0;
284   Int_t ntimeA = 0, ntimeC = 0;
285   for (Int_t i=0; i<64; ++i) {
286       if (esdV0->GetTime(i) < 1e-6) {
287         if (i >= 32) {
288           fhAdcNoTimeA->Fill(esdV0->GetAdc(i));
289         }
290         else {
291           fhAdcNoTimeC->Fill(esdV0->GetAdc(i));
292         }
293         fhAdcPMTNoTime->Fill(i,esdV0->GetAdc(i));
294       }
295       else {
296         if (i >= 32) {
297           fhAdcWithTimeA->Fill(esdV0->GetAdc(i));
298         }
299         else {
300           fhAdcWithTimeC->Fill(esdV0->GetAdc(i));
301         }
302         fhAdcPMTWithTime->Fill(i,esdV0->GetAdc(i));
303       }
304
305       if (i >= 32) {
306         fhTimeA->Fill(esdV0->GetTime(i));
307         fhWidthA->Fill(esdV0->GetWidth(i));
308         fhAdcWidthA->Fill(esdV0->GetAdc(i),esdV0->GetTime(i));
309         fhAdcTimeA->Fill(esdV0->GetTime(i),esdV0->GetAdc(i));
310       }
311       else {
312         fhTimeC->Fill(esdV0->GetTime(i));
313         fhWidthC->Fill(esdV0->GetWidth(i));
314         fhAdcWidthC->Fill(esdV0->GetAdc(i),esdV0->GetTime(i));
315         fhAdcTimeC->Fill(esdV0->GetTime(i),esdV0->GetAdc(i));
316        }
317       fhTimePMT->Fill(i,esdV0->GetTime(i));
318       fhWidthPMT->Fill(i,esdV0->GetWidth(i));
319
320       Float_t correctedTime = CorrectLeadingTime(i,esdV0->GetTime(i),esdV0->GetAdc(i));
321       fhTimePMTCorr->Fill(i,correctedTime);
322
323       if (esdV0->GetTime(i) > 1e-6) {
324         if (i >= 32) {
325           timeA += correctedTime;
326           ntimeA++;
327         }
328         else {
329           timeC += correctedTime;
330           ntimeC++;
331         }
332       }
333   }
334
335   if (ntimeA > 0) timeA = timeA/ntimeA;
336   if (ntimeC > 0) timeC = timeC/ntimeC;
337
338   fhTimeCorr->Fill(timeA,timeC);
339
340   Int_t flaga = 0, flagc = 0;
341   TString stra("emptyA"),strc("emptyC");
342   if (timeA > 48 && timeA < 62) { flaga = 1; stra = "BBA"; }
343   if (timeA > 26  && timeA < 33) { flaga = 2; stra = "BGA"; }
344   if (timeC > 49 && timeC < 60) { flagc = 1; strc = "BBC"; }
345   if (timeC > 43 && timeC < 48.5) { flagc = 2; strc = "BGC"; }
346
347   fhEvents->Fill(flaga,flagc);
348
349   const AliESDVertex *vtx = esd->GetPrimaryVertexSPD();
350
351   if (flaga <= 1 && flagc <=1) {
352     fhVtxXYBB->Fill(vtx->GetXv(),vtx->GetYv());
353     fhVtxZBB->Fill(vtx->GetZv());
354   }
355   else {
356     if (flaga == 2) {
357       fhVtxXYBGA->Fill(vtx->GetXv(),vtx->GetYv());
358       fhVtxZBGA->Fill(vtx->GetZv());
359     }
360     if (flagc == 2) {
361       fhVtxXYBGC->Fill(vtx->GetXv(),vtx->GetYv());
362       fhVtxZBGC->Fill(vtx->GetZv());
363     }
364   }
365
366   fV0a->Fill(esdV0->GetNbPMV0A());
367   fV0c->Fill(esdV0->GetNbPMV0C());
368   fV0multA->Fill(esdV0->GetMTotV0A());
369   fV0multC->Fill(esdV0->GetMTotV0C());
370   for(Int_t i = 0; i < 64; i++) {
371     fV0ampl->Fill(esdV0->GetMultiplicity(i));
372   }
373
374   // Post output data.
375   PostData(1, fListOfHistos);
376 }
377
378 void AliAnaVZEROQA::Terminate(Option_t *)
379 {
380   // Store the output histograms
381   // from the list
382   fListOfHistos = dynamic_cast<TList*>(GetOutputData(1));
383   if (!fListOfHistos) {
384     Printf("ERROR: fListOfHistos not available");
385     return;
386   }
387         
388   Info("AliAnaVZEROQA", "Successfully finished");
389 }
390
391 Float_t AliAnaVZEROQA::CorrectLeadingTime(Int_t i, Float_t time, Float_t adc) const
392 {
393   // Correct for slewing and align the channels
394
395   if (time < 1e-6) return 0;
396
397   // Time offsets between channels
398   Float_t timeShift[64] = {30.2914 , 30.0019 , 30.7429 , 30.1997 , 30.1511 , 29.6437 , 30.0609 , 29.5452 , 30.1437 , 30.745 , 30.7537 , 30.446 , 30.2771 , 30.838 , 30.3748 , 30.0635 , 30.1786 , 30.282 , 31.0992 , 30.7491 , 30.624 , 30.9268 , 30.6585 , 30.4895 , 31.5815 , 31.3871 , 31.2032 , 31.5778 , 31.0838 , 31.2259 , 31.2122 , 31.5989 , 28.3792 , 28.8325 , 27.8719 , 28.3475 , 26.9925 , 27.9300 , 28.4223 , 28.4996 , 28.2934 , 28.1281 , 27.209 , 28.5327 , 28.1181 , 28.0888 , 29.5111 , 28.6601 , 29.7705 , 29.6531 , 30.3373 , 30.2345 , 30.5935 , 29.8164 , 30.2235 , 29.6505 , 30.1225 , 31.2045 , 30.8399 , 30.6789 , 30.2784 , 31.7028 , 31.4239 , 30.1814};
399   time -= timeShift[i];
400
401   // Slewing correction
402   if (adc < 1e-6) return time;
403
404   time += 30.;
405   if (adc > 300.) adc = 300.;
406   if (adc > 70.) {
407     return (time -
408             2.93028e+01 +
409             adc*1.25188e-02 -
410             adc*adc*2.68348e-05);
411   }
412   else {
413     return (time -
414             3.52314e+01 +
415             adc*5.99289e-01 -
416             adc*adc*2.74668e-02 +
417             adc*adc*adc*6.61224e-04 -
418             adc*adc*adc*adc*7.77105e-06 +
419             adc*adc*adc*adc*adc*3.51229e-08);
420   }
421 }
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482