]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGDQ/dielectron/AliDielectronVarManager.h
addtask update
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliDielectronVarManager.h
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       #
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      #
20 //#                                                           #
21 //#############################################################
22
23 #include <TNamed.h>
24 #include <TProfile.h>
25 #include <TProfile2D.h>
26 #include <TProfile3D.h>
27 #include <TH3D.h>
28 #include <THnBase.h>
29 #include <TSpline.h>
30 #include <TFile.h>
31 #include <TDatabasePDG.h>
32 #include <TKey.h>
33 #include <TBits.h>
34 #include <TRandom3.h>
35
36 #include <AliVEvent.h>
37 #include <AliESDEvent.h>
38 #include <AliAODEvent.h>
39 #include <AliMCEvent.h>
40 #include <AliVVertex.h>
41 #include <AliESDVertex.h>
42 #include <AliAODVertex.h>
43 #include <AliEventplane.h>
44
45 #include <AliESDVZERO.h>
46 #include <AliAODVZERO.h>
47
48 #include <AliVParticle.h>
49 #include <AliESDtrack.h>
50 #include <AliAODTrack.h>
51 #include <AliAODPid.h>
52 #include <AliKFParticle.h>
53 #include <AliKFVertex.h>
54 #include <AliMCParticle.h>
55 #include <AliAODMCParticle.h>
56 #include <AliVTrack.h>  // ?
57
58 #include <AliExternalTrackParam.h>
59 #include <AliESDpid.h>
60 #include <AliCentrality.h>
61 #include <AliAODpidUtil.h>
62 #include <AliPID.h>
63 #include <AliPIDResponse.h>
64 #include <AliESDtrackCuts.h>
65
66 #include "AliDielectronPair.h"
67 #include "AliDielectronMC.h"
68 #include "AliDielectronPID.h"
69 #include "AliDielectronHelper.h"
70
71 #include "AliAnalysisManager.h"
72 #include "AliInputEventHandler.h"
73 #include "AliVZEROEPSelectionTask.h"
74
75 #include "AliAODMCHeader.h"
76
77 class AliVEvent;
78
79 //________________________________________________________________
80 class AliDielectronVarManager : public TNamed {
81   
82 public:
83
84   // Particle specific variables
85   enum ValueTypes {
86     kPx = 0,                 // px
87     kPy,                     // py
88     kPz,                     // pz
89     kPt,                     // transverse momentum
90     kPtSq,                   // transverse momentum squared
91     kP,                      // momentum
92     kXv,                     // vertex position in x
93     kYv,                     // vertex position in y
94     kZv,                     // vertex position in z
95     kOneOverPt,              // 1/pt
96     kPhi,                    // phi angle
97     kTheta,                  // theta angle
98     kEta,                    // pseudo-rapidity
99     kY,                      // rapidity
100     kE,                      // energy
101     kM,                      // mass
102     kCharge,                 // charge
103     kNclsITS,                // number of clusters assigned in the ITS
104     kITSchi2Cl,              // chi2/cl in the ITS
105     kNclsTPC,                // number of clusters assigned in the TPC
106     kNclsSTPC,                // number of shared clusters assigned in the TPC
107     kNclsSFracTPC,           // fraction of shared clusters assigned in the TPC
108     kNclsTPCiter1,           // number of clusters assigned in the TPC after first iteration
109     kNFclsTPC,               // number of findable clusters in the TPC
110     kNFclsTPCr,              // number of findable clusters(crossed rows) in the TPC with more robust definition
111     kNFclsTPCrFrac,          // number of found/findable clusters in the TPC with more robust definition
112     kNFclsTPCfCross,         // fraction crossed rows/findable clusters in the TPC, as done in AliESDtrackCuts
113     kTPCsignalN,             // number of points used for dEdx
114     kTPCsignalNfrac,         // fraction of points used for dEdx / cluster used for tracking
115     kTPCchi2Cl,              // chi2/cl in TPC
116     kTPCclsDiff,             // TPC cluster difference
117     kTPCclsSegments,         // TPC cluster segments
118     kTPCclsIRO,             // TPC clusters inner read out
119     kTPCclsORO,             // TPC clusters outer read out
120     kTrackStatus,            // track status bits
121     kFilterBit,              // AOD filter bits
122
123     kNclsTRD,                // number of clusters assigned in the TRD
124     kTRDntracklets,          // number of TRD tracklets used for tracking/PID TODO: correct getter
125     kTRDpidQuality,          // number of TRD tracklets used for PID
126     kTRDchi2,                // chi2 in TRD
127     kTRDprobEle,             // TRD electron pid probability
128     kTRDprobPio,             // TRD electron pid probability
129     kTRDprob2DEle,           // TRD electron pid probability 2D LQ 
130     kTRDprob2DPio,           // TRD electron pid probability 2D LQ
131     kTRDphi,                 // Phi angle of the track at the entrance of the TRD
132     kTRDpidEffLeg,           // TRD pid efficiency from conversion electrons
133     kTRDsignal,              // TRD signal
134       
135     kImpactParXY,            // Impact parameter in XY plane
136     kImpactParZ,             // Impact parameter in Z
137     kTrackLength,            // Track length
138
139
140     kPdgCode,                // PDG code
141     kPdgCodeMother, 
142     kPdgCodeGrandMother,     // PDG code of the grandmother
143     kHasCocktailMother,      // true if particle is added via MC generator cocktail (AliDielectronSignal::kDirect)
144     kHasCocktailGrandMother, // true if particle is added via MC generator cocktail (AliDielectronSignal::kDirect)
145     kNumberOfDaughters,      // number of daughters
146     kHaveSameMother,         // check that particles have the same mother (MC)
147     kIsJpsiPrimary,          // check if the particle is primary (MC)
148     kNumberOfJPsis,          // number of generated inclusive jpsis per event (MC)
149     kNumberOfJPsisPrompt,    // number of generated prompt jpsis per event (MC)
150     kNumberOfJPsisNPrompt,   // number of generated non-prompt jpsis per event (MC)
151
152     kITSsignal,              // ITS dE/dx signal
153     kITSsignalSSD1,          // SSD1 dE/dx signal
154     kITSsignalSSD2,          // SSD2 dE/dx signal
155     kITSsignalSDD1,          // SDD1 dE/dx signal
156     kITSsignalSDD2,          // SDD2 dE/dx signal
157     kITSclusterMap,          // ITS cluster map
158     kITSLayerFirstCls,       // No of innermost ITS layer with a cluster of a track
159     kITSnSigmaEle,           // number of sigmas to the dE/dx electron line in the ITS
160     kITSnSigmaPio,           // number of sigmas to the dE/dx pion line in the ITS
161     kITSnSigmaMuo,           // number of sigmas to the dE/dx muon line in the ITS
162     kITSnSigmaKao,           // number of sigmas to the dE/dx kaon line in the ITS
163     kITSnSigmaPro,           // number of sigmas to the dE/dx proton line in the ITS
164
165     kPIn,                    // momentum at inner wall of TPC (if available), used for PID
166     kPOut,                   // momentum at outer wall of TPC, used for TRD studies
167     kYsignedIn,              // signed local y at inner wall of TPC
168     kTPCsignal,              // TPC dE/dx signal
169     
170     kTOFsignal,              // TOF signal
171     kTOFbeta,                // TOF beta
172     kTOFPIDBit,              // TOF PID bit (1:set, 0:TOF not available)a
173     kTOFmismProb,                // and mismatchPorbability as explain in TOF-twiki
174         
175     kTPCnSigmaEleRaw,        // raw number of sigmas to the dE/dx electron line in the TPC
176     kTPCnSigmaEle,           // number of sigmas to the dE/dx electron line in the TPC
177     kTPCnSigmaPio,           // number of sigmas to the dE/dx pion line in the TPC
178     kTPCnSigmaMuo,           // number of sigmas to the dE/dx muon line in the TPC
179     kTPCnSigmaKao,           // number of sigmas to the dE/dx kaon line in the TPC
180     kTPCnSigmaPro,           // number of sigmas to the dE/dx proton line in the TPC
181       
182     kTOFnSigmaEle,           // number of sigmas to the electron line in the TOF
183     kTOFnSigmaPio,           // number of sigmas to the pion line in the TOF
184     kTOFnSigmaMuo,           // number of sigmas to the muon line in the TOF
185     kTOFnSigmaKao,           // number of sigmas to the kaon line in the TOF
186     kTOFnSigmaPro,           // number of sigmas to the proton line in the TOF
187
188     kEMCALnSigmaEle,         // number of sigmas to the proton line in the TOF
189     kEMCALEoverP,            // E over P from EMCAL
190     kEMCALE,                 // E from EMCAL
191     kEMCALNCells,            // NCells from EMCAL
192     kEMCALM02,               // M02 showershape parameter
193     kEMCALM20,               // M20 showershape parameter
194     kEMCALDispersion,        // Dispersion paramter
195     
196     kLegEff,                 // single electron efficiency
197     kOneOverLegEff,          // 1 / single electron efficiency (correction factor)
198     kV0Index0,               // v0 index 0
199     kKinkIndex0,             // kink index 0
200       
201     kParticleMax,             //
202     // TODO: kRNClusters ??
203     // AliDielectronPair specific variables
204     kChi2NDF = kParticleMax, // Chi^2/NDF
205     kDecayLength,            // decay length
206     kR,                      // distance to the origin
207     kOpeningAngle,           // opening angle
208     kCosPointingAngle,       // cosine of the pointing angle
209     kArmAlpha,               // Armenteros-Podolanski alpha
210     kArmPt,                  // Armenteros-Podolanski pt
211     // helicity picture: Z-axis is considered the direction of the mother's 3-momentum vector
212     kThetaHE,                // theta in mother's rest frame in the helicity picture 
213     kPhiHE,                  // phi in mother's rest frame in the helicity picture
214     kThetaSqHE,              // squared value of kThetaHE
215     kCos2PhiHE,              // Cosine of 2*phi in mother's rest frame in the helicity picture
216     kCosTilPhiHE,            // Shifted phi depending on kThetaHE
217     // Collins-Soper picture: Z-axis is considered the direction of the vectorial difference between 
218     // the 3-mom vectors of target and projectile beams
219     kThetaCS,                // theta in mother's rest frame in Collins-Soper picture
220     kPhiCS,                  // phi in mother's rest frame in Collins-Soper picture
221     kThetaSqCS,              // squared value of kThetaCS
222     kPsiPair,                // phi in mother's rest frame in Collins-Soper picture
223         kPhivPair,               // angle between ee plane and the magnetic field (can be useful for conversion rejection)
224         
225     kPairPlaneAngle1A,         // angle between ee decay plane and x'-z reaction plane by using V0-A
226     kPairPlaneAngle2A,         // angle between ee decay plane and (p1+p2) rot ez
227     kPairPlaneAngle3A,         // angle between ee decay plane and (p1+p2) rot (p1+p2)x'z
228     kPairPlaneAngle4A,         // angle between ee decay plane and x'-y' plane
229     kPairPlaneAngle1C,         // using v0-C
230     kPairPlaneAngle2C,
231     kPairPlaneAngle3C,
232     kPairPlaneAngle4C,
233     kPairPlaneAngle1AC,        // using v0-AC
234     kPairPlaneAngle2AC,
235     kPairPlaneAngle3AC,
236     kPairPlaneAngle4AC,
237     kPairPlaneAngle1Ran,       // using random reaction plane
238     kPairPlaneAngle2Ran,
239     kPairPlaneAngle3Ran,
240     kPairPlaneAngle4Ran,
241     kRandomRP,                //Random reaction plane
242     kDeltaPhiRandomRP,        //delta phi of the pair
243
244     kPairPlaneMagInPro,     // Inner Product of strong magnetic field and ee plane
245         kCos2PhiCS,              // Cosine of 2*phi in mother's rest frame in the Collins-Soper picture
246     kCosTilPhiCS,            // Shifted phi depending on kThetaCS
247     kCosPhiH2,               // cosine of pair phi for 2nd harmonic
248     kSinPhiH2,               // sinus  of pair phi for 2nd harmonic
249     kDeltaPhiV0ArpH2,        // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-A
250     kDeltaPhiV0CrpH2,        // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-C
251     kDeltaPhiV0ACrpH2,       // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-A + V0-C
252     kV0ArpH2FlowV2,          // v2 coefficient with respect to the 2nd order reaction plane from V0-A
253     kV0CrpH2FlowV2,          // v2 coefficient with respect to the 2nd order reaction plane from V0-C
254     kV0ACrpH2FlowV2,         // v2 coefficient with respect to the 2nd order reaction plane from V0-A + V0-C
255     kDeltaPhiv0ArpH2,        // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-A (EPtask)
256     kDeltaPhiv0CrpH2,        // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-C
257     kDeltaPhiv0ACrpH2,       // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-AC
258     kDeltaPhiTPCrpH2,        // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from TPC
259     kv0ArpH2FlowV2,          // v2 coefficient with respect to the 2nd order reaction plane from V0-A (EPtask)
260     kv0CrpH2FlowV2,          // v2 coefficient with respect to the 2nd order reaction plane from V0-C
261     kv0ACrpH2FlowV2,         // v2 coefficient with respect to the 2nd order reaction plane from V0-A + V0-C
262     kTPCrpH2FlowV2,          // v2 coefficient with respect to the 2nd order reaction plane from TPC
263     kTPCrpH2FlowV2Sin,       // sinus of v2 coefficient with respect to the 2nd order reaction plane from TPC
264
265     kLegDist,                // distance of the legs
266     kLegDistXY,              // distance of the legs in XY
267     kDeltaEta,         // Absolute value of Delta Eta for the legs
268     kDeltaPhi,           // Absolute value of Delta Phi for the legs
269     kMerr,                   // error of mass calculation
270     kDCA,                    // distance of closest approach TODO: not implemented yet
271     kPairType,               // type of the pair, like like sign ++ unlikesign ...
272     kPseudoProperTime,       // pseudo proper time
273     kPseudoProperTimeErr,    // pseudo proper time error
274     kPseudoProperTimeResolution,     // resolution for pseudo proper decay time (reconstructed - MC truth)
275     kPseudoProperTimePull,   // normalizd resolution for pseudo proper time = (reco - MC truth)/dReco
276     kTRDpidEffPair,          // TRD pid efficieny from conversion electrons
277     kMomAsymDau1,            // momentum fraction of daughter1
278     kMomAsymDau2,            // momentum fraction of daughter2
279     kPairEff,                // pair efficiency
280     kOneOverPairEff,         // 1 / pair efficiency (correction factor)
281     kOneOverPairEffSq,        // 1 / pair efficiency squared (correction factor)
282     kRndmPair,               // radomly created number (used to apply special signal reduction cuts)
283     kPairs,                  // number of Ev1PM pair candidates after all cuts
284     kPairMax,                 //
285   // Event specific variables
286     kXvPrim=kPairMax,        // prim vertex
287     kYvPrim,                 // prim vertex
288     kZvPrim,                 // prim vertex
289     kXRes,                   // primary vertex x-resolution
290     kYRes,                   // primary vertex y-resolution
291     kZRes,                   // primary vertex z-resolution
292     kPhiMaxPt,               // phi angle of the track with maximum pt
293     kMaxPt,                  // track with maximum pt
294
295     //// v0 reaction plane quantities from AliEPSelectionTaks, angles interval [-pi/2,+pi/2]
296     kv0ArpH2,                // VZERO-A reaction plane of the Q vector for 2nd harmonic
297     kv0CrpH2,                //         reaction plane
298     kv0ACrpH2,               // VZERO-AC reaction plane of the Q vector for 2nd harmonic
299     kv0AxH2,                 // VZERO-A x-component of the Q vector for 2nd harmonic
300     kv0AyH2,                 // VZERO-A y-component of the Q vector for 2nd harmonic
301     kv0CxH2,                 // VZERO-C x-component of the Q vector for 2nd harmonic
302     kv0CyH2,                 // VZERO-C y-component of the Q vector for 2nd harmonic
303     kv0ACxH2,                // VZERO-AC x-component of the Q vector for 2nd harmonic
304     kv0ACyH2,                // VZERO-AC y-component of the Q vector for 2nd harmonic
305     kv0AmagH2,               // VZERO-A the Q vectors magnitude for 2nd harmonic
306     kv0CmagH2,               // VZERO-A the Q vectors magnitude for 2nd harmonic
307     kv0ACmagH2,              // VZERO-A the Q vectors magnitude for 2nd harmonic
308     kv0A0rpH2,                 // VZERO-A 1st  ring reaction plane of the Q vector for 2nd harmonic
309     kv0A3rpH2,                 // VZERO-A last ring reaction plane of the Q vector for 2nd harmonic
310     kv0C0rpH2,                 // VZERO-C 1st  ring reaction plane of the Q vector for 2nd harmonic
311     kv0C3rpH2,                 // VZERO-C last ring reaction plane of the Q vector for 2nd harmonic
312     kv0ATPCDiffH2,             // V0A-TPC reaction plane difference for 2nd harmonic
313     kv0CTPCDiffH2,             // V0C-TPC reaction plane difference for 2nd harmonic
314     kv0Av0CDiffH2,             // V0A-V0C reaction plane difference for 2nd harmonic
315     kv0Av0C0DiffH2,             // V0A-ring 0 ofV0C reaction plane difference for 2nd harmonic
316     kv0Av0C3DiffH2,             // V0A-ring 3 ofV0C reaction plane difference for 2nd harmonic
317     kv0Cv0A0DiffH2,             // V0C-ring 0 ofV0A reaction plane difference for 2nd harmonic
318     kv0Cv0A3DiffH2,             // V0C-ring 3 ofV0A reaction plane difference for 2nd harmonic
319     kv0A0v0A3DiffH2,             // V0C-ring 0 ofV0A reaction plane difference for 2nd harmonic
320     kv0C0v0C3DiffH2,             // V0C-ring 0 ofV0A reaction plane difference for 2nd harmonic
321
322     kMultV0A,                // VZERO multiplicity and ADC amplitudes
323     kMultV0C,
324     kMultV0,
325     kEqMultV0A,              // equalized VZERO multiplicity
326     kEqMultV0C,
327     kEqMultV0,
328     kAdcV0A,
329     kAdcV0C,
330     kAdcV0,
331     kVZEROchMult,
332     // VZERO reaction plane quantities
333     kV0AxH2=kVZEROchMult+64,   // VZERO-A x-component of the Q vector for 2nd harmonic
334     kV0AyH2,                   // VZERO-A y-component of the Q vector for 2nd harmonic
335     kV0ArpH2,                  // VZERO-A reaction plane of the Q vector for 2nd harmonic
336     kV0CxH2,                   // VZERO-C x-component of the Q vector for 2nd harmonic
337     kV0CyH2,                   //         y-component
338     kV0CrpH2,                  //         reaction plane
339     kV0ACxH2,                  // VZERO-AC x-component of the Q vector for 2nd harmonic
340     kV0ACyH2,                  // VZERO-AC y-component of the Q vector for 2nd harmonic
341     kV0ACrpH2,                 // VZERO-AC reaction plane of the Q vector for 2nd harmonic
342     kV0ArpResH2,               // 2nd harmonic reaction plane resolution for V0A
343     kV0CrpResH2,               //                               V0C
344     kV0ACrpResH2,              //                             V0A+V0C
345     kV0XaXcH2,                 // Correlation quantities to check V0 reaction plane quality
346     kV0XaYaH2,
347     kV0XaYcH2,
348     kV0YaXcH2,
349     kV0YaYcH2,
350     kV0XcYcH2,
351     kV0ATPCDiffH2,             // V0A-TPC reaction plane difference for 2nd harmonic
352     kV0CTPCDiffH2,             // V0C-TPC reaction plane difference for 2nd harmonic
353     kV0AV0CDiffH2,             // V0A-V0C reaction plane difference for 2nd harmonic
354     // TPC reaction plane quantities, angle interval [-pi/2,+pi/2]
355     kTPCxH2,                  // TPC x-component of the Q vector for 2nd harmonic (corrected)
356     kTPCyH2,                  // TPC y-component of the Q vector for 2nd harmonic (corrected)
357     kTPCmagH2,                // TPC reaction plane the Q vectors magnitude for 2nd harmonic (corrected)
358     kTPCrpH2,                 // TPC reaction plane angle of the Q vector for 2nd harmonic (corrected)
359     kCosTPCrpH2,              // cosine of TPC reaction plane angle of the Q vector for 2nd harmonic (corrected)
360     kSinTPCrpH2,              // sinus of TPC reaction plane angle of the Q vector for 2nd harmonic (corrected)
361     kTPCsub1xH2,              // TPC x-component of the Q vector for 2nd harmonic (corrected, sub event 1) 
362     kTPCsub1yH2,              // TPC y-component of the Q vector for 2nd harmonic (corrected, sub event 1)
363     kTPCsub1rpH2,             // TPC reaction plane of the Q vector for 2nd harmonic (corrected, sub event 1)
364     kTPCsub2xH2,              // TPC x-component of the Q vector for 2nd harmonic (corrected, sub event 2)
365     kTPCsub2yH2,              // TPC y-component of the Q vector for 2nd harmonic (corrected, sub event 2)
366     kTPCsub2rpH2,             // TPC reaction plane of the Q vector for 2nd harmonic (corrected, sub event 2)
367     kTPCsub12DiffH2,          // TPC reaction plane difference of sub event 1,2 for 2nd harmonic
368     kTPCsub12DiffH2Sin,       // TPC reaction plane difference of sub event 1,2 for 2nd harmonic, sinus term
369
370     kTPCxH2uc,                  // TPC x-component of the Q vector for 2nd harmonic (uncorrected)
371     kTPCyH2uc,                  // TPC y-component of the Q vector for 2nd harmonic (uncorrected)
372     kTPCmagH2uc,                // TPC reaction plane the Q vectors magnitude for 2nd harmonic (uncorrected)
373     kTPCrpH2uc,                 // TPC reaction plane angle of the Q vector for 2nd harmonic (uncorrected)
374     kTPCsub1xH2uc,              // TPC x-component of the Q vector for 2nd harmonic (uncorrected, sub event 1) 
375     kTPCsub1yH2uc,              // TPC y-component of the Q vector for 2nd harmonic (uncorrected, sub event 1)
376     kTPCsub1rpH2uc,             // TPC reaction plane of the Q vector for 2nd harmonic (uncorrected, sub event 1)
377     kTPCsub2xH2uc,              // TPC x-component of the Q vector for 2nd harmonic (uncorrected, sub event 2)
378     kTPCsub2yH2uc,              // TPC y-component of the Q vector for 2nd harmonic (uncorrected, sub event 2)
379     kTPCsub2rpH2uc,             // TPC reaction plane of the Q vector for 2nd harmonic (uncorrected, sub event 2)
380     kTPCsub12DiffH2uc,          // TPC reaction plane difference of sub event 1,2 for 2nd harmonic (uncorrected)
381
382     //ZDC reaction plane(v1 plane) quantities
383
384     kZDCArpH1,                  // ZDC-A reaction plane of the Q vector for 1st harmonic
385     kZDCCrpH1,                  // ZDC-C reaction plane of the Q vector for 1st harmonic
386     kZDCACrpH1,                  // ZDC-AC reaction plane of the Q vector for 1st harmonic
387     kZDCrpResH1,                  // 1st harmonic reaction plane resolution for ZDC
388     kv0ZDCrpRes,                //ZDC reaction plane for 1st harmonic and VZERO reaction plane for 2nd harmonic correlation
389
390
391     kNTrk,                   // number of tracks (or tracklets) TODO: ambiguous
392     kTracks,                 // track after all cuts
393     kNVtxContrib,             // number of primary vertex contibutors
394     kNVtxContribTPC,         // number of TPC vertex contibutors
395     kNacc,                   // Number of accepted tracks
396     kMatchEffITSTPC,         // ruff estimate on the ITS-TPC matching efficiceny
397     kNaccTrcklts,            // number of accepted SPD tracklets in |eta|<1.6        
398     kNaccTrcklts0916,        // number of accepted SPD tracklets in 0.9<|eta|<1.6
399     
400     kNaccTrckltsEsd05,       // number of accepted SPD tracklets in |eta|<0.5 (AliESDEvent::EstimateMultiplicity())
401     kNaccTrckltsEsd10,       // number of accepted SPD tracklets in |eta|<1.0 (AliESDEvent::EstimateMultiplicity())
402     kNaccTrckltsEsd16,       // number of accepted SPD tracklets in |eta|<1.6 (AliESDEvent::EstimateMultiplicity())
403     kNaccTrckltsEsd05Corr,   //
404     kNaccTrckltsEsd10Corr,   //
405     kNaccTrckltsEsd16Corr,   //
406     kNaccItsTpcEsd05,        // ITS-TPC tracks + ITS SA complementary tracks + tracklets from unassigned tracklets in |eta|<0.5 (AliESDEvent::EstimateMultiplicity())
407     kNaccItsTpcEsd10,        // ITS-TPC tracks + ITS SA complementary tracks + tracklets from unassigned tracklets in |eta|<1.0 (AliESDEvent::EstimateMultiplicity())
408     kNaccItsTpcEsd16,        // ITS-TPC tracks + ITS SA complementary tracks + tracklets from unassigned tracklets in |eta|<1.6 (AliESDEvent::EstimateMultiplicity())
409     kNaccItsTpcEsd05Corr,        // 
410     kNaccItsTpcEsd10Corr,        // 
411     kNaccItsTpcEsd16Corr,        // 
412     
413     kNaccItsPureEsd05,       // ITS SA tracks + tracklets from unassigned tracklets in |eta|<0.5 (AliESDEvent::EstimateMultiplicity())
414     kNaccItsPureEsd10,       // ITS SA tracks + tracklets from unassigned tracklets in |eta|<1.0 (AliESDEvent::EstimateMultiplicity())
415     kNaccItsPureEsd16,       // ITS SA tracks + tracklets from unassigned tracklets in |eta|<1.6 (AliESDEvent::EstimateMultiplicity())
416     kNaccItsPureEsd05Corr,   // 
417     kNaccItsPureEsd10Corr,   // 
418     kNaccItsPureEsd16Corr,   // 
419     kRefMult,                // reference multiplicity (only in AODs) should be Ntrk w/o double counts
420     kRefMultTPConly,         // TPC only Reference Multiplicty (AliESDtrackCuts::GetReferenceMultiplicity(&esd, kTRUE))
421     
422     kNch,                    // MC true number of charged particles in |eta|<1.6
423     kNch05,                  // MC true number of charged particles in |eta|<0.5
424     kNch10,                  // MC true number of charged particles in |eta|<1.0
425
426     kCentrality,             // event centrality fraction
427     kCentralitySPD,          // centrality using SPD
428     kTriggerInclONL,         // online trigger bits fired (inclusive)
429     kTriggerInclOFF,         // offline trigger bits fired (inclusive)
430     kTriggerExclOFF,         // offline only this trigger bit fired (exclusive)
431     kNevents,                // event counter
432     kRunNumber,              // run number
433     kMixingBin,
434     kNMaxValues              //
435     // TODO: (for A+A) ZDCEnergy, impact parameter, Iflag??
436   };
437   
438
439   AliDielectronVarManager();
440   AliDielectronVarManager(const char* name, const char* title);
441   virtual ~AliDielectronVarManager();
442   static void Fill(const TObject* particle, Double_t * const values);
443   static void FillVarMCParticle2(const AliVParticle *p1, const AliVParticle *p2, Double_t * const values);
444   static void FillVarVParticle(const AliVParticle *particle,         Double_t * const values);
445
446   static void InitESDpid(Int_t type=0);
447   static void InitAODpidUtil(Int_t type=0);
448   static void InitEstimatorAvg(const Char_t* filename);
449   static void InitTRDpidEffHistograms(const Char_t* filename);
450   static void SetLegEffMap( TObject *map) { fgLegEffMap=map; }
451   static void SetPairEffMap(TObject *map) { fgPairEffMap=map; }
452   static void SetFillMap(   TBits   *map) { fgFillMap=map; }
453   static void SetVZEROCalibrationFile(const Char_t* filename) {fgVZEROCalibrationFile = filename;}
454   
455   static void SetVZERORecenteringFile(const Char_t* filename) {fgVZERORecenteringFile = filename;}
456   static void SetZDCRecenteringFile(const Char_t* filename) {fgZDCRecenteringFile = filename;}
457   static void SetPIDResponse(AliPIDResponse *pidResponse) {fgPIDResponse=pidResponse;}
458   static AliPIDResponse* GetPIDResponse() { return fgPIDResponse; }
459   static void SetEvent(AliVEvent * const ev);
460   static void SetEventData(const Double_t data[AliDielectronVarManager::kNMaxValues]);
461   static Bool_t GetDCA(const AliAODTrack *track, Double_t d0z0[2]);
462   static void SetTPCEventPlane(AliEventplane *const evplane);
463   static void GetVzeroRP(const AliVEvent* event, Double_t* qvec, Int_t sideOption);      // 0- V0A; 1- V0C; 2- V0A+V0C
464   static void GetZDCRP(const AliVEvent* event, Double_t qvec[][2]);
465   static AliAODVertex* GetVertex(const AliAODEvent *event, AliAODVertex::AODVtx_t vtype);
466
467   static TProfile* GetEstimatorHistogram(Int_t period, Int_t type) {return fgMultEstimatorAvg[period][type];}
468   static Double_t GetTRDpidEfficiency(Int_t runNo, Double_t centrality, Double_t eta, Double_t trdPhi, Double_t pout, Double_t& effErr);
469   static Double_t GetSingleLegEff(Double_t * const values);
470   static Double_t GetPairEff(Double_t * const values);
471
472   static const AliKFVertex* GetKFVertex() {return fgKFVertex;}
473   
474   static const char* GetValueName(Int_t i) { return (i>=0&&i<kNMaxValues)?fgkParticleNames[i][0]:""; }
475   static const char* GetValueLabel(Int_t i) { return (i>=0&&i<kNMaxValues)?fgkParticleNames[i][1]:""; }
476   static const char* GetValueUnit(Int_t i) { return (i>=0&&i<kNMaxValues)?fgkParticleNames[i][2]:""; }
477   static UInt_t GetValueType(const char* valname);
478   static const Double_t* GetData() {return fgData;}
479   static AliVEvent* GetCurrentEvent() {return fgEvent;}
480
481   static Double_t GetValue(ValueTypes var) {return fgData[var];}
482   static void SetValue(ValueTypes var, Double_t val) { fgData[var]=val; }
483   
484 private:
485
486   static const char* fgkParticleNames[kNMaxValues][3];  //variable names
487
488   static Bool_t Req(ValueTypes var) { return (fgFillMap ? fgFillMap->TestBitNumber(var) : kTRUE); }
489   static void FillVarESDtrack(const AliESDtrack *particle,           Double_t * const values);
490   static void FillVarAODTrack(const AliAODTrack *particle,           Double_t * const values);
491   static void FillVarMCParticle(const AliMCParticle *particle,       Double_t * const values);
492   static void FillVarAODMCParticle(const AliAODMCParticle *particle, Double_t * const values);
493   static void FillVarDielectronPair(const AliDielectronPair *pair,   Double_t * const values);
494   static void FillVarKFParticle(const AliKFParticle *pair,   Double_t * const values);
495   
496   static void FillVarVEvent(const AliVEvent *event,                  Double_t * const values);
497   static void FillVarESDEvent(const AliESDEvent *event,              Double_t * const values);
498   static void FillVarAODEvent(const AliAODEvent *event,              Double_t * const values);
499   static void FillVarMCEvent(const AliMCEvent *event,                Double_t * const values);
500   static void FillVarTPCEventPlane(const AliEventplane *evplane,     Double_t * const values);
501
502   static void InitVZEROCalibrationHistograms(Int_t runNo);
503   static void InitVZERORecenteringHistograms(Int_t runNo);
504   static void InitZDCRecenteringHistograms(Int_t runNo);
505
506   static AliPIDResponse  *fgPIDResponse;        // PID response object
507   static AliVEvent       *fgEvent;              // current event pointer
508   static AliEventplane   *fgTPCEventPlane;      // current event tpc plane pointer
509   static AliKFVertex     *fgKFVertex;           // kf vertex
510   static TProfile        *fgMultEstimatorAvg[4][9];  // multiplicity estimator averages (4 periods x 9 estimators)
511   static Double_t         fgTRDpidEffCentRanges[10][4];   // centrality ranges for the TRD pid efficiency histograms
512   static TH3D            *fgTRDpidEff[10][4];   // TRD pid efficiencies from conversion electrons
513   static TObject         *fgLegEffMap;             // single electron efficiencies
514   static TObject         *fgPairEffMap;             // pair efficiencies
515   static TBits           *fgFillMap;             // map for requested variable filling
516   static TString          fgVZEROCalibrationFile;  // file with VZERO channel-by-channel calibrations
517   static TString          fgVZERORecenteringFile;  // file with VZERO Q-vector averages needed for event plane recentering
518   static TProfile2D      *fgVZEROCalib[64];           // 1 histogram per VZERO channel
519   static TProfile2D      *fgVZERORecentering[2][2];   // 2 VZERO sides x 2 Q-vector components
520   static Int_t            fgCurrentRun;               // current run number
521   
522   static TString          fgZDCRecenteringFile; // file with ZDC Q-vector averages needed for event plane recentering
523   static TProfile3D      *fgZDCRecentering[3][2];   // 2 VZERO sides x 2 Q-vector components
524
525   static Double_t fgData[kNMaxValues];        //! data
526   
527   AliDielectronVarManager(const AliDielectronVarManager &c);
528   AliDielectronVarManager &operator=(const AliDielectronVarManager &c);
529   
530   ClassDef(AliDielectronVarManager,1);
531 };
532
533
534 //Inline functions
535 inline void AliDielectronVarManager::Fill(const TObject* object, Double_t * const values)
536 {
537   //
538   // Main function to fill all available variables according to the type of particle
539   //
540   if (!object) return;
541   if      (object->IsA() == AliESDtrack::Class())       FillVarESDtrack(static_cast<const AliESDtrack*>(object), values);
542   else if (object->IsA() == AliAODTrack::Class())       FillVarAODTrack(static_cast<const AliAODTrack*>(object), values);
543   else if (object->IsA() == AliMCParticle::Class())     FillVarMCParticle(static_cast<const AliMCParticle*>(object), values);
544   else if (object->IsA() == AliAODMCParticle::Class())  FillVarAODMCParticle(static_cast<const AliAODMCParticle*>(object), values);
545   else if (object->IsA() == AliDielectronPair::Class()) FillVarDielectronPair(static_cast<const AliDielectronPair*>(object), values);
546   else if (object->IsA() == AliKFParticle::Class())     FillVarKFParticle(static_cast<const AliKFParticle*>(object),values);
547   // Main function to fill all available variables according to the type of event
548   
549   else if (object->IsA() == AliVEvent::Class())         FillVarVEvent(static_cast<const AliVEvent*>(object), values);
550   else if (object->IsA() == AliESDEvent::Class())       FillVarESDEvent(static_cast<const AliESDEvent*>(object), values);
551   else if (object->IsA() == AliAODEvent::Class())       FillVarAODEvent(static_cast<const AliAODEvent*>(object), values);
552   else if (object->IsA() == AliMCEvent::Class())        FillVarMCEvent(static_cast<const AliMCEvent*>(object), values);
553   else if (object->IsA() == AliEventplane::Class())     FillVarTPCEventPlane(static_cast<const AliEventplane*>(object), values);
554 //   else printf(Form("AliDielectronVarManager::Fill: Type %s is not supported by AliDielectronVarManager!", object->ClassName())); //TODO: implement without object needed
555 }
556
557 inline void AliDielectronVarManager::FillVarVParticle(const AliVParticle *particle, Double_t * const values)
558 {
559   //
560   // Fill track information available in AliVParticle into an array
561   //
562   values[AliDielectronVarManager::kPx]        = particle->Px();
563   values[AliDielectronVarManager::kPy]        = particle->Py();
564   values[AliDielectronVarManager::kPz]        = particle->Pz();
565   values[AliDielectronVarManager::kPt]        = particle->Pt();
566   values[AliDielectronVarManager::kPtSq]      = particle->Pt()*particle->Pt();
567   values[AliDielectronVarManager::kP]         = particle->P();
568
569   values[AliDielectronVarManager::kXv]        = particle->Xv();
570   values[AliDielectronVarManager::kYv]        = particle->Yv();
571   values[AliDielectronVarManager::kZv]        = particle->Zv();
572
573   values[AliDielectronVarManager::kOneOverPt] = (particle->Pt()>1.0e-3 ? particle->OneOverPt() : 0.0);
574   values[AliDielectronVarManager::kPhi]       = particle->Phi();
575   values[AliDielectronVarManager::kTheta]     = particle->Theta();
576   values[AliDielectronVarManager::kEta]       = particle->Eta();
577   values[AliDielectronVarManager::kY]         = particle->Y();
578   
579   values[AliDielectronVarManager::kE]         = particle->E();
580   values[AliDielectronVarManager::kM]         = particle->M();
581   values[AliDielectronVarManager::kCharge]    = particle->Charge();
582   
583   values[AliDielectronVarManager::kPdgCode]   = particle->PdgCode();
584     
585 //   if ( fgEvent ) AliDielectronVarManager::Fill(fgEvent, values);
586   for (Int_t i=AliDielectronVarManager::kPairMax; i<AliDielectronVarManager::kNMaxValues; ++i)
587     values[i]=fgData[i];
588 }
589
590 inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle, Double_t * const values)
591 {
592   //
593   // Fill track information available for histogramming into an array
594   //
595
596   // Fill common AliVParticle interface information
597   FillVarVParticle(particle, values);
598
599   AliESDtrack *esdTrack=0x0;
600   Double_t origdEdx=particle->GetTPCsignal();
601   
602   // apply ETa correction, remove once this is in the tender
603   esdTrack=const_cast<AliESDtrack*>(particle);
604   if (!esdTrack) return;
605   esdTrack->SetTPCsignal(origdEdx/AliDielectronPID::GetEtaCorr(esdTrack)/AliDielectronPID::GetCorrValdEdx(),esdTrack->GetTPCsignalSigma(),esdTrack->GetTPCsignalN());
606   
607   Double_t pidProbs[AliPID::kSPECIES];
608   // Fill AliESDtrack interface specific information
609   Double_t tpcNcls=particle->GetTPCNcls();
610   Double_t tpcNclsS = particle->GetTPCnclsS(); 
611   Double_t itsNcls=particle->GetNcls(0);
612   Double_t tpcSignalN=particle->GetTPCsignalN();
613   Double_t tpcClusFindable=particle->GetTPCNclsF();
614   values[AliDielectronVarManager::kNclsITS]       = itsNcls; // TODO: get rid of the plain numbers
615   values[AliDielectronVarManager::kNclsTPC]       = tpcNcls; // TODO: get rid of the plain numbers
616   values[AliDielectronVarManager::kNclsSTPC]      = tpcNclsS;
617   values[AliDielectronVarManager::kNclsSFracTPC]  = tpcNcls>0?tpcNclsS/tpcNcls:0;
618   values[AliDielectronVarManager::kNclsTPCiter1]  = particle->GetTPCNclsIter1(); // TODO: get rid of the plain numbers
619   values[AliDielectronVarManager::kNFclsTPC]       = tpcClusFindable;
620   values[AliDielectronVarManager::kNFclsTPCr]      = particle->GetTPCClusterInfo(2,1);
621   values[AliDielectronVarManager::kNFclsTPCrFrac]  = particle->GetTPCClusterInfo(2);
622   values[AliDielectronVarManager::kNFclsTPCfCross]= (tpcClusFindable>0)?(particle->GetTPCClusterInfo(2,1)/tpcClusFindable):0;
623   values[AliDielectronVarManager::kTPCsignalN]    = tpcSignalN;
624   values[AliDielectronVarManager::kTPCsignalNfrac]= tpcNcls>0?tpcSignalN/tpcNcls:0;
625   values[AliDielectronVarManager::kNclsTRD]       = particle->GetNcls(2); // TODO: get rid of the plain numbers
626   values[AliDielectronVarManager::kTRDntracklets] = particle->GetTRDntracklets(); // TODO: GetTRDtracklets/GetTRDntracklets?
627   values[AliDielectronVarManager::kTRDpidQuality] = particle->GetTRDntrackletsPID();
628   values[AliDielectronVarManager::kTRDchi2]       = particle->GetTRDchi2();
629   values[AliDielectronVarManager::kTRDsignal]     = particle->GetTRDsignal();
630   values[AliDielectronVarManager::kTPCclsDiff]    = tpcSignalN-tpcNcls;
631   values[AliDielectronVarManager::kTPCclsSegments] = 0.0;
632   UChar_t threshold = 5;
633   TBits tpcClusterMap = particle->GetTPCClusterMap();
634   UChar_t n=0; UChar_t j=0;
635   for(UChar_t i=0; i<8; ++i) {
636     n=0;
637     for(j=i*20; j<(i+1)*20 && j<159; ++j) n+=tpcClusterMap.TestBitNumber(j);
638     if(n>=threshold) values[AliDielectronVarManager::kTPCclsSegments] += 1.0;
639   }
640
641   n=0;
642   threshold=0;
643   values[AliDielectronVarManager::kTPCclsIRO]=0.;
644   for(j=0; j<63; ++j) n+=tpcClusterMap.TestBitNumber(j);
645   if(n>=threshold) values[AliDielectronVarManager::kTPCclsIRO] = n;
646   n=0;
647   threshold=0;
648   values[AliDielectronVarManager::kTPCclsORO]=0.;
649   for(j=63; j<159; ++j) n+=tpcClusterMap.TestBitNumber(j);
650   if(n>=threshold) values[AliDielectronVarManager::kTPCclsORO] = n;
651
652   
653   values[AliDielectronVarManager::kTrackStatus]   = (Double_t)particle->GetStatus();
654   values[AliDielectronVarManager::kFilterBit]     = 0;
655   
656   values[AliDielectronVarManager::kTPCchi2Cl] = -1;
657   if (tpcNcls>0) values[AliDielectronVarManager::kTPCchi2Cl] = particle->GetTPCchi2() / tpcNcls;
658   values[AliDielectronVarManager::kITSchi2Cl] = -1;
659   if (itsNcls>0) values[AliDielectronVarManager::kITSchi2Cl] = particle->GetITSchi2() / itsNcls;
660   //TRD pidProbs
661   particle->GetTRDpid(pidProbs);
662   values[AliDielectronVarManager::kTRDprobEle]    = pidProbs[AliPID::kElectron];
663   values[AliDielectronVarManager::kTRDprobPio]    = pidProbs[AliPID::kPion];
664
665   values[AliDielectronVarManager::kV0Index0]      = particle->GetV0Index(0);
666   values[AliDielectronVarManager::kKinkIndex0]    = particle->GetKinkIndex(0);
667   
668   Float_t impactParXY, impactParZ;
669   particle->GetImpactParameters(impactParXY, impactParZ);
670   values[AliDielectronVarManager::kImpactParXY]   = impactParXY;
671   values[AliDielectronVarManager::kImpactParZ]    = impactParZ;
672
673
674   values[AliDielectronVarManager::kPdgCode]=-1;
675   values[AliDielectronVarManager::kPdgCodeMother]=-1;
676   values[AliDielectronVarManager::kPdgCodeGrandMother]=-1;
677   values[AliDielectronVarManager::kHasCocktailMother]=0;
678   values[AliDielectronVarManager::kHasCocktailGrandMother]=0;
679   
680   values[AliDielectronVarManager::kNumberOfDaughters]=-999;
681   
682   AliDielectronMC *mc=AliDielectronMC::Instance();
683   if (mc->HasMC()){
684     if (mc->GetMCTrack(particle)) {
685       Int_t trkLbl = TMath::Abs(mc->GetMCTrack(particle)->GetLabel());
686       values[AliDielectronVarManager::kPdgCode]           =mc->GetMCTrack(particle)->PdgCode();
687       values[AliDielectronVarManager::kHasCocktailMother] =mc->CheckParticleSource(trkLbl, AliDielectronSignalMC::kDirect);
688       values[AliDielectronVarManager::kPdgCodeMother]     =mc->GetMotherPDG(particle);
689       AliMCParticle *motherMC=mc->GetMCTrackMother(particle); //mother
690       if(motherMC) values[AliDielectronVarManager::kPdgCodeGrandMother]=mc->GetMotherPDG(motherMC);
691     }
692     values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle);
693   } //if(mc->HasMC())
694   
695
696   values[AliDielectronVarManager::kITSsignal]   =   particle->GetITSsignal();
697   
698   Double_t itsdEdx[4];
699   particle->GetITSdEdxSamples(itsdEdx);
700
701   values[AliDielectronVarManager::kITSsignalSSD1]   =   itsdEdx[0];
702   values[AliDielectronVarManager::kITSsignalSSD2]   =   itsdEdx[1];
703   values[AliDielectronVarManager::kITSsignalSDD1]   =   itsdEdx[2];
704   values[AliDielectronVarManager::kITSsignalSDD2]   =   itsdEdx[3];
705   values[AliDielectronVarManager::kITSclusterMap]   =   particle->GetITSClusterMap();
706   values[AliDielectronVarManager::kITSLayerFirstCls] = -1.;
707
708   for (Int_t iC=0; iC<6; iC++) {
709     if (((particle->GetITSClusterMap()) & (1<<(iC))) > 0) {
710       values[AliDielectronVarManager::kITSLayerFirstCls] = iC;
711       break;
712     }
713   }
714
715   
716   values[AliDielectronVarManager::kTrackLength]   = particle->GetIntegratedLength();
717   //dEdx information
718   Double_t mom = particle->GetP();
719   const AliExternalTrackParam *in=particle->GetInnerParam();
720   Double_t ysignedIn=-100;
721   if (in) {
722     mom = in->GetP();
723     ysignedIn=particle->Charge()*in->GetY();
724   }
725   values[AliDielectronVarManager::kPIn]=mom;
726   values[AliDielectronVarManager::kYsignedIn]=ysignedIn;
727   const AliExternalTrackParam *out=particle->GetOuterParam();
728   if(out) values[AliDielectronVarManager::kPOut] = out->GetP();
729   else values[AliDielectronVarManager::kPOut] = mom;
730   if(out && fgEvent) {
731     Double_t localCoord[3]={0.0};
732     Bool_t localCoordGood = out->GetXYZAt(298.0, ((AliESDEvent*)fgEvent)->GetMagneticField(), localCoord);
733     values[AliDielectronVarManager::kTRDphi] = (localCoordGood && TMath::Abs(localCoord[0])>1.0e-6 && TMath::Abs(localCoord[1])>1.0e-6 ? TMath::ATan2(localCoord[1], localCoord[0]) : -999.);
734   }
735   if(mc->HasMC() && fgTRDpidEff[0][0]) {
736     Int_t runNo = (fgEvent ? fgEvent->GetRunNumber() : -1);
737     Float_t centrality=-1.0;
738     AliCentrality *esdCentrality = (fgEvent ? fgEvent->GetCentrality() : 0x0);
739     if(esdCentrality) centrality = esdCentrality->GetCentralityPercentile("V0M");
740     Double_t effErr=0.0;
741     values[kTRDpidEffLeg] = GetTRDpidEfficiency(runNo, centrality, values[AliDielectronVarManager::kEta], 
742                                                 values[AliDielectronVarManager::kTRDphi], 
743                                                 values[AliDielectronVarManager::kPOut], effErr);
744   }
745   values[AliDielectronVarManager::kTPCsignal]=particle->GetTPCsignal();
746   
747   values[AliDielectronVarManager::kTOFsignal]=particle->GetTOFsignal();
748   
749   Double_t l = particle->GetIntegratedLength();  // cm
750   Double_t t = particle->GetTOFsignal();
751   Double_t t0 = fgPIDResponse->GetTOFResponse().GetTimeZero(); // ps
752
753   if( (l < 360. || l > 800.) || (t <= 0.) || (t0 >999990.0) ) {
754         values[AliDielectronVarManager::kTOFbeta]=0.0;
755   }
756   else {
757         t -= t0; // subtract the T0
758         l *= 0.01;  // cm ->m
759         t *= 1e-12; //ps -> s
760     
761         Double_t v = l / t;
762         Float_t beta = v / TMath::C();
763         values[AliDielectronVarManager::kTOFbeta]=beta;
764   }
765   values[AliDielectronVarManager::kTOFPIDBit]=(particle->GetStatus()&AliESDtrack::kTOFpid? 1: 0);
766
767   values[AliDielectronVarManager::kTOFmismProb] = fgPIDResponse->GetTOFMismatchProbability(particle);
768   
769   // nsigma to Electron band
770   // TODO: for the moment we set the bethe bloch parameters manually
771   //       this should be changed in future!
772   values[AliDielectronVarManager::kTPCnSigmaEleRaw]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kElectron);
773   values[AliDielectronVarManager::kTPCnSigmaEle]=(fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kElectron)-AliDielectronPID::GetCorrVal()-AliDielectronPID::GetCntrdCorr(particle)) / AliDielectronPID::GetWdthCorr(particle);
774
775   values[AliDielectronVarManager::kTPCnSigmaPio]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kPion);
776   values[AliDielectronVarManager::kTPCnSigmaMuo]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kMuon);
777   values[AliDielectronVarManager::kTPCnSigmaKao]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kKaon);
778   values[AliDielectronVarManager::kTPCnSigmaPro]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kProton);
779
780   values[AliDielectronVarManager::kITSnSigmaEle]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kElectron);
781   values[AliDielectronVarManager::kITSnSigmaPio]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kPion);
782   values[AliDielectronVarManager::kITSnSigmaMuo]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kMuon);
783   values[AliDielectronVarManager::kITSnSigmaKao]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kKaon);
784   values[AliDielectronVarManager::kITSnSigmaPro]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kProton);
785
786   values[AliDielectronVarManager::kTOFnSigmaEle]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kElectron);
787   values[AliDielectronVarManager::kTOFnSigmaPio]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kPion);
788   values[AliDielectronVarManager::kTOFnSigmaMuo]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kMuon);
789   values[AliDielectronVarManager::kTOFnSigmaKao]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kKaon);
790   values[AliDielectronVarManager::kTOFnSigmaPro]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kProton);
791
792   //EMCAL PID information
793   Double_t eop=0;
794   Double_t showershape[4]={0.,0.,0.,0.};
795 //   values[AliDielectronVarManager::kEMCALnSigmaEle]  = fgPIDResponse->NumberOfSigmasEMCAL(particle,AliPID::kElectron);
796   values[AliDielectronVarManager::kEMCALnSigmaEle]  = fgPIDResponse->NumberOfSigmasEMCAL(particle,AliPID::kElectron,eop,showershape);
797   values[AliDielectronVarManager::kEMCALEoverP]     = eop;
798   values[AliDielectronVarManager::kEMCALE]          = eop*values[AliDielectronVarManager::kP];
799   values[AliDielectronVarManager::kEMCALNCells]     = showershape[0];
800   values[AliDielectronVarManager::kEMCALM02]        = showershape[1];
801   values[AliDielectronVarManager::kEMCALM20]        = showershape[2];
802   values[AliDielectronVarManager::kEMCALDispersion] = showershape[3];
803
804   values[AliDielectronVarManager::kLegEff]        = GetSingleLegEff(values);
805   values[AliDielectronVarManager::kOneOverLegEff] = (values[AliDielectronVarManager::kLegEff]>0.0 ? 1./values[AliDielectronVarManager::kLegEff] : 0.0);
806   //restore TPC signal if it was changed
807   if (esdTrack) esdTrack->SetTPCsignal(origdEdx,esdTrack->GetTPCsignalSigma(),esdTrack->GetTPCsignalN());
808 }
809
810 inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle, Double_t * const values)
811 {
812   //
813   // Fill track information available for histogramming into an array
814   //
815
816   // Fill common AliVParticle interface information
817   FillVarVParticle(particle, values);
818   Double_t tpcNcls=particle->GetTPCNcls();
819
820   //GetNclsS not present in AODtrack
821   //Replace with method as soon as available
822   TBits tpcSharedMap = particle->GetTPCSharedMap();   
823   Double_t tpcNclsS=  tpcSharedMap.CountBits(0)-tpcSharedMap.CountBits(159);
824
825   // Reset AliESDtrack interface specific information
826   if(Req(kNclsITS))      values[AliDielectronVarManager::kNclsITS]       = particle->GetITSNcls();
827   if(Req(kITSchi2Cl))    values[AliDielectronVarManager::kITSchi2Cl]     = -1;
828   if(Req(kNclsTPC))      values[AliDielectronVarManager::kNclsTPC]       = tpcNcls;
829   if(Req(kNclsSTPC))     values[AliDielectronVarManager::kNclsSTPC]      = tpcNclsS;
830   if(Req(kNclsSFracTPC)) values[AliDielectronVarManager::kNclsSFracTPC]  = tpcNcls>0?tpcNclsS/tpcNcls:0;
831   if(Req(kNclsTPCiter1)) values[AliDielectronVarManager::kNclsTPCiter1]  = tpcNcls; // not really available in AOD
832   if(Req(kNFclsTPC)  || Req(kNFclsTPCfCross))  values[AliDielectronVarManager::kNFclsTPC]      = particle->GetTPCNclsF();
833   if(Req(kNFclsTPCr) || Req(kNFclsTPCfCross))  values[AliDielectronVarManager::kNFclsTPCr]     = particle->GetTPCClusterInfo(2,1);
834   if(Req(kNFclsTPCrFrac))  values[AliDielectronVarManager::kNFclsTPCrFrac] = particle->GetTPCClusterInfo(2);
835   if(Req(kNFclsTPCfCross)) values[AliDielectronVarManager::kNFclsTPCfCross]= (values[kNFclsTPC]>0)?(values[kNFclsTPCr]/values[kNFclsTPC]):0;
836   if(Req(kNclsTRD))        values[AliDielectronVarManager::kNclsTRD]       = 0;
837   if(Req(kTRDntracklets))  values[AliDielectronVarManager::kTRDntracklets] = 0;
838   if(Req(kTRDpidQuality))  values[AliDielectronVarManager::kTRDpidQuality] = particle->GetTRDntrackletsPID();
839   if(Req(kTRDchi2))        values[AliDielectronVarManager::kTRDchi2]       = (particle->GetTRDntrackletsPID()!=0.?particle->GetTRDchi2():-1);
840   if(Req(kTRDsignal))      values[AliDielectronVarManager::kTRDsignal]     = particle->GetTRDsignal();
841
842
843   TBits tpcClusterMap = particle->GetTPCClusterMap();
844   UChar_t n=0; UChar_t j=0;
845   UChar_t threshold = 5;
846
847   values[AliDielectronVarManager::kTPCclsSegments] = 0.0;
848   if(Req(kTPCclsSegments)) {
849     for(UChar_t i=0; i<8; ++i) {
850       n=0;
851       for(j=i*20; j<(i+1)*20 && j<159; ++j) n+=tpcClusterMap.TestBitNumber(j);
852       if(n>=threshold) values[AliDielectronVarManager::kTPCclsSegments] += 1.0;
853     }
854   }
855
856   values[AliDielectronVarManager::kTPCclsIRO]=0.;
857   if(Req(kTPCclsIRO)) {
858     n=0;
859     threshold=0;
860     for(j=0; j<63; ++j) n+=tpcClusterMap.TestBitNumber(j);
861     if(n>=threshold) values[AliDielectronVarManager::kTPCclsIRO] = n;
862   }
863
864   values[AliDielectronVarManager::kTPCclsORO]=0.;
865   if(Req(kTPCclsORO)) {
866     n=0;
867     threshold=0;
868     for(j=63; j<159; ++j) n+=tpcClusterMap.TestBitNumber(j);
869     if(n>=threshold) values[AliDielectronVarManager::kTPCclsORO] = n;
870   }
871
872   // it is stored as normalized to tpcNcls-5 (see AliAnalysisTaskESDfilter)
873   if(Req(kTPCchi2Cl))   values[AliDielectronVarManager::kTPCchi2Cl]     = (tpcNcls>0)?particle->Chi2perNDF()*(tpcNcls-5)/tpcNcls:-1.;
874   if(Req(kTrackStatus)) values[AliDielectronVarManager::kTrackStatus]   = (Double_t)particle->GetStatus();
875   if(Req(kFilterBit))   values[AliDielectronVarManager::kFilterBit]     = (Double_t)particle->GetFilterMap();
876
877   //TRD pidProbs
878   values[AliDielectronVarManager::kTRDprobEle]    = 0;
879   values[AliDielectronVarManager::kTRDprobPio]    = 0;
880
881   values[AliDielectronVarManager::kTPCsignalN]    = 0;
882   values[AliDielectronVarManager::kTPCsignalNfrac]= 0;
883
884   // Fill AliAODTrack interface information
885   //
886   Int_t v0Index=-1;
887   Int_t kinkIndex=-1;
888   if( (Req(kV0Index0) || Req(kKinkIndex0)) && particle->GetProdVertex()) {
889     v0Index   = particle->GetProdVertex()->GetType()==AliAODVertex::kV0   ? 1 : 0;
890     kinkIndex = particle->GetProdVertex()->GetType()==AliAODVertex::kKink ? 1 : 0;
891   }
892   values[AliDielectronVarManager::kV0Index0]      = v0Index;
893   values[AliDielectronVarManager::kKinkIndex0]    = kinkIndex;
894
895   Double_t d0z0[2]={-999.0,-999.0};
896   if(Req(kImpactParXY) || Req(kImpactParZ)) GetDCA(particle, d0z0);
897   values[AliDielectronVarManager::kImpactParXY]   = d0z0[0];
898   values[AliDielectronVarManager::kImpactParZ]    = d0z0[1];
899
900   values[AliDielectronVarManager::kPIn]            =  0.;
901   values[AliDielectronVarManager::kTPCsignal]      =  0.;
902   values[AliDielectronVarManager::kTPCsignalN]     = -1.;
903   values[AliDielectronVarManager::kTPCsignalNfrac] = -1.;
904   values[AliDielectronVarManager::kTPCclsDiff]     = -999.;
905   
906   values[AliDielectronVarManager::kTOFsignal]=0;
907   values[AliDielectronVarManager::kTOFbeta]=0;
908
909   values[AliDielectronVarManager::kTPCnSigmaEleRaw]=0;
910   values[AliDielectronVarManager::kTPCnSigmaEle]=0;
911   values[AliDielectronVarManager::kTPCnSigmaPio]=0;
912   values[AliDielectronVarManager::kTPCnSigmaMuo]=0;
913   values[AliDielectronVarManager::kTPCnSigmaKao]=0;
914   values[AliDielectronVarManager::kTPCnSigmaPro]=0;
915
916   values[AliDielectronVarManager::kTOFnSigmaEle]=0;
917   values[AliDielectronVarManager::kTOFnSigmaPio]=0;
918   values[AliDielectronVarManager::kTOFnSigmaMuo]=0;
919   values[AliDielectronVarManager::kTOFnSigmaKao]=0;
920   values[AliDielectronVarManager::kTOFnSigmaPro]=0;
921   
922   if(Req(kITSsignal))        values[AliDielectronVarManager::kITSsignal]        =   particle->GetITSsignal();
923   if(Req(kITSclusterMap))    values[AliDielectronVarManager::kITSclusterMap]    =   particle->GetITSClusterMap();
924   if(Req(kITSLayerFirstCls)) values[AliDielectronVarManager::kITSLayerFirstCls] = -1.;
925   for (Int_t iC=0; iC<6; iC++) {
926     if (((particle->GetITSClusterMap()) & (1<<(iC))) > 0) {
927       if(Req(kITSLayerFirstCls)) values[AliDielectronVarManager::kITSLayerFirstCls] = iC;
928       break;
929     }
930   }
931
932   AliAODPid *pid=const_cast<AliAODPid*>(particle->GetDetPid());
933   if (pid) {
934     Double_t origdEdx=pid->GetTPCsignal();
935     //overwrite signal
936     pid->SetTPCsignal(origdEdx/AliDielectronPID::GetEtaCorr(particle)/AliDielectronPID::GetCorrValdEdx());
937
938     Double_t tpcSignalN=0.0;
939     if(Req(kTPCsignalN) || Req(kTPCsignalNfrac) || Req(kTPCclsDiff)) tpcSignalN = pid->GetTPCsignalN();
940     values[AliDielectronVarManager::kTPCsignalN]     = tpcSignalN;
941     values[AliDielectronVarManager::kTPCsignalNfrac] = tpcNcls>0?tpcSignalN/tpcNcls:0;
942     values[AliDielectronVarManager::kTPCclsDiff]     = tpcSignalN-tpcNcls;
943
944     values[AliDielectronVarManager::kPIn]         = pid->GetTPCmomentum();
945     if(Req(kTPCsignal))   values[AliDielectronVarManager::kTPCsignal]   = pid->GetTPCsignal();
946     if(Req(kTOFsignal))   values[AliDielectronVarManager::kTOFsignal]   = pid->GetTOFsignal();
947     if(Req(kTOFmismProb)) values[AliDielectronVarManager::kTOFmismProb] = fgPIDResponse->GetTOFMismatchProbability(particle);
948
949     // TOF beta calculation
950     if(Req(kTOFbeta)) {
951       Double32_t expt[5];
952       particle->GetIntegratedTimes(expt);         // ps
953       Double_t l  = TMath::C()* expt[0]*1e-12;    // m
954       Double_t t  = pid->GetTOFsignal();          // ps start time subtracted (until v5-02-Rev09)
955       AliTOFHeader* tofH=0x0;                     // from v5-02-Rev10 on subtract the start time
956       if(fgEvent) tofH = (AliTOFHeader*)fgEvent->GetTOFHeader();
957       if(tofH) t -= fgPIDResponse->GetTOFResponse().GetStartTime(particle->P()); // ps
958
959     if( (l < 360.e-2 || l > 800.e-2) || (t <= 0.) ) {
960       values[AliDielectronVarManager::kTOFbeta]  =0;
961     }
962     else {
963       t *= 1e-12; //ps -> s
964
965         Double_t v = l / t;
966         Float_t beta = v / TMath::C();
967         values[AliDielectronVarManager::kTOFbeta]=beta;
968       }
969     }
970
971     // nsigma for various detectors
972     if(Req(kTPCnSigmaEleRaw)) values[kTPCnSigmaEleRaw]= fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kElectron);
973     if(Req(kTPCnSigmaEle))    values[kTPCnSigmaEle]   =(fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kElectron)
974                                                         -AliDielectronPID::GetCorrVal()-
975                                                         AliDielectronPID::GetCntrdCorr(particle)) / AliDielectronPID::GetWdthCorr(particle);
976
977     if(Req(kTPCnSigmaPio)) values[kTPCnSigmaPio]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kPion);
978     if(Req(kTPCnSigmaMuo)) values[kTPCnSigmaMuo]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kMuon);
979     if(Req(kTPCnSigmaKao)) values[kTPCnSigmaKao]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kKaon);
980     if(Req(kTPCnSigmaPro)) values[kTPCnSigmaPro]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kProton);
981
982     if(Req(kITSnSigmaEle)) values[kITSnSigmaEle]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kElectron);
983     if(Req(kITSnSigmaPio)) values[kITSnSigmaPio]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kPion);
984     if(Req(kITSnSigmaMuo)) values[kITSnSigmaMuo]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kMuon);
985     if(Req(kITSnSigmaKao)) values[kITSnSigmaKao]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kKaon);
986     if(Req(kITSnSigmaPro)) values[kITSnSigmaPro]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kProton);
987
988     if(Req(kTOFnSigmaEle)) values[kTOFnSigmaEle]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kElectron);
989     if(Req(kTOFnSigmaPio)) values[kTOFnSigmaPio]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kPion);
990     if(Req(kTOFnSigmaMuo)) values[kTOFnSigmaMuo]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kMuon);
991     if(Req(kTOFnSigmaKao)) values[kTOFnSigmaKao]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kKaon);
992     if(Req(kTOFnSigmaPro)) values[kTOFnSigmaPro]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kProton);
993
994     Double_t prob[AliPID::kSPECIES]={0.0};
995     // switch computation off since it takes 70% of the CPU time for filling all AODtrack variables
996     // TODO: find a solution when this is needed (maybe at fill time in histos, CFcontainer and cut selection)
997     if( Req(kTRDprobEle) || Req(kTRDprobPio) ) fgPIDResponse->ComputeTRDProbability(particle,AliPID::kSPECIES,prob);
998     values[AliDielectronVarManager::kTRDprobEle]      = prob[AliPID::kElectron];
999     values[AliDielectronVarManager::kTRDprobPio]      = prob[AliPID::kPion];
1000     // if( Req(kTRDprob2DEle) || Req(kTRDprob2DPio) )
1001     //   fgPIDResponse->ComputeTRDProbability(particle,AliPID::kSPECIES,prob, AliTRDPIDResponse::kLQ2D);
1002     values[AliDielectronVarManager::kTRDprob2DEle]    = prob[AliPID::kElectron];
1003     values[AliDielectronVarManager::kTRDprob2DPio]    = prob[AliPID::kPion];
1004
1005     //restore TPC signal if it was changed
1006     pid->SetTPCsignal(origdEdx);
1007   }
1008
1009   //EMCAL PID information
1010   Double_t eop=0;
1011   Double_t showershape[4]={0.,0.,0.,0.};
1012 //   if(Req()) values[AliDielectronVarManager::kEMCALnSigmaEle]  = fgPIDResponse->NumberOfSigmasEMCAL(particle,AliPID::kElectron);
1013   if(Req(kEMCALnSigmaEle) || Req(kEMCALE) || Req(kEMCALEoverP) || 
1014      Req(kEMCALNCells) || Req(kEMCALM02) || Req(kEMCALM20) || Req(kEMCALDispersion))
1015     values[AliDielectronVarManager::kEMCALnSigmaEle]  = fgPIDResponse->NumberOfSigmasEMCAL(particle,AliPID::kElectron,eop,showershape);
1016   values[AliDielectronVarManager::kEMCALEoverP]     = eop;
1017   values[AliDielectronVarManager::kEMCALE]          = eop*values[AliDielectronVarManager::kP];
1018   values[AliDielectronVarManager::kEMCALNCells]     = showershape[0];
1019   values[AliDielectronVarManager::kEMCALM02]        = showershape[1];
1020   values[AliDielectronVarManager::kEMCALM20]        = showershape[2];
1021   values[AliDielectronVarManager::kEMCALDispersion] = showershape[3];
1022
1023   values[AliDielectronVarManager::kPdgCode]=-1;
1024   values[AliDielectronVarManager::kPdgCodeMother]=-1;
1025   values[AliDielectronVarManager::kPdgCodeGrandMother]=-1;
1026   values[AliDielectronVarManager::kHasCocktailMother]=0;
1027   values[AliDielectronVarManager::kHasCocktailGrandMother]=0;
1028
1029   values[AliDielectronVarManager::kNumberOfDaughters]=-1;
1030
1031   AliDielectronMC *mc=AliDielectronMC::Instance();
1032   if (mc->HasMC()){
1033     if (mc->GetMCTrack(particle)) {
1034       Int_t trkLbl = TMath::Abs(mc->GetMCTrack(particle)->GetLabel());
1035       values[AliDielectronVarManager::kPdgCode]           =mc->GetMCTrack(particle)->PdgCode();
1036       values[AliDielectronVarManager::kHasCocktailMother] =mc->CheckParticleSource(trkLbl, AliDielectronSignalMC::kDirect);
1037       values[AliDielectronVarManager::kPdgCodeMother]     =mc->GetMotherPDG(particle);
1038       AliAODMCParticle *motherMC=mc->GetMCTrackMother(particle); //mother
1039       if(motherMC) values[AliDielectronVarManager::kPdgCodeGrandMother]=mc->GetMotherPDG(motherMC);
1040     }
1041     values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle);
1042   } //if(mc->HasMC())
1043
1044   if(Req(kTOFPIDBit))     values[AliDielectronVarManager::kTOFPIDBit]=(particle->GetStatus()&AliESDtrack::kTOFpid? 1: 0);
1045   if(Req(kLegEff) || Req(kOneOverLegEff)) {
1046                 values[AliDielectronVarManager::kLegEff] = GetSingleLegEff(values);
1047                                 values[AliDielectronVarManager::kOneOverLegEff] = (values[AliDielectronVarManager::kLegEff]>0.0 ? 1./values[AliDielectronVarManager::kLegEff] : 0.0);
1048         }
1049
1050 }
1051
1052 inline void AliDielectronVarManager::FillVarMCParticle(const AliMCParticle *particle, Double_t * const values)
1053 {
1054   //
1055   // Fill track information available for histogramming into an array
1056   //
1057
1058   values[AliDielectronVarManager::kNclsITS]       = 0;
1059   values[AliDielectronVarManager::kITSchi2Cl]     = 0;
1060   values[AliDielectronVarManager::kNclsTPC]       = 0;
1061   values[AliDielectronVarManager::kNclsSTPC]      = 0;
1062   values[AliDielectronVarManager::kNclsSFracTPC]  = 0;
1063   values[AliDielectronVarManager::kNclsTPCiter1]  = 0; 
1064   values[AliDielectronVarManager::kNFclsTPC]      = 0;
1065   values[AliDielectronVarManager::kNFclsTPCr]     = 0;
1066   values[AliDielectronVarManager::kNFclsTPCrFrac] = 0;
1067   values[AliDielectronVarManager::kNclsTRD]       = 0;
1068   values[AliDielectronVarManager::kTRDntracklets] = 0;
1069   values[AliDielectronVarManager::kTRDpidQuality] = 0;
1070   values[AliDielectronVarManager::kTPCchi2Cl]     = 0;
1071   values[AliDielectronVarManager::kTrackStatus]   = 0;
1072   values[AliDielectronVarManager::kFilterBit]     = 0;
1073   values[AliDielectronVarManager::kTRDprobEle]    = 0;
1074   values[AliDielectronVarManager::kTRDprobPio]    = 0;
1075   values[AliDielectronVarManager::kTPCsignalN]    = 0;
1076   values[AliDielectronVarManager::kTPCclsDiff]    = 0;
1077   values[AliDielectronVarManager::kTPCsignalNfrac]    = 0;
1078   values[AliDielectronVarManager::kImpactParXY]   = 0;
1079   values[AliDielectronVarManager::kImpactParZ]    = 0;
1080   values[AliDielectronVarManager::kPIn]           = 0;
1081   values[AliDielectronVarManager::kYsignedIn]     = 0;
1082   values[AliDielectronVarManager::kTPCsignal]     = 0;
1083   values[AliDielectronVarManager::kTOFsignal]     = 0;
1084   values[AliDielectronVarManager::kTOFbeta]       = 0;
1085   values[AliDielectronVarManager::kTPCnSigmaEleRaw]  = 0;
1086   values[AliDielectronVarManager::kTPCnSigmaEle]  = 0;
1087   values[AliDielectronVarManager::kTPCnSigmaPio]  = 0;
1088   values[AliDielectronVarManager::kTPCnSigmaMuo]  = 0;
1089   values[AliDielectronVarManager::kTPCnSigmaKao]  = 0;
1090   values[AliDielectronVarManager::kTPCnSigmaPro]  = 0;
1091   values[AliDielectronVarManager::kITSclusterMap] = 0;
1092   
1093   values[AliDielectronVarManager::kPdgCode]       = -1;
1094   values[AliDielectronVarManager::kPdgCodeMother] = -1;
1095   values[AliDielectronVarManager::kPdgCodeGrandMother] = -1;
1096   values[AliDielectronVarManager::kHasCocktailMother]=0;
1097   values[AliDielectronVarManager::kHasCocktailGrandMother]=0;
1098
1099   // Fill common AliVParticle interface information
1100   FillVarVParticle(particle, values);
1101
1102   // Fill AliMCParticle interface specific information
1103   AliDielectronMC *mc=AliDielectronMC::Instance();
1104   Int_t trkLbl = TMath::Abs(particle->GetLabel());
1105   values[AliDielectronVarManager::kPdgCode]           = particle->PdgCode();
1106   values[AliDielectronVarManager::kHasCocktailMother] = mc->CheckParticleSource(trkLbl, AliDielectronSignalMC::kDirect);
1107   values[AliDielectronVarManager::kPdgCodeMother]     = mc->GetMotherPDG(particle);
1108   AliMCParticle *motherMC=mc->GetMCTrackMother(particle); //mother
1109   if(motherMC) values[AliDielectronVarManager::kPdgCodeGrandMother]=mc->GetMotherPDG(motherMC);
1110
1111
1112   values[AliDielectronVarManager::kIsJpsiPrimary] = mc->IsJpsiPrimary(particle);
1113   values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle);
1114 }
1115
1116
1117 inline void AliDielectronVarManager::FillVarMCParticle2(const AliVParticle *p1, const AliVParticle *p2, Double_t * const values) {
1118   //
1119   // fill 2 track information starting from MC legs
1120   //
1121
1122   values[AliDielectronVarManager::kNclsITS]       = 0;
1123   values[AliDielectronVarManager::kITSchi2Cl]     = -1;
1124   values[AliDielectronVarManager::kNclsTPC]       = 0;
1125   values[AliDielectronVarManager::kNclsSTPC]       = 0;
1126   values[AliDielectronVarManager::kNclsSFracTPC]  = 0;
1127   values[AliDielectronVarManager::kNclsTPCiter1]  = 0; 
1128   values[AliDielectronVarManager::kNFclsTPC]      = 0;
1129   values[AliDielectronVarManager::kNFclsTPCr]     = 0;
1130   values[AliDielectronVarManager::kNFclsTPCrFrac] = 0;
1131   values[AliDielectronVarManager::kNclsTRD]       = 0;
1132   values[AliDielectronVarManager::kTRDntracklets] = 0;
1133   values[AliDielectronVarManager::kTRDpidQuality] = 0;
1134   values[AliDielectronVarManager::kTPCchi2Cl]     = 0;
1135   values[AliDielectronVarManager::kTrackStatus]   = 0;
1136   values[AliDielectronVarManager::kFilterBit]     = 0;
1137   values[AliDielectronVarManager::kTRDprobEle]    = 0;
1138   values[AliDielectronVarManager::kTRDprobPio]    = 0;
1139   values[AliDielectronVarManager::kTPCsignalN]    = 0;
1140   values[AliDielectronVarManager::kTPCclsDiff]    = 0;
1141   values[AliDielectronVarManager::kTPCsignalNfrac]    = 0;
1142   values[AliDielectronVarManager::kImpactParXY]   = 0;
1143   values[AliDielectronVarManager::kImpactParZ]    = 0;
1144   values[AliDielectronVarManager::kPIn]           = 0;
1145   values[AliDielectronVarManager::kYsignedIn]     = 0;
1146   values[AliDielectronVarManager::kTPCsignal]     = 0;
1147   values[AliDielectronVarManager::kTPCnSigmaEleRaw]  = 0;
1148   values[AliDielectronVarManager::kTPCnSigmaEle]  = 0;
1149   values[AliDielectronVarManager::kTPCnSigmaPio]  = 0;
1150   values[AliDielectronVarManager::kTPCnSigmaMuo]  = 0;
1151   values[AliDielectronVarManager::kTPCnSigmaKao]  = 0;
1152   values[AliDielectronVarManager::kTPCnSigmaPro]  = 0;
1153   values[AliDielectronVarManager::kITSclusterMap] = 0;
1154   
1155   values[AliDielectronVarManager::kPdgCode]       = -1;
1156   values[AliDielectronVarManager::kPdgCodeMother] = -1;
1157   values[AliDielectronVarManager::kHasCocktailMother]=0;
1158
1159   AliDielectronMC *mc=AliDielectronMC::Instance();
1160   AliVParticle* mother=0x0;
1161   Int_t mLabel1 = mc->GetMothersLabel(p1->GetLabel());
1162   Int_t mLabel2 = mc->GetMothersLabel(p2->GetLabel());
1163   if(mLabel1==mLabel2)
1164     mother = mc->GetMCTrackFromMCEvent(mLabel1);
1165
1166   values[AliDielectronVarManager::kPseudoProperTime] = -2e10;
1167   if(mother) {    // same mother
1168     FillVarVParticle(mother, values);
1169     Double_t vtxX, vtxY, vtxZ;
1170     mc->GetPrimaryVertex(vtxX,vtxY,vtxZ);
1171     Double_t lxy = ((mother->Xv()- vtxX) * mother->Px() + 
1172                     (mother->Yv()- vtxY) * mother->Py() )/mother->Pt();
1173     values[AliDielectronVarManager::kPseudoProperTime] = lxy*(TDatabasePDG::Instance()->GetParticle(443)->Mass())/mother->Pt();
1174   }
1175   // AliVParticle part
1176   values[AliDielectronVarManager::kPx]        = p1->Px()+p2->Px();
1177   values[AliDielectronVarManager::kPy]        = p1->Py()+p2->Py();
1178   values[AliDielectronVarManager::kPz]        = p1->Pz()+p2->Pz();
1179   values[AliDielectronVarManager::kPt]        = TMath::Sqrt(values[AliDielectronVarManager::kPx]*
1180                                                       values[AliDielectronVarManager::kPx]+
1181                                                       values[AliDielectronVarManager::kPy]*
1182                                                       values[AliDielectronVarManager::kPy]);
1183   values[AliDielectronVarManager::kPtSq]      = values[AliDielectronVarManager::kPt] * values[AliDielectronVarManager::kPt];
1184   values[AliDielectronVarManager::kP]         = TMath::Sqrt(values[AliDielectronVarManager::kPt]*
1185                                                       values[AliDielectronVarManager::kPt]+
1186                                                       values[AliDielectronVarManager::kPz]*
1187                                                       values[AliDielectronVarManager::kPz]);
1188     
1189   values[AliDielectronVarManager::kXv]        = 0;
1190   values[AliDielectronVarManager::kYv]        = 0;
1191   values[AliDielectronVarManager::kZv]        = 0;
1192     
1193   values[AliDielectronVarManager::kOneOverPt] = (values[AliDielectronVarManager::kPt]>1.0e-6 ? 1.0/values[AliDielectronVarManager::kPt] : 0.0);
1194   values[AliDielectronVarManager::kPhi]       = TMath::ATan2(values[AliDielectronVarManager::kPy],values[AliDielectronVarManager::kPx]);
1195   values[AliDielectronVarManager::kTheta]     = TMath::ATan2(values[AliDielectronVarManager::kPt],values[AliDielectronVarManager::kPz]);
1196   values[AliDielectronVarManager::kEta]       = ((values[AliDielectronVarManager::kP]-values[AliDielectronVarManager::kPz])>1.0e-6 && (values[AliDielectronVarManager::kP]+values[AliDielectronVarManager::kPz])>1.0e-6 ? 0.5*TMath::Log((values[AliDielectronVarManager::kP]+values[AliDielectronVarManager::kPz])/(values[AliDielectronVarManager::kP]-values[AliDielectronVarManager::kPz])) : -9999.);
1197   values[AliDielectronVarManager::kE]         = p1->E()+p2->E();
1198   values[AliDielectronVarManager::kY]         = ((values[AliDielectronVarManager::kE]-values[AliDielectronVarManager::kPz])>1.0e-6 && (values[AliDielectronVarManager::kE]+values[AliDielectronVarManager::kPz])>1.0e-6 ? 0.5*TMath::Log((values[AliDielectronVarManager::kE]+values[AliDielectronVarManager::kPz])/(values[AliDielectronVarManager::kE]-values[AliDielectronVarManager::kPz])) : -9999.);
1199   values[AliDielectronVarManager::kCharge]    = p1->Charge()+p2->Charge();
1200
1201   values[AliDielectronVarManager::kM]         = p1->M()*p1->M()+p2->M()*p2->M()+
1202                        2.0*(p1->E()*p2->E()-p1->Px()*p2->Px()-p1->Py()*p2->Py()-p1->Pz()*p2->Pz());
1203   values[AliDielectronVarManager::kM]         = (values[AliDielectronVarManager::kM]>1.0e-8 ? TMath::Sqrt(values[AliDielectronVarManager::kM]) : -1.0);
1204
1205   if ( fgEvent ) AliDielectronVarManager::Fill(fgEvent, values);  
1206
1207   values[AliDielectronVarManager::kThetaHE]   = AliDielectronPair::ThetaPhiCM(p1,p2,kTRUE,  kTRUE);
1208   values[AliDielectronVarManager::kPhiHE]     = AliDielectronPair::ThetaPhiCM(p1,p2,kTRUE,  kFALSE);
1209   values[AliDielectronVarManager::kThetaSqHE]  = values[AliDielectronVarManager::kThetaHE] * values[AliDielectronVarManager::kThetaHE];
1210   values[AliDielectronVarManager::kCos2PhiHE] = TMath::Cos(2*values[AliDielectronVarManager::kPhiHE]);
1211   values[AliDielectronVarManager::kThetaCS]   = AliDielectronPair::ThetaPhiCM(p1,p2,kFALSE, kTRUE);
1212   values[AliDielectronVarManager::kPhiCS]     = AliDielectronPair::ThetaPhiCM(p1,p2,kFALSE, kFALSE);
1213   values[AliDielectronVarManager::kThetaSqCS]  = values[AliDielectronVarManager::kThetaCS] * values[AliDielectronVarManager::kThetaCS];
1214   values[AliDielectronVarManager::kCos2PhiCS] = TMath::Cos(2*values[AliDielectronVarManager::kPhiCS]);
1215   values[AliDielectronVarManager::kCosTilPhiHE]  = (values[AliDielectronVarManager::kThetaHE]>0)?(TMath::Cos(values[AliDielectronVarManager::kPhiHE]-TMath::Pi()/4.)):(TMath::Cos(values[AliDielectronVarManager::kPhiHE]-3*TMath::Pi()/4.));
1216   values[AliDielectronVarManager::kCosTilPhiCS]  = (values[AliDielectronVarManager::kThetaCS]>0)?(TMath::Cos(values[AliDielectronVarManager::kPhiCS]-TMath::Pi()/4.)):(TMath::Cos(values[AliDielectronVarManager::kPhiCS]-3*TMath::Pi()/4.));
1217 }
1218
1219
1220 inline void AliDielectronVarManager::FillVarAODMCParticle(const AliAODMCParticle *particle, Double_t * const values)
1221 {
1222   //
1223   // Fill track information available for histogramming into an array
1224   //
1225
1226   values[AliDielectronVarManager::kNclsITS]       = 0;
1227   values[AliDielectronVarManager::kITSchi2Cl]     = -1;
1228   values[AliDielectronVarManager::kNclsTPC]       = 0;
1229   values[AliDielectronVarManager::kNclsSTPC]      = 0;
1230   values[AliDielectronVarManager::kNclsSFracTPC]  = 0;
1231   values[AliDielectronVarManager::kNclsTPCiter1]  = 0;
1232   values[AliDielectronVarManager::kNFclsTPC]      = 0;
1233   values[AliDielectronVarManager::kNclsTRD]       = 0;
1234   values[AliDielectronVarManager::kTRDntracklets] = 0;
1235   values[AliDielectronVarManager::kTRDpidQuality] = 0;
1236   values[AliDielectronVarManager::kTPCchi2Cl]     = 0;
1237   values[AliDielectronVarManager::kTrackStatus]   = 0;
1238   values[AliDielectronVarManager::kFilterBit]     = 0;
1239   values[AliDielectronVarManager::kTRDprobEle]    = 0;
1240   values[AliDielectronVarManager::kTRDprobPio]    = 0;
1241   values[AliDielectronVarManager::kTPCsignalN]    = 0;
1242   values[AliDielectronVarManager::kTPCclsDiff]    = 0;
1243   values[AliDielectronVarManager::kTPCsignalNfrac]= 0;
1244   values[AliDielectronVarManager::kImpactParXY]   = 0;
1245   values[AliDielectronVarManager::kImpactParZ]    = 0;
1246   values[AliDielectronVarManager::kPIn]           = 0;
1247   values[AliDielectronVarManager::kYsignedIn]     = 0;
1248   values[AliDielectronVarManager::kTPCsignal]     = 0;
1249   values[AliDielectronVarManager::kTPCnSigmaEleRaw]  = 0;
1250   values[AliDielectronVarManager::kTPCnSigmaEle]  = 0;
1251   values[AliDielectronVarManager::kTPCnSigmaPio]  = 0;
1252   values[AliDielectronVarManager::kTPCnSigmaMuo]  = 0;
1253   values[AliDielectronVarManager::kTPCnSigmaKao]  = 0;
1254   values[AliDielectronVarManager::kTPCnSigmaPro]  = 0;
1255   values[AliDielectronVarManager::kITSclusterMap] = 0;
1256   
1257   values[AliDielectronVarManager::kPdgCode]       = -1;
1258   values[AliDielectronVarManager::kPdgCodeMother] = -1;
1259   values[AliDielectronVarManager::kPdgCodeGrandMother] = -1;
1260   values[AliDielectronVarManager::kHasCocktailMother]=0;
1261   values[AliDielectronVarManager::kHasCocktailGrandMother]=0;
1262
1263   // Fill common AliVParticle interface information
1264   FillVarVParticle(particle, values);
1265
1266   // Fill AliAODMCParticle interface specific information
1267   AliDielectronMC *mc=AliDielectronMC::Instance();
1268   Int_t trkLbl = TMath::Abs(particle->GetLabel());
1269   values[AliDielectronVarManager::kPdgCode]           = particle->PdgCode();
1270   values[AliDielectronVarManager::kHasCocktailMother] = mc->CheckParticleSource(trkLbl, AliDielectronSignalMC::kDirect);
1271   values[AliDielectronVarManager::kPdgCodeMother]     = mc->GetMotherPDG(particle);
1272   AliAODMCParticle *motherMC=mc->GetMCTrackMother(particle); //mother
1273   if(motherMC) values[AliDielectronVarManager::kPdgCodeGrandMother]=mc->GetMotherPDG(motherMC);
1274
1275   values[AliDielectronVarManager::kIsJpsiPrimary] = mc->IsJpsiPrimary(particle);
1276   values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle);
1277
1278   // using AODMCHEader information
1279   AliAODMCHeader *mcHeader = (AliAODMCHeader*)fgEvent->FindListObject(AliAODMCHeader::StdBranchName());
1280   if(mcHeader) {
1281     values[AliDielectronVarManager::kImpactParZ]  = mcHeader->GetVtxZ()-particle->Zv();
1282     values[AliDielectronVarManager::kImpactParXY] = TMath::Sqrt(TMath::Power(mcHeader->GetVtxX()-particle->Xv(),2) +
1283                                                                 TMath::Power(mcHeader->GetVtxY()-particle->Yv(),2));
1284   }
1285
1286 }
1287
1288 inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPair *pair, Double_t * const values)
1289 {
1290   //
1291   // Fill pair information available for histogramming into an array
1292   //
1293   
1294   values[AliDielectronVarManager::kPdgCode]=-1;
1295   values[AliDielectronVarManager::kPdgCodeMother]=-1;
1296   values[AliDielectronVarManager::kPdgCodeGrandMother]=-1;
1297   values[AliDielectronVarManager::kHasCocktailMother]=0;
1298   values[AliDielectronVarManager::kHasCocktailGrandMother]=0;
1299   
1300   Double_t errPseudoProperTime2 = -1;
1301   // Fill common AliVParticle interface information
1302   FillVarVParticle(pair, values);
1303
1304   // Fill AliDielectronPair specific information
1305   const AliKFParticle &kfPair = pair->GetKFParticle();
1306
1307
1308   values[AliDielectronVarManager::kThetaHE]      = 0.0;
1309   values[AliDielectronVarManager::kPhiHE]        = 0.0;
1310   values[AliDielectronVarManager::kThetaSqHE]    = 0.0;
1311   values[AliDielectronVarManager::kCos2PhiHE]    = 0.0;
1312   values[AliDielectronVarManager::kCosTilPhiHE]  = 0.0;
1313
1314   values[AliDielectronVarManager::kThetaCS]      = 0.0;
1315   values[AliDielectronVarManager::kPhiCS]        = 0.0;
1316   values[AliDielectronVarManager::kThetaSqCS]    = 0.0;
1317   values[AliDielectronVarManager::kCos2PhiCS]    = 0.0;
1318   values[AliDielectronVarManager::kCosTilPhiCS]  = 0.0;
1319
1320   Double_t thetaHE=0;
1321   Double_t phiHE=0;
1322   Double_t thetaCS=0;
1323   Double_t phiCS=0;
1324   if(Req(kThetaHE) || Req(kPhiHE) || Req(kThetaCS) || Req(kPhiCS)) {
1325     pair->GetThetaPhiCM(thetaHE,phiHE,thetaCS,phiCS);
1326
1327     values[AliDielectronVarManager::kThetaHE]      = thetaHE;
1328     values[AliDielectronVarManager::kPhiHE]        = phiHE;
1329     values[AliDielectronVarManager::kThetaSqHE]    = thetaHE * thetaHE;
1330     values[AliDielectronVarManager::kCos2PhiHE]    = TMath::Cos(2.0*phiHE);
1331     values[AliDielectronVarManager::kCosTilPhiHE]  = (thetaHE>0)?(TMath::Cos(phiHE-TMath::Pi()/4.)):(TMath::Cos(phiHE-3*TMath::Pi()/4.));
1332     values[AliDielectronVarManager::kThetaCS]      = thetaCS;
1333     values[AliDielectronVarManager::kPhiCS]        = phiCS;
1334     values[AliDielectronVarManager::kThetaSqCS]    = thetaCS * thetaCS;
1335     values[AliDielectronVarManager::kCos2PhiCS]    = TMath::Cos(2.0*phiCS);
1336     values[AliDielectronVarManager::kCosTilPhiCS]  = (thetaCS>0)?(TMath::Cos(phiCS-TMath::Pi()/4.)):(TMath::Cos(phiCS-3*TMath::Pi()/4.));
1337   }
1338
1339   if(Req(kChi2NDF))          values[AliDielectronVarManager::kChi2NDF]          = kfPair.GetChi2()/kfPair.GetNDF();
1340   if(Req(kDecayLength))      values[AliDielectronVarManager::kDecayLength]      = kfPair.GetDecayLength();
1341   if(Req(kR))                values[AliDielectronVarManager::kR]                = kfPair.GetR();
1342   if(Req(kOpeningAngle))     values[AliDielectronVarManager::kOpeningAngle]     = pair->OpeningAngle();
1343   if(Req(kCosPointingAngle)) values[AliDielectronVarManager::kCosPointingAngle] = fgEvent ? pair->GetCosPointingAngle(fgEvent->GetPrimaryVertex()) : -1;
1344
1345   if(Req(kLegDist))   values[AliDielectronVarManager::kLegDist]      = pair->DistanceDaughters();
1346   if(Req(kLegDistXY)) values[AliDielectronVarManager::kLegDistXY]    = pair->DistanceDaughtersXY();
1347   if(Req(kDeltaEta))  values[AliDielectronVarManager::kDeltaEta]     = pair->DeltaEta();
1348   if(Req(kDeltaPhi))  values[AliDielectronVarManager::kDeltaPhi]     = pair->DeltaPhi();
1349   if(Req(kMerr))      values[AliDielectronVarManager::kMerr]         = kfPair.GetErrMass()>1e-30&&kfPair.GetMass()>1e-30?kfPair.GetErrMass()/kfPair.GetMass():1000000;
1350
1351   values[AliDielectronVarManager::kPairType]     = pair->GetType();
1352   // Armenteros-Podolanski quantities
1353   if(Req(kArmAlpha)) values[AliDielectronVarManager::kArmAlpha]     = pair->GetArmAlpha();
1354   if(Req(kArmPt))    values[AliDielectronVarManager::kArmPt]        = pair->GetArmPt();
1355
1356   if(Req(kPsiPair))  values[AliDielectronVarManager::kPsiPair]      = fgEvent ? pair->PsiPair(fgEvent->GetMagneticField()) : -5;
1357   if(Req(kPhivPair)) values[AliDielectronVarManager::kPhivPair]      = fgEvent ? pair->PhivPair(fgEvent->GetMagneticField()) : -5;
1358   if(Req(kPseudoProperTime) || Req(kPseudoProperTimeErr)) {
1359     values[AliDielectronVarManager::kPseudoProperTime] = 
1360       fgEvent ? kfPair.GetPseudoProperDecayTime(*(fgEvent->GetPrimaryVertex()), TDatabasePDG::Instance()->GetParticle(443)->Mass(), &errPseudoProperTime2 ) : -1e10;
1361   // values[AliDielectronVarManager::kPseudoProperTime] = fgEvent ? pair->GetPseudoProperTime(fgEvent->GetPrimaryVertex()): -1e10;
1362     values[AliDielectronVarManager::kPseudoProperTimeErr] = (errPseudoProperTime2 > 0) ? TMath::Sqrt(errPseudoProperTime2) : -1e10;
1363   }
1364
1365   // impact parameter
1366   Double_t d0z0[2]={-999., -999.};
1367   if( (Req(kImpactParXY) || Req(kImpactParZ)) && fgEvent) pair->GetDCA(fgEvent->GetPrimaryVertex(), d0z0);
1368   values[AliDielectronVarManager::kImpactParXY]   = d0z0[0];
1369   values[AliDielectronVarManager::kImpactParZ]    = d0z0[1];
1370
1371  
1372   if (!(pair->GetKFUsage())) {
1373         //if KF Pairing is not enabled, overwrite values that can be easily derived from legs
1374         //use the INDIVIDUAL KF particles as source, which should be a copy of the corresponding properties
1375         //the ESDtrack, the reference to the ESDtrack is not (always) accessible in Mixing, while KF
1376         //particles are copied in the Pair-Object
1377         static const Double_t mElectron = AliPID::ParticleMass(AliPID::kElectron); // MeV
1378
1379         const AliKFParticle& fD1 = pair->GetKFFirstDaughter();
1380         const AliKFParticle& fD2 = pair->GetKFSecondDaughter();
1381
1382         //Define local buffer variables for leg properties
1383         Double_t px1=-9999.,py1=-9999.,pz1=-9999.;
1384         Double_t px2=-9999.,py2=-9999.,pz2=-9999.;
1385         Double_t e1 =-9999.,e2 =-9999.;
1386         Double_t feta1=-9999.;//,fphi1=-9999.;
1387         Double_t feta2=-9999.;//,fphi2=-9999.;
1388
1389         px1 = fD1.GetPx(); 
1390         py1 = fD1.GetPy(); 
1391         pz1 = fD1.GetPz(); 
1392         feta1 = fD1.GetEta();
1393         //      fphi1 = fD1.GetPhi();
1394
1395         px2 = fD2.GetPx(); 
1396         py2 = fD2.GetPy(); 
1397         pz2 = fD2.GetPz(); 
1398         feta2 = fD2.GetEta();
1399         //      fphi2 = fD2.GetPhi();
1400
1401         //Calculate Energy per particle by hand
1402         e1 = TMath::Sqrt(mElectron*mElectron+px1*px1+py1*py1+pz1*pz1);
1403         e2 = TMath::Sqrt(mElectron*mElectron+px2*px2+py2*py2+pz2*pz2);
1404
1405         //Now Create TLorentzVector:
1406         TLorentzVector lv1,lv2;
1407         lv1.SetPxPyPzE(px1,py1,pz1,e1);
1408         lv2.SetPxPyPzE(px2,py2,pz2,e2);
1409
1410         values[AliDielectronVarManager::kPx]        = (lv1+lv2).Px();
1411         values[AliDielectronVarManager::kPy]        = (lv1+lv2).Py();
1412         values[AliDielectronVarManager::kPz]        = (lv1+lv2).Pz();
1413
1414         values[AliDielectronVarManager::kPt]        =  (lv1+lv2).Pt();
1415         values[AliDielectronVarManager::kPtSq]      = values[AliDielectronVarManager::kPt] * values[AliDielectronVarManager::kPt];
1416
1417         values[AliDielectronVarManager::kP]         =  (lv1+lv2).P();
1418
1419         //Not overwritten, could take event vertex in next iteration
1420         values[AliDielectronVarManager::kXv]        = (lv1+lv2).X(); 
1421         values[AliDielectronVarManager::kYv]        = (lv1+lv2).Y();
1422         values[AliDielectronVarManager::kZv]        = (lv1+lv2).Z();
1423
1424         values[AliDielectronVarManager::kE]         = (lv1+lv2).E();
1425
1426
1427         values[AliDielectronVarManager::kM]         = (lv1+lv2).M();
1428
1429         values[AliDielectronVarManager::kOpeningAngle] =  lv1.Angle(lv2.Vect());
1430
1431         values[AliDielectronVarManager::kOneOverPt] = (values[AliDielectronVarManager::kPt]>0. ? 1./values[AliDielectronVarManager::kPt] : -9999.);
1432         values[AliDielectronVarManager::kPhi]       = (lv1+lv2).Phi()+TMath::Pi(); // change interval to [0,+2pi]
1433         values[AliDielectronVarManager::kEta]       = (lv1+lv2).Eta();
1434
1435         values[AliDielectronVarManager::kY]       = (lv1+lv2).Rapidity();
1436
1437         for (Int_t i=AliDielectronVarManager::kPairMax; i<AliDielectronVarManager::kNMaxValues; ++i)
1438           values[i]=fgData[i];
1439
1440         // Fill AliDielectronPair specific information
1441         values[AliDielectronVarManager::kDeltaEta]     = TMath::Abs(feta1 -feta2 );
1442         values[AliDielectronVarManager::kDeltaPhi]     = lv1.DeltaPhi(lv2);
1443         values[AliDielectronVarManager::kPairType]     = pair->GetType();
1444
1445         /*
1446         //Also not overwritten, still coming from KF particle
1447         //where needed to be replaced by independent determination
1448         values[AliDielectronVarManager::kCharge]    = 0.;
1449         values[AliDielectronVarManager::kPdgCode]   = 0.;
1450         values[AliDielectronVarManager::kChi2NDF]      = 0.;
1451         values[AliDielectronVarManager::kDecayLength]  = 0.;
1452         values[AliDielectronVarManager::kR]            = 0.;
1453         values[AliDielectronVarManager::kCosPointingAngle] = 0.;
1454         values[AliDielectronVarManager::kThetaHE]      = 0.;
1455         values[AliDielectronVarManager::kPhiHE]        = 0.;
1456         values[AliDielectronVarManager::kThetaSqHE]    = 0.;
1457         values[AliDielectronVarManager::kCos2PhiHE]    = 0.;
1458         values[AliDielectronVarManager::kCosTilPhiHE]  = 0.;
1459         values[AliDielectronVarManager::kThetaCS]      = 0.;
1460         values[AliDielectronVarManager::kPhiCS]        = 0.;
1461         values[AliDielectronVarManager::kThetaSqCS]    = 0.;
1462         values[AliDielectronVarManager::kCos2PhiCS]    = 0.;
1463         values[AliDielectronVarManager::kCosTilPhiCS]  = 0.;
1464         values[AliDielectronVarManager::kLegDist]      = 0.;
1465         values[AliDielectronVarManager::kLegDistXY]    = 0.;
1466         values[AliDielectronVarManager::kMerr]         = 0.;
1467         values[AliDielectronVarManager::kPseudoProperTime] = 0.;
1468         values[AliDielectronVarManager::kPseudoProperTimeErr] = 0.;
1469         //Fill in Taku's PhiV?
1470         values[AliDielectronVarManager::kPsiPair]      = 0.;
1471
1472          */
1473   }
1474   //common, regardless of calculation method 
1475
1476   // Flow quantities
1477   Double_t phi=values[AliDielectronVarManager::kPhi];
1478   if(Req(kCosPhiH2)) values[AliDielectronVarManager::kCosPhiH2] = TMath::Cos(2*phi);
1479   if(Req(kSinPhiH2)) values[AliDielectronVarManager::kSinPhiH2] = TMath::Sin(2*phi);
1480   Double_t delta=0.0;
1481   // v2 with respect to VZERO-A event plane
1482   delta = phi - fgData[AliDielectronVarManager::kV0ArpH2];
1483   if(delta>TMath::Pi()) delta -= 2.0*TMath::Pi();             // keep the [-pi,+pi] interval
1484   if(delta<-1.0*TMath::Pi()) delta += 2.0*TMath::Pi();
1485   if(Req(kV0ArpH2FlowV2))   values[AliDielectronVarManager::kV0ArpH2FlowV2] = TMath::Cos(2.0*delta);  // 2nd harmonic flow coefficient
1486   if(Req(kDeltaPhiV0ArpH2)) values[AliDielectronVarManager::kDeltaPhiV0ArpH2] = delta;
1487   // v2 with respect to VZERO-C event plane
1488   delta = phi - fgData[AliDielectronVarManager::kV0CrpH2];
1489   if(delta>TMath::Pi()) delta -= 2.0*TMath::Pi();             // keep the [-pi,+pi] interval
1490   if(delta<-1.0*TMath::Pi()) delta += 2.0*TMath::Pi();
1491   if(Req(kV0CrpH2FlowV2))   values[AliDielectronVarManager::kV0CrpH2FlowV2] = TMath::Cos(2.0*delta);  // 2nd harmonic flow coefficient
1492   if(Req(kDeltaPhiV0CrpH2)) values[AliDielectronVarManager::kDeltaPhiV0CrpH2] = delta;
1493   // v2 with respect to the combined VZERO-A and VZERO-C event plane
1494   delta = phi - fgData[AliDielectronVarManager::kV0ACrpH2];
1495   if(delta>TMath::Pi()) delta -= 2.0*TMath::Pi();             // keep the [-pi,+pi] interval
1496   if(delta<-1.0*TMath::Pi()) delta += 2.0*TMath::Pi();
1497   if(Req(kV0ACrpH2FlowV2))   values[AliDielectronVarManager::kV0ACrpH2FlowV2] = TMath::Cos(2.0*delta);  // 2nd harmonic flow coefficient
1498   if(Req(kDeltaPhiV0ACrpH2)) values[AliDielectronVarManager::kDeltaPhiV0ACrpH2] = delta;
1499
1500
1501   // quantities using the values of  AliEPSelectionTask
1502   values[AliDielectronVarManager::kDeltaPhiv0ArpH2]  = phi - values[AliDielectronVarManager::kv0ArpH2];
1503   values[AliDielectronVarManager::kDeltaPhiv0CrpH2]  = phi - values[AliDielectronVarManager::kv0CrpH2];
1504   values[AliDielectronVarManager::kDeltaPhiv0ACrpH2] = phi - values[AliDielectronVarManager::kv0ACrpH2];
1505   values[AliDielectronVarManager::kDeltaPhiTPCrpH2]  = phi - values[AliDielectronVarManager::kTPCrpH2];
1506   values[AliDielectronVarManager::kv0ACrpH2FlowV2]   = TMath::Cos( 2*(phi - values[AliDielectronVarManager::kv0ACrpH2]) );
1507   values[AliDielectronVarManager::kv0ArpH2FlowV2]    = TMath::Cos( 2*(phi - values[AliDielectronVarManager::kv0ArpH2]) );
1508   values[AliDielectronVarManager::kv0CrpH2FlowV2]    = TMath::Cos( 2*(phi - values[AliDielectronVarManager::kv0CrpH2]) );
1509   values[AliDielectronVarManager::kTPCrpH2FlowV2]    = TMath::Cos( 2*(phi - values[AliDielectronVarManager::kTPCrpH2]) );
1510   values[AliDielectronVarManager::kTPCrpH2FlowV2Sin] = TMath::Sin( 2*(phi - values[AliDielectronVarManager::kTPCrpH2]) );
1511
1512
1513   // keep the interval [-pi,+pi]
1514   if ( values[kDeltaPhiv0ArpH2] > TMath::Pi() )           values[kDeltaPhiv0ArpH2] -= TMath::TwoPi(); 
1515   if ( values[kDeltaPhiv0CrpH2] > TMath::Pi() )           values[kDeltaPhiv0CrpH2] -= TMath::TwoPi(); 
1516   if ( values[kDeltaPhiv0ACrpH2] > TMath::Pi() )          values[kDeltaPhiv0ACrpH2] -= TMath::TwoPi(); 
1517   if ( values[kDeltaPhiTPCrpH2] > TMath::Pi() )           values[kDeltaPhiTPCrpH2] -= TMath::TwoPi(); 
1518
1519   if ( values[kDeltaPhiv0ArpH2] < -1.*TMath::Pi() )       values[kDeltaPhiv0ArpH2] += TMath::TwoPi(); 
1520   if ( values[kDeltaPhiv0CrpH2] < -1.*TMath::Pi() )       values[kDeltaPhiv0CrpH2] += TMath::TwoPi(); 
1521   if ( values[kDeltaPhiv0ACrpH2] < -1.*TMath::Pi() )      values[kDeltaPhiv0ACrpH2] += TMath::TwoPi(); 
1522   if ( values[kDeltaPhiTPCrpH2] < -1.*TMath::Pi() )       values[kDeltaPhiTPCrpH2] += TMath::TwoPi(); 
1523
1524   //calculate inner product of strong Mag and ee plane 
1525   if(Req(kPairPlaneMagInPro)) values[AliDielectronVarManager::kPairPlaneMagInPro] = pair->PairPlaneMagInnerProduct(values[AliDielectronVarManager::kZDCACrpH1]);
1526
1527   //Calculate the angle between electrons decay plane and variables 1-4
1528   if(Req(kPairPlaneAngle1A)) values[AliDielectronVarManager::kPairPlaneAngle1A] = pair->GetPairPlaneAngle(values[kv0ArpH2],1);
1529   if(Req(kPairPlaneAngle2A)) values[AliDielectronVarManager::kPairPlaneAngle2A] = pair->GetPairPlaneAngle(values[kv0ArpH2],2);
1530   if(Req(kPairPlaneAngle3A)) values[AliDielectronVarManager::kPairPlaneAngle3A] = pair->GetPairPlaneAngle(values[kv0ArpH2],3);
1531   if(Req(kPairPlaneAngle4A)) values[AliDielectronVarManager::kPairPlaneAngle4A] = pair->GetPairPlaneAngle(values[kv0ArpH2],4);
1532
1533   if(Req(kPairPlaneAngle1C)) values[AliDielectronVarManager::kPairPlaneAngle1C] = pair->GetPairPlaneAngle(values[kv0CrpH2],1);
1534   if(Req(kPairPlaneAngle2C)) values[AliDielectronVarManager::kPairPlaneAngle2C] = pair->GetPairPlaneAngle(values[kv0CrpH2],2);
1535   if(Req(kPairPlaneAngle3C)) values[AliDielectronVarManager::kPairPlaneAngle3C] = pair->GetPairPlaneAngle(values[kv0CrpH2],3);
1536   if(Req(kPairPlaneAngle4C)) values[AliDielectronVarManager::kPairPlaneAngle4C] = pair->GetPairPlaneAngle(values[kv0CrpH2],4);
1537
1538   if(Req(kPairPlaneAngle1AC)) values[AliDielectronVarManager::kPairPlaneAngle1AC] = pair->GetPairPlaneAngle(values[kv0ACrpH2],1);
1539   if(Req(kPairPlaneAngle2AC)) values[AliDielectronVarManager::kPairPlaneAngle2AC] = pair->GetPairPlaneAngle(values[kv0ACrpH2],2);
1540   if(Req(kPairPlaneAngle3AC)) values[AliDielectronVarManager::kPairPlaneAngle3AC] = pair->GetPairPlaneAngle(values[kv0ACrpH2],3);
1541   if(Req(kPairPlaneAngle4AC)) values[AliDielectronVarManager::kPairPlaneAngle4AC] = pair->GetPairPlaneAngle(values[kv0ACrpH2],4);
1542
1543   //Random reaction plane
1544   values[AliDielectronVarManager::kRandomRP] = gRandom->Uniform(-TMath::Pi()/2.0,TMath::Pi()/2.0);
1545   //delta phi of pair fron random reaction plane
1546   values[AliDielectronVarManager::kDeltaPhiRandomRP] = phi - values[kRandomRP];
1547   // keep the interval [-pi,+pi]
1548   if ( values[AliDielectronVarManager::kDeltaPhiRandomRP] > TMath::Pi() )
1549     values[AliDielectronVarManager::kDeltaPhiRandomRP] -= TMath::TwoPi();
1550
1551   if(Req(kPairPlaneAngle1Ran)) values[AliDielectronVarManager::kPairPlaneAngle1Ran]= pair->GetPairPlaneAngle(values[kRandomRP],1);
1552   if(Req(kPairPlaneAngle2Ran)) values[AliDielectronVarManager::kPairPlaneAngle2Ran]= pair->GetPairPlaneAngle(values[kRandomRP],2);
1553   if(Req(kPairPlaneAngle3Ran)) values[AliDielectronVarManager::kPairPlaneAngle3Ran]= pair->GetPairPlaneAngle(values[kRandomRP],3);
1554   if(Req(kPairPlaneAngle4Ran)) values[AliDielectronVarManager::kPairPlaneAngle4Ran]= pair->GetPairPlaneAngle(values[kRandomRP],4);
1555
1556
1557
1558   AliDielectronMC *mc=AliDielectronMC::Instance();
1559   
1560   if (mc->HasMC()){
1561     values[AliDielectronVarManager::kPseudoProperTimeResolution] = -10.0e+10;
1562     Bool_t samemother =  mc->HaveSameMother(pair);
1563     values[AliDielectronVarManager::kIsJpsiPrimary] = mc->IsJpsiPrimary(pair);
1564     values[AliDielectronVarManager::kHaveSameMother] = samemother ;
1565
1566     // fill kPseudoProperTimeResolution
1567     values[AliDielectronVarManager::kPseudoProperTimeResolution] = -1e10;
1568     // values[AliDielectronVarManager::kPseudoProperTimePull] = -1e10;
1569     if(samemother && fgEvent) {
1570       if(pair->GetFirstDaughter()->GetLabel() > 0) {
1571         const AliVParticle *motherMC = 0x0;
1572         if(fgEvent->IsA() == AliESDEvent::Class())  motherMC = (AliMCParticle*)mc->GetMCTrackMother((AliESDtrack*)pair->GetFirstDaughter());
1573         else if(fgEvent->IsA() == AliAODEvent::Class())  motherMC = (AliAODMCParticle*)mc->GetMCTrackMother((AliAODTrack*)pair->GetFirstDaughter());
1574         Double_t vtxX, vtxY, vtxZ;
1575         if(motherMC && mc->GetPrimaryVertex(vtxX,vtxY,vtxZ)) {
1576           Int_t motherLbl = motherMC->GetLabel();
1577           values[AliDielectronVarManager::kHasCocktailMother]=mc->CheckParticleSource(motherLbl, AliDielectronSignalMC::kDirect);
1578           const Double_t lxyMC = ( (motherMC->Xv() - vtxX) * motherMC->Px() +
1579                                    (motherMC->Yv() - vtxY) * motherMC->Py()   ) / motherMC->Pt();
1580           const Double_t pseudoMC = lxyMC * (TDatabasePDG::Instance()->GetParticle(443)->Mass())/motherMC->Pt();
1581           values[AliDielectronVarManager::kPseudoProperTimeResolution] = values[AliDielectronVarManager::kPseudoProperTime] - pseudoMC;
1582           if (errPseudoProperTime2 > 0)
1583             values[AliDielectronVarManager::kPseudoProperTimePull] = values[AliDielectronVarManager::kPseudoProperTimeResolution]/sqrt(errPseudoProperTime2);
1584       }
1585       }
1586     }
1587     
1588         values[AliDielectronVarManager::kTRDpidEffPair] = 0.;
1589         if (fgTRDpidEff[0][0]){
1590           Double_t valuesLeg1[AliDielectronVarManager::kNMaxValues];
1591           Double_t valuesLeg2[AliDielectronVarManager::kNMaxValues];
1592           AliVParticle* leg1 = pair->GetFirstDaughter();
1593           AliVParticle* leg2 = pair->GetSecondDaughter();
1594           if (leg1 && leg2){
1595                 Fill(leg1, valuesLeg1);
1596                 Fill(leg2, valuesLeg2);
1597                 values[AliDielectronVarManager::kTRDpidEffPair] = valuesLeg1[AliDielectronVarManager::kTRDpidEffLeg]*valuesLeg2[AliDielectronVarManager::kTRDpidEffLeg];
1598           }
1599         }
1600
1601
1602   }//if (mc->HasMC())
1603
1604   AliVParticle* leg1 = pair->GetFirstDaughter();
1605   AliVParticle* leg2 = pair->GetSecondDaughter();
1606   if (leg1)
1607     values[AliDielectronVarManager::kMomAsymDau1] = (values[AliDielectronVarManager::kP] != 0)? leg1->P()  / values[AliDielectronVarManager::kP]: 0;
1608   else 
1609     values[AliDielectronVarManager::kMomAsymDau1] = -9999.;
1610   if (leg2)
1611     values[AliDielectronVarManager::kMomAsymDau2] = (values[AliDielectronVarManager::kP] != 0)? leg2->P()  / values[AliDielectronVarManager::kP]: 0;
1612   else 
1613     values[AliDielectronVarManager::kMomAsymDau2] = -9999.;
1614
1615   Double_t valuesLeg1[AliDielectronVarManager::kNMaxValues];
1616   Double_t valuesLeg2[AliDielectronVarManager::kNMaxValues];
1617   if (leg1 && leg2 && fgLegEffMap) {
1618     Fill(leg1, valuesLeg1);
1619     Fill(leg2, valuesLeg2);
1620     values[AliDielectronVarManager::kPairEff] = valuesLeg1[AliDielectronVarManager::kLegEff] *valuesLeg2[AliDielectronVarManager::kLegEff];
1621   }
1622   else if(fgPairEffMap) {
1623     values[AliDielectronVarManager::kPairEff] = GetPairEff(values);
1624   }
1625   values[AliDielectronVarManager::kOneOverPairEff] = (values[AliDielectronVarManager::kPairEff]>0.0 ? 1./values[AliDielectronVarManager::kPairEff] : 1.0);
1626   values[AliDielectronVarManager::kOneOverPairEffSq] = (values[AliDielectronVarManager::kPairEff]>0.0 ? 1./values[AliDielectronVarManager::kPairEff]/values[AliDielectronVarManager::kPairEff] : 1.0);
1627
1628   if(kRndmPair) values[AliDielectronVarManager::kRndmPair] = gRandom->Rndm();
1629 }
1630
1631 inline void AliDielectronVarManager::FillVarKFParticle(const AliKFParticle *particle, Double_t * const values)
1632 {
1633   //
1634   // Fill track information available in AliVParticle into an array
1635   //
1636   values[AliDielectronVarManager::kPx]        = particle->GetPx();
1637   values[AliDielectronVarManager::kPy]        = particle->GetPy();
1638   values[AliDielectronVarManager::kPz]        = particle->GetPz();
1639   values[AliDielectronVarManager::kPt]        = particle->GetPt();
1640   values[AliDielectronVarManager::kPtSq]      = particle->GetPt() * particle->GetPt();
1641   values[AliDielectronVarManager::kP]         = particle->GetP();
1642   
1643   values[AliDielectronVarManager::kXv]        = particle->GetX();
1644   values[AliDielectronVarManager::kYv]        = particle->GetY();
1645   values[AliDielectronVarManager::kZv]        = particle->GetZ();
1646   
1647   values[AliDielectronVarManager::kOneOverPt] = 0;
1648   values[AliDielectronVarManager::kPhi]       = particle->GetPhi();
1649   values[AliDielectronVarManager::kTheta]     = 0.;
1650   values[AliDielectronVarManager::kEta]       = particle->GetEta();
1651   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.;
1652   
1653   values[AliDielectronVarManager::kE]         = particle->GetE();
1654   values[AliDielectronVarManager::kM]         = particle->GetMass();
1655   values[AliDielectronVarManager::kCharge]    = particle->GetQ();
1656   
1657   values[AliDielectronVarManager::kNclsITS]       = 0;
1658   values[AliDielectronVarManager::kITSchi2Cl]     = -1;
1659   values[AliDielectronVarManager::kNclsTPC]       = 0;
1660   values[AliDielectronVarManager::kNclsSTPC]      = 0;
1661   values[AliDielectronVarManager::kNclsSFracTPC]  = 0;
1662   values[AliDielectronVarManager::kNclsTPCiter1]  = 0;
1663   values[AliDielectronVarManager::kNFclsTPC]      = 0;
1664   values[AliDielectronVarManager::kNclsTRD]       = 0;
1665   values[AliDielectronVarManager::kTRDntracklets] = 0;
1666   values[AliDielectronVarManager::kTRDpidQuality] = 0;
1667   values[AliDielectronVarManager::kTPCchi2Cl]     = 0;
1668   values[AliDielectronVarManager::kTrackStatus]   = 0;
1669   values[AliDielectronVarManager::kFilterBit]     = 0;
1670   values[AliDielectronVarManager::kTRDprobEle]    = 0;
1671   values[AliDielectronVarManager::kTRDprobPio]    = 0;
1672   values[AliDielectronVarManager::kTPCsignalN]    = 0;
1673   values[AliDielectronVarManager::kTPCclsDiff]    = 0;
1674   values[AliDielectronVarManager::kTPCsignalNfrac]= 0;
1675   values[AliDielectronVarManager::kImpactParXY]   = 0;
1676   values[AliDielectronVarManager::kImpactParZ]    = 0;
1677   values[AliDielectronVarManager::kPIn]           = 0;
1678   values[AliDielectronVarManager::kYsignedIn]     = 0;
1679   values[AliDielectronVarManager::kTPCsignal]     = 0;
1680   values[AliDielectronVarManager::kTOFsignal]     = 0;
1681   values[AliDielectronVarManager::kTOFbeta]       = 0;
1682   values[AliDielectronVarManager::kTPCnSigmaEleRaw]  = 0;
1683   values[AliDielectronVarManager::kTPCnSigmaEle]  = 0;
1684   values[AliDielectronVarManager::kTPCnSigmaPio]  = 0;
1685   values[AliDielectronVarManager::kTPCnSigmaMuo]  = 0;
1686   values[AliDielectronVarManager::kTPCnSigmaKao]  = 0;
1687   values[AliDielectronVarManager::kTPCnSigmaPro]  = 0;
1688   values[AliDielectronVarManager::kITSclusterMap] = 0;
1689   
1690   values[AliDielectronVarManager::kPdgCode]       = -1;
1691   values[AliDielectronVarManager::kPdgCodeMother] = -1;
1692   values[AliDielectronVarManager::kPdgCodeGrandMother] = -1;
1693   values[AliDielectronVarManager::kHasCocktailMother]=0;
1694   values[AliDielectronVarManager::kHasCocktailGrandMother]=0;
1695   
1696 //   if ( fgEvent ) AliDielectronVarManager::Fill(fgEvent, values);
1697   for (Int_t i=AliDielectronVarManager::kPairMax; i<AliDielectronVarManager::kNMaxValues; ++i)
1698     values[i]=fgData[i];
1699   
1700 }
1701
1702 inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Double_t * const values)
1703 {
1704   //
1705   // Fill event information available for histogramming into an array
1706   //
1707   values[AliDielectronVarManager::kRunNumber]    = event->GetRunNumber();
1708   if(fgCurrentRun!=event->GetRunNumber()) {
1709     if(fgVZEROCalibrationFile.Contains(".root")) InitVZEROCalibrationHistograms(event->GetRunNumber());
1710     if(fgVZERORecenteringFile.Contains(".root")) InitVZERORecenteringHistograms(event->GetRunNumber());
1711     if(fgZDCRecenteringFile.Contains(".root")) InitZDCRecenteringHistograms(event->GetRunNumber());
1712     fgCurrentRun=event->GetRunNumber();
1713   }
1714   values[AliDielectronVarManager::kMixingBin]=0;
1715
1716   const AliVVertex *primVtx = event->GetPrimaryVertex();
1717   
1718   values[AliDielectronVarManager::kXvPrim]       = 0;
1719   values[AliDielectronVarManager::kYvPrim]       = 0;
1720   values[AliDielectronVarManager::kZvPrim]       = 0;
1721   values[AliDielectronVarManager::kNVtxContrib]  = 0;
1722 //   values[AliDielectronVarManager::kChi2NDF]      = 0; //This is the pair value!!!
1723
1724   values[AliDielectronVarManager::kNTrk]            = 0;
1725   values[AliDielectronVarManager::kNVtxContrib]     = 0;
1726   values[AliDielectronVarManager::kNacc]            = 0;
1727   values[AliDielectronVarManager::kNaccTrcklts]     = 0;
1728   values[AliDielectronVarManager::kNaccTrcklts0916] = 0;
1729   values[AliDielectronVarManager::kNevents]         = 0; //always fill bin 0;
1730   values[AliDielectronVarManager::kRefMult]         = 0;
1731   values[AliDielectronVarManager::kRefMultTPConly]  = 0;
1732   
1733   if (primVtx){
1734     //    printf("prim vertex reco: %f \n",primVtx->GetX());
1735     values[AliDielectronVarManager::kXvPrim]       = primVtx->GetX();
1736     values[AliDielectronVarManager::kYvPrim]       = primVtx->GetY();
1737     values[AliDielectronVarManager::kZvPrim]       = primVtx->GetZ();
1738     values[AliDielectronVarManager::kNVtxContrib]  = primVtx->GetNContributors();
1739   }
1740   //   values[AliDielectronVarManager::kChi2NDF]      = primVtx->GetChi2perNDF(); //this is the pair value
1741
1742   // online and offline trigger maps
1743   values[AliDielectronVarManager::kTriggerInclONL]     = event->GetTriggerMask();
1744   AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
1745   UInt_t maskOff = ((AliInputEventHandler*)man->GetInputEventHandler())->IsEventSelected();
1746   values[AliDielectronVarManager::kTriggerInclOFF]     = maskOff;
1747   values[AliDielectronVarManager::kTriggerExclOFF]        = -1;
1748   for(Int_t i=0; i<30; i++) { if(maskOff==BIT(i)) values[AliDielectronVarManager::kTriggerExclOFF]=i; }
1749
1750   values[AliDielectronVarManager::kNTrk]            = event->GetNumberOfTracks();
1751   if(Req(kNacc))            values[AliDielectronVarManager::kNacc]            = AliDielectronHelper::GetNacc(event);
1752   if(Req(kMatchEffITSTPC))  values[AliDielectronVarManager::kMatchEffITSTPC]  = AliDielectronHelper::GetITSTPCMatchEff(event);
1753   if(Req(kNaccTrcklts))     values[AliDielectronVarManager::kNaccTrcklts]     = AliDielectronHelper::GetNaccTrcklts(event); // etaRange = 1.6 (default)
1754   if(Req(kNaccTrcklts0916)) values[AliDielectronVarManager::kNaccTrcklts0916] = AliDielectronHelper::GetNaccTrcklts(event,1.6)-AliDielectronHelper::GetNaccTrcklts(event,.9);
1755   //  values[AliDielectronVarManager::kNaccTrcklts05]   = AliDielectronHelper::GetNaccTrcklts(event, 0.5); // AODHeader::fRefMultComb05
1756   //  values[AliDielectronVarManager::kNaccTrcklts10]   = AliDielectronHelper::GetNaccTrcklts(event, 1.0);
1757   //  values[AliDielectronVarManager::kNaccTrckltsCorr] = AliDielectronHelper::GetNaccTrckltsCorrected(event, values[AliDielectronVarManager::kNaccTrcklts], values[AliDielectronVarManager::kZvPrim]);
1758
1759
1760   Double_t ptMaxEv    = -1., phiptMaxEv= -1.;
1761   if(Req(kMaxPt) || Req(kPhiMaxPt)) AliDielectronHelper::GetMaxPtAndPhi(event, ptMaxEv, phiptMaxEv);
1762   values[AliDielectronVarManager::kPhiMaxPt]          = phiptMaxEv;
1763   values[AliDielectronVarManager::kMaxPt]             = ptMaxEv;
1764
1765
1766   // event plane quantities from the AliEPSelectionTask
1767   for(Int_t ivar=AliDielectronVarManager::kv0ArpH2; ivar<=kv0C0v0C3DiffH2;   ivar++) values[ivar] = 0.0; // v0  variables
1768   for(Int_t ivar=AliDielectronVarManager::kTPCxH2;  ivar<=kTPCsub12DiffH2uc; ivar++) values[ivar] = 0.0; // tpc variables
1769
1770   // ep angle interval [todo, fill]
1771   AliEventplane *ep = const_cast<AliVEvent*>(event)->GetEventplane();
1772   if(ep) {
1773
1774     // TPC event plane quantities (uncorrected)
1775     TVector2 *qstd  = ep->GetQVector();  // This is the "standard" Q-Vector for TPC
1776     TVector2 *qsub1 = ep->GetQsub1();    // random subevent plane
1777     TVector2 *qsub2 = ep->GetQsub2();
1778     if(qstd && qsub1 && qsub2) {
1779       values[AliDielectronVarManager::kTPCxH2uc]       = qstd->X();
1780       values[AliDielectronVarManager::kTPCyH2uc]       = qstd->Y();
1781       values[AliDielectronVarManager::kTPCmagH2uc]     = qstd->Mod();
1782       values[AliDielectronVarManager::kTPCrpH2uc]      = ((TMath::Abs(qstd->X())>1.0e-10) ? TMath::ATan2(qstd->Y(),qstd->X())/2.0 : 0.0);
1783       values[AliDielectronVarManager::kTPCsub1xH2uc]   = qsub1->X();
1784       values[AliDielectronVarManager::kTPCsub1yH2uc]   = qsub1->Y();
1785       values[AliDielectronVarManager::kTPCsub1rpH2uc]  = ((TMath::Abs(qsub1->X())>1.0e-10) ? TMath::ATan2(qsub1->Y(),qsub1->X())/2.0 : 0.0);
1786       values[AliDielectronVarManager::kTPCsub2xH2uc]   = qsub2->X();
1787       values[AliDielectronVarManager::kTPCsub2yH2uc]   = qsub2->Y();
1788       values[AliDielectronVarManager::kTPCsub2rpH2uc]  = ((TMath::Abs(qsub2->X())>1.0e-10) ? TMath::ATan2(qsub2->Y(),qsub2->X())/2.0 : 0.0);
1789
1790       values[AliDielectronVarManager::kTPCsub12DiffH2uc] = TMath::Cos( 2.*(values[AliDielectronVarManager::kTPCsub1rpH2uc] -
1791                                                                            values[AliDielectronVarManager::kTPCsub2rpH2uc]) );
1792     }
1793
1794     // VZERO event plane
1795     TVector2 qvec;
1796     Double_t qx = 0, qy = 0;
1797     ep->CalculateVZEROEventPlane(event,10, 2, qx, qy);    qvec.Set(qx,qy);
1798     values[AliDielectronVarManager::kv0ACrpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
1799     values[AliDielectronVarManager::kv0ACxH2]   = qvec.X();
1800     values[AliDielectronVarManager::kv0ACyH2]   = qvec.Y();
1801     values[AliDielectronVarManager::kv0ACmagH2] = qvec.Mod();
1802     ep->CalculateVZEROEventPlane(event, 8, 2, qx, qy);    qvec.Set(qx,qy);
1803     values[AliDielectronVarManager::kv0ArpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
1804     values[AliDielectronVarManager::kv0AxH2]   = qvec.X();
1805     values[AliDielectronVarManager::kv0AyH2]   = qvec.Y();
1806     values[AliDielectronVarManager::kv0AmagH2] = qvec.Mod();
1807     ep->CalculateVZEROEventPlane(event, 9, 2, qx, qy);    qvec.Set(qx,qy);
1808     values[AliDielectronVarManager::kv0CrpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
1809     values[AliDielectronVarManager::kv0CxH2]   = qvec.X();
1810     values[AliDielectronVarManager::kv0CyH2]   = qvec.Y();
1811     values[AliDielectronVarManager::kv0CmagH2] = qvec.Mod();
1812     ep->CalculateVZEROEventPlane(event, 0, 0, 2, qx, qy);    qvec.Set(qx,qy);
1813     values[AliDielectronVarManager::kv0C0rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
1814     ep->CalculateVZEROEventPlane(event, 3, 3, 2, qx, qy);    qvec.Set(qx,qy);
1815     values[AliDielectronVarManager::kv0C3rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
1816     ep->CalculateVZEROEventPlane(event, 4, 4, 2, qx, qy);    qvec.Set(qx,qy);
1817     values[AliDielectronVarManager::kv0A0rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
1818     ep->CalculateVZEROEventPlane(event, 7, 7, 2, qx, qy);    qvec.Set(qx,qy);
1819     values[AliDielectronVarManager::kv0A3rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
1820   } //if: eventplane
1821
1822   // ESD VZERO information
1823   AliVVZERO* vzeroData = event->GetVZEROData();
1824   values[AliDielectronVarManager::kMultV0A] = 0.0;
1825   values[AliDielectronVarManager::kMultV0C] = 0.0;
1826   values[AliDielectronVarManager::kEqMultV0A] = 0.0;
1827   values[AliDielectronVarManager::kEqMultV0C] = 0.0;
1828   values[AliDielectronVarManager::kAdcV0A]  = 0.0;
1829   values[AliDielectronVarManager::kAdcV0C]  = 0.0;
1830   for(Int_t i=0; i<32; ++i) {
1831     values[AliDielectronVarManager::kVZEROchMult+i] = vzeroData->GetMultiplicity(i);
1832     values[AliDielectronVarManager::kVZEROchMult+32+i] = vzeroData->GetMultiplicity(i+32);
1833     //values[AliDielectronVarManager::kVZEROchMult+i] = event->GetVZEROEqMultiplicity(i);
1834     //values[AliDielectronVarManager::kVZEROchMult+32+i] = event->GetVZEROEqMultiplicity(i+32);
1835     values[AliDielectronVarManager::kMultV0A] += vzeroData->GetMultiplicityV0A(i);
1836     values[AliDielectronVarManager::kMultV0C] += vzeroData->GetMultiplicityV0C(i);
1837     values[AliDielectronVarManager::kEqMultV0A] += event->GetVZEROEqMultiplicity(i);
1838     values[AliDielectronVarManager::kEqMultV0C] += event->GetVZEROEqMultiplicity(i+32);
1839     //values[AliDielectronVarManager::kAdcV0A] += vzeroData->GetAdcV0A(i);
1840     //values[AliDielectronVarManager::kAdcV0C] += vzeroData->GetAdcV0C(i);
1841   }
1842   values[AliDielectronVarManager::kMultV0] = values[AliDielectronVarManager::kMultV0A] + values[AliDielectronVarManager::kMultV0C];
1843   values[AliDielectronVarManager::kEqMultV0] = values[AliDielectronVarManager::kEqMultV0A] + values[AliDielectronVarManager::kEqMultV0C];
1844   values[AliDielectronVarManager::kAdcV0] = values[AliDielectronVarManager::kAdcV0A] + values[AliDielectronVarManager::kAdcV0C];
1845   // VZERO event plane quantities
1846   Double_t qvec[3]={0.0};
1847   GetVzeroRP(event, qvec,0);      // V0-A
1848   values[AliDielectronVarManager::kV0AxH2] = qvec[0]; values[AliDielectronVarManager::kV0AyH2] = qvec[1]; 
1849   values[AliDielectronVarManager::kV0ArpH2] = qvec[2];
1850   qvec[0]=0.0; qvec[1]=0.0; qvec[2]=0.0;
1851   GetVzeroRP(event, qvec,1);      // V0-C
1852   values[AliDielectronVarManager::kV0CxH2] = qvec[0]; values[AliDielectronVarManager::kV0CyH2] = qvec[1]; 
1853   values[AliDielectronVarManager::kV0CrpH2] = qvec[2];
1854   qvec[0]=0.0; qvec[1]=0.0; qvec[2]=0.0;
1855   GetVzeroRP(event, qvec,2);      // V0-A and V0-C combined
1856   values[AliDielectronVarManager::kV0ACxH2] = qvec[0]; values[AliDielectronVarManager::kV0ACyH2] = qvec[1]; 
1857   values[AliDielectronVarManager::kV0ACrpH2] = qvec[2];
1858   // VZERO event plane resolution
1859   values[AliDielectronVarManager::kV0ArpResH2] = 1.0;
1860   values[AliDielectronVarManager::kV0CrpResH2] = 1.0;
1861   values[AliDielectronVarManager::kV0ACrpResH2] = 1.0;
1862   // Q vector components correlations  
1863   values[AliDielectronVarManager::kV0XaXcH2] = values[AliDielectronVarManager::kV0AxH2]*values[AliDielectronVarManager::kV0CxH2];
1864   values[AliDielectronVarManager::kV0XaYaH2] = values[AliDielectronVarManager::kV0AxH2]*values[AliDielectronVarManager::kV0AyH2];
1865   values[AliDielectronVarManager::kV0XaYcH2] = values[AliDielectronVarManager::kV0AxH2]*values[AliDielectronVarManager::kV0CyH2];
1866   values[AliDielectronVarManager::kV0YaXcH2] = values[AliDielectronVarManager::kV0AyH2]*values[AliDielectronVarManager::kV0CxH2];
1867   values[AliDielectronVarManager::kV0YaYcH2] = values[AliDielectronVarManager::kV0AyH2]*values[AliDielectronVarManager::kV0CyH2];
1868   values[AliDielectronVarManager::kV0XcYcH2] = values[AliDielectronVarManager::kV0CxH2]*values[AliDielectronVarManager::kV0CyH2];
1869
1870
1871   // event plane differences used for EP resolution calculation
1872   values[AliDielectronVarManager::kV0ATPCDiffH2]   = TMath::Cos( 2.*(values[AliDielectronVarManager::kV0ArpH2] - 
1873                                                                      values[AliDielectronVarManager::kTPCrpH2]) ); 
1874   
1875   values[AliDielectronVarManager::kV0CTPCDiffH2]   = TMath::Cos( 2.*(values[AliDielectronVarManager::kV0CrpH2] - 
1876                                                                      values[AliDielectronVarManager::kTPCrpH2]) ); 
1877   
1878   values[AliDielectronVarManager::kV0AV0CDiffH2]   = TMath::Cos( 2.*(values[AliDielectronVarManager::kV0ArpH2] - 
1879                                                                      values[AliDielectronVarManager::kV0CrpH2]) ); 
1880
1881   values[AliDielectronVarManager::kv0ATPCDiffH2]   = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0ArpH2] - 
1882                                                                      values[AliDielectronVarManager::kTPCrpH2]) ); 
1883
1884   values[AliDielectronVarManager::kv0CTPCDiffH2]   = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0CrpH2] - 
1885                                                                      values[AliDielectronVarManager::kTPCrpH2]) ); 
1886   
1887   values[AliDielectronVarManager::kv0Av0CDiffH2]   = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0ArpH2] - 
1888                                                                      values[AliDielectronVarManager::kv0CrpH2]) ); 
1889
1890   values[AliDielectronVarManager::kv0Av0C0DiffH2]  = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0ArpH2] - 
1891                                                                      values[AliDielectronVarManager::kv0C0rpH2]) ); 
1892
1893   values[AliDielectronVarManager::kv0Av0C3DiffH2]  = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0ArpH2] - 
1894                                                                      values[AliDielectronVarManager::kv0C3rpH2]) ); 
1895
1896   values[AliDielectronVarManager::kv0Cv0A0DiffH2]  = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0CrpH2] - 
1897                                                                      values[AliDielectronVarManager::kv0A0rpH2]) ); 
1898
1899   values[AliDielectronVarManager::kv0Cv0A3DiffH2]  = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0CrpH2] - 
1900                                                                      values[AliDielectronVarManager::kv0A3rpH2]) ); 
1901
1902   values[AliDielectronVarManager::kv0A0v0A3DiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0A0rpH2] - 
1903                                                                      values[AliDielectronVarManager::kv0A3rpH2]) ); 
1904
1905   values[AliDielectronVarManager::kv0C0v0C3DiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0C0rpH2] - 
1906                                                                      values[AliDielectronVarManager::kv0C3rpH2]) ); 
1907
1908   Double_t ZDCqvec[3][2];
1909   memset(ZDCqvec, 999, sizeof(ZDCqvec));
1910   GetZDCRP(event, ZDCqvec);
1911
1912   values[AliDielectronVarManager::kZDCArpH1] = TMath::ATan2(ZDCqvec[0][1], ZDCqvec[0][0]);
1913   values[AliDielectronVarManager::kZDCCrpH1] = TMath::ATan2(ZDCqvec[1][1], ZDCqvec[1][0]);
1914   values[AliDielectronVarManager::kZDCACrpH1] = TMath::ATan2(ZDCqvec[2][1], ZDCqvec[2][0]);
1915
1916
1917   values[AliDielectronVarManager::kv0ZDCrpRes] = cos(2*(values[AliDielectronVarManager::kZDCArpH1] - values[AliDielectronVarManager::kv0ArpH2]));
1918   values[AliDielectronVarManager::kZDCrpResH1] = cos(values[AliDielectronVarManager::kZDCArpH1] - values[AliDielectronVarManager::kZDCCrpH1]);
1919
1920
1921 }
1922
1923 inline void AliDielectronVarManager::FillVarESDEvent(const AliESDEvent *event, Double_t * const values)
1924 {
1925   //
1926   // Fill event information available for histogramming into an array
1927   // 
1928   
1929   // Fill common AliVEvent interface information
1930   FillVarVEvent(event, values);
1931
1932   Double_t centralityF=-1; Double_t centralitySPD=-1;
1933   AliCentrality *esdCentrality = const_cast<AliESDEvent*>(event)->GetCentrality();
1934   if (esdCentrality) centralityF = esdCentrality->GetCentralityPercentile("V0M");
1935   if (esdCentrality) centralitySPD = esdCentrality->GetCentralityPercentile("CL1");
1936   
1937   // Fill AliESDEvent interface specific information
1938   const AliESDVertex *primVtx = event->GetPrimaryVertex();
1939   values[AliDielectronVarManager::kXRes]       = primVtx->GetXRes();
1940   values[AliDielectronVarManager::kYRes]       = primVtx->GetYRes();
1941   values[AliDielectronVarManager::kZRes]       = primVtx->GetZRes();
1942   values[AliDielectronVarManager::kCentrality] = centralityF;
1943   values[AliDielectronVarManager::kCentralitySPD] = centralitySPD;
1944
1945   const AliESDVertex *vtxTPC = event->GetPrimaryVertexTPC(); 
1946   values[AliDielectronVarManager::kNVtxContribTPC] = (vtxTPC ? vtxTPC->GetNContributors() : 0);
1947
1948   // Event multiplicity estimators
1949   Int_t nTrSPD05=0; Int_t nTrITSTPC05=0; Int_t nTrITSSA05=0;
1950   nTrSPD05    = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTracklets, 0.5);
1951   nTrITSTPC05 = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTrackletsITSTPC, 0.5);
1952   nTrITSSA05  = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTrackletsITSSA, 0.5);
1953   values[AliDielectronVarManager::kNaccTrckltsEsd05] = nTrSPD05;
1954   values[AliDielectronVarManager::kNaccItsTpcEsd05] = nTrITSTPC05;
1955   values[AliDielectronVarManager::kNaccItsPureEsd05] = nTrITSSA05;
1956   values[AliDielectronVarManager::kNaccTrckltsEsd05Corr] = 
1957     AliDielectronHelper::GetNaccTrckltsCorrected(event,Double_t(nTrSPD05),values[AliDielectronVarManager::kZvPrim],0);
1958   values[AliDielectronVarManager::kNaccItsTpcEsd05Corr] = 
1959     AliDielectronHelper::GetNaccTrckltsCorrected(event,Double_t(nTrITSTPC05),values[AliDielectronVarManager::kZvPrim],3);
1960   values[AliDielectronVarManager::kNaccItsPureEsd05Corr] = 
1961     AliDielectronHelper::GetNaccTrckltsCorrected(event,Double_t(nTrITSSA05),values[AliDielectronVarManager::kZvPrim],6);
1962   
1963   Int_t nTrSPD10=0; Int_t nTrITSTPC10=0; Int_t nTrITSSA10=0;
1964   nTrSPD10    = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTracklets, 1.0);
1965   nTrITSTPC10 = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTrackletsITSTPC, 1.0);
1966   nTrITSSA10  = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTrackletsITSSA, 1.0);
1967   values[AliDielectronVarManager::kNaccTrckltsEsd10] = nTrSPD10;
1968   values[AliDielectronVarManager::kNaccItsTpcEsd10] = nTrITSTPC10;
1969   values[AliDielectronVarManager::kNaccItsPureEsd10] = nTrITSSA10;
1970   values[AliDielectronVarManager::kNaccTrckltsEsd10Corr] =
1971     AliDielectronHelper::GetNaccTrckltsCorrected(event,Double_t(nTrSPD10),values[AliDielectronVarManager::kZvPrim],1);
1972   values[AliDielectronVarManager::kNaccItsTpcEsd10Corr] =
1973     AliDielectronHelper::GetNaccTrckltsCorrected(event,Double_t(nTrITSTPC10),values[AliDielectronVarManager::kZvPrim],4);
1974   values[AliDielectronVarManager::kNaccItsPureEsd10Corr] =
1975     AliDielectronHelper::GetNaccTrckltsCorrected(event,Double_t(nTrITSSA10),values[AliDielectronVarManager::kZvPrim],7); 
1976
1977   Int_t nTrSPD16=0; Int_t nTrITSTPC16=0; Int_t nTrITSSA16=0;
1978   nTrSPD16    = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTracklets, 1.6);
1979   nTrITSTPC16 = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTrackletsITSTPC, 1.6);
1980   nTrITSSA16  = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTrackletsITSSA, 1.6);
1981   values[AliDielectronVarManager::kNaccTrckltsEsd16] = nTrSPD16;
1982   values[AliDielectronVarManager::kNaccItsTpcEsd16] = nTrITSTPC16;
1983   values[AliDielectronVarManager::kNaccItsPureEsd16] = nTrITSSA16;
1984   values[AliDielectronVarManager::kNaccTrckltsEsd16Corr] =
1985     AliDielectronHelper::GetNaccTrckltsCorrected(event,Double_t(nTrSPD16),values[AliDielectronVarManager::kZvPrim],2);
1986   values[AliDielectronVarManager::kNaccItsTpcEsd16Corr] =
1987     AliDielectronHelper::GetNaccTrckltsCorrected(event,Double_t(nTrITSTPC16),values[AliDielectronVarManager::kZvPrim],5);
1988   values[AliDielectronVarManager::kNaccItsPureEsd16Corr] =
1989     AliDielectronHelper::GetNaccTrckltsCorrected(event,Double_t(nTrITSSA16),values[AliDielectronVarManager::kZvPrim],8);
1990  
1991 }
1992
1993 inline void AliDielectronVarManager::FillVarAODEvent(const AliAODEvent *event, Double_t * const values)
1994 {
1995   //
1996   // Fill event information available for histogramming into an array
1997   //
1998
1999   // Fill common AliVEvent interface information
2000   FillVarVEvent(event, values);
2001
2002   // Fill AliAODEvent interface specific information
2003   AliAODHeader *header = event->GetHeader();
2004
2005   Double_t centralityF=-1; Double_t centralitySPD=-1;
2006   AliCentrality *aodCentrality = header->GetCentralityP();
2007   if (aodCentrality) centralityF = aodCentrality->GetCentralityPercentile("V0M");
2008   if (aodCentrality) centralitySPD = aodCentrality->GetCentralityPercentile("CL1");
2009   values[AliDielectronVarManager::kCentrality] = centralityF;
2010   values[AliDielectronVarManager::kCentralitySPD] = centralitySPD;
2011
2012   values[AliDielectronVarManager::kRefMult]        = header->GetRefMultiplicity();        // similar to Ntrk
2013   values[AliDielectronVarManager::kRefMultTPConly] = header->GetTPConlyRefMultiplicity(); // similar to Nacc
2014
2015   ///////////////////////////////////////////
2016   //////////// NANO AODs ////////////////////
2017   ///////////////////////////////////////////
2018
2019   // (w/o AliCentrality branch), VOM centrality should be stored in the header
2020   if(!header->GetCentralityP())
2021     values[AliDielectronVarManager::kCentrality] = header->GetCentrality();
2022   // (w/o AliEventPlane branch) tpc event plane stuff stored in the header
2023   if(!header->GetEventplaneP()) {
2024
2025     //    values[AliDielectronVarManager::kNTrk] = header->GetRefMultiplicity();    // overwritten datamembers in "our" nanoAODs
2026     //    values[AliDielectronVarManager::kNacc] = header->GetRefMultiplicityPos(); // overwritten datamembers in "our" nanoAODs
2027
2028     TVector2 qvec;
2029     // TPC
2030     qvec.Set(header->GetEventplaneQx(), header->GetEventplaneQy());
2031     values[AliDielectronVarManager::kTPCxH2uc]   = qvec.X();
2032     values[AliDielectronVarManager::kTPCyH2uc]   = qvec.Y();
2033     values[AliDielectronVarManager::kTPCmagH2uc] = qvec.Mod();
2034     values[AliDielectronVarManager::kTPCrpH2uc]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
2035
2036     // VZERO
2037     AliEventplane ep2;
2038     // get event plane corrections from the VZERO EP selection task
2039     AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
2040     AliVZEROEPSelectionTask *eptask = dynamic_cast<AliVZEROEPSelectionTask *>(man->GetTask("AliVZEROEPSelectionTask"));
2041     if(eptask) eptask->SetEventplaneParams(&ep2,centralityF);
2042     else printf("no VZERO event plane selection task added! \n");
2043
2044     Double_t qx = 0, qy = 0;
2045     ep2.CalculateVZEROEventPlane(event,10, 2, qx, qy);    qvec.Set(qx,qy);
2046     values[AliDielectronVarManager::kv0ACrpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
2047     values[AliDielectronVarManager::kv0ACxH2]   = qvec.X();
2048     values[AliDielectronVarManager::kv0ACyH2]   = qvec.Y();
2049     values[AliDielectronVarManager::kv0ACmagH2] = qvec.Mod();
2050     ep2.CalculateVZEROEventPlane(event, 8, 2, qx, qy);    qvec.Set(qx,qy);
2051     values[AliDielectronVarManager::kv0ArpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
2052     values[AliDielectronVarManager::kv0AxH2]   = qvec.X();
2053     values[AliDielectronVarManager::kv0AyH2]   = qvec.Y();
2054     values[AliDielectronVarManager::kv0AmagH2] = qvec.Mod();
2055     ep2.CalculateVZEROEventPlane(event, 9, 2, qx, qy);    qvec.Set(qx,qy);
2056     values[AliDielectronVarManager::kv0CrpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
2057     values[AliDielectronVarManager::kv0CxH2]   = qvec.X();
2058     values[AliDielectronVarManager::kv0CyH2]   = qvec.Y();
2059     values[AliDielectronVarManager::kv0CmagH2] = qvec.Mod();
2060     ep2.CalculateVZEROEventPlane(event, 0, 0, 2, qx, qy);    qvec.Set(qx,qy);
2061     values[AliDielectronVarManager::kv0C0rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
2062     ep2.CalculateVZEROEventPlane(event, 3, 3, 2, qx, qy);    qvec.Set(qx,qy);
2063     values[AliDielectronVarManager::kv0C3rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
2064     ep2.CalculateVZEROEventPlane(event, 4, 4, 2, qx, qy);    qvec.Set(qx,qy);
2065     values[AliDielectronVarManager::kv0A0rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
2066     ep2.CalculateVZEROEventPlane(event, 7, 7, 2, qx, qy);    qvec.Set(qx,qy);
2067     values[AliDielectronVarManager::kv0A3rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
2068
2069   }
2070
2071   const AliAODVertex *vtxtpc = GetVertex(event, AliAODVertex::kMainTPC);
2072   values[AliDielectronVarManager::kNVtxContribTPC] = (vtxtpc ? vtxtpc->GetNContributors() : 0);
2073
2074 }
2075   
2076 inline void AliDielectronVarManager::FillVarMCEvent(const AliMCEvent *event, Double_t * const values)
2077 {
2078   //
2079   // Fill event information available for histogramming into an array
2080   //
2081
2082   // Fill common AliVEvent interface information
2083   //  FillVarVEvent(event, values);
2084   const AliVVertex* vtx = event->GetPrimaryVertex();
2085   values[AliDielectronVarManager::kXvPrim]       = (vtx ? vtx->GetX() : 0.0);
2086   values[AliDielectronVarManager::kYvPrim]       = (vtx ? vtx->GetY() : 0.0);
2087   values[AliDielectronVarManager::kZvPrim]       = (vtx ? vtx->GetZ() : 0.0);
2088   // Fill AliMCEvent interface specific information
2089   values[AliDielectronVarManager::kNch]   = AliDielectronHelper::GetNch(event, 1.6);
2090   values[AliDielectronVarManager::kNch05] = AliDielectronHelper::GetNch(event, 0.5);
2091   values[AliDielectronVarManager::kNch10] = AliDielectronHelper::GetNch(event, 1.0);
2092   
2093   values[AliDielectronVarManager::kNumberOfJPsis] = AliDielectronHelper::GetNMothers(event, 0.9, 443, 11);
2094   values[AliDielectronVarManager::kNumberOfJPsisPrompt]  = AliDielectronHelper::GetNMothers(event, 0.9, 443, 11, 1);
2095   values[AliDielectronVarManager::kNumberOfJPsisNPrompt] = AliDielectronHelper::GetNMothers(event, 0.9, 443, 11, 0);
2096 }
2097
2098 inline void AliDielectronVarManager::FillVarTPCEventPlane(const AliEventplane *evplane, Double_t * const values)
2099 {
2100   //
2101   // Fill TPC event plane information after correction
2102   //
2103   if(evplane) {
2104     TVector2 *qcorr  = const_cast<AliEventplane *>(evplane)->GetQVector();  // This is the "corrected" Q-Vector
2105     TVector2 *qcsub1 = const_cast<AliEventplane *>(evplane)->GetQsub1();
2106     TVector2 *qcsub2 = const_cast<AliEventplane *>(evplane)->GetQsub2();
2107     if(qcorr) {
2108       values[AliDielectronVarManager::kTPCxH2]   = qcorr->X();
2109       values[AliDielectronVarManager::kTPCyH2]   = qcorr->Y();
2110       values[AliDielectronVarManager::kTPCmagH2] = qcorr->Mod();
2111       values[AliDielectronVarManager::kTPCrpH2]  = ((TMath::Abs(qcorr->X())>1.0e-10) ? TMath::ATan2(qcorr->Y(),qcorr->X())/2.0 : 0.0);
2112       // detector effects
2113       values[AliDielectronVarManager::kCosTPCrpH2]     = TMath::Cos( 2.* values[AliDielectronVarManager::kTPCrpH2] );
2114       values[AliDielectronVarManager::kSinTPCrpH2]     = TMath::Sin( 2.* values[AliDielectronVarManager::kTPCrpH2] );
2115
2116       // correlations for event plane resoultion
2117       values[AliDielectronVarManager::kv0ATPCDiffH2]   = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0ArpH2] - 
2118                                                                          values[AliDielectronVarManager::kTPCrpH2]) ); 
2119       values[AliDielectronVarManager::kv0CTPCDiffH2]   = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0CrpH2] - 
2120                                                                          values[AliDielectronVarManager::kTPCrpH2]) ); 
2121       values[AliDielectronVarManager::kv0Av0CDiffH2]   = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0ArpH2] - 
2122                                                                          values[AliDielectronVarManager::kv0CrpH2]) ); 
2123       values[AliDielectronVarManager::kv0Av0C0DiffH2]  = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0ArpH2] - 
2124                                                                          values[AliDielectronVarManager::kv0C0rpH2]) ); 
2125       values[AliDielectronVarManager::kv0Av0C3DiffH2]  = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0ArpH2] - 
2126                                                                          values[AliDielectronVarManager::kv0C3rpH2]) ); 
2127       values[AliDielectronVarManager::kv0Cv0A0DiffH2]  = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0CrpH2] - 
2128                                                                          values[AliDielectronVarManager::kv0A0rpH2]) ); 
2129       values[AliDielectronVarManager::kv0Cv0A3DiffH2]  = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0CrpH2] - 
2130                                                                          values[AliDielectronVarManager::kv0A3rpH2]) ); 
2131       values[AliDielectronVarManager::kv0A0v0A3DiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0A0rpH2] - 
2132                                                                          values[AliDielectronVarManager::kv0A3rpH2]) ); 
2133       values[AliDielectronVarManager::kv0C0v0C3DiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0C0rpH2] - 
2134                                                                          values[AliDielectronVarManager::kv0C3rpH2]) ); 
2135     }
2136     if(qcsub1 && qcsub2) {
2137       values[AliDielectronVarManager::kTPCsub1xH2]   = qcsub1->X();
2138       values[AliDielectronVarManager::kTPCsub1yH2]   = qcsub1->Y();
2139       values[AliDielectronVarManager::kTPCsub1rpH2]  = ((TMath::Abs(qcsub1->X())>1.0e-10) ? TMath::ATan2(qcsub1->Y(),qcsub1->X())/2.0 : 0.0);
2140
2141       values[AliDielectronVarManager::kTPCsub2xH2]   = qcsub2->X();
2142       values[AliDielectronVarManager::kTPCsub2yH2]   = qcsub2->Y();
2143       values[AliDielectronVarManager::kTPCsub2rpH2]  = ((TMath::Abs(qcsub2->X())>1.0e-10) ? TMath::ATan2(qcsub2->Y(),qcsub2->X())/2.0 : 0.0);
2144
2145       values[AliDielectronVarManager::kTPCsub12DiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kTPCsub1rpH2] -
2146                                                                          values[AliDielectronVarManager::kTPCsub2rpH2]) );
2147       values[AliDielectronVarManager::kTPCsub12DiffH2Sin] = TMath::Sin( 2.*(values[AliDielectronVarManager::kTPCsub1rpH2] -
2148                                                                             values[AliDielectronVarManager::kTPCsub2rpH2]) );
2149     }
2150   }
2151 }
2152
2153 inline void AliDielectronVarManager::InitESDpid(Int_t type)
2154 {
2155   //
2156   // initialize PID parameters
2157   // type=0 is simulation
2158   // type=1 is data
2159
2160   if (!fgPIDResponse) fgPIDResponse=new AliESDpid((Bool_t)(type==0));
2161   Double_t alephParameters[5];
2162   // simulation
2163   alephParameters[0] = 2.15898e+00/50.;
2164   alephParameters[1] = 1.75295e+01;
2165   alephParameters[2] = 3.40030e-09;
2166   alephParameters[3] = 1.96178e+00;
2167   alephParameters[4] = 3.91720e+00;
2168   fgPIDResponse->GetTOFResponse().SetTimeResolution(80.);
2169   
2170   // data
2171   if (type==1){    
2172     alephParameters[0] = 0.0283086/0.97;
2173     alephParameters[1] = 2.63394e+01;
2174     alephParameters[2] = 5.04114e-11;
2175     alephParameters[3] = 2.12543e+00;
2176     alephParameters[4] = 4.88663e+00;
2177     fgPIDResponse->GetTOFResponse().SetTimeResolution(130.);
2178     fgPIDResponse->GetTPCResponse().SetMip(50.);
2179   }
2180
2181   fgPIDResponse->GetTPCResponse().SetBetheBlochParameters(
2182     alephParameters[0],alephParameters[1],alephParameters[2],
2183     alephParameters[3],alephParameters[4]);
2184   
2185   fgPIDResponse->GetTPCResponse().SetSigma(3.79301e-03, 2.21280e+04);
2186 }
2187
2188 inline void AliDielectronVarManager::InitAODpidUtil(Int_t type)
2189 {
2190   if (!fgPIDResponse) fgPIDResponse=new AliAODpidUtil;
2191   Double_t alephParameters[5];
2192   // simulation
2193   alephParameters[0] = 2.15898e+00/50.;
2194   alephParameters[1] = 1.75295e+01;
2195   alephParameters[2] = 3.40030e-09;
2196   alephParameters[3] = 1.96178e+00;
2197   alephParameters[4] = 3.91720e+00;
2198   fgPIDResponse->GetTOFResponse().SetTimeResolution(80.);
2199   
2200   // data
2201   if (type==1){
2202     alephParameters[0] = 0.0283086/0.97;
2203     alephParameters[1] = 2.63394e+01;
2204     alephParameters[2] = 5.04114e-11;
2205     alephParameters[3] = 2.12543e+00;
2206     alephParameters[4] = 4.88663e+00;
2207     fgPIDResponse->GetTOFResponse().SetTimeResolution(130.);
2208     fgPIDResponse->GetTPCResponse().SetMip(50.);
2209   }
2210   
2211   fgPIDResponse->GetTPCResponse().SetBetheBlochParameters(
2212     alephParameters[0],alephParameters[1],alephParameters[2],
2213     alephParameters[3],alephParameters[4]);
2214   
2215   fgPIDResponse->GetTPCResponse().SetSigma(3.79301e-03, 2.21280e+04);
2216 }
2217
2218
2219 inline void AliDielectronVarManager::InitEstimatorAvg(const Char_t* filename)
2220 {
2221   //
2222   // initialize the profile histograms neccessary for the correction of the multiplicity estimators in pp collisions
2223   //
2224   
2225   const Char_t* estimatorNames[9] = {"SPDmult05","SPDmult10","SPDmult16",
2226                                      "ITSTPC05", "ITSTPC10", "ITSTPC16", 
2227                                      "ITSSA05",  "ITSSA10",  "ITSSA16"};
2228   const Char_t* periodNames[4] = {"LHC10b", "LHC10c", "LHC10d", "LHC10e"};
2229   TFile* file=TFile::Open(filename);
2230   if(!file) return;
2231   
2232   for(Int_t ip=0; ip<4; ++ip) {
2233     for(Int_t ie=0; ie<9; ++ie) {
2234       fgMultEstimatorAvg[ip][ie] = (TProfile*)(file->Get(Form("%s_%s",estimatorNames[ie],periodNames[ip]))->Clone(Form("%s_%s_clone",estimatorNames[ie],periodNames[ip])));
2235     }
2236   }
2237 }
2238
2239
2240 inline void AliDielectronVarManager::InitTRDpidEffHistograms(const Char_t* filename)
2241 {
2242   //
2243   // initialize the 3D histograms with the TRD pid efficiency histograms
2244   //
2245   
2246   // reset the centrality ranges and the efficiency histograms
2247   for(Int_t i=0; i<10; ++i) {         // centrality ranges
2248     for(Int_t j=0; j<4; ++j) fgTRDpidEffCentRanges[i][j] = -1.;
2249     if(fgTRDpidEff[i][0]) {
2250       delete fgTRDpidEff[i][0];
2251       fgTRDpidEff[i][0] = 0x0;
2252     }
2253     if(fgTRDpidEff[i][1]) {
2254       delete fgTRDpidEff[i][1];
2255       fgTRDpidEff[i][1] = 0x0;
2256     }
2257   }
2258   
2259   TFile* file=TFile::Open(filename);
2260   TList* keys=file->GetListOfKeys();
2261   Int_t idxp=0; Int_t idxn=0;
2262   for(Int_t i=0; i<keys->GetEntries(); ++i) {
2263     if(idxp>=10) continue;
2264     if(idxn>=10) continue;
2265     TString name=((TKey*)keys->At(i))->ReadObj()->GetName();    
2266     // Name of histograms should be in the format:
2267     // TRDeff<field>_cent_<centLow>_<centHigh>
2268     // <field> is either "BPLUS" or "BMINUS"
2269     if(!(name.Contains("BPLUS") || name.Contains("BMINUS"))) continue;
2270     TObjArray* arr = name.Tokenize("_");
2271     Bool_t isBplus = kTRUE;
2272     if(name.Contains("BMINUS")) isBplus = kFALSE;
2273     TString centMinStr = arr->At(2)->GetName();
2274     TString centMaxStr = arr->At(3)->GetName();
2275     delete arr;
2276     if(isBplus) {
2277       fgTRDpidEffCentRanges[idxp][2] = centMinStr.Atof();
2278       fgTRDpidEffCentRanges[idxp][3] = centMaxStr.Atof();
2279       fgTRDpidEff[idxp][1] = (TH3D*)(file->Get(name.Data())->Clone(Form("%s_clone",name.Data())));
2280       ++idxp;
2281     }
2282     else {
2283       fgTRDpidEffCentRanges[idxn][0] = centMinStr.Atof();
2284       fgTRDpidEffCentRanges[idxn][1] = centMaxStr.Atof();
2285       fgTRDpidEff[idxn][0] = (TH3D*)(file->Get(name.Data())->Clone(Form("%s_clone",name.Data())));
2286       ++idxn;
2287     }
2288   }
2289 }
2290
2291 inline Double_t AliDielectronVarManager::GetSingleLegEff(Double_t * const values) {
2292   //
2293   // get the single leg efficiency for a given particle
2294   //
2295   if(!fgLegEffMap) return -1.;
2296
2297   if(fgLegEffMap->IsA()== THnBase::Class()) {
2298     THnBase *eff = static_cast<THnBase*>(fgLegEffMap);
2299     Int_t dim=eff->GetNdimensions();
2300     Int_t idx[dim];
2301     for(Int_t idim=0; idim<dim; idim++) {
2302       UInt_t var = GetValueType(eff->GetAxis(idim)->GetName());
2303     idx[idim] = eff->GetAxis(idim)->FindBin(values[var]);
2304     if(idx[idim] < 0 || idx[idim]>eff->GetAxis(idim)->GetNbins()) return 0.0;
2305     }
2306     //  printf(" bin content %f+-%f \n",eff->GetBinContent(idx), eff->GetBinError(idx));
2307     return (eff->GetBinContent(idx));
2308   }
2309   return -1.;
2310 }
2311
2312 inline Double_t AliDielectronVarManager::GetPairEff(Double_t * const values) {
2313   //
2314   // get the pair efficiency for given pair kinematics
2315   //
2316   if(!fgPairEffMap) return -1.;
2317
2318   if(fgPairEffMap->IsA()== THnBase::Class()) {
2319     THnBase *eff = static_cast<THnBase*>(fgPairEffMap);
2320     Int_t dim=eff->GetNdimensions();
2321     Int_t idx[dim];
2322     for(Int_t idim=0; idim<dim; idim++) {
2323       UInt_t var = GetValueType(eff->GetAxis(idim)->GetName());
2324     idx[idim] = eff->GetAxis(idim)->FindBin(values[var]);
2325     if(idx[idim] < 0 || idx[idim]>eff->GetAxis(idim)->GetNbins()) return 0.0;
2326     }
2327     //  printf(" bin content %f+-%f \n",eff->GetBinContent(idx), eff->GetBinError(idx));
2328     return (eff->GetBinContent(idx));
2329   }
2330   if(fgPairEffMap->IsA()== TSpline3::Class()) {
2331     TSpline3 *eff = static_cast<TSpline3*>(fgPairEffMap);
2332     if(!eff->GetHistogram()) { printf("no histogram added to the spline\n"); return -1.;}
2333     UInt_t var = GetValueType(eff->GetHistogram()->GetXaxis()->GetName());
2334     //printf(" bin content %f \n",eff->Eval(values[var]) );
2335     return (eff->Eval(values[var]));
2336   }
2337
2338   return -1.;
2339 }
2340
2341
2342 inline void AliDielectronVarManager::InitVZEROCalibrationHistograms(Int_t runNo) {
2343   //
2344   // Initialize the VZERO channel-by-channel calibration histograms
2345   //
2346
2347   //initialize only once
2348   if(fgVZEROCalib[0]) return;
2349   
2350   for(Int_t i=0; i<64; ++i) 
2351     if(fgVZEROCalib[i]) {
2352       delete fgVZEROCalib[i];
2353       fgVZEROCalib[i] = 0x0;
2354     }
2355   
2356   TFile file(fgVZEROCalibrationFile.Data());
2357   
2358   for(Int_t i=0; i<64; ++i){
2359     fgVZEROCalib[i] = (TProfile2D*)(file.Get(Form("RUN%d_ch%d_VtxCent", runNo, i)));
2360     if (fgVZEROCalib[i]) fgVZEROCalib[i]->SetDirectory(0x0);
2361   }
2362 }
2363
2364
2365 inline void AliDielectronVarManager::InitVZERORecenteringHistograms(Int_t runNo) {
2366   //
2367   // Initialize the VZERO event plane recentering histograms
2368   //
2369
2370   //initialize only once
2371   if(fgVZERORecentering[0][0]) return;
2372   
2373   for(Int_t i=0; i<2; ++i)
2374     for(Int_t j=0; j<2; ++j)
2375       if(fgVZERORecentering[i][j]) {
2376         delete fgVZERORecentering[i][j];
2377         fgVZERORecentering[i][j] = 0x0;
2378       }
2379   
2380   TFile file(fgVZERORecenteringFile.Data());
2381   if (!file.IsOpen()) return;
2382   
2383   fgVZERORecentering[0][0] = (TProfile2D*)(file.Get(Form("RUN%d_QxA_CentVtx", runNo)));
2384   fgVZERORecentering[0][1] = (TProfile2D*)(file.Get(Form("RUN%d_QyA_CentVtx", runNo)));
2385   fgVZERORecentering[1][0] = (TProfile2D*)(file.Get(Form("RUN%d_QxC_CentVtx", runNo)));
2386   fgVZERORecentering[1][1] = (TProfile2D*)(file.Get(Form("RUN%d_QyC_CentVtx", runNo)));
2387
2388   if (fgVZERORecentering[0][0]) fgVZERORecentering[0][0]->SetDirectory(0x0);
2389   if (fgVZERORecentering[0][1]) fgVZERORecentering[0][1]->SetDirectory(0x0);
2390   if (fgVZERORecentering[1][0]) fgVZERORecentering[1][0]->SetDirectory(0x0);
2391   if (fgVZERORecentering[1][1]) fgVZERORecentering[1][1]->SetDirectory(0x0);
2392   
2393 }
2394
2395 inline void AliDielectronVarManager::InitZDCRecenteringHistograms(Int_t runNo) {
2396
2397   //initialize only once
2398   if(fgZDCRecentering[0][0]) return;
2399
2400   for(Int_t i=0; i<2; ++i)
2401     for(Int_t j=0; j<2; ++j)
2402       if(fgZDCRecentering[i][j]) {
2403         delete fgZDCRecentering[i][j];
2404         fgZDCRecentering[i][j] = 0x0;
2405       }
2406
2407   TFile file(fgZDCRecenteringFile.Data());
2408   if (!file.IsOpen()) return;
2409
2410   fgZDCRecentering[0][0] = (TProfile3D*)file.Get(Form("RUN%06d_QxA_Recent", runNo));
2411   fgZDCRecentering[0][1] = (TProfile3D*)file.Get(Form("RUN%06d_QyA_Recent", runNo));
2412   fgZDCRecentering[1][0] = (TProfile3D*)file.Get(Form("RUN%06d_QxC_Recent", runNo));
2413   fgZDCRecentering[1][1] = (TProfile3D*)file.Get(Form("RUN%06d_QyC_Recent", runNo));
2414   fgZDCRecentering[2][0] = (TProfile3D*)file.Get(Form("RUN%06d_QxAC_Recent", runNo));
2415   fgZDCRecentering[2][1] = (TProfile3D*)file.Get(Form("RUN%06d_QyAC_Recent", runNo));
2416
2417
2418   if (fgZDCRecentering[0][0]) fgZDCRecentering[0][0]->SetDirectory(0x0);
2419   if (fgZDCRecentering[0][1]) fgZDCRecentering[0][1]->SetDirectory(0x0);
2420   if (fgZDCRecentering[1][0]) fgZDCRecentering[1][0]->SetDirectory(0x0);
2421   if (fgZDCRecentering[1][1]) fgZDCRecentering[1][1]->SetDirectory(0x0);
2422   if (fgZDCRecentering[2][0]) fgZDCRecentering[2][0]->SetDirectory(0x0);
2423   if (fgZDCRecentering[2][1]) fgZDCRecentering[2][1]->SetDirectory(0x0);
2424
2425 }
2426
2427
2428 inline Double_t AliDielectronVarManager::GetTRDpidEfficiency(Int_t runNo, Double_t centrality, 
2429                                                              Double_t eta, Double_t trdPhi, Double_t pout,
2430                                                              Double_t& effErr) {
2431   //
2432   // return the efficiency in the given phase space cell
2433   //
2434   // LHC10h data----------------------------------------------
2435   Bool_t isBplus = kTRUE;
2436   if(runNo<=138275) isBplus = kFALSE;
2437   // TODO: check magnetic polarity for runs in 2011 data
2438   // ---------------------------------------------------------
2439   Int_t centIdx = -1;
2440   for(Int_t icent=0; icent<10; ++icent) {
2441     if(isBplus) {
2442       if(centrality>=fgTRDpidEffCentRanges[icent][2] && centrality<fgTRDpidEffCentRanges[icent][3]) {
2443         centIdx = icent;
2444         break;
2445       }
2446     }
2447     else {
2448       if(centrality>=fgTRDpidEffCentRanges[icent][0] && centrality<fgTRDpidEffCentRanges[icent][1]) {
2449         centIdx = icent;
2450         break;
2451       }
2452     }
2453   }
2454   //TODO: chek logick
2455   if (centIdx<0) return 1;
2456   
2457   TH3D* effH = fgTRDpidEff[centIdx][(isBplus ? 1 : 0)];
2458   if(!effH) {effErr=0x0; return 1.0;}
2459   Int_t etaBin = effH->GetXaxis()->FindBin(eta);
2460   if(eta<effH->GetXaxis()->GetXmin()) etaBin=1;
2461   if(eta>effH->GetXaxis()->GetXmax()) etaBin=effH->GetXaxis()->GetNbins();
2462   Int_t phiBin = effH->GetYaxis()->FindBin(trdPhi);
2463   if(trdPhi<effH->GetYaxis()->GetXmin()) phiBin=1;
2464   if(trdPhi>effH->GetYaxis()->GetXmax()) phiBin=effH->GetYaxis()->GetNbins();
2465   Int_t poutBin = effH->GetZaxis()->FindBin(pout);
2466   if(pout<effH->GetZaxis()->GetXmin()) poutBin=1;
2467   if(pout>effH->GetZaxis()->GetXmax()) poutBin=effH->GetZaxis()->GetNbins();
2468   Double_t eff = effH->GetBinContent(etaBin, phiBin, poutBin);
2469   effErr = effH->GetBinError(etaBin, phiBin, poutBin);
2470   if(eff<-0.0001) {
2471     effErr = 0.0;
2472     eff = 1.0;
2473   }
2474   return eff;
2475 }
2476
2477
2478 inline void AliDielectronVarManager::SetEvent(AliVEvent * const ev)
2479 {
2480   
2481   fgEvent = ev;
2482   if (fgKFVertex) delete fgKFVertex;
2483   fgKFVertex=0x0;
2484   if (!ev) return;
2485   if (ev->GetPrimaryVertex()) fgKFVertex=new AliKFVertex(*ev->GetPrimaryVertex());
2486
2487   for (Int_t i=0; i<AliDielectronVarManager::kNMaxValues;++i) fgData[i]=0.;
2488   AliDielectronVarManager::Fill(fgEvent, fgData);
2489 }
2490
2491 inline void AliDielectronVarManager::SetEventData(const Double_t data[AliDielectronVarManager::kNMaxValues])
2492 {
2493   for (Int_t i=0; i<kNMaxValues;++i) fgData[i]=0.;
2494   for (Int_t i=kPairMax; i<kNMaxValues;++i) fgData[i]=data[i];
2495 }
2496
2497
2498 inline Bool_t AliDielectronVarManager::GetDCA(const AliAODTrack *track, Double_t d0z0[2])
2499 {
2500   if(track->TestBit(AliAODTrack::kIsDCA)){
2501     d0z0[0]=track->DCA();
2502     d0z0[1]=track->ZAtDCA();
2503     return kTRUE;
2504   }
2505   
2506   Bool_t ok=kFALSE;
2507   if(fgEvent) {
2508     Double_t covd0z0[3];
2509     //AliAODTrack copy(*track);
2510     AliExternalTrackParam etp; etp.CopyFromVTrack(track);
2511
2512     Float_t xstart = etp.GetX();
2513     if(xstart>3.) {
2514     d0z0[0]=-999.;
2515     d0z0[1]=-999.;
2516     //printf("This method can be used only for propagation inside the beam pipe \n");
2517     return kFALSE;
2518     }
2519
2520
2521     AliAODVertex *vtx =(AliAODVertex*)(fgEvent->GetPrimaryVertex());
2522     Double_t fBzkG = fgEvent->GetMagneticField(); // z componenent of field in kG
2523     ok = etp.PropagateToDCA(vtx,fBzkG,kVeryBig,d0z0,covd0z0);
2524     //ok = copy.PropagateToDCA(vtx,fBzkG,kVeryBig,d0z0,covd0z0);
2525   }
2526   if(!ok){
2527     d0z0[0]=-999.;
2528     d0z0[1]=-999.;
2529   }
2530   return ok;
2531 }
2532
2533 inline void AliDielectronVarManager::SetTPCEventPlane(AliEventplane *const evplane)
2534 {
2535   
2536   fgTPCEventPlane = evplane;
2537   FillVarTPCEventPlane(evplane,fgData);
2538   //  for (Int_t i=0; i<AliDielectronVarManager::kNMaxValues;++i) fgData[i]=0.;
2539   //  AliDielectronVarManager::Fill(fgEvent, fgData);
2540 }
2541
2542
2543 //_________________________________________________________________
2544 inline void AliDielectronVarManager::GetVzeroRP(const AliVEvent* event, Double_t* qvec, Int_t sideOption) {
2545   //
2546   // Get the reaction plane from the VZERO detector for a given harmonic
2547   //
2548   // sideOption = 0- V0A, 1- V0C, 2-both
2549   //  Q{x,y} = SUM_i mult(i) * {cos(n*phi_i), sin(n*phi_i)} 
2550   //  phi_i - phi angle of the VZERO sector i
2551   //          Each sector covers 45 degrees(8 sectors per ring). Middle of sector 0 is at 45/2
2552   //        channel 0: 22.5
2553   //                1: 22.5+45
2554   //                2: 22.5+45*2
2555   //               ...
2556   //        at the next ring continues the same
2557   //        channel 8: 22.5
2558   //        channel 9: 22.5 + 45
2559   //               ... 
2560   const Double_t kX[8] = {0.92388, 0.38268, -0.38268, -0.92388, -0.92388, -0.38268, 0.38268, 0.92388};    // cosines of the angles of the VZERO sectors (8 per ring)
2561   const Double_t kY[8] = {0.38268, 0.92388, 0.92388, 0.38268, -0.38268, -0.92388, -0.92388, -0.38268};    // sines     -- " --
2562   Int_t phi;
2563   Float_t mult;
2564   
2565   // get centrality and vertex for this event
2566   Double_t centralitySPD = -1; Double_t vtxZ = -999.;
2567   if(event->IsA() == AliESDEvent::Class()) {
2568     const AliESDEvent* esdEv = static_cast<const AliESDEvent*>(event);
2569     AliCentrality *esdCentrality = const_cast<AliESDEvent*>(esdEv)->GetCentrality();
2570     if(esdCentrality) centralitySPD = esdCentrality->GetCentralityPercentile("CL1");
2571   }
2572   if(event->IsA() == AliAODEvent::Class()) {
2573     const AliAODEvent* aodEv = static_cast<const AliAODEvent*>(event);
2574     AliAODHeader *header = aodEv->GetHeader();
2575     AliCentrality *aodCentrality = header->GetCentralityP();
2576     if(aodCentrality) centralitySPD = aodCentrality->GetCentralityPercentile("CL1");
2577   }
2578   const AliVVertex *primVtx = event->GetPrimaryVertex();
2579   if(!primVtx) return;
2580   vtxZ = primVtx->GetZ();
2581   if(TMath::Abs(vtxZ)>10.) return;
2582   if(centralitySPD<0. || centralitySPD>80.) return;
2583   
2584   Int_t binCent = -1; Int_t binVtx = -1;
2585   if(fgVZEROCalib[0]) {
2586     binVtx = fgVZEROCalib[0]->GetXaxis()->FindBin(vtxZ);
2587     binCent = fgVZEROCalib[0]->GetYaxis()->FindBin(centralitySPD);
2588   }
2589   
2590   AliVVZERO* vzero = event->GetVZEROData();
2591   Double_t average = 0.0;
2592   for(Int_t iChannel=0; iChannel<64; ++iChannel) {
2593     if(iChannel<32 && sideOption==0) continue;
2594     if(iChannel>=32 && sideOption==1) continue;
2595     phi=iChannel%8;
2596     mult = vzero->GetMultiplicity(iChannel);
2597     if(fgVZEROCalib[iChannel])
2598       average = fgVZEROCalib[iChannel]->GetBinContent(binVtx, binCent);
2599     if(average>1.0e-10 && mult>0.5) 
2600       mult /= average;
2601     else
2602       mult = 0.0;
2603     //  2nd harmonic
2604     qvec[0] += mult*(2.0*TMath::Power(kX[phi],2.0)-1);
2605     qvec[1] += mult*(2.0*kX[phi]*kY[phi]);
2606   }    // end loop over channels 
2607   
2608   // do recentering
2609   if(fgVZERORecentering[0][0]) {
2610 //     printf("vzero: %p\n",fgVZERORecentering[0][0]);
2611     Int_t binCentRecenter = -1; Int_t binVtxRecenter = -1;
2612     binCentRecenter = fgVZERORecentering[0][0]->GetXaxis()->FindBin(centralitySPD);
2613     binVtxRecenter = fgVZERORecentering[0][0]->GetYaxis()->FindBin(vtxZ);
2614     if(sideOption==0) {  // side A
2615       qvec[0] -= fgVZERORecentering[0][0]->GetBinContent(binCentRecenter, binVtxRecenter);
2616       qvec[1] -= fgVZERORecentering[0][1]->GetBinContent(binCentRecenter, binVtxRecenter);
2617     }
2618     if(sideOption==1) {  // side C
2619       qvec[0] -= fgVZERORecentering[1][0]->GetBinContent(binCentRecenter, binVtxRecenter);
2620       qvec[1] -= fgVZERORecentering[1][1]->GetBinContent(binCentRecenter, binVtxRecenter);
2621     }
2622     if(sideOption==2) {  // side A and C together
2623       qvec[0] -= fgVZERORecentering[0][0]->GetBinContent(binCentRecenter, binVtxRecenter);
2624       qvec[0] -= fgVZERORecentering[1][0]->GetBinContent(binCentRecenter, binVtxRecenter);
2625       qvec[1] -= fgVZERORecentering[0][1]->GetBinContent(binCentRecenter, binVtxRecenter);
2626       qvec[1] -= fgVZERORecentering[1][1]->GetBinContent(binCentRecenter, binVtxRecenter);
2627     }
2628   }
2629   
2630   // calculate the reaction plane
2631   if(TMath::Abs(qvec[0])>1.0e-10)
2632     qvec[2] = TMath::ATan2(qvec[1],qvec[0])/2.0;
2633 }
2634 inline void AliDielectronVarManager::GetZDCRP(const AliVEvent* event, Double_t qvec[][2]) {
2635
2636   //
2637   // Get the reaction plane from the ZDC detector for first harmonic
2638   //
2639   //  Q{x,y} = SUM{ri(x,y)*Ei} / SUM{Ei}
2640   //
2641
2642   const Int_t   nZDCSides  = 2;
2643   const Int_t   nZDCplanes = 3;
2644   const Int_t   Aside = 0, Cside = 1, ACside = 2;
2645   const Int_t   nZDCTowers = 4;// number of ZDCtowers
2646   const Double_t ZDCTowerCenters[nZDCTowers][2] = { {-1.75, -1.75}, { 1.75, -1.75},
2647                                                     {-1.75,  1.75}, { 1.75,  1.75} };
2648
2649   Double_t   *ZDCTEnergy[nZDCSides]; //reco E in 5 ZDC sectors - high gain chain
2650   Double_t    qvecNUM[nZDCplanes][2];
2651   Double_t    qvecDEN[nZDCplanes];
2652   memset(   qvecNUM,    0,     sizeof(qvecNUM));  //format
2653   memset(qvecDEN,     0,     sizeof(qvecDEN));  //format
2654
2655   Double_t TPCRefMulti = 999, vtxX = 999, vtxY = 999;
2656   Int_t multiBin = 0, vtxXBin = 0, vtxYBin = 0;
2657   Double_t recentdim[3][3] = { { 50, 0, 2500},   //multiplicity nbin, min, max
2658                                { 20, 0.04, 0.08},   //    vertex x nbin, min, max
2659                                { 20, 0.25, 0.29} }; //    vertex y nbin, min, max
2660
2661   if(!event->GetZDCData()) return;
2662   AliVZDC* aliZDC = event->GetZDCData();
2663   ZDCTEnergy[Aside] = (Double_t *)aliZDC -> GetZNATowerEnergy();
2664   ZDCTEnergy[Cside] = (Double_t *)aliZDC -> GetZNCTowerEnergy();
2665
2666   for(int j = 0;  j < nZDCSides   ; j++){
2667     for(int k = 0;   k < nZDCTowers ; k++){
2668       qvecNUM[j][0] += ZDCTowerCenters[k][0]*ZDCTEnergy[j][k+1]; //    zdcQ += xE
2669       qvecNUM[j][1] += ZDCTowerCenters[k][1]*ZDCTEnergy[j][k+1]; //    zdcQ += yE
2670       qvecDEN[j]    += ZDCTEnergy[j][k+1];                   // zdcQsum +=  E
2671
2672     }
2673     if(j == Aside){
2674       qvecNUM[j][0] = -qvecNUM[j][0];
2675     }
2676
2677     if(j == Cside){
2678       qvecNUM[j][0] = -qvecNUM[j][0];
2679       qvecNUM[j][1] = -qvecNUM[j][1];
2680     }
2681
2682
2683     qvecNUM[ACside][0] += qvecNUM[j][0];
2684     qvecNUM[ACside][1] += qvecNUM[j][1];
2685     qvecDEN[ACside] += qvecDEN[j];
2686
2687   }
2688
2689   for(int j = 0; j < nZDCplanes; j++){
2690     if(qvecDEN[j] != 0){
2691       qvec[j][0] = (qvecNUM[j][0] / qvecDEN[j]);
2692       qvec[j][1] = (qvecNUM[j][1] / qvecDEN[j]);
2693     }
2694     else if(qvecDEN[j] == 0) {
2695       qvec[j][0] = 999;
2696       qvec[j][1] = 999;
2697     }
2698
2699   }
2700
2701   if(fgZDCRecentering[0][0]){
2702     const AliAODEvent* aodEv = static_cast<const AliAODEvent*>(event);
2703     AliAODHeader *header = aodEv->GetHeader();
2704     if(!header) return;
2705     TPCRefMulti = header -> GetTPConlyRefMultiplicity();
2706
2707     const AliVVertex *primVtx = event->GetPrimaryVertex();
2708     if(!primVtx) return;
2709     vtxX = primVtx->GetX();
2710     vtxY = primVtx->GetY();
2711
2712     multiBin = (Int_t)((TPCRefMulti-recentdim[0][1])*recentdim[0][0] / (recentdim[0][2] - recentdim[0][1])) + 1;
2713     vtxXBin  = (Int_t)((vtxX-recentdim[1][1])*recentdim[1][0] / (recentdim[1][2] - recentdim[1][1])) + 1;
2714     vtxYBin  = (Int_t)((vtxY-recentdim[2][1])*recentdim[2][0] / (recentdim[2][2] - recentdim[2][1])) + 1;
2715
2716     for(int j = 0; j < nZDCplanes; j++)
2717       if(qvecDEN[j] != 0){
2718         qvec[j][0] -= fgZDCRecentering[j][0] -> GetBinContent(multiBin, vtxXBin, vtxYBin);
2719         qvec[j][1] -= fgZDCRecentering[j][1] -> GetBinContent(multiBin, vtxXBin, vtxYBin);
2720       }
2721   }
2722
2723 }
2724
2725
2726
2727 //______________________________________________________________________________                                                                                                                                                                                     
2728 inline AliAODVertex* AliDielectronVarManager::GetVertex(const AliAODEvent* event, AliAODVertex::AODVtx_t vtype) {
2729   // Get vertex
2730   Int_t nVertices=event->GetNumberOfVertices();
2731   for(Int_t iVert=0; iVert<nVertices; iVert++){
2732     AliAODVertex *v=event->GetVertex(iVert);
2733     //    printf(" vtx %d  contrib %d  daughters %d \n ",v->GetType(),v->GetNContributors(), v->GetNDaughters());
2734     if(v->GetType()==vtype) return v;
2735   }
2736   return 0;
2737 }
2738
2739 /*
2740 inline void AliDielectronVarManager::FillValues(const TParticle *particle, Double_t *values)
2741 {
2742   //
2743   // Fill track information available for histogramming into an array
2744   //
2745
2746   // Fill TParticle interface information
2747   values[AliDielectronVarManager::kPx]     = particle->Px();
2748   values[AliDielectronVarManager::kPy]     = particle->Py();
2749   values[AliDielectronVarManager::kPz]     = particle->Pz();
2750   values[AliDielectronVarManager::kPt]     = particle->Pt();
2751   values[AliDielectronVarManager::kP]      = particle->P();
2752
2753   values[AliDielectronVarManager::kXv]     = particle->Vx();
2754   values[AliDielectronVarManager::kYv]     = particle->Vy();
2755   values[AliDielectronVarManager::kZv]     = particle->Vz();
2756
2757   values[AliDielectronVarManager::kOneOverPt] = 1./particle->Pt();
2758   values[AliDielectronVarManager::kPhi]    = particle->Phi();
2759   values[AliDielectronVarManager::kTheta]  = 
2760   values[AliDielectronVarManager::kEta]    = particle->Eta();
2761   values[AliDielectronVarManager::kY]      = 
2762
2763   values[AliDielectronVarManager::kE]      = particle->Energy();
2764   values[AliDielectronVarManager::kM]      = particle->GetMass();
2765
2766   values[AliDielectronVarManager::kCharge] = particle->GetPDG()->Charge()/3; // uggly
2767
2768 }*/
2769
2770 #endif
2771