1 #ifndef ALIDIELECTRONVARMANAGER_H
2 #define ALIDIELECTRONVARMANAGER_H
3 /* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4 * See cxx source for full Copyright notice */
6 //#############################################################
8 //# Class AliDielectronVarManager #
9 //# Class for management of available variables #
12 //# Anton Andronic, GSI / A.Andronic@gsi.de #
13 //# Ionut C. Arsene, GSI / I.C.Arsene@gsi.de #
14 //# Julian Book, Uni Ffm / Julian.Book@cern.ch #
15 //# Markus Köhler, GSI / M.Koehler@gsi.de #
16 //# Frederick Kramer, Uni Ffm / Frederick.Kramer@cern.ch #
17 //# Magnus Mager, CERN / Magnus.Mager@cern.ch #
18 //# WooJin J. Park, GSI / W.J.Park@gsi.de #
19 //# Jens Wiechula, Uni HD / Jens.Wiechula@cern.ch #
21 //#############################################################
26 #include <AliVEvent.h>
27 #include <AliESDEvent.h>
28 #include <AliAODEvent.h>
29 #include <AliMCEvent.h>
30 #include <AliVVertex.h>
31 #include <AliESDVertex.h>
33 #include <AliVParticle.h>
34 #include <AliESDtrack.h>
35 #include <AliAODTrack.h>
36 #include <AliAODPid.h>
37 #include <AliKFParticle.h>
38 #include <AliKFVertex.h>
39 #include <AliMCParticle.h>
40 #include <AliAODMCParticle.h>
41 #include <AliVTrack.h> // ?
43 #include <AliExternalTrackParam.h>
44 #include <AliESDpid.h>
45 #include <AliESDCentrality.h>
46 #include <AliAODpidUtil.h>
49 #include "AliDielectronPair.h"
50 #include "AliDielectronMC.h"
51 #include "AliDielectronPID.h"
55 //________________________________________________________________
56 class AliDielectronVarManager : public TNamed {
60 // Particle specific variables
65 kPt, // transverse momentum
67 kXv, // vertex position in x
68 kYv, // vertex position in y
69 kZv, // vertex position in z
72 kTheta, // theta angle
73 kEta, // pseudo-rapidity
78 kNclsITS, // number of clusters assigned in the ITS
79 kNclsTPC, // number of clusters assigned in the TPC
80 kNclsTPCiter1, // number of clusters assigned in the TPC after first iteration
81 kNFclsTPC, // number of findable clusters in the TPC
82 kNFclsTPCr, // number of findable clusters in the TPC with more robust definition
83 kTPCsignalN, // number of points used for dEdx
84 kTPCchi2Cl, // chi2/cl in TPC
85 kTrackStatus, // track status bits
87 kNclsTRD, // number of clusters assigned in the TRD
88 kTRDntracklets, // number of TRD tracklets used for tracking/PID TODO: correct getter
89 kTRDpidQuality, // number of TRD tracklets used for PID
90 kTRDprobEle, // TRD electron pid probability
91 kTRDprobPio, // TRD electron pid probability
93 kImpactParXY, // Impact parameter in XY plane
94 kImpactParZ, // Impact parameter in Z
95 kTrackLength, // Track length
98 kPdgCodeMother, // PDG code of the mother
100 kNumberOfDaughters, // number of daughters
101 kHaveSameMother, // check that particles have the same mother (MC)
102 kITSsignal, // ITS dE/dx signal
103 kITSsignalSSD1, // SSD1 dE/dx signal
104 kITSsignalSSD2, // SSD2 dE/dx signal
105 kITSsignalSDD1, // SDD1 dE/dx signal
106 kITSsignalSDD2, // SDD2 dE/dx signal
107 kITSclusterMap, // ITS cluster map
108 kITSnSigmaEle, // number of sigmas to the dE/dx electron line in the ITS
109 kITSnSigmaPio, // number of sigmas to the dE/dx pion line in the ITS
110 kITSnSigmaMuo, // number of sigmas to the dE/dx muon line in the ITS
111 kITSnSigmaKao, // number of sigmas to the dE/dx kaon line in the ITS
112 kITSnSigmaPro, // number of sigmas to the dE/dx proton line in the ITS
114 kPIn, // momentum at inner wall of TPC (if available), used for PID
115 kTPCsignal, // TPC dE/dx signal
117 kTPCnSigmaEle, // number of sigmas to the dE/dx electron line in the TPC
118 kTPCnSigmaPio, // number of sigmas to the dE/dx pion line in the TPC
119 kTPCnSigmaMuo, // number of sigmas to the dE/dx muon line in the TPC
120 kTPCnSigmaKao, // number of sigmas to the dE/dx kaon line in the TPC
121 kTPCnSigmaPro, // number of sigmas to the dE/dx proton line in the TPC
123 kTOFnSigmaEle, // number of sigmas to the pion line in the TOF
124 kTOFnSigmaPio, // number of sigmas to the pion line in the TOF
125 kTOFnSigmaMuo, // number of sigmas to the muon line in the TOF
126 kTOFnSigmaKao, // number of sigmas to the kaon line in the TOF
127 kTOFnSigmaPro, // number of sigmas to the proton line in the TOF
129 kKinkIndex0, // kink index 0
132 // TODO: kRNClusters ??
133 // AliDielectronPair specific variables
134 kChi2NDF = kParticleMax, // Chi^2/NDF
135 kDecayLength, // decay length
136 kR, // distance to the origin
137 kOpeningAngle, // opening angle
138 // helicity picture: Z-axis is considered the direction of the mother's 3-momentum vector
139 kThetaHE, // theta in mother's rest frame in the helicity picture
140 kPhiHE, // phi in mother's rest frame in the helicity picture
141 // Collins-Soper picture: Z-axis is considered the direction of the vectorial difference between
142 // the 3-mom vectors of target and projectile beams
143 kThetaCS, // theta in mother's rest frame in Collins-Soper picture
144 kPhiCS, // phi in mother's rest frame in Collins-Soper picture
145 kLegDist, // distance of the legs
146 kLegDistXY, // distance of the legs in XY
147 kDeltaEta, // Absolute value of Delta Eta for the legs
148 kDeltaPhi, // Absolute value of Delta Phi for the legs
149 kMerr, // error of mass calculation
150 kDCA, // distance of closest approach TODO: not implemented yet
151 kPairType, // type of the pair, like like sign ++ unlikesign ...
153 // Event specific variables
154 kXvPrim=kPairMax, // prim vertex
155 kYvPrim, // prim vertex
156 kZvPrim, // prim vertex
157 kXRes, // primary vertex x-resolution
158 kYRes, // primary vertex y-resolution
159 kZRes, // primary vertex z-resolution
160 kNTrk, // number of tracks (or tracklets)
161 kTracks, // ESD tracks
162 kCentrality, // event centrality fraction
163 kNevents, // event counter
165 // TODO: (for A+A) ZDCEnergy, impact parameter, Iflag??
169 AliDielectronVarManager();
170 AliDielectronVarManager(const char* name, const char* title);
171 virtual ~AliDielectronVarManager();
172 static void Fill(const TObject* particle, Double_t * const values);
174 static void InitESDpid(Int_t type=0);
175 static void InitAODpidUtil(Int_t type=0);
176 static void SetESDpid(AliESDpid * const pid) {fgESDpid=pid;}
177 static AliESDpid* GetESDpid() {return fgESDpid;}
178 static AliAODpidUtil* GetAODpidUtil() {return fgAODpidUtil;}
179 static void SetEvent(AliVEvent * const ev);
180 static Bool_t GetDCA(const AliAODTrack *track, Double_t d0z0[2]);
182 static const char* GetValueName(Int_t i) { return (i>=0&&i<kNMaxValues)?fgkParticleNames[i]:""; }
185 static const char* fgkParticleNames[kNMaxValues]; //variable names
187 static void FillVarVParticle(const AliVParticle *particle, Double_t * const values);
188 static void FillVarESDtrack(const AliESDtrack *particle, Double_t * const values);
189 static void FillVarAODTrack(const AliAODTrack *particle, Double_t * const values);
190 static void FillVarMCParticle(const AliMCParticle *particle, Double_t * const values);
191 static void FillVarAODMCParticle(const AliAODMCParticle *particle, Double_t * const values);
192 static void FillVarDielectronPair(const AliDielectronPair *pair, Double_t * const values);
193 static void FillVarVEvent(const AliVEvent *event, Double_t * const values);
194 static void FillVarESDEvent(const AliESDEvent *event, Double_t * const values);
195 static void FillVarAODEvent(const AliAODEvent *event, Double_t * const values);
196 static void FillVarMCEvent(const AliMCEvent *event, Double_t * const values);
198 static AliESDpid *fgESDpid; // ESD pid object
199 static AliAODpidUtil *fgAODpidUtil; // AOD pid object
200 static AliVEvent *fgEvent; // current event pointer
201 static AliKFVertex *fgKFVertex; // kf vertex
203 AliDielectronVarManager(const AliDielectronVarManager &c);
204 AliDielectronVarManager &operator=(const AliDielectronVarManager &c);
206 ClassDef(AliDielectronVarManager,1);
211 inline void AliDielectronVarManager::Fill(const TObject* object, Double_t * const values)
214 // Main function to fill all available variables according to the type of particle
217 if (object->IsA() == AliESDtrack::Class()) FillVarESDtrack(static_cast<const AliESDtrack*>(object), values);
218 else if (object->IsA() == AliAODTrack::Class()) FillVarAODTrack(static_cast<const AliAODTrack*>(object), values);
219 else if (object->IsA() == AliMCParticle::Class()) FillVarMCParticle(static_cast<const AliMCParticle*>(object), values);
220 else if (object->IsA() == AliAODMCParticle::Class()) FillVarAODMCParticle(static_cast<const AliAODMCParticle*>(object), values);
221 else if (object->IsA() == AliDielectronPair::Class()) FillVarDielectronPair(static_cast<const AliDielectronPair*>(object), values);
223 // Main function to fill all available variables according to the type of event
225 else if (object->IsA() == AliVEvent::Class()) FillVarVEvent(static_cast<const AliVEvent*>(object), values);
226 else if (object->IsA() == AliESDEvent::Class()) FillVarESDEvent(static_cast<const AliESDEvent*>(object), values);
227 else if (object->IsA() == AliAODEvent::Class()) FillVarAODEvent(static_cast<const AliAODEvent*>(object), values);
228 else if (object->IsA() == AliMCEvent::Class()) FillVarMCEvent(static_cast<const AliMCEvent*>(object), values);
229 // else Error("Fill",Form("Type %s is not supported by AliDielectronVarManager!", object->ClassName())); //TODO: implement without object needed
232 inline void AliDielectronVarManager::FillVarVParticle(const AliVParticle *particle, Double_t * const values)
235 // Fill track information available in AliVParticle into an array
237 values[AliDielectronVarManager::kPx] = particle->Px();
238 values[AliDielectronVarManager::kPy] = particle->Py();
239 values[AliDielectronVarManager::kPz] = particle->Pz();
240 values[AliDielectronVarManager::kPt] = particle->Pt();
241 values[AliDielectronVarManager::kP] = particle->P();
243 values[AliDielectronVarManager::kXv] = particle->Xv();
244 values[AliDielectronVarManager::kYv] = particle->Yv();
245 values[AliDielectronVarManager::kZv] = particle->Zv();
247 values[AliDielectronVarManager::kOneOverPt] = particle->OneOverPt();
248 values[AliDielectronVarManager::kPhi] = particle->Phi();
249 values[AliDielectronVarManager::kTheta] = particle->Theta();
250 values[AliDielectronVarManager::kEta] = particle->Eta();
251 values[AliDielectronVarManager::kY] = particle->Y();
253 values[AliDielectronVarManager::kE] = particle->E();
254 values[AliDielectronVarManager::kM] = particle->M();
255 values[AliDielectronVarManager::kCharge] = particle->Charge();
257 values[AliDielectronVarManager::kPdgCode] = particle->PdgCode();
259 if ( fgEvent ) AliDielectronVarManager::Fill(fgEvent, values);
262 inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle, Double_t * const values)
265 // Fill track information available for histogramming into an array
268 // Fill common AliVParticle interface information
269 FillVarVParticle(particle, values);
271 Double_t pidProbs[AliPID::kSPECIES];
272 // Fill AliESDtrack interface specific information
273 Double_t tpcNcls=particle->GetTPCNcls();
274 values[AliDielectronVarManager::kNclsITS] = particle->GetNcls(0); // TODO: get rid of the plain numbers
275 values[AliDielectronVarManager::kNclsTPC] = tpcNcls; // TODO: get rid of the plain numbers
276 values[AliDielectronVarManager::kNclsTPCiter1] = particle->GetTPCNclsIter1(); // TODO: get rid of the plain numbers
277 values[AliDielectronVarManager::kNFclsTPC] = particle->GetTPCNclsF();
278 values[AliDielectronVarManager::kNFclsTPCr] = particle->GetTPCClusterInfo(2,1);
279 values[AliDielectronVarManager::kTPCsignalN] = particle->GetTPCsignalN();
280 values[AliDielectronVarManager::kNclsTRD] = particle->GetNcls(2); // TODO: get rid of the plain numbers
281 values[AliDielectronVarManager::kTRDntracklets] = particle->GetTRDntracklets(); // TODO: GetTRDtracklets/GetTRDntracklets?
282 values[AliDielectronVarManager::kTRDpidQuality] = particle->GetTRDpidQuality();
283 values[AliDielectronVarManager::kTrackStatus] = (Double_t)particle->GetStatus();
286 values[AliDielectronVarManager::kTPCchi2Cl] = -1;
287 if (tpcNcls>0) values[AliDielectronVarManager::kTPCchi2Cl] = particle->GetTPCchi2() / tpcNcls;
289 particle->GetTRDpid(pidProbs);
290 values[AliDielectronVarManager::kTRDprobEle] = pidProbs[AliPID::kElectron];
291 values[AliDielectronVarManager::kTRDprobPio] = pidProbs[AliPID::kPion];
293 values[AliDielectronVarManager::kKinkIndex0] = particle->GetKinkIndex(0);
295 Float_t impactParXY, impactParZ;
296 particle->GetImpactParameters(impactParXY, impactParZ);
297 values[AliDielectronVarManager::kImpactParXY] = impactParXY;
298 values[AliDielectronVarManager::kImpactParZ] = impactParZ;
301 values[AliDielectronVarManager::kPdgCode]=0;
302 values[AliDielectronVarManager::kPdgCodeMother]=0;
304 values[AliDielectronVarManager::kNumberOfDaughters]=-999;
306 AliDielectronMC *mc=AliDielectronMC::Instance();
309 if (mc->GetMCTrack(particle))
310 values[AliDielectronVarManager::kPdgCode]=
311 mc->GetMCTrack(particle)->PdgCode();
313 Int_t pdgMother=mc->GetMotherPDG(particle);
315 values[AliDielectronVarManager::kPdgCodeMother]=pdgMother;
317 values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle);
322 values[AliDielectronVarManager::kITSsignal] = particle->GetITSsignal();
325 particle->GetITSdEdxSamples(itsdEdx);
327 values[AliDielectronVarManager::kITSsignalSSD1] = itsdEdx[0];
328 values[AliDielectronVarManager::kITSsignalSSD2] = itsdEdx[1];
329 values[AliDielectronVarManager::kITSsignalSDD1] = itsdEdx[2];
330 values[AliDielectronVarManager::kITSsignalSDD2] = itsdEdx[3];
331 values[AliDielectronVarManager::kITSclusterMap] = particle->GetITSClusterMap();
333 values[AliDielectronVarManager::kTrackLength] = particle->GetIntegratedLength();
335 Double_t mom = particle->GetP();
336 const AliExternalTrackParam *in=particle->GetInnerParam();
337 if (in) mom = in->GetP();
338 values[AliDielectronVarManager::kPIn]=mom;
339 values[AliDielectronVarManager::kTPCsignal]=particle->GetTPCsignal();
340 // nsigma to Electron band
341 // TODO: for the moment we set the bethe bloch parameters manually
342 // this should be changed in future!
344 values[AliDielectronVarManager::kTPCnSigmaEle]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kElectron)-AliDielectronPID::GetCorrVal();
345 values[AliDielectronVarManager::kTPCnSigmaPio]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kPion);
346 values[AliDielectronVarManager::kTPCnSigmaMuo]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kMuon);
347 values[AliDielectronVarManager::kTPCnSigmaKao]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kKaon);
348 values[AliDielectronVarManager::kTPCnSigmaPro]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kProton);
350 values[AliDielectronVarManager::kITSnSigmaEle]=fgESDpid->NumberOfSigmasITS(particle,AliPID::kElectron);
351 values[AliDielectronVarManager::kITSnSigmaPio]=fgESDpid->NumberOfSigmasITS(particle,AliPID::kPion);
352 values[AliDielectronVarManager::kITSnSigmaMuo]=fgESDpid->NumberOfSigmasITS(particle,AliPID::kMuon);
353 values[AliDielectronVarManager::kITSnSigmaKao]=fgESDpid->NumberOfSigmasITS(particle,AliPID::kKaon);
354 values[AliDielectronVarManager::kITSnSigmaPro]=fgESDpid->NumberOfSigmasITS(particle,AliPID::kProton);
356 Double_t t0=fgESDpid->GetTOFResponse().GetTimeZero();
357 values[AliDielectronVarManager::kTOFnSigmaEle]=fgESDpid->NumberOfSigmasTOF(particle,AliPID::kElectron,t0);
358 values[AliDielectronVarManager::kTOFnSigmaPio]=fgESDpid->NumberOfSigmasTOF(particle,AliPID::kPion,t0);
359 values[AliDielectronVarManager::kTOFnSigmaMuo]=fgESDpid->NumberOfSigmasTOF(particle,AliPID::kMuon,t0);
360 values[AliDielectronVarManager::kTOFnSigmaKao]=fgESDpid->NumberOfSigmasTOF(particle,AliPID::kKaon,t0);
361 values[AliDielectronVarManager::kTOFnSigmaPro]=fgESDpid->NumberOfSigmasTOF(particle,AliPID::kProton,t0);
364 inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle, Double_t * const values)
367 // Fill track information available for histogramming into an array
370 // Fill common AliVParticle interface information
371 FillVarVParticle(particle, values);
373 // Reset AliESDtrack interface specific information
374 values[AliDielectronVarManager::kNclsITS] = 0;
375 values[AliDielectronVarManager::kNclsTPC] = particle->GetTPCNcls();
376 values[AliDielectronVarManager::kNclsTPCiter1] = particle->GetTPCNcls(); // not really available in AOD
377 values[AliDielectronVarManager::kNFclsTPC] = 0;
378 values[AliDielectronVarManager::kNFclsTPCr] = 0;
379 values[AliDielectronVarManager::kNclsTRD] = 0;
380 values[AliDielectronVarManager::kTRDntracklets] = 0;
381 values[AliDielectronVarManager::kTRDpidQuality] = 0;
383 values[AliDielectronVarManager::kTPCchi2Cl] = -1;
384 values[AliDielectronVarManager::kTrackStatus] = (Double_t)particle->GetStatus();
387 //TODO: set correctly
388 values[AliDielectronVarManager::kTRDprobEle] = 0;
389 values[AliDielectronVarManager::kTRDprobPio] = 0;
391 //TODO: This is only an approximation!!!
392 values[AliDielectronVarManager::kTPCsignalN] = 0;
394 // Fill AliAODTrack interface information
397 GetDCA(particle, d0z0);
398 values[AliDielectronVarManager::kImpactParXY] = d0z0[0];
399 values[AliDielectronVarManager::kImpactParZ] = d0z0[1];
401 values[AliDielectronVarManager::kPIn]=0;
402 values[AliDielectronVarManager::kTPCsignal]=0;
404 values[AliDielectronVarManager::kTPCnSigmaEle]=0;
405 values[AliDielectronVarManager::kTPCnSigmaPio]=0;
406 values[AliDielectronVarManager::kTPCnSigmaMuo]=0;
407 values[AliDielectronVarManager::kTPCnSigmaKao]=0;
408 values[AliDielectronVarManager::kTPCnSigmaPro]=0;
410 values[AliDielectronVarManager::kITSclusterMap] = particle->GetITSClusterMap();
412 AliAODPid *pid=particle->GetDetPid();
414 Double_t mom =pid->GetTPCmomentum();
415 values[AliDielectronVarManager::kTPCsignalN] = pid->GetTPCsignalN();
416 Double_t tpcNsigmaEle=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kElectron);
417 Double_t tpcNsigmaPio=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kPion);
418 Double_t tpcNsigmaMuo=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kMuon);
419 Double_t tpcNsigmaKao=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kKaon);
420 Double_t tpcNsigmaPro=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kProton);
422 values[AliDielectronVarManager::kPIn]=mom;
423 values[AliDielectronVarManager::kTPCsignal]=pid->GetTPCsignal();
425 values[AliDielectronVarManager::kTPCnSigmaEle]=tpcNsigmaEle;
426 values[AliDielectronVarManager::kTPCnSigmaPio]=tpcNsigmaPio;
427 values[AliDielectronVarManager::kTPCnSigmaMuo]=tpcNsigmaMuo;
428 values[AliDielectronVarManager::kTPCnSigmaKao]=tpcNsigmaKao;
429 values[AliDielectronVarManager::kTPCnSigmaPro]=tpcNsigmaPro;
431 values[AliDielectronVarManager::kTRDntracklets] = 0;
432 values[AliDielectronVarManager::kTRDpidQuality] = 0;
437 inline void AliDielectronVarManager::FillVarMCParticle(const AliMCParticle *particle, Double_t * const values)
440 // Fill track information available for histogramming into an array
443 values[AliDielectronVarManager::kNclsITS] = 0;
444 values[AliDielectronVarManager::kNclsTPC] = 0;
445 values[AliDielectronVarManager::kNclsTPCiter1] = 0;
446 values[AliDielectronVarManager::kNFclsTPC] = 0;
447 values[AliDielectronVarManager::kNFclsTPCr] = 0;
448 values[AliDielectronVarManager::kNclsTRD] = 0;
449 values[AliDielectronVarManager::kTRDntracklets] = 0;
450 values[AliDielectronVarManager::kTRDpidQuality] = 0;
451 values[AliDielectronVarManager::kTPCchi2Cl] = 0;
452 values[AliDielectronVarManager::kTrackStatus] = 0;
453 values[AliDielectronVarManager::kTRDprobEle] = 0;
454 values[AliDielectronVarManager::kTRDprobPio] = 0;
455 values[AliDielectronVarManager::kTPCsignalN] = 0;
456 values[AliDielectronVarManager::kImpactParXY] = 0;
457 values[AliDielectronVarManager::kImpactParZ] = 0;
458 values[AliDielectronVarManager::kPIn] = 0;
459 values[AliDielectronVarManager::kTPCsignal] = 0;
460 values[AliDielectronVarManager::kTPCnSigmaEle] = 0;
461 values[AliDielectronVarManager::kTPCnSigmaPio] = 0;
462 values[AliDielectronVarManager::kTPCnSigmaMuo] = 0;
463 values[AliDielectronVarManager::kTPCnSigmaKao] = 0;
464 values[AliDielectronVarManager::kTPCnSigmaPro] = 0;
465 values[AliDielectronVarManager::kITSclusterMap] = 0;
467 values[AliDielectronVarManager::kPdgCode] = 0;
468 values[AliDielectronVarManager::kPdgCodeMother] = 0;
470 // Fill common AliVParticle interface information
471 FillVarVParticle(particle, values);
473 AliDielectronMC *mc=AliDielectronMC::Instance();
475 // Fill AliMCParticle interface specific information
476 values[AliDielectronVarManager::kPdgCode] = particle->PdgCode();
478 AliMCParticle *mother = mc->GetMCTrackMother(particle);
479 if (mother) values[AliDielectronVarManager::kPdgCodeMother] = mother->PdgCode();
482 values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle);
485 inline void AliDielectronVarManager::FillVarAODMCParticle(const AliAODMCParticle *particle, Double_t * const values)
488 // Fill track information available for histogramming into an array
491 values[AliDielectronVarManager::kNclsITS] = 0;
492 values[AliDielectronVarManager::kNclsTPC] = 0;
493 values[AliDielectronVarManager::kNclsTPCiter1] = 0;
494 values[AliDielectronVarManager::kNFclsTPC] = 0;
495 values[AliDielectronVarManager::kNclsTRD] = 0;
496 values[AliDielectronVarManager::kTRDntracklets] = 0;
497 values[AliDielectronVarManager::kTRDpidQuality] = 0;
498 values[AliDielectronVarManager::kTPCchi2Cl] = 0;
499 values[AliDielectronVarManager::kTrackStatus] = 0;
500 values[AliDielectronVarManager::kTRDprobEle] = 0;
501 values[AliDielectronVarManager::kTRDprobPio] = 0;
502 values[AliDielectronVarManager::kTPCsignalN] = 0;
503 values[AliDielectronVarManager::kImpactParXY] = 0;
504 values[AliDielectronVarManager::kImpactParZ] = 0;
505 values[AliDielectronVarManager::kPIn] = 0;
506 values[AliDielectronVarManager::kTPCsignal] = 0;
507 values[AliDielectronVarManager::kTPCnSigmaEle] = 0;
508 values[AliDielectronVarManager::kTPCnSigmaPio] = 0;
509 values[AliDielectronVarManager::kTPCnSigmaMuo] = 0;
510 values[AliDielectronVarManager::kTPCnSigmaKao] = 0;
511 values[AliDielectronVarManager::kTPCnSigmaPro] = 0;
512 values[AliDielectronVarManager::kITSclusterMap] = 0;
514 values[AliDielectronVarManager::kPdgCode] = 0;
515 values[AliDielectronVarManager::kPdgCodeMother] = 0;
517 // Fill common AliVParticle interface information
518 FillVarVParticle(particle, values);
520 AliDielectronMC *mc=AliDielectronMC::Instance();
523 // Fill AliAODMCParticle interface specific information
524 values[AliDielectronVarManager::kPdgCode] = particle->PdgCode();
526 AliVParticle *mother = mc->GetMCTrackMother(particle);
527 if (mother) values[AliDielectronVarManager::kPdgCodeMother] = mother->PdgCode();
529 values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle);
532 inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPair *pair, Double_t * const values)
535 // Fill pair information available for histogramming into an array
538 values[AliDielectronVarManager::kPdgCode]=0;
539 values[AliDielectronVarManager::kPdgCodeMother]=0;
541 // Fill common AliVParticle interface information
542 FillVarVParticle(pair, values);
544 // Fill AliDielectronPair specific information
545 const AliKFParticle &kfPair = pair->GetKFParticle();
552 pair->GetThetaPhiCM(thetaHE,phiHE,thetaCS,phiCS);
554 values[AliDielectronVarManager::kChi2NDF] = kfPair.GetChi2()/kfPair.GetNDF();
555 values[AliDielectronVarManager::kDecayLength] = kfPair.GetDecayLength();
556 values[AliDielectronVarManager::kR] = kfPair.GetR();
557 values[AliDielectronVarManager::kOpeningAngle] = pair->OpeningAngle();
558 values[AliDielectronVarManager::kThetaHE] = thetaHE;
559 values[AliDielectronVarManager::kPhiHE] = phiHE;
560 values[AliDielectronVarManager::kThetaCS] = thetaCS;
561 values[AliDielectronVarManager::kPhiCS] = phiCS;
562 values[AliDielectronVarManager::kLegDist] = pair->DistanceDaughters();
563 values[AliDielectronVarManager::kLegDistXY] = pair->DistanceDaughtersXY();
564 values[AliDielectronVarManager::kDeltaEta] = pair->DeltaEta();
565 values[AliDielectronVarManager::kDeltaPhi] = pair->DeltaPhi();
566 values[AliDielectronVarManager::kMerr] = kfPair.GetErrMass()>1e-30&&kfPair.GetMass()>1e-30?kfPair.GetErrMass()/kfPair.GetMass():1000000;
567 values[AliDielectronVarManager::kPairType] = pair->GetType();
571 AliDielectronMC *mc=AliDielectronMC::Instance();
574 Bool_t samemother = mc->HaveSameMother(pair);
575 values[AliDielectronVarManager::kHaveSameMother] = samemother ;
582 inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Double_t * const values)
585 // Fill event information available for histogramming into an array
587 const AliVVertex *primVtx = event->GetPrimaryVertex();
589 values[AliDielectronVarManager::kXvPrim] = 0;
590 values[AliDielectronVarManager::kYvPrim] = 0;
591 values[AliDielectronVarManager::kZvPrim] = 0;
592 values[AliDielectronVarManager::kChi2NDF] = 0;
594 values[AliDielectronVarManager::kNTrk] = 0;
595 values[AliDielectronVarManager::kNevents] = 0; //always fill bin 0;
597 if (!primVtx) return;
599 values[AliDielectronVarManager::kXvPrim] = primVtx->GetX();
600 values[AliDielectronVarManager::kYvPrim] = primVtx->GetY();
601 values[AliDielectronVarManager::kZvPrim] = primVtx->GetZ();
602 values[AliDielectronVarManager::kChi2NDF] = primVtx->GetChi2perNDF();
604 values[AliDielectronVarManager::kNTrk] = event->GetNumberOfTracks();
607 inline void AliDielectronVarManager::FillVarESDEvent(const AliESDEvent *event, Double_t * const values)
610 // Fill event information available for histogramming into an array
613 // Fill common AliVEvent interface information
614 FillVarVEvent(event, values);
616 Double_t centralityF=-1;
617 AliESDCentrality *esdCentrality = const_cast<AliESDEvent*>(event)->GetCentrality();
618 if (esdCentrality) centralityF = esdCentrality->GetCentralityPercentile("V0M");
620 // Fill AliESDEvent interface specific information
621 const AliESDVertex *primVtx = event->GetPrimaryVertex();
622 values[AliDielectronVarManager::kXRes] = primVtx->GetXRes();
623 values[AliDielectronVarManager::kYRes] = primVtx->GetYRes();
624 values[AliDielectronVarManager::kZRes] = primVtx->GetZRes();
625 values[AliDielectronVarManager::kCentrality] = centralityF;
628 inline void AliDielectronVarManager::FillVarAODEvent(const AliAODEvent *event, Double_t * const values)
631 // Fill event information available for histogramming into an array
634 // Fill common AliVEvent interface information
635 FillVarVEvent(event, values);
637 // Fill AliAODEvent interface specific information
640 inline void AliDielectronVarManager::FillVarMCEvent(const AliMCEvent *event, Double_t * const values)
643 // Fill event information available for histogramming into an array
646 // Fill common AliVEvent interface information
647 FillVarVEvent(event, values);
649 // Fill AliMCEvent interface specific information
652 inline void AliDielectronVarManager::InitESDpid(Int_t type)
655 // initialize PID parameters
656 // type=0 is simulation
659 if (!fgESDpid) fgESDpid=new AliESDpid;
660 Double_t alephParameters[5];
662 alephParameters[0] = 2.15898e+00/50.;
663 alephParameters[1] = 1.75295e+01;
664 alephParameters[2] = 3.40030e-09;
665 alephParameters[3] = 1.96178e+00;
666 alephParameters[4] = 3.91720e+00;
667 fgESDpid->GetTOFResponse().SetTimeResolution(80.);
671 alephParameters[0] = 0.0283086/0.97;
672 alephParameters[1] = 2.63394e+01;
673 alephParameters[2] = 5.04114e-11;
674 alephParameters[3] = 2.12543e+00;
675 alephParameters[4] = 4.88663e+00;
676 fgESDpid->GetTOFResponse().SetTimeResolution(130.);
677 fgESDpid->GetTPCResponse().SetMip(50.);
680 fgESDpid->GetTPCResponse().SetBetheBlochParameters(
681 alephParameters[0],alephParameters[1],alephParameters[2],
682 alephParameters[3],alephParameters[4]);
684 fgESDpid->GetTPCResponse().SetSigma(3.79301e-03, 2.21280e+04);
687 inline void AliDielectronVarManager::InitAODpidUtil(Int_t type)
689 if (!fgAODpidUtil) fgAODpidUtil=new AliAODpidUtil;
690 Double_t alephParameters[5];
692 alephParameters[0] = 2.15898e+00/50.;
693 alephParameters[1] = 1.75295e+01;
694 alephParameters[2] = 3.40030e-09;
695 alephParameters[3] = 1.96178e+00;
696 alephParameters[4] = 3.91720e+00;
697 fgAODpidUtil->GetTOFResponse().SetTimeResolution(80.);
701 alephParameters[0] = 0.0283086/0.97;
702 alephParameters[1] = 2.63394e+01;
703 alephParameters[2] = 5.04114e-11;
704 alephParameters[3] = 2.12543e+00;
705 alephParameters[4] = 4.88663e+00;
706 fgAODpidUtil->GetTOFResponse().SetTimeResolution(130.);
707 fgAODpidUtil->GetTPCResponse().SetMip(50.);
710 fgAODpidUtil->GetTPCResponse().SetBetheBlochParameters(
711 alephParameters[0],alephParameters[1],alephParameters[2],
712 alephParameters[3],alephParameters[4]);
714 fgAODpidUtil->GetTPCResponse().SetSigma(3.79301e-03, 2.21280e+04);
718 inline void AliDielectronVarManager::SetEvent(AliVEvent * const ev)
722 if (fgKFVertex) delete fgKFVertex;
724 if (ev && ev->GetPrimaryVertex()) fgKFVertex=new AliKFVertex(*ev->GetPrimaryVertex());
728 inline Bool_t AliDielectronVarManager::GetDCA(const AliAODTrack *track, Double_t d0z0[2])
730 if(track->TestBit(AliAODTrack::kIsDCA)){
731 d0z0[0]=track->DCA();
732 d0z0[1]=track->ZAtDCA();
737 AliAODTrack copy(*track);
738 AliAODVertex *vtx =(AliAODVertex*)(fgEvent->GetPrimaryVertex());
739 Double_t fBzkG = fgEvent->GetMagneticField(); // z componenent of field in kG
740 Bool_t ok = copy.PropagateToDCA(vtx,fBzkG,kVeryBig,d0z0,covd0z0);
749 inline void AliDielectronVarManager::FillValues(const TParticle *particle, Double_t *values)
752 // Fill track information available for histogramming into an array
755 // Fill TParticle interface information
756 values[AliDielectronVarManager::kPx] = particle->Px();
757 values[AliDielectronVarManager::kPy] = particle->Py();
758 values[AliDielectronVarManager::kPz] = particle->Pz();
759 values[AliDielectronVarManager::kPt] = particle->Pt();
760 values[AliDielectronVarManager::kP] = particle->P();
762 values[AliDielectronVarManager::kXv] = particle->Vx();
763 values[AliDielectronVarManager::kYv] = particle->Vy();
764 values[AliDielectronVarManager::kZv] = particle->Vz();
766 values[AliDielectronVarManager::kOneOverPt] = 1./particle->Pt();
767 values[AliDielectronVarManager::kPhi] = particle->Phi();
768 values[AliDielectronVarManager::kTheta] =
769 values[AliDielectronVarManager::kEta] = particle->Eta();
770 values[AliDielectronVarManager::kY] =
772 values[AliDielectronVarManager::kE] = particle->Energy();
773 values[AliDielectronVarManager::kM] = particle->GetMass();
775 values[AliDielectronVarManager::kCharge] = particle->GetPDG()->Charge()/3; // uggly