1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 //------------------------------
17 // Analysis task for quality-assurance
20 // 05/12/2009 cvetan.cheshkov@cern.ch
21 //------------------------------
30 #include "AliESDEvent.h"
31 #include "AliESDVZERO.h"
33 #include "AliAnaVZEROQA.h"
35 ClassImp(AliAnaVZEROQA)
37 AliAnaVZEROQA::AliAnaVZEROQA():
38 AliAnalysisTaskSE("AliAnaVZEROQA"),
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());
90 AliAnaVZEROQA::AliAnaVZEROQA(const char* name):
91 AliAnalysisTaskSE(name),
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());
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)
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);
156 TH2F * AliAnaVZEROQA::CreateHisto2D(const char* name, const char* title,Int_t nBinsX,
157 Double_t xMin, Double_t xMax,
159 Double_t yMin, Double_t yMax,
160 const char* xLabel, const char* yLabel)
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);
169 void AliAnaVZEROQA::UserCreateOutputObjects()
172 AliInfo("AliAnaVZEROQA::UserCreateOutputObjects");
173 // Create output container
174 fListOfHistos = new TList();
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");
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");
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");
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");
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)");
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)");
196 fhTimeCorr = CreateHisto2D("htimecorr","Average time C side vs. A side",200,0,100,200,0,100,"Time V0A (ns)","Time V0C (ns");
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");
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);
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);
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);
217 fListOfHistos->Add(fhAdcNoTimeA);
218 fListOfHistos->Add(fhAdcWithTimeA);
219 fListOfHistos->Add(fhAdcNoTimeC);
220 fListOfHistos->Add(fhAdcWithTimeC);
222 fListOfHistos->Add(fhAdcPMTNoTime);
223 fListOfHistos->Add(fhAdcPMTWithTime);
225 fListOfHistos->Add(fhTimeA);
226 fListOfHistos->Add(fhTimeC);
228 fListOfHistos->Add(fhWidthA);
229 fListOfHistos->Add(fhWidthC);
231 fListOfHistos->Add(fhTimePMT);
232 fListOfHistos->Add(fhWidthPMT);
234 fListOfHistos->Add(fhAdcWidthA);
235 fListOfHistos->Add(fhAdcWidthC);
237 fListOfHistos->Add(fhTimeCorr);
239 fListOfHistos->Add(fhAdcTimeA);
240 fListOfHistos->Add(fhAdcTimeC);
242 fListOfHistos->Add(fV0a);
243 fListOfHistos->Add(fV0c);
244 fListOfHistos->Add(fV0multA);
245 fListOfHistos->Add(fV0multC);
246 fListOfHistos->Add(fV0ampl);
248 fListOfHistos->Add(fhTimePMTCorr);
249 fListOfHistos->Add(fhEvents);
251 fListOfHistos->Add(fhVtxXYBB);
252 fListOfHistos->Add(fhVtxZBB);
253 fListOfHistos->Add(fhVtxXYBGA);
254 fListOfHistos->Add(fhVtxZBGA);
255 fListOfHistos->Add(fhVtxXYBGC);
256 fListOfHistos->Add(fhVtxZBGC);
259 void AliAnaVZEROQA::UserExec(Option_t */*option*/)
261 // Fill the QA histograms
263 AliVEvent* event = InputEvent();
265 Printf("ERROR: Could not retrieve event");
269 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(event);
270 AliESDVZERO* esdV0 = esd->GetVZEROData();
272 Float_t timeA = 0,timeC = 0;
273 Int_t ntimeA = 0, ntimeC = 0;
274 for (Int_t i=0; i<64; ++i) {
275 if (esdV0->GetTime(i) < 1e-6) {
277 fhAdcNoTimeA->Fill(esdV0->GetAdc(i));
280 fhAdcNoTimeC->Fill(esdV0->GetAdc(i));
282 fhAdcPMTNoTime->Fill(i,esdV0->GetAdc(i));
286 fhAdcWithTimeA->Fill(esdV0->GetAdc(i));
289 fhAdcWithTimeC->Fill(esdV0->GetAdc(i));
291 fhAdcPMTWithTime->Fill(i,esdV0->GetAdc(i));
295 fhTimeA->Fill(esdV0->GetTime(i));
296 fhWidthA->Fill(esdV0->GetWidth(i));
297 fhAdcWidthA->Fill(esdV0->GetAdc(i),esdV0->GetTime(i));
298 fhAdcTimeA->Fill(esdV0->GetTime(i),esdV0->GetAdc(i));
301 fhTimeC->Fill(esdV0->GetTime(i));
302 fhWidthC->Fill(esdV0->GetWidth(i));
303 fhAdcWidthC->Fill(esdV0->GetAdc(i),esdV0->GetTime(i));
304 fhAdcTimeC->Fill(esdV0->GetTime(i),esdV0->GetAdc(i));
306 fhTimePMT->Fill(i,esdV0->GetTime(i));
307 fhWidthPMT->Fill(i,esdV0->GetWidth(i));
309 Float_t correctedTime = CorrectLeadingTime(i,esdV0->GetTime(i),esdV0->GetAdc(i));
310 fhTimePMTCorr->Fill(i,correctedTime);
312 if (esdV0->GetTime(i) > 1e-6) {
314 timeA += correctedTime;
318 timeC += correctedTime;
324 if (ntimeA > 0) timeA = timeA/ntimeA;
325 if (ntimeC > 0) timeC = timeC/ntimeC;
327 fhTimeCorr->Fill(timeA,timeC);
329 Int_t flaga = 0, flagc = 0;
330 TString stra("emptyA"),strc("emptyC");
331 if (timeA > 48 && timeA < 62) { flaga = 1; stra = "BBA"; }
332 if (timeA > 26 && timeA < 33) { flaga = 2; stra = "BGA"; }
333 if (timeC > 49 && timeC < 60) { flagc = 1; strc = "BBC"; }
334 if (timeC > 43 && timeC < 48.5) { flagc = 2; strc = "BGC"; }
336 fhEvents->Fill(flaga,flagc);
338 const AliESDVertex *vtx = esd->GetPrimaryVertexSPD();
340 if (flaga <= 1 && flagc <=1) {
341 fhVtxXYBB->Fill(vtx->GetXv(),vtx->GetYv());
342 fhVtxZBB->Fill(vtx->GetZv());
346 fhVtxXYBGA->Fill(vtx->GetXv(),vtx->GetYv());
347 fhVtxZBGA->Fill(vtx->GetZv());
350 fhVtxXYBGC->Fill(vtx->GetXv(),vtx->GetYv());
351 fhVtxZBGC->Fill(vtx->GetZv());
355 fV0a->Fill(esdV0->GetNbPMV0A());
356 fV0c->Fill(esdV0->GetNbPMV0C());
357 fV0multA->Fill(esdV0->GetMTotV0A());
358 fV0multC->Fill(esdV0->GetMTotV0C());
359 for(Int_t i = 0; i < 64; i++) {
360 fV0ampl->Fill(esdV0->GetMultiplicity(i));
364 PostData(1, fListOfHistos);
367 void AliAnaVZEROQA::Terminate(Option_t *)
369 // Store the output histograms
371 fListOfHistos = dynamic_cast<TList*>(GetOutputData(1));
372 if (!fListOfHistos) {
373 Printf("ERROR: fListOfHistos not available");
377 fhAdcNoTimeA = dynamic_cast<TH1F*>(fListOfHistos->At(0));
378 fhAdcWithTimeA = dynamic_cast<TH1F*>(fListOfHistos->At(1));
379 fhAdcNoTimeC = dynamic_cast<TH1F*>(fListOfHistos->At(2));
380 fhAdcWithTimeC = dynamic_cast<TH1F*>(fListOfHistos->At(3));
382 fhAdcPMTNoTime = dynamic_cast<TH2F*>(fListOfHistos->At(4));
383 fhAdcPMTWithTime = dynamic_cast<TH2F*>(fListOfHistos->At(5));
385 fhTimeA = dynamic_cast<TH1F*>(fListOfHistos->At(6));
386 fhTimeC = dynamic_cast<TH1F*>(fListOfHistos->At(7));
388 fhWidthA = dynamic_cast<TH1F*>(fListOfHistos->At(8));
389 fhWidthC = dynamic_cast<TH1F*>(fListOfHistos->At(9));
391 fhTimePMT = dynamic_cast<TH2F*>(fListOfHistos->At(10));
392 fhWidthPMT = dynamic_cast<TH2F*>(fListOfHistos->At(11));
394 fhAdcWidthA = dynamic_cast<TH2F*>(fListOfHistos->At(12));
395 fhAdcWidthC = dynamic_cast<TH2F*>(fListOfHistos->At(13));
397 fhTimeCorr = dynamic_cast<TH2F*>(fListOfHistos->At(14));
399 fhAdcTimeA = dynamic_cast<TH2F*>(fListOfHistos->At(15));
400 fhAdcTimeC = dynamic_cast<TH2F*>(fListOfHistos->At(16));
402 fV0a = dynamic_cast<TH1F*>(fListOfHistos->At(17));
403 fV0c = dynamic_cast<TH1F*>(fListOfHistos->At(18));
404 fV0multA = dynamic_cast<TH1F*>(fListOfHistos->At(19));
405 fV0multC = dynamic_cast<TH1F*>(fListOfHistos->At(20));
406 fV0ampl = dynamic_cast<TH1F*>(fListOfHistos->At(21));
408 fhTimePMTCorr = dynamic_cast<TH2F*>(fListOfHistos->At(22));
409 fhEvents = dynamic_cast<TH2F*>(fListOfHistos->At(23));
411 fhVtxXYBB = dynamic_cast<TH2F*>(fListOfHistos->At(24));
412 fhVtxZBB = dynamic_cast<TH1F*>(fListOfHistos->At(25));
413 fhVtxXYBGA = dynamic_cast<TH2F*>(fListOfHistos->At(26));
414 fhVtxZBGA = dynamic_cast<TH1F*>(fListOfHistos->At(27));
415 fhVtxXYBGC = dynamic_cast<TH2F*>(fListOfHistos->At(28));
416 fhVtxZBGC = dynamic_cast<TH1F*>(fListOfHistos->At(29));
418 // draw the histograms if not in batch mode
419 if (!gROOT->IsBatch()) {
421 fhTimePMT->DrawCopy();
423 fhAdcTimeA->DrawCopy();
425 fhAdcTimeC->DrawCopy();
427 fhAdcPMTNoTime->DrawCopy();
429 fhAdcPMTWithTime->DrawCopy();
431 fhTimeCorr->DrawCopy("E");
433 fV0ampl->DrawCopy("E");
435 fhTimePMTCorr->DrawCopy("colz");
437 fhEvents->DrawCopy("colz");
440 // write the output histograms to a file
441 TFile* outputFile = TFile::Open("VZEROQA.root", "recreate");
442 if (!outputFile || !outputFile->IsOpen())
444 Error("AliAnaVZEROQA", "opening output file VZEROQA.root failed");
448 fhAdcNoTimeA->Write();
449 fhAdcWithTimeA->Write();
450 fhAdcNoTimeC->Write();
451 fhAdcWithTimeC->Write();
453 fhAdcPMTNoTime->Write();
454 fhAdcPMTWithTime->Write();
465 fhAdcWidthA->Write();
466 fhAdcWidthC->Write();
479 fhTimePMTCorr->Write();
493 Info("AliAnaVZEROQA", "Successfully finished");
496 Float_t AliAnaVZEROQA::CorrectLeadingTime(Int_t i, Float_t time, Float_t adc) const
498 // Correct for slewing and align the channels
500 if (time < 1e-6) return 0;
502 // Time offsets between channels
503 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};
504 time -= timeShift[i];
506 // Slewing correction
507 if (adc < 1e-6) return time;
510 if (adc > 300.) adc = 300.;
515 adc*adc*2.68348e-05);
521 adc*adc*2.74668e-02 +
522 adc*adc*adc*6.61224e-04 -
523 adc*adc*adc*adc*7.77105e-06 +
524 adc*adc*adc*adc*adc*3.51229e-08);