]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG1/AliAnaVZEROQA.cxx
trigger names changed (Markus)
[u/mrichter/AliRoot.git] / PWG1 / AliAnaVZEROQA.cxx
CommitLineData
ecb38463 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"
ecb38463 28#include "TCanvas.h"
29#include "AliLog.h"
30#include "AliESDEvent.h"
31#include "AliESDVZERO.h"
32
33#include "AliAnaVZEROQA.h"
34
35ClassImp(AliAnaVZEROQA)
36
37AliAnaVZEROQA::AliAnaVZEROQA():
38AliAnalysisTaskSE("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),
892effee 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)
ecb38463 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
90AliAnaVZEROQA::AliAnaVZEROQA(const char* name):
91AliAnalysisTaskSE(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),
892effee 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)
ecb38463 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
143TH1F * 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
156TH2F * 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
169void AliAnaVZEROQA::UserCreateOutputObjects()
170{
171 // Create histograms
172 AliInfo("AliAnaVZEROQA::UserCreateOutputObjects");
173 // Create output container
174 fListOfHistos = new TList();
175
176 fhAdcNoTimeA = CreateHisto1D("hAdcNoTimeA","ADC (no Leading Time) V0A",200,0,200,"ADC charge","Entries");
177 fhAdcWithTimeA = CreateHisto1D("hAdcWithTimeA","ADC ( with Leading Time) V0A",200,0,200,"ADC charge","Entries");
178 fhAdcNoTimeC = CreateHisto1D("hAdcNoTimeC","ADC (no Leading Time) V0C",200,0,200,"ADC charge","Entries");
179 fhAdcWithTimeC = CreateHisto1D("hAdcWithTimeC","ADC ( with Leading Time) V0C",200,0,200,"ADC charge","Entries");
180
181 fhAdcPMTNoTime = CreateHisto2D("hadcpmtnotime","ADC vs PMT index (no leading time)",64,-0.5,63.5,200,0,200,"PMT index","ADC charge");
182 fhAdcPMTWithTime = CreateHisto2D("hadcpmtwithtime","ADC vs PMT index (with leading time)",64,-0.5,63.5,200,0,200,"PMT index","ADC charge");
183
184 fhTimeA = CreateHisto1D("htimepmtA","Time measured by TDC V0A",400,-100,100,"Leading time (ns)","Entries");
185 fhTimeC = CreateHisto1D("htimepmtC","Time measured by TDC V0C",400,-100,100,"Leading time (ns)","Entries");
186
187 fhWidthA = CreateHisto1D("hwidthA","Signal width measured by TDC V0A",200,0,100,"Signal width (ns)","Entries");
188 fhWidthC = CreateHisto1D("hwidthC","Signal width measured by TDC V0C",200,0,100,"Signal width (ns)","Entries");
189
190 fhTimePMT = CreateHisto2D("htimepmt","Time measured by TDC vs PMT index",64,-0.5,63.5,200,0,100,"PMT Index","Leading time (ns)");
191 fhWidthPMT = CreateHisto2D("hwidthpmt","Time width vs PMT index",64,-0.5,63.5,200,0,100,"PMT Index","Signal width (ns)");
192
193 fhAdcWidthA = CreateHisto2D("hadcwidthA","Time width vs ADC V0A",200,0,200,200,0,100,"ADC charge","Width (ns)");
194 fhAdcWidthC = CreateHisto2D("hadcwidthC","Time width vs ADC V0C",200,0,200,200,0,100,"ADC charge","Width (ns)");
195
196 fhTimeCorr = CreateHisto2D("htimecorr","Average time C side vs. A side",200,0,100,200,0,100,"Time V0A (ns)","Time V0C (ns");
197
198 fhAdcTimeA = CreateHisto2D("hAdcTimeA","ADC vs Time V0A",1000,-100,100,200,0,200,"Time (ns)","ADC charge");
199 fhAdcTimeC = CreateHisto2D("hAdcTimeC","ADC vs Time V0C",1000,-100,100,200,0,200,"Time (ns)","ADC charge");
200
201 fV0a = CreateHisto1D("hV0a","Number of fired PMTs (V0A)",65,-0.5,64.5);
202 fV0c = CreateHisto1D("hV0c","Number of fired PMTs (V0C)",65,-0.5,64.5);
203 fV0multA = CreateHisto1D("hV0multA","Total reconstructed multiplicity (V0A)",100,0.,1000.);
204 fV0multC = CreateHisto1D("hV0multC","Total reconstructed multiplicity (V0C)",100,0.,1000.);
205 fV0ampl = CreateHisto1D("hV0ampl","V0 multiplicity in single channel (all V0 channels)",400,-0.5,99.5);
206
892effee 207 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)");
208 fhEvents = CreateHisto2D("hEvents","V0C vs V0A (empty,bb,bg)",3,-0.5,2.5,3,-0.5,2.5);
209
210 fhVtxXYBB = CreateHisto2D("fhVtxXYBB","XY SPD vertex (bb)",200,-2,2,200,-2,2);
211 fhVtxZBB = CreateHisto1D("fhVtxZBB","Z SPD vertex (bb)",400,-50,50);
212 fhVtxXYBGA = CreateHisto2D("fhVtxXYBGA","XY SPD vertex (bga)",200,-2,2,200,-2,2);
213 fhVtxZBGA = CreateHisto1D("fhVtxZBGA","Z SPD vertex (bga)",400,-50,50);
214 fhVtxXYBGC = CreateHisto2D("fhVtxXYBGC","XY SPD vertex (bgc)",200,-2,2,200,-2,2);
215 fhVtxZBGC = CreateHisto1D("fhVtxZBGC","Z SPD vertex (bgc)",400,-50,50);
216
ecb38463 217 fListOfHistos->Add(fhAdcNoTimeA);
218 fListOfHistos->Add(fhAdcWithTimeA);
219 fListOfHistos->Add(fhAdcNoTimeC);
220 fListOfHistos->Add(fhAdcWithTimeC);
221
222 fListOfHistos->Add(fhAdcPMTNoTime);
223 fListOfHistos->Add(fhAdcPMTWithTime);
224
225 fListOfHistos->Add(fhTimeA);
226 fListOfHistos->Add(fhTimeC);
227
228 fListOfHistos->Add(fhWidthA);
229 fListOfHistos->Add(fhWidthC);
230
231 fListOfHistos->Add(fhTimePMT);
232 fListOfHistos->Add(fhWidthPMT);
233
234 fListOfHistos->Add(fhAdcWidthA);
235 fListOfHistos->Add(fhAdcWidthC);
236
237 fListOfHistos->Add(fhTimeCorr);
238
239 fListOfHistos->Add(fhAdcTimeA);
240 fListOfHistos->Add(fhAdcTimeC);
241
242 fListOfHistos->Add(fV0a);
243 fListOfHistos->Add(fV0c);
244 fListOfHistos->Add(fV0multA);
245 fListOfHistos->Add(fV0multC);
246 fListOfHistos->Add(fV0ampl);
892effee 247
248 fListOfHistos->Add(fhTimePMTCorr);
249 fListOfHistos->Add(fhEvents);
250
251 fListOfHistos->Add(fhVtxXYBB);
252 fListOfHistos->Add(fhVtxZBB);
253 fListOfHistos->Add(fhVtxXYBGA);
254 fListOfHistos->Add(fhVtxZBGA);
255 fListOfHistos->Add(fhVtxXYBGC);
256 fListOfHistos->Add(fhVtxZBGC);
ecb38463 257}
258
259void AliAnaVZEROQA::UserExec(Option_t */*option*/)
260{
f0a651f0 261 // Fill the QA histograms
262 // using ESD data
ecb38463 263 AliVEvent* event = InputEvent();
264 if (!event) {
265 Printf("ERROR: Could not retrieve event");
266 return;
267 }
268
269 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(event);
713a03ae 270 if (!esd) {
271 Printf("ERROR: No ESD event");
272 return;
273 }
ecb38463 274 AliESDVZERO* esdV0 = esd->GetVZEROData();
713a03ae 275 if (!esdV0) {
276 Printf("ERROR: No ESD VZERO");
277 return;
278 }
ecb38463 279
280 Float_t timeA = 0,timeC = 0;
281 Int_t ntimeA = 0, ntimeC = 0;
282 for (Int_t i=0; i<64; ++i) {
283 if (esdV0->GetTime(i) < 1e-6) {
284 if (i >= 32) {
285 fhAdcNoTimeA->Fill(esdV0->GetAdc(i));
286 }
287 else {
288 fhAdcNoTimeC->Fill(esdV0->GetAdc(i));
289 }
290 fhAdcPMTNoTime->Fill(i,esdV0->GetAdc(i));
291 }
292 else {
293 if (i >= 32) {
294 fhAdcWithTimeA->Fill(esdV0->GetAdc(i));
295 }
296 else {
297 fhAdcWithTimeC->Fill(esdV0->GetAdc(i));
298 }
299 fhAdcPMTWithTime->Fill(i,esdV0->GetAdc(i));
300 }
301
302 if (i >= 32) {
303 fhTimeA->Fill(esdV0->GetTime(i));
304 fhWidthA->Fill(esdV0->GetWidth(i));
305 fhAdcWidthA->Fill(esdV0->GetAdc(i),esdV0->GetTime(i));
306 fhAdcTimeA->Fill(esdV0->GetTime(i),esdV0->GetAdc(i));
307 }
308 else {
309 fhTimeC->Fill(esdV0->GetTime(i));
310 fhWidthC->Fill(esdV0->GetWidth(i));
311 fhAdcWidthC->Fill(esdV0->GetAdc(i),esdV0->GetTime(i));
312 fhAdcTimeC->Fill(esdV0->GetTime(i),esdV0->GetAdc(i));
313 }
314 fhTimePMT->Fill(i,esdV0->GetTime(i));
315 fhWidthPMT->Fill(i,esdV0->GetWidth(i));
316
892effee 317 Float_t correctedTime = CorrectLeadingTime(i,esdV0->GetTime(i),esdV0->GetAdc(i));
318 fhTimePMTCorr->Fill(i,correctedTime);
319
ecb38463 320 if (esdV0->GetTime(i) > 1e-6) {
321 if (i >= 32) {
892effee 322 timeA += correctedTime;
ecb38463 323 ntimeA++;
324 }
325 else {
892effee 326 timeC += correctedTime;
ecb38463 327 ntimeC++;
328 }
329 }
330 }
331
332 if (ntimeA > 0) timeA = timeA/ntimeA;
333 if (ntimeC > 0) timeC = timeC/ntimeC;
334
335 fhTimeCorr->Fill(timeA,timeC);
336
892effee 337 Int_t flaga = 0, flagc = 0;
338 TString stra("emptyA"),strc("emptyC");
339 if (timeA > 48 && timeA < 62) { flaga = 1; stra = "BBA"; }
340 if (timeA > 26 && timeA < 33) { flaga = 2; stra = "BGA"; }
341 if (timeC > 49 && timeC < 60) { flagc = 1; strc = "BBC"; }
342 if (timeC > 43 && timeC < 48.5) { flagc = 2; strc = "BGC"; }
343
344 fhEvents->Fill(flaga,flagc);
345
346 const AliESDVertex *vtx = esd->GetPrimaryVertexSPD();
347
348 if (flaga <= 1 && flagc <=1) {
349 fhVtxXYBB->Fill(vtx->GetXv(),vtx->GetYv());
350 fhVtxZBB->Fill(vtx->GetZv());
351 }
352 else {
353 if (flaga == 2) {
354 fhVtxXYBGA->Fill(vtx->GetXv(),vtx->GetYv());
355 fhVtxZBGA->Fill(vtx->GetZv());
356 }
357 if (flagc == 2) {
358 fhVtxXYBGC->Fill(vtx->GetXv(),vtx->GetYv());
359 fhVtxZBGC->Fill(vtx->GetZv());
360 }
361 }
362
ecb38463 363 fV0a->Fill(esdV0->GetNbPMV0A());
364 fV0c->Fill(esdV0->GetNbPMV0C());
365 fV0multA->Fill(esdV0->GetMTotV0A());
366 fV0multC->Fill(esdV0->GetMTotV0C());
367 for(Int_t i = 0; i < 64; i++) {
368 fV0ampl->Fill(esdV0->GetMultiplicity(i));
369 }
370
371 // Post output data.
372 PostData(1, fListOfHistos);
373}
374
375void AliAnaVZEROQA::Terminate(Option_t *)
376{
f0a651f0 377 // Store the output histograms
378 // from the list
ecb38463 379 fListOfHistos = dynamic_cast<TList*>(GetOutputData(1));
380 if (!fListOfHistos) {
381 Printf("ERROR: fListOfHistos not available");
382 return;
383 }
384
ecb38463 385 Info("AliAnaVZEROQA", "Successfully finished");
386}
387
f0a651f0 388Float_t AliAnaVZEROQA::CorrectLeadingTime(Int_t i, Float_t time, Float_t adc) const
892effee 389{
390 // Correct for slewing and align the channels
391
f0a651f0 392 if (time < 1e-6) return 0;
892effee 393
394 // Time offsets between channels
395 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};
396 time -= timeShift[i];
397
398 // Slewing correction
f0a651f0 399 if (adc < 1e-6) return time;
892effee 400
401 time += 30.;
402 if (adc > 300.) adc = 300.;
403 if (adc > 70.) {
404 return (time -
405 2.93028e+01 +
406 adc*1.25188e-02 -
407 adc*adc*2.68348e-05);
408 }
409 else {
410 return (time -
411 3.52314e+01 +
412 adc*5.99289e-01 -
413 adc*adc*2.74668e-02 +
414 adc*adc*adc*6.61224e-04 -
415 adc*adc*adc*adc*7.77105e-06 +
416 adc*adc*adc*adc*adc*3.51229e-08);
417 }
418}
ecb38463 419
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