#include <TNamed.h>
#include <TProfile.h>
#include <TProfile2D.h>
+#include <TProfile3D.h>
#include <TH3D.h>
#include <THnBase.h>
+#include <TSpline.h>
#include <TFile.h>
#include <TDatabasePDG.h>
#include <TKey.h>
#include <AliAODpidUtil.h>
#include <AliPID.h>
#include <AliPIDResponse.h>
+#include <AliESDtrackCuts.h>
#include "AliDielectronPair.h"
#include "AliDielectronMC.h"
kTPCchi2Cl, // chi2/cl in TPC
kTPCclsDiff, // TPC cluster difference
kTPCclsSegments, // TPC cluster segments
+ kTPCclsIRO, // TPC clusters inner read out
+ kTPCclsORO, // TPC clusters outer read out
kTrackStatus, // track status bits
kFilterBit, // AOD filter bits
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
kMomAsymDau2, // momentum fraction of daughter2
kPairEff, // pair efficiency
kOneOverPairEff, // 1 / pair efficiency (correction factor)
+ kOneOverPairEffSq, // 1 / pair efficiency squared (correction factor)
kRndmPair, // radomly created number (used to apply special signal reduction cuts)
kPairs, // number of Ev1PM pair candidates after all cuts
kPairMax, //
kMultV0A, // VZERO multiplicity and ADC amplitudes
kMultV0C,
kMultV0,
+ kEqMultV0A, // equalized VZERO multiplicity
+ kEqMultV0C,
+ kEqMultV0,
kAdcV0A,
kAdcV0C,
kAdcV0,
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, // track after all cuts
kNVtxContrib, // number of primary vertex contibutors
static void InitAODpidUtil(Int_t type=0);
static void InitEstimatorAvg(const Char_t* filename);
static void InitTRDpidEffHistograms(const Char_t* filename);
- static void InitEffMap(const Char_t* filename);
+ static void SetLegEffMap( TObject *map) { fgLegEffMap=map; }
+ static void SetPairEffMap(TObject *map) { fgPairEffMap=map; }
+ static void SetFillMap( TBits *map) { fgFillMap=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 Double_t GetPairEff(Double_t * const values);
static const AliKFVertex* GetKFVertex() {return fgKFVertex;}
static const char* fgkParticleNames[kNMaxValues][3]; //variable names
-
+ static Bool_t Req(ValueTypes var) { return (fgFillMap ? fgFillMap->TestBitNumber(var) : kTRUE); }
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 tpc plane pointer
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 TObject *fgLegEffMap; // single electron efficiencies
+ static TObject *fgPairEffMap; // pair efficiencies
+ static TBits *fgFillMap; // map for requested variable filling
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::kTRDsignal] = particle->GetTRDsignal();
values[AliDielectronVarManager::kTPCclsDiff] = tpcSignalN-tpcNcls;
values[AliDielectronVarManager::kTPCclsSegments] = 0.0;
- const UChar_t threshold = 5;
+ UChar_t threshold = 5;
TBits tpcClusterMap = particle->GetTPCClusterMap();
UChar_t n=0; UChar_t j=0;
for(UChar_t i=0; i<8; ++i) {
for(j=i*20; j<(i+1)*20 && j<159; ++j) n+=tpcClusterMap.TestBitNumber(j);
if(n>=threshold) values[AliDielectronVarManager::kTPCclsSegments] += 1.0;
}
+
+ n=0;
+ threshold=0;
+ values[AliDielectronVarManager::kTPCclsIRO]=0.;
+ for(j=0; j<63; ++j) n+=tpcClusterMap.TestBitNumber(j);
+ if(n>=threshold) values[AliDielectronVarManager::kTPCclsIRO] = n;
+ n=0;
+ threshold=0;
+ values[AliDielectronVarManager::kTPCclsORO]=0.;
+ for(j=63; j<159; ++j) n+=tpcClusterMap.TestBitNumber(j);
+ if(n>=threshold) values[AliDielectronVarManager::kTPCclsORO] = n;
+
+
values[AliDielectronVarManager::kTrackStatus] = (Double_t)particle->GetStatus();
values[AliDielectronVarManager::kFilterBit] = 0;
//Replace with method as soon as available
TBits tpcSharedMap = particle->GetTPCSharedMap();
Double_t tpcNclsS= tpcSharedMap.CountBits(0)-tpcSharedMap.CountBits(159);
- Double_t tpcClusFindable=particle->GetTPCNclsF();
// Reset AliESDtrack interface specific information
- values[AliDielectronVarManager::kNclsITS] = particle->GetITSNcls();
- values[AliDielectronVarManager::kITSchi2Cl] = -1;
- values[AliDielectronVarManager::kNclsTPC] = tpcNcls;
- values[AliDielectronVarManager::kNclsSTPC] = tpcNclsS;
- values[AliDielectronVarManager::kNclsSFracTPC] = tpcNcls>0?tpcNclsS/tpcNcls:0;
- values[AliDielectronVarManager::kNclsTPCiter1] = tpcNcls; // not really available in AOD
- values[AliDielectronVarManager::kNFclsTPC] = tpcClusFindable;
- values[AliDielectronVarManager::kNFclsTPCr] = particle->GetTPCClusterInfo(2,1);
- values[AliDielectronVarManager::kNFclsTPCrFrac] = particle->GetTPCClusterInfo(2);
- values[AliDielectronVarManager::kNFclsTPCfCross]= (tpcClusFindable>0)?(particle->GetTPCClusterInfo(2,1)/tpcClusFindable):0;
- values[AliDielectronVarManager::kNclsTRD] = 0;
- 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;
+ if(Req(kNclsITS)) values[AliDielectronVarManager::kNclsITS] = particle->GetITSNcls();
+ if(Req(kITSchi2Cl)) values[AliDielectronVarManager::kITSchi2Cl] = -1;
+ if(Req(kNclsTPC)) values[AliDielectronVarManager::kNclsTPC] = tpcNcls;
+ if(Req(kNclsSTPC)) values[AliDielectronVarManager::kNclsSTPC] = tpcNclsS;
+ if(Req(kNclsSFracTPC)) values[AliDielectronVarManager::kNclsSFracTPC] = tpcNcls>0?tpcNclsS/tpcNcls:0;
+ if(Req(kNclsTPCiter1)) values[AliDielectronVarManager::kNclsTPCiter1] = tpcNcls; // not really available in AOD
+ if(Req(kNFclsTPC) || Req(kNFclsTPCfCross)) values[AliDielectronVarManager::kNFclsTPC] = particle->GetTPCNclsF();
+ if(Req(kNFclsTPCr) || Req(kNFclsTPCfCross)) values[AliDielectronVarManager::kNFclsTPCr] = particle->GetTPCClusterInfo(2,1);
+ if(Req(kNFclsTPCrFrac)) values[AliDielectronVarManager::kNFclsTPCrFrac] = particle->GetTPCClusterInfo(2);
+ if(Req(kNFclsTPCfCross)) values[AliDielectronVarManager::kNFclsTPCfCross]= (values[kNFclsTPC]>0)?(values[kNFclsTPCr]/values[kNFclsTPC]):0;
+ if(Req(kNclsTRD)) values[AliDielectronVarManager::kNclsTRD] = 0;
+ if(Req(kTRDntracklets)) values[AliDielectronVarManager::kTRDntracklets] = 0;
+ if(Req(kTRDpidQuality)) values[AliDielectronVarManager::kTRDpidQuality] = particle->GetTRDntrackletsPID();
+ if(Req(kTRDchi2)) values[AliDielectronVarManager::kTRDchi2] = (particle->GetTRDntrackletsPID()!=0.?particle->GetTRDchi2():-1);
+ if(Req(kTRDsignal)) values[AliDielectronVarManager::kTRDsignal] = particle->GetTRDsignal();
+
+
TBits tpcClusterMap = particle->GetTPCClusterMap();
UChar_t n=0; UChar_t j=0;
- for(UChar_t i=0; i<8; ++i) {
+ UChar_t threshold = 5;
+
+ values[AliDielectronVarManager::kTPCclsSegments] = 0.0;
+ if(Req(kTPCclsSegments)) {
+ for(UChar_t i=0; i<8; ++i) {
+ n=0;
+ for(j=i*20; j<(i+1)*20 && j<159; ++j) n+=tpcClusterMap.TestBitNumber(j);
+ if(n>=threshold) values[AliDielectronVarManager::kTPCclsSegments] += 1.0;
+ }
+ }
+
+ values[AliDielectronVarManager::kTPCclsIRO]=0.;
+ if(Req(kTPCclsIRO)) {
n=0;
- for(j=i*20; j<(i+1)*20 && j<159; ++j) n+=tpcClusterMap.TestBitNumber(j);
- if(n>=threshold) values[AliDielectronVarManager::kTPCclsSegments] += 1.0;
+ threshold=0;
+ for(j=0; j<63; ++j) n+=tpcClusterMap.TestBitNumber(j);
+ if(n>=threshold) values[AliDielectronVarManager::kTPCclsIRO] = n;
}
- values[AliDielectronVarManager::kTPCchi2Cl] = (tpcNcls>0)?particle->Chi2perNDF()*(tpcNcls-5)/tpcNcls:-1.; // it is stored as normalized to tpcNcls-5 (see AliAnalysisTaskESDfilter)
- values[AliDielectronVarManager::kTrackStatus] = (Double_t)particle->GetStatus();
- values[AliDielectronVarManager::kFilterBit] = (Double_t)particle->GetFilterMap();
+ values[AliDielectronVarManager::kTPCclsORO]=0.;
+ if(Req(kTPCclsORO)) {
+ n=0;
+ threshold=0;
+ for(j=63; j<159; ++j) n+=tpcClusterMap.TestBitNumber(j);
+ if(n>=threshold) values[AliDielectronVarManager::kTPCclsORO] = n;
+ }
+
+ // it is stored as normalized to tpcNcls-5 (see AliAnalysisTaskESDfilter)
+ if(Req(kTPCchi2Cl)) values[AliDielectronVarManager::kTPCchi2Cl] = (tpcNcls>0)?particle->Chi2perNDF()*(tpcNcls-5)/tpcNcls:-1.;
+ if(Req(kTrackStatus)) values[AliDielectronVarManager::kTrackStatus] = (Double_t)particle->GetStatus();
+ if(Req(kFilterBit)) values[AliDielectronVarManager::kFilterBit] = (Double_t)particle->GetFilterMap();
//TRD pidProbs
- //TODO: set correctly
values[AliDielectronVarManager::kTRDprobEle] = 0;
values[AliDielectronVarManager::kTRDprobPio] = 0;
//
Int_t v0Index=-1;
Int_t kinkIndex=-1;
- if (particle->GetProdVertex()) {
+ if( (Req(kV0Index0) || Req(kKinkIndex0)) && particle->GetProdVertex()) {
v0Index = particle->GetProdVertex()->GetType()==AliAODVertex::kV0 ? 1 : 0;
kinkIndex = particle->GetProdVertex()->GetType()==AliAODVertex::kKink ? 1 : 0;
}
values[AliDielectronVarManager::kV0Index0] = v0Index;
values[AliDielectronVarManager::kKinkIndex0] = kinkIndex;
- Double_t d0z0[2];
- GetDCA(particle, d0z0);
+ Double_t d0z0[2]={-999.0,-999.0};
+ if(Req(kImpactParXY) || Req(kImpactParZ)) GetDCA(particle, d0z0);
values[AliDielectronVarManager::kImpactParXY] = d0z0[0];
values[AliDielectronVarManager::kImpactParZ] = d0z0[1];
values[AliDielectronVarManager::kTPCclsDiff] = -999.;
values[AliDielectronVarManager::kTOFsignal]=0;
- //values[AliDielectronVarManager::kTOFbeta]=0;
+ values[AliDielectronVarManager::kTOFbeta]=0;
values[AliDielectronVarManager::kTPCnSigmaEleRaw]=0;
values[AliDielectronVarManager::kTPCnSigmaEle]=0;
values[AliDielectronVarManager::kTOFnSigmaKao]=0;
values[AliDielectronVarManager::kTOFnSigmaPro]=0;
- values[AliDielectronVarManager::kITSclusterMap] = particle->GetITSClusterMap();
- values[AliDielectronVarManager::kITSLayerFirstCls] = -1.;
+ if(Req(kITSsignal)) values[AliDielectronVarManager::kITSsignal] = particle->GetITSsignal();
+ if(Req(kITSclusterMap)) values[AliDielectronVarManager::kITSclusterMap] = particle->GetITSClusterMap();
+ if(Req(kITSLayerFirstCls)) values[AliDielectronVarManager::kITSLayerFirstCls] = -1.;
for (Int_t iC=0; iC<6; iC++) {
if (((particle->GetITSClusterMap()) & (1<<(iC))) > 0) {
- values[AliDielectronVarManager::kITSLayerFirstCls] = iC;
+ if(Req(kITSLayerFirstCls)) values[AliDielectronVarManager::kITSLayerFirstCls] = iC;
break;
}
}
Double_t origdEdx=pid->GetTPCsignal();
//overwrite signal
pid->SetTPCsignal(origdEdx/AliDielectronPID::GetEtaCorr(particle)/AliDielectronPID::GetCorrValdEdx());
-
- Double_t mom =pid->GetTPCmomentum();
- Double_t tpcSignalN=pid->GetTPCsignalN();
+
+ Double_t tpcSignalN=0.0;
+ if(Req(kTPCsignalN) || Req(kTPCsignalNfrac) || Req(kTPCclsDiff)) tpcSignalN = pid->GetTPCsignalN();
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)-AliDielectronPID::GetCntrdCorr(particle))/AliDielectronPID::GetWdthCorr(particle);
- 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::kTPCnSigmaEleRaw]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kElectron);
- 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] = prob[AliPID::kElectron];
- values[AliDielectronVarManager::kTRDprob2DPio] = prob[AliPID::kPion];
- values[AliDielectronVarManager::kTOFsignal]=pid->GetTOFsignal();
- Double32_t expt[5];
- particle->GetIntegratedTimes(expt); // ps
- Double_t l = TMath::C()* expt[0]*1e-12; // m
- Double_t t = pid->GetTOFsignal(); // ps start time subtracted (until v5-02-Rev09)
- AliTOFHeader* tofH=0x0; // from v5-02-Rev10 on subtract the start time
- if(fgEvent) tofH = (AliTOFHeader*)fgEvent->GetTOFHeader();
- if(tofH) t -= fgPIDResponse->GetTOFResponse().GetStartTime(particle->P()); // ps
+ values[AliDielectronVarManager::kPIn] = pid->GetTPCmomentum();
+ if(Req(kTPCsignal)) values[AliDielectronVarManager::kTPCsignal] = pid->GetTPCsignal();
+ if(Req(kTOFsignal)) values[AliDielectronVarManager::kTOFsignal] = pid->GetTOFsignal();
+ if(Req(kTOFmismProb)) values[AliDielectronVarManager::kTOFmismProb] = fgPIDResponse->GetTOFMismatchProbability(particle);
+
+ // TOF beta calculation
+ if(Req(kTOFbeta)) {
+ Double32_t expt[5];
+ particle->GetIntegratedTimes(expt); // ps
+ Double_t l = TMath::C()* expt[0]*1e-12; // m
+ Double_t t = pid->GetTOFsignal(); // ps start time subtracted (until v5-02-Rev09)
+ AliTOFHeader* tofH=0x0; // from v5-02-Rev10 on subtract the start time
+ if(fgEvent) tofH = (AliTOFHeader*)fgEvent->GetTOFHeader();
+ if(tofH) t -= fgPIDResponse->GetTOFResponse().GetStartTime(particle->P()); // ps
if( (l < 360.e-2 || l > 800.e-2) || (t <= 0.) ) {
values[AliDielectronVarManager::kTOFbeta] =0;
}
else {
t *= 1e-12; //ps -> s
-
- Double_t v = l / t;
- Float_t beta = v / TMath::C();
- values[AliDielectronVarManager::kTOFbeta]=beta;
+
+ 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
+ if(Req(kTPCnSigmaEleRaw)) values[kTPCnSigmaEleRaw]= fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kElectron);
+ if(Req(kTPCnSigmaEle)) values[kTPCnSigmaEle] =(fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kElectron)
+ -AliDielectronPID::GetCorrVal()-
+ AliDielectronPID::GetCntrdCorr(particle)) / AliDielectronPID::GetWdthCorr(particle);
+
+ if(Req(kTPCnSigmaPio)) values[kTPCnSigmaPio]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kPion);
+ if(Req(kTPCnSigmaMuo)) values[kTPCnSigmaMuo]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kMuon);
+ if(Req(kTPCnSigmaKao)) values[kTPCnSigmaKao]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kKaon);
+ if(Req(kTPCnSigmaPro)) values[kTPCnSigmaPro]=fgPIDResponse->NumberOfSigmasTPC(particle,AliPID::kProton);
+
+ if(Req(kITSnSigmaEle)) values[kITSnSigmaEle]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kElectron);
+ if(Req(kITSnSigmaPio)) values[kITSnSigmaPio]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kPion);
+ if(Req(kITSnSigmaMuo)) values[kITSnSigmaMuo]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kMuon);
+ if(Req(kITSnSigmaKao)) values[kITSnSigmaKao]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kKaon);
+ if(Req(kITSnSigmaPro)) values[kITSnSigmaPro]=fgPIDResponse->NumberOfSigmasITS(particle,AliPID::kProton);
+
+ if(Req(kTOFnSigmaEle)) values[kTOFnSigmaEle]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kElectron);
+ if(Req(kTOFnSigmaPio)) values[kTOFnSigmaPio]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kPion);
+ if(Req(kTOFnSigmaMuo)) values[kTOFnSigmaMuo]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kMuon);
+ if(Req(kTOFnSigmaKao)) values[kTOFnSigmaKao]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kKaon);
+ if(Req(kTOFnSigmaPro)) values[kTOFnSigmaPro]=fgPIDResponse->NumberOfSigmasTOF(particle,AliPID::kProton);
+
+ Double_t prob[AliPID::kSPECIES]={0.0};
+ // switch computation off since it takes 70% of the CPU time for filling all AODtrack variables
+ // TODO: find a solution when this is needed (maybe at fill time in histos, CFcontainer and cut selection)
+ if( Req(kTRDprobEle) || Req(kTRDprobPio) ) fgPIDResponse->ComputeTRDProbability(particle,AliPID::kSPECIES,prob);
+ values[AliDielectronVarManager::kTRDprobEle] = prob[AliPID::kElectron];
+ values[AliDielectronVarManager::kTRDprobPio] = prob[AliPID::kPion];
+ // if( Req(kTRDprob2DEle) || Req(kTRDprob2DPio) )
+ // fgPIDResponse->ComputeTRDProbability(particle,AliPID::kSPECIES,prob, AliTRDPIDResponse::kLQ2D);
+ values[AliDielectronVarManager::kTRDprob2DEle] = prob[AliPID::kElectron];
+ values[AliDielectronVarManager::kTRDprob2DPio] = prob[AliPID::kPion];
- values[AliDielectronVarManager::kTOFmismProb] = fgPIDResponse->GetTOFMismatchProbability(particle);
-
+ //restore TPC signal if it was changed
pid->SetTPCsignal(origdEdx);
}
//EMCAL PID information
Double_t eop=0;
Double_t showershape[4]={0.,0.,0.,0.};
-// values[AliDielectronVarManager::kEMCALnSigmaEle] = fgPIDResponse->NumberOfSigmasEMCAL(particle,AliPID::kElectron);
- values[AliDielectronVarManager::kEMCALnSigmaEle] = fgPIDResponse->NumberOfSigmasEMCAL(particle,AliPID::kElectron,eop,showershape);
+// if(Req()) values[AliDielectronVarManager::kEMCALnSigmaEle] = fgPIDResponse->NumberOfSigmasEMCAL(particle,AliPID::kElectron);
+ if(Req(kEMCALnSigmaEle) || Req(kEMCALE) || Req(kEMCALEoverP) ||
+ Req(kEMCALNCells) || Req(kEMCALM02) || Req(kEMCALM20) || Req(kEMCALDispersion))
+ values[AliDielectronVarManager::kEMCALnSigmaEle] = fgPIDResponse->NumberOfSigmasEMCAL(particle,AliPID::kElectron,eop,showershape);
values[AliDielectronVarManager::kEMCALEoverP] = eop;
values[AliDielectronVarManager::kEMCALE] = eop*values[AliDielectronVarManager::kP];
values[AliDielectronVarManager::kEMCALNCells] = showershape[0];
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);
+ if(Req(kTOFPIDBit)) values[AliDielectronVarManager::kTOFPIDBit]=(particle->GetStatus()&AliESDtrack::kTOFpid? 1: 0);
+ if(Req(kLegEff) || Req(kOneOverLegEff)) {
+ values[AliDielectronVarManager::kLegEff] = GetSingleLegEff(values);
+ values[AliDielectronVarManager::kOneOverLegEff] = (values[AliDielectronVarManager::kLegEff]>0.0 ? 1./values[AliDielectronVarManager::kLegEff] : 0.0);
+ }
}
// Fill AliDielectronPair specific information
const AliKFParticle &kfPair = pair->GetKFParticle();
+
+ values[AliDielectronVarManager::kThetaHE] = 0.0;
+ values[AliDielectronVarManager::kPhiHE] = 0.0;
+ values[AliDielectronVarManager::kThetaSqHE] = 0.0;
+ values[AliDielectronVarManager::kCos2PhiHE] = 0.0;
+ values[AliDielectronVarManager::kCosTilPhiHE] = 0.0;
+
+ values[AliDielectronVarManager::kThetaCS] = 0.0;
+ values[AliDielectronVarManager::kPhiCS] = 0.0;
+ values[AliDielectronVarManager::kThetaSqCS] = 0.0;
+ values[AliDielectronVarManager::kCos2PhiCS] = 0.0;
+ values[AliDielectronVarManager::kCosTilPhiCS] = 0.0;
+
Double_t thetaHE=0;
Double_t phiHE=0;
Double_t thetaCS=0;
Double_t phiCS=0;
+ if(Req(kThetaHE) || Req(kPhiHE) || Req(kThetaCS) || Req(kPhiCS)) {
+ pair->GetThetaPhiCM(thetaHE,phiHE,thetaCS,phiCS);
+
+ values[AliDielectronVarManager::kThetaHE] = thetaHE;
+ values[AliDielectronVarManager::kPhiHE] = phiHE;
+ values[AliDielectronVarManager::kThetaSqHE] = thetaHE * thetaHE;
+ values[AliDielectronVarManager::kCos2PhiHE] = TMath::Cos(2.0*phiHE);
+ values[AliDielectronVarManager::kCosTilPhiHE] = (thetaHE>0)?(TMath::Cos(phiHE-TMath::Pi()/4.)):(TMath::Cos(phiHE-3*TMath::Pi()/4.));
+ values[AliDielectronVarManager::kThetaCS] = thetaCS;
+ values[AliDielectronVarManager::kPhiCS] = phiCS;
+ values[AliDielectronVarManager::kThetaSqCS] = thetaCS * thetaCS;
+ values[AliDielectronVarManager::kCos2PhiCS] = TMath::Cos(2.0*phiCS);
+ values[AliDielectronVarManager::kCosTilPhiCS] = (thetaCS>0)?(TMath::Cos(phiCS-TMath::Pi()/4.)):(TMath::Cos(phiCS-3*TMath::Pi()/4.));
+ }
+
+ if(Req(kChi2NDF)) values[AliDielectronVarManager::kChi2NDF] = kfPair.GetChi2()/kfPair.GetNDF();
+ if(Req(kDecayLength)) values[AliDielectronVarManager::kDecayLength] = kfPair.GetDecayLength();
+ if(Req(kR)) values[AliDielectronVarManager::kR] = kfPair.GetR();
+ if(Req(kOpeningAngle)) values[AliDielectronVarManager::kOpeningAngle] = pair->OpeningAngle();
+ if(Req(kCosPointingAngle)) values[AliDielectronVarManager::kCosPointingAngle] = fgEvent ? pair->GetCosPointingAngle(fgEvent->GetPrimaryVertex()) : -1;
+
+ if(Req(kLegDist)) values[AliDielectronVarManager::kLegDist] = pair->DistanceDaughters();
+ if(Req(kLegDistXY)) values[AliDielectronVarManager::kLegDistXY] = pair->DistanceDaughtersXY();
+ if(Req(kDeltaEta)) values[AliDielectronVarManager::kDeltaEta] = pair->DeltaEta();
+ if(Req(kDeltaPhi)) values[AliDielectronVarManager::kDeltaPhi] = pair->DeltaPhi();
+ if(Req(kMerr)) values[AliDielectronVarManager::kMerr] = kfPair.GetErrMass()>1e-30&&kfPair.GetMass()>1e-30?kfPair.GetErrMass()/kfPair.GetMass():1000000;
- pair->GetThetaPhiCM(thetaHE,phiHE,thetaCS,phiCS);
-
- values[AliDielectronVarManager::kChi2NDF] = kfPair.GetChi2()/kfPair.GetNDF();
- values[AliDielectronVarManager::kDecayLength] = kfPair.GetDecayLength();
- values[AliDielectronVarManager::kR] = kfPair.GetR();
- values[AliDielectronVarManager::kOpeningAngle] = pair->OpeningAngle();
- values[AliDielectronVarManager::kCosPointingAngle] = fgEvent ? pair->GetCosPointingAngle(fgEvent->GetPrimaryVertex()) : -1;
- values[AliDielectronVarManager::kThetaHE] = thetaHE;
- values[AliDielectronVarManager::kPhiHE] = phiHE;
- values[AliDielectronVarManager::kThetaSqHE] = thetaHE * thetaHE;
- values[AliDielectronVarManager::kCos2PhiHE] = TMath::Cos(2.0*phiHE);
- values[AliDielectronVarManager::kCosTilPhiHE] = (thetaHE>0)?(TMath::Cos(phiHE-TMath::Pi()/4.)):(TMath::Cos(phiHE-3*TMath::Pi()/4.));
- values[AliDielectronVarManager::kThetaCS] = thetaCS;
- values[AliDielectronVarManager::kPhiCS] = phiCS;
- values[AliDielectronVarManager::kThetaSqCS] = thetaCS * thetaCS;
- values[AliDielectronVarManager::kCos2PhiCS] = TMath::Cos(2.0*phiCS);
- values[AliDielectronVarManager::kCosTilPhiCS] = (thetaCS>0)?(TMath::Cos(phiCS-TMath::Pi()/4.)):(TMath::Cos(phiCS-3*TMath::Pi()/4.));
- values[AliDielectronVarManager::kLegDist] = pair->DistanceDaughters();
- values[AliDielectronVarManager::kLegDistXY] = pair->DistanceDaughtersXY();
- values[AliDielectronVarManager::kDeltaEta] = pair->DeltaEta();
- 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;
- values[AliDielectronVarManager::kPseudoProperTime] = fgEvent ? kfPair.GetPseudoProperDecayTime(*(fgEvent->GetPrimaryVertex()), TDatabasePDG::Instance()->GetParticle(443)->Mass(), &errPseudoProperTime2 ) : -1e10;
+ if(Req(kArmAlpha)) values[AliDielectronVarManager::kArmAlpha] = pair->GetArmAlpha();
+ if(Req(kArmPt)) values[AliDielectronVarManager::kArmPt] = pair->GetArmPt();
+
+ if(Req(kPsiPair)) values[AliDielectronVarManager::kPsiPair] = fgEvent ? pair->PsiPair(fgEvent->GetMagneticField()) : -5;
+ if(Req(kPhivPair)) values[AliDielectronVarManager::kPhivPair] = fgEvent ? pair->PhivPair(fgEvent->GetMagneticField()) : -5;
+ if(Req(kPseudoProperTime) || Req(kPseudoProperTimeErr)) {
+ values[AliDielectronVarManager::kPseudoProperTime] =
+ fgEvent ? kfPair.GetPseudoProperDecayTime(*(fgEvent->GetPrimaryVertex()), TDatabasePDG::Instance()->GetParticle(443)->Mass(), &errPseudoProperTime2 ) : -1e10;
// values[AliDielectronVarManager::kPseudoProperTime] = fgEvent ? pair->GetPseudoProperTime(fgEvent->GetPrimaryVertex()): -1e10;
- values[AliDielectronVarManager::kPseudoProperTimeErr] = (errPseudoProperTime2 > 0) ? TMath::Sqrt(errPseudoProperTime2) : -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);
+ Double_t d0z0[2]={-999., -999.};
+ if( (Req(kImpactParXY) || Req(kImpactParZ)) && fgEvent) pair->GetDCA(fgEvent->GetPrimaryVertex(), d0z0);
values[AliDielectronVarManager::kImpactParXY] = d0z0[0];
values[AliDielectronVarManager::kImpactParZ] = d0z0[1];
//common, regardless of calculation method
// Flow quantities
- values[AliDielectronVarManager::kCosPhiH2] = TMath::Cos(2*values[AliDielectronVarManager::kPhi]);
- values[AliDielectronVarManager::kSinPhiH2] = TMath::Sin(2*values[AliDielectronVarManager::kPhi]);
+ Double_t phi=values[AliDielectronVarManager::kPhi];
+ if(Req(kCosPhiH2)) values[AliDielectronVarManager::kCosPhiH2] = TMath::Cos(2*phi);
+ if(Req(kSinPhiH2)) values[AliDielectronVarManager::kSinPhiH2] = TMath::Sin(2*phi);
Double_t delta=0.0;
// v2 with respect to VZERO-A event plane
- delta = values[AliDielectronVarManager::kPhi] - fgData[AliDielectronVarManager::kV0ArpH2];
+ delta = phi - fgData[AliDielectronVarManager::kV0ArpH2];
if(delta>TMath::Pi()) delta -= 2.0*TMath::Pi(); // keep the [-pi,+pi] interval
if(delta<-1.0*TMath::Pi()) delta += 2.0*TMath::Pi();
- values[AliDielectronVarManager::kV0ArpH2FlowV2] = TMath::Cos(2.0*delta); // 2nd harmonic flow coefficient
- values[AliDielectronVarManager::kDeltaPhiV0ArpH2] = delta;
+ if(Req(kV0ArpH2FlowV2)) values[AliDielectronVarManager::kV0ArpH2FlowV2] = TMath::Cos(2.0*delta); // 2nd harmonic flow coefficient
+ if(Req(kDeltaPhiV0ArpH2)) values[AliDielectronVarManager::kDeltaPhiV0ArpH2] = delta;
// v2 with respect to VZERO-C event plane
- delta = values[AliDielectronVarManager::kPhi] - fgData[AliDielectronVarManager::kV0CrpH2];
+ delta = phi - fgData[AliDielectronVarManager::kV0CrpH2];
if(delta>TMath::Pi()) delta -= 2.0*TMath::Pi(); // keep the [-pi,+pi] interval
if(delta<-1.0*TMath::Pi()) delta += 2.0*TMath::Pi();
- values[AliDielectronVarManager::kV0CrpH2FlowV2] = TMath::Cos(2.0*delta); // 2nd harmonic flow coefficient
- values[AliDielectronVarManager::kDeltaPhiV0CrpH2] = delta;
+ if(Req(kV0CrpH2FlowV2)) values[AliDielectronVarManager::kV0CrpH2FlowV2] = TMath::Cos(2.0*delta); // 2nd harmonic flow coefficient
+ if(Req(kDeltaPhiV0CrpH2)) values[AliDielectronVarManager::kDeltaPhiV0CrpH2] = delta;
// v2 with respect to the combined VZERO-A and VZERO-C event plane
- delta = values[AliDielectronVarManager::kPhi] - fgData[AliDielectronVarManager::kV0ACrpH2];
+ delta = phi - fgData[AliDielectronVarManager::kV0ACrpH2];
if(delta>TMath::Pi()) delta -= 2.0*TMath::Pi(); // keep the [-pi,+pi] interval
if(delta<-1.0*TMath::Pi()) delta += 2.0*TMath::Pi();
- values[AliDielectronVarManager::kV0ACrpH2FlowV2] = TMath::Cos(2.0*delta); // 2nd harmonic flow coefficient
- values[AliDielectronVarManager::kDeltaPhiV0ACrpH2] = delta;
+ if(Req(kV0ACrpH2FlowV2)) values[AliDielectronVarManager::kV0ACrpH2FlowV2] = TMath::Cos(2.0*delta); // 2nd harmonic flow coefficient
+ if(Req(kDeltaPhiV0ACrpH2)) values[AliDielectronVarManager::kDeltaPhiV0ACrpH2] = delta;
// 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::kDeltaPhiv0ACrpH2] = values[AliDielectronVarManager::kPhi] - values[AliDielectronVarManager::kv0ACrpH2];
- 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]) );
+ values[AliDielectronVarManager::kDeltaPhiv0ArpH2] = phi - values[AliDielectronVarManager::kv0ArpH2];
+ values[AliDielectronVarManager::kDeltaPhiv0CrpH2] = phi - values[AliDielectronVarManager::kv0CrpH2];
+ values[AliDielectronVarManager::kDeltaPhiv0ACrpH2] = phi - values[AliDielectronVarManager::kv0ACrpH2];
+ values[AliDielectronVarManager::kDeltaPhiTPCrpH2] = phi - values[AliDielectronVarManager::kTPCrpH2];
+ values[AliDielectronVarManager::kv0ACrpH2FlowV2] = TMath::Cos( 2*(phi - values[AliDielectronVarManager::kv0ACrpH2]) );
+ values[AliDielectronVarManager::kv0ArpH2FlowV2] = TMath::Cos( 2*(phi - values[AliDielectronVarManager::kv0ArpH2]) );
+ values[AliDielectronVarManager::kv0CrpH2FlowV2] = TMath::Cos( 2*(phi - values[AliDielectronVarManager::kv0CrpH2]) );
+ values[AliDielectronVarManager::kTPCrpH2FlowV2] = TMath::Cos( 2*(phi - values[AliDielectronVarManager::kTPCrpH2]) );
+ values[AliDielectronVarManager::kTPCrpH2FlowV2Sin] = TMath::Sin( 2*(phi - 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();
- if ( values[AliDielectronVarManager::kDeltaPhiv0CrpH2] < -1.*TMath::Pi() )
- 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();
+ if ( values[kDeltaPhiv0ArpH2] > TMath::Pi() ) values[kDeltaPhiv0ArpH2] -= TMath::TwoPi();
+ if ( values[kDeltaPhiv0CrpH2] > TMath::Pi() ) values[kDeltaPhiv0CrpH2] -= TMath::TwoPi();
+ if ( values[kDeltaPhiv0ACrpH2] > TMath::Pi() ) values[kDeltaPhiv0ACrpH2] -= TMath::TwoPi();
+ if ( values[kDeltaPhiTPCrpH2] > TMath::Pi() ) values[kDeltaPhiTPCrpH2] -= TMath::TwoPi();
+
+ if ( values[kDeltaPhiv0ArpH2] < -1.*TMath::Pi() ) values[kDeltaPhiv0ArpH2] += TMath::TwoPi();
+ if ( values[kDeltaPhiv0CrpH2] < -1.*TMath::Pi() ) values[kDeltaPhiv0CrpH2] += TMath::TwoPi();
+ if ( values[kDeltaPhiv0ACrpH2] < -1.*TMath::Pi() ) values[kDeltaPhiv0ACrpH2] += TMath::TwoPi();
+ if ( values[kDeltaPhiTPCrpH2] < -1.*TMath::Pi() ) values[kDeltaPhiTPCrpH2] += TMath::TwoPi();
+
+ //calculate inner product of strong Mag and ee plane
+ if(Req(kPairPlaneMagInPro)) 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);
+ if(Req(kPairPlaneAngle1A)) values[AliDielectronVarManager::kPairPlaneAngle1A] = pair->GetPairPlaneAngle(values[kv0ArpH2],1);
+ if(Req(kPairPlaneAngle2A)) values[AliDielectronVarManager::kPairPlaneAngle2A] = pair->GetPairPlaneAngle(values[kv0ArpH2],2);
+ if(Req(kPairPlaneAngle3A)) values[AliDielectronVarManager::kPairPlaneAngle3A] = pair->GetPairPlaneAngle(values[kv0ArpH2],3);
+ if(Req(kPairPlaneAngle4A)) values[AliDielectronVarManager::kPairPlaneAngle4A] = pair->GetPairPlaneAngle(values[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);
+ if(Req(kPairPlaneAngle1C)) values[AliDielectronVarManager::kPairPlaneAngle1C] = pair->GetPairPlaneAngle(values[kv0CrpH2],1);
+ if(Req(kPairPlaneAngle2C)) values[AliDielectronVarManager::kPairPlaneAngle2C] = pair->GetPairPlaneAngle(values[kv0CrpH2],2);
+ if(Req(kPairPlaneAngle3C)) values[AliDielectronVarManager::kPairPlaneAngle3C] = pair->GetPairPlaneAngle(values[kv0CrpH2],3);
+ if(Req(kPairPlaneAngle4C)) values[AliDielectronVarManager::kPairPlaneAngle4C] = pair->GetPairPlaneAngle(values[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);
+ if(Req(kPairPlaneAngle1AC)) values[AliDielectronVarManager::kPairPlaneAngle1AC] = pair->GetPairPlaneAngle(values[kv0ACrpH2],1);
+ if(Req(kPairPlaneAngle2AC)) values[AliDielectronVarManager::kPairPlaneAngle2AC] = pair->GetPairPlaneAngle(values[kv0ACrpH2],2);
+ if(Req(kPairPlaneAngle3AC)) values[AliDielectronVarManager::kPairPlaneAngle3AC] = pair->GetPairPlaneAngle(values[kv0ACrpH2],3);
+ if(Req(kPairPlaneAngle4AC)) values[AliDielectronVarManager::kPairPlaneAngle4AC] = pair->GetPairPlaneAngle(values[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];
+ values[AliDielectronVarManager::kDeltaPhiRandomRP] = phi - values[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);
-
+ if(Req(kPairPlaneAngle1Ran)) values[AliDielectronVarManager::kPairPlaneAngle1Ran]= pair->GetPairPlaneAngle(values[kRandomRP],1);
+ if(Req(kPairPlaneAngle2Ran)) values[AliDielectronVarManager::kPairPlaneAngle2Ran]= pair->GetPairPlaneAngle(values[kRandomRP],2);
+ if(Req(kPairPlaneAngle3Ran)) values[AliDielectronVarManager::kPairPlaneAngle3Ran]= pair->GetPairPlaneAngle(values[kRandomRP],3);
+ if(Req(kPairPlaneAngle4Ran)) values[AliDielectronVarManager::kPairPlaneAngle4Ran]= pair->GetPairPlaneAngle(values[kRandomRP],4);
values[AliDielectronVarManager::kPseudoProperTimeResolution] = -1e10;
// values[AliDielectronVarManager::kPseudoProperTimePull] = -1e10;
if(samemother && fgEvent) {
- if(pair->GetFirstDaughter()->GetLabel() > 0) {
+ if(pair->GetFirstDaughterP()->GetLabel() > 0) {
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());
+ if(fgEvent->IsA() == AliESDEvent::Class()) motherMC = (AliMCParticle*)mc->GetMCTrackMother((AliESDtrack*)pair->GetFirstDaughterP());
+ else if(fgEvent->IsA() == AliAODEvent::Class()) motherMC = (AliAODMCParticle*)mc->GetMCTrackMother((AliAODTrack*)pair->GetFirstDaughterP());
Double_t vtxX, vtxY, vtxZ;
if(motherMC && mc->GetPrimaryVertex(vtxX,vtxY,vtxZ)) {
Int_t motherLbl = motherMC->GetLabel();
if (fgTRDpidEff[0][0]){
Double_t valuesLeg1[AliDielectronVarManager::kNMaxValues];
Double_t valuesLeg2[AliDielectronVarManager::kNMaxValues];
- AliVParticle* leg1 = pair->GetFirstDaughter();
- AliVParticle* leg2 = pair->GetSecondDaughter();
+ AliVParticle* leg1 = pair->GetFirstDaughterP();
+ AliVParticle* leg2 = pair->GetSecondDaughterP();
if (leg1 && leg2){
Fill(leg1, valuesLeg1);
Fill(leg2, valuesLeg2);
}//if (mc->HasMC())
- AliVParticle* leg1 = pair->GetFirstDaughter();
- AliVParticle* leg2 = pair->GetSecondDaughter();
+ AliVParticle* leg1 = pair->GetFirstDaughterP();
+ AliVParticle* leg2 = pair->GetSecondDaughterP();
if (leg1)
values[AliDielectronVarManager::kMomAsymDau1] = (values[AliDielectronVarManager::kP] != 0)? leg1->P() / values[AliDielectronVarManager::kP]: 0;
else
Double_t valuesLeg1[AliDielectronVarManager::kNMaxValues];
Double_t valuesLeg2[AliDielectronVarManager::kNMaxValues];
- if (leg1 && leg2 && fgEffMap) {
+ if (leg1 && leg2 && fgLegEffMap) {
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] : 0.0);
-
}
- values[AliDielectronVarManager::kRndmPair] = gRandom->Rndm();
+ else if(fgPairEffMap) {
+ values[AliDielectronVarManager::kPairEff] = GetPairEff(values);
+ }
+ values[AliDielectronVarManager::kOneOverPairEff] = (values[AliDielectronVarManager::kPairEff]>0.0 ? 1./values[AliDielectronVarManager::kPairEff] : 1.0);
+ values[AliDielectronVarManager::kOneOverPairEffSq] = (values[AliDielectronVarManager::kPairEff]>0.0 ? 1./values[AliDielectronVarManager::kPairEff]/values[AliDielectronVarManager::kPairEff] : 1.0);
+
+ if(kRndmPair) values[AliDielectronVarManager::kRndmPair] = gRandom->Rndm();
}
inline void AliDielectronVarManager::FillVarKFParticle(const AliKFParticle *particle, Double_t * const values)
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;
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);
+ if(Req(kNacc)) values[AliDielectronVarManager::kNacc] = AliDielectronHelper::GetNacc(event);
+ if(Req(kMatchEffITSTPC)) values[AliDielectronVarManager::kMatchEffITSTPC] = AliDielectronHelper::GetITSTPCMatchEff(event);
+ if(Req(kNaccTrcklts)) values[AliDielectronVarManager::kNaccTrcklts] = AliDielectronHelper::GetNaccTrcklts(event); // etaRange = 1.6 (default)
+ if(Req(kNaccTrcklts0916)) values[AliDielectronVarManager::kNaccTrcklts0916] = AliDielectronHelper::GetNaccTrcklts(event,1.6)-AliDielectronHelper::GetNaccTrcklts(event,.9);
+ // values[AliDielectronVarManager::kNaccTrcklts05] = AliDielectronHelper::GetNaccTrcklts(event, 0.5); // AODHeader::fRefMultComb05
// values[AliDielectronVarManager::kNaccTrcklts10] = AliDielectronHelper::GetNaccTrcklts(event, 1.0);
// values[AliDielectronVarManager::kNaccTrckltsCorr] = AliDielectronHelper::GetNaccTrckltsCorrected(event, values[AliDielectronVarManager::kNaccTrcklts], values[AliDielectronVarManager::kZvPrim]);
- values[AliDielectronVarManager::kPhiMaxPt] = 0;
- values[AliDielectronVarManager::kMaxPt] = 0;
+
Double_t ptMaxEv = -1., phiptMaxEv= -1.;
- for(Int_t itrk=0; itrk<event->GetNumberOfTracks(); itrk++) {
- AliVParticle *part= event->GetTrack(itrk);
- if(part->Pt() > ptMaxEv) {
- ptMaxEv = part->Pt();
- phiptMaxEv = part->Phi();
- }
- }
+ if(Req(kMaxPt) || Req(kPhiMaxPt)) AliDielectronHelper::GetMaxPtAndPhi(event, ptMaxEv, phiptMaxEv);
values[AliDielectronVarManager::kPhiMaxPt] = phiptMaxEv;
values[AliDielectronVarManager::kMaxPt] = ptMaxEv;
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::kMultV0] = values[AliDielectronVarManager::kMultV0A] + values[AliDielectronVarManager::kMultV0C];
+ values[AliDielectronVarManager::kEqMultV0] = values[AliDielectronVarManager::kEqMultV0A] + values[AliDielectronVarManager::kEqMultV0C];
values[AliDielectronVarManager::kAdcV0] = values[AliDielectronVarManager::kAdcV0A] + values[AliDielectronVarManager::kAdcV0C];
// VZERO event plane quantities
Double_t qvec[3]={0.0};
values[AliDielectronVarManager::kv0C0v0C3DiffH2] = TMath::Cos( 2.*(values[AliDielectronVarManager::kv0C0rpH2] -
values[AliDielectronVarManager::kv0C3rpH2]) );
+ Double_t ZDCqvec[3][2] = {{999., 999.}, {999., 999.}, {999., 999.} };
+ 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]);
+
+ if(TMath::Abs(ZDCqvec[0][0] - 999.) < 1e-10 || TMath::Abs(ZDCqvec[0][1] - 999.) < 1e-10 || TMath::Abs(ZDCqvec[1][0] - 999.) < 1e-10 || TMath::Abs(ZDCqvec[1][1] - 999.) < 1e-10){
+ values[AliDielectronVarManager::kZDCArpH1] = 999;
+ values[AliDielectronVarManager::kZDCCrpH1] = 999;
+ values[AliDielectronVarManager::kZDCACrpH1] = 999;
+ }
+
+
+
+ values[AliDielectronVarManager::kv0ZDCrpRes] = cos(2*(values[AliDielectronVarManager::kZDCArpH1] - values[AliDielectronVarManager::kv0ArpH2]));
+ values[AliDielectronVarManager::kZDCrpResH1] = cos(values[AliDielectronVarManager::kZDCArpH1] - values[AliDielectronVarManager::kZDCCrpH1]);
+
}
// Event multiplicity estimators
Int_t nTrSPD05=0; Int_t nTrITSTPC05=0; Int_t nTrITSSA05=0;
- event->EstimateMultiplicity(nTrSPD05, nTrITSTPC05, nTrITSSA05, 0.5);
+ nTrSPD05 = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTracklets, 0.5);
+ nTrITSTPC05 = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTrackletsITSTPC, 0.5);
+ nTrITSSA05 = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTrackletsITSSA, 0.5);
values[AliDielectronVarManager::kNaccTrckltsEsd05] = nTrSPD05;
values[AliDielectronVarManager::kNaccItsTpcEsd05] = nTrITSTPC05;
values[AliDielectronVarManager::kNaccItsPureEsd05] = nTrITSSA05;
AliDielectronHelper::GetNaccTrckltsCorrected(event,Double_t(nTrITSSA05),values[AliDielectronVarManager::kZvPrim],6);
Int_t nTrSPD10=0; Int_t nTrITSTPC10=0; Int_t nTrITSSA10=0;
- event->EstimateMultiplicity(nTrSPD10, nTrITSTPC10, nTrITSSA10, 1.0);
+ nTrSPD10 = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTracklets, 1.0);
+ nTrITSTPC10 = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTrackletsITSTPC, 1.0);
+ nTrITSSA10 = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTrackletsITSSA, 1.0);
values[AliDielectronVarManager::kNaccTrckltsEsd10] = nTrSPD10;
values[AliDielectronVarManager::kNaccItsTpcEsd10] = nTrITSTPC10;
values[AliDielectronVarManager::kNaccItsPureEsd10] = nTrITSSA10;
AliDielectronHelper::GetNaccTrckltsCorrected(event,Double_t(nTrITSSA10),values[AliDielectronVarManager::kZvPrim],7);
Int_t nTrSPD16=0; Int_t nTrITSTPC16=0; Int_t nTrITSSA16=0;
- event->EstimateMultiplicity(nTrSPD16, nTrITSTPC16, nTrITSSA16, 1.6);
+ nTrSPD16 = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTracklets, 1.6);
+ nTrITSTPC16 = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTrackletsITSTPC, 1.6);
+ nTrITSSA16 = AliESDtrackCuts::GetReferenceMultiplicity(event, AliESDtrackCuts::kTrackletsITSSA, 1.6);
values[AliDielectronVarManager::kNaccTrckltsEsd16] = nTrSPD16;
values[AliDielectronVarManager::kNaccItsTpcEsd16] = nTrITSTPC16;
values[AliDielectronVarManager::kNaccItsPureEsd16] = nTrITSSA16;
}
}
-inline void AliDielectronVarManager::InitEffMap(const Char_t* filename) {
+inline Double_t AliDielectronVarManager::GetSingleLegEff(Double_t * const values) {
//
- // init an efficiency object for on-the-fly correction calculations
+ // get the single leg efficiency for a given particle
//
- fgEffMap=0x0;
- TFile* file=TFile::Open(filename);
- THnBase *hGen = (THnBase*) file->Get("hGenerated");
- THnBase *hFnd = (THnBase*) file->Get("hFound");
- if(!hFnd || !hGen) return;
-
- fgEffMap = (THnBase*) hFnd->Clone("effMap");
- fgEffMap->Reset();
- fgEffMap->Sumw2();
- fgEffMap->Divide(hFnd, hGen);//, 1, 1, ""); //assume uncorrelated err, otherwise give option "B"
- if(fgEffMap) printf("[I] AliDielectronVarManager::InitEffMap efficiency maps loaded! \n");
+ if(!fgLegEffMap) return -1.;
+
+ if(fgLegEffMap->IsA()== THnBase::Class()) {
+ THnBase *eff = static_cast<THnBase*>(fgLegEffMap);
+ Int_t dim=eff->GetNdimensions();
+ Int_t idx[dim];
+ for(Int_t idim=0; idim<dim; idim++) {
+ UInt_t var = GetValueType(eff->GetAxis(idim)->GetName());
+ idx[idim] = eff->GetAxis(idim)->FindBin(values[var]);
+ if(idx[idim] < 0 || idx[idim]>eff->GetAxis(idim)->GetNbins()) return 0.0;
+ }
+ // printf(" bin content %f+-%f \n",eff->GetBinContent(idx), eff->GetBinError(idx));
+ return (eff->GetBinContent(idx));
+ }
+ return -1.;
}
-inline Double_t AliDielectronVarManager::GetSingleLegEff(Double_t * const values) {
+inline Double_t AliDielectronVarManager::GetPairEff(Double_t * const values) {
//
- // get the single leg efficiency for a given particle
+ // get the pair efficiency for given pair kinematics
//
- 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());
+ if(!fgPairEffMap) return -1.;
+
+ if(fgPairEffMap->IsA()== THnBase::Class()) {
+ THnBase *eff = static_cast<THnBase*>(fgPairEffMap);
+ Int_t dim=eff->GetNdimensions();
+ Int_t idx[dim];
+ for(Int_t idim=0; idim<dim; idim++) {
+ UInt_t var = GetValueType(eff->GetAxis(idim)->GetName());
+ idx[idim] = eff->GetAxis(idim)->FindBin(values[var]);
+ if(idx[idim] < 0 || idx[idim]>eff->GetAxis(idim)->GetNbins()) return 0.0;
+ }
+ // printf(" bin content %f+-%f \n",eff->GetBinContent(idx), eff->GetBinError(idx));
+ return (eff->GetBinContent(idx));
}
- // printf(" bin content %f+-%f \n",fgEffMap->GetBinContent(idx), fgEffMap->GetBinError(idx));
- if(fgEffMap->GetBinContent(idx)<0.01 || fgEffMap->GetBinError(idx)/fgEffMap->GetBinContent(idx)>0.2) return 0.0;
- return (fgEffMap->GetBinContent(idx));
+ if(fgPairEffMap->IsA()== TSpline3::Class()) {
+ TSpline3 *eff = static_cast<TSpline3*>(fgPairEffMap);
+ if(!eff->GetHistogram()) { printf("no histogram added to the spline\n"); return -1.;}
+ UInt_t var = GetValueType(eff->GetHistogram()->GetXaxis()->GetName());
+ //printf(" bin content %f \n",eff->Eval(values[var]) );
+ return (eff->Eval(values[var]));
+ }
+
+ return -1.;
}
}
+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=TFile::Open(fgZDCRecenteringFile.Data());
+ if(!file) 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);
+
+ delete file;
+
+}
+
inline Double_t AliDielectronVarManager::GetTRDpidEfficiency(Int_t runNo, Double_t centrality,
Double_t eta, Double_t trdPhi, Double_t pout,
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) {