]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG3/dielectron/AliDielectronVarManager.h
Including new DPs for local simulation, and Shuttle nightly tests, according to bug...
[u/mrichter/AliRoot.git] / PWG3 / dielectron / AliDielectronVarManager.h
CommitLineData
b2a297fa 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 */
5
6//#############################################################
7//# #
8//# Class AliDielectronVarManager #
9//# Class for management of available variables #
10//# #
11//# Authors: #
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 #
572b0139 15//# Markus Köhler, GSI / M.Koehler@gsi.de #
6551594b 16//# Frederick Kramer, Uni Ffm / Frederick.Kramer@cern.ch #
b2a297fa 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 #
20//# #
21//#############################################################
22
23
24#include <TNamed.h>
25
26#include <AliVEvent.h>
27#include <AliESDEvent.h>
6551594b 28#include <AliAODEvent.h>
29#include <AliMCEvent.h>
30#include <AliVVertex.h>
31#include <AliESDVertex.h>
b2a297fa 32
33#include <AliVParticle.h>
b2a297fa 34#include <AliESDtrack.h>
35#include <AliAODTrack.h>
572b0139 36#include <AliAODPid.h>
b2a297fa 37#include <AliKFParticle.h>
572b0139 38#include <AliKFVertex.h>
b2a297fa 39#include <AliMCParticle.h>
40#include <AliAODMCParticle.h>
41#include <AliVTrack.h> // ?
42
6551594b 43#include <AliExternalTrackParam.h>
44#include <AliESDpid.h>
4649c75b 45#include <AliCentrality.h>
2a14a7b1 46#include <AliAODpidUtil.h>
8df8e382 47#include <AliPID.h>
6551594b 48
b2a297fa 49#include "AliDielectronPair.h"
8df8e382 50#include "AliDielectronMC.h"
48609e3d 51#include "AliDielectronPID.h"
b2a297fa 52
53class AliVEvent;
54
55//________________________________________________________________
56class AliDielectronVarManager : public TNamed {
57
58public:
8df8e382 59
b2a297fa 60 // Particle specific variables
61 enum ValueTypes {
62 kPx = 0, // px
63 kPy, // py
64 kPz, // pz
65 kPt, // transverse momentum
66 kP, // momentum
67 kXv, // vertex position in x
68 kYv, // vertex position in y
69 kZv, // vertex position in z
70 kOneOverPt, // 1/pt
71 kPhi, // phi angle
72 kTheta, // theta angle
73 kEta, // pseudo-rapidity
74 kY, // rapidity
75 kE, // energy
76 kM, // mass
77 kCharge, // charge
78 kNclsITS, // number of clusters assigned in the ITS
79 kNclsTPC, // number of clusters assigned in the TPC
554e40f8 80 kNclsTPCiter1, // number of clusters assigned in the TPC after first iteration
b2a297fa 81 kNFclsTPC, // number of findable clusters in the TPC
45b2b1b8 82 kNFclsTPCr, // number of findable clusters in the TPC with more robust definition
fb7d2d99 83 kNFclsTPCrFrac, // number of found/findable clusters in the TPC with more robust definition
b2a297fa 84 kTPCsignalN, // number of points used for dEdx
61d106d3 85 kTPCchi2Cl, // chi2/cl in TPC
86 kTrackStatus, // track status bits
8df8e382 87
b2a297fa 88 kNclsTRD, // number of clusters assigned in the TRD
89 kTRDntracklets, // number of TRD tracklets used for tracking/PID TODO: correct getter
90 kTRDpidQuality, // number of TRD tracklets used for PID
8df8e382 91 kTRDprobEle, // TRD electron pid probability
92 kTRDprobPio, // TRD electron pid probability
93
b2a297fa 94 kImpactParXY, // Impact parameter in XY plane
95 kImpactParZ, // Impact parameter in Z
96 kTrackLength, // Track length
97 kPdgCode, // PDG code
8df8e382 98
99 kPdgCodeMother, // PDG code of the mother
100
101 kNumberOfDaughters, // number of daughters
102 kHaveSameMother, // check that particles have the same mother (MC)
fb7d2d99 103 kIsJpsiPrimary, // check if the particle is primary (MC)
8df8e382 104 kITSsignal, // ITS dE/dx signal
105 kITSsignalSSD1, // SSD1 dE/dx signal
106 kITSsignalSSD2, // SSD2 dE/dx signal
107 kITSsignalSDD1, // SDD1 dE/dx signal
108 kITSsignalSDD2, // SDD2 dE/dx signal
3505bfad 109 kITSclusterMap, // ITS cluster map
9143d69f 110 kITSnSigmaEle, // number of sigmas to the dE/dx electron line in the ITS
111 kITSnSigmaPio, // number of sigmas to the dE/dx pion line in the ITS
112 kITSnSigmaMuo, // number of sigmas to the dE/dx muon line in the ITS
113 kITSnSigmaKao, // number of sigmas to the dE/dx kaon line in the ITS
114 kITSnSigmaPro, // number of sigmas to the dE/dx proton line in the ITS
8df8e382 115
b2a297fa 116 kPIn, // momentum at inner wall of TPC (if available), used for PID
117 kTPCsignal, // TPC dE/dx signal
572b0139 118
6551594b 119 kTPCnSigmaEle, // number of sigmas to the dE/dx electron line in the TPC
572b0139 120 kTPCnSigmaPio, // number of sigmas to the dE/dx pion line in the TPC
121 kTPCnSigmaMuo, // number of sigmas to the dE/dx muon line in the TPC
122 kTPCnSigmaKao, // number of sigmas to the dE/dx kaon line in the TPC
123 kTPCnSigmaPro, // number of sigmas to the dE/dx proton line in the TPC
124
8df8e382 125 kTOFnSigmaEle, // number of sigmas to the pion line in the TOF
572b0139 126 kTOFnSigmaPio, // number of sigmas to the pion line in the TOF
127 kTOFnSigmaMuo, // number of sigmas to the muon line in the TOF
128 kTOFnSigmaKao, // number of sigmas to the kaon line in the TOF
129 kTOFnSigmaPro, // number of sigmas to the proton line in the TOF
8df8e382 130
ffbede40 131 kKinkIndex0, // kink index 0
132
b2a297fa 133 kParticleMax, //
134 // TODO: kRNClusters ??
135 // AliDielectronPair specific variables
136 kChi2NDF = kParticleMax, // Chi^2/NDF
137 kDecayLength, // decay length
138 kR, // distance to the origin
139 kOpeningAngle, // opening angle
8df8e382 140 // helicity picture: Z-axis is considered the direction of the mother's 3-momentum vector
141 kThetaHE, // theta in mother's rest frame in the helicity picture
142 kPhiHE, // phi in mother's rest frame in the helicity picture
143 // Collins-Soper picture: Z-axis is considered the direction of the vectorial difference between
144 // the 3-mom vectors of target and projectile beams
145 kThetaCS, // theta in mother's rest frame in Collins-Soper picture
146 kPhiCS, // phi in mother's rest frame in Collins-Soper picture
572b0139 147 kLegDist, // distance of the legs
148 kLegDistXY, // distance of the legs in XY
61d106d3 149 kDeltaEta, // Absolute value of Delta Eta for the legs
150 kDeltaPhi, // Absolute value of Delta Phi for the legs
b2a297fa 151 kMerr, // error of mass calculation
152 kDCA, // distance of closest approach TODO: not implemented yet
153 kPairType, // type of the pair, like like sign ++ unlikesign ...
154 kPairMax, //
155 // Event specific variables
6551594b 156 kXvPrim=kPairMax, // prim vertex
157 kYvPrim, // prim vertex
158 kZvPrim, // prim vertex
159 kXRes, // primary vertex x-resolution
160 kYRes, // primary vertex y-resolution
161 kZRes, // primary vertex z-resolution
b2a297fa 162 kNTrk, // number of tracks (or tracklets)
6551594b 163 kTracks, // ESD tracks
ffbede40 164 kCentrality, // event centrality fraction
6551594b 165 kNevents, // event counter
b2a297fa 166 kNMaxValues //
167 // TODO: (for A+A) ZDCEnergy, impact parameter, Iflag??
168 };
169
170
171 AliDielectronVarManager();
172 AliDielectronVarManager(const char* name, const char* title);
173 virtual ~AliDielectronVarManager();
174 static void Fill(const TObject* particle, Double_t * const values);
175
6551594b 176 static void InitESDpid(Int_t type=0);
2a14a7b1 177 static void InitAODpidUtil(Int_t type=0);
572b0139 178 static void SetESDpid(AliESDpid * const pid) {fgESDpid=pid;}
179 static AliESDpid* GetESDpid() {return fgESDpid;}
2a14a7b1 180 static AliAODpidUtil* GetAODpidUtil() {return fgAODpidUtil;}
572b0139 181 static void SetEvent(AliVEvent * const ev);
2a14a7b1 182 static Bool_t GetDCA(const AliAODTrack *track, Double_t d0z0[2]);
183
b2a297fa 184 static const char* GetValueName(Int_t i) { return (i>=0&&i<kNMaxValues)?fgkParticleNames[i]:""; }
185private:
186
187 static const char* fgkParticleNames[kNMaxValues]; //variable names
188
189 static void FillVarVParticle(const AliVParticle *particle, Double_t * const values);
190 static void FillVarESDtrack(const AliESDtrack *particle, Double_t * const values);
191 static void FillVarAODTrack(const AliAODTrack *particle, Double_t * const values);
8df8e382 192 static void FillVarMCParticle(const AliMCParticle *particle, Double_t * const values);
b2a297fa 193 static void FillVarAODMCParticle(const AliAODMCParticle *particle, Double_t * const values);
194 static void FillVarDielectronPair(const AliDielectronPair *pair, Double_t * const values);
1201a1a9 195 static void FillVarKFParticle(const AliKFParticle *pair, Double_t * const values);
196
6551594b 197 static void FillVarVEvent(const AliVEvent *event, Double_t * const values);
198 static void FillVarESDEvent(const AliESDEvent *event, Double_t * const values);
199 static void FillVarAODEvent(const AliAODEvent *event, Double_t * const values);
200 static void FillVarMCEvent(const AliMCEvent *event, Double_t * const values);
8df8e382 201
2a14a7b1 202 static AliESDpid *fgESDpid; // ESD pid object
203 static AliAODpidUtil *fgAODpidUtil; // AOD pid object
204 static AliVEvent *fgEvent; // current event pointer
205 static AliKFVertex *fgKFVertex; // kf vertex
572b0139 206
b2a297fa 207 AliDielectronVarManager(const AliDielectronVarManager &c);
208 AliDielectronVarManager &operator=(const AliDielectronVarManager &c);
209
210 ClassDef(AliDielectronVarManager,1);
211};
212
213
214//Inline functions
6551594b 215inline void AliDielectronVarManager::Fill(const TObject* object, Double_t * const values)
b2a297fa 216{
217 //
218 // Main function to fill all available variables according to the type of particle
219 //
6551594b 220 if (object->IsA() == AliESDtrack::Class()) FillVarESDtrack(static_cast<const AliESDtrack*>(object), values);
221 else if (object->IsA() == AliAODTrack::Class()) FillVarAODTrack(static_cast<const AliAODTrack*>(object), values);
222 else if (object->IsA() == AliMCParticle::Class()) FillVarMCParticle(static_cast<const AliMCParticle*>(object), values);
223 else if (object->IsA() == AliAODMCParticle::Class()) FillVarAODMCParticle(static_cast<const AliAODMCParticle*>(object), values);
224 else if (object->IsA() == AliDielectronPair::Class()) FillVarDielectronPair(static_cast<const AliDielectronPair*>(object), values);
1201a1a9 225 else if (object->IsA() == AliKFParticle::Class()) FillVarKFParticle(static_cast<const AliKFParticle*>(object),values);
6551594b 226 // Main function to fill all available variables according to the type of event
227
228 else if (object->IsA() == AliVEvent::Class()) FillVarVEvent(static_cast<const AliVEvent*>(object), values);
229 else if (object->IsA() == AliESDEvent::Class()) FillVarESDEvent(static_cast<const AliESDEvent*>(object), values);
230 else if (object->IsA() == AliAODEvent::Class()) FillVarAODEvent(static_cast<const AliAODEvent*>(object), values);
231 else if (object->IsA() == AliMCEvent::Class()) FillVarMCEvent(static_cast<const AliMCEvent*>(object), values);
1201a1a9 232// else printf(Form("AliDielectronVarManager::Fill: Type %s is not supported by AliDielectronVarManager!", object->ClassName())); //TODO: implement without object needed
b2a297fa 233}
234
235inline void AliDielectronVarManager::FillVarVParticle(const AliVParticle *particle, Double_t * const values)
236{
237 //
238 // Fill track information available in AliVParticle into an array
239 //
240 values[AliDielectronVarManager::kPx] = particle->Px();
241 values[AliDielectronVarManager::kPy] = particle->Py();
242 values[AliDielectronVarManager::kPz] = particle->Pz();
243 values[AliDielectronVarManager::kPt] = particle->Pt();
244 values[AliDielectronVarManager::kP] = particle->P();
245
246 values[AliDielectronVarManager::kXv] = particle->Xv();
247 values[AliDielectronVarManager::kYv] = particle->Yv();
248 values[AliDielectronVarManager::kZv] = particle->Zv();
249
250 values[AliDielectronVarManager::kOneOverPt] = particle->OneOverPt();
251 values[AliDielectronVarManager::kPhi] = particle->Phi();
252 values[AliDielectronVarManager::kTheta] = particle->Theta();
253 values[AliDielectronVarManager::kEta] = particle->Eta();
254 values[AliDielectronVarManager::kY] = particle->Y();
8df8e382 255
b2a297fa 256 values[AliDielectronVarManager::kE] = particle->E();
257 values[AliDielectronVarManager::kM] = particle->M();
258 values[AliDielectronVarManager::kCharge] = particle->Charge();
2a14a7b1 259
260 values[AliDielectronVarManager::kPdgCode] = particle->PdgCode();
261
6551594b 262 if ( fgEvent ) AliDielectronVarManager::Fill(fgEvent, values);
b2a297fa 263}
264
265inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle, Double_t * const values)
266{
267 //
268 // Fill track information available for histogramming into an array
269 //
270
271 // Fill common AliVParticle interface information
272 FillVarVParticle(particle, values);
273
8df8e382 274 Double_t pidProbs[AliPID::kSPECIES];
b2a297fa 275 // Fill AliESDtrack interface specific information
164bfb53 276 Double_t tpcNcls=particle->GetTPCNcls();
b2a297fa 277 values[AliDielectronVarManager::kNclsITS] = particle->GetNcls(0); // TODO: get rid of the plain numbers
61d106d3 278 values[AliDielectronVarManager::kNclsTPC] = tpcNcls; // TODO: get rid of the plain numbers
ffbede40 279 values[AliDielectronVarManager::kNclsTPCiter1] = particle->GetTPCNclsIter1(); // TODO: get rid of the plain numbers
b2a297fa 280 values[AliDielectronVarManager::kNFclsTPC] = particle->GetTPCNclsF();
45b2b1b8 281 values[AliDielectronVarManager::kNFclsTPCr] = particle->GetTPCClusterInfo(2,1);
fb7d2d99 282 values[AliDielectronVarManager::kNFclsTPCrFrac] = particle->GetTPCClusterInfo(2);
b2a297fa 283 values[AliDielectronVarManager::kTPCsignalN] = particle->GetTPCsignalN();
284 values[AliDielectronVarManager::kNclsTRD] = particle->GetNcls(2); // TODO: get rid of the plain numbers
285 values[AliDielectronVarManager::kTRDntracklets] = particle->GetTRDntracklets(); // TODO: GetTRDtracklets/GetTRDntracklets?
286 values[AliDielectronVarManager::kTRDpidQuality] = particle->GetTRDpidQuality();
61d106d3 287 values[AliDielectronVarManager::kTrackStatus] = (Double_t)particle->GetStatus();
288
289
290 values[AliDielectronVarManager::kTPCchi2Cl] = -1;
291 if (tpcNcls>0) values[AliDielectronVarManager::kTPCchi2Cl] = particle->GetTPCchi2() / tpcNcls;
8df8e382 292 //TRD pidProbs
293 particle->GetTRDpid(pidProbs);
294 values[AliDielectronVarManager::kTRDprobEle] = pidProbs[AliPID::kElectron];
295 values[AliDielectronVarManager::kTRDprobPio] = pidProbs[AliPID::kPion];
ffbede40 296
297 values[AliDielectronVarManager::kKinkIndex0] = particle->GetKinkIndex(0);
8df8e382 298
b2a297fa 299 Float_t impactParXY, impactParZ;
300 particle->GetImpactParameters(impactParXY, impactParZ);
301 values[AliDielectronVarManager::kImpactParXY] = impactParXY;
302 values[AliDielectronVarManager::kImpactParZ] = impactParZ;
303
8df8e382 304
305 values[AliDielectronVarManager::kPdgCode]=0;
306 values[AliDielectronVarManager::kPdgCodeMother]=0;
307
308 values[AliDielectronVarManager::kNumberOfDaughters]=-999;
309
310 AliDielectronMC *mc=AliDielectronMC::Instance();
311
312 if (mc->HasMC()){
313 if (mc->GetMCTrack(particle))
314 values[AliDielectronVarManager::kPdgCode]=
315 mc->GetMCTrack(particle)->PdgCode();
316
317 Int_t pdgMother=mc->GetMotherPDG(particle);
318 if (pdgMother!=-999)
319 values[AliDielectronVarManager::kPdgCodeMother]=pdgMother;
320
321 values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle);
322 } //if(mc->HasMC())
323
324
325
326 values[AliDielectronVarManager::kITSsignal] = particle->GetITSsignal();
327
328 Double_t itsdEdx[4];
329 particle->GetITSdEdxSamples(itsdEdx);
330
331 values[AliDielectronVarManager::kITSsignalSSD1] = itsdEdx[0];
332 values[AliDielectronVarManager::kITSsignalSSD2] = itsdEdx[1];
333 values[AliDielectronVarManager::kITSsignalSDD1] = itsdEdx[2];
334 values[AliDielectronVarManager::kITSsignalSDD2] = itsdEdx[3];
3505bfad 335 values[AliDielectronVarManager::kITSclusterMap] = particle->GetITSClusterMap();
336
b2a297fa 337 values[AliDielectronVarManager::kTrackLength] = particle->GetIntegratedLength();
b2a297fa 338 //dEdx information
339 Double_t mom = particle->GetP();
340 const AliExternalTrackParam *in=particle->GetInnerParam();
341 if (in) mom = in->GetP();
342 values[AliDielectronVarManager::kPIn]=mom;
343 values[AliDielectronVarManager::kTPCsignal]=particle->GetTPCsignal();
6551594b 344 // nsigma to Electron band
345 // TODO: for the moment we set the bethe bloch parameters manually
346 // this should be changed in future!
48609e3d 347
2a14a7b1 348 values[AliDielectronVarManager::kTPCnSigmaEle]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kElectron)-AliDielectronPID::GetCorrVal();
572b0139 349 values[AliDielectronVarManager::kTPCnSigmaPio]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kPion);
350 values[AliDielectronVarManager::kTPCnSigmaMuo]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kMuon);
351 values[AliDielectronVarManager::kTPCnSigmaKao]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kKaon);
352 values[AliDielectronVarManager::kTPCnSigmaPro]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kProton);
353
9143d69f 354 values[AliDielectronVarManager::kITSnSigmaEle]=fgESDpid->NumberOfSigmasITS(particle,AliPID::kElectron);
355 values[AliDielectronVarManager::kITSnSigmaPio]=fgESDpid->NumberOfSigmasITS(particle,AliPID::kPion);
356 values[AliDielectronVarManager::kITSnSigmaMuo]=fgESDpid->NumberOfSigmasITS(particle,AliPID::kMuon);
357 values[AliDielectronVarManager::kITSnSigmaKao]=fgESDpid->NumberOfSigmasITS(particle,AliPID::kKaon);
358 values[AliDielectronVarManager::kITSnSigmaPro]=fgESDpid->NumberOfSigmasITS(particle,AliPID::kProton);
359
572b0139 360 Double_t t0=fgESDpid->GetTOFResponse().GetTimeZero();
8df8e382 361 values[AliDielectronVarManager::kTOFnSigmaEle]=fgESDpid->NumberOfSigmasTOF(particle,AliPID::kElectron,t0);
572b0139 362 values[AliDielectronVarManager::kTOFnSigmaPio]=fgESDpid->NumberOfSigmasTOF(particle,AliPID::kPion,t0);
363 values[AliDielectronVarManager::kTOFnSigmaMuo]=fgESDpid->NumberOfSigmasTOF(particle,AliPID::kMuon,t0);
364 values[AliDielectronVarManager::kTOFnSigmaKao]=fgESDpid->NumberOfSigmasTOF(particle,AliPID::kKaon,t0);
365 values[AliDielectronVarManager::kTOFnSigmaPro]=fgESDpid->NumberOfSigmasTOF(particle,AliPID::kProton,t0);
b2a297fa 366}
367
368inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle, Double_t * const values)
369{
370 //
371 // Fill track information available for histogramming into an array
372 //
373
374 // Fill common AliVParticle interface information
375 FillVarVParticle(particle, values);
572b0139 376
377 // Reset AliESDtrack interface specific information
378 values[AliDielectronVarManager::kNclsITS] = 0;
164bfb53 379 values[AliDielectronVarManager::kNclsTPC] = particle->GetTPCNcls();
554e40f8 380 values[AliDielectronVarManager::kNclsTPCiter1] = particle->GetTPCNcls(); // not really available in AOD
572b0139 381 values[AliDielectronVarManager::kNFclsTPC] = 0;
fb7d2d99 382 values[AliDielectronVarManager::kNFclsTPCr] = 0;
383 values[AliDielectronVarManager::kNFclsTPCrFrac] = 0;
572b0139 384 values[AliDielectronVarManager::kNclsTRD] = 0;
385 values[AliDielectronVarManager::kTRDntracklets] = 0;
386 values[AliDielectronVarManager::kTRDpidQuality] = 0;
61d106d3 387
388 values[AliDielectronVarManager::kTPCchi2Cl] = -1;
389 values[AliDielectronVarManager::kTrackStatus] = (Double_t)particle->GetStatus();
390
8df8e382 391 //TRD pidProbs
392 //TODO: set correctly
393 values[AliDielectronVarManager::kTRDprobEle] = 0;
394 values[AliDielectronVarManager::kTRDprobPio] = 0;
395
572b0139 396 //TODO: This is only an approximation!!!
2a14a7b1 397 values[AliDielectronVarManager::kTPCsignalN] = 0;
572b0139 398
2a14a7b1 399 // Fill AliAODTrack interface information
400 //
401 Double_t d0z0[2];
402 GetDCA(particle, d0z0);
403 values[AliDielectronVarManager::kImpactParXY] = d0z0[0];
404 values[AliDielectronVarManager::kImpactParZ] = d0z0[1];
572b0139 405
406 values[AliDielectronVarManager::kPIn]=0;
407 values[AliDielectronVarManager::kTPCsignal]=0;
408
409 values[AliDielectronVarManager::kTPCnSigmaEle]=0;
410 values[AliDielectronVarManager::kTPCnSigmaPio]=0;
411 values[AliDielectronVarManager::kTPCnSigmaMuo]=0;
412 values[AliDielectronVarManager::kTPCnSigmaKao]=0;
413 values[AliDielectronVarManager::kTPCnSigmaPro]=0;
b2a297fa 414
3505bfad 415 values[AliDielectronVarManager::kITSclusterMap] = particle->GetITSClusterMap();
572b0139 416
417 AliAODPid *pid=particle->GetDetPid();
418 if (pid){
419 Double_t mom =pid->GetTPCmomentum();
2a14a7b1 420 values[AliDielectronVarManager::kTPCsignalN] = pid->GetTPCsignalN();
421 Double_t tpcNsigmaEle=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kElectron);
422 Double_t tpcNsigmaPio=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kPion);
423 Double_t tpcNsigmaMuo=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kMuon);
424 Double_t tpcNsigmaKao=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kKaon);
425 Double_t tpcNsigmaPro=fgAODpidUtil->NumberOfSigmasTPC(particle,AliPID::kProton);
572b0139 426
164bfb53 427 values[AliDielectronVarManager::kPIn]=mom;
572b0139 428 values[AliDielectronVarManager::kTPCsignal]=pid->GetTPCsignal();
429
430 values[AliDielectronVarManager::kTPCnSigmaEle]=tpcNsigmaEle;
431 values[AliDielectronVarManager::kTPCnSigmaPio]=tpcNsigmaPio;
432 values[AliDielectronVarManager::kTPCnSigmaMuo]=tpcNsigmaMuo;
433 values[AliDielectronVarManager::kTPCnSigmaKao]=tpcNsigmaKao;
434 values[AliDielectronVarManager::kTPCnSigmaPro]=tpcNsigmaPro;
435
436 values[AliDielectronVarManager::kTRDntracklets] = 0;
437 values[AliDielectronVarManager::kTRDpidQuality] = 0;
438
439 }
b2a297fa 440}
441
442inline void AliDielectronVarManager::FillVarMCParticle(const AliMCParticle *particle, Double_t * const values)
443{
444 //
445 // Fill track information available for histogramming into an array
446 //
447
554e40f8 448 values[AliDielectronVarManager::kNclsITS] = 0;
449 values[AliDielectronVarManager::kNclsTPC] = 0;
450 values[AliDielectronVarManager::kNclsTPCiter1] = 0;
451 values[AliDielectronVarManager::kNFclsTPC] = 0;
fb7d2d99 452 values[AliDielectronVarManager::kNFclsTPCr] = 0;
453 values[AliDielectronVarManager::kNFclsTPCrFrac] = 0;
554e40f8 454 values[AliDielectronVarManager::kNclsTRD] = 0;
455 values[AliDielectronVarManager::kTRDntracklets] = 0;
456 values[AliDielectronVarManager::kTRDpidQuality] = 0;
457 values[AliDielectronVarManager::kTPCchi2Cl] = 0;
458 values[AliDielectronVarManager::kTrackStatus] = 0;
459 values[AliDielectronVarManager::kTRDprobEle] = 0;
460 values[AliDielectronVarManager::kTRDprobPio] = 0;
461 values[AliDielectronVarManager::kTPCsignalN] = 0;
462 values[AliDielectronVarManager::kImpactParXY] = 0;
463 values[AliDielectronVarManager::kImpactParZ] = 0;
464 values[AliDielectronVarManager::kPIn] = 0;
465 values[AliDielectronVarManager::kTPCsignal] = 0;
466 values[AliDielectronVarManager::kTPCnSigmaEle] = 0;
467 values[AliDielectronVarManager::kTPCnSigmaPio] = 0;
468 values[AliDielectronVarManager::kTPCnSigmaMuo] = 0;
469 values[AliDielectronVarManager::kTPCnSigmaKao] = 0;
470 values[AliDielectronVarManager::kTPCnSigmaPro] = 0;
471 values[AliDielectronVarManager::kITSclusterMap] = 0;
472
473 values[AliDielectronVarManager::kPdgCode] = 0;
474 values[AliDielectronVarManager::kPdgCodeMother] = 0;
475
b2a297fa 476 // Fill common AliVParticle interface information
477 FillVarVParticle(particle, values);
8df8e382 478
479 AliDielectronMC *mc=AliDielectronMC::Instance();
480
b2a297fa 481 // Fill AliMCParticle interface specific information
482 values[AliDielectronVarManager::kPdgCode] = particle->PdgCode();
8df8e382 483
484 AliMCParticle *mother = mc->GetMCTrackMother(particle);
485 if (mother) values[AliDielectronVarManager::kPdgCodeMother] = mother->PdgCode();
486
fb7d2d99 487 values[AliDielectronVarManager::kIsJpsiPrimary] = mc->IsJpsiPrimary(particle);
8df8e382 488 values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle);
b2a297fa 489}
490
491inline void AliDielectronVarManager::FillVarAODMCParticle(const AliAODMCParticle *particle, Double_t * const values)
492{
493 //
494 // Fill track information available for histogramming into an array
495 //
496
554e40f8 497 values[AliDielectronVarManager::kNclsITS] = 0;
498 values[AliDielectronVarManager::kNclsTPC] = 0;
499 values[AliDielectronVarManager::kNclsTPCiter1] = 0;
500 values[AliDielectronVarManager::kNFclsTPC] = 0;
501 values[AliDielectronVarManager::kNclsTRD] = 0;
502 values[AliDielectronVarManager::kTRDntracklets] = 0;
503 values[AliDielectronVarManager::kTRDpidQuality] = 0;
504 values[AliDielectronVarManager::kTPCchi2Cl] = 0;
505 values[AliDielectronVarManager::kTrackStatus] = 0;
506 values[AliDielectronVarManager::kTRDprobEle] = 0;
507 values[AliDielectronVarManager::kTRDprobPio] = 0;
508 values[AliDielectronVarManager::kTPCsignalN] = 0;
509 values[AliDielectronVarManager::kImpactParXY] = 0;
510 values[AliDielectronVarManager::kImpactParZ] = 0;
511 values[AliDielectronVarManager::kPIn] = 0;
512 values[AliDielectronVarManager::kTPCsignal] = 0;
513 values[AliDielectronVarManager::kTPCnSigmaEle] = 0;
514 values[AliDielectronVarManager::kTPCnSigmaPio] = 0;
515 values[AliDielectronVarManager::kTPCnSigmaMuo] = 0;
516 values[AliDielectronVarManager::kTPCnSigmaKao] = 0;
517 values[AliDielectronVarManager::kTPCnSigmaPro] = 0;
518 values[AliDielectronVarManager::kITSclusterMap] = 0;
519
520 values[AliDielectronVarManager::kPdgCode] = 0;
521 values[AliDielectronVarManager::kPdgCodeMother] = 0;
522
b2a297fa 523 // Fill common AliVParticle interface information
524 FillVarVParticle(particle, values);
554e40f8 525
8df8e382 526 AliDielectronMC *mc=AliDielectronMC::Instance();
527
528
b2a297fa 529 // Fill AliAODMCParticle interface specific information
8df8e382 530 values[AliDielectronVarManager::kPdgCode] = particle->PdgCode();
531
532 AliVParticle *mother = mc->GetMCTrackMother(particle);
533 if (mother) values[AliDielectronVarManager::kPdgCodeMother] = mother->PdgCode();
fb7d2d99 534 values[AliDielectronVarManager::kIsJpsiPrimary] = mc->IsJpsiPrimary(particle);
8df8e382 535
536 values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle);
b2a297fa 537}
538
539inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPair *pair, Double_t * const values)
540{
541 //
542 // Fill pair information available for histogramming into an array
543 //
2a14a7b1 544
545 values[AliDielectronVarManager::kPdgCode]=0;
546 values[AliDielectronVarManager::kPdgCodeMother]=0;
547
b2a297fa 548 // Fill common AliVParticle interface information
549 FillVarVParticle(pair, values);
550
551 // Fill AliDielectronPair specific information
552 const AliKFParticle &kfPair = pair->GetKFParticle();
61d106d3 553
554 Double_t thetaHE=0;
555 Double_t phiHE=0;
556 Double_t thetaCS=0;
557 Double_t phiCS=0;
558
559 pair->GetThetaPhiCM(thetaHE,phiHE,thetaCS,phiCS);
560
b2a297fa 561 values[AliDielectronVarManager::kChi2NDF] = kfPair.GetChi2()/kfPair.GetNDF();
562 values[AliDielectronVarManager::kDecayLength] = kfPair.GetDecayLength();
563 values[AliDielectronVarManager::kR] = kfPair.GetR();
564 values[AliDielectronVarManager::kOpeningAngle] = pair->OpeningAngle();
61d106d3 565 values[AliDielectronVarManager::kThetaHE] = thetaHE;
566 values[AliDielectronVarManager::kPhiHE] = phiHE;
567 values[AliDielectronVarManager::kThetaCS] = thetaCS;
568 values[AliDielectronVarManager::kPhiCS] = phiCS;
572b0139 569 values[AliDielectronVarManager::kLegDist] = pair->DistanceDaughters();
570 values[AliDielectronVarManager::kLegDistXY] = pair->DistanceDaughtersXY();
61d106d3 571 values[AliDielectronVarManager::kDeltaEta] = pair->DeltaEta();
572 values[AliDielectronVarManager::kDeltaPhi] = pair->DeltaPhi();
8df8e382 573 values[AliDielectronVarManager::kMerr] = kfPair.GetErrMass()>1e-30&&kfPair.GetMass()>1e-30?kfPair.GetErrMass()/kfPair.GetMass():1000000;
b2a297fa 574 values[AliDielectronVarManager::kPairType] = pair->GetType();
8df8e382 575
576
577
578 AliDielectronMC *mc=AliDielectronMC::Instance();
579
580 if (mc->HasMC()){
581 Bool_t samemother = mc->HaveSameMother(pair);
fb7d2d99 582 values[AliDielectronVarManager::kIsJpsiPrimary] = mc->IsJpsiPrimary(pair);
8df8e382 583 values[AliDielectronVarManager::kHaveSameMother] = samemother ;
584 }//if (mc->HasMC())
585
586
b2a297fa 587}
588
1201a1a9 589inline void AliDielectronVarManager::FillVarKFParticle(const AliKFParticle *particle, Double_t * const values)
590{
591 //
592 // Fill track information available in AliVParticle into an array
593 //
594 values[AliDielectronVarManager::kPx] = particle->GetPx();
595 values[AliDielectronVarManager::kPy] = particle->GetPy();
596 values[AliDielectronVarManager::kPz] = particle->GetPz();
597 values[AliDielectronVarManager::kPt] = particle->GetPt();
598 values[AliDielectronVarManager::kP] = particle->GetP();
599
600 values[AliDielectronVarManager::kXv] = particle->GetX();
601 values[AliDielectronVarManager::kYv] = particle->GetY();
602 values[AliDielectronVarManager::kZv] = particle->GetZ();
603
604 values[AliDielectronVarManager::kOneOverPt] = 0;
605 values[AliDielectronVarManager::kPhi] = particle->GetPhi();
606 values[AliDielectronVarManager::kTheta] = 0.;
607 values[AliDielectronVarManager::kEta] = particle->GetEta();
608 values[AliDielectronVarManager::kY] = ((particle->GetE()*particle->GetE()-particle->GetPx()*particle->GetPx()-particle->GetPy()*particle->GetPy()-particle->GetPz()*particle->GetPz())>0.) ? TLorentzVector(particle->GetPx(),particle->GetPy(),particle->GetPz(),particle->GetE()).Rapidity() : -1111.;
609
610 values[AliDielectronVarManager::kE] = particle->GetE();
611 values[AliDielectronVarManager::kM] = particle->GetMass();
612 values[AliDielectronVarManager::kCharge] = particle->GetQ();
613
614 values[AliDielectronVarManager::kNclsITS] = 0;
615 values[AliDielectronVarManager::kNclsTPC] = 0;
616 values[AliDielectronVarManager::kNclsTPCiter1] = 0;
617 values[AliDielectronVarManager::kNFclsTPC] = 0;
618 values[AliDielectronVarManager::kNclsTRD] = 0;
619 values[AliDielectronVarManager::kTRDntracklets] = 0;
620 values[AliDielectronVarManager::kTRDpidQuality] = 0;
621 values[AliDielectronVarManager::kTPCchi2Cl] = 0;
622 values[AliDielectronVarManager::kTrackStatus] = 0;
623 values[AliDielectronVarManager::kTRDprobEle] = 0;
624 values[AliDielectronVarManager::kTRDprobPio] = 0;
625 values[AliDielectronVarManager::kTPCsignalN] = 0;
626 values[AliDielectronVarManager::kImpactParXY] = 0;
627 values[AliDielectronVarManager::kImpactParZ] = 0;
628 values[AliDielectronVarManager::kPIn] = 0;
629 values[AliDielectronVarManager::kTPCsignal] = 0;
630 values[AliDielectronVarManager::kTPCnSigmaEle] = 0;
631 values[AliDielectronVarManager::kTPCnSigmaPio] = 0;
632 values[AliDielectronVarManager::kTPCnSigmaMuo] = 0;
633 values[AliDielectronVarManager::kTPCnSigmaKao] = 0;
634 values[AliDielectronVarManager::kTPCnSigmaPro] = 0;
635 values[AliDielectronVarManager::kITSclusterMap] = 0;
636
637 values[AliDielectronVarManager::kPdgCode] = 0;
638 values[AliDielectronVarManager::kPdgCodeMother] = 0;
639
640
641 if ( fgEvent ) AliDielectronVarManager::Fill(fgEvent, values);
642}
6551594b 643
644inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Double_t * const values)
645{
646 //
647 // Fill event information available for histogramming into an array
648 //
649 const AliVVertex *primVtx = event->GetPrimaryVertex();
8df8e382 650
651 values[AliDielectronVarManager::kXvPrim] = 0;
652 values[AliDielectronVarManager::kYvPrim] = 0;
653 values[AliDielectronVarManager::kZvPrim] = 0;
654 values[AliDielectronVarManager::kChi2NDF] = 0;
655
656 values[AliDielectronVarManager::kNTrk] = 0;
657 values[AliDielectronVarManager::kNevents] = 0; //always fill bin 0;
658
659 if (!primVtx) return;
660
6551594b 661 values[AliDielectronVarManager::kXvPrim] = primVtx->GetX();
662 values[AliDielectronVarManager::kYvPrim] = primVtx->GetY();
663 values[AliDielectronVarManager::kZvPrim] = primVtx->GetZ();
664 values[AliDielectronVarManager::kChi2NDF] = primVtx->GetChi2perNDF();
665
666 values[AliDielectronVarManager::kNTrk] = event->GetNumberOfTracks();
6551594b 667}
668
669inline void AliDielectronVarManager::FillVarESDEvent(const AliESDEvent *event, Double_t * const values)
670{
671 //
672 // Fill event information available for histogramming into an array
673 //
674
675 // Fill common AliVEvent interface information
676 FillVarVEvent(event, values);
ffbede40 677
678 Double_t centralityF=-1;
4649c75b 679 AliCentrality *esdCentrality = const_cast<AliESDEvent*>(event)->GetCentrality();
ffbede40 680 if (esdCentrality) centralityF = esdCentrality->GetCentralityPercentile("V0M");
681
6551594b 682 // Fill AliESDEvent interface specific information
683 const AliESDVertex *primVtx = event->GetPrimaryVertex();
684 values[AliDielectronVarManager::kXRes] = primVtx->GetXRes();
685 values[AliDielectronVarManager::kYRes] = primVtx->GetYRes();
686 values[AliDielectronVarManager::kZRes] = primVtx->GetZRes();
ffbede40 687 values[AliDielectronVarManager::kCentrality] = centralityF;
6551594b 688}
689
690inline void AliDielectronVarManager::FillVarAODEvent(const AliAODEvent *event, Double_t * const values)
691{
692 //
693 // Fill event information available for histogramming into an array
694 //
695
696 // Fill common AliVEvent interface information
697 FillVarVEvent(event, values);
698
699 // Fill AliAODEvent interface specific information
700}
701
702inline void AliDielectronVarManager::FillVarMCEvent(const AliMCEvent *event, Double_t * const values)
703{
704 //
705 // Fill event information available for histogramming into an array
706 //
707
708 // Fill common AliVEvent interface information
709 FillVarVEvent(event, values);
710
711 // Fill AliMCEvent interface specific information
712}
713
714inline void AliDielectronVarManager::InitESDpid(Int_t type)
715{
716 //
717 // initialize PID parameters
718 // type=0 is simulation
719 // type=1 is data
720
572b0139 721 if (!fgESDpid) fgESDpid=new AliESDpid;
6551594b 722 Double_t alephParameters[5];
723 // simulation
724 alephParameters[0] = 2.15898e+00/50.;
725 alephParameters[1] = 1.75295e+01;
726 alephParameters[2] = 3.40030e-09;
727 alephParameters[3] = 1.96178e+00;
728 alephParameters[4] = 3.91720e+00;
8df8e382 729 fgESDpid->GetTOFResponse().SetTimeResolution(80.);
6551594b 730
731 // data
83e37742 732 if (type==1){
733 alephParameters[0] = 0.0283086/0.97;
6551594b 734 alephParameters[1] = 2.63394e+01;
735 alephParameters[2] = 5.04114e-11;
736 alephParameters[3] = 2.12543e+00;
737 alephParameters[4] = 4.88663e+00;
8df8e382 738 fgESDpid->GetTOFResponse().SetTimeResolution(130.);
83e37742 739 fgESDpid->GetTPCResponse().SetMip(50.);
6551594b 740 }
741
742 fgESDpid->GetTPCResponse().SetBetheBlochParameters(
743 alephParameters[0],alephParameters[1],alephParameters[2],
744 alephParameters[3],alephParameters[4]);
745
8df8e382 746 fgESDpid->GetTPCResponse().SetSigma(3.79301e-03, 2.21280e+04);
6551594b 747}
748
2a14a7b1 749inline void AliDielectronVarManager::InitAODpidUtil(Int_t type)
750{
751 if (!fgAODpidUtil) fgAODpidUtil=new AliAODpidUtil;
752 Double_t alephParameters[5];
753 // simulation
754 alephParameters[0] = 2.15898e+00/50.;
755 alephParameters[1] = 1.75295e+01;
756 alephParameters[2] = 3.40030e-09;
757 alephParameters[3] = 1.96178e+00;
758 alephParameters[4] = 3.91720e+00;
759 fgAODpidUtil->GetTOFResponse().SetTimeResolution(80.);
760
761 // data
762 if (type==1){
763 alephParameters[0] = 0.0283086/0.97;
764 alephParameters[1] = 2.63394e+01;
765 alephParameters[2] = 5.04114e-11;
766 alephParameters[3] = 2.12543e+00;
767 alephParameters[4] = 4.88663e+00;
768 fgAODpidUtil->GetTOFResponse().SetTimeResolution(130.);
769 fgAODpidUtil->GetTPCResponse().SetMip(50.);
770 }
771
772 fgAODpidUtil->GetTPCResponse().SetBetheBlochParameters(
773 alephParameters[0],alephParameters[1],alephParameters[2],
774 alephParameters[3],alephParameters[4]);
775
776 fgAODpidUtil->GetTPCResponse().SetSigma(3.79301e-03, 2.21280e+04);
777}
778
572b0139 779
780inline void AliDielectronVarManager::SetEvent(AliVEvent * const ev)
781{
782
783 fgEvent = ev;
784 if (fgKFVertex) delete fgKFVertex;
785 fgKFVertex=0x0;
8df8e382 786 if (ev && ev->GetPrimaryVertex()) fgKFVertex=new AliKFVertex(*ev->GetPrimaryVertex());
572b0139 787}
2a14a7b1 788
789
790inline Bool_t AliDielectronVarManager::GetDCA(const AliAODTrack *track, Double_t d0z0[2])
791{
792 if(track->TestBit(AliAODTrack::kIsDCA)){
793 d0z0[0]=track->DCA();
794 d0z0[1]=track->ZAtDCA();
795 return kTRUE;
796 }
797
798 Double_t covd0z0[3];
799 AliAODTrack copy(*track);
800 AliAODVertex *vtx =(AliAODVertex*)(fgEvent->GetPrimaryVertex());
801 Double_t fBzkG = fgEvent->GetMagneticField(); // z componenent of field in kG
802 Bool_t ok = copy.PropagateToDCA(vtx,fBzkG,kVeryBig,d0z0,covd0z0);
803 if(!ok){
804 d0z0[0]=-999.;
805 d0z0[1]=-999.;
806 }
807 return ok;
808}
809
b2a297fa 810/*
811inline void AliDielectronVarManager::FillValues(const TParticle *particle, Double_t *values)
812{
813 //
814 // Fill track information available for histogramming into an array
815 //
816
817 // Fill TParticle interface information
818 values[AliDielectronVarManager::kPx] = particle->Px();
819 values[AliDielectronVarManager::kPy] = particle->Py();
820 values[AliDielectronVarManager::kPz] = particle->Pz();
821 values[AliDielectronVarManager::kPt] = particle->Pt();
822 values[AliDielectronVarManager::kP] = particle->P();
823
824 values[AliDielectronVarManager::kXv] = particle->Vx();
825 values[AliDielectronVarManager::kYv] = particle->Vy();
826 values[AliDielectronVarManager::kZv] = particle->Vz();
827
828 values[AliDielectronVarManager::kOneOverPt] = 1./particle->Pt();
829 values[AliDielectronVarManager::kPhi] = particle->Phi();
830 values[AliDielectronVarManager::kTheta] =
831 values[AliDielectronVarManager::kEta] = particle->Eta();
832 values[AliDielectronVarManager::kY] =
833
834 values[AliDielectronVarManager::kE] = particle->Energy();
835 values[AliDielectronVarManager::kM] = particle->GetMass();
836
837 values[AliDielectronVarManager::kCharge] = particle->GetPDG()->Charge()/3; // uggly
838
839}*/
840
841#endif
fb7d2d99 842