1 /**************************************************************************
\r
2 * Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
18 //*************************************************************************
\r
19 // Class AliNormalizationCounter
\r
20 // Class to store the informations relevant for the normalization in the
\r
21 // barrel for each run
\r
22 // Authors: G. Ortona, ortona@to.infn.it
\r
23 // D. Caffarri, davide.caffarri@pd.to.infn.it
\r
24 // with many thanks to P. Pillot
\r
25 /////////////////////////////////////////////////////////////
\r
28 #include "AliNormalizationCounter.h"
\r
29 #include <AliESDEvent.h>
\r
30 #include <AliESDtrack.h>
\r
31 #include <AliAODEvent.h>
\r
32 #include <AliVParticle.h>
\r
33 #include <AliTriggerAnalysis.h>
\r
37 #include <TString.h>
\r
38 #include <TCanvas.h>
\r
39 #include <AliPhysicsSelection.h>
\r
40 #include <AliMultiplicity.h>
\r
42 ClassImp(AliNormalizationCounter)
\r
44 //____________________________________________
\r
45 AliNormalizationCounter::AliNormalizationCounter():
\r
49 fMultiplicity(kFALSE),
\r
50 fHistTrackFilterEvMult(0),
\r
51 fHistTrackAnaEvMult(0),
\r
52 fHistTrackFilterSpdMult(0),
\r
53 fHistTrackAnaSpdMult(0)
\r
55 // empty constructor
\r
58 //__________________________________________________
\r
59 AliNormalizationCounter::AliNormalizationCounter(const char *name):
\r
63 fMultiplicity(kFALSE),
\r
64 fHistTrackFilterEvMult(0),
\r
65 fHistTrackAnaEvMult(0),
\r
66 fHistTrackFilterSpdMult(0),
\r
67 fHistTrackAnaSpdMult(0)
\r
72 //______________________________________________
\r
73 AliNormalizationCounter::~AliNormalizationCounter()
\r
76 if(fHistTrackFilterEvMult){
\r
77 delete fHistTrackFilterEvMult;
\r
78 fHistTrackFilterEvMult =0;
\r
80 if(fHistTrackAnaEvMult){
\r
81 delete fHistTrackAnaEvMult;
\r
82 fHistTrackAnaEvMult=0;
\r
84 if(fHistTrackFilterSpdMult){
\r
85 delete fHistTrackFilterSpdMult;
\r
86 fHistTrackFilterSpdMult=0;
\r
88 if(fHistTrackAnaSpdMult){
\r
89 delete fHistTrackAnaSpdMult;
\r
90 fHistTrackAnaSpdMult=0;
\r
94 //______________________________________________
\r
95 void AliNormalizationCounter::Init()
\r
97 //variables initialization
\r
98 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)");
\r
99 if(fMultiplicity) fCounters.AddRubric("Multiplicity", 5000);
\r
100 fCounters.AddRubric("Run", 1000000);
\r
102 fHistTrackFilterEvMult=new TH2F("FiltCandidvsTracksinEv","FiltCandidvsTracksinEv",10000,-0.5,9999.5,200,-0.5,199.5);
\r
103 fHistTrackFilterEvMult->GetYaxis()->SetTitle("NCandidates");
\r
104 fHistTrackFilterEvMult->GetXaxis()->SetTitle("NTracksinEvent");
\r
105 fHistTrackAnaEvMult=new TH2F("AnaCandidvsTracksinEv","AnaCandidvsTracksinEv",10000,-0.5,9999.5,100,-0.5,99.5);
\r
106 fHistTrackAnaEvMult->GetYaxis()->SetTitle("NCandidates");
\r
107 fHistTrackAnaEvMult->GetXaxis()->SetTitle("NTracksinEvent");
\r
108 fHistTrackFilterSpdMult=new TH2F("FilterCandidvsSpdMult","FilterCandidvsSpdMult",5000,-0.5,4999.5,200,-0.5,199.5);
\r
109 fHistTrackFilterSpdMult->GetYaxis()->SetTitle("NCandidates");
\r
110 fHistTrackFilterSpdMult->GetXaxis()->SetTitle("NSPDTracklets");
\r
111 fHistTrackAnaSpdMult=new TH2F("AnaCandidvsSpdMult","AnaCandidvsSpdMult",5000,-0.5,4999.5,100,-0.5,99.5);
\r
112 fHistTrackAnaSpdMult->GetYaxis()->SetTitle("NCandidates");
\r
113 fHistTrackAnaSpdMult->GetXaxis()->SetTitle("NSPDTracklets");
\r
116 //______________________________________________
\r
117 Long64_t AliNormalizationCounter::Merge(TCollection* list){
\r
118 if (!list) return 0;
\r
119 if (list->IsEmpty()) return 0;//(Long64_t)fCounters.Merge(list);
\r
122 const TObject* obj = 0x0;
\r
123 while ((obj = next())) {
\r
125 // check that "obj" is an object of the class AliNormalizationCounter
\r
126 const AliNormalizationCounter* counter = dynamic_cast<const AliNormalizationCounter*>(obj);
\r
128 AliError(Form("object named %s is not AliNormalizationCounter! Skipping it.", counter->GetName()));
\r
136 return (Long64_t)1;//(Long64_t)fCounters->GetEntries();
\r
138 //_______________________________________
\r
139 void AliNormalizationCounter::Add(const AliNormalizationCounter *norm){
\r
140 fCounters.Add(&(norm->fCounters));
\r
141 fHistTrackFilterEvMult->Add(norm->fHistTrackFilterEvMult);
\r
142 fHistTrackAnaEvMult->Add(norm->fHistTrackAnaEvMult);
\r
143 fHistTrackFilterSpdMult->Add(norm->fHistTrackFilterSpdMult);
\r
144 fHistTrackAnaSpdMult->Add(norm->fHistTrackAnaSpdMult);
\r
146 //_______________________________________
\r
148 Stores the variables used for normalization as function of run number
\r
149 returns kTRUE if the event is to be counted for normalization
\r
150 (pass event selection cuts OR has no primary vertex)
\r
152 void AliNormalizationCounter::StoreEvent(AliVEvent *event,AliRDHFCuts *rdCut,Bool_t mc){
\r
155 Bool_t isEventSelected = rdCut->IsEventSelected(event);
\r
157 // events not passing physics selection. do nothing
\r
158 if(rdCut->IsEventRejectedDuePhysicsSelection()) return;
\r
160 Bool_t v0A=kFALSE;
\r
162 Bool_t flag03=kFALSE;
\r
163 Bool_t flagPV=kFALSE;
\r
166 Int_t runNumber = event->GetRunNumber();
\r
168 // Evaluate the multiplicity
\r
169 Int_t multiplicity = Multiplicity(event);
\r
172 AliESDEvent *eventESD = (AliESDEvent*)event;
\r
173 if(!eventESD){AliError("ESD event not available");return;}
\r
174 if(mc&&event->GetEventType() != 0)return;
\r
175 //event must be either physics or MC
\r
176 if(!(event->GetEventType() == 7||event->GetEventType() == 0))return;
\r
179 fCounters.Count(Form("Event:triggered/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
181 fCounters.Count(Form("Event:triggered/Run:%d",runNumber));
\r
184 AliTriggerAnalysis trAn; /// Trigger Analysis
\r
185 v0B = trAn.IsOfflineTriggerFired(eventESD , AliTriggerAnalysis::kV0C);
\r
186 v0A = trAn.IsOfflineTriggerFired(eventESD , AliTriggerAnalysis::kV0A);
\r
189 fCounters.Count(Form("Event:V0AND/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
191 fCounters.Count(Form("Event:V0AND/Run:%d",runNumber));
\r
194 //FindPrimary vertex
\r
195 // AliVVertex *vtrc = (AliVVertex*)event->GetPrimaryVertex();
\r
196 // if(vtrc && vtrc->GetNContributors()>0){
\r
197 // fCounters.Count(Form("Event:PrimaryV/Run:%d",runNumber));
\r
202 AliAODEvent *eventAOD = (AliAODEvent*)event;
\r
203 TString trigclass=eventAOD->GetFiredTriggerClasses();
\r
204 if(trigclass.Contains("C0SMH-B-NOPF-ALLNOTRD")||trigclass.Contains("C0SMH-B-NOPF-ALL")){
\r
206 fCounters.Count(Form("Event:PbPbC0SMH-B-NOPF-ALLNOTRD/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
208 fCounters.Count(Form("Event:PbPbC0SMH-B-NOPF-ALLNOTRD/Run:%d",runNumber));
\r
211 //FindPrimary vertex
\r
212 if(isEventSelected){
\r
214 fCounters.Count(Form("Event:PrimaryV/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
216 fCounters.Count(Form("Event:PrimaryV/Run:%d",runNumber));
\r
219 if(rdCut->GetWhyRejection()==0){
\r
221 fCounters.Count(Form("Event:noPrimaryV/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
223 fCounters.Count(Form("Event:noPrimaryV/Run:%d",runNumber));
\r
225 //find good vtx outside range
\r
226 if(rdCut->GetWhyRejection()==6){
\r
227 if(fMultiplicity) {
\r
228 fCounters.Count(Form("Event:zvtxGT10/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
229 fCounters.Count(Form("Event:PrimaryV/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
231 fCounters.Count(Form("Event:zvtxGT10/Run:%d",runNumber));
\r
232 fCounters.Count(Form("Event:PrimaryV/Run:%d",runNumber));
\r
236 if(rdCut->GetWhyRejection()==1){
\r
238 fCounters.Count(Form("Event:PileUp/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
240 fCounters.Count(Form("Event:PileUp/Run:%d",runNumber));
\r
243 //to be counted for normalization
\r
244 if(rdCut->CountEventForNormalization()){
\r
246 fCounters.Count(Form("Event:countForNorm/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
248 fCounters.Count(Form("Event:countForNorm/Run:%d",runNumber));
\r
253 Int_t trkEntries = (Int_t)event->GetNumberOfTracks();
\r
254 for(Int_t i=0;i<trkEntries&&!flag03;i++){
\r
255 AliAODTrack *track=(AliAODTrack*)event->GetTrack(i);
\r
256 if((track->Pt()>0.3)&&(!flag03)){
\r
258 fCounters.Count(Form("Event:Candles0.3/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
260 fCounters.Count(Form("Event:Candles0.3/Run:%d",runNumber));
\r
266 if(!(v0A&&v0B)&&(flag03)){
\r
268 fCounters.Count(Form("Event:!V0A&Candle03/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
270 fCounters.Count(Form("Event:!V0A&Candle03/Run:%d",runNumber));
\r
272 if(!(v0A&&v0B)&&flagPV){
\r
274 fCounters.Count(Form("Event:!V0A&PrimaryV/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
276 fCounters.Count(Form("Event:!V0A&PrimaryV/Run:%d",runNumber));
\r
281 //_____________________________________________________________________
\r
282 void AliNormalizationCounter::StoreCandidates(AliVEvent *event,Int_t nCand,Bool_t flagFilter){
\r
284 Int_t ntracks=event->GetNumberOfTracks();
\r
285 if(flagFilter)fHistTrackFilterEvMult->Fill(ntracks,nCand);
\r
286 else fHistTrackAnaEvMult->Fill(ntracks,nCand);
\r
289 AliESDEvent *ESDevent=(AliESDEvent*)event;
\r
290 const AliMultiplicity *alimult = ESDevent->GetMultiplicity();
\r
291 nSPD = alimult->GetNumberOfTracklets();
\r
294 AliAODEvent *aodEvent =(AliAODEvent*)event;
\r
295 AliAODTracklets *trklets=aodEvent->GetTracklets();
\r
296 nSPD = trklets->GetNumberOfTracklets();
\r
298 if(flagFilter)fHistTrackFilterSpdMult->Fill(nSPD,nCand);
\r
299 else fHistTrackAnaSpdMult->Fill(nSPD,nCand);
\r
301 Int_t runNumber = event->GetRunNumber();
\r
302 Int_t multiplicity = Multiplicity(event);
\r
303 if(nCand==0)return;
\r
306 fCounters.Count(Form("Event:Candid(Filter)/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
308 fCounters.Count(Form("Event:Candid(Filter)/Run:%d",runNumber));
\r
309 for(Int_t i=0;i<nCand;i++){
\r
311 fCounters.Count(Form("Event:NCandid(Filter)/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
313 fCounters.Count(Form("Event:NCandid(Filter)/Run:%d",runNumber));
\r
317 fCounters.Count(Form("Event:Candid(Analysis)/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
319 fCounters.Count(Form("Event:Candid(Analysis)/Run:%d",runNumber));
\r
320 for(Int_t i=0;i<nCand;i++){
\r
322 fCounters.Count(Form("Event:NCandid(Analysis)/Run:%d/Multiplicity:%d",runNumber,multiplicity));
\r
324 fCounters.Count(Form("Event:NCandid(Analysis)/Run:%d",runNumber));
\r
329 //_______________________________________________________________________
\r
330 TH1D* AliNormalizationCounter::DrawAgainstRuns(TString candle,Bool_t drawHist){
\r
332 fCounters.SortRubric("Run");
\r
334 selection.Form("event:%s",candle.Data());
\r
335 TH1D* histoneD = fCounters.Get("run",selection.Data());
\r
338 if(drawHist)histoneD->DrawClone();
\r
341 //___________________________________________________________________________
\r
342 TH1D* AliNormalizationCounter::DrawRatio(TString candle1,TString candle2){
\r
344 fCounters.SortRubric("Run");
\r
347 name.Form("%s/%s",candle1.Data(),candle2.Data());
\r
348 TH1D* num=DrawAgainstRuns(candle1.Data(),kFALSE);
\r
349 TH1D* den=DrawAgainstRuns(candle2.Data(),kFALSE);
\r
351 den->SetTitle(candle2.Data());
\r
352 den->SetName(candle2.Data());
\r
353 num->Divide(num,den,1,1,"B");
\r
354 num->SetTitle(name.Data());
\r
355 num->SetName(name.Data());
\r
359 //___________________________________________________________________________
\r
360 void AliNormalizationCounter::PrintRubrics(){
\r
361 fCounters.PrintKeyWords();
\r
363 //___________________________________________________________________________
\r
364 Double_t AliNormalizationCounter::GetSum(TString candle){
\r
365 TString selection="event:";
\r
366 selection.Append(candle);
\r
367 return fCounters.GetSum(selection.Data());
\r
369 //___________________________________________________________________________
\r
370 TH2F* AliNormalizationCounter::GetHist(Bool_t filtercuts,Bool_t spdtracklets,Bool_t drawHist){
\r
373 if(drawHist)fHistTrackFilterSpdMult->DrawCopy("LEGO2Z 0");
\r
374 return fHistTrackFilterSpdMult;
\r
376 if(drawHist)fHistTrackFilterEvMult->DrawCopy("LEGO2Z 0");
\r
377 return fHistTrackFilterEvMult;
\r
381 if(drawHist)fHistTrackAnaSpdMult->DrawCopy("LEGO2Z 0");
\r
382 return fHistTrackAnaSpdMult;
\r
384 if(drawHist)fHistTrackAnaEvMult->DrawCopy("LEGO2Z 0");
\r
385 return fHistTrackAnaEvMult;
\r
389 //___________________________________________________________________________
\r
390 Double_t AliNormalizationCounter::GetNEventsForNorm(){
\r
391 Double_t noVtxzGT10=GetSum("noPrimaryV")*GetSum("zvtxGT10")/GetSum("PrimaryV");
\r
392 return GetSum("countForNorm")-noVtxzGT10;
\r
394 //___________________________________________________________________________
\r
395 Double_t AliNormalizationCounter::GetNEventsForNorm(Int_t runnumber){
\r
396 TString listofruns = fCounters.GetKeyWords("RUN");
\r
397 if(!listofruns.Contains(Form("%d",runnumber))){
\r
398 printf("WARNING: %d is not a valid run number\n",runnumber);
\r
399 fCounters.Print("Run","",kTRUE);
\r
402 TString suffix;suffix.Form("/RUN:%d",runnumber);
\r
403 TString zvtx;zvtx.Form("zvtxGT10%s",suffix.Data());
\r
404 TString noPV;noPV.Form("noPrimaryV%s",suffix.Data());
\r
405 TString pV;pV.Form("PrimaryV%s",suffix.Data());
\r
406 TString tbc;tbc.Form("countForNorm%s",suffix.Data());
\r
407 Double_t noVtxzGT10=GetSum(noPV.Data())*GetSum(zvtx.Data())/GetSum(pV.Data());
\r
408 return GetSum(tbc.Data())-noVtxzGT10;
\r
411 //___________________________________________________________________________
\r
412 Double_t AliNormalizationCounter::GetNEventsForNorm(Int_t minmultiplicity, Int_t maxmultiplicity){
\r
414 if(!fMultiplicity) {
\r
415 AliInfo("Sorry, you didn't activate the multiplicity in the counter!");
\r
419 TString listofruns = fCounters.GetKeyWords("Multiplicity");
\r
421 Int_t nmultbins = maxmultiplicity - minmultiplicity;
\r
422 Double_t sumnoPV=0., sumZvtx=0., sumPv=0., sumEvtNorm=0.;
\r
423 for (Int_t ibin=0; ibin<=nmultbins; ibin++) {
\r
424 // cout << " Looking at bin "<< ibin+minmultiplicity<<endl;
\r
425 if(!listofruns.Contains(Form("%d",ibin+minmultiplicity))){
\r
426 AliInfo(Form("WARNING: %d is not a valid multiplicity number. \n",ibin+minmultiplicity));
\r
429 TString suffix;suffix.Form("/Multiplicity:%d",ibin+minmultiplicity);
\r
430 TString zvtx;zvtx.Form("zvtxGT10%s",suffix.Data());
\r
431 TString noPV;noPV.Form("noPrimaryV%s",suffix.Data());
\r
432 TString pV;pV.Form("PrimaryV%s",suffix.Data());
\r
433 TString tbc;tbc.Form("countForNorm%s",suffix.Data());
\r
434 sumnoPV += GetSum(noPV.Data());
\r
435 sumZvtx += GetSum(zvtx.Data());
\r
436 sumPv += GetSum(pV.Data());
\r
437 sumEvtNorm += GetSum(tbc.Data());
\r
439 Double_t noVtxzGT10 = sumPv>0. ? sumnoPV * sumZvtx / sumPv : 0.;
\r
440 return sumEvtNorm - noVtxzGT10;
\r
443 //___________________________________________________________________________
\r
444 TH1D* AliNormalizationCounter::DrawNEventsForNorm(Bool_t drawRatio){
\r
445 //usare algebra histos
\r
446 fCounters.SortRubric("Run");
\r
449 selection.Form("event:noPrimaryV");
\r
450 TH1D* hnoPrimV = fCounters.Get("run",selection.Data());
\r
453 selection.Form("event:zvtxGT10");
\r
454 TH1D* hzvtx= fCounters.Get("run",selection.Data());
\r
457 selection.Form("event:PrimaryV");
\r
458 TH1D* hPrimV = fCounters.Get("run",selection.Data());
\r
461 hzvtx->Multiply(hnoPrimV);
\r
462 hzvtx->Divide(hPrimV);
\r
464 selection.Form("event:countForNorm");
\r
465 TH1D* hCountForNorm = fCounters.Get("run",selection.Data());
\r
466 hCountForNorm->Sumw2();
\r
468 hCountForNorm->Add(hzvtx,-1.);
\r
471 selection.Form("event:triggered");
\r
472 TH1D* htriggered = fCounters.Get("run",selection.Data());
\r
473 htriggered->Sumw2();
\r
474 hCountForNorm->Divide(htriggered);
\r
477 hCountForNorm->DrawClone();
\r
478 return hCountForNorm;
\r
481 //___________________________________________________________________________
\r
482 Int_t AliNormalizationCounter::Multiplicity(AliVEvent* event){
\r
484 Int_t multiplicity = 0;
\r
485 AliAODEvent *eventAOD = (AliAODEvent*)event;
\r
486 AliAODTracklets * aodTracklets = (AliAODTracklets*)eventAOD->GetTracklets();
\r
487 Int_t ntracklets = (Int_t)aodTracklets->GetNumberOfTracklets();
\r
488 for(Int_t i=0;i<ntracklets; i++){
\r
489 Double_t theta = aodTracklets->GetTheta(i);
\r
490 Double_t eta = -TMath::Log( TMath::Tan(theta/2.) ); // check the formula
\r
491 if(TMath::Abs(eta)<1.6){ // set the proper cut on eta
\r
496 return multiplicity;
\r