2 // Determine MC truth centrality for kinematics-only productions
3 // pass it via centrality object
6 #include "AliMCTruthCent.h"
14 #include "AliAnalysisManager.h"
15 #include "AliVEventHandler.h"
16 #include "AliMCEvent.h"
17 #include "AliVParticle.h"
19 #include "AliESDEvent.h"
20 #include "AliCentrality.h"
22 ClassImp(AliMCTruthCent)
24 //________________________________________________________________________
25 AliMCTruthCent::AliMCTruthCent() :
26 AliAnalysisTaskSE("AliMCTruthCent"),
29 fHMultV0A(0x0), fHMultV0C(0x0), fHMultV0M(0x0), fHMultV0AvsV0C(0x0),
30 fHCentV0A(0x0), fHCentV0C(0x0), fHCentV0M(0x0), fHCentV0AvsV0C(0x0),
31 fV0ALo(0.0), fV0AHi(100.0),
32 fV0CLo(0.0), fV0CHi(100.0),
33 fV0MLo(0.0), fV0MHi(200.0)
38 //________________________________________________________________________
39 AliMCTruthCent::AliMCTruthCent(const char *name) :
40 AliAnalysisTaskSE(name),
43 fHMultV0A(0x0), fHMultV0C(0x0), fHMultV0M(0x0), fHMultV0AvsV0C(0x0),
44 fHCentV0A(0x0), fHCentV0C(0x0), fHCentV0M(0x0), fHCentV0AvsV0C(0x0),
45 fV0ALo(0.0), fV0AHi(100.0),
46 fV0CLo(0.0), fV0CHi(100.0),
47 fV0MLo(0.0), fV0MHi(200.0)
52 DefineInput(0, TChain::Class());
56 //________________________________________________________________________
57 AliMCTruthCent::~AliMCTruthCent()
64 //________________________________________________________________________
65 void AliMCTruthCent::UserCreateOutputObjects()
67 // Create my user objects.
69 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
71 AliFatal("No analysis manager!");
75 AliVEventHandler *handler = mgr->GetInputEventHandler();
77 AliFatal("No input handler!");
81 if (!handler->InheritsFrom("AliESDInputHandler")) {
82 AliError("Sorry, this only works for kinematics trees ... return");
87 fOutputList = new TList();
88 fOutputList->SetOwner();
91 fHMultV0A = new TH1D("fHMultV0A","V0A multiplicity",500,0.0,500.0);
92 fHMultV0C = new TH1D("fHMultV0C","V0C multiplicity",500,0.0,500.0);
93 fHMultV0M = new TH1D("fHMultV0M","V0M multiplicity",500,0.0,500.0);
94 fHMultV0AvsV0C = new TH2D("fHMultV0AvsV0C","V0A vs. C multiplicity",500,0.0,500.0,500,0.0,500.0);
96 fOutputList->Add(fHMultV0A);
97 fOutputList->Add(fHMultV0C);
98 fOutputList->Add(fHMultV0M);
99 fOutputList->Add(fHMultV0AvsV0C);
101 fHCentV0A = new TH1D("fHCentV0A","V0A centrality",100,0.0,100.0);
102 fHCentV0C = new TH1D("fHCentV0C","V0C centrality",100,0.0,100.0);
103 fHCentV0M = new TH1D("fHCentV0M","V0M centrality",100,0.0,100.0);
104 fHCentV0AvsV0C = new TH2D("fHCentV0AvsV0C","V0A vs. C centrality",100,0.0,100.0,100,0.0,100.0);
106 fOutputList->Add(fHCentV0A);
107 fOutputList->Add(fHCentV0C);
108 fOutputList->Add(fHCentV0M);
109 fOutputList->Add(fHCentV0AvsV0C);
111 PostData(1, fOutputList);
115 //________________________________________________________________________
116 void AliMCTruthCent::UserExec(Option_t *)
118 // Main loop, called for each event.
120 AliError("Could not retrieve event! Returning");
125 AliError("Could not retrieve ESD MC event! Returning");
129 // can I get the centrality object from the InputEvent?
130 // then use it and overwrite the centrality
131 AliCentrality *esdCent = InputEvent()->GetCentrality();
132 esdCent->SetQuality(0);
134 // define experiment-like estimators: multiplicity in range of
135 // V0A 2.8 < eta < 5.1
136 // V0C -3.7 < eta < -1.7
137 // V0M: sum of V0A and V0C
138 Double_t etaV0ALo = 2.8;
139 Double_t etaV0AHi = 5.1;
140 Double_t etaV0CLo = -3.7;
141 Double_t etaV0CHi = -1.7;
146 // loop over MC tracks
147 Double_t etaTrack = 0.0;
148 AliVParticle * track = 0x0;
149 const Int_t Ntracks = MCEvent()->GetNumberOfTracks();
150 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
151 track = GetTrack(iTracks);
155 if (track->Charge()==0)
158 etaTrack = track->Eta();
160 if (etaTrack>etaV0ALo && etaTrack<etaV0AHi) {
162 } else if (etaTrack>etaV0CLo && etaTrack<etaV0CHi) {
166 Int_t nV0M = nV0A+nV0C;
169 // linear centrality approximation
170 Double_t centV0A = (fV0AHi-nV0A) / (fV0AHi-fV0ALo);
172 if (centV0A >= 100.0)
176 esdCent->SetCentralityV0A(centV0A);
178 Double_t centV0C = (fV0CHi-nV0C) / (fV0CHi-fV0CLo);
180 if (centV0C >= 100.0)
184 esdCent->SetCentralityV0C(centV0C);
186 Double_t centV0M = (fV0MHi-nV0M) / (fV0MHi-fV0MLo);
188 if (centV0M >= 100.0)
192 esdCent->SetCentralityV0M(centV0M);
195 // write out distributions to histograms
196 fHMultV0A->Fill(nV0A);
197 fHMultV0C->Fill(nV0C);
198 fHMultV0M->Fill(nV0M);
199 fHMultV0AvsV0C->Fill(nV0A,nV0C);
201 fHCentV0A->Fill(centV0A);
202 fHCentV0C->Fill(centV0C);
203 fHCentV0M->Fill(centV0M);
204 fHCentV0AvsV0C->Fill(centV0A,centV0C);
206 PostData(1, fOutputList);
209 // next step: get centrality from histogram...
213 //________________________________________________________________________
214 AliVParticle* AliMCTruthCent::GetTrack(Int_t i)
216 if (!MCEvent()->IsPhysicalPrimary(i))
219 return MCEvent()->GetTrack(i);