X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;ds=sidebyside;f=PWGDQ%2Fdielectron%2FAliDielectronVarManager.h;h=f5218826138ecc1ad6caf1f0a4cf6d60b60b989b;hb=7965afb66d9c164b1f80ba44c24dc6c27da32b3a;hp=cf98e6d014a16324bd552867cf54bc3f61afc17b;hpb=6bd73568f12f30e64a3efcce88b348578c4b49e4;p=u%2Fmrichter%2FAliRoot.git diff --git a/PWGDQ/dielectron/AliDielectronVarManager.h b/PWGDQ/dielectron/AliDielectronVarManager.h index cf98e6d014a..f5218826138 100644 --- a/PWGDQ/dielectron/AliDielectronVarManager.h +++ b/PWGDQ/dielectron/AliDielectronVarManager.h @@ -23,11 +23,14 @@ #include #include #include +#include #include +#include #include #include #include #include +#include #include #include @@ -35,6 +38,7 @@ #include #include #include +#include #include #include @@ -62,6 +66,12 @@ #include "AliDielectronPID.h" #include "AliDielectronHelper.h" +#include "AliAnalysisManager.h" +#include "AliInputEventHandler.h" +#include "AliVZEROEPSelectionTask.h" + +#include "AliAODMCHeader.h" + class AliVEvent; //________________________________________________________________ @@ -75,6 +85,7 @@ public: kPy, // py kPz, // pz kPt, // transverse momentum + kPtSq, // transverse momentum squared kP, // momentum kXv, // vertex position in x kYv, // vertex position in y @@ -115,11 +126,13 @@ public: kTRDprob2DPio, // TRD electron pid probability 2D LQ kTRDphi, // Phi angle of the track at the entrance of the TRD kTRDpidEffLeg, // TRD pid efficiency from conversion electrons + kTRDsignal, // TRD signal kImpactParXY, // Impact parameter in XY plane kImpactParZ, // Impact parameter in Z kTrackLength, // Track length + kPdgCode, // PDG code kPdgCodeMother, kPdgCodeGrandMother, // PDG code of the grandmother @@ -152,8 +165,10 @@ public: kTOFsignal, // TOF signal kTOFbeta, // TOF beta - kTOFPIDBit, // TOF PID bit (1:set, 0:TOF not available) + kTOFPIDBit, // TOF PID bit (1:set, 0:TOF not available)a + kTOFmismProb, // and mismatchPorbability as explain in TOF-twiki + kTPCnSigmaEleRaw, // raw number of sigmas to the dE/dx electron line in the TPC kTPCnSigmaEle, // number of sigmas to the dE/dx electron line in the TPC kTPCnSigmaPio, // number of sigmas to the dE/dx pion line in the TPC kTPCnSigmaMuo, // number of sigmas to the dE/dx muon line in the TPC @@ -174,6 +189,8 @@ public: kEMCALM20, // M20 showershape parameter kEMCALDispersion, // Dispersion paramter + kLegEff, // single electron efficiency + kOneOverLegEff, // 1 / single electron efficiency (correction factor) kV0Index0, // v0 index 0 kKinkIndex0, // kink index 0 @@ -185,6 +202,8 @@ public: kR, // distance to the origin kOpeningAngle, // opening angle kCosPointingAngle, // cosine of the pointing angle + kArmAlpha, // Armenteros-Podolanski alpha + kArmPt, // Armenteros-Podolanski pt // helicity picture: Z-axis is considered the direction of the mother's 3-momentum vector kThetaHE, // theta in mother's rest frame in the helicity picture kPhiHE, // phi in mother's rest frame in the helicity picture @@ -197,15 +216,48 @@ public: kPhiCS, // phi in mother's rest frame in Collins-Soper picture kThetaSqCS, // squared value of kThetaCS kPsiPair, // phi in mother's rest frame in Collins-Soper picture - kPhivPair, // angle between ee plane and the magnetic field (can be useful for conversion rejection) - kCos2PhiCS, // Cosine of 2*phi in mother's rest frame in the Collins-Soper picture + kPhivPair, // angle between ee plane and the magnetic field (can be useful for conversion rejection) + + kPairPlaneAngle1A, // angle between ee decay plane and x'-z reaction plane by using V0-A + kPairPlaneAngle2A, // angle between ee decay plane and (p1+p2) rot ez + kPairPlaneAngle3A, // angle between ee decay plane and (p1+p2) rot (p1+p2)x'z + kPairPlaneAngle4A, // angle between ee decay plane and x'-y' plane + kPairPlaneAngle1C, // using v0-C + kPairPlaneAngle2C, + kPairPlaneAngle3C, + kPairPlaneAngle4C, + kPairPlaneAngle1AC, // using v0-AC + kPairPlaneAngle2AC, + kPairPlaneAngle3AC, + kPairPlaneAngle4AC, + kPairPlaneAngle1Ran, // using random reaction plane + kPairPlaneAngle2Ran, + kPairPlaneAngle3Ran, + kPairPlaneAngle4Ran, + kRandomRP, //Random reaction plane + kDeltaPhiRandomRP, //delta phi of the pair + + kPairPlaneMagInPro, // Inner Product of strong magnetic field and ee plane + kCos2PhiCS, // Cosine of 2*phi in mother's rest frame in the Collins-Soper picture kCosTilPhiCS, // Shifted phi depending on kThetaCS + kCosPhiH2, // cosine of pair phi for 2nd harmonic + kSinPhiH2, // sinus of pair phi for 2nd harmonic kDeltaPhiV0ArpH2, // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-A kDeltaPhiV0CrpH2, // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-C kDeltaPhiV0ACrpH2, // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-A + V0-C kV0ArpH2FlowV2, // v2 coefficient with respect to the 2nd order reaction plane from V0-A kV0CrpH2FlowV2, // v2 coefficient with respect to the 2nd order reaction plane from V0-C kV0ACrpH2FlowV2, // v2 coefficient with respect to the 2nd order reaction plane from V0-A + V0-C + kDeltaPhiv0ArpH2, // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-A (EPtask) + kDeltaPhiv0CrpH2, // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-C + kDeltaPhiv0ACrpH2, // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-AC + kDeltaPhiTPCrpH2, // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from TPC + kv0ArpH2FlowV2, // v2 coefficient with respect to the 2nd order reaction plane from V0-A (EPtask) + kv0CrpH2FlowV2, // v2 coefficient with respect to the 2nd order reaction plane from V0-C + kv0ACrpH2FlowV2, // v2 coefficient with respect to the 2nd order reaction plane from V0-A + V0-C + kTPCrpH2FlowV2, // v2 coefficient with respect to the 2nd order reaction plane from TPC + kTPCrpH2FlowV2Sin, // sinus of v2 coefficient with respect to the 2nd order reaction plane from TPC + kLegDist, // distance of the legs kLegDistXY, // distance of the legs in XY kDeltaEta, // Absolute value of Delta Eta for the legs @@ -218,6 +270,12 @@ public: kPseudoProperTimeResolution, // resolution for pseudo proper decay time (reconstructed - MC truth) kPseudoProperTimePull, // normalizd resolution for pseudo proper time = (reco - MC truth)/dReco kTRDpidEffPair, // TRD pid efficieny from conversion electrons + kMomAsymDau1, // momentum fraction of daughter1 + kMomAsymDau2, // momentum fraction of daughter2 + kPairEff, // pair efficiency + kOneOverPairEff, // 1 / pair efficiency (correction factor) + kRndmPair, // radomly created number (used to apply special signal reduction cuts) + kPairs, // number of Ev1PM pair candidates after all cuts kPairMax, // // Event specific variables kXvPrim=kPairMax, // prim vertex @@ -229,7 +287,7 @@ public: kPhiMaxPt, // phi angle of the track with maximum pt kMaxPt, // track with maximum pt - //// v0 reaction plane quantities from AliEPSelectionTaks + //// v0 reaction plane quantities from AliEPSelectionTaks, angles interval [-pi/2,+pi/2] kv0ArpH2, // VZERO-A reaction plane of the Q vector for 2nd harmonic kv0CrpH2, // reaction plane kv0ACrpH2, // VZERO-AC reaction plane of the Q vector for 2nd harmonic @@ -246,9 +304,6 @@ public: kv0A3rpH2, // VZERO-A last ring reaction plane of the Q vector for 2nd harmonic kv0C0rpH2, // VZERO-C 1st ring reaction plane of the Q vector for 2nd harmonic kv0C3rpH2, // VZERO-C last ring reaction plane of the Q vector for 2nd harmonic - kDeltaPhiv0ArpH2, // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-A - kDeltaPhiv0CrpH2, // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-C - kDeltaPhiv0ACrpH2, // Delta phi of the pair with respect to the 2nd order harmonic reaction plane from V0-AC kv0ATPCDiffH2, // V0A-TPC reaction plane difference for 2nd harmonic kv0CTPCDiffH2, // V0C-TPC reaction plane difference for 2nd harmonic kv0Av0CDiffH2, // V0A-V0C reaction plane difference for 2nd harmonic @@ -258,13 +313,12 @@ public: kv0Cv0A3DiffH2, // V0C-ring 3 ofV0A reaction plane difference for 2nd harmonic kv0A0v0A3DiffH2, // V0C-ring 0 ofV0A reaction plane difference for 2nd harmonic kv0C0v0C3DiffH2, // V0C-ring 0 ofV0A reaction plane difference for 2nd harmonic - kv0ArpH2FlowV2, // v2 coefficient with respect to the 2nd order reaction plane from V0-A - kv0CrpH2FlowV2, // v2 coefficient with respect to the 2nd order reaction plane from V0-C - kv0ACrpH2FlowV2, // v2 coefficient with respect to the 2nd order reaction plane from V0-A + V0-C kMultV0A, // VZERO multiplicity and ADC amplitudes kMultV0C, kMultV0, + kEqMultV0A, // equalized VZERO multiplicity + kEqMultV0C, kAdcV0A, kAdcV0C, kAdcV0, @@ -291,11 +345,13 @@ public: kV0ATPCDiffH2, // V0A-TPC reaction plane difference for 2nd harmonic kV0CTPCDiffH2, // V0C-TPC reaction plane difference for 2nd harmonic kV0AV0CDiffH2, // V0A-V0C reaction plane difference for 2nd harmonic - // TPC reaction plane quantities + // TPC reaction plane quantities, angle interval [-pi/2,+pi/2] kTPCxH2, // TPC x-component of the Q vector for 2nd harmonic (corrected) kTPCyH2, // TPC y-component of the Q vector for 2nd harmonic (corrected) kTPCmagH2, // TPC reaction plane the Q vectors magnitude for 2nd harmonic (corrected) kTPCrpH2, // TPC reaction plane angle of the Q vector for 2nd harmonic (corrected) + kCosTPCrpH2, // cosine of TPC reaction plane angle of the Q vector for 2nd harmonic (corrected) + kSinTPCrpH2, // sinus of TPC reaction plane angle of the Q vector for 2nd harmonic (corrected) kTPCsub1xH2, // TPC x-component of the Q vector for 2nd harmonic (corrected, sub event 1) kTPCsub1yH2, // TPC y-component of the Q vector for 2nd harmonic (corrected, sub event 1) kTPCsub1rpH2, // TPC reaction plane of the Q vector for 2nd harmonic (corrected, sub event 1) @@ -317,11 +373,21 @@ public: kTPCsub2rpH2uc, // TPC reaction plane of the Q vector for 2nd harmonic (uncorrected, sub event 2) kTPCsub12DiffH2uc, // TPC reaction plane difference of sub event 1,2 for 2nd harmonic (uncorrected) + //ZDC reaction plane(v1 plane) quantities + + kZDCArpH1, // ZDC-A reaction plane of the Q vector for 1st harmonic + kZDCCrpH1, // ZDC-C reaction plane of the Q vector for 1st harmonic + kZDCACrpH1, // ZDC-AC reaction plane of the Q vector for 1st harmonic + kZDCrpResH1, // 1st harmonic reaction plane resolution for ZDC + kv0ZDCrpRes, //ZDC reaction plane for 1st harmonic and VZERO reaction plane for 2nd harmonic correlation + + kNTrk, // number of tracks (or tracklets) TODO: ambiguous - kTracks, // ESD tracks TODO: ambiguous + kTracks, // track after all cuts kNVtxContrib, // number of primary vertex contibutors kNVtxContribTPC, // number of TPC vertex contibutors kNacc, // Number of accepted tracks + kMatchEffITSTPC, // ruff estimate on the ITS-TPC matching efficiceny kNaccTrcklts, // number of accepted SPD tracklets in |eta|<1.6 kNaccTrcklts0916, // number of accepted SPD tracklets in 0.9<|eta|<1.6 @@ -344,6 +410,8 @@ public: kNaccItsPureEsd05Corr, // kNaccItsPureEsd10Corr, // kNaccItsPureEsd16Corr, // + kRefMult, // reference multiplicity (only in AODs) should be Ntrk w/o double counts + kRefMultTPConly, // TPC only Reference Multiplicty (AliESDtrackCuts::GetReferenceMultiplicity(&esd, kTRUE)) kNch, // MC true number of charged particles in |eta|<1.6 kNch05, // MC true number of charged particles in |eta|<0.5 @@ -351,6 +419,9 @@ public: kCentrality, // event centrality fraction kCentralitySPD, // centrality using SPD + kTriggerInclONL, // online trigger bits fired (inclusive) + kTriggerInclOFF, // offline trigger bits fired (inclusive) + kTriggerExclOFF, // offline only this trigger bit fired (exclusive) kNevents, // event counter kRunNumber, // run number kMixingBin, @@ -364,14 +435,17 @@ public: virtual ~AliDielectronVarManager(); static void Fill(const TObject* particle, Double_t * const values); static void FillVarMCParticle2(const AliVParticle *p1, const AliVParticle *p2, Double_t * const values); + static void FillVarVParticle(const AliVParticle *particle, Double_t * const values); static void InitESDpid(Int_t type=0); static void InitAODpidUtil(Int_t type=0); static void InitEstimatorAvg(const Char_t* filename); static void InitTRDpidEffHistograms(const Char_t* filename); + static void SetLegEffMap(THnBase *map) { fgEffMap=map; } static void SetVZEROCalibrationFile(const Char_t* filename) {fgVZEROCalibrationFile = filename;} static void SetVZERORecenteringFile(const Char_t* filename) {fgVZERORecenteringFile = filename;} + static void SetZDCRecenteringFile(const Char_t* filename) {fgZDCRecenteringFile = filename;} static void SetPIDResponse(AliPIDResponse *pidResponse) {fgPIDResponse=pidResponse;} static AliPIDResponse* GetPIDResponse() { return fgPIDResponse; } static void SetEvent(AliVEvent * const ev); @@ -379,9 +453,12 @@ public: static Bool_t GetDCA(const AliAODTrack *track, Double_t d0z0[2]); static void SetTPCEventPlane(AliEventplane *const evplane); static void GetVzeroRP(const AliVEvent* event, Double_t* qvec, Int_t sideOption); // 0- V0A; 1- V0C; 2- V0A+V0C + static void GetZDCRP(const AliVEvent* event, Double_t qvec[][2]); + static AliAODVertex* GetVertex(const AliAODEvent *event, AliAODVertex::AODVtx_t vtype); static TProfile* GetEstimatorHistogram(Int_t period, Int_t type) {return fgMultEstimatorAvg[period][type];} static Double_t GetTRDpidEfficiency(Int_t runNo, Double_t centrality, Double_t eta, Double_t trdPhi, Double_t pout, Double_t& effErr); + static Double_t GetSingleLegEff(Double_t * const values); static const AliKFVertex* GetKFVertex() {return fgKFVertex;} @@ -390,6 +467,7 @@ public: static const char* GetValueUnit(Int_t i) { return (i>=0&&iPy(); values[AliDielectronVarManager::kPz] = particle->Pz(); values[AliDielectronVarManager::kPt] = particle->Pt(); + values[AliDielectronVarManager::kPtSq] = particle->Pt()*particle->Pt(); values[AliDielectronVarManager::kP] = particle->P(); values[AliDielectronVarManager::kXv] = particle->Xv(); @@ -531,6 +615,7 @@ inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle values[AliDielectronVarManager::kTRDntracklets] = particle->GetTRDntracklets(); // TODO: GetTRDtracklets/GetTRDntracklets? values[AliDielectronVarManager::kTRDpidQuality] = particle->GetTRDntrackletsPID(); values[AliDielectronVarManager::kTRDchi2] = particle->GetTRDchi2(); + values[AliDielectronVarManager::kTRDsignal] = particle->GetTRDsignal(); values[AliDielectronVarManager::kTPCclsDiff] = tpcSignalN-tpcNcls; values[AliDielectronVarManager::kTPCclsSegments] = 0.0; const UChar_t threshold = 5; @@ -571,28 +656,19 @@ inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle values[AliDielectronVarManager::kNumberOfDaughters]=-999; AliDielectronMC *mc=AliDielectronMC::Instance(); - if (mc->HasMC()){ if (mc->GetMCTrack(particle)) { - values[AliDielectronVarManager::kPdgCode]=mc->GetMCTrack(particle)->PdgCode(); - Int_t trkLbl = mc->GetMCTrack(particle)->GetLabel(); - values[AliDielectronVarManager::kHasCocktailMother]=mc->CheckParticleSource(trkLbl, AliDielectronSignalMC::kDirect); - } - AliMCParticle *motherMC=mc->GetMCTrackMother(particle); //mother - if (motherMC){ - values[AliDielectronVarManager::kPdgCodeMother]=motherMC->PdgCode(); - Int_t motherLbl = motherMC->GetLabel(); - values[AliDielectronVarManager::kHasCocktailGrandMother]=mc->CheckParticleSource(motherLbl, AliDielectronSignalMC::kDirect); - - motherMC=mc->GetMCTrackMother(motherMC); //grand motherMC - if (motherMC) values[AliDielectronVarManager::kPdgCodeGrandMother]=motherMC->PdgCode();; + Int_t trkLbl = TMath::Abs(mc->GetMCTrack(particle)->GetLabel()); + values[AliDielectronVarManager::kPdgCode] =mc->GetMCTrack(particle)->PdgCode(); + values[AliDielectronVarManager::kHasCocktailMother] =mc->CheckParticleSource(trkLbl, AliDielectronSignalMC::kDirect); + values[AliDielectronVarManager::kPdgCodeMother] =mc->GetMotherPDG(particle); + AliMCParticle *motherMC=mc->GetMCTrackMother(particle); //mother + if(motherMC) values[AliDielectronVarManager::kPdgCodeGrandMother]=mc->GetMotherPDG(motherMC); } - values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle); } //if(mc->HasMC()) - values[AliDielectronVarManager::kITSsignal] = particle->GetITSsignal(); Double_t itsdEdx[4]; @@ -663,12 +739,15 @@ inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle values[AliDielectronVarManager::kTOFbeta]=beta; } values[AliDielectronVarManager::kTOFPIDBit]=(particle->GetStatus()&AliESDtrack::kTOFpid? 1: 0); + + values[AliDielectronVarManager::kTOFmismProb] = fgPIDResponse->GetTOFMismatchProbability(particle); // nsigma to Electron band // TODO: for the moment we set the bethe bloch parameters manually // this should be changed in future! - - values[AliDielectronVarManager::kTPCnSigmaEle]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kElectron)-AliDielectronPID::GetCorrVal(); + values[AliDielectronVarManager::kTPCnSigmaEleRaw]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kElectron); + values[AliDielectronVarManager::kTPCnSigmaEle]=(fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kElectron)-AliDielectronPID::GetCorrVal()-AliDielectronPID::GetCntrdCorr(particle)) / AliDielectronPID::GetWdthCorr(particle); + values[AliDielectronVarManager::kTPCnSigmaPio]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kPion); values[AliDielectronVarManager::kTPCnSigmaMuo]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kMuon); values[AliDielectronVarManager::kTPCnSigmaKao]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kKaon); @@ -697,8 +776,9 @@ inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle values[AliDielectronVarManager::kEMCALM02] = showershape[1]; values[AliDielectronVarManager::kEMCALM20] = showershape[2]; values[AliDielectronVarManager::kEMCALDispersion] = showershape[3]; - - + + values[AliDielectronVarManager::kLegEff] = GetSingleLegEff(values); + values[AliDielectronVarManager::kOneOverLegEff] = (values[AliDielectronVarManager::kLegEff]>0.0 ? 1./values[AliDielectronVarManager::kLegEff] : 0.0); //restore TPC signal if it was changed if (esdTrack) esdTrack->SetTPCsignal(origdEdx,esdTrack->GetTPCsignalSigma(),esdTrack->GetTPCsignalN()); } @@ -734,6 +814,7 @@ inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle values[AliDielectronVarManager::kTRDntracklets] = 0; values[AliDielectronVarManager::kTRDpidQuality] = particle->GetTRDntrackletsPID(); values[AliDielectronVarManager::kTRDchi2] = (particle->GetTRDntrackletsPID()!=0.?particle->GetTRDchi2():-1); + values[AliDielectronVarManager::kTRDsignal] = particle->GetTRDsignal(); values[AliDielectronVarManager::kTPCclsSegments] = 0.0; const UChar_t threshold = 5; TBits tpcClusterMap = particle->GetTPCClusterMap(); @@ -781,6 +862,7 @@ inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle values[AliDielectronVarManager::kTOFsignal]=0; //values[AliDielectronVarManager::kTOFbeta]=0; + values[AliDielectronVarManager::kTPCnSigmaEleRaw]=0; values[AliDielectronVarManager::kTPCnSigmaEle]=0; values[AliDielectronVarManager::kTPCnSigmaPio]=0; values[AliDielectronVarManager::kTPCnSigmaMuo]=0; @@ -793,7 +875,8 @@ inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle values[AliDielectronVarManager::kTOFnSigmaKao]=0; values[AliDielectronVarManager::kTOFnSigmaPro]=0; - values[AliDielectronVarManager::kITSclusterMap] = particle->GetITSClusterMap(); + values[AliDielectronVarManager::kITSsignal] = particle->GetITSsignal(); + values[AliDielectronVarManager::kITSclusterMap] = particle->GetITSClusterMap(); values[AliDielectronVarManager::kITSLayerFirstCls] = -1.; for (Int_t iC=0; iC<6; iC++) { if (((particle->GetITSClusterMap()) & (1<<(iC))) > 0) { @@ -813,30 +896,13 @@ inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle values[AliDielectronVarManager::kTPCsignalN] = tpcSignalN; values[AliDielectronVarManager::kTPCsignalNfrac] = tpcNcls>0?tpcSignalN/tpcNcls:0; values[AliDielectronVarManager::kTPCclsDiff] = tpcSignalN-tpcNcls; - Double_t tpcNsigmaEle=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kElectron); - Double_t tpcNsigmaPio=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kPion); - Double_t tpcNsigmaMuo=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kMuon); - Double_t tpcNsigmaKao=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kKaon); - Double_t tpcNsigmaPro=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kProton); - - values[AliDielectronVarManager::kPIn]=mom; - values[AliDielectronVarManager::kTPCsignal]=pid->GetTPCsignal(); - values[AliDielectronVarManager::kTPCnSigmaEle]=tpcNsigmaEle; - values[AliDielectronVarManager::kTPCnSigmaPio]=tpcNsigmaPio; - values[AliDielectronVarManager::kTPCnSigmaMuo]=tpcNsigmaMuo; - values[AliDielectronVarManager::kTPCnSigmaKao]=tpcNsigmaKao; - values[AliDielectronVarManager::kTPCnSigmaPro]=tpcNsigmaPro; - - Double_t prob[AliPID::kSPECIES]; - fgPIDResponse->ComputeTRDProbability(particle,AliPID::kSPECIES,prob); - values[AliDielectronVarManager::kTRDprobEle] = prob[AliPID::kElectron]; - values[AliDielectronVarManager::kTRDprobPio] = prob[AliPID::kPion]; - // fgPIDResponse->ComputeTRDProbability(particle,AliPID::kSPECIES,prob, AliTRDPIDResponse::kLQ2D); - values[AliDielectronVarManager::kTRDprob2DEle] = 0.0;//prob[AliPID::kElectron]; - values[AliDielectronVarManager::kTRDprob2DPio] = 0.0;//prob[AliPID::kPion]; + values[AliDielectronVarManager::kPIn]=mom; + values[AliDielectronVarManager::kTPCsignal] = pid->GetTPCsignal(); + values[AliDielectronVarManager::kTOFsignal] = pid->GetTOFsignal(); + values[AliDielectronVarManager::kTOFmismProb] = fgPIDResponse->GetTOFMismatchProbability(particle); - values[AliDielectronVarManager::kTOFsignal]=pid->GetTOFsignal(); + // TOF beta calculation Double32_t expt[5]; particle->GetIntegratedTimes(expt); // ps Double_t l = TMath::C()* expt[0]*1e-12; // m @@ -850,24 +916,42 @@ inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle } else { t *= 1e-12; //ps -> s - + Double_t v = l / t; Float_t beta = v / TMath::C(); values[AliDielectronVarManager::kTOFbeta]=beta; } - Double_t tofNsigmaEle=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kElectron); - Double_t tofNsigmaPio=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kPion); - Double_t tofNsigmaMuo=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kMuon); - Double_t tofNsigmaKao=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kKaon); - Double_t tofNsigmaPro=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kProton); - - values[AliDielectronVarManager::kTOFnSigmaEle]=tofNsigmaEle; - values[AliDielectronVarManager::kTOFnSigmaPio]=tofNsigmaPio; - values[AliDielectronVarManager::kTOFnSigmaMuo]=tofNsigmaMuo; - values[AliDielectronVarManager::kTOFnSigmaKao]=tofNsigmaKao; - values[AliDielectronVarManager::kTOFnSigmaPro]=tofNsigmaPro; - + // nsigma for various detectors + values[AliDielectronVarManager::kTPCnSigmaEleRaw]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kElectron); + values[AliDielectronVarManager::kTPCnSigmaEle]=(fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kElectron)-AliDielectronPID::GetCorrVal()-AliDielectronPID::GetCntrdCorr(particle)) / AliDielectronPID::GetWdthCorr(particle); + + values[AliDielectronVarManager::kTPCnSigmaPio]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kPion); + values[AliDielectronVarManager::kTPCnSigmaMuo]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kMuon); + values[AliDielectronVarManager::kTPCnSigmaKao]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kKaon); + values[AliDielectronVarManager::kTPCnSigmaPro]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kProton); + + values[AliDielectronVarManager::kITSnSigmaEle]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kElectron); + values[AliDielectronVarManager::kITSnSigmaPio]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kPion); + values[AliDielectronVarManager::kITSnSigmaMuo]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kMuon); + values[AliDielectronVarManager::kITSnSigmaKao]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kKaon); + values[AliDielectronVarManager::kITSnSigmaPro]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kProton); + + values[AliDielectronVarManager::kTOFnSigmaEle]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kElectron); + values[AliDielectronVarManager::kTOFnSigmaPio]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kPion); + values[AliDielectronVarManager::kTOFnSigmaMuo]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kMuon); + values[AliDielectronVarManager::kTOFnSigmaKao]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kKaon); + values[AliDielectronVarManager::kTOFnSigmaPro]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kProton); + + Double_t prob[AliPID::kSPECIES]; + fgPIDResponse->ComputeTRDProbability(particle,AliPID::kSPECIES,prob); + values[AliDielectronVarManager::kTRDprobEle] = prob[AliPID::kElectron]; + values[AliDielectronVarManager::kTRDprobPio] = prob[AliPID::kPion]; + // fgPIDResponse->ComputeTRDProbability(particle,AliPID::kSPECIES,prob, AliTRDPIDResponse::kLQ2D); + values[AliDielectronVarManager::kTRDprob2DEle] = prob[AliPID::kElectron]; + values[AliDielectronVarManager::kTRDprob2DPio] = prob[AliPID::kPion]; + + //restore TPC signal if it was changed pid->SetTPCsignal(origdEdx); } @@ -890,30 +974,24 @@ inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle values[AliDielectronVarManager::kHasCocktailGrandMother]=0; values[AliDielectronVarManager::kNumberOfDaughters]=-1; - + AliDielectronMC *mc=AliDielectronMC::Instance(); - if (mc->HasMC()){ if (mc->GetMCTrack(particle)) { - values[AliDielectronVarManager::kPdgCode]=mc->GetMCTrack(particle)->PdgCode(); - Int_t trkLbl = mc->GetMCTrack(particle)->GetLabel(); - // printf("trklbl %d for %p->%p \n",trkLbl,particle,mc->GetMCTrack(particle)); - values[AliDielectronVarManager::kHasCocktailMother]=mc->CheckParticleSource(trkLbl, AliDielectronSignalMC::kDirect); - } - AliAODMCParticle *motherMC=mc->GetMCTrackMother(particle); //mother - if (motherMC){ - values[AliDielectronVarManager::kPdgCodeMother]=motherMC->PdgCode(); - Int_t motherLbl = motherMC->GetLabel(); - values[AliDielectronVarManager::kHasCocktailGrandMother]=mc->CheckParticleSource(motherLbl, AliDielectronSignalMC::kDirect); - - motherMC=mc->GetMCTrackMother(motherMC); //grand motherMC - if (motherMC) values[AliDielectronVarManager::kPdgCodeGrandMother]=motherMC->PdgCode();; + Int_t trkLbl = TMath::Abs(mc->GetMCTrack(particle)->GetLabel()); + values[AliDielectronVarManager::kPdgCode] =mc->GetMCTrack(particle)->PdgCode(); + values[AliDielectronVarManager::kHasCocktailMother] =mc->CheckParticleSource(trkLbl, AliDielectronSignalMC::kDirect); + values[AliDielectronVarManager::kPdgCodeMother] =mc->GetMotherPDG(particle); + AliAODMCParticle *motherMC=mc->GetMCTrackMother(particle); //mother + if(motherMC) values[AliDielectronVarManager::kPdgCodeGrandMother]=mc->GetMotherPDG(motherMC); } - values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle); } //if(mc->HasMC()) - + values[AliDielectronVarManager::kTOFPIDBit]=(particle->GetStatus()&AliESDtrack::kTOFpid? 1: 0); + values[AliDielectronVarManager::kLegEff] = GetSingleLegEff(values); + values[AliDielectronVarManager::kOneOverLegEff] = (values[AliDielectronVarManager::kLegEff]>0.0 ? 1./values[AliDielectronVarManager::kLegEff] : 0.0); + } inline void AliDielectronVarManager::FillVarMCParticle(const AliMCParticle *particle, Double_t * const values) @@ -949,6 +1027,7 @@ inline void AliDielectronVarManager::FillVarMCParticle(const AliMCParticle *part values[AliDielectronVarManager::kTPCsignal] = 0; values[AliDielectronVarManager::kTOFsignal] = 0; values[AliDielectronVarManager::kTOFbeta] = 0; + values[AliDielectronVarManager::kTPCnSigmaEleRaw] = 0; values[AliDielectronVarManager::kTPCnSigmaEle] = 0; values[AliDielectronVarManager::kTPCnSigmaPio] = 0; values[AliDielectronVarManager::kTPCnSigmaMuo] = 0; @@ -964,24 +1043,17 @@ inline void AliDielectronVarManager::FillVarMCParticle(const AliMCParticle *part // Fill common AliVParticle interface information FillVarVParticle(particle, values); - - AliDielectronMC *mc=AliDielectronMC::Instance(); // Fill AliMCParticle interface specific information - values[AliDielectronVarManager::kPdgCode] = particle->PdgCode(); - Int_t trkLbl = particle->GetLabel(); - values[AliDielectronVarManager::kHasCocktailMother]=mc->CheckParticleSource(trkLbl, AliDielectronSignalMC::kDirect); - - AliMCParticle *motherMC = mc->GetMCTrackMother(particle); - if (motherMC){ - values[AliDielectronVarManager::kPdgCodeMother]=motherMC->PdgCode(); - Int_t motherLbl = motherMC->GetLabel(); - values[AliDielectronVarManager::kHasCocktailGrandMother]=mc->CheckParticleSource(motherLbl, AliDielectronSignalMC::kDirect); - - motherMC=mc->GetMCTrackMother(motherMC); //grand mother - if (motherMC) values[AliDielectronVarManager::kPdgCodeGrandMother]=motherMC->PdgCode();; - } - + AliDielectronMC *mc=AliDielectronMC::Instance(); + Int_t trkLbl = TMath::Abs(particle->GetLabel()); + values[AliDielectronVarManager::kPdgCode] = particle->PdgCode(); + values[AliDielectronVarManager::kHasCocktailMother] = mc->CheckParticleSource(trkLbl, AliDielectronSignalMC::kDirect); + values[AliDielectronVarManager::kPdgCodeMother] = mc->GetMotherPDG(particle); + AliMCParticle *motherMC=mc->GetMCTrackMother(particle); //mother + if(motherMC) values[AliDielectronVarManager::kPdgCodeGrandMother]=mc->GetMotherPDG(motherMC); + + values[AliDielectronVarManager::kIsJpsiPrimary] = mc->IsJpsiPrimary(particle); values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle); } @@ -1017,6 +1089,7 @@ inline void AliDielectronVarManager::FillVarMCParticle2(const AliVParticle *p1, values[AliDielectronVarManager::kPIn] = 0; values[AliDielectronVarManager::kYsignedIn] = 0; values[AliDielectronVarManager::kTPCsignal] = 0; + values[AliDielectronVarManager::kTPCnSigmaEleRaw] = 0; values[AliDielectronVarManager::kTPCnSigmaEle] = 0; values[AliDielectronVarManager::kTPCnSigmaPio] = 0; values[AliDielectronVarManager::kTPCnSigmaMuo] = 0; @@ -1024,8 +1097,8 @@ inline void AliDielectronVarManager::FillVarMCParticle2(const AliVParticle *p1, values[AliDielectronVarManager::kTPCnSigmaPro] = 0; values[AliDielectronVarManager::kITSclusterMap] = 0; - values[AliDielectronVarManager::kPdgCode] = 0; - values[AliDielectronVarManager::kPdgCodeMother] = 0; + values[AliDielectronVarManager::kPdgCode] = -1; + values[AliDielectronVarManager::kPdgCodeMother] = -1; values[AliDielectronVarManager::kHasCocktailMother]=0; AliDielectronMC *mc=AliDielectronMC::Instance(); @@ -1038,8 +1111,10 @@ inline void AliDielectronVarManager::FillVarMCParticle2(const AliVParticle *p1, values[AliDielectronVarManager::kPseudoProperTime] = -2e10; if(mother) { // same mother FillVarVParticle(mother, values); - Double_t lxy = ((mother->Xv()- values[AliDielectronVarManager::kXvPrim]) * mother->Px() + - (mother->Yv()- values[AliDielectronVarManager::kYvPrim]) * mother->Py() )/mother->Pt(); + Double_t vtxX, vtxY, vtxZ; + mc->GetPrimaryVertex(vtxX,vtxY,vtxZ); + Double_t lxy = ((mother->Xv()- vtxX) * mother->Px() + + (mother->Yv()- vtxY) * mother->Py() )/mother->Pt(); values[AliDielectronVarManager::kPseudoProperTime] = lxy*(TDatabasePDG::Instance()->GetParticle(443)->Mass())/mother->Pt(); } // AliVParticle part @@ -1050,6 +1125,7 @@ inline void AliDielectronVarManager::FillVarMCParticle2(const AliVParticle *p1, values[AliDielectronVarManager::kPx]+ values[AliDielectronVarManager::kPy]* values[AliDielectronVarManager::kPy]); + values[AliDielectronVarManager::kPtSq] = values[AliDielectronVarManager::kPt] * values[AliDielectronVarManager::kPt]; values[AliDielectronVarManager::kP] = TMath::Sqrt(values[AliDielectronVarManager::kPt]* values[AliDielectronVarManager::kPt]+ values[AliDielectronVarManager::kPz]* @@ -1115,6 +1191,7 @@ inline void AliDielectronVarManager::FillVarAODMCParticle(const AliAODMCParticle values[AliDielectronVarManager::kPIn] = 0; values[AliDielectronVarManager::kYsignedIn] = 0; values[AliDielectronVarManager::kTPCsignal] = 0; + values[AliDielectronVarManager::kTPCnSigmaEleRaw] = 0; values[AliDielectronVarManager::kTPCnSigmaEle] = 0; values[AliDielectronVarManager::kTPCnSigmaPio] = 0; values[AliDielectronVarManager::kTPCnSigmaMuo] = 0; @@ -1130,29 +1207,27 @@ inline void AliDielectronVarManager::FillVarAODMCParticle(const AliAODMCParticle // Fill common AliVParticle interface information FillVarVParticle(particle, values); - + + // Fill AliAODMCParticle interface specific information AliDielectronMC *mc=AliDielectronMC::Instance(); + Int_t trkLbl = TMath::Abs(particle->GetLabel()); + values[AliDielectronVarManager::kPdgCode] = particle->PdgCode(); + values[AliDielectronVarManager::kHasCocktailMother] = mc->CheckParticleSource(trkLbl, AliDielectronSignalMC::kDirect); + values[AliDielectronVarManager::kPdgCodeMother] = mc->GetMotherPDG(particle); + AliAODMCParticle *motherMC=mc->GetMCTrackMother(particle); //mother + if(motherMC) values[AliDielectronVarManager::kPdgCodeGrandMother]=mc->GetMotherPDG(motherMC); + values[AliDielectronVarManager::kIsJpsiPrimary] = mc->IsJpsiPrimary(particle); + values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle); - // Fill AliAODMCParticle interface specific information - values[AliDielectronVarManager::kPdgCode] = particle->PdgCode(); - Int_t trkLbl = particle->GetLabel(); - values[AliDielectronVarManager::kHasCocktailMother]=mc->CheckParticleSource(trkLbl, AliDielectronSignalMC::kDirect); - - AliAODMCParticle *motherMC = mc->GetMCTrackMother(particle); - if (motherMC){ - values[AliDielectronVarManager::kPdgCodeMother]=motherMC->PdgCode(); - Int_t motherLbl = motherMC->GetLabel(); - values[AliDielectronVarManager::kHasCocktailGrandMother]=mc->CheckParticleSource(motherLbl, AliDielectronSignalMC::kDirect); - - motherMC=mc->GetMCTrackMother(motherMC); //grand mother - if (motherMC) values[AliDielectronVarManager::kPdgCodeGrandMother]=motherMC->PdgCode();; + // using AODMCHEader information + AliAODMCHeader *mcHeader = (AliAODMCHeader*)fgEvent->FindListObject(AliAODMCHeader::StdBranchName()); + if(mcHeader) { + values[AliDielectronVarManager::kImpactParZ] = mcHeader->GetVtxZ()-particle->Zv(); + values[AliDielectronVarManager::kImpactParXY] = TMath::Sqrt(TMath::Power(mcHeader->GetVtxX()-particle->Xv(),2) + + TMath::Power(mcHeader->GetVtxY()-particle->Yv(),2)); } - - - values[AliDielectronVarManager::kIsJpsiPrimary] = mc->IsJpsiPrimary(particle); - values[AliDielectronVarManager::kNumberOfDaughters]=mc->NumberOfDaughters(particle); } inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPair *pair, Double_t * const values) @@ -1202,6 +1277,9 @@ inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPa values[AliDielectronVarManager::kDeltaPhi] = pair->DeltaPhi(); values[AliDielectronVarManager::kMerr] = kfPair.GetErrMass()>1e-30&&kfPair.GetMass()>1e-30?kfPair.GetErrMass()/kfPair.GetMass():1000000; values[AliDielectronVarManager::kPairType] = pair->GetType(); + // Armenteros-Podolanski quantities + values[AliDielectronVarManager::kArmAlpha] = pair->GetArmAlpha(); + values[AliDielectronVarManager::kArmPt] = pair->GetArmPt(); values[AliDielectronVarManager::kPsiPair] = fgEvent ? pair->PsiPair(fgEvent->GetMagneticField()) : -5; values[AliDielectronVarManager::kPhivPair] = fgEvent ? pair->PhivPair(fgEvent->GetMagneticField()) : -5; @@ -1209,6 +1287,14 @@ inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPa // values[AliDielectronVarManager::kPseudoProperTime] = fgEvent ? pair->GetPseudoProperTime(fgEvent->GetPrimaryVertex()): -1e10; values[AliDielectronVarManager::kPseudoProperTimeErr] = (errPseudoProperTime2 > 0) ? TMath::Sqrt(errPseudoProperTime2) : -1e10; + // impact parameter + Double_t d0z0[2]; + d0z0[0]=-999.; + d0z0[1]=-999.; + if(fgEvent) pair->GetDCA(fgEvent->GetPrimaryVertex(), d0z0); + values[AliDielectronVarManager::kImpactParXY] = d0z0[0]; + values[AliDielectronVarManager::kImpactParZ] = d0z0[1]; + if (!(pair->GetKFUsage())) { //if KF Pairing is not enabled, overwrite values that can be easily derived from legs @@ -1253,6 +1339,7 @@ inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPa values[AliDielectronVarManager::kPz] = (lv1+lv2).Pz(); values[AliDielectronVarManager::kPt] = (lv1+lv2).Pt(); + values[AliDielectronVarManager::kPtSq] = values[AliDielectronVarManager::kPt] * values[AliDielectronVarManager::kPt]; values[AliDielectronVarManager::kP] = (lv1+lv2).P(); @@ -1269,7 +1356,7 @@ inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPa values[AliDielectronVarManager::kOpeningAngle] = lv1.Angle(lv2.Vect()); values[AliDielectronVarManager::kOneOverPt] = (values[AliDielectronVarManager::kPt]>0. ? 1./values[AliDielectronVarManager::kPt] : -9999.); - values[AliDielectronVarManager::kPhi] = (lv1+lv2).Phi(); + values[AliDielectronVarManager::kPhi] = (lv1+lv2).Phi()+TMath::Pi(); // change interval to [0,+2pi] values[AliDielectronVarManager::kEta] = (lv1+lv2).Eta(); values[AliDielectronVarManager::kY] = (lv1+lv2).Rapidity(); @@ -1310,11 +1397,12 @@ inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPa values[AliDielectronVarManager::kPsiPair] = 0.; */ - - } //common, regardless of calculation method - // Flow quantities + + // Flow quantities + values[AliDielectronVarManager::kCosPhiH2] = TMath::Cos(2*values[AliDielectronVarManager::kPhi]); + values[AliDielectronVarManager::kSinPhiH2] = TMath::Sin(2*values[AliDielectronVarManager::kPhi]); Double_t delta=0.0; // v2 with respect to VZERO-A event plane delta = values[AliDielectronVarManager::kPhi] - fgData[AliDielectronVarManager::kV0ArpH2]; @@ -1337,16 +1425,26 @@ inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPa // quantities using the values of AliEPSelectionTask - values[AliDielectronVarManager::kDeltaPhiv0ArpH2] = values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kv0ArpH2]; - values[AliDielectronVarManager::kDeltaPhiv0CrpH2] = values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kv0CrpH2]; + values[AliDielectronVarManager::kDeltaPhiv0ArpH2] = values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kv0ArpH2]; + values[AliDielectronVarManager::kDeltaPhiv0CrpH2] = values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kv0CrpH2]; values[AliDielectronVarManager::kDeltaPhiv0ACrpH2] = values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kv0ACrpH2]; - // keep the interval [-pi,+pi] + values[AliDielectronVarManager::kDeltaPhiTPCrpH2] = values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kTPCrpH2]; + values[AliDielectronVarManager::kv0ACrpH2FlowV2] = TMath::Cos( 2*(values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kv0ACrpH2]) ); + values[AliDielectronVarManager::kv0ArpH2FlowV2] = TMath::Cos( 2*(values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kv0ArpH2]) ); + values[AliDielectronVarManager::kv0CrpH2FlowV2] = TMath::Cos( 2*(values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kv0CrpH2]) ); + values[AliDielectronVarManager::kTPCrpH2FlowV2] = TMath::Cos( 2*(values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kTPCrpH2]) ); + values[AliDielectronVarManager::kTPCrpH2FlowV2Sin] = TMath::Sin( 2*(values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kTPCrpH2]) ); + + + // keep the interval [-pi,+pi] if ( values[AliDielectronVarManager::kDeltaPhiv0ArpH2] > TMath::Pi() ) values[AliDielectronVarManager::kDeltaPhiv0ArpH2] -= TMath::TwoPi(); if ( values[AliDielectronVarManager::kDeltaPhiv0CrpH2] > TMath::Pi() ) values[AliDielectronVarManager::kDeltaPhiv0CrpH2] -= TMath::TwoPi(); if ( values[AliDielectronVarManager::kDeltaPhiv0ACrpH2] > TMath::Pi() ) values[AliDielectronVarManager::kDeltaPhiv0ACrpH2] -= TMath::TwoPi(); + if ( values[AliDielectronVarManager::kDeltaPhiTPCrpH2] > TMath::Pi() ) + values[AliDielectronVarManager::kDeltaPhiTPCrpH2] -= TMath::TwoPi(); if ( values[AliDielectronVarManager::kDeltaPhiv0ArpH2] < -1.*TMath::Pi() ) values[AliDielectronVarManager::kDeltaPhiv0ArpH2] += TMath::TwoPi(); @@ -1354,8 +1452,44 @@ inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPa values[AliDielectronVarManager::kDeltaPhiv0CrpH2] += TMath::TwoPi(); if ( values[AliDielectronVarManager::kDeltaPhiv0ACrpH2] < -1.*TMath::Pi() ) values[AliDielectronVarManager::kDeltaPhiv0ACrpH2] += TMath::TwoPi(); + if ( values[AliDielectronVarManager::kDeltaPhiTPCrpH2] < -1.*TMath::Pi() ) + values[AliDielectronVarManager::kDeltaPhiTPCrpH2] += TMath::TwoPi(); + + //calculate inner product of strong Mag and ee plane + values[AliDielectronVarManager::kPairPlaneMagInPro] = pair->PairPlaneMagInnerProduct(values[AliDielectronVarManager::kZDCACrpH1]); + + //Calculate the angle between electrons decay plane and variables 1-4 + values[AliDielectronVarManager::kPairPlaneAngle1A] = pair->GetPairPlaneAngle(values[AliDielectronVarManager::kv0ArpH2],1); + values[AliDielectronVarManager::kPairPlaneAngle2A] = pair->GetPairPlaneAngle(values[AliDielectronVarManager::kv0ArpH2],2); + values[AliDielectronVarManager::kPairPlaneAngle3A] = pair->GetPairPlaneAngle(values[AliDielectronVarManager::kv0ArpH2],3); + values[AliDielectronVarManager::kPairPlaneAngle4A] = pair->GetPairPlaneAngle(values[AliDielectronVarManager::kv0ArpH2],4); + + values[AliDielectronVarManager::kPairPlaneAngle1C] = pair->GetPairPlaneAngle(values[AliDielectronVarManager::kv0CrpH2],1); + values[AliDielectronVarManager::kPairPlaneAngle2C] = pair->GetPairPlaneAngle(values[AliDielectronVarManager::kv0CrpH2],2); + values[AliDielectronVarManager::kPairPlaneAngle3C] = pair->GetPairPlaneAngle(values[AliDielectronVarManager::kv0CrpH2],3); + values[AliDielectronVarManager::kPairPlaneAngle4C] = pair->GetPairPlaneAngle(values[AliDielectronVarManager::kv0CrpH2],4); + + values[AliDielectronVarManager::kPairPlaneAngle1AC] = pair->GetPairPlaneAngle(values[AliDielectronVarManager::kv0ACrpH2],1); + values[AliDielectronVarManager::kPairPlaneAngle2AC] = pair->GetPairPlaneAngle(values[AliDielectronVarManager::kv0ACrpH2],2); + values[AliDielectronVarManager::kPairPlaneAngle3AC] = pair->GetPairPlaneAngle(values[AliDielectronVarManager::kv0ACrpH2],3); + values[AliDielectronVarManager::kPairPlaneAngle4AC] = pair->GetPairPlaneAngle(values[AliDielectronVarManager::kv0ACrpH2],4); + + //Random reaction plane + values[AliDielectronVarManager::kRandomRP] = gRandom->Uniform(-TMath::Pi()/2.0,TMath::Pi()/2.0); + //delta phi of pair fron random reaction plane + values[AliDielectronVarManager::kDeltaPhiRandomRP] = values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kRandomRP]; + // keep the interval [-pi,+pi] + if ( values[AliDielectronVarManager::kDeltaPhiRandomRP] > TMath::Pi() ) + values[AliDielectronVarManager::kDeltaPhiRandomRP] -= TMath::TwoPi(); + + values[AliDielectronVarManager::kPairPlaneAngle1Ran]= pair->GetPairPlaneAngle(values[AliDielectronVarManager::kRandomRP],1); + values[AliDielectronVarManager::kPairPlaneAngle2Ran]= pair->GetPairPlaneAngle(values[AliDielectronVarManager::kRandomRP],2); + values[AliDielectronVarManager::kPairPlaneAngle3Ran]= pair->GetPairPlaneAngle(values[AliDielectronVarManager::kRandomRP],3); + values[AliDielectronVarManager::kPairPlaneAngle4Ran]= pair->GetPairPlaneAngle(values[AliDielectronVarManager::kRandomRP],4); + + + - AliDielectronMC *mc=AliDielectronMC::Instance(); if (mc->HasMC()){ @@ -1369,15 +1503,15 @@ inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPa // values[AliDielectronVarManager::kPseudoProperTimePull] = -1e10; if(samemother && fgEvent) { if(pair->GetFirstDaughter()->GetLabel() > 0) { - const AliVParticle* d1 = mc->GetMCTrackFromMCEvent(pair->GetFirstDaughter()->GetLabel()); - const AliVParticle* motherMC = mc->GetMCTrackFromMCEvent(((AliMCParticle*)d1)->GetMother()); - const AliMCEvent *mcevent = mc->GetMCEvent(); - const AliVVertex* mcVtx = mcevent ? mcevent->GetPrimaryVertex() : 0x0; - if(motherMC && mcVtx) { + const AliVParticle *motherMC = 0x0; + if(fgEvent->IsA() == AliESDEvent::Class()) motherMC = (AliMCParticle*)mc->GetMCTrackMother((AliESDtrack*)pair->GetFirstDaughter()); + else if(fgEvent->IsA() == AliAODEvent::Class()) motherMC = (AliAODMCParticle*)mc->GetMCTrackMother((AliAODTrack*)pair->GetFirstDaughter()); + Double_t vtxX, vtxY, vtxZ; + if(motherMC && mc->GetPrimaryVertex(vtxX,vtxY,vtxZ)) { Int_t motherLbl = motherMC->GetLabel(); values[AliDielectronVarManager::kHasCocktailMother]=mc->CheckParticleSource(motherLbl, AliDielectronSignalMC::kDirect); - const Double_t lxyMC = ( (motherMC->Xv() - mcVtx->GetX()) * motherMC->Px() + - (motherMC->Yv() - mcVtx->GetY()) * motherMC->Py() ) / motherMC->Pt(); + const Double_t lxyMC = ( (motherMC->Xv() - vtxX) * motherMC->Px() + + (motherMC->Yv() - vtxY) * motherMC->Py() ) / motherMC->Pt(); const Double_t pseudoMC = lxyMC * (TDatabasePDG::Instance()->GetParticle(443)->Mass())/motherMC->Pt(); values[AliDielectronVarManager::kPseudoProperTimeResolution] = values[AliDielectronVarManager::kPseudoProperTime] - pseudoMC; if (errPseudoProperTime2 > 0) @@ -1386,21 +1520,43 @@ inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPa } } - values[AliDielectronVarManager::kTRDpidEffPair] = 0.; - if (fgTRDpidEff[0][0]){ - Double_t valuesLeg1[AliDielectronVarManager::kNMaxValues]; - Double_t valuesLeg2[AliDielectronVarManager::kNMaxValues]; - AliVParticle* leg1 = pair->GetFirstDaughter(); - AliVParticle* leg2 = pair->GetSecondDaughter(); - if (leg1 && leg2){ - Fill(leg1, valuesLeg1); - Fill(leg2, valuesLeg2); - values[AliDielectronVarManager::kTRDpidEffPair] = valuesLeg1[AliDielectronVarManager::kTRDpidEffLeg]*valuesLeg2[AliDielectronVarManager::kTRDpidEffLeg]; - } - } + values[AliDielectronVarManager::kTRDpidEffPair] = 0.; + if (fgTRDpidEff[0][0]){ + Double_t valuesLeg1[AliDielectronVarManager::kNMaxValues]; + Double_t valuesLeg2[AliDielectronVarManager::kNMaxValues]; + AliVParticle* leg1 = pair->GetFirstDaughter(); + AliVParticle* leg2 = pair->GetSecondDaughter(); + if (leg1 && leg2){ + Fill(leg1, valuesLeg1); + Fill(leg2, valuesLeg2); + values[AliDielectronVarManager::kTRDpidEffPair] = valuesLeg1[AliDielectronVarManager::kTRDpidEffLeg]*valuesLeg2[AliDielectronVarManager::kTRDpidEffLeg]; + } + } + + }//if (mc->HasMC()) + AliVParticle* leg1 = pair->GetFirstDaughter(); + AliVParticle* leg2 = pair->GetSecondDaughter(); + if (leg1) + values[AliDielectronVarManager::kMomAsymDau1] = (values[AliDielectronVarManager::kP] != 0)? leg1->P() / values[AliDielectronVarManager::kP]: 0; + else + values[AliDielectronVarManager::kMomAsymDau1] = -9999.; + if (leg2) + values[AliDielectronVarManager::kMomAsymDau2] = (values[AliDielectronVarManager::kP] != 0)? leg2->P() / values[AliDielectronVarManager::kP]: 0; + else + values[AliDielectronVarManager::kMomAsymDau2] = -9999.; + + Double_t valuesLeg1[AliDielectronVarManager::kNMaxValues]; + Double_t valuesLeg2[AliDielectronVarManager::kNMaxValues]; + if (leg1 && leg2 && fgEffMap) { + Fill(leg1, valuesLeg1); + Fill(leg2, valuesLeg2); + values[AliDielectronVarManager::kPairEff] = valuesLeg1[AliDielectronVarManager::kLegEff] *valuesLeg2[AliDielectronVarManager::kLegEff]; + values[AliDielectronVarManager::kOneOverPairEff] = (values[AliDielectronVarManager::kPairEff]>0.0 ? 1./values[AliDielectronVarManager::kPairEff] : 1.0); + } + values[AliDielectronVarManager::kRndmPair] = gRandom->Rndm(); } inline void AliDielectronVarManager::FillVarKFParticle(const AliKFParticle *particle, Double_t * const values) @@ -1412,6 +1568,7 @@ inline void AliDielectronVarManager::FillVarKFParticle(const AliKFParticle *part values[AliDielectronVarManager::kPy] = particle->GetPy(); values[AliDielectronVarManager::kPz] = particle->GetPz(); values[AliDielectronVarManager::kPt] = particle->GetPt(); + values[AliDielectronVarManager::kPtSq] = particle->GetPt() * particle->GetPt(); values[AliDielectronVarManager::kP] = particle->GetP(); values[AliDielectronVarManager::kXv] = particle->GetX(); @@ -1453,6 +1610,7 @@ inline void AliDielectronVarManager::FillVarKFParticle(const AliKFParticle *part values[AliDielectronVarManager::kTPCsignal] = 0; values[AliDielectronVarManager::kTOFsignal] = 0; values[AliDielectronVarManager::kTOFbeta] = 0; + values[AliDielectronVarManager::kTPCnSigmaEleRaw] = 0; values[AliDielectronVarManager::kTPCnSigmaEle] = 0; values[AliDielectronVarManager::kTPCnSigmaPio] = 0; values[AliDielectronVarManager::kTPCnSigmaMuo] = 0; @@ -1481,6 +1639,7 @@ inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Doubl if(fgCurrentRun!=event->GetRunNumber()) { if(fgVZEROCalibrationFile.Contains(".root")) InitVZEROCalibrationHistograms(event->GetRunNumber()); if(fgVZERORecenteringFile.Contains(".root")) InitVZERORecenteringHistograms(event->GetRunNumber()); + if(fgZDCRecenteringFile.Contains(".root")) InitZDCRecenteringHistograms(event->GetRunNumber()); fgCurrentRun=event->GetRunNumber(); } values[AliDielectronVarManager::kMixingBin]=0; @@ -1499,8 +1658,11 @@ inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Doubl values[AliDielectronVarManager::kNaccTrcklts] = 0; values[AliDielectronVarManager::kNaccTrcklts0916] = 0; values[AliDielectronVarManager::kNevents] = 0; //always fill bin 0; + values[AliDielectronVarManager::kRefMult] = 0; + values[AliDielectronVarManager::kRefMultTPConly] = 0; if (primVtx){ + // printf("prim vertex reco: %f \n",primVtx->GetX()); values[AliDielectronVarManager::kXvPrim] = primVtx->GetX(); values[AliDielectronVarManager::kYvPrim] = primVtx->GetY(); values[AliDielectronVarManager::kZvPrim] = primVtx->GetZ(); @@ -1508,8 +1670,17 @@ inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Doubl } // values[AliDielectronVarManager::kChi2NDF] = primVtx->GetChi2perNDF(); //this is the pair value + // online and offline trigger maps + values[AliDielectronVarManager::kTriggerInclONL] = event->GetTriggerMask(); + AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager(); + UInt_t maskOff = ((AliInputEventHandler*)man->GetInputEventHandler())->IsEventSelected(); + values[AliDielectronVarManager::kTriggerInclOFF] = maskOff; + values[AliDielectronVarManager::kTriggerExclOFF] = -1; + for(Int_t i=0; i<30; i++) { if(maskOff==BIT(i)) values[AliDielectronVarManager::kTriggerExclOFF]=i; } + values[AliDielectronVarManager::kNTrk] = event->GetNumberOfTracks(); values[AliDielectronVarManager::kNacc] = AliDielectronHelper::GetNacc(event); + values[AliDielectronVarManager::kMatchEffITSTPC] = AliDielectronHelper::GetITSTPCMatchEff(event); values[AliDielectronVarManager::kNaccTrcklts] = AliDielectronHelper::GetNaccTrcklts(event); // etaRange = 1.6 (default) values[AliDielectronVarManager::kNaccTrcklts0916] = AliDielectronHelper::GetNaccTrcklts(event,1.6)-AliDielectronHelper::GetNaccTrcklts(event,.9); // values[AliDielectronVarManager::kNaccTrcklts05] = AliDielectronHelper::GetNaccTrcklts(event, 0.5); @@ -1531,45 +1702,22 @@ inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Doubl // event plane quantities from the AliEPSelectionTask - for(Int_t ivar=AliDielectronVarManager::kv0ArpH2; ivar<=kv0ACrpH2FlowV2; ivar++) values[ivar] = 0.0; // v0 variables + for(Int_t ivar=AliDielectronVarManager::kv0ArpH2; ivar<=kv0C0v0C3DiffH2; ivar++) values[ivar] = 0.0; // v0 variables for(Int_t ivar=AliDielectronVarManager::kTPCxH2; ivar<=kTPCsub12DiffH2uc; ivar++) values[ivar] = 0.0; // tpc variables - AliEventplane *ep = new AliEventplane(); - // VZERO - Double_t qx = 0, qy = 0; - values[AliDielectronVarManager::kv0ACrpH2] = TVector2::Phi_mpi_pi(ep->CalculateVZEROEventPlane(event,10, 2, qx, qy)); - values[AliDielectronVarManager::kv0ACxH2] = qx; - values[AliDielectronVarManager::kv0ACyH2] = qy; - values[AliDielectronVarManager::kv0ACmagH2] = TMath::Sqrt(qx*qx+qy*qy); - qx = 0, qy = 0; - values[AliDielectronVarManager::kv0ArpH2] = TVector2::Phi_mpi_pi(ep->CalculateVZEROEventPlane(event, 8, 2, qx, qy)); - values[AliDielectronVarManager::kv0AxH2] = qx; - values[AliDielectronVarManager::kv0AyH2] = qy; - values[AliDielectronVarManager::kv0AmagH2] = TMath::Sqrt(qx*qx+qy*qy); - qx = 0, qy = 0; - values[AliDielectronVarManager::kv0CrpH2] = TVector2::Phi_mpi_pi(ep->CalculateVZEROEventPlane(event, 9, 2, qx, qy)); - values[AliDielectronVarManager::kv0CxH2] = qx; - values[AliDielectronVarManager::kv0CyH2] = qy; - values[AliDielectronVarManager::kv0CmagH2] = TMath::Sqrt(qx*qx+qy*qy); - qx = 0, qy = 0; - values[AliDielectronVarManager::kv0C0rpH2] = TVector2::Phi_mpi_pi(ep->CalculateVZEROEventPlane(event, 0, 0, 2, qx, qy)); qx = 0, qy = 0; - values[AliDielectronVarManager::kv0C3rpH2] = TVector2::Phi_mpi_pi(ep->CalculateVZEROEventPlane(event, 3, 3, 2, qx, qy)); qx = 0, qy = 0; - values[AliDielectronVarManager::kv0A0rpH2] = TVector2::Phi_mpi_pi(ep->CalculateVZEROEventPlane(event, 4, 4, 2, qx, qy)); qx = 0, qy = 0; - values[AliDielectronVarManager::kv0A3rpH2] = TVector2::Phi_mpi_pi(ep->CalculateVZEROEventPlane(event, 7, 7, 2, qx, qy)); qx = 0, qy = 0; - values[AliDielectronVarManager::kv0ACrpH2FlowV2] = TMath::Cos( 2*(values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kv0ACrpH2]) ); - values[AliDielectronVarManager::kv0ArpH2FlowV2] = TMath::Cos( 2*(values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kv0ArpH2]) ); - values[AliDielectronVarManager::kv0CrpH2FlowV2] = TMath::Cos( 2*(values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kv0CrpH2]) ); - - // TPC event plane quantities (uncorrected) - ep = const_cast(event)->GetEventplane(); + + // ep angle interval [todo, fill] + AliEventplane *ep = const_cast(event)->GetEventplane(); if(ep) { + + // TPC event plane quantities (uncorrected) TVector2 *qstd = ep->GetQVector(); // This is the "standard" Q-Vector for TPC TVector2 *qsub1 = ep->GetQsub1(); // random subevent plane TVector2 *qsub2 = ep->GetQsub2(); if(qstd && qsub1 && qsub2) { - values[AliDielectronVarManager::kTPCxH2uc] = qstd->X(); - values[AliDielectronVarManager::kTPCyH2uc] = qstd->Y(); - values[AliDielectronVarManager::kTPCmagH2uc] = qstd->Mod(); - values[AliDielectronVarManager::kTPCrpH2uc] = ((TMath::Abs(qstd->X())>1.0e-10) ? TMath::ATan2(qstd->Y(),qstd->X())/2.0 : 0.0); + values[AliDielectronVarManager::kTPCxH2uc] = qstd->X(); + values[AliDielectronVarManager::kTPCyH2uc] = qstd->Y(); + values[AliDielectronVarManager::kTPCmagH2uc] = qstd->Mod(); + values[AliDielectronVarManager::kTPCrpH2uc] = ((TMath::Abs(qstd->X())>1.0e-10) ? TMath::ATan2(qstd->Y(),qstd->X())/2.0 : 0.0); values[AliDielectronVarManager::kTPCsub1xH2uc] = qsub1->X(); values[AliDielectronVarManager::kTPCsub1yH2uc] = qsub1->Y(); values[AliDielectronVarManager::kTPCsub1rpH2uc] = ((TMath::Abs(qsub1->X())>1.0e-10) ? TMath::ATan2(qsub1->Y(),qsub1->X())/2.0 : 0.0); @@ -1581,15 +1729,40 @@ inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Doubl values[AliDielectronVarManager::kTPCsub2rpH2uc]) ); } - // TPC event plane quantities (corrected) - if(fgTPCEventPlane) - FillVarTPCEventPlane(fgTPCEventPlane, values); + // VZERO event plane + TVector2 qvec; + Double_t qx = 0, qy = 0; + ep->CalculateVZEROEventPlane(event,10, 2, qx, qy); qvec.Set(qx,qy); + values[AliDielectronVarManager::kv0ACrpH2] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); + values[AliDielectronVarManager::kv0ACxH2] = qvec.X(); + values[AliDielectronVarManager::kv0ACyH2] = qvec.Y(); + values[AliDielectronVarManager::kv0ACmagH2] = qvec.Mod(); + ep->CalculateVZEROEventPlane(event, 8, 2, qx, qy); qvec.Set(qx,qy); + values[AliDielectronVarManager::kv0ArpH2] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); + values[AliDielectronVarManager::kv0AxH2] = qvec.X(); + values[AliDielectronVarManager::kv0AyH2] = qvec.Y(); + values[AliDielectronVarManager::kv0AmagH2] = qvec.Mod(); + ep->CalculateVZEROEventPlane(event, 9, 2, qx, qy); qvec.Set(qx,qy); + values[AliDielectronVarManager::kv0CrpH2] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); + values[AliDielectronVarManager::kv0CxH2] = qvec.X(); + values[AliDielectronVarManager::kv0CyH2] = qvec.Y(); + values[AliDielectronVarManager::kv0CmagH2] = qvec.Mod(); + ep->CalculateVZEROEventPlane(event, 0, 0, 2, qx, qy); qvec.Set(qx,qy); + values[AliDielectronVarManager::kv0C0rpH2] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); + ep->CalculateVZEROEventPlane(event, 3, 3, 2, qx, qy); qvec.Set(qx,qy); + values[AliDielectronVarManager::kv0C3rpH2] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); + ep->CalculateVZEROEventPlane(event, 4, 4, 2, qx, qy); qvec.Set(qx,qy); + values[AliDielectronVarManager::kv0A0rpH2] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); + ep->CalculateVZEROEventPlane(event, 7, 7, 2, qx, qy); qvec.Set(qx,qy); + values[AliDielectronVarManager::kv0A3rpH2] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); } //if: eventplane // ESD VZERO information AliVVZERO* vzeroData = event->GetVZEROData(); values[AliDielectronVarManager::kMultV0A] = 0.0; values[AliDielectronVarManager::kMultV0C] = 0.0; + values[AliDielectronVarManager::kEqMultV0A] = 0.0; + values[AliDielectronVarManager::kEqMultV0C] = 0.0; values[AliDielectronVarManager::kAdcV0A] = 0.0; values[AliDielectronVarManager::kAdcV0C] = 0.0; for(Int_t i=0; i<32; ++i) { @@ -1599,6 +1772,8 @@ inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Doubl //values[AliDielectronVarManager::kVZEROchMult+32+i] = event->GetVZEROEqMultiplicity(i+32); values[AliDielectronVarManager::kMultV0A] += vzeroData->GetMultiplicityV0A(i); values[AliDielectronVarManager::kMultV0C] += vzeroData->GetMultiplicityV0C(i); + values[AliDielectronVarManager::kEqMultV0A] += event->GetVZEROEqMultiplicity(i); + values[AliDielectronVarManager::kEqMultV0C] += event->GetVZEROEqMultiplicity(i+32); //values[AliDielectronVarManager::kAdcV0A] += vzeroData->GetAdcV0A(i); //values[AliDielectronVarManager::kAdcV0C] += vzeroData->GetAdcV0C(i); } @@ -1642,7 +1817,7 @@ inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Doubl values[AliDielectronVarManager::kv0ATPCDiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0ArpH2] - values[AliDielectronVarManager::kTPCrpH2]) ); - + values[AliDielectronVarManager::kv0CTPCDiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0CrpH2] - values[AliDielectronVarManager::kTPCrpH2]) ); @@ -1667,6 +1842,18 @@ inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Doubl values[AliDielectronVarManager::kv0C0v0C3DiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0C0rpH2] - values[AliDielectronVarManager::kv0C3rpH2]) ); + Double_t ZDCqvec[3][2]; + memset(ZDCqvec, 999, sizeof(ZDCqvec)); + GetZDCRP(event, ZDCqvec); + + values[AliDielectronVarManager::kZDCArpH1] = TMath::ATan2(ZDCqvec[0][1], ZDCqvec[0][0]); + values[AliDielectronVarManager::kZDCCrpH1] = TMath::ATan2(ZDCqvec[1][1], ZDCqvec[1][0]); + values[AliDielectronVarManager::kZDCACrpH1] = TMath::ATan2(ZDCqvec[2][1], ZDCqvec[2][0]); + + + values[AliDielectronVarManager::kv0ZDCrpRes] = cos(2*(values[AliDielectronVarManager::kZDCArpH1] - values[AliDielectronVarManager::kv0ArpH2])); + values[AliDielectronVarManager::kZDCrpResH1] = cos(values[AliDielectronVarManager::kZDCArpH1] - values[AliDielectronVarManager::kZDCCrpH1]); + } @@ -1733,7 +1920,7 @@ inline void AliDielectronVarManager::FillVarESDEvent(const AliESDEvent *event, D AliDielectronHelper::GetNaccTrckltsCorrected(event,Double_t(nTrITSSA16),values[AliDielectronVarManager::kZvPrim],8); } - + inline void AliDielectronVarManager::FillVarAODEvent(const AliAODEvent *event, Double_t * const values) { // @@ -1753,24 +1940,76 @@ inline void AliDielectronVarManager::FillVarAODEvent(const AliAODEvent *event, D values[AliDielectronVarManager::kCentrality] = centralityF; values[AliDielectronVarManager::kCentralitySPD] = centralitySPD; - // nanoAODs (w/o AliCentrality branch) should have the VOM centrality stored in the header + values[AliDielectronVarManager::kRefMult] = header->GetRefMultiplicity(); // similar to Ntrk + values[AliDielectronVarManager::kRefMultTPConly] = header->GetTPConlyRefMultiplicity(); // similar to Nacc + + /////////////////////////////////////////// + //////////// NANO AODs //////////////////// + /////////////////////////////////////////// + + // (w/o AliCentrality branch), VOM centrality should be stored in the header if(!header->GetCentralityP()) values[AliDielectronVarManager::kCentrality] = header->GetCentrality(); - // nanoAODs (w/o AliEventPlane branch) should have the tpc event plane angle stored in the header - if(!header->GetEventplaneP()) - values[AliDielectronVarManager::kTPCrpH2uc] = header->GetEventplane(); + // (w/o AliEventPlane branch) tpc event plane stuff stored in the header + if(!header->GetEventplaneP()) { + + // values[AliDielectronVarManager::kNTrk] = header->GetRefMultiplicity(); // overwritten datamembers in "our" nanoAODs + // values[AliDielectronVarManager::kNacc] = header->GetRefMultiplicityPos(); // overwritten datamembers in "our" nanoAODs + + TVector2 qvec; + // TPC + qvec.Set(header->GetEventplaneQx(), header->GetEventplaneQy()); + values[AliDielectronVarManager::kTPCxH2uc] = qvec.X(); + values[AliDielectronVarManager::kTPCyH2uc] = qvec.Y(); + values[AliDielectronVarManager::kTPCmagH2uc] = qvec.Mod(); + values[AliDielectronVarManager::kTPCrpH2uc] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); + + // VZERO + AliEventplane ep2; + // get event plane corrections from the VZERO EP selection task + AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager(); + AliVZEROEPSelectionTask *eptask = dynamic_cast(man->GetTask("AliVZEROEPSelectionTask")); + if(eptask) eptask->SetEventplaneParams(&ep2,centralityF); + else printf("no VZERO event plane selection task added! \n"); + + Double_t qx = 0, qy = 0; + ep2.CalculateVZEROEventPlane(event,10, 2, qx, qy); qvec.Set(qx,qy); + values[AliDielectronVarManager::kv0ACrpH2] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); + values[AliDielectronVarManager::kv0ACxH2] = qvec.X(); + values[AliDielectronVarManager::kv0ACyH2] = qvec.Y(); + values[AliDielectronVarManager::kv0ACmagH2] = qvec.Mod(); + ep2.CalculateVZEROEventPlane(event, 8, 2, qx, qy); qvec.Set(qx,qy); + values[AliDielectronVarManager::kv0ArpH2] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); + values[AliDielectronVarManager::kv0AxH2] = qvec.X(); + values[AliDielectronVarManager::kv0AyH2] = qvec.Y(); + values[AliDielectronVarManager::kv0AmagH2] = qvec.Mod(); + ep2.CalculateVZEROEventPlane(event, 9, 2, qx, qy); qvec.Set(qx,qy); + values[AliDielectronVarManager::kv0CrpH2] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); + values[AliDielectronVarManager::kv0CxH2] = qvec.X(); + values[AliDielectronVarManager::kv0CyH2] = qvec.Y(); + values[AliDielectronVarManager::kv0CmagH2] = qvec.Mod(); + ep2.CalculateVZEROEventPlane(event, 0, 0, 2, qx, qy); qvec.Set(qx,qy); + values[AliDielectronVarManager::kv0C0rpH2] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); + ep2.CalculateVZEROEventPlane(event, 3, 3, 2, qx, qy); qvec.Set(qx,qy); + values[AliDielectronVarManager::kv0C3rpH2] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); + ep2.CalculateVZEROEventPlane(event, 4, 4, 2, qx, qy); qvec.Set(qx,qy); + values[AliDielectronVarManager::kv0A0rpH2] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); + ep2.CalculateVZEROEventPlane(event, 7, 7, 2, qx, qy); qvec.Set(qx,qy); + values[AliDielectronVarManager::kv0A3rpH2] = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0); + + } + + const AliAODVertex *vtxtpc = GetVertex(event, AliAODVertex::kMainTPC); + values[AliDielectronVarManager::kNVtxContribTPC] = (vtxtpc ? vtxtpc->GetNContributors() : 0); - const AliAODVertex *vtxTPC = event->GetVertex(AliAODVertex::kMainTPC); - values[AliDielectronVarManager::kNVtxContribTPC] = (vtxTPC ? vtxTPC->GetNContributors() : 0); - //const AliAODVertex *primVtx = event->GetPrimaryVertex(); } inline void AliDielectronVarManager::FillVarMCEvent(const AliMCEvent *event, Double_t * const values) -{ +{ // // Fill event information available for histogramming into an array - // - + // + // Fill common AliVEvent interface information // FillVarVEvent(event, values); const AliVVertex* vtx = event->GetPrimaryVertex(); @@ -1796,13 +2035,36 @@ inline void AliDielectronVarManager::FillVarTPCEventPlane(const AliEventplane *e TVector2 *qcorr = const_cast(evplane)->GetQVector(); // This is the "corrected" Q-Vector TVector2 *qcsub1 = const_cast(evplane)->GetQsub1(); TVector2 *qcsub2 = const_cast(evplane)->GetQsub2(); - if(qcorr && qcsub1 && qcsub2) { - + if(qcorr) { values[AliDielectronVarManager::kTPCxH2] = qcorr->X(); values[AliDielectronVarManager::kTPCyH2] = qcorr->Y(); values[AliDielectronVarManager::kTPCmagH2] = qcorr->Mod(); values[AliDielectronVarManager::kTPCrpH2] = ((TMath::Abs(qcorr->X())>1.0e-10) ? TMath::ATan2(qcorr->Y(),qcorr->X())/2.0 : 0.0); - + // detector effects + values[AliDielectronVarManager::kCosTPCrpH2] = TMath::Cos( 2.* values[AliDielectronVarManager::kTPCrpH2] ); + values[AliDielectronVarManager::kSinTPCrpH2] = TMath::Sin( 2.* values[AliDielectronVarManager::kTPCrpH2] ); + + // correlations for event plane resoultion + values[AliDielectronVarManager::kv0ATPCDiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0ArpH2] - + values[AliDielectronVarManager::kTPCrpH2]) ); + values[AliDielectronVarManager::kv0CTPCDiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0CrpH2] - + values[AliDielectronVarManager::kTPCrpH2]) ); + values[AliDielectronVarManager::kv0Av0CDiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0ArpH2] - + values[AliDielectronVarManager::kv0CrpH2]) ); + values[AliDielectronVarManager::kv0Av0C0DiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0ArpH2] - + values[AliDielectronVarManager::kv0C0rpH2]) ); + values[AliDielectronVarManager::kv0Av0C3DiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0ArpH2] - + values[AliDielectronVarManager::kv0C3rpH2]) ); + values[AliDielectronVarManager::kv0Cv0A0DiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0CrpH2] - + values[AliDielectronVarManager::kv0A0rpH2]) ); + values[AliDielectronVarManager::kv0Cv0A3DiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0CrpH2] - + values[AliDielectronVarManager::kv0A3rpH2]) ); + values[AliDielectronVarManager::kv0A0v0A3DiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0A0rpH2] - + values[AliDielectronVarManager::kv0A3rpH2]) ); + values[AliDielectronVarManager::kv0C0v0C3DiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0C0rpH2] - + values[AliDielectronVarManager::kv0C3rpH2]) ); + } + if(qcsub1 && qcsub2) { values[AliDielectronVarManager::kTPCsub1xH2] = qcsub1->X(); values[AliDielectronVarManager::kTPCsub1yH2] = qcsub1->Y(); values[AliDielectronVarManager::kTPCsub1rpH2] = ((TMath::Abs(qcsub1->X())>1.0e-10) ? TMath::ATan2(qcsub1->Y(),qcsub1->X())/2.0 : 0.0); @@ -1939,7 +2201,9 @@ inline void AliDielectronVarManager::InitTRDpidEffHistograms(const Char_t* filen TObjArray* arr = name.Tokenize("_"); Bool_t isBplus = kTRUE; if(name.Contains("BMINUS")) isBplus = kFALSE; - TString centMinStr = arr->At(2)->GetName(); TString centMaxStr = arr->At(3)->GetName(); + TString centMinStr = arr->At(2)->GetName(); + TString centMaxStr = arr->At(3)->GetName(); + delete arr; if(isBplus) { fgTRDpidEffCentRanges[idxp][2] = centMinStr.Atof(); fgTRDpidEffCentRanges[idxp][3] = centMaxStr.Atof(); @@ -1955,6 +2219,27 @@ inline void AliDielectronVarManager::InitTRDpidEffHistograms(const Char_t* filen } } +inline Double_t AliDielectronVarManager::GetSingleLegEff(Double_t * const values) { + // + // get the single leg efficiency for a given particle + // + if(!fgEffMap) return -1.; + + Int_t dim=fgEffMap->GetNdimensions(); + Int_t idx[dim]; + for(Int_t idim=0; idimGetAxis(idim)->GetName()); + idx[idim] = fgEffMap->GetAxis(idim)->FindBin(values[var]); + /* if(idx[idim] < 0 || idx[idim]>fgEffMap->GetAxis(idim)->GetNbins()) */ + /* printf(" [E] AliDielectronVarManager::GetSingleLegEff values %f for %s not found in axis range \n",values[var],fgEffMap->GetAxis(idim)->GetName()); */ + // printf(" (%d,%f,%s) \t",idx[idim],values[var],fgEffMap->GetAxis(idim)->GetName()); + } + // printf(" bin content %f+-%f \n",fgEffMap->GetBinContent(idx), fgEffMap->GetBinError(idx)); + if(fgEffMap->GetBinContent(idx)<0.01) return 0.0; + // if(fgEffMap->GetBinError(idx)/fgEffMap->GetBinContent(idx)>0.2) return 0.0; + return (fgEffMap->GetBinContent(idx)); +} + inline void AliDielectronVarManager::InitVZEROCalibrationHistograms(Int_t runNo) { // @@ -2009,6 +2294,38 @@ inline void AliDielectronVarManager::InitVZERORecenteringHistograms(Int_t runNo) } +inline void AliDielectronVarManager::InitZDCRecenteringHistograms(Int_t runNo) { + + //initialize only once + if(fgZDCRecentering[0][0]) return; + + for(Int_t i=0; i<2; ++i) + for(Int_t j=0; j<2; ++j) + if(fgZDCRecentering[i][j]) { + delete fgZDCRecentering[i][j]; + fgZDCRecentering[i][j] = 0x0; + } + + TFile file(fgZDCRecenteringFile.Data()); + if (!file.IsOpen()) return; + + fgZDCRecentering[0][0] = (TProfile3D*)file.Get(Form("RUN%06d_QxA_Recent", runNo)); + fgZDCRecentering[0][1] = (TProfile3D*)file.Get(Form("RUN%06d_QyA_Recent", runNo)); + fgZDCRecentering[1][0] = (TProfile3D*)file.Get(Form("RUN%06d_QxC_Recent", runNo)); + fgZDCRecentering[1][1] = (TProfile3D*)file.Get(Form("RUN%06d_QyC_Recent", runNo)); + fgZDCRecentering[2][0] = (TProfile3D*)file.Get(Form("RUN%06d_QxAC_Recent", runNo)); + fgZDCRecentering[2][1] = (TProfile3D*)file.Get(Form("RUN%06d_QyAC_Recent", runNo)); + + + if (fgZDCRecentering[0][0]) fgZDCRecentering[0][0]->SetDirectory(0x0); + if (fgZDCRecentering[0][1]) fgZDCRecentering[0][1]->SetDirectory(0x0); + if (fgZDCRecentering[1][0]) fgZDCRecentering[1][0]->SetDirectory(0x0); + if (fgZDCRecentering[1][1]) fgZDCRecentering[1][1]->SetDirectory(0x0); + if (fgZDCRecentering[2][0]) fgZDCRecentering[2][0]->SetDirectory(0x0); + if (fgZDCRecentering[2][1]) fgZDCRecentering[2][1]->SetDirectory(0x0); + +} + inline Double_t AliDielectronVarManager::GetTRDpidEfficiency(Int_t runNo, Double_t centrality, Double_t eta, Double_t trdPhi, Double_t pout, @@ -2119,6 +2436,7 @@ inline void AliDielectronVarManager::SetTPCEventPlane(AliEventplane *const evpla { fgTPCEventPlane = evplane; + FillVarTPCEventPlane(evplane,fgData); // for (Int_t i=0; i1.0e-10) qvec[2] = TMath::ATan2(qvec[1],qvec[0])/2.0; } +inline void AliDielectronVarManager::GetZDCRP(const AliVEvent* event, Double_t qvec[][2]) { + + // + // Get the reaction plane from the ZDC detector for first harmonic + // + // Q{x,y} = SUM{ri(x,y)*Ei} / SUM{Ei} + // + + const Int_t nZDCSides = 2; + const Int_t nZDCplanes = 3; + const Int_t Aside = 0, Cside = 1, ACside = 2; + const Int_t nZDCTowers = 4;// number of ZDCtowers + const Double_t ZDCTowerCenters[nZDCTowers][2] = { {-1.75, -1.75}, { 1.75, -1.75}, + {-1.75, 1.75}, { 1.75, 1.75} }; + + Double_t *ZDCTEnergy[nZDCSides]; //reco E in 5 ZDC sectors - high gain chain + Double_t qvecNUM[nZDCplanes][2]; + Double_t qvecDEN[nZDCplanes]; + memset( qvecNUM, 0, sizeof(qvecNUM)); //format + memset(qvecDEN, 0, sizeof(qvecDEN)); //format + + Double_t TPCRefMulti = 999, vtxX = 999, vtxY = 999; + Int_t multiBin = 0, vtxXBin = 0, vtxYBin = 0; + Double_t recentdim[3][3] = { { 50, 0, 2500}, //multiplicity nbin, min, max + { 20, 0.04, 0.08}, // vertex x nbin, min, max + { 20, 0.25, 0.29} }; // vertex y nbin, min, max + + if(!event->GetZDCData()) return; + AliVZDC* aliZDC = event->GetZDCData(); + ZDCTEnergy[Aside] = (Double_t *)aliZDC -> GetZNATowerEnergy(); + ZDCTEnergy[Cside] = (Double_t *)aliZDC -> GetZNCTowerEnergy(); + + for(int j = 0; j < nZDCSides ; j++){ + for(int k = 0; k < nZDCTowers ; k++){ + qvecNUM[j][0] += ZDCTowerCenters[k][0]*ZDCTEnergy[j][k+1]; // zdcQ += xE + qvecNUM[j][1] += ZDCTowerCenters[k][1]*ZDCTEnergy[j][k+1]; // zdcQ += yE + qvecDEN[j] += ZDCTEnergy[j][k+1]; // zdcQsum += E + + } + if(j == Aside){ + qvecNUM[j][0] = -qvecNUM[j][0]; + } + + if(j == Cside){ + qvecNUM[j][0] = -qvecNUM[j][0]; + qvecNUM[j][1] = -qvecNUM[j][1]; + } + + + qvecNUM[ACside][0] += qvecNUM[j][0]; + qvecNUM[ACside][1] += qvecNUM[j][1]; + qvecDEN[ACside] += qvecDEN[j]; + + } + + for(int j = 0; j < nZDCplanes; j++){ + if(qvecDEN[j] != 0){ + qvec[j][0] = (qvecNUM[j][0] / qvecDEN[j]); + qvec[j][1] = (qvecNUM[j][1] / qvecDEN[j]); + } + else if(qvecDEN[j] == 0) { + qvec[j][0] = 999; + qvec[j][1] = 999; + } + + } + + if(fgZDCRecentering[0][0]){ + const AliAODEvent* aodEv = static_cast(event); + AliAODHeader *header = aodEv->GetHeader(); + if(!header) return; + TPCRefMulti = header -> GetTPConlyRefMultiplicity(); + + const AliVVertex *primVtx = event->GetPrimaryVertex(); + if(!primVtx) return; + vtxX = primVtx->GetX(); + vtxY = primVtx->GetY(); + + multiBin = (Int_t)((TPCRefMulti-recentdim[0][1])*recentdim[0][0] / (recentdim[0][2] - recentdim[0][1])) + 1; + vtxXBin = (Int_t)((vtxX-recentdim[1][1])*recentdim[1][0] / (recentdim[1][2] - recentdim[1][1])) + 1; + vtxYBin = (Int_t)((vtxY-recentdim[2][1])*recentdim[2][0] / (recentdim[2][2] - recentdim[2][1])) + 1; + + for(int j = 0; j < nZDCplanes; j++) + if(qvecDEN[j] != 0){ + qvec[j][0] -= fgZDCRecentering[j][0] -> GetBinContent(multiBin, vtxXBin, vtxYBin); + qvec[j][1] -= fgZDCRecentering[j][1] -> GetBinContent(multiBin, vtxXBin, vtxYBin); + } + } + +} + +//______________________________________________________________________________ +inline AliAODVertex* AliDielectronVarManager::GetVertex(const AliAODEvent* event, AliAODVertex::AODVtx_t vtype) { + // Get vertex + Int_t nVertices=event->GetNumberOfVertices(); + for(Int_t iVert=0; iVertGetVertex(iVert); + // printf(" vtx %d contrib %d daughters %d \n ",v->GetType(),v->GetNContributors(), v->GetNDaughters()); + if(v->GetType()==vtype) return v; + } + return 0; +} /* inline void AliDielectronVarManager::FillValues(const TParticle *particle, Double_t *values)