#include <TNamed.h>
#include <TProfile.h>
#include <TProfile2D.h>
+#include <TProfile3D.h>
#include <TH3D.h>
+#include <THnBase.h>
#include <TFile.h>
#include <TDatabasePDG.h>
#include <TKey.h>
#include <TBits.h>
+#include <TRandom3.h>
#include <AliVEvent.h>
#include <AliESDEvent.h>
#include "AliDielectronPID.h"
#include "AliDielectronHelper.h"
+#include "AliAnalysisManager.h"
+#include "AliInputEventHandler.h"
+#include "AliVZEROEPSelectionTask.h"
+
+#include "AliAODMCHeader.h"
+
class AliVEvent;
//________________________________________________________________
kPy, // py
kPz, // pz
kPt, // transverse momentum
+ kPtSq, // transverse momentum squared
kP, // momentum
kXv, // vertex position in x
kYv, // vertex position in y
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
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
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
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
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
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
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
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,
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)
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
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
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,
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);
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;}
static const char* fgkParticleNames[kNMaxValues][3]; //variable names
- static void FillVarVParticle(const AliVParticle *particle, Double_t * const values);
+
static void FillVarESDtrack(const AliESDtrack *particle, Double_t * const values);
static void FillVarAODTrack(const AliAODTrack *particle, Double_t * const values);
static void FillVarMCParticle(const AliMCParticle *particle, Double_t * const values);
static void InitVZEROCalibrationHistograms(Int_t runNo);
static void InitVZERORecenteringHistograms(Int_t runNo);
-
+ static void InitZDCRecenteringHistograms(Int_t runNo);
+
static AliPIDResponse *fgPIDResponse; // PID response object
static AliVEvent *fgEvent; // current event pointer
- static AliEventplane *fgTPCEventPlane; // current event plane pointer
+ static AliEventplane *fgTPCEventPlane; // current event tpc plane pointer
static AliKFVertex *fgKFVertex; // kf vertex
static TProfile *fgMultEstimatorAvg[4][9]; // multiplicity estimator averages (4 periods x 9 estimators)
static Double_t fgTRDpidEffCentRanges[10][4]; // centrality ranges for the TRD pid efficiency histograms
static TH3D *fgTRDpidEff[10][4]; // TRD pid efficiencies from conversion electrons
+ static THnBase *fgEffMap; // single electron efficiencies
static TString fgVZEROCalibrationFile; // file with VZERO channel-by-channel calibrations
static TString fgVZERORecenteringFile; // file with VZERO Q-vector averages needed for event plane recentering
static TProfile2D *fgVZEROCalib[64]; // 1 histogram per VZERO channel
static TProfile2D *fgVZERORecentering[2][2]; // 2 VZERO sides x 2 Q-vector components
static Int_t fgCurrentRun; // current run number
+ static TString fgZDCRecenteringFile; // file with ZDC Q-vector averages needed for event plane recentering
+ static TProfile3D *fgZDCRecentering[3][2]; // 2 VZERO sides x 2 Q-vector components
+
static Double_t fgData[kNMaxValues]; //! data
AliDielectronVarManager(const AliDielectronVarManager &c);
values[AliDielectronVarManager::kPy] = particle->Py();
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();
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;
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];
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);
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());
}
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();
values[AliDielectronVarManager::kTOFsignal]=0;
//values[AliDielectronVarManager::kTOFbeta]=0;
+ values[AliDielectronVarManager::kTPCnSigmaEleRaw]=0;
values[AliDielectronVarManager::kTPCnSigmaEle]=0;
values[AliDielectronVarManager::kTPCnSigmaPio]=0;
values[AliDielectronVarManager::kTPCnSigmaMuo]=0;
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) {
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
}
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);
}
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)
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;
// 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);
}
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;
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();
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
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]*
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;
// 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)
// 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
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();
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();
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];
// 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();
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()){
// 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)
}
}
- 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)
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();
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;
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;
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();
}
// 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);
// 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 ep2;
- // VZERO
- Double_t qx = 0, qy = 0;
- values[AliDielectronVarManager::kv0ACrpH2] = TVector2::Phi_mpi_pi(ep2.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(ep2.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(ep2.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(ep2.CalculateVZEROEventPlane(event, 0, 0, 2, qx, qy)); qx = 0, qy = 0;
- values[AliDielectronVarManager::kv0C3rpH2] = TVector2::Phi_mpi_pi(ep2.CalculateVZEROEventPlane(event, 3, 3, 2, qx, qy)); qx = 0, qy = 0;
- values[AliDielectronVarManager::kv0A0rpH2] = TVector2::Phi_mpi_pi(ep2.CalculateVZEROEventPlane(event, 4, 4, 2, qx, qy)); qx = 0, qy = 0;
- values[AliDielectronVarManager::kv0A3rpH2] = TVector2::Phi_mpi_pi(ep2.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 angle interval [todo, fill]
AliEventplane *ep = const_cast<AliVEvent*>(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);
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) {
//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);
}
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::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]);
+
}
AliDielectronHelper::GetNaccTrckltsCorrected(event,Double_t(nTrITSSA16),values[AliDielectronVarManager::kZvPrim],8);
}
-
+
inline void AliDielectronVarManager::FillVarAODEvent(const AliAODEvent *event, Double_t * const values)
{
//
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<AliVZEROEPSelectionTask *>(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 *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();
TVector2 *qcorr = const_cast<AliEventplane *>(evplane)->GetQVector(); // This is the "corrected" Q-Vector
TVector2 *qcsub1 = const_cast<AliEventplane *>(evplane)->GetQsub1();
TVector2 *qcsub2 = const_cast<AliEventplane *>(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);
}
}
+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; idim<dim; idim++) {
+ UInt_t var = GetValueType(fgEffMap->GetAxis(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) {
//
}
+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,
{
fgTPCEventPlane = evplane;
+ FillVarTPCEventPlane(evplane,fgData);
// for (Int_t i=0; i<AliDielectronVarManager::kNMaxValues;++i) fgData[i]=0.;
// AliDielectronVarManager::Fill(fgEvent, fgData);
}
if(TMath::Abs(qvec[0])>1.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<const AliAODEvent*>(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) {