]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG3/vertexingHF/AliNormalizationCounter.cxx
Rejection of centrality outliers in AOD049 (Giacomo)
[u/mrichter/AliRoot.git] / PWG3 / vertexingHF / AliNormalizationCounter.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 /* $Id$ */
17
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 /////////////////////////////////////////////////////////////
26
27 #include "AliNormalizationCounter.h"
28 #include <AliESDEvent.h>
29 #include <AliESDtrack.h>
30 #include <AliAODEvent.h>
31 #include <AliVParticle.h>
32 #include <AliTriggerAnalysis.h>
33 #include <TH1F.h>
34 #include <TH2F.h>
35 #include <TList.h>
36 #include <TString.h>
37 #include <TCanvas.h>
38 #include <AliPhysicsSelection.h>
39 #include <AliMultiplicity.h>
40
41 ClassImp(AliNormalizationCounter)
42
43 //____________________________________________
44 AliNormalizationCounter::AliNormalizationCounter(): 
45 TNamed(),
46 fCounters(),
47 fESD(kFALSE),
48 fRejectPileUp(kFALSE),
49 fHistTrackFilterEvMult(0),
50 fHistTrackAnaEvMult(0),
51 fHistTrackFilterSpdMult(0),
52 fHistTrackAnaSpdMult(0)
53 {
54   // empty constructor
55 }
56
57 //__________________________________________________                            
58 AliNormalizationCounter::AliNormalizationCounter(const char *name): 
59 TNamed(name,name),
60 fCounters(name),
61 fESD(kFALSE),
62 fRejectPileUp(kFALSE),
63 fHistTrackFilterEvMult(0),
64 fHistTrackAnaEvMult(0),
65 fHistTrackFilterSpdMult(0),
66 fHistTrackAnaSpdMult(0)
67 {
68   //default constructor
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);
71   fCounters.Init();
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");
84 }
85 //______________________________________________
86 AliNormalizationCounter::~AliNormalizationCounter()
87 {
88   //destructor
89   if(fHistTrackFilterEvMult){
90     delete fHistTrackFilterEvMult;
91     fHistTrackFilterEvMult =0;
92   }
93   if(fHistTrackAnaEvMult){
94     delete fHistTrackAnaEvMult;
95     fHistTrackAnaEvMult=0;
96   }
97   if(fHistTrackFilterSpdMult){
98     delete fHistTrackFilterSpdMult;
99     fHistTrackFilterSpdMult=0;
100   }
101   if(fHistTrackAnaSpdMult){
102     delete fHistTrackAnaSpdMult;
103     fHistTrackAnaSpdMult=0;
104   }
105 }
106
107 //______________________________________________
108 Long64_t AliNormalizationCounter::Merge(TCollection* list){
109   if (!list) return 0;
110   if (list->IsEmpty()) return 0;//(Long64_t)fCounters.Merge(list);
111
112   TIter next(list);
113   const TObject* obj = 0x0;
114   while ((obj = next())) {
115     
116     // check that "obj" is an object of the class AliNormalizationCounter
117     const AliNormalizationCounter* counter = dynamic_cast<const AliNormalizationCounter*>(obj);
118     if (!counter) {
119       AliError(Form("object named %s is not AliNormalizationCounter! Skipping it.", counter->GetName()));
120       continue;
121     }
122
123     Add(counter);
124
125   }
126   
127   return (Long64_t)1;//(Long64_t)fCounters->GetEntries();
128 }
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);
136 }
137 //_______________________________________
138 void AliNormalizationCounter::StoreEvent(AliVEvent *event,Bool_t mc){
139   //
140
141   Bool_t v0A=kFALSE; 
142   Bool_t v0B=kFALSE;
143   Bool_t flag02=kFALSE;
144   Bool_t flag03=kFALSE;
145   Int_t flag0202=0;
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;
151
152   //Run Number
153   Int_t runNumber = event->GetRunNumber();
154  
155   //Find CINT1B
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;
161   
162   fCounters.Count(Form("Event:triggered/Run:%d",runNumber));
163       
164   //Find V0AND
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));}
169   
170  //FindPrimary vertex  
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));
175     flagPV=kTRUE;
176   }
177
178   AliAODVertex *vrtcSPD = (AliAODVertex*)eventAOD->GetPrimaryVertexSPD();
179   if(vrtcSPD){
180     if(vrtcSPD->GetNContributors()>0)fCounters.Count(Form("Event:PrimaryVSPD/Run:%d",runNumber));
181   }
182   
183   if(fESD){
184     const AliESDVertex *vtrc1 =  eventESD->GetPrimaryVertexTracks();
185     if(vtrc1 && vtrc1->GetNContributors()>0){
186       fCounters.Count(Form("Event:PrimaryVTracks/Run:%d",runNumber));
187       flagPVT=kTRUE;
188     }
189   }
190
191   //trigger
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));
194
195   //PileUp
196   if(eventAOD->IsPileupFromSPD()){
197     fCounters.Count(Form("Event:PileUp/Run:%d",runNumber));
198     if(fRejectPileUp==1)return;
199   }
200
201   //Find Candle
202   Int_t trkEntries = (Int_t)event->GetNumberOfTracks();
203   
204   for(Int_t i=0;i<trkEntries;i++){
205     AliAODTrack *track=(AliAODTrack*)event->GetTrack(i);
206     UShort_t nClusTPC=track->GetTPCNcls();
207     Int_t nSPD=0;
208     if(TESTBIT(track->GetITSClusterMap(),1))nSPD++;
209     if(TESTBIT(track->GetITSClusterMap(),0))nSPD++;
210     if(nClusTPC==0&&(track->GetStatus()&AliESDtrack::kITSrefit)&&!flagITSsa){
211       flagITSsa=kTRUE;
212       fCounters.Count(Form("Event:CandleITSsa/Run:%d",runNumber));
213     }
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));
216       flag35cls=kTRUE;
217     }
218     if((nClusTPC>=70)&&(track->GetStatus()&AliESDtrack::kITSrefit)&&(track->GetStatus()&AliESDtrack::kTPCrefit)){
219       
220       if((track->Pt()>0.2)&&flag0202<2){
221         if(!flag02)fCounters.Count(Form("Event:Candles0.2/Run:%d",runNumber));
222         flag02=kTRUE;
223         flag0202++;
224       }
225       if((track->Pt()>0.2)&&!flag02spd&&nSPD>=1){
226         fCounters.Count(Form("Event:Candles0.2spd1/Run:%d",runNumber));
227         flag02spd=kTRUE;
228       }
229       if((track->Pt()>0.3)&&(!flag03)){
230         fCounters.Count(Form("Event:Candles0.3/Run:%d",runNumber));
231         flag03=kTRUE;
232       }
233     }
234     if((flag02)&&(flag03)&&flag0202>=2&&flag35cls&&flagITSsa) break; 
235   }
236   
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));
243   
244   //delete eventESD;
245
246   return;
247 }
248 //_____________________________________________________________________
249 void AliNormalizationCounter::StoreCandidates(AliVEvent *event,Int_t nCand,Bool_t flagFilter){
250   
251   Int_t ntracks=event->GetNumberOfTracks();
252   if(flagFilter)fHistTrackFilterEvMult->Fill(ntracks,nCand);
253   else fHistTrackAnaEvMult->Fill(ntracks,nCand);
254   Int_t nSPD=0;
255   if(fESD){
256     AliESDEvent *ESDevent=(AliESDEvent*)event;
257     const AliMultiplicity *alimult = ESDevent->GetMultiplicity();
258     nSPD = alimult->GetNumberOfTracklets();
259
260   }else{
261     AliAODEvent *aodEvent =(AliAODEvent*)event;
262     AliAODTracklets *trklets=aodEvent->GetTracklets();
263     nSPD = trklets->GetNumberOfTracklets();
264   }
265   if(flagFilter)fHistTrackFilterSpdMult->Fill(nSPD,nCand);
266   else fHistTrackAnaSpdMult->Fill(nSPD,nCand);
267   
268   Int_t runNumber = event->GetRunNumber();
269   if(nCand==0)return;
270   if(flagFilter){
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));
273   }else{
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));
276   }
277   return;
278 }
279 //_______________________________________________________________________
280 TH1D* AliNormalizationCounter::DrawAgainstRuns(TString candle,Bool_t drawHist){
281   //
282   fCounters.SortRubric("Run");
283   TString selection;
284   selection.Form("event:%s",candle.Data());
285   TH1D* histoneD = fCounters.Get("run",selection.Data());
286
287   histoneD->Sumw2();
288   if(drawHist)histoneD->DrawClone();
289   return histoneD;
290 }
291 //___________________________________________________________________________
292 TH1D* AliNormalizationCounter::DrawRatio(TString candle1,TString candle2){
293   //
294   fCounters.SortRubric("Run");
295   TString name;
296
297   name.Form("%s/%s",candle1.Data(),candle2.Data());
298   TH1D* num=DrawAgainstRuns(candle1.Data(),kFALSE);
299   TH1D* den=DrawAgainstRuns(candle2.Data(),kFALSE);
300
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());
306   num->DrawClone();
307   return num;
308 }
309 //___________________________________________________________________________
310 void AliNormalizationCounter::PrintRubrics(){
311   fCounters.PrintKeyWords();
312 }
313 //___________________________________________________________________________
314 Double_t AliNormalizationCounter::GetSum(TString candle){
315   TString selection="event:";
316   selection.Append(candle);
317   return fCounters.GetSum(selection.Data());
318 }
319 //___________________________________________________________________________
320 TH2F* AliNormalizationCounter::GetHist(Bool_t filtercuts,Bool_t spdtracklets,Bool_t drawHist){
321   if(filtercuts){
322     if(spdtracklets){
323       if(drawHist)fHistTrackFilterSpdMult->DrawCopy("LEGO2Z 0");
324       return fHistTrackFilterSpdMult;
325     }else{
326       if(drawHist)fHistTrackFilterEvMult->DrawCopy("LEGO2Z 0");
327       return fHistTrackFilterEvMult;
328     }
329   }else{
330     if(spdtracklets){
331       if(drawHist)fHistTrackAnaSpdMult->DrawCopy("LEGO2Z 0");
332       return fHistTrackAnaSpdMult;
333     }else{
334       if(drawHist)fHistTrackAnaEvMult->DrawCopy("LEGO2Z 0");
335       return fHistTrackAnaEvMult;
336     }
337   }
338 }