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 //------------------------------
31 #include "AliESDEvent.h"
32 #include "AliESDVZERO.h"
34 #include "AliAnaVZEROQA.h"
36 ClassImp(AliAnaVZEROQA)
38 AliAnaVZEROQA::AliAnaVZEROQA():
39 AliAnalysisTaskSE("AliAnaVZEROQA"),
83 // Default constructor
84 // Define input and output slots here
85 // Input slot #0 works with a TChain
86 DefineInput(0, TChain::Class());
87 // Output slot #1 TList
88 DefineOutput(1, TList::Class());
91 AliAnaVZEROQA::AliAnaVZEROQA(const char* name):
92 AliAnalysisTaskSE(name),
136 AliInfo("Constructor AliAnaVZEROQA");
137 // Define input and output slots here
138 // Input slot #0 works with a TChain
139 DefineInput(0, TChain::Class());
140 // Output slot #1 TList
141 DefineOutput(1, TList::Class());
144 TH1F * AliAnaVZEROQA::CreateHisto1D(const char* name, const char* title,Int_t nBins,
145 Double_t xMin, Double_t xMax,
146 const char* xLabel, const char* yLabel)
148 // create a histogram
149 TH1F* result = new TH1F(name, title, nBins, xMin, xMax);
150 result->SetOption("E");
151 if (xLabel) result->GetXaxis()->SetTitle(xLabel);
152 if (yLabel) result->GetYaxis()->SetTitle(yLabel);
153 result->SetMarkerStyle(kFullCircle);
157 TH2F * AliAnaVZEROQA::CreateHisto2D(const char* name, const char* title,Int_t nBinsX,
158 Double_t xMin, Double_t xMax,
160 Double_t yMin, Double_t yMax,
161 const char* xLabel, const char* yLabel)
163 // create a histogram
164 TH2F* result = new TH2F(name, title, nBinsX, xMin, xMax, nBinsY, yMin, yMax);
165 if (xLabel) result->GetXaxis()->SetTitle(xLabel);
166 if (yLabel) result->GetYaxis()->SetTitle(yLabel);
170 void AliAnaVZEROQA::UserCreateOutputObjects()
173 AliInfo("AliAnaVZEROQA::UserCreateOutputObjects");
174 // Create output container
175 fListOfHistos = new TList();
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");
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");
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");
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");
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)");
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)");
197 fhTimeCorr = CreateHisto2D("htimecorr","Average time C side vs. A side",200,0,100,200,0,100,"Time V0A (ns)","Time V0C (ns");
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");
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);
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);
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);
218 fListOfHistos->Add(fhAdcNoTimeA);
219 fListOfHistos->Add(fhAdcWithTimeA);
220 fListOfHistos->Add(fhAdcNoTimeC);
221 fListOfHistos->Add(fhAdcWithTimeC);
223 fListOfHistos->Add(fhAdcPMTNoTime);
224 fListOfHistos->Add(fhAdcPMTWithTime);
226 fListOfHistos->Add(fhTimeA);
227 fListOfHistos->Add(fhTimeC);
229 fListOfHistos->Add(fhWidthA);
230 fListOfHistos->Add(fhWidthC);
232 fListOfHistos->Add(fhTimePMT);
233 fListOfHistos->Add(fhWidthPMT);
235 fListOfHistos->Add(fhAdcWidthA);
236 fListOfHistos->Add(fhAdcWidthC);
238 fListOfHistos->Add(fhTimeCorr);
240 fListOfHistos->Add(fhAdcTimeA);
241 fListOfHistos->Add(fhAdcTimeC);
243 fListOfHistos->Add(fV0a);
244 fListOfHistos->Add(fV0c);
245 fListOfHistos->Add(fV0multA);
246 fListOfHistos->Add(fV0multC);
247 fListOfHistos->Add(fV0ampl);
249 fListOfHistos->Add(fhTimePMTCorr);
250 fListOfHistos->Add(fhEvents);
252 fListOfHistos->Add(fhVtxXYBB);
253 fListOfHistos->Add(fhVtxZBB);
254 fListOfHistos->Add(fhVtxXYBGA);
255 fListOfHistos->Add(fhVtxZBGA);
256 fListOfHistos->Add(fhVtxXYBGC);
257 fListOfHistos->Add(fhVtxZBGC);
260 void AliAnaVZEROQA::UserExec(Option_t */*option*/)
262 AliVEvent* event = InputEvent();
264 Printf("ERROR: Could not retrieve event");
268 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(event);
269 AliESDVZERO* esdV0 = esd->GetVZEROData();
271 Float_t timeA = 0,timeC = 0;
272 Int_t ntimeA = 0, ntimeC = 0;
273 for (Int_t i=0; i<64; ++i) {
274 if (esdV0->GetTime(i) < 1e-6) {
276 fhAdcNoTimeA->Fill(esdV0->GetAdc(i));
279 fhAdcNoTimeC->Fill(esdV0->GetAdc(i));
281 fhAdcPMTNoTime->Fill(i,esdV0->GetAdc(i));
285 fhAdcWithTimeA->Fill(esdV0->GetAdc(i));
288 fhAdcWithTimeC->Fill(esdV0->GetAdc(i));
290 fhAdcPMTWithTime->Fill(i,esdV0->GetAdc(i));
294 fhTimeA->Fill(esdV0->GetTime(i));
295 fhWidthA->Fill(esdV0->GetWidth(i));
296 fhAdcWidthA->Fill(esdV0->GetAdc(i),esdV0->GetTime(i));
297 fhAdcTimeA->Fill(esdV0->GetTime(i),esdV0->GetAdc(i));
300 fhTimeC->Fill(esdV0->GetTime(i));
301 fhWidthC->Fill(esdV0->GetWidth(i));
302 fhAdcWidthC->Fill(esdV0->GetAdc(i),esdV0->GetTime(i));
303 fhAdcTimeC->Fill(esdV0->GetTime(i),esdV0->GetAdc(i));
305 fhTimePMT->Fill(i,esdV0->GetTime(i));
306 fhWidthPMT->Fill(i,esdV0->GetWidth(i));
308 Float_t correctedTime = CorrectLeadingTime(i,esdV0->GetTime(i),esdV0->GetAdc(i));
309 fhTimePMTCorr->Fill(i,correctedTime);
311 if (esdV0->GetTime(i) > 1e-6) {
313 timeA += correctedTime;
317 timeC += correctedTime;
323 if (ntimeA > 0) timeA = timeA/ntimeA;
324 if (ntimeC > 0) timeC = timeC/ntimeC;
326 fhTimeCorr->Fill(timeA,timeC);
328 Int_t flaga = 0, flagc = 0;
329 TString stra("emptyA"),strc("emptyC");
330 if (timeA > 48 && timeA < 62) { flaga = 1; stra = "BBA"; }
331 if (timeA > 26 && timeA < 33) { flaga = 2; stra = "BGA"; }
332 if (timeC > 49 && timeC < 60) { flagc = 1; strc = "BBC"; }
333 if (timeC > 43 && timeC < 48.5) { flagc = 2; strc = "BGC"; }
335 fhEvents->Fill(flaga,flagc);
337 const AliESDVertex *vtx = esd->GetPrimaryVertexSPD();
339 if (flaga <= 1 && flagc <=1) {
340 fhVtxXYBB->Fill(vtx->GetXv(),vtx->GetYv());
341 fhVtxZBB->Fill(vtx->GetZv());
345 fhVtxXYBGA->Fill(vtx->GetXv(),vtx->GetYv());
346 fhVtxZBGA->Fill(vtx->GetZv());
349 fhVtxXYBGC->Fill(vtx->GetXv(),vtx->GetYv());
350 fhVtxZBGC->Fill(vtx->GetZv());
354 fV0a->Fill(esdV0->GetNbPMV0A());
355 fV0c->Fill(esdV0->GetNbPMV0C());
356 fV0multA->Fill(esdV0->GetMTotV0A());
357 fV0multC->Fill(esdV0->GetMTotV0C());
358 for(Int_t i = 0; i < 64; i++) {
359 fV0ampl->Fill(esdV0->GetMultiplicity(i));
363 PostData(1, fListOfHistos);
366 void AliAnaVZEROQA::Terminate(Option_t *)
368 fListOfHistos = dynamic_cast<TList*>(GetOutputData(1));
369 if (!fListOfHistos) {
370 Printf("ERROR: fListOfHistos not available");
374 fhAdcNoTimeA = dynamic_cast<TH1F*>(fListOfHistos->At(0));
375 fhAdcWithTimeA = dynamic_cast<TH1F*>(fListOfHistos->At(1));
376 fhAdcNoTimeC = dynamic_cast<TH1F*>(fListOfHistos->At(2));
377 fhAdcWithTimeC = dynamic_cast<TH1F*>(fListOfHistos->At(3));
379 fhAdcPMTNoTime = dynamic_cast<TH2F*>(fListOfHistos->At(4));
380 fhAdcPMTWithTime = dynamic_cast<TH2F*>(fListOfHistos->At(5));
382 fhTimeA = dynamic_cast<TH1F*>(fListOfHistos->At(6));
383 fhTimeC = dynamic_cast<TH1F*>(fListOfHistos->At(7));
385 fhWidthA = dynamic_cast<TH1F*>(fListOfHistos->At(8));
386 fhWidthC = dynamic_cast<TH1F*>(fListOfHistos->At(9));
388 fhTimePMT = dynamic_cast<TH2F*>(fListOfHistos->At(10));
389 fhWidthPMT = dynamic_cast<TH2F*>(fListOfHistos->At(11));
391 fhAdcWidthA = dynamic_cast<TH2F*>(fListOfHistos->At(12));
392 fhAdcWidthC = dynamic_cast<TH2F*>(fListOfHistos->At(13));
394 fhTimeCorr = dynamic_cast<TH2F*>(fListOfHistos->At(14));
396 fhAdcTimeA = dynamic_cast<TH2F*>(fListOfHistos->At(15));
397 fhAdcTimeC = dynamic_cast<TH2F*>(fListOfHistos->At(16));
399 fV0a = dynamic_cast<TH1F*>(fListOfHistos->At(17));
400 fV0c = dynamic_cast<TH1F*>(fListOfHistos->At(18));
401 fV0multA = dynamic_cast<TH1F*>(fListOfHistos->At(19));
402 fV0multC = dynamic_cast<TH1F*>(fListOfHistos->At(20));
403 fV0ampl = dynamic_cast<TH1F*>(fListOfHistos->At(21));
405 fhTimePMTCorr = dynamic_cast<TH2F*>(fListOfHistos->At(22));
406 fhEvents = dynamic_cast<TH2F*>(fListOfHistos->At(23));
408 fhVtxXYBB = dynamic_cast<TH2F*>(fListOfHistos->At(24));
409 fhVtxZBB = dynamic_cast<TH1F*>(fListOfHistos->At(25));
410 fhVtxXYBGA = dynamic_cast<TH2F*>(fListOfHistos->At(26));
411 fhVtxZBGA = dynamic_cast<TH1F*>(fListOfHistos->At(27));
412 fhVtxXYBGC = dynamic_cast<TH2F*>(fListOfHistos->At(28));
413 fhVtxZBGC = dynamic_cast<TH1F*>(fListOfHistos->At(29));
415 // draw the histograms if not in batch mode
416 if (!gROOT->IsBatch()) {
418 fhTimePMT->DrawCopy();
420 fhAdcTimeA->DrawCopy();
422 fhAdcTimeC->DrawCopy();
424 fhAdcPMTNoTime->DrawCopy();
426 fhAdcPMTWithTime->DrawCopy();
428 fhTimeCorr->DrawCopy("E");
430 fV0ampl->DrawCopy("E");
432 fhTimePMTCorr->DrawCopy("colz");
434 fhEvents->DrawCopy("colz");
437 // write the output histograms to a file
438 TFile* outputFile = TFile::Open("VZEROQA.root", "recreate");
439 if (!outputFile || !outputFile->IsOpen())
441 Error("AliAnaVZEROQA", "opening output file VZEROQA.root failed");
445 fhAdcNoTimeA->Write();
446 fhAdcWithTimeA->Write();
447 fhAdcNoTimeC->Write();
448 fhAdcWithTimeC->Write();
450 fhAdcPMTNoTime->Write();
451 fhAdcPMTWithTime->Write();
462 fhAdcWidthA->Write();
463 fhAdcWidthC->Write();
476 fhTimePMTCorr->Write();
490 Info("AliAnaVZEROQA", "Successfully finished");
493 Float_t AliAnaVZEROQA::CorrectLeadingTime(Int_t i, Float_t time, Float_t adc)
495 // Correct for slewing and align the channels
497 if (time == 0) return 0;
499 // Time offsets between channels
500 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};
501 time -= timeShift[i];
503 // Slewing correction
504 if (adc == 0) return time;
507 if (adc > 300.) adc = 300.;
512 adc*adc*2.68348e-05);
518 adc*adc*2.74668e-02 +
519 adc*adc*adc*6.61224e-04 -
520 adc*adc*adc*adc*7.77105e-06 +
521 adc*adc*adc*adc*adc*3.51229e-08);