1 /**************************************************************************
2 * Copyright(c) 1998-2008, 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 **************************************************************************/
18 //*************************************************************************
19 // Class AliNormalizationCounter
20 // Class to store the informations relevant for the normalization in the
21 // barrel for each run
22 // Authors: G. Ortona, ortona@to.infn.it
23 // D. Caffarri, davide.caffarri@pd.to.infn.it
24 // with many thanks to P. Pillot
25 /////////////////////////////////////////////////////////////
28 #include "AliNormalizationCounter.h"
29 #include <AliESDEvent.h>
30 #include <AliESDtrack.h>
31 #include <AliAODEvent.h>
32 #include <AliAODVZERO.h>
33 #include <AliVParticle.h>
34 #include <AliTriggerAnalysis.h>
40 #include <AliPhysicsSelection.h>
41 #include <AliMultiplicity.h>
43 ClassImp(AliNormalizationCounter)
45 //____________________________________________
46 AliNormalizationCounter::AliNormalizationCounter():
50 fMultiplicity(kFALSE),
51 fMultiplicityEtaRange(1.0),
52 fHistTrackFilterEvMult(0),
53 fHistTrackAnaEvMult(0),
54 fHistTrackFilterSpdMult(0),
55 fHistTrackAnaSpdMult(0)
60 //__________________________________________________
61 AliNormalizationCounter::AliNormalizationCounter(const char *name):
65 fMultiplicity(kFALSE),
66 fMultiplicityEtaRange(1.0),
67 fHistTrackFilterEvMult(0),
68 fHistTrackAnaEvMult(0),
69 fHistTrackFilterSpdMult(0),
70 fHistTrackAnaSpdMult(0)
75 //______________________________________________
76 AliNormalizationCounter::~AliNormalizationCounter()
79 if(fHistTrackFilterEvMult){
80 delete fHistTrackFilterEvMult;
81 fHistTrackFilterEvMult =0;
83 if(fHistTrackAnaEvMult){
84 delete fHistTrackAnaEvMult;
85 fHistTrackAnaEvMult=0;
87 if(fHistTrackFilterSpdMult){
88 delete fHistTrackFilterSpdMult;
89 fHistTrackFilterSpdMult=0;
91 if(fHistTrackAnaSpdMult){
92 delete fHistTrackAnaSpdMult;
93 fHistTrackAnaSpdMult=0;
97 //______________________________________________
98 void AliNormalizationCounter::Init()
100 //variables initialization
101 fCounters.AddRubric("Event","triggered/V0AND/PileUp/PbPbC0SMH-B-NOPF-ALLNOTRD/Candles0.3/PrimaryV/countForNorm/noPrimaryV/zvtxGT10/!V0A&Candle03/!V0A&PrimaryV/Candid(Filter)/Candid(Analysis)/NCandid(Filter)/NCandid(Analysis)");
102 if(fMultiplicity) fCounters.AddRubric("Multiplicity", 5000);
103 fCounters.AddRubric("Run", 1000000);
105 fHistTrackFilterEvMult=new TH2F("FiltCandidvsTracksinEv","FiltCandidvsTracksinEv",10000,-0.5,9999.5,200,-0.5,199.5);
106 fHistTrackFilterEvMult->GetYaxis()->SetTitle("NCandidates");
107 fHistTrackFilterEvMult->GetXaxis()->SetTitle("NTracksinEvent");
108 fHistTrackAnaEvMult=new TH2F("AnaCandidvsTracksinEv","AnaCandidvsTracksinEv",10000,-0.5,9999.5,100,-0.5,99.5);
109 fHistTrackAnaEvMult->GetYaxis()->SetTitle("NCandidates");
110 fHistTrackAnaEvMult->GetXaxis()->SetTitle("NTracksinEvent");
111 fHistTrackFilterSpdMult=new TH2F("FilterCandidvsSpdMult","FilterCandidvsSpdMult",5000,-0.5,4999.5,200,-0.5,199.5);
112 fHistTrackFilterSpdMult->GetYaxis()->SetTitle("NCandidates");
113 fHistTrackFilterSpdMult->GetXaxis()->SetTitle("NSPDTracklets");
114 fHistTrackAnaSpdMult=new TH2F("AnaCandidvsSpdMult","AnaCandidvsSpdMult",5000,-0.5,4999.5,100,-0.5,99.5);
115 fHistTrackAnaSpdMult->GetYaxis()->SetTitle("NCandidates");
116 fHistTrackAnaSpdMult->GetXaxis()->SetTitle("NSPDTracklets");
119 //______________________________________________
120 Long64_t AliNormalizationCounter::Merge(TCollection* list){
122 if (list->IsEmpty()) return 0;//(Long64_t)fCounters.Merge(list);
125 const TObject* obj = 0x0;
126 while ((obj = next())) {
128 // check that "obj" is an object of the class AliNormalizationCounter
129 const AliNormalizationCounter* counter = dynamic_cast<const AliNormalizationCounter*>(obj);
131 AliError(Form("object named %s is not AliNormalizationCounter! Skipping it.", counter->GetName()));
139 return (Long64_t)1;//(Long64_t)fCounters->GetEntries();
141 //_______________________________________
142 void AliNormalizationCounter::Add(const AliNormalizationCounter *norm){
143 fCounters.Add(&(norm->fCounters));
144 fHistTrackFilterEvMult->Add(norm->fHistTrackFilterEvMult);
145 fHistTrackAnaEvMult->Add(norm->fHistTrackAnaEvMult);
146 fHistTrackFilterSpdMult->Add(norm->fHistTrackFilterSpdMult);
147 fHistTrackAnaSpdMult->Add(norm->fHistTrackAnaSpdMult);
149 //_______________________________________
151 Stores the variables used for normalization as function of run number
152 returns kTRUE if the event is to be counted for normalization
153 (pass event selection cuts OR has no primary vertex)
155 void AliNormalizationCounter::StoreEvent(AliVEvent *event,AliRDHFCuts *rdCut,Bool_t mc, Int_t multiplicity){
158 Bool_t isEventSelected = rdCut->IsEventSelected(event);
160 // events not passing physics selection. do nothing
161 if(rdCut->IsEventRejectedDuePhysicsSelection()) return;
165 Bool_t flag03=kFALSE;
166 Bool_t flagPV=kFALSE;
169 Int_t runNumber = event->GetRunNumber();
171 // Evaluate the multiplicity
172 if(multiplicity==-9999) Multiplicity(event);
175 AliESDEvent *eventESD = (AliESDEvent*)event;
176 if(!eventESD){AliError("ESD event not available");return;}
177 if(mc&&event->GetEventType() != 0)return;
178 //event must be either physics or MC
179 if(!(event->GetEventType() == 7||event->GetEventType() == 0))return;
182 fCounters.Count(Form("Event:triggered/Run:%d/Multiplicity:%d",runNumber,multiplicity));
184 fCounters.Count(Form("Event:triggered/Run:%d",runNumber));
187 AliTriggerAnalysis trAn; /// Trigger Analysis
188 AliAODVZERO* aodV0 = (AliAODVZERO*)event->GetVZEROData();
189 Bool_t isPP2012 = kFALSE;
190 if(runNumber>=176326 && runNumber<=193766) isPP2012=kTRUE;
191 if(aodV0 && !isPP2012){
192 v0B = trAn.IsOfflineTriggerFired(eventESD , AliTriggerAnalysis::kV0C);
193 v0A = trAn.IsOfflineTriggerFired(eventESD , AliTriggerAnalysis::kV0A);
197 fCounters.Count(Form("Event:V0AND/Run:%d/Multiplicity:%d",runNumber,multiplicity));
199 fCounters.Count(Form("Event:V0AND/Run:%d",runNumber));
203 // AliVVertex *vtrc = (AliVVertex*)event->GetPrimaryVertex();
204 // if(vtrc && vtrc->GetNContributors()>0){
205 // fCounters.Count(Form("Event:PrimaryV/Run:%d",runNumber));
210 AliAODEvent *eventAOD = (AliAODEvent*)event;
211 TString trigclass=eventAOD->GetFiredTriggerClasses();
212 if(trigclass.Contains("C0SMH-B-NOPF-ALLNOTRD")||trigclass.Contains("C0SMH-B-NOPF-ALL")){
214 fCounters.Count(Form("Event:PbPbC0SMH-B-NOPF-ALLNOTRD/Run:%d/Multiplicity:%d",runNumber,multiplicity));
216 fCounters.Count(Form("Event:PbPbC0SMH-B-NOPF-ALLNOTRD/Run:%d",runNumber));
222 fCounters.Count(Form("Event:PrimaryV/Run:%d/Multiplicity:%d",runNumber,multiplicity));
224 fCounters.Count(Form("Event:PrimaryV/Run:%d",runNumber));
227 if(rdCut->GetWhyRejection()==0){
229 fCounters.Count(Form("Event:noPrimaryV/Run:%d/Multiplicity:%d",runNumber,multiplicity));
231 fCounters.Count(Form("Event:noPrimaryV/Run:%d",runNumber));
233 //find good vtx outside range
234 if(rdCut->GetWhyRejection()==6){
236 fCounters.Count(Form("Event:zvtxGT10/Run:%d/Multiplicity:%d",runNumber,multiplicity));
237 fCounters.Count(Form("Event:PrimaryV/Run:%d/Multiplicity:%d",runNumber,multiplicity));
239 fCounters.Count(Form("Event:zvtxGT10/Run:%d",runNumber));
240 fCounters.Count(Form("Event:PrimaryV/Run:%d",runNumber));
244 if(rdCut->GetWhyRejection()==1){
246 fCounters.Count(Form("Event:PileUp/Run:%d/Multiplicity:%d",runNumber,multiplicity));
248 fCounters.Count(Form("Event:PileUp/Run:%d",runNumber));
251 //to be counted for normalization
252 if(rdCut->CountEventForNormalization()){
254 fCounters.Count(Form("Event:countForNorm/Run:%d/Multiplicity:%d",runNumber,multiplicity));
256 fCounters.Count(Form("Event:countForNorm/Run:%d",runNumber));
261 Int_t trkEntries = (Int_t)event->GetNumberOfTracks();
262 for(Int_t i=0;i<trkEntries&&!flag03;i++){
263 AliAODTrack *track=(AliAODTrack*)event->GetTrack(i);
264 if((track->Pt()>0.3)&&(!flag03)){
266 fCounters.Count(Form("Event:Candles0.3/Run:%d/Multiplicity:%d",runNumber,multiplicity));
268 fCounters.Count(Form("Event:Candles0.3/Run:%d",runNumber));
274 if(!(v0A&&v0B)&&(flag03)){
276 fCounters.Count(Form("Event:!V0A&Candle03/Run:%d/Multiplicity:%d",runNumber,multiplicity));
278 fCounters.Count(Form("Event:!V0A&Candle03/Run:%d",runNumber));
280 if(!(v0A&&v0B)&&flagPV){
282 fCounters.Count(Form("Event:!V0A&PrimaryV/Run:%d/Multiplicity:%d",runNumber,multiplicity));
284 fCounters.Count(Form("Event:!V0A&PrimaryV/Run:%d",runNumber));
289 //_____________________________________________________________________
290 void AliNormalizationCounter::StoreCandidates(AliVEvent *event,Int_t nCand,Bool_t flagFilter){
292 Int_t ntracks=event->GetNumberOfTracks();
293 if(flagFilter)fHistTrackFilterEvMult->Fill(ntracks,nCand);
294 else fHistTrackAnaEvMult->Fill(ntracks,nCand);
297 AliESDEvent *ESDevent=(AliESDEvent*)event;
298 const AliMultiplicity *alimult = ESDevent->GetMultiplicity();
299 nSPD = alimult->GetNumberOfTracklets();
302 AliAODEvent *aodEvent =(AliAODEvent*)event;
303 AliAODTracklets *trklets=aodEvent->GetTracklets();
304 nSPD = trklets->GetNumberOfTracklets();
306 if(flagFilter)fHistTrackFilterSpdMult->Fill(nSPD,nCand);
307 else fHistTrackAnaSpdMult->Fill(nSPD,nCand);
309 Int_t runNumber = event->GetRunNumber();
310 Int_t multiplicity = Multiplicity(event);
314 fCounters.Count(Form("Event:Candid(Filter)/Run:%d/Multiplicity:%d",runNumber,multiplicity));
316 fCounters.Count(Form("Event:Candid(Filter)/Run:%d",runNumber));
317 for(Int_t i=0;i<nCand;i++){
319 fCounters.Count(Form("Event:NCandid(Filter)/Run:%d/Multiplicity:%d",runNumber,multiplicity));
321 fCounters.Count(Form("Event:NCandid(Filter)/Run:%d",runNumber));
325 fCounters.Count(Form("Event:Candid(Analysis)/Run:%d/Multiplicity:%d",runNumber,multiplicity));
327 fCounters.Count(Form("Event:Candid(Analysis)/Run:%d",runNumber));
328 for(Int_t i=0;i<nCand;i++){
330 fCounters.Count(Form("Event:NCandid(Analysis)/Run:%d/Multiplicity:%d",runNumber,multiplicity));
332 fCounters.Count(Form("Event:NCandid(Analysis)/Run:%d",runNumber));
337 //_______________________________________________________________________
338 TH1D* AliNormalizationCounter::DrawAgainstRuns(TString candle,Bool_t drawHist){
340 fCounters.SortRubric("Run");
342 selection.Form("event:%s",candle.Data());
343 TH1D* histoneD = fCounters.Get("run",selection.Data());
346 if(drawHist)histoneD->DrawClone();
349 //___________________________________________________________________________
350 TH1D* AliNormalizationCounter::DrawRatio(TString candle1,TString candle2){
352 fCounters.SortRubric("Run");
355 name.Form("%s/%s",candle1.Data(),candle2.Data());
356 TH1D* num=DrawAgainstRuns(candle1.Data(),kFALSE);
357 TH1D* den=DrawAgainstRuns(candle2.Data(),kFALSE);
359 den->SetTitle(candle2.Data());
360 den->SetName(candle2.Data());
361 num->Divide(num,den,1,1,"B");
362 num->SetTitle(name.Data());
363 num->SetName(name.Data());
367 //___________________________________________________________________________
368 void AliNormalizationCounter::PrintRubrics(){
369 fCounters.PrintKeyWords();
371 //___________________________________________________________________________
372 Double_t AliNormalizationCounter::GetSum(TString candle){
373 TString selection="event:";
374 selection.Append(candle);
375 return fCounters.GetSum(selection.Data());
377 //___________________________________________________________________________
378 TH2F* AliNormalizationCounter::GetHist(Bool_t filtercuts,Bool_t spdtracklets,Bool_t drawHist){
381 if(drawHist)fHistTrackFilterSpdMult->DrawCopy("LEGO2Z 0");
382 return fHistTrackFilterSpdMult;
384 if(drawHist)fHistTrackFilterEvMult->DrawCopy("LEGO2Z 0");
385 return fHistTrackFilterEvMult;
389 if(drawHist)fHistTrackAnaSpdMult->DrawCopy("LEGO2Z 0");
390 return fHistTrackAnaSpdMult;
392 if(drawHist)fHistTrackAnaEvMult->DrawCopy("LEGO2Z 0");
393 return fHistTrackAnaEvMult;
397 //___________________________________________________________________________
398 Double_t AliNormalizationCounter::GetNEventsForNorm(){
399 Double_t noVtxzGT10=GetSum("noPrimaryV")*GetSum("zvtxGT10")/GetSum("PrimaryV");
400 return GetSum("countForNorm")-noVtxzGT10;
402 //___________________________________________________________________________
403 Double_t AliNormalizationCounter::GetNEventsForNorm(Int_t runnumber){
404 TString listofruns = fCounters.GetKeyWords("RUN");
405 if(!listofruns.Contains(Form("%d",runnumber))){
406 printf("WARNING: %d is not a valid run number\n",runnumber);
407 fCounters.Print("Run","",kTRUE);
410 TString suffix;suffix.Form("/RUN:%d",runnumber);
411 TString zvtx;zvtx.Form("zvtxGT10%s",suffix.Data());
412 TString noPV;noPV.Form("noPrimaryV%s",suffix.Data());
413 TString pV;pV.Form("PrimaryV%s",suffix.Data());
414 TString tbc;tbc.Form("countForNorm%s",suffix.Data());
415 Double_t noVtxzGT10=GetSum(noPV.Data())*GetSum(zvtx.Data())/GetSum(pV.Data());
416 return GetSum(tbc.Data())-noVtxzGT10;
419 //___________________________________________________________________________
420 Double_t AliNormalizationCounter::GetNEventsForNorm(Int_t minmultiplicity, Int_t maxmultiplicity){
423 AliInfo("Sorry, you didn't activate the multiplicity in the counter!");
427 TString listofruns = fCounters.GetKeyWords("Multiplicity");
429 Int_t nmultbins = maxmultiplicity - minmultiplicity;
430 Double_t sumnoPV=0., sumZvtx=0., sumPv=0., sumEvtNorm=0.;
431 for (Int_t ibin=0; ibin<=nmultbins; ibin++) {
432 // cout << " Looking at bin "<< ibin+minmultiplicity<<endl;
433 if(!listofruns.Contains(Form("%d",ibin+minmultiplicity))){
434 AliInfo(Form("WARNING: %d is not a valid multiplicity number. \n",ibin+minmultiplicity));
437 TString suffix;suffix.Form("/Multiplicity:%d",ibin+minmultiplicity);
438 TString zvtx;zvtx.Form("zvtxGT10%s",suffix.Data());
439 TString noPV;noPV.Form("noPrimaryV%s",suffix.Data());
440 TString pV;pV.Form("PrimaryV%s",suffix.Data());
441 TString tbc;tbc.Form("countForNorm%s",suffix.Data());
442 sumnoPV += GetSum(noPV.Data());
443 sumZvtx += GetSum(zvtx.Data());
444 sumPv += GetSum(pV.Data());
445 sumEvtNorm += GetSum(tbc.Data());
447 Double_t noVtxzGT10 = sumPv>0. ? sumnoPV * sumZvtx / sumPv : 0.;
448 return sumEvtNorm - noVtxzGT10;
451 //___________________________________________________________________________
452 TH1D* AliNormalizationCounter::DrawNEventsForNorm(Bool_t drawRatio){
453 //usare algebra histos
454 fCounters.SortRubric("Run");
457 selection.Form("event:noPrimaryV");
458 TH1D* hnoPrimV = fCounters.Get("run",selection.Data());
461 selection.Form("event:zvtxGT10");
462 TH1D* hzvtx= fCounters.Get("run",selection.Data());
465 selection.Form("event:PrimaryV");
466 TH1D* hPrimV = fCounters.Get("run",selection.Data());
469 hzvtx->Multiply(hnoPrimV);
470 hzvtx->Divide(hPrimV);
472 selection.Form("event:countForNorm");
473 TH1D* hCountForNorm = fCounters.Get("run",selection.Data());
474 hCountForNorm->Sumw2();
476 hCountForNorm->Add(hzvtx,-1.);
479 selection.Form("event:triggered");
480 TH1D* htriggered = fCounters.Get("run",selection.Data());
482 hCountForNorm->Divide(htriggered);
485 hCountForNorm->DrawClone();
486 return hCountForNorm;
489 //___________________________________________________________________________
490 Int_t AliNormalizationCounter::Multiplicity(AliVEvent* event){
492 Int_t multiplicity = 0;
493 AliAODEvent *eventAOD = (AliAODEvent*)event;
494 AliAODTracklets * aodTracklets = (AliAODTracklets*)eventAOD->GetTracklets();
495 Int_t ntracklets = (Int_t)aodTracklets->GetNumberOfTracklets();
496 for(Int_t i=0;i<ntracklets; i++){
497 Double_t theta = aodTracklets->GetTheta(i);
498 Double_t eta = -TMath::Log( TMath::Tan(theta/2.) ); // check the formula
499 if(TMath::Abs(eta)<fMultiplicityEtaRange){ // set the proper cut on eta