]>
Commit | Line | Data |
---|---|---|
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 | ||
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), | |
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 | ||
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), | |
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 | ||
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 | ||
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 | ||
259 | void 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 | ||
375 | void 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 | 388 | Float_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 |