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 /////////////////////////////////////////////////////////////
27 #include "AliNormalizationCounter.h"
28 #include <AliESDEvent.h>
29 #include <AliESDtrack.h>
30 #include <AliAODEvent.h>
31 #include <AliVParticle.h>
32 #include <AliTriggerAnalysis.h>
38 #include <AliPhysicsSelection.h>
39 #include <AliMultiplicity.h>
41 ClassImp(AliNormalizationCounter)
43 //____________________________________________
44 AliNormalizationCounter::AliNormalizationCounter():
48 fRejectPileUp(kFALSE),
49 fHistTrackFilterEvMult(0),
50 fHistTrackAnaEvMult(0),
51 fHistTrackFilterSpdMult(0),
52 fHistTrackAnaSpdMult(0)
57 //__________________________________________________
58 AliNormalizationCounter::AliNormalizationCounter(const char *name):
62 fRejectPileUp(kFALSE),
63 fHistTrackFilterEvMult(0),
64 fHistTrackAnaEvMult(0),
65 fHistTrackFilterSpdMult(0),
66 fHistTrackAnaSpdMult(0)
69 fCounters.AddRubric("Event","triggered/V0AND/PileUp/PbPbC0SMH-B-NOPF-ALLNOTRD/Candles0.2/Candles0.2spd1/Candles0.3/2xCandles0.2/CandleITSsa/Candle35clsTPC/PrimaryVTracks/PrimaryV/PrimaryVSPD/!V0A&Candle02/!V0A&Candle025/!V0A&Candle03/!V0A&PrimaryVTracks/!V0A&PrimaryV/!V0A&2xCandles02/Candid(Filter)/Candid(Analysis)/NCandid(Filter)/NCandid(Analysis)");
70 fCounters.AddRubric("Run", 1000000);
72 fHistTrackFilterEvMult=new TH2F("FiltCandidvsTracksinEv","FiltCandidvsTracksinEv",10000,-0.5,9999.5,200,-0.5,199.5);
73 fHistTrackFilterEvMult->GetYaxis()->SetTitle("NCandidates");
74 fHistTrackFilterEvMult->GetXaxis()->SetTitle("NTracksinEvent");
75 fHistTrackAnaEvMult=new TH2F("AnaCandidvsTracksinEv","AnaCandidvsTracksinEv",10000,-0.5,9999.5,100,-0.5,99.5);
76 fHistTrackAnaEvMult->GetYaxis()->SetTitle("NCandidates");
77 fHistTrackAnaEvMult->GetXaxis()->SetTitle("NTracksinEvent");
78 fHistTrackFilterSpdMult=new TH2F("FilterCandidvsSpdMult","FilterCandidvsSpdMult",5000,-0.5,4999.5,200,-0.5,199.5);
79 fHistTrackFilterSpdMult->GetYaxis()->SetTitle("NCandidates");
80 fHistTrackFilterSpdMult->GetXaxis()->SetTitle("NSPDTracklets");
81 fHistTrackAnaSpdMult=new TH2F("AnaCandidvsSpdMult","AnaCandidvsSpdMult",5000,-0.5,4999.5,100,-0.5,99.5);
82 fHistTrackAnaSpdMult->GetYaxis()->SetTitle("NCandidates");
83 fHistTrackAnaSpdMult->GetXaxis()->SetTitle("NSPDTracklets");
85 //______________________________________________
86 AliNormalizationCounter::~AliNormalizationCounter()
89 if(fHistTrackFilterEvMult){
90 delete fHistTrackFilterEvMult;
91 fHistTrackFilterEvMult =0;
93 if(fHistTrackAnaEvMult){
94 delete fHistTrackAnaEvMult;
95 fHistTrackAnaEvMult=0;
97 if(fHistTrackFilterSpdMult){
98 delete fHistTrackFilterSpdMult;
99 fHistTrackFilterSpdMult=0;
101 if(fHistTrackAnaSpdMult){
102 delete fHistTrackAnaSpdMult;
103 fHistTrackAnaSpdMult=0;
107 //______________________________________________
108 Long64_t AliNormalizationCounter::Merge(TCollection* list){
110 if (list->IsEmpty()) return 0;//(Long64_t)fCounters.Merge(list);
113 const TObject* obj = 0x0;
114 while ((obj = next())) {
116 // check that "obj" is an object of the class AliNormalizationCounter
117 const AliNormalizationCounter* counter = dynamic_cast<const AliNormalizationCounter*>(obj);
119 AliError(Form("object named %s is not AliNormalizationCounter! Skipping it.", counter->GetName()));
127 return (Long64_t)1;//(Long64_t)fCounters->GetEntries();
129 //_______________________________________
130 void AliNormalizationCounter::Add(const AliNormalizationCounter *norm){
131 fCounters.Add(&(norm->fCounters));
132 fHistTrackFilterEvMult->Add(norm->fHistTrackFilterEvMult);
133 fHistTrackAnaEvMult->Add(norm->fHistTrackAnaEvMult);
134 fHistTrackFilterSpdMult->Add(norm->fHistTrackFilterSpdMult);
135 fHistTrackAnaSpdMult->Add(norm->fHistTrackAnaSpdMult);
137 //_______________________________________
138 void AliNormalizationCounter::StoreEvent(AliVEvent *event,Bool_t mc){
143 Bool_t flag02=kFALSE;
144 Bool_t flag03=kFALSE;
146 Bool_t flagPV=kFALSE;
147 Bool_t flagPVT=kFALSE;
148 Bool_t flag35cls=kFALSE;
149 Bool_t flagITSsa=kFALSE;
150 Bool_t flag02spd=kFALSE;
153 Int_t runNumber = event->GetRunNumber();
156 AliESDEvent *eventESD = (AliESDEvent*)event;
157 if(!eventESD){AliError("ESD event not available");return;}
158 if(mc&&event->GetEventType() != 0)return;
159 //event must be either physics or MC
160 if(!(event->GetEventType() == 7||event->GetEventType() == 0))return;
162 fCounters.Count(Form("Event:triggered/Run:%d",runNumber));
165 AliTriggerAnalysis trAn; /// Trigger Analysis
166 v0B = trAn.IsOfflineTriggerFired(eventESD , AliTriggerAnalysis::kV0C);
167 v0A = trAn.IsOfflineTriggerFired(eventESD , AliTriggerAnalysis::kV0A);
168 if(v0A&&v0B){fCounters.Count(Form("Event:V0AND/Run:%d",runNumber));}
171 AliAODEvent *eventAOD = (AliAODEvent*)event;
172 AliVVertex *vtrc = (AliVVertex*)event->GetPrimaryVertex();
173 if(vtrc && vtrc->GetNContributors()>0){
174 fCounters.Count(Form("Event:PrimaryV/Run:%d",runNumber));
178 AliAODVertex *vrtcSPD = (AliAODVertex*)eventAOD->GetPrimaryVertexSPD();
180 if(vrtcSPD->GetNContributors()>0)fCounters.Count(Form("Event:PrimaryVSPD/Run:%d",runNumber));
184 const AliESDVertex *vtrc1 = eventESD->GetPrimaryVertexTracks();
185 if(vtrc1 && vtrc1->GetNContributors()>0){
186 fCounters.Count(Form("Event:PrimaryVTracks/Run:%d",runNumber));
192 TString trigclass=eventAOD->GetFiredTriggerClasses();
193 if(trigclass.Contains("C0SMH-B-NOPF-ALLNOTRD")||trigclass.Contains("C0SMH-B-NOPF-ALL"))fCounters.Count(Form("Event:PbPbC0SMH-B-NOPF-ALLNOTRD/Run:%d",runNumber));
196 if(eventAOD->IsPileupFromSPD()){
197 fCounters.Count(Form("Event:PileUp/Run:%d",runNumber));
198 if(fRejectPileUp==1)return;
202 Int_t trkEntries = (Int_t)event->GetNumberOfTracks();
204 for(Int_t i=0;i<trkEntries;i++){
205 AliAODTrack *track=(AliAODTrack*)event->GetTrack(i);
206 UShort_t nClusTPC=track->GetTPCNcls();
208 if(TESTBIT(track->GetITSClusterMap(),1))nSPD++;
209 if(TESTBIT(track->GetITSClusterMap(),0))nSPD++;
210 if(nClusTPC==0&&(track->GetStatus()&AliESDtrack::kITSrefit)&&!flagITSsa){
212 fCounters.Count(Form("Event:CandleITSsa/Run:%d",runNumber));
214 if((nClusTPC>=35)&&(track->GetStatus()&AliESDtrack::kITSrefit)&&(track->GetStatus()&AliESDtrack::kTPCrefit)&&(track->Pt()>0.2)&&(!flag35cls)){
215 fCounters.Count(Form("Event:Candle35clsTPC/Run:%d",runNumber));
218 if((nClusTPC>=70)&&(track->GetStatus()&AliESDtrack::kITSrefit)&&(track->GetStatus()&AliESDtrack::kTPCrefit)){
220 if((track->Pt()>0.2)&&flag0202<2){
221 if(!flag02)fCounters.Count(Form("Event:Candles0.2/Run:%d",runNumber));
225 if((track->Pt()>0.2)&&!flag02spd&&nSPD>=1){
226 fCounters.Count(Form("Event:Candles0.2spd1/Run:%d",runNumber));
229 if((track->Pt()>0.3)&&(!flag03)){
230 fCounters.Count(Form("Event:Candles0.3/Run:%d",runNumber));
234 if((flag02)&&(flag03)&&flag0202>=2&&flag35cls&&flagITSsa) break;
237 if(!(v0A&&v0B)&&(flag02))fCounters.Count(Form("Event:!V0A&Candle02/Run:%d",runNumber));
238 if(!(v0A&&v0B)&&(flag03))fCounters.Count(Form("Event:!V0A&Candle03/Run:%d",runNumber));
239 if(!(v0A&&v0B)&&flagPVT)fCounters.Count(Form("Event:!V0A&PrimaryVTracks/Run:%d",runNumber));
240 if(!(v0A&&v0B)&&flagPV)fCounters.Count(Form("Event:!V0A&PrimaryV/Run:%d",runNumber));
241 if(flag0202>1)fCounters.Count(Form("Event:2xCandles0.2/Run:%d",runNumber));
242 if(!(v0A&&v0B)&&flag0202>1)fCounters.Count(Form("Event:!V0A&2xCandles02/Run:%d",runNumber));
248 //_____________________________________________________________________
249 void AliNormalizationCounter::StoreCandidates(AliVEvent *event,Int_t nCand,Bool_t flagFilter){
251 Int_t ntracks=event->GetNumberOfTracks();
252 if(flagFilter)fHistTrackFilterEvMult->Fill(ntracks,nCand);
253 else fHistTrackAnaEvMult->Fill(ntracks,nCand);
256 AliESDEvent *ESDevent=(AliESDEvent*)event;
257 const AliMultiplicity *alimult = ESDevent->GetMultiplicity();
258 nSPD = alimult->GetNumberOfTracklets();
261 AliAODEvent *aodEvent =(AliAODEvent*)event;
262 AliAODTracklets *trklets=aodEvent->GetTracklets();
263 nSPD = trklets->GetNumberOfTracklets();
265 if(flagFilter)fHistTrackFilterSpdMult->Fill(nSPD,nCand);
266 else fHistTrackAnaSpdMult->Fill(nSPD,nCand);
268 Int_t runNumber = event->GetRunNumber();
271 fCounters.Count(Form("Event:Candid(Filter)/Run:%d",runNumber));
272 for(Int_t i=0;i<nCand;i++)fCounters.Count(Form("Event:NCandid(Filter)/Run:%d",runNumber));
274 fCounters.Count(Form("Event:Candid(Analysis)/Run:%d",runNumber));
275 for(Int_t i=0;i<nCand;i++)fCounters.Count(Form("Event:NCandid(Analysis)/Run:%d",runNumber));
279 //_______________________________________________________________________
280 TH1D* AliNormalizationCounter::DrawAgainstRuns(TString candle,Bool_t drawHist){
282 fCounters.SortRubric("Run");
284 selection.Form("event:%s",candle.Data());
285 TH1D* histoneD = fCounters.Get("run",selection.Data());
288 if(drawHist)histoneD->DrawClone();
291 //___________________________________________________________________________
292 TH1D* AliNormalizationCounter::DrawRatio(TString candle1,TString candle2){
294 fCounters.SortRubric("Run");
297 name.Form("%s/%s",candle1.Data(),candle2.Data());
298 TH1D* num=DrawAgainstRuns(candle1.Data(),kFALSE);
299 TH1D* den=DrawAgainstRuns(candle2.Data(),kFALSE);
301 den->SetTitle(candle2.Data());
302 den->SetName(candle2.Data());
303 num->Divide(num,den,1,1,"B");
304 num->SetTitle(name.Data());
305 num->SetName(name.Data());
309 //___________________________________________________________________________
310 void AliNormalizationCounter::PrintRubrics(){
311 fCounters.PrintKeyWords();
313 //___________________________________________________________________________
314 Double_t AliNormalizationCounter::GetSum(TString candle){
315 TString selection="event:";
316 selection.Append(candle);
317 return fCounters.GetSum(selection.Data());
319 //___________________________________________________________________________
320 TH2F* AliNormalizationCounter::GetHist(Bool_t filtercuts,Bool_t spdtracklets,Bool_t drawHist){
323 if(drawHist)fHistTrackFilterSpdMult->DrawCopy("LEGO2Z 0");
324 return fHistTrackFilterSpdMult;
326 if(drawHist)fHistTrackFilterEvMult->DrawCopy("LEGO2Z 0");
327 return fHistTrackFilterEvMult;
331 if(drawHist)fHistTrackAnaSpdMult->DrawCopy("LEGO2Z 0");
332 return fHistTrackAnaSpdMult;
334 if(drawHist)fHistTrackAnaEvMult->DrawCopy("LEGO2Z 0");
335 return fHistTrackAnaEvMult;