6 #include "AliAnalysisTask.h"
7 #include "AliAnalysisManager.h"
9 #include "AliESDEvent.h"
10 #include "AliESDInputHandler.h"
11 #include "AliAnaVZEROPbPb.h"
12 #include "AliMultiplicity.h"
13 #include "AliESDUtils.h"
14 #include "AliCentrality.h"
17 #include "AliESDVZERO.h"
19 ClassImp(AliAnaVZEROPbPb)
21 AliAnaVZEROPbPb::AliAnaVZEROPbPb()
22 : AliAnalysisTaskSE(), fESD(0), fEsdV0(0), fOutputList(0), fNClasses(0), fClassesNames(0),
42 fhV0vsSPDCentrality(0),
47 fhEqualizedMultSum(0),
53 fNBinOnlineCharge(100),
54 fV0AOnlineChargeMax(20000),
55 fV0COnlineChargeMax(30000),
65 for(Int_t i = 0; i < 2; ++i) {
66 fhAdcNoTime[i] = fhAdcWithTime[i] = fhWidth[i] = fhTime[i] = NULL;
67 fhAdcTime[i] = fhAdcWidth[i] = NULL;
72 //________________________________________________________________________
73 AliAnaVZEROPbPb::AliAnaVZEROPbPb(const char *name)
74 : AliAnalysisTaskSE(name), fESD(0), fEsdV0(0), fOutputList(0),fNClasses(0),fClassesNames(0),
94 fhV0vsSPDCentrality(0),
99 fhEqualizedMultSum(0),
105 fNBinOnlineCharge(100),
106 fV0AOnlineChargeMax(20000),
107 fV0COnlineChargeMax(30000),
110 fNBinSumsEqMult(100),
111 fV0AEqMultMax(4000.),
116 for(Int_t i = 0; i < 2; ++i) {
117 fhAdcNoTime[i] = fhAdcWithTime[i] = fhWidth[i] = fhTime[i] = NULL;
118 fhAdcTime[i] = fhAdcWidth[i] = NULL;
120 // Define input and output slots here
121 // Input slot #0 works with a TChain
122 DefineInput(0, TChain::Class());
123 // Output slot #0 id reserved by the base class for AOD
124 // Output slot #1 writes into a TH1 container
125 DefineOutput(1, TList::Class());
127 //________________________________________________________________________
128 void AliAnaVZEROPbPb::SetClassesNames(const Char_t * nameList){
129 // Initialize the class names
130 // which are used in the trigger split
131 TString names("AllClasses,");
133 fClassesNames = names.Tokenize(",");
134 fNClasses = fClassesNames->GetEntriesFast();
136 //________________________________________________________________________
137 TH1F * AliAnaVZEROPbPb::CreateHisto1D(const char* name, const char* title,Int_t nBins,
138 Double_t xMin, Double_t xMax,
139 const char* xLabel, const char* yLabel)
141 // create a histogram
142 // and set the axis labels and the style
143 TH1F* result = new TH1F(name, title, nBins, xMin, xMax);
144 result->SetOption("hist");
145 if (xLabel) result->GetXaxis()->SetTitle(xLabel);
146 if (yLabel) result->GetYaxis()->SetTitle(yLabel);
147 result->SetMarkerStyle(kFullCircle);
151 //________________________________________________________________________
152 TH2F * AliAnaVZEROPbPb::CreateHisto2D(const char* name, const char* title,Int_t nBinsX,
153 Double_t xMin, Double_t xMax,
155 Double_t yMin, Double_t yMax,
156 const char* xLabel, const char* yLabel)
158 // create a histogram
159 // and set the axis labels and the style
160 TH2F* result = new TH2F(name, title, nBinsX, xMin, xMax, nBinsY, yMin, yMax);
161 if (xLabel) result->GetXaxis()->SetTitle(xLabel);
162 if (yLabel) result->GetYaxis()->SetTitle(yLabel);
167 //________________________________________________________________________
168 void AliAnaVZEROPbPb::UserCreateOutputObjects()
173 AliFatal("No Classes Defined");
177 fOutputList = new TList();
178 fOutputList->SetOwner(kTRUE);
181 CreateHistosPerL2Trigger();
184 PostData(1, fOutputList);
186 //________________________________________________________________________
187 void AliAnaVZEROPbPb::Init()
193 //________________________________________________________________________
194 void AliAnaVZEROPbPb::UserExec(Option_t *)
197 // Called for each event
199 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
201 printf("ERROR: fESD not available\n");
205 fEsdV0 = fESD->GetVZEROData();
207 Printf("ERROR: esd V0 not available");
213 Bool_t isSelected = (fEsdV0->GetV0ADecision()==1) && (fEsdV0->GetV0CDecision()==1);
214 if (isSelected) FillPerL2TriggerHistos();
218 PostData(1, fOutputList);
220 //________________________________________________________________________
221 void AliAnaVZEROPbPb::CreateHistosPerL2Trigger(){
222 // Create the histograms
223 // for all the required L2 trigger classes
224 fhOnlineCharge= new TH2F*[fNClasses];
225 fhCentrality= new TH1F*[fNClasses];
226 fhV0vsSPDCentrality= new TH2F*[fNClasses];
227 fhRecoMult= new TH2F*[fNClasses];
228 fhRecoMultPMT= new TH2F*[fNClasses];
229 fhTotRecoMult= new TH1F*[fNClasses];
230 fhTriggerBits= new TH1F*[fNClasses];
231 fhEqualizedMult= new TH2F*[fNClasses];
232 fhEqualizedMultSum = new TH2F*[fNClasses];
234 fhL2Triggers = CreateHisto1D("hL2Triggers","L2 Triggers",fNClasses,0,fNClasses);
235 fOutputList->Add(fhL2Triggers);
237 TIter iter(fClassesNames);
240 while((name = (TObjString*) iter.Next())){
241 fhL2Triggers->GetXaxis()->SetBinLabel(iClass+1,name->String().Data());
243 fhOnlineCharge[iClass] = CreateHisto2D(Form("hOnlineCharge_%s",name->String().Data()),Form("Online Charge for %s",name->String().Data()),fNBinOnlineCharge,0.,fV0AOnlineChargeMax,fNBinOnlineCharge,0.,fV0COnlineChargeMax,"V0A","V0C");
244 fOutputList->Add(fhOnlineCharge[iClass]);
246 fhCentrality[iClass] = CreateHisto1D(Form("hV0Centrality_%s",name->String().Data()),Form("V0 centrality for %s",name->String().Data()),100,0.,100.);
247 fOutputList->Add(fhCentrality[iClass]);
249 fhV0vsSPDCentrality[iClass] = CreateHisto2D(Form("hV0vsSPDCentrality_%s",name->String().Data()),Form("Centrality for %s",name->String().Data()),100,0.,100.,100,0.,100,"SPD Centrality (CL1)","V0 Centrality (V0M)");
250 fOutputList->Add(fhV0vsSPDCentrality[iClass]);
252 fhRecoMult[iClass] = CreateHisto2D(Form("hRecoMult_%s",name->String().Data()),Form("Reco Multiplicity for %s",name->String().Data()),fNBinMult,0.,fV0AMultMax,fNBinMult,0.,fV0CMultMax,"V0A Offline Mult","V0C Offline Mult");
253 fOutputList->Add(fhRecoMult[iClass]);
255 fhRecoMultPMT[iClass] = CreateHisto2D(Form("hRecoMultPMT_%s",name->String().Data()),Form("Reco Multiplicity per PMT for %s",name->String().Data()),64,-0.5,63.5,200,0.,2000.,"PMT channel","Offline Mult");
256 fOutputList->Add(fhRecoMultPMT[iClass]);
258 fhTotRecoMult[iClass] = CreateHisto1D(Form("hTotRecoMult_%s",name->String().Data()),Form("Total Reco Multiplicity for %s",name->String().Data()),fNBinTotMult,0.,fTotMultMax,"V0A + V0C Offline Mult");
259 fOutputList->Add(fhTotRecoMult[iClass]);
261 fhTriggerBits[iClass] = CreateHisto1D(Form("hTriggerBits_%s",name->String().Data()),Form("Trigger Bits for %s",name->String().Data()),16,-0.5,15.5);
262 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(1,"BBA_AND_BBC");
263 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(2,"BBA_OR_BBC");
264 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(3,"BGA_AND_BBC");
265 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(4,"BGA");
266 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(5,"BBA_AND_BGC");
267 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(6,"BGC");
268 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(7,"CTA1_AND_CTC1");
269 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(8,"CTA1_OR_CTC1");
270 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(9,"CTA2_AND_CTC2");
271 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(10,"CTA2_OR_CTC2");
272 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(11,"MTA_AND_MTC");
273 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(12,"MTA_OR_MTC");
274 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(13,"BBA");
275 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(14,"BBC");
276 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(15,"BGA_OR_BGC");
277 fhTriggerBits[iClass]->GetXaxis()->SetBinLabel(16,"All True BG");
278 fOutputList->Add(fhTriggerBits[iClass]);
280 fhEqualizedMult[iClass] = CreateHisto2D(Form("hEqualizedMult_%s",name->String().Data()),Form("Equalized Multiplicity for %s",name->String().Data()),64,-0.5,63.5,fNBinEquaMult,0.,fEquaMultMax,"PMT channel","Equalized Multiplicity");
281 fOutputList->Add(fhEqualizedMult[iClass]);
283 fhEqualizedMultSum[iClass] = CreateHisto2D(Form("hEqualizedMultSum_%s",name->String().Data()),Form("Summed Equalized Multiplicity for %s",name->String().Data()),fNBinSumsEqMult,0.,fV0AEqMultMax,fNBinSumsEqMult,0.,fV0CEqMultMax,"V0A","V0C");
284 fOutputList->Add(fhEqualizedMultSum[iClass]);
291 //________________________________________________________________________
292 void AliAnaVZEROPbPb::CreateQAHistos(){
295 fNFlags = CreateHisto2D("hNFlags","BB Flags",33,-0.5,32.5,33,-0.5,32.5,"V0A","V0C");
296 fOutputList->Add(fNFlags);
298 for(int iSide = 0; iSide < 2; ++iSide){
300 if(iSide) side = "V0A";
303 fhAdcNoTime[iSide] = CreateHisto1D(Form("hAdcNoTime%s",side.Data()),Form("ADC (no Leading Time) %s",side.Data()),200,0,200,"ADC charge","Entries");
304 fOutputList->Add(fhAdcNoTime[iSide]);
305 fhAdcWithTime[iSide] = CreateHisto1D(Form("hAdcWithTime%s",side.Data()),Form("ADC (with Leading Time) %s",side.Data()),200,0,200,"ADC charge","Entries");
306 fOutputList->Add(fhAdcWithTime[iSide]);
307 fhTime[iSide] = CreateHisto1D(Form("htimepmt%s",side.Data()),Form("Time measured by TDC %s",side.Data()),1000,-100,100,"Leading time (ns)","Entries");
308 fOutputList->Add(fhTime[iSide]);
309 fhWidth[iSide] = CreateHisto1D(Form("hwidth%s",side.Data()),Form("Signal width measured by TDC %s",side.Data()),128,0,800,"Signal width (ns)","Entries");
310 fOutputList->Add(fhWidth[iSide]);
311 fhAdcWidth[iSide] = CreateHisto2D(Form("hadcwidth%s",side.Data()),Form("Time width vs ADC %s",side.Data()),200,0,1200,128,0,800,"ADC charge","Width (ns)");
312 fOutputList->Add(fhAdcWidth[iSide]);
313 fhAdcTime[iSide] = CreateHisto2D(Form("hAdcTime%s",side.Data()),Form("ADC vs Time %s",side.Data()),200,-100,100,200,0,200,"Time (ns)","ADC charge");
314 fOutputList->Add(fhAdcTime[iSide]);
317 fhAdcPMTNoTime = CreateHisto2D("hadcpmtnotime","ADC vs PMT index (no leading time)",64,-0.5,63.5,200,0,200,"PMT index","ADC charge");
318 fhAdcPMTWithTime = CreateHisto2D("hadcpmtwithtime","ADC vs PMT index (with leading time)",64,-0.5,63.5,200,0,2000,"PMT index","ADC charge");
320 fhTimePMT = CreateHisto2D("htimepmt","Time measured by TDC vs PMT index",64,-0.5,63.5,200,-50,50,"PMT Index","Leading time (ns)");
321 fhWidthPMT = CreateHisto2D("hwidthpmt","Time width vs PMT index",64,-0.5,63.5,128,0,800,"PMT Index","Signal width (ns)");
323 fhTimeCorr = CreateHisto2D("htimecorr","Average time C side vs. A side",200,-50,50,200,-50,50,"Time V0A (ns)","Time V0C (ns");
325 fhV0ampl = CreateHisto1D("hV0ampl","V0 multiplicity in single channel (all V0 channels)",500,-0.5,499.5);
327 fhEvents = CreateHisto2D("hTriggerDecision","Trigger Decision",3,-0.5,2.5,3,-0.5,2.5,"V0A Decision","V0C Decision");
328 fhEvents->GetXaxis()->SetBinLabel(1,"Fake");
329 fhEvents->GetXaxis()->SetBinLabel(2,"BB");
330 fhEvents->GetXaxis()->SetBinLabel(3,"BG");
331 fhEvents->GetYaxis()->SetBinLabel(1,"Fake");
332 fhEvents->GetYaxis()->SetBinLabel(2,"BB");
333 fhEvents->GetYaxis()->SetBinLabel(3,"BG");
335 fhVtxXYBB = CreateHisto2D("fhVtxXYBB","XY SPD vertex (bb)",200,-2,2,200,-2,2);
336 fhVtxZBB = CreateHisto1D("fhVtxZBB","Z SPD vertex (bb)",400,-50,50);
337 fhVtxXYBGA = CreateHisto2D("fhVtxXYBGA","XY SPD vertex (bga)",200,-2,2,200,-2,2);
338 fhVtxZBGA = CreateHisto1D("fhVtxZBGA","Z SPD vertex (bga)",400,-50,50);
339 fhVtxXYBGC = CreateHisto2D("fhVtxXYBGC","XY SPD vertex (bgc)",200,-2,2,200,-2,2);
340 fhVtxZBGC = CreateHisto1D("fhVtxZBGC","Z SPD vertex (bgc)",400,-50,50);
342 fhPmtMult = CreateHisto2D("hV0CellMult","Number of fired PMTs (V0C vs V0A)",33,-0.5,32.5,33,-0.5,32.5,"# Cell (V0A)","# Cell (V0C)");
343 fOutputList->Add(fhPmtMult);
346 fOutputList->Add(fhAdcPMTNoTime);
347 fOutputList->Add(fhAdcPMTWithTime);
349 fOutputList->Add(fhTimePMT);
350 fOutputList->Add(fhWidthPMT);
352 fOutputList->Add(fhTimeCorr);
353 fOutputList->Add(fhV0ampl);
355 fOutputList->Add(fhEvents);
357 fOutputList->Add(fhVtxXYBB);
358 fOutputList->Add(fhVtxZBB);
359 fOutputList->Add(fhVtxXYBGA);
360 fOutputList->Add(fhVtxZBGA);
361 fOutputList->Add(fhVtxXYBGC);
362 fOutputList->Add(fhVtxZBGC);
365 //________________________________________________________________________
366 void AliAnaVZEROPbPb::FillPerL2TriggerHistos(){
367 // Fill the histos which are split
368 // by L2 trigger class
369 TString trigStr(fESD->GetFiredTriggerClasses());
371 TIter iter(fClassesNames);
376 TObjArray * tokens = trigStr.Tokenize(" ");
377 Int_t ntokens = tokens->GetEntriesFast();
379 while((name = (TObjString*) iter.Next())){
381 Bool_t goodTrig = kFALSE;
383 for (Int_t itoken = 0; itoken < ntokens; ++itoken) {
384 if (!((((TObjString*)tokens->At(itoken))->String()).Contains("-B-"))) continue;
385 if ((((TObjString*)tokens->At(itoken))->String()).BeginsWith(name->String().Data())) {
390 } else goodTrig = kTRUE;
396 // if (!trigStr.Contains(name->String().Data())) continue;
398 fhOnlineCharge[iClass]->Fill(fEsdV0->GetTriggerChargeA(),fEsdV0->GetTriggerChargeC());
400 fhL2Triggers->Fill(iClass);
402 fhRecoMult[iClass]->Fill(fEsdV0->GetMTotV0A(),fEsdV0->GetMTotV0C());
403 fhTotRecoMult[iClass]->Fill(fEsdV0->GetMTotV0A()+fEsdV0->GetMTotV0C());
405 for(int iTrig = 0; iTrig < 16; ++iTrig){
406 if(fEsdV0->GetTriggerBits() & (1<<iTrig)) fhTriggerBits[iClass]->Fill(iTrig);
409 AliCentrality *centrality = fESD->GetCentrality();
410 Float_t percentile = centrality->GetCentralityPercentile("V0M");
411 Float_t spdPercentile = centrality->GetCentralityPercentile("CL1");
412 if (spdPercentile < 0) spdPercentile = 0;
413 if (percentile < 0) percentile = 0;
414 fhCentrality[iClass]->Fill(percentile);
415 fhV0vsSPDCentrality[iClass]->Fill(spdPercentile,percentile);
417 Float_t sumEqMult[2] = {0.,0.};
418 for(int iCh = 0; iCh < 64; ++iCh){
419 if(fEsdV0->GetTime(iCh) < -1024.+ 1e-6) continue;
420 fhRecoMultPMT[iClass]->Fill(iCh,fEsdV0->GetMultiplicity(iCh));
421 Int_t side = iCh / 32 ;
422 sumEqMult[side] += fESD->GetVZEROEqMultiplicity(iCh);
423 fhEqualizedMult[iClass]->Fill(iCh,fESD->GetVZEROEqMultiplicity(iCh));
425 fhEqualizedMultSum[iClass]->Fill(sumEqMult[1],sumEqMult[0]);
432 //________________________________________________________________________
433 void AliAnaVZEROPbPb::FillQAHistos(){
434 // Fill the main QA histos
436 Int_t nV0A = 0, nV0C = 0;
437 for(Int_t i = 0; i < 32; ++i) {
438 if (fEsdV0->GetBBFlag(i)) nV0C++;
439 if (fEsdV0->GetBBFlag(i+32)) nV0A++;
441 fNFlags->Fill((Float_t)nV0A,(Float_t)nV0C);
443 for (Int_t i=0; i<64; ++i) {
445 if (fEsdV0->GetTime(i) < 1e-6) {
446 fhAdcNoTime[side]->Fill(fEsdV0->GetAdc(i));
447 fhAdcPMTNoTime->Fill(i,fEsdV0->GetAdc(i));
449 fhAdcWithTime[side]->Fill(fEsdV0->GetAdc(i));
450 fhAdcPMTWithTime->Fill(i,fEsdV0->GetAdc(i));
453 fhTime[side]->Fill(fEsdV0->GetTime(i));
454 fhWidth[side]->Fill(fEsdV0->GetWidth(i));
455 fhAdcWidth[side]->Fill(fEsdV0->GetAdc(i),fEsdV0->GetWidth(i));
456 fhAdcTime[side]->Fill(fEsdV0->GetTime(i),fEsdV0->GetAdc(i));
458 fhTimePMT->Fill(i,fEsdV0->GetTime(i));
459 fhWidthPMT->Fill(i,fEsdV0->GetWidth(i));
463 fhTimeCorr->Fill(fEsdV0->GetV0ATime(),fEsdV0->GetV0CTime());
465 AliESDVZERO::Decision flaga = fEsdV0->GetV0ADecision();
466 AliESDVZERO::Decision flagc = fEsdV0->GetV0CDecision();
468 fhEvents->Fill(flaga,flagc);
470 const AliESDVertex *vtx = fESD->GetPrimaryVertexSPD();
472 if (flaga <= 1 && flagc <=1) {
473 fhVtxXYBB->Fill(vtx->GetXv(),vtx->GetYv());
474 fhVtxZBB->Fill(vtx->GetZv());
478 fhVtxXYBGA->Fill(vtx->GetXv(),vtx->GetYv());
479 fhVtxZBGA->Fill(vtx->GetZv());
482 fhVtxXYBGC->Fill(vtx->GetXv(),vtx->GetYv());
483 fhVtxZBGC->Fill(vtx->GetZv());
487 fhPmtMult->Fill(fEsdV0->GetNbPMV0A(),fEsdV0->GetNbPMV0C());
488 for(Int_t i = 0; i < 64; i++) {
489 fhV0ampl->Fill(fEsdV0->GetMultiplicity(i));
493 //________________________________________________________________________
494 void AliAnaVZEROPbPb::Terminate(Option_t *)
496 // Check if the output list is there
497 // Called once at the end of the query
499 fOutputList = dynamic_cast<TList*> (GetOutputData(1));
501 printf("ERROR: Output list not available\n");
506 //________________________________________________________________________
507 void AliAnaVZEROPbPb::SetOnlineChargeRange(Int_t nbins, Float_t maxA, Float_t maxC){
508 // Set Trigger charge
509 // range used for histogramming
510 fNBinOnlineCharge = nbins;
511 fV0AOnlineChargeMax = maxA;
512 fV0COnlineChargeMax = maxC;
514 //________________________________________________________________________
515 void AliAnaVZEROPbPb::SetTotalMultiplicityRange(Int_t nbins, Float_t max){
517 // range used for histogramming
518 fNBinTotMult = nbins;
521 //________________________________________________________________________
522 void AliAnaVZEROPbPb::SetMultiplicityRange(Int_t nbins, Float_t maxA, Float_t maxC){
524 // range used for histogramming
529 //________________________________________________________________________
530 void AliAnaVZEROPbPb::SetEquaMultRange(Int_t nbins, Float_t max){
531 // Set Equalized multiplicity
532 // range used for histogramming
533 fNBinEquaMult = nbins;
536 //________________________________________________________________________
537 void AliAnaVZEROPbPb::SetSumEquaMultRange(Int_t nbins, Float_t maxA, Float_t maxC){
538 // Set Equalized multiplicity
539 // range used for histogramming
540 fNBinSumsEqMult = nbins;
541 fV0AEqMultMax = maxA;
542 fV0CEqMultMax = maxC;