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>
46 #include "AliDielectronPair.h"
50 //________________________________________________________________
51 class AliDielectronVarManager : public TNamed {
55 // Particle specific variables
60 kPt, // transverse momentum
62 kXv, // vertex position in x
63 kYv, // vertex position in y
64 kZv, // vertex position in z
67 kTheta, // theta angle
68 kEta, // pseudo-rapidity
73 kNclsITS, // number of clusters assigned in the ITS
74 kNclsTPC, // number of clusters assigned in the TPC
75 kNFclsTPC, // number of findable clusters in the TPC
76 kTPCsignalN, // number of points used for dEdx
77 kNclsTRD, // number of clusters assigned in the TRD
78 kTRDntracklets, // number of TRD tracklets used for tracking/PID TODO: correct getter
79 kTRDpidQuality, // number of TRD tracklets used for PID
80 kImpactParXY, // Impact parameter in XY plane
81 kImpactParZ, // Impact parameter in Z
82 kTrackLength, // Track length
84 kPIn, // momentum at inner wall of TPC (if available), used for PID
85 kTPCsignal, // TPC dE/dx signal
87 kTPCnSigmaEle, // number of sigmas to the dE/dx electron line in the TPC
88 kTPCnSigmaPio, // number of sigmas to the dE/dx pion line in the TPC
89 kTPCnSigmaMuo, // number of sigmas to the dE/dx muon line in the TPC
90 kTPCnSigmaKao, // number of sigmas to the dE/dx kaon line in the TPC
91 kTPCnSigmaPro, // number of sigmas to the dE/dx proton line in the TPC
93 kTOFnSigmaPio, // number of sigmas to the pion line in the TOF
94 kTOFnSigmaMuo, // number of sigmas to the muon line in the TOF
95 kTOFnSigmaKao, // number of sigmas to the kaon line in the TOF
96 kTOFnSigmaPro, // number of sigmas to the proton line in the TOF
99 // TODO: kRNClusters ??
100 // AliDielectronPair specific variables
101 kChi2NDF = kParticleMax, // Chi^2/NDF
102 kDecayLength, // decay length
103 kR, // distance to the origin
104 kOpeningAngle, // opening angle
105 kLegDist, // distance of the legs
106 kLegDistXY, // distance of the legs in XY
107 kMerr, // error of mass calculation
108 kDCA, // distance of closest approach TODO: not implemented yet
109 kPairType, // type of the pair, like like sign ++ unlikesign ...
111 // Event specific variables
112 kXvPrim=kPairMax, // prim vertex
113 kYvPrim, // prim vertex
114 kZvPrim, // prim vertex
115 kXRes, // primary vertex x-resolution
116 kYRes, // primary vertex y-resolution
117 kZRes, // primary vertex z-resolution
118 kNTrk, // number of tracks (or tracklets)
119 kTracks, // ESD tracks
120 kNevents, // event counter
122 // TODO: (for A+A) ZDCEnergy, impact parameter, Iflag??
126 AliDielectronVarManager();
127 AliDielectronVarManager(const char* name, const char* title);
128 virtual ~AliDielectronVarManager();
129 static void Fill(const TObject* particle, Double_t * const values);
131 static void InitESDpid(Int_t type=0);
132 static void SetESDpid(AliESDpid * const pid) {fgESDpid=pid;}
133 static AliESDpid* GetESDpid() {return fgESDpid;}
134 static void SetEvent(AliVEvent * const ev);
136 static const char* GetValueName(Int_t i) { return (i>=0&&i<kNMaxValues)?fgkParticleNames[i]:""; }
139 static const char* fgkParticleNames[kNMaxValues]; //variable names
141 static void FillVarVParticle(const AliVParticle *particle, Double_t * const values);
142 static void FillVarESDtrack(const AliESDtrack *particle, Double_t * const values);
143 static void FillVarAODTrack(const AliAODTrack *particle, Double_t * const values);
144 static void FillVarMCParticle(const AliMCParticle *particle, Double_t * const values);
145 static void FillVarAODMCParticle(const AliAODMCParticle *particle, Double_t * const values);
146 static void FillVarDielectronPair(const AliDielectronPair *pair, Double_t * const values);
147 static void FillVarVEvent(const AliVEvent *event, Double_t * const values);
148 static void FillVarESDEvent(const AliESDEvent *event, Double_t * const values);
149 static void FillVarAODEvent(const AliAODEvent *event, Double_t * const values);
150 static void FillVarMCEvent(const AliMCEvent *event, Double_t * const values);
152 static AliESDpid* fgESDpid; // ESD pid object
153 static AliVEvent* fgEvent; // current event pointer
154 static AliKFVertex *fgKFVertex; // kf vertex
156 AliDielectronVarManager(const AliDielectronVarManager &c);
157 AliDielectronVarManager &operator=(const AliDielectronVarManager &c);
159 ClassDef(AliDielectronVarManager,1);
164 inline void AliDielectronVarManager::Fill(const TObject* object, Double_t * const values)
167 // Main function to fill all available variables according to the type of particle
170 if (object->IsA() == AliESDtrack::Class()) FillVarESDtrack(static_cast<const AliESDtrack*>(object), values);
171 else if (object->IsA() == AliAODTrack::Class()) FillVarAODTrack(static_cast<const AliAODTrack*>(object), values);
172 else if (object->IsA() == AliMCParticle::Class()) FillVarMCParticle(static_cast<const AliMCParticle*>(object), values);
173 else if (object->IsA() == AliAODMCParticle::Class()) FillVarAODMCParticle(static_cast<const AliAODMCParticle*>(object), values);
174 else if (object->IsA() == AliDielectronPair::Class()) FillVarDielectronPair(static_cast<const AliDielectronPair*>(object), values);
176 // Main function to fill all available variables according to the type of event
178 else if (object->IsA() == AliVEvent::Class()) FillVarVEvent(static_cast<const AliVEvent*>(object), values);
179 else if (object->IsA() == AliESDEvent::Class()) FillVarESDEvent(static_cast<const AliESDEvent*>(object), values);
180 else if (object->IsA() == AliAODEvent::Class()) FillVarAODEvent(static_cast<const AliAODEvent*>(object), values);
181 else if (object->IsA() == AliMCEvent::Class()) FillVarMCEvent(static_cast<const AliMCEvent*>(object), values);
182 // else Error("Fill",Form("Type %s is not supported by AliDielectronVarManager!", object->ClassName())); //TODO: implement without object needed
185 inline void AliDielectronVarManager::FillVarVParticle(const AliVParticle *particle, Double_t * const values)
188 // Fill track information available in AliVParticle into an array
190 values[AliDielectronVarManager::kPx] = particle->Px();
191 values[AliDielectronVarManager::kPy] = particle->Py();
192 values[AliDielectronVarManager::kPz] = particle->Pz();
193 values[AliDielectronVarManager::kPt] = particle->Pt();
194 values[AliDielectronVarManager::kP] = particle->P();
196 values[AliDielectronVarManager::kXv] = particle->Xv();
197 values[AliDielectronVarManager::kYv] = particle->Yv();
198 values[AliDielectronVarManager::kZv] = particle->Zv();
200 values[AliDielectronVarManager::kOneOverPt] = particle->OneOverPt();
201 values[AliDielectronVarManager::kPhi] = particle->Phi();
202 values[AliDielectronVarManager::kTheta] = particle->Theta();
203 values[AliDielectronVarManager::kEta] = particle->Eta();
204 values[AliDielectronVarManager::kY] = particle->Y();
206 values[AliDielectronVarManager::kE] = particle->E();
207 values[AliDielectronVarManager::kM] = particle->M();
208 values[AliDielectronVarManager::kCharge] = particle->Charge();
210 if ( fgEvent ) AliDielectronVarManager::Fill(fgEvent, values);
213 inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle, Double_t * const values)
216 // Fill track information available for histogramming into an array
219 // Fill common AliVParticle interface information
220 FillVarVParticle(particle, values);
222 // Fill AliESDtrack interface specific information
223 values[AliDielectronVarManager::kNclsITS] = particle->GetNcls(0); // TODO: get rid of the plain numbers
224 values[AliDielectronVarManager::kNclsTPC] = particle->GetNcls(1); // TODO: get rid of the plain numbers
225 values[AliDielectronVarManager::kNFclsTPC] = particle->GetTPCNclsF();
226 values[AliDielectronVarManager::kTPCsignalN] = particle->GetTPCsignalN();
227 values[AliDielectronVarManager::kNclsTRD] = particle->GetNcls(2); // TODO: get rid of the plain numbers
228 values[AliDielectronVarManager::kTRDntracklets] = particle->GetTRDntracklets(); // TODO: GetTRDtracklets/GetTRDntracklets?
229 values[AliDielectronVarManager::kTRDpidQuality] = particle->GetTRDpidQuality();
231 Float_t impactParXY, impactParZ;
232 particle->GetImpactParameters(impactParXY, impactParZ);
233 values[AliDielectronVarManager::kImpactParXY] = impactParXY;
234 values[AliDielectronVarManager::kImpactParZ] = impactParZ;
236 values[AliDielectronVarManager::kTrackLength] = particle->GetIntegratedLength();
238 Double_t mom = particle->GetP();
239 const AliExternalTrackParam *in=particle->GetInnerParam();
240 if (in) mom = in->GetP();
241 values[AliDielectronVarManager::kPIn]=mom;
242 values[AliDielectronVarManager::kTPCsignal]=particle->GetTPCsignal();
243 // nsigma to Electron band
244 // TODO: for the moment we set the bethe bloch parameters manually
245 // this should be changed in future!
246 values[AliDielectronVarManager::kTPCnSigmaEle]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kElectron);
247 values[AliDielectronVarManager::kTPCnSigmaPio]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kPion);
248 values[AliDielectronVarManager::kTPCnSigmaMuo]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kMuon);
249 values[AliDielectronVarManager::kTPCnSigmaKao]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kKaon);
250 values[AliDielectronVarManager::kTPCnSigmaPro]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kProton);
252 Double_t t0=fgESDpid->GetTOFResponse().GetTimeZero();
253 values[AliDielectronVarManager::kTOFnSigmaPio]=fgESDpid->NumberOfSigmasTOF(particle,AliPID::kPion,t0);
254 values[AliDielectronVarManager::kTOFnSigmaMuo]=fgESDpid->NumberOfSigmasTOF(particle,AliPID::kMuon,t0);
255 values[AliDielectronVarManager::kTOFnSigmaKao]=fgESDpid->NumberOfSigmasTOF(particle,AliPID::kKaon,t0);
256 values[AliDielectronVarManager::kTOFnSigmaPro]=fgESDpid->NumberOfSigmasTOF(particle,AliPID::kProton,t0);
259 inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle, Double_t * const values)
262 // Fill track information available for histogramming into an array
265 // Fill common AliVParticle interface information
266 FillVarVParticle(particle, values);
268 // Reset AliESDtrack interface specific information
269 values[AliDielectronVarManager::kNclsITS] = 0;
270 values[AliDielectronVarManager::kNclsTPC] = 0;
271 values[AliDielectronVarManager::kNFclsTPC] = 0;
272 values[AliDielectronVarManager::kNclsTRD] = 0;
273 values[AliDielectronVarManager::kTRDntracklets] = 0;
274 values[AliDielectronVarManager::kTRDpidQuality] = 0;
276 //TODO: This is only an approximation!!!
277 values[AliDielectronVarManager::kTPCsignalN] = particle->GetTPCClusterMap().CountBits();
279 // Fill AliAODTrack interface information
281 values[AliDielectronVarManager::kImpactParXY] = particle->DCA();
282 values[AliDielectronVarManager::kImpactParZ] = particle->ZAtDCA();
284 values[AliDielectronVarManager::kPIn]=0;
285 values[AliDielectronVarManager::kTPCsignal]=0;
287 values[AliDielectronVarManager::kTPCnSigmaEle]=0;
288 values[AliDielectronVarManager::kTPCnSigmaPio]=0;
289 values[AliDielectronVarManager::kTPCnSigmaMuo]=0;
290 values[AliDielectronVarManager::kTPCnSigmaKao]=0;
291 values[AliDielectronVarManager::kTPCnSigmaPro]=0;
294 AliAODPid *pid=particle->GetDetPid();
296 Double_t mom =pid->GetTPCmomentum();
297 //TODO: kTPCsignalN is only an approximation (see above)!!
299 Double_t tpcNsigmaEle=fgESDpid->GetTPCResponse().GetNumberOfSigmas(mom,pid->GetTPCsignal(),
300 TMath::Nint(values[AliDielectronVarManager::kTPCsignalN]) ,AliPID::kElectron);
302 Double_t tpcNsigmaPio=fgESDpid->GetTPCResponse().GetNumberOfSigmas(mom,pid->GetTPCsignal(),
303 TMath::Nint(values[AliDielectronVarManager::kTPCsignalN]),AliPID::kPion);
305 Double_t tpcNsigmaMuo=fgESDpid->GetTPCResponse().GetNumberOfSigmas(mom,pid->GetTPCsignal(),
306 TMath::Nint(values[AliDielectronVarManager::kTPCsignalN]),AliPID::kMuon);
308 Double_t tpcNsigmaKao=fgESDpid->GetTPCResponse().GetNumberOfSigmas(mom,pid->GetTPCsignal(),
309 TMath::Nint(values[AliDielectronVarManager::kTPCsignalN]),AliPID::kKaon);
311 Double_t tpcNsigmaPro=fgESDpid->GetTPCResponse().GetNumberOfSigmas(mom,pid->GetTPCsignal(),
312 TMath::Nint(values[AliDielectronVarManager::kTPCsignalN]),AliPID::kProton);
314 values[AliDielectronVarManager::kPIn]=pid->GetTPCmomentum();
315 values[AliDielectronVarManager::kTPCsignal]=pid->GetTPCsignal();
317 values[AliDielectronVarManager::kTPCnSigmaEle]=tpcNsigmaEle;
318 values[AliDielectronVarManager::kTPCnSigmaPio]=tpcNsigmaPio;
319 values[AliDielectronVarManager::kTPCnSigmaMuo]=tpcNsigmaMuo;
320 values[AliDielectronVarManager::kTPCnSigmaKao]=tpcNsigmaKao;
321 values[AliDielectronVarManager::kTPCnSigmaPro]=tpcNsigmaPro;
323 values[AliDielectronVarManager::kTRDntracklets] = 0;
324 values[AliDielectronVarManager::kTRDpidQuality] = 0;
329 inline void AliDielectronVarManager::FillVarMCParticle(const AliMCParticle *particle, Double_t * const values)
332 // Fill track information available for histogramming into an array
335 // Fill common AliVParticle interface information
336 FillVarVParticle(particle, values);
338 // Fill AliMCParticle interface specific information
339 values[AliDielectronVarManager::kPdgCode] = particle->PdgCode();
342 inline void AliDielectronVarManager::FillVarAODMCParticle(const AliAODMCParticle *particle, Double_t * const values)
345 // Fill track information available for histogramming into an array
348 // Fill common AliVParticle interface information
349 FillVarVParticle(particle, values);
351 // Fill AliAODMCParticle interface specific information
352 values[AliDielectronVarManager::kPdgCode] = particle->GetPdgCode();
355 inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPair *pair, Double_t * const values)
358 // Fill pair information available for histogramming into an array
361 // Fill common AliVParticle interface information
362 FillVarVParticle(pair, values);
364 // Fill AliDielectronPair specific information
365 const AliKFParticle &kfPair = pair->GetKFParticle();
367 values[AliDielectronVarManager::kChi2NDF] = kfPair.GetChi2()/kfPair.GetNDF();
368 values[AliDielectronVarManager::kDecayLength] = kfPair.GetDecayLength();
369 values[AliDielectronVarManager::kR] = kfPair.GetR();
370 values[AliDielectronVarManager::kOpeningAngle] = pair->OpeningAngle();
371 values[AliDielectronVarManager::kLegDist] = pair->DistanceDaughters();
372 values[AliDielectronVarManager::kLegDistXY] = pair->DistanceDaughtersXY();
373 values[AliDielectronVarManager::kMerr] = kfPair.GetErrMass()>1e-30&&kfPair.GetErrMass()>1e-30?kfPair.GetErrMass()/kfPair.GetMass():1000000;
374 values[AliDielectronVarManager::kPairType] = pair->GetType();
378 inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Double_t * const values)
381 // Fill event information available for histogramming into an array
383 const AliVVertex *primVtx = event->GetPrimaryVertex();
384 values[AliDielectronVarManager::kXvPrim] = primVtx->GetX();
385 values[AliDielectronVarManager::kYvPrim] = primVtx->GetY();
386 values[AliDielectronVarManager::kZvPrim] = primVtx->GetZ();
387 values[AliDielectronVarManager::kChi2NDF] = primVtx->GetChi2perNDF();
389 values[AliDielectronVarManager::kNTrk] = event->GetNumberOfTracks();
390 values[AliDielectronVarManager::kNevents] = 0; //always fill bin 0;
393 inline void AliDielectronVarManager::FillVarESDEvent(const AliESDEvent *event, Double_t * const values)
396 // Fill event information available for histogramming into an array
399 // Fill common AliVEvent interface information
400 FillVarVEvent(event, values);
402 // Fill AliESDEvent interface specific information
403 const AliESDVertex *primVtx = event->GetPrimaryVertex();
404 values[AliDielectronVarManager::kXRes] = primVtx->GetXRes();
405 values[AliDielectronVarManager::kYRes] = primVtx->GetYRes();
406 values[AliDielectronVarManager::kZRes] = primVtx->GetZRes();
409 inline void AliDielectronVarManager::FillVarAODEvent(const AliAODEvent *event, Double_t * const values)
412 // Fill event information available for histogramming into an array
415 // Fill common AliVEvent interface information
416 FillVarVEvent(event, values);
418 // Fill AliAODEvent interface specific information
421 inline void AliDielectronVarManager::FillVarMCEvent(const AliMCEvent *event, Double_t * const values)
424 // Fill event information available for histogramming into an array
427 // Fill common AliVEvent interface information
428 FillVarVEvent(event, values);
430 // Fill AliMCEvent interface specific information
433 inline void AliDielectronVarManager::InitESDpid(Int_t type)
436 // initialize PID parameters
437 // type=0 is simulation
440 if (!fgESDpid) fgESDpid=new AliESDpid;
441 Double_t alephParameters[5];
443 alephParameters[0] = 2.15898e+00/50.;
444 alephParameters[1] = 1.75295e+01;
445 alephParameters[2] = 3.40030e-09;
446 alephParameters[3] = 1.96178e+00;
447 alephParameters[4] = 3.91720e+00;
451 alephParameters[0] = 0.0283086;
452 alephParameters[1] = 2.63394e+01;
453 alephParameters[2] = 5.04114e-11;
454 alephParameters[3] = 2.12543e+00;
455 alephParameters[4] = 4.88663e+00;
458 fgESDpid->GetTPCResponse().SetBetheBlochParameters(
459 alephParameters[0],alephParameters[1],alephParameters[2],
460 alephParameters[3],alephParameters[4]);
465 inline void AliDielectronVarManager::SetEvent(AliVEvent * const ev)
469 if (fgKFVertex) delete fgKFVertex;
471 if (ev) fgKFVertex=new AliKFVertex(*ev->GetPrimaryVertex());
474 inline void AliDielectronVarManager::FillValues(const TParticle *particle, Double_t *values)
477 // Fill track information available for histogramming into an array
480 // Fill TParticle interface information
481 values[AliDielectronVarManager::kPx] = particle->Px();
482 values[AliDielectronVarManager::kPy] = particle->Py();
483 values[AliDielectronVarManager::kPz] = particle->Pz();
484 values[AliDielectronVarManager::kPt] = particle->Pt();
485 values[AliDielectronVarManager::kP] = particle->P();
487 values[AliDielectronVarManager::kXv] = particle->Vx();
488 values[AliDielectronVarManager::kYv] = particle->Vy();
489 values[AliDielectronVarManager::kZv] = particle->Vz();
491 values[AliDielectronVarManager::kOneOverPt] = 1./particle->Pt();
492 values[AliDielectronVarManager::kPhi] = particle->Phi();
493 values[AliDielectronVarManager::kTheta] =
494 values[AliDielectronVarManager::kEta] = particle->Eta();
495 values[AliDielectronVarManager::kY] =
497 values[AliDielectronVarManager::kE] = particle->Energy();
498 values[AliDielectronVarManager::kM] = particle->GetMass();
500 values[AliDielectronVarManager::kCharge] = particle->GetPDG()->Charge()/3; // uggly