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 **************************************************************************/
16 //*************************************************************************
17 // Class AliNormalizationCounter
18 // Class to store the informations relevant for the normalization in the
19 // barrel for each run
20 // Authors: G. Ortona, ortona@to.infn.it
21 // D. Caffarri, davide.caffarri@pd.to.infn.it
22 // with many thanks to P. Pillot
23 /////////////////////////////////////////////////////////////
25 #include "AliNormalizationCounter.h"
26 #include <AliESDEvent.h>
27 #include <AliESDtrack.h>
28 #include <AliAODEvent.h>
29 #include <AliVParticle.h>
30 #include <AliTriggerAnalysis.h>
36 #include <AliPhysicsSelection.h>
37 #include <AliMultiplicity.h>
39 ClassImp(AliNormalizationCounter)
41 //____________________________________________
42 AliNormalizationCounter::AliNormalizationCounter():
46 fRejectPileUp(kFALSE),
47 fHistTrackFilterEvMult(0),
48 fHistTrackAnaEvMult(0),
49 fHistTrackFilterSpdMult(0),
50 fHistTrackAnaSpdMult(0)
55 //__________________________________________________
56 AliNormalizationCounter::AliNormalizationCounter(const char *name):
60 fRejectPileUp(kFALSE),
61 fHistTrackFilterEvMult(0),
62 fHistTrackAnaEvMult(0),
63 fHistTrackFilterSpdMult(0),
64 fHistTrackAnaSpdMult(0)
67 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)");
68 fCounters.AddRubric("Run", 1000000);
70 fHistTrackFilterEvMult=new TH2F("FiltCandidvsTracksinEv","FiltCandidvsTracksinEv",10000,-0.5,9999.5,200,-0.5,199.5);
71 fHistTrackFilterEvMult->GetYaxis()->SetTitle("NCandidates");
72 fHistTrackFilterEvMult->GetXaxis()->SetTitle("NTracksinEvent");
73 fHistTrackAnaEvMult=new TH2F("AnaCandidvsTracksinEv","AnaCandidvsTracksinEv",10000,-0.5,9999.5,100,-0.5,99.5);
74 fHistTrackAnaEvMult->GetYaxis()->SetTitle("NCandidates");
75 fHistTrackAnaEvMult->GetXaxis()->SetTitle("NTracksinEvent");
76 fHistTrackFilterSpdMult=new TH2F("FilterCandidvsSpdMult","FilterCandidvsSpdMult",5000,-0.5,4999.5,200,-0.5,199.5);
77 fHistTrackFilterSpdMult->GetYaxis()->SetTitle("NCandidates");
78 fHistTrackFilterSpdMult->GetXaxis()->SetTitle("NSPDTracklets");
79 fHistTrackAnaSpdMult=new TH2F("AnaCandidvsSpdMult","AnaCandidvsSpdMult",5000,-0.5,4999.5,100,-0.5,99.5);
80 fHistTrackAnaSpdMult->GetYaxis()->SetTitle("NCandidates");
81 fHistTrackAnaSpdMult->GetXaxis()->SetTitle("NSPDTracklets");
83 //______________________________________________
84 AliNormalizationCounter::~AliNormalizationCounter()
87 if(fHistTrackFilterEvMult){
88 delete fHistTrackFilterEvMult;
89 fHistTrackFilterEvMult =0;
91 if(fHistTrackAnaEvMult){
92 delete fHistTrackAnaEvMult;
93 fHistTrackAnaEvMult=0;
95 if(fHistTrackFilterSpdMult){
96 delete fHistTrackFilterSpdMult;
97 fHistTrackFilterSpdMult=0;
99 if(fHistTrackAnaSpdMult){
100 delete fHistTrackAnaSpdMult;
101 fHistTrackAnaSpdMult=0;
105 //______________________________________________
106 Long64_t AliNormalizationCounter::Merge(TCollection* list){
108 if (list->IsEmpty()) return 0;//(Long64_t)fCounters.Merge(list);
111 const TObject* obj = 0x0;
112 while ((obj = next())) {
114 // check that "obj" is an object of the class AliNormalizationCounter
115 const AliNormalizationCounter* counter = dynamic_cast<const AliNormalizationCounter*>(obj);
117 AliError(Form("object named %s is not AliNormalizationCounter! Skipping it.", counter->GetName()));
125 return (Long64_t)1;//(Long64_t)fCounters->GetEntries();
127 //_______________________________________
128 void AliNormalizationCounter::Add(const AliNormalizationCounter *norm){
129 fCounters.Add(&(norm->fCounters));
130 fHistTrackFilterEvMult->Add(norm->fHistTrackFilterEvMult);
131 fHistTrackAnaEvMult->Add(norm->fHistTrackAnaEvMult);
132 fHistTrackFilterSpdMult->Add(norm->fHistTrackFilterSpdMult);
133 fHistTrackAnaSpdMult->Add(norm->fHistTrackAnaSpdMult);
135 //_______________________________________
136 void AliNormalizationCounter::StoreEvent(AliVEvent *event,Bool_t mc){
141 Bool_t flag02=kFALSE;
142 Bool_t flag03=kFALSE;
144 Bool_t flagPV=kFALSE;
145 Bool_t flagPVT=kFALSE;
146 Bool_t flag35cls=kFALSE;
147 Bool_t flagITSsa=kFALSE;
148 Bool_t flag02spd=kFALSE;
151 Int_t runNumber = event->GetRunNumber();
154 AliESDEvent *eventESD = (AliESDEvent*)event;
155 if(!eventESD){AliError("ESD event not available");return;}
156 if(mc&&event->GetEventType() != 0)return;
157 //event must be either physics or MC
158 if(!(event->GetEventType() == 7||event->GetEventType() == 0))return;
160 fCounters.Count(Form("Event:triggered/Run:%d",runNumber));
163 AliTriggerAnalysis trAn; /// Trigger Analysis
164 v0B = trAn.IsOfflineTriggerFired(eventESD , AliTriggerAnalysis::kV0C);
165 v0A = trAn.IsOfflineTriggerFired(eventESD , AliTriggerAnalysis::kV0A);
166 if(v0A&&v0B){fCounters.Count(Form("Event:V0AND/Run:%d",runNumber));}
169 AliAODEvent *eventAOD = (AliAODEvent*)event;
170 AliVVertex *vtrc = (AliVVertex*)event->GetPrimaryVertex();
171 if(vtrc && vtrc->GetNContributors()>0){
172 fCounters.Count(Form("Event:PrimaryV/Run:%d",runNumber));
176 AliAODVertex *vrtcSPD = (AliAODVertex*)eventAOD->GetPrimaryVertexSPD();
178 if(vrtcSPD->GetNContributors()>0)fCounters.Count(Form("Event:PrimaryVSPD/Run:%d",runNumber));
182 const AliESDVertex *vtrc1 = eventESD->GetPrimaryVertexTracks();
183 if(vtrc1 && vtrc1->GetNContributors()>0){
184 fCounters.Count(Form("Event:PrimaryVTracks/Run:%d",runNumber));
190 TString trigclass=eventAOD->GetFiredTriggerClasses();
191 if(trigclass.Contains("C0SMH-B-NOPF-ALLNOTRD")||trigclass.Contains("C0SMH-B-NOPF-ALL"))fCounters.Count(Form("Event:PbPbC0SMH-B-NOPF-ALLNOTRD/Run:%d",runNumber));
194 if(eventAOD->IsPileupFromSPD()){
195 fCounters.Count(Form("Event:PileUp/Run:%d",runNumber));
196 if(fRejectPileUp==1)return;
200 Int_t trkEntries = (Int_t)event->GetNumberOfTracks();
202 for(Int_t i=0;i<trkEntries;i++){
203 AliAODTrack *track=(AliAODTrack*)event->GetTrack(i);
204 UShort_t nClusTPC=track->GetTPCNcls();
206 if(TESTBIT(track->GetITSClusterMap(),1))nSPD++;
207 if(TESTBIT(track->GetITSClusterMap(),0))nSPD++;
208 if(nClusTPC==0&&(track->GetStatus()&AliESDtrack::kITSrefit)&&!flagITSsa){
210 fCounters.Count(Form("Event:CandleITSsa/Run:%d",runNumber));
212 if((nClusTPC>=35)&&(track->GetStatus()&AliESDtrack::kITSrefit)&&(track->GetStatus()&AliESDtrack::kTPCrefit)&&(track->Pt()>0.2)&&(!flag35cls)){
213 fCounters.Count(Form("Event:Candle35clsTPC/Run:%d",runNumber));
216 if((nClusTPC>=70)&&(track->GetStatus()&AliESDtrack::kITSrefit)&&(track->GetStatus()&AliESDtrack::kTPCrefit)){
218 if((track->Pt()>0.2)&&flag0202<2){
219 if(!flag02)fCounters.Count(Form("Event:Candles0.2/Run:%d",runNumber));
223 if((track->Pt()>0.2)&&!flag02spd&&nSPD>=1){
224 fCounters.Count(Form("Event:Candles0.2spd1/Run:%d",runNumber));
227 if((track->Pt()>0.3)&&(!flag03)){
228 fCounters.Count(Form("Event:Candles0.3/Run:%d",runNumber));
232 if((flag02)&&(flag03)&&flag0202>=2&&flag35cls&&flagITSsa) break;
235 if(!(v0A&&v0B)&&(flag02))fCounters.Count(Form("Event:!V0A&Candle02/Run:%d",runNumber));
236 if(!(v0A&&v0B)&&(flag03))fCounters.Count(Form("Event:!V0A&Candle03/Run:%d",runNumber));
237 if(!(v0A&&v0B)&&flagPVT)fCounters.Count(Form("Event:!V0A&PrimaryVTracks/Run:%d",runNumber));
238 if(!(v0A&&v0B)&&flagPV)fCounters.Count(Form("Event:!V0A&PrimaryV/Run:%d",runNumber));
239 if(flag0202>1)fCounters.Count(Form("Event:2xCandles0.2/Run:%d",runNumber));
240 if(!(v0A&&v0B)&&flag0202>1)fCounters.Count(Form("Event:!V0A&2xCandles02/Run:%d",runNumber));
246 //_____________________________________________________________________
247 void AliNormalizationCounter::StoreCandidates(AliVEvent *event,Int_t nCand,Bool_t flagFilter){
249 Int_t ntracks=event->GetNumberOfTracks();
250 if(flagFilter)fHistTrackFilterEvMult->Fill(ntracks,nCand);
251 else fHistTrackAnaEvMult->Fill(ntracks,nCand);
254 AliESDEvent *ESDevent=(AliESDEvent*)event;
255 const AliMultiplicity *alimult = ESDevent->GetMultiplicity();
256 nSPD = alimult->GetNumberOfTracklets();
259 AliAODEvent *aodEvent =(AliAODEvent*)event;
260 AliAODTracklets *trklets=aodEvent->GetTracklets();
261 nSPD = trklets->GetNumberOfTracklets();
263 if(flagFilter)fHistTrackFilterSpdMult->Fill(nSPD,nCand);
264 else fHistTrackAnaSpdMult->Fill(nSPD,nCand);
266 Int_t runNumber = event->GetRunNumber();
269 fCounters.Count(Form("Event:Candid(Filter)/Run:%d",runNumber));
270 for(Int_t i=0;i<nCand;i++)fCounters.Count(Form("Event:NCandid(Filter)/Run:%d",runNumber));
272 fCounters.Count(Form("Event:Candid(Analysis)/Run:%d",runNumber));
273 for(Int_t i=0;i<nCand;i++)fCounters.Count(Form("Event:NCandid(Analysis)/Run:%d",runNumber));
277 //_______________________________________________________________________
278 TH1D* AliNormalizationCounter::DrawAgainstRuns(TString candle,Bool_t drawHist){
280 fCounters.SortRubric("Run");
282 selection.Form("event:%s",candle.Data());
283 TH1D* histoneD = fCounters.Get("run",selection.Data());
286 if(drawHist)histoneD->DrawClone();
289 //___________________________________________________________________________
290 TH1D* AliNormalizationCounter::DrawRatio(TString candle1,TString candle2){
292 fCounters.SortRubric("Run");
295 name.Form("%s/%s",candle1.Data(),candle2.Data());
296 TH1D* num=DrawAgainstRuns(candle1.Data(),kFALSE);
297 TH1D* den=DrawAgainstRuns(candle2.Data(),kFALSE);
299 den->SetTitle(candle2.Data());
300 den->SetName(candle2.Data());
301 num->Divide(num,den,1,1,"B");
302 num->SetTitle(name.Data());
303 num->SetName(name.Data());
307 //___________________________________________________________________________
308 void AliNormalizationCounter::PrintRubrics(){
309 fCounters.PrintKeyWords();
311 //___________________________________________________________________________
312 Double_t AliNormalizationCounter::GetSum(TString candle){
313 TString selection="event:";
314 selection.Append(candle);
315 return fCounters.GetSum(selection.Data());
317 //___________________________________________________________________________
318 TH2F* AliNormalizationCounter::GetHist(Bool_t filtercuts,Bool_t spdtracklets,Bool_t drawHist){
321 if(drawHist)fHistTrackFilterSpdMult->DrawCopy("LEGO2Z 0");
322 return fHistTrackFilterSpdMult;
324 if(drawHist)fHistTrackFilterEvMult->DrawCopy("LEGO2Z 0");
325 return fHistTrackFilterEvMult;
329 if(drawHist)fHistTrackAnaSpdMult->DrawCopy("LEGO2Z 0");
330 return fHistTrackAnaSpdMult;
332 if(drawHist)fHistTrackAnaEvMult->DrawCopy("LEGO2Z 0");
333 return fHistTrackAnaEvMult;