From 465ff082eb87c769f8cb525ba079297b974923af Mon Sep 17 00:00:00 2001 From: rbailhac Date: Mon, 1 Dec 2014 16:56:46 +0100 Subject: [PATCH] Update of npe Pb-Pb code --- PWGHF/hfe/AliAnalysisTaskFlowTPCTOFEPSP.cxx | 10 +- PWGHF/hfe/AliAnalysisTaskHFE.cxx | 46 +- PWGHF/hfe/AliHFENonPhotonicElectron.cxx | 2114 +++++++++-------- PWGHF/hfe/AliHFENonPhotonicElectron.h | 35 +- PWGHF/hfe/macros/AddTaskHFEnpePbPb.C | 171 +- .../macros/configs/PbPb/ConfigHFEnpePbPb.C | 79 +- .../macros/configs/PbPb/ConfigWeightFactors.C | 164 ++ PWGHF/hfe/macros/nonHFEcorrect.root | Bin 0 -> 248214 bytes 8 files changed, 1557 insertions(+), 1062 deletions(-) create mode 100644 PWGHF/hfe/macros/configs/PbPb/ConfigWeightFactors.C create mode 100644 PWGHF/hfe/macros/nonHFEcorrect.root diff --git a/PWGHF/hfe/AliAnalysisTaskFlowTPCTOFEPSP.cxx b/PWGHF/hfe/AliAnalysisTaskFlowTPCTOFEPSP.cxx index f79e24826be..4b05eef2068 100644 --- a/PWGHF/hfe/AliAnalysisTaskFlowTPCTOFEPSP.cxx +++ b/PWGHF/hfe/AliAnalysisTaskFlowTPCTOFEPSP.cxx @@ -774,11 +774,11 @@ void AliAnalysisTaskFlowTPCTOFEPSP::UserCreateOutputObjects() if(!fPtBinning.GetSize()) fPtBinning.Set(nBinsPt+1, binLimPt); - Int_t nBinsPtPlus = fNbBinsPtQCumulant; - Double_t minPtPlus = fMinPtQCumulant; - Double_t maxPtPlus = fMaxPtQCumulant; - Double_t binLimPtPlus[nBinsPtPlus+1]; - for(Int_t i=0; i<=nBinsPtPlus; i++) binLimPtPlus[i]=(Double_t)minPtPlus + (maxPtPlus-minPtPlus)/nBinsPtPlus*(Double_t)i ; + //Int_t nBinsPtPlus = fNbBinsPtQCumulant; + //Double_t minPtPlus = fMinPtQCumulant; + //Double_t maxPtPlus = fMaxPtQCumulant; + //Double_t binLimPtPlus[nBinsPtPlus+1]; + //for(Int_t i=0; i<=nBinsPtPlus; i++) binLimPtPlus[i]=(Double_t)minPtPlus + (maxPtPlus-minPtPlus)/nBinsPtPlus*(Double_t)i ; Int_t nBinsEta = 8; Double_t minEta = -0.8; diff --git a/PWGHF/hfe/AliAnalysisTaskHFE.cxx b/PWGHF/hfe/AliAnalysisTaskHFE.cxx index c0709fe0a25..de17fe98867 100644 --- a/PWGHF/hfe/AliAnalysisTaskHFE.cxx +++ b/PWGHF/hfe/AliAnalysisTaskHFE.cxx @@ -107,7 +107,7 @@ AliAnalysisTaskSE("PID efficiency Analysis") , fIdentifiedAsPileUp(kFALSE) , fIdentifiedAsOutInz(kFALSE) , fPassTheEventCut(kFALSE) - , fRejectKinkMother(kTRUE) + , fRejectKinkMother(kFALSE) , fisppMultiBin(kFALSE) , fPbPbUserCentralityBinning(kFALSE) , fRemoveFirstEvent(kFALSE) @@ -179,7 +179,7 @@ AliAnalysisTaskHFE::AliAnalysisTaskHFE(const char * name): , fIdentifiedAsPileUp(kFALSE) , fIdentifiedAsOutInz(kFALSE) , fPassTheEventCut(kFALSE) - , fRejectKinkMother(kTRUE) + , fRejectKinkMother(kFALSE) , fisppMultiBin(kFALSE) , fPbPbUserCentralityBinning(kFALSE) , fRemoveFirstEvent(kFALSE) @@ -663,7 +663,7 @@ void AliAnalysisTaskHFE::UserExec(Option_t *){ if(!mcH->TreeTR()) return; // Background subtraction------------------------------------------------------------------- - if(GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->SetMCEvent(fMCEvent); + if(GetPlugin(kNonPhotonicElectron)||GetPlugin(kNonPhotonicElectronBeauty)) fBackgroundSubtraction->SetMCEvent(fMCEvent); //------------------------------------------------------------------------------------------ } @@ -1020,7 +1020,7 @@ void AliAnalysisTaskHFE::ProcessESD(){ // Background subtraction------------------------------------------------------------------- - if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->FillPoolAssociatedTracks(fInputEvent, fCentralityF); + if (GetPlugin(kNonPhotonicElectron)||GetPlugin(kNonPhotonicElectronBeauty)) fBackgroundSubtraction->FillPoolAssociatedTracks(fInputEvent, fCentralityF); //------------------------------------------------------------------------------------------ // @@ -1267,7 +1267,7 @@ void AliAnalysisTaskHFE::ProcessESD(){ nElectronCandidates++; // Background subtraction------------------------------------------------------------------------------------------ - if (GetPlugin(kNonPhotonicElectron)) { + if (GetPlugin(kNonPhotonicElectron)&&!GetPlugin(kNonPhotonicElectronBeauty)) { Int_t indexmother = -1; Int_t mcsource = -1; Int_t mcQAsource = -1; @@ -1276,6 +1276,8 @@ void AliAnalysisTaskHFE::ProcessESD(){ mcsource = fBackgroundSubtraction->FindMother(mctrack->GetLabel(),indexmother); if(fBackgroundSubtraction->GetLevelBack()>=0) { if(fMCQA) { + fMCQA->SetCentrality(fCentralityF); + fMCQA->SetPercentrality(static_cast(fCentralityPercent)); mcQAsource = fMCQA->GetElecSource(mctrack, kTRUE); weightNonPhotonicFactor = TMath::Abs(fMCQA->GetWeightFactor(mctrack, fBackgroundSubtraction->GetLevelBack())); // positive:conversion e, negative: nonHFE } @@ -1489,10 +1491,30 @@ void AliAnalysisTaskHFE::ProcessESD(){ } } + // Background subtraction------------------------------------------------------------------------------------------ + if (!GetPlugin(kNonPhotonicElectron)&&GetPlugin(kNonPhotonicElectronBeauty)) { + Int_t indexmother = -1; + Int_t mcsource = -1; + Int_t mcQAsource = -1; + Double_t weightNonPhotonicFactor = 1.; + if(HasMCData()){ + mcsource = fBackgroundSubtraction->FindMother(mctrack->GetLabel(),indexmother); + if(fBackgroundSubtraction->GetLevelBack()>=0) { + if(fMCQA) { + fMCQA->SetCentrality(fCentralityF); + fMCQA->SetPercentrality(static_cast(fCentralityPercent)); + mcQAsource = fMCQA->GetElecSource(mctrack, kTRUE); + weightNonPhotonicFactor = TMath::Abs(fMCQA->GetWeightFactor(mctrack, fBackgroundSubtraction->GetLevelBack())); // positive:conversion e, negative: nonHFE + } + } + } + fBackgroundSubtraction->LookAtNonHFE(itrack, track, fInputEvent, weightNonPhotonicFactor, fCentralityF, -1, mcsource, indexmother,mcQAsource); + } + //----------------------------------------------------------------------------------------------------------------- } // Background subtraction------------------------------------------------------------------- - if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->CountPoolAssociated(fInputEvent, fCentralityF); + if (GetPlugin(kNonPhotonicElectron)||GetPlugin(kNonPhotonicElectronBeauty)) fBackgroundSubtraction->CountPoolAssociated(fInputEvent, fCentralityF); //------------------------------------------------------------------------------------------ fQACollection->Fill("nElectronTracksEvent", nElectronCandidates); @@ -1608,8 +1630,7 @@ void AliAnalysisTaskHFE::ProcessAOD(){ kinkmother=kFALSE; kinkdaughter=kFALSE; kinkstatus = 0.; - track = dynamic_cast(fAOD->GetTrack(itrack)); - if(!track) AliFatal("Not a standard AOD"); mctrack = NULL; + track = (AliAODTrack *) fAOD->GetTrack(itrack); mctrack = NULL; if(!track) continue; for(int ivx = 0; ivx < numberofmotherkink; ivx++){ @@ -1817,6 +1838,8 @@ void AliAnalysisTaskHFE::ProcessAOD(){ mcsource = fBackgroundSubtraction->FindMother(TMath::Abs(track->GetLabel()),indexmother); if(fBackgroundSubtraction->GetLevelBack()>=0) { if(fMCQA) { + fMCQA->SetCentrality(fCentralityF); + fMCQA->SetPercentrality(static_cast(fCentralityPercent)); mcQAsource = fMCQA->GetElecSource(mctrack, kTRUE); weightNonPhotonicFactor = TMath::Abs(fMCQA->GetWeightFactor(mctrack, fBackgroundSubtraction->GetLevelBack())); // positive:conversion e, negative: nonHFE //weightNonPhotonicFactor = TMath::Abs(fMCQA->GetWeightFactorForPrimaries(mctrack, fBackgroundSubtraction->GetLevelBack())); // positive:conversion e, negative: nonHFE @@ -1896,6 +1919,8 @@ void AliAnalysisTaskHFE::ProcessAOD(){ mcsource = fBackgroundSubtraction->FindMother(TMath::Abs(track->GetLabel()),indexmother); if(fBackgroundSubtraction->GetLevelBack()>=0) { if(fMCQA) { + fMCQA->SetCentrality(fCentralityF); + fMCQA->SetPercentrality(static_cast(fCentralityPercent)); mcQAsource = fMCQA->GetElecSource(mctrack, kTRUE); weightNonPhotonicFactor = TMath::Abs(fMCQA->GetWeightFactor(mctrack, fBackgroundSubtraction->GetLevelBack())); // positive:conversion e, negative: nonHFE } @@ -1922,6 +1947,7 @@ Bool_t AliAnalysisTaskHFE::ProcessMCtrack(AliVParticle *track){ // Works for AOD and MC analysis Type // fVarManager->NewTrack(track, NULL, fCentralityF, -1, kTRUE); + //printf("Is primary %d\n",((Int_t)track->IsPrimary())); Double_t vertex[3] = {0.,0.,0.}; // Production vertex cut to mask gammas which are NOT supposed to have hits in the first ITS layer(s) @@ -2136,9 +2162,9 @@ void AliAnalysisTaskHFE::InitHistoRadius(){ // Before const Int_t kNDim = 3; - const Int_t kNBins[kNDim] = {11, 35, 100}; + const Int_t kNBins[kNDim] = {11, 35, 25}; const Double_t kMin[kNDim] = {0,0.1,0.01}; - const Double_t kMax[kNDim] = {11,20.,500.}; + const Double_t kMax[kNDim] = {11,20.,25.}; fQACollection->CreateTHnSparse("RadiusBefore", "RadiusBefore; centrality; p_{T} (GeV/c);radius [cm]", kNDim, kNBins, kMin, kMax); fQACollection->BinLogAxis("RadiusBefore", 1); fQACollection->BinLogAxis("RadiusBefore", 2); diff --git a/PWGHF/hfe/AliHFENonPhotonicElectron.cxx b/PWGHF/hfe/AliHFENonPhotonicElectron.cxx index 7e77fc38813..08c72283b1d 100644 --- a/PWGHF/hfe/AliHFENonPhotonicElectron.cxx +++ b/PWGHF/hfe/AliHFENonPhotonicElectron.cxx @@ -47,6 +47,7 @@ #include "AliESDtrackCuts.h" #include "AliPIDResponse.h" #include "AliPID.h" +#include "AliStack.h" #include "AliKFParticle.h" #include "AliKFVertex.h" @@ -60,1166 +61,1315 @@ #include "AliHFENonPhotonicElectron.h" ClassImp(AliHFENonPhotonicElectron) -//________________________________________________________________________ -AliHFENonPhotonicElectron::AliHFENonPhotonicElectron(const char *name, const Char_t *title) - :TNamed (name, title) - ,fIsAOD (kFALSE) - ,fMCEvent (NULL) - ,fAODArrayMCInfo (NULL) - ,fLevelBack(-1) - ,fHFEBackgroundCuts (NULL) - ,fPIDBackground (0x0) - ,fPIDBackgroundQA (0) - ,fkPIDRespons (NULL) - ,fPtBinning() - ,fEtaBinning() - ,fAlgorithmMA (kTRUE) - ,fChi2OverNDFCut (3.0) - ,fMaxDCA (3.0) -// ,fMaxOpeningTheta (0.02) -// ,fMaxOpeningPhi (0.1) - ,fMaxOpening3D (TMath::Pi()) - ,fMaxInvMass (1000) - ,fSetMassConstraint (kFALSE) - ,fSelectCategory1tracks(kTRUE) - ,fSelectCategory2tracks(kFALSE) - ,fITSmeanShift(0.) - ,fITSnSigmaHigh(3.) - ,fITSnSigmaLow(-3.) - ,fminPt(0.1) - ,fArraytrack (NULL) - ,fCounterPoolBackground (0) - ,fnumberfound (0) - ,fListOutput (NULL) - ,fAssElectron (NULL) - ,fIncElectron (NULL) - ,fUSign (NULL) - ,fLSign (NULL) - ,fUSmatches(NULL) - ,fLSmatches(NULL) - ,fHnsigmaITS(NULL) - ,fWeightsSource(NULL) - ,fIncElectronRadius(NULL) - ,fRecElectronRadius(NULL) -// ,fUSignAngle (NULL) -// ,fLSignAngle (NULL) + //________________________________________________________________________ + AliHFENonPhotonicElectron::AliHFENonPhotonicElectron(const char *name, const Char_t *title) + :TNamed (name, title) + ,fIsAOD (kFALSE) + ,fMCEvent (NULL) + ,fAODArrayMCInfo (NULL) + ,fLevelBack(-1) + ,fHFEBackgroundCuts (NULL) + ,fPIDBackground (0x0) + ,fPIDBackgroundQA (0) + ,fkPIDRespons (NULL) + ,fPtBinning() + ,fEtaBinning() + ,fInvMassBinning() + ,fStudyRadius (kFALSE) + ,fAlgorithmMA (kTRUE) + ,fChi2OverNDFCut (3.0) + ,fMaxDCA (3.0) + // ,fMaxOpeningTheta (0.02) + // ,fMaxOpeningPhi (0.1) + ,fMaxOpening3D (TMath::Pi()) + ,fMaxInvMass (1000) + ,fSetMassConstraint (kFALSE) + ,fSelectCategory1tracks(kTRUE) + ,fSelectCategory2tracks(kFALSE) + ,fITSmeanShift(0.) + ,fITSnSigmaHigh(3.) + ,fITSnSigmaLow(-3.) + ,fminPt(0.1) + ,fEtaDalitzWeightFactor(1.0) + ,fArraytrack (NULL) + ,fCounterPoolBackground (0) + ,fnumberfound (0) + ,fListOutput (NULL) + ,fAssElectron (NULL) + ,fIncElectron (NULL) + ,fUSign (NULL) + ,fLSign (NULL) + ,fUSmatches(NULL) + ,fLSmatches(NULL) + ,fHnsigmaITS(NULL) + ,fWeightsSource(NULL) + ,fIncElectronRadius(NULL) + ,fRecElectronRadius(NULL) + // ,fUSignAngle (NULL) + // ,fLSignAngle (NULL) + ,fAnaPairGen(kFALSE) + ,fNumberofGenerations(1) + ,fDisplayMCStack(kFALSE) { - // - // Constructor - // - fPIDBackground = new AliHFEpid("hfePidBackground"); - fPIDBackgroundQA = new AliHFEpidQAmanager; + // + // Constructor + // + fPIDBackground = new AliHFEpid("hfePidBackground"); + fPIDBackgroundQA = new AliHFEpidQAmanager; } //________________________________________________________________________ -AliHFENonPhotonicElectron::AliHFENonPhotonicElectron() - :TNamed () - ,fIsAOD (kFALSE) - ,fMCEvent (NULL) - ,fAODArrayMCInfo (NULL) - ,fLevelBack(-1) - ,fHFEBackgroundCuts (NULL) - ,fPIDBackground (0x0) - ,fPIDBackgroundQA (0) - ,fkPIDRespons (NULL) - ,fPtBinning() - ,fEtaBinning() - ,fAlgorithmMA (kTRUE) - ,fChi2OverNDFCut (3.0) - ,fMaxDCA (3.0) -// ,fMaxOpeningTheta (0.02) -// ,fMaxOpeningPhi (0.1) - ,fMaxOpening3D (TMath::TwoPi()) - ,fMaxInvMass (1000) - ,fSetMassConstraint (kFALSE) - ,fSelectCategory1tracks(kTRUE) - ,fSelectCategory2tracks(kFALSE) - ,fITSmeanShift(0.) - ,fITSnSigmaHigh(3.) - ,fITSnSigmaLow(-3.) - ,fminPt(0.1) - ,fArraytrack (NULL) - ,fCounterPoolBackground (0) - ,fnumberfound (0) - ,fListOutput (NULL) - ,fAssElectron (NULL) - ,fIncElectron (NULL) - ,fUSign (NULL) - ,fLSign (NULL) - ,fUSmatches(NULL) - ,fLSmatches(NULL) - ,fHnsigmaITS(NULL) - ,fWeightsSource(NULL) - ,fIncElectronRadius(NULL) - ,fRecElectronRadius(NULL) -// ,fUSignAngle (NULL) -// ,fLSignAngle (NULL) + AliHFENonPhotonicElectron::AliHFENonPhotonicElectron() + :TNamed () + ,fIsAOD (kFALSE) + ,fMCEvent (NULL) + ,fAODArrayMCInfo (NULL) + ,fLevelBack(-1) + ,fHFEBackgroundCuts (NULL) + ,fPIDBackground (0x0) + ,fPIDBackgroundQA (0) + ,fkPIDRespons (NULL) + ,fPtBinning() + ,fEtaBinning() + ,fInvMassBinning() + ,fStudyRadius (kFALSE) + ,fAlgorithmMA (kTRUE) + ,fChi2OverNDFCut (3.0) + ,fMaxDCA (3.0) + // ,fMaxOpeningTheta (0.02) + // ,fMaxOpeningPhi (0.1) + ,fMaxOpening3D (TMath::TwoPi()) + ,fMaxInvMass (1000) + ,fSetMassConstraint (kFALSE) + ,fSelectCategory1tracks(kTRUE) + ,fSelectCategory2tracks(kFALSE) + ,fITSmeanShift(0.) + ,fITSnSigmaHigh(3.) + ,fITSnSigmaLow(-3.) + ,fminPt(0.1) + ,fEtaDalitzWeightFactor(1.0) + ,fArraytrack (NULL) + ,fCounterPoolBackground (0) + ,fnumberfound (0) + ,fListOutput (NULL) + ,fAssElectron (NULL) + ,fIncElectron (NULL) + ,fUSign (NULL) + ,fLSign (NULL) + ,fUSmatches(NULL) + ,fLSmatches(NULL) + ,fHnsigmaITS(NULL) + ,fWeightsSource(NULL) + ,fIncElectronRadius(NULL) + ,fRecElectronRadius(NULL) + // ,fUSignAngle (NULL) + // ,fLSignAngle (NULL) + ,fAnaPairGen(kFALSE) + ,fNumberofGenerations(1) + ,fDisplayMCStack(kFALSE) { - // - // Constructor - // - fPIDBackground = new AliHFEpid("hfePidBackground"); - fPIDBackgroundQA = new AliHFEpidQAmanager; + // + // Constructor + // + fPIDBackground = new AliHFEpid("hfePidBackground"); + fPIDBackgroundQA = new AliHFEpidQAmanager; } //________________________________________________________________________ -AliHFENonPhotonicElectron::AliHFENonPhotonicElectron(const AliHFENonPhotonicElectron &ref) - :TNamed(ref) - ,fIsAOD (ref.fIsAOD) - ,fMCEvent (NULL) - ,fAODArrayMCInfo (NULL) - ,fLevelBack (ref.fLevelBack) - ,fHFEBackgroundCuts (ref.fHFEBackgroundCuts) - ,fPIDBackground (ref.fPIDBackground) - ,fPIDBackgroundQA (ref.fPIDBackgroundQA) - ,fkPIDRespons (ref.fkPIDRespons) - ,fPtBinning(ref.fPtBinning) - ,fEtaBinning(ref.fEtaBinning) - ,fAlgorithmMA (ref.fAlgorithmMA) - ,fChi2OverNDFCut (ref.fChi2OverNDFCut) - ,fMaxDCA (ref.fMaxDCA) -// ,fMaxOpeningTheta (ref.fMaxOpeningTheta) -// ,fMaxOpeningPhi (ref.fMaxOpeningPhi) - ,fMaxOpening3D (ref.fMaxOpening3D) - ,fMaxInvMass (ref.fMaxInvMass) - ,fSetMassConstraint (ref.fSetMassConstraint) - ,fSelectCategory1tracks(ref.fSelectCategory1tracks) - ,fSelectCategory2tracks(ref.fSelectCategory2tracks) - ,fITSmeanShift(ref.fITSmeanShift) - ,fITSnSigmaHigh(ref.fITSnSigmaHigh) - ,fITSnSigmaLow(ref.fITSnSigmaLow) - ,fminPt(ref.fminPt) - ,fArraytrack (NULL) - ,fCounterPoolBackground (0) - ,fnumberfound (0) - ,fListOutput (ref.fListOutput) - ,fAssElectron (ref.fAssElectron) - ,fIncElectron (ref.fIncElectron) - ,fUSign (ref.fUSign) - ,fLSign (ref.fLSign) - ,fUSmatches(ref.fUSmatches) - ,fLSmatches(ref.fLSmatches) - ,fHnsigmaITS(ref.fHnsigmaITS) - ,fWeightsSource(ref.fWeightsSource) - ,fIncElectronRadius(ref.fIncElectronRadius) - ,fRecElectronRadius(ref.fRecElectronRadius) -// ,fUSignAngle (ref.fUSignAngle) -// ,fLSignAngle (ref.fLSignAngle) + AliHFENonPhotonicElectron::AliHFENonPhotonicElectron(const AliHFENonPhotonicElectron &ref) + :TNamed(ref) + ,fIsAOD (ref.fIsAOD) + ,fMCEvent (NULL) + ,fAODArrayMCInfo (NULL) + ,fLevelBack (ref.fLevelBack) + ,fHFEBackgroundCuts (ref.fHFEBackgroundCuts) + ,fPIDBackground (ref.fPIDBackground) + ,fPIDBackgroundQA (ref.fPIDBackgroundQA) + ,fkPIDRespons (ref.fkPIDRespons) + ,fPtBinning (ref.fPtBinning) + ,fEtaBinning (ref.fEtaBinning) + ,fInvMassBinning (ref.fInvMassBinning) + ,fStudyRadius (ref.fStudyRadius) + ,fAlgorithmMA (ref.fAlgorithmMA) + ,fChi2OverNDFCut (ref.fChi2OverNDFCut) + ,fMaxDCA (ref.fMaxDCA) + // ,fMaxOpeningTheta (ref.fMaxOpeningTheta) + // ,fMaxOpeningPhi (ref.fMaxOpeningPhi) + ,fMaxOpening3D (ref.fMaxOpening3D) + ,fMaxInvMass (ref.fMaxInvMass) + ,fSetMassConstraint (ref.fSetMassConstraint) + ,fSelectCategory1tracks(ref.fSelectCategory1tracks) + ,fSelectCategory2tracks(ref.fSelectCategory2tracks) + ,fITSmeanShift(ref.fITSmeanShift) + ,fITSnSigmaHigh(ref.fITSnSigmaHigh) + ,fITSnSigmaLow(ref.fITSnSigmaLow) + ,fminPt(ref.fminPt) + ,fEtaDalitzWeightFactor(ref.fEtaDalitzWeightFactor) + ,fArraytrack (NULL) + ,fCounterPoolBackground (0) + ,fnumberfound (0) + ,fListOutput (ref.fListOutput) + ,fAssElectron (ref.fAssElectron) + ,fIncElectron (ref.fIncElectron) + ,fUSign (ref.fUSign) + ,fLSign (ref.fLSign) + ,fUSmatches(ref.fUSmatches) + ,fLSmatches(ref.fLSmatches) + ,fHnsigmaITS(ref.fHnsigmaITS) + ,fWeightsSource(ref.fWeightsSource) + ,fIncElectronRadius(ref.fIncElectronRadius) + ,fRecElectronRadius(ref.fRecElectronRadius) + // ,fUSignAngle (ref.fUSignAngle) + // ,fLSignAngle (ref.fLSignAngle) + ,fAnaPairGen(kFALSE) + ,fNumberofGenerations(1) + ,fDisplayMCStack(kFALSE) { - // - // Copy Constructor - // - ref.Copy(*this); + // + // Copy Constructor + // + ref.Copy(*this); } //____________________________________________________________ AliHFENonPhotonicElectron &AliHFENonPhotonicElectron::operator=(const AliHFENonPhotonicElectron &ref){ - // - // Assignment operator - // - if(this == &ref) ref.Copy(*this); - return *this; + // + // Assignment operator + // + if(this == &ref) ref.Copy(*this); + return *this; } //_________________________________________ AliHFENonPhotonicElectron::~AliHFENonPhotonicElectron() { - // - // Destructor - // - if(fArraytrack) delete fArraytrack; - //if(fHFEBackgroundCuts) delete fHFEBackgroundCuts; - if(fPIDBackground) delete fPIDBackground; - if(fPIDBackgroundQA) delete fPIDBackgroundQA; + // + // Destructor + // + if(fArraytrack) delete fArraytrack; + //if(fHFEBackgroundCuts) delete fHFEBackgroundCuts; + if(fPIDBackground) delete fPIDBackground; + if(fPIDBackgroundQA) delete fPIDBackgroundQA; } //_____________________________________________________________________________________________ void AliHFENonPhotonicElectron::Init() { - // - // Init - // - - //printf("Analysis Mode for AliHFENonPhotonicElectron: %s Analysis\n", fIsAOD ? "AOD" : "ESD"); - - if(!fListOutput) fListOutput = new TList; - fListOutput->SetName("HFENonPhotonicElectron"); - fListOutput->SetOwner(); - - if(!fHFEBackgroundCuts) fHFEBackgroundCuts = new AliHFEcuts(); - if(fIsAOD) fHFEBackgroundCuts->SetAOD(); - fHFEBackgroundCuts->Initialize(); - if(fHFEBackgroundCuts->IsQAOn()) { - fListOutput->Add(fHFEBackgroundCuts->GetQAhistograms()); - } - - // Initialize PID - if(!fPIDBackground) fPIDBackground = new AliHFEpid("default pid"); - if(fMCEvent || fAODArrayMCInfo) fPIDBackground->SetHasMCData(kTRUE); // does nothing since the fMCEvent are set afterwards at the moment - if(!fPIDBackground->GetNumberOfPIDdetectors()) - { - //fPIDBackground->AddDetector("TOF", 0); - fPIDBackground->AddDetector("TPC", 0); - } - AliInfo("PID Background QA switched on"); - fPIDBackgroundQA->Initialize(fPIDBackground); - fListOutput->Add(fPIDBackgroundQA->MakeList("HFENP_PID_Background")); - fPIDBackground->SortDetectors(); - - const Int_t kBinsPtDefault = 35; - Double_t binLimPtDefault[kBinsPtDefault+1] = {0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1., 1.1, 1.2, 1.3, 1.4, 1.5, 1.75, 2., 2.25, 2.5, 2.75, 3., 3.5, 4., 4.5, 5., 5.5, 6., 7., 8., 10., 12., 14., 16., 18., 20.}; - const Int_t kBinsEtaInclusiveDefault = 8; - Double_t binLimEtaInclusiveDefault[kBinsEtaInclusiveDefault+1] = {-0.8, -0.6, -0.4, -0.2, 0., 0.2, 0.4, 0.6, 0.8}; - const Int_t kBinsEtaAssociated = 15; - Double_t binLimEtaAssociat[kBinsEtaAssociated+1] = {-1.5,-1.3,-1.1,-0.9,-0.7,-0.5,-0.3,-0.1,0.1,0.3,0.5,0.7,0.9,1.1,1.3,1.5}; - - if(!fPtBinning.GetSize()) fPtBinning.Set(kBinsPtDefault+1, binLimPtDefault); - if(!fEtaBinning.GetSize()) fEtaBinning.Set(kBinsEtaInclusiveDefault+1, binLimEtaInclusiveDefault); - - //Int_t nBinsP = 400; - //Double_t minP = 0.0; - //Double_t maxP = 20.0; - //Double_t binLimP[nBinsP+1]; - //for(Int_t i=0; i<=nBinsP; i++) binLimP[i]=(Double_t)minP + (maxP-minP)/nBinsP*(Double_t)i ; - - Int_t nBinsC = 11; - Double_t minC = 0.0; - Double_t maxC = 11.0; - Double_t binLimC[nBinsC+1]; - for(Int_t i=0; i<=nBinsC; i++) binLimC[i]=(Double_t)minC + (maxC-minC)/nBinsC*(Double_t)i ; - - Int_t nBinsSource = 10; - Double_t minSource = 0.; - Double_t maxSource = 10.; - Double_t binLimSource[nBinsSource+1]; - for(Int_t i=0; i<=nBinsSource; i++) binLimSource[i]=(Double_t)minSource + (maxSource-minSource)/nBinsSource*(Double_t)i ; - - Int_t nBinsInvMass = 30; - Double_t minInvMass = 0.; - Double_t maxInvMass = 0.3; - Double_t binLimInvMass[nBinsInvMass+1]; - for(Int_t i=0; i<=nBinsInvMass; i++) binLimInvMass[i]=(Double_t)minInvMass + (maxInvMass-minInvMass)/nBinsInvMass*(Double_t)i ; - - Int_t nBinsPhi = 8; - Double_t minPhi = 0.0; - Double_t maxPhi = TMath::Pi(); - Double_t binLimPhi[nBinsPhi+1]; - for(Int_t i=0; i<=nBinsPhi; i++) - { - binLimPhi[i]=(Double_t)minPhi + (maxPhi-minPhi)/nBinsPhi*(Double_t)i ; - AliDebug(2,Form("bin phi is %f for %d",binLimPhi[i],i)); - } - - Int_t nBinsAngle = 72; - Double_t minAngle = 0.0; - Double_t maxAngle = 0.4; - Double_t binLimAngle[nBinsAngle+1]; - for(Int_t i=0; i<=nBinsAngle; i++) - { - binLimAngle[i]=(Double_t)minAngle + (maxAngle-minAngle)/nBinsAngle*(Double_t)i ; - AliDebug(2,Form("bin phi is %f for %d",binLimAngle[i],i)); - } - - // Constrain histograms - const Int_t nDimSingle=4; - const Int_t nDimPair=9; - Int_t nBinPair[nDimPair] = {nBinsPhi,nBinsC,fPtBinning.GetSize()-1,nBinsInvMass,nBinsSource,nBinsAngle,fPtBinning.GetSize()-1,fEtaBinning.GetSize()-1,kBinsEtaAssociated}; - - // Associated Electron - Int_t nBinAssElectron[nDimSingle] = {nBinsC,fPtBinning.GetSize()-1,nBinsSource,kBinsEtaAssociated}; - fAssElectron = new THnSparseF("fAssElectron","fAssElectron",nDimSingle,nBinAssElectron); - fAssElectron->SetBinEdges(0,binLimC); - fAssElectron->SetBinEdges(1,fPtBinning.GetArray()); - fAssElectron->SetBinEdges(2,binLimSource); - fAssElectron->SetBinEdges(3,binLimEtaAssociat); - fAssElectron->Sumw2(); - AliDebug(2,"AliHFENonPhotonicElectron: fAssElectron"); - - // Inclusive Electron - Int_t nBinIncElectron[nDimSingle] = {nBinsC,fPtBinning.GetSize()-1,nBinsSource,fEtaBinning.GetSize()-1}; - fIncElectron = new THnSparseF("fIncElectron","fIncElectron",nDimSingle,nBinIncElectron); - fIncElectron->SetBinEdges(0,binLimC); - fIncElectron->SetBinEdges(1,fPtBinning.GetArray()); - fIncElectron->SetBinEdges(2,binLimSource); - fIncElectron->SetBinEdges(3,fEtaBinning.GetArray()); - fIncElectron->Sumw2(); - AliDebug(2,"AliHFENonPhotonicElectron: fIncElectron"); - - // ee invariant mass Unlike Sign - fUSign = new THnSparseF("fUSign","fUSign",nDimPair,nBinPair); - fUSign->SetBinEdges(0,binLimPhi); - fUSign->SetBinEdges(1,binLimC); - fUSign->SetBinEdges(2,fPtBinning.GetArray()); - fUSign->SetBinEdges(3,binLimInvMass); - fUSign->SetBinEdges(4,binLimSource); - fUSign->SetBinEdges(5,binLimAngle); - fUSign->SetBinEdges(6,fPtBinning.GetArray()); - fUSign->SetBinEdges(7,fEtaBinning.GetArray()); - fUSign->SetBinEdges(8,binLimEtaAssociat); - fUSign->Sumw2(); - AliDebug(2,"AliHFENonPhotonicElectron: fUSign"); - - // ee invariant mass Like Sign - fLSign = new THnSparseF("fLSign","fLSign",nDimPair,nBinPair); - fLSign->SetBinEdges(0,binLimPhi); - fLSign->SetBinEdges(1,binLimC); - fLSign->SetBinEdges(2,fPtBinning.GetArray()); - fLSign->SetBinEdges(3,binLimInvMass); - fLSign->SetBinEdges(4,binLimSource); - fLSign->SetBinEdges(5,binLimAngle); - fLSign->SetBinEdges(6,fPtBinning.GetArray()); - fLSign->SetBinEdges(7,fEtaBinning.GetArray()); - fLSign->SetBinEdges(8,binLimEtaAssociat); - fLSign->Sumw2(); - AliDebug(2,"AliHFENonPhotonicElectron: fLSign"); - - // Histograms counting the number of like sign / unlike sign matches per inclusive track - const Int_t nBinsMatches = 50; - Double_t binLimMatches[nBinsMatches+1]; - for(int ib = 0; ib <= nBinsMatches; ib++) binLimMatches[ib] = ib; - const Int_t nDimMatches = 3; // centrality, pt_inc, number of matches - const Int_t nBinsMatchHist[nDimMatches] = {nBinsC, fPtBinning.GetSize()-1, nBinsMatches}; - fUSmatches = new THnSparseF("fUSmatches", "fUSmatches", nDimMatches, nBinsMatchHist); - fUSmatches->SetBinEdges(0,binLimC); - fUSmatches->SetBinEdges(1,fPtBinning.GetArray()); - fUSmatches->SetBinEdges(2,binLimMatches); - - fLSmatches = new THnSparseF("fLSmatches", "fLSmatches", nDimMatches, nBinsMatchHist); - fLSmatches->SetBinEdges(0,binLimC); - fLSmatches->SetBinEdges(1,fPtBinning.GetArray()); - fLSmatches->SetBinEdges(2,binLimMatches); - - // Histograms for radius studies - Int_t nBinsradius = 50; - Double_t minradius = 0.0; - Double_t maxradius = 100.0; - Double_t binLimradius[nBinsradius+1]; - for(Int_t i=0; i<=nBinsradius; i++) binLimradius[i]=(Double_t)minradius + (maxradius-minradius)/nBinsradius*(Double_t)i ; - const Int_t nDimIncElectronRadius = 4; // centrality, pt_inc, radius - const Int_t nBinsIncElectronRadius[nDimIncElectronRadius] = {nBinsC, fPtBinning.GetSize()-1, nBinsradius, nBinsSource}; - fIncElectronRadius = new THnSparseF("fIncElectronRadius", "fIncElectronRadius", nDimIncElectronRadius, nBinsIncElectronRadius); - fIncElectronRadius->SetBinEdges(0,binLimC); - fIncElectronRadius->SetBinEdges(1,fPtBinning.GetArray()); - fIncElectronRadius->SetBinEdges(2,binLimradius); - fIncElectronRadius->SetBinEdges(3,binLimSource); - - fRecElectronRadius = new THnSparseF("fRecElectronRadius", "fRecElectronRadius", nDimIncElectronRadius, nBinsIncElectronRadius); - fRecElectronRadius->SetBinEdges(0,binLimC); - fRecElectronRadius->SetBinEdges(1,fPtBinning.GetArray()); - fRecElectronRadius->SetBinEdges(2,binLimradius); - fRecElectronRadius->SetBinEdges(2,binLimSource); - -/* - // ee angle Unlike Sign - const Int_t nDimUSignAngle=3; - Int_t nBinUSignAngle[nDimUSignAngle] = {nBinsAngle,nBinsC,nBinsSource}; - fUSignAngle = new THnSparseF("fUSignAngle","fUSignAngle",nDimUSignAngle,nBinUSignAngle); - fUSignAngle->SetBinEdges(0,binLimAngle); - fUSignAngle->SetBinEdges(1,binLimC); - fUSignAngle->SetBinEdges(2,binLimSource); - fUSignAngle->Sumw2(); - AliDebug(2,"AliHFENonPhotonicElectron: fUSignAngle"); - - // ee angle Like Sign - const Int_t nDimLSignAngle=3; - Int_t nBinLSignAngle[nDimLSignAngle] = {nBinsAngle,nBinsC,nBinsSource}; - fLSignAngle = new THnSparseF("fLSignAngle","fLSignAngle",nDimLSignAngle,nBinLSignAngle); - fLSignAngle->SetBinEdges(0,binLimAngle); - fLSignAngle->SetBinEdges(1,binLimC); - fLSignAngle->SetBinEdges(2,binLimSource); - fLSignAngle->Sumw2(); - AliDebug(2,"AliHFENonPhotonicElectron: fLSignAngle"); -*/ - - // control histogram for ITS PID - fHnsigmaITS = new TH2F("fHnsigmaITS", "Number of sigmas in the ITS", 30, 0., 0.3, 1200, -10., 10.); - - // control histogram for weights sources - fWeightsSource = new TH2F("fWeightsSource", "Source code for weights", 11, -1.5, 9.5, 29, -1.5, 27.5); - - fListOutput->Add(fAssElectron); - fListOutput->Add(fIncElectron); - fListOutput->Add(fUSign); - fListOutput->Add(fLSign); - fListOutput->Add(fUSmatches); - fListOutput->Add(fLSmatches); - fListOutput->Add(fHnsigmaITS); - fListOutput->Add(fWeightsSource); - fListOutput->Add(fIncElectronRadius); - fListOutput->Add(fRecElectronRadius); -// fListOutput->Add(fUSignAngle); -// fListOutput->Add(fLSignAngle); + // + // Init + // + + //printf("Analysis Mode for AliHFENonPhotonicElectron: %s Analysis\n", fIsAOD ? "AOD" : "ESD"); + + if(!fListOutput) fListOutput = new TList; + fListOutput->SetName("HFENonPhotonicElectron"); + fListOutput->SetOwner(); + + if(!fHFEBackgroundCuts) fHFEBackgroundCuts = new AliHFEcuts(); + if(fIsAOD) fHFEBackgroundCuts->SetAOD(); + fHFEBackgroundCuts->Initialize(); + if(fHFEBackgroundCuts->IsQAOn()) { + fListOutput->Add(fHFEBackgroundCuts->GetQAhistograms()); + } + + // Initialize PID + if(!fPIDBackground) fPIDBackground = new AliHFEpid("default pid"); + if(fMCEvent || fAODArrayMCInfo) fPIDBackground->SetHasMCData(kTRUE); // does nothing since the fMCEvent are set afterwards at the moment + if(!fPIDBackground->GetNumberOfPIDdetectors()) + { + //fPIDBackground->AddDetector("TOF", 0); + fPIDBackground->AddDetector("TPC", 0); + } + AliInfo("PID Background QA switched on"); + fPIDBackgroundQA->Initialize(fPIDBackground); + fListOutput->Add(fPIDBackgroundQA->MakeList("HFENP_PID_Background")); + fPIDBackground->SortDetectors(); + + const Int_t kBinsPtDefault = 35; + Double_t binLimPtDefault[kBinsPtDefault+1] = {0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1., 1.1, 1.2, 1.3, 1.4, 1.5, 1.75, 2., 2.25, 2.5, 2.75, 3., 3.5, 4., 4.5, 5., 5.5, 6., 7., 8., 10., 12., 14., 16., 18., 20.}; + const Int_t kBinsEtaInclusiveDefault = 8; + Double_t binLimEtaInclusiveDefault[kBinsEtaInclusiveDefault+1] = {-0.8, -0.6, -0.4, -0.2, 0., 0.2, 0.4, 0.6, 0.8}; + const Int_t kBinsEtaAssociated = 15; + Double_t binLimEtaAssociat[kBinsEtaAssociated+1] = {-1.5,-1.3,-1.1,-0.9,-0.7,-0.5,-0.3,-0.1,0.1,0.3,0.5,0.7,0.9,1.1,1.3,1.5}; + + if(!fPtBinning.GetSize()) fPtBinning.Set(kBinsPtDefault+1, binLimPtDefault); + if(!fEtaBinning.GetSize()) fEtaBinning.Set(kBinsEtaInclusiveDefault+1, binLimEtaInclusiveDefault); + + //Int_t nBinsP = 400; + //Double_t minP = 0.0; + //Double_t maxP = 20.0; + //Double_t binLimP[nBinsP+1]; + //for(Int_t i=0; i<=nBinsP; i++) binLimP[i]=(Double_t)minP + (maxP-minP)/nBinsP*(Double_t)i ; + + Int_t nBinsC = 11; + Double_t minC = 0.0; + Double_t maxC = 11.0; + Double_t binLimC[nBinsC+1]; + for(Int_t i=0; i<=nBinsC; i++) binLimC[i]=(Double_t)minC + (maxC-minC)/nBinsC*(Double_t)i ; + + Int_t nBinsSource = 12; + Double_t minSource = 0.; + Double_t maxSource = 12.; + Double_t binLimSource[nBinsSource+1]; + for(Int_t i=0; i<=nBinsSource; i++) binLimSource[i]=(Double_t)minSource + (maxSource-minSource)/nBinsSource*(Double_t)i ; + + Int_t nBinsInvMass = 30; + Double_t minInvMass = 0.; + Double_t maxInvMass = 0.3; + Double_t binLimInvMass[nBinsInvMass+1]; + for(Int_t i=0; i<=nBinsInvMass; i++) binLimInvMass[i]=(Double_t)minInvMass + (maxInvMass-minInvMass)/nBinsInvMass*(Double_t)i ; + if(!fInvMassBinning.GetSize()) fInvMassBinning.Set(nBinsInvMass+1, binLimInvMass); + + Int_t nBinsPhi = 8; + Double_t minPhi = 0.0; + Double_t maxPhi = TMath::Pi(); + Double_t binLimPhi[nBinsPhi+1]; + for(Int_t i=0; i<=nBinsPhi; i++) + { + binLimPhi[i]=(Double_t)minPhi + (maxPhi-minPhi)/nBinsPhi*(Double_t)i ; + AliDebug(2,Form("bin phi is %f for %d",binLimPhi[i],i)); + } + + //now used for pair generation + Int_t nBinsGen = fNumberofGenerations; + Double_t minGen = 0; + Double_t maxGen = fNumberofGenerations; + Double_t binLimGen[nBinsGen+1]; + for(Int_t i=0; i<=nBinsGen; i++) + { + binLimGen[i]=(Double_t)minGen + (maxGen-minGen)/nBinsGen*(Double_t)i ; + AliDebug(2,Form("bin Generation is %f for %d",binLimGen[i],i)); + } + + // Constrain histograms + const Int_t nDimSingle=4; + const Int_t nDimPair=9; + Int_t nBinPair[nDimPair] = {nBinsPhi,nBinsC,fPtBinning.GetSize()-1,fInvMassBinning.GetSize()-1,nBinsSource,nBinsGen,fPtBinning.GetSize()-1,fEtaBinning.GetSize()-1,kBinsEtaAssociated}; + + // Associated Electron + Int_t nBinAssElectron[nDimSingle] = {nBinsC,fPtBinning.GetSize()-1,nBinsSource,kBinsEtaAssociated}; + fAssElectron = new THnSparseF("fAssElectron","fAssElectron",nDimSingle,nBinAssElectron); + fAssElectron->SetBinEdges(0,binLimC); + fAssElectron->SetBinEdges(1,fPtBinning.GetArray()); + fAssElectron->SetBinEdges(2,binLimSource); + fAssElectron->SetBinEdges(3,binLimEtaAssociat); + fAssElectron->Sumw2(); + AliDebug(2,"AliHFENonPhotonicElectron: fAssElectron"); + + // Inclusive Electron + Int_t nBinIncElectron[nDimSingle] = {nBinsC,fPtBinning.GetSize()-1,nBinsSource,fEtaBinning.GetSize()-1}; + fIncElectron = new THnSparseF("fIncElectron","fIncElectron",nDimSingle,nBinIncElectron); + fIncElectron->SetBinEdges(0,binLimC); + fIncElectron->SetBinEdges(1,fPtBinning.GetArray()); + fIncElectron->SetBinEdges(2,binLimSource); + fIncElectron->SetBinEdges(3,fEtaBinning.GetArray()); + fIncElectron->Sumw2(); + AliDebug(2,"AliHFENonPhotonicElectron: fIncElectron"); + + // ee invariant mass Unlike Sign + fUSign = new THnSparseF("fUSign","fUSign",nDimPair,nBinPair); + fUSign->SetBinEdges(0,binLimPhi); + fUSign->SetBinEdges(1,binLimC); + fUSign->SetBinEdges(2,fPtBinning.GetArray()); + fUSign->SetBinEdges(3,fInvMassBinning.GetArray()); + fUSign->SetBinEdges(4,binLimSource); + fUSign->SetBinEdges(5,binLimGen); + fUSign->SetBinEdges(6,fPtBinning.GetArray()); + fUSign->SetBinEdges(7,fEtaBinning.GetArray()); + fUSign->SetBinEdges(8,binLimEtaAssociat); + fUSign->Sumw2(); + AliDebug(2,"AliHFENonPhotonicElectron: fUSign"); + + // ee invariant mass Like Sign + fLSign = new THnSparseF("fLSign","fLSign",nDimPair,nBinPair); + fLSign->SetBinEdges(0,binLimPhi); + fLSign->SetBinEdges(1,binLimC); + fLSign->SetBinEdges(2,fPtBinning.GetArray()); + fLSign->SetBinEdges(3,fInvMassBinning.GetArray()); + fLSign->SetBinEdges(4,binLimSource); + fLSign->SetBinEdges(5,binLimGen); + fLSign->SetBinEdges(6,fPtBinning.GetArray()); + fLSign->SetBinEdges(7,fEtaBinning.GetArray()); + fLSign->SetBinEdges(8,binLimEtaAssociat); + fLSign->Sumw2(); + AliDebug(2,"AliHFENonPhotonicElectron: fLSign"); + + // Histograms counting the number of like sign / unlike sign matches per inclusive track + const Int_t nBinsMatches = 50; + Double_t binLimMatches[nBinsMatches+1]; + for(Int_t ib = 0; ib <= nBinsMatches; ib++) binLimMatches[ib] = ib; + const Int_t nDimMatches = 3; // centrality, pt_inc, number of matches + const Int_t nBinsMatchHist[nDimMatches] = {nBinsC, fPtBinning.GetSize()-1, nBinsMatches}; + fUSmatches = new THnSparseF("fUSmatches", "fUSmatches", nDimMatches, nBinsMatchHist); + fUSmatches->SetBinEdges(0,binLimC); + fUSmatches->SetBinEdges(1,fPtBinning.GetArray()); + fUSmatches->SetBinEdges(2,binLimMatches); + + fLSmatches = new THnSparseF("fLSmatches", "fLSmatches", nDimMatches, nBinsMatchHist); + fLSmatches->SetBinEdges(0,binLimC); + fLSmatches->SetBinEdges(1,fPtBinning.GetArray()); + fLSmatches->SetBinEdges(2,binLimMatches); + + // Histograms for radius studies + Int_t nBinsradius = 13; + Double_t minradius = 0.0; + Double_t maxradius = 25.0; + Double_t binLimradius[nBinsradius+1]; + for(Int_t i=0; i<=nBinsradius; i++) binLimradius[i]=(Double_t)minradius + (maxradius-minradius)/nBinsradius*(Double_t)i ; + const Int_t nDimIncElectronRadius = 4; // centrality, pt_inc, radius + const Int_t nBinsIncElectronRadius[nDimIncElectronRadius] = {nBinsC, fPtBinning.GetSize()-1, nBinsradius, nBinsSource}; + fIncElectronRadius = new THnSparseF("fIncElectronRadius", "fIncElectronRadius", nDimIncElectronRadius, nBinsIncElectronRadius); + fIncElectronRadius->SetBinEdges(0,binLimC); + fIncElectronRadius->SetBinEdges(1,fPtBinning.GetArray()); + fIncElectronRadius->SetBinEdges(2,binLimradius); + fIncElectronRadius->SetBinEdges(3,binLimSource); + fIncElectronRadius->Sumw2(); + + fRecElectronRadius = new THnSparseF("fRecElectronRadius", "fRecElectronRadius", nDimIncElectronRadius, nBinsIncElectronRadius); + fRecElectronRadius->SetBinEdges(0,binLimC); + fRecElectronRadius->SetBinEdges(1,fPtBinning.GetArray()); + fRecElectronRadius->SetBinEdges(2,binLimradius); + fRecElectronRadius->SetBinEdges(3,binLimSource); + fRecElectronRadius->Sumw2(); + + /* + // ee angle Unlike Sign + const Int_t nDimUSignAngle=3; + Int_t nBinUSignAngle[nDimUSignAngle] = {nBinsAngle,nBinsC,nBinsSource}; + fUSignAngle = new THnSparseF("fUSignAngle","fUSignAngle",nDimUSignAngle,nBinUSignAngle); + fUSignAngle->SetBinEdges(0,binLimAngle); + fUSignAngle->SetBinEdges(1,binLimC); + fUSignAngle->SetBinEdges(2,binLimSource); + fUSignAngle->Sumw2(); + AliDebug(2,"AliHFENonPhotonicElectron: fUSignAngle"); + + // ee angle Like Sign + const Int_t nDimLSignAngle=3; + Int_t nBinLSignAngle[nDimLSignAngle] = {nBinsAngle,nBinsC,nBinsSource}; + fLSignAngle = new THnSparseF("fLSignAngle","fLSignAngle",nDimLSignAngle,nBinLSignAngle); + fLSignAngle->SetBinEdges(0,binLimAngle); + fLSignAngle->SetBinEdges(1,binLimC); + fLSignAngle->SetBinEdges(2,binLimSource); + fLSignAngle->Sumw2(); + AliDebug(2,"AliHFENonPhotonicElectron: fLSignAngle"); + */ + + // control histogram for ITS PID + fHnsigmaITS = new TH2F("fHnsigmaITS", "Number of sigmas in the ITS", 30, 0., 0.3, 1200, -10., 10.); + + // control histogram for weights sources + fWeightsSource = new TH2F("fWeightsSource", "Source code for weights", 13, -1.5, 11.5, 29, -1.5, 27.5); + + fListOutput->Add(fAssElectron); + fListOutput->Add(fIncElectron); + fListOutput->Add(fUSign); + fListOutput->Add(fLSign); + fListOutput->Add(fUSmatches); + fListOutput->Add(fLSmatches); + fListOutput->Add(fHnsigmaITS); + fListOutput->Add(fWeightsSource); + fListOutput->Add(fIncElectronRadius); + fListOutput->Add(fRecElectronRadius); + // fListOutput->Add(fUSignAngle); + // fListOutput->Add(fLSignAngle); } //_____________________________________________________________________________________________ void AliHFENonPhotonicElectron::SetWithWeights(Int_t levelBack) { - // - // Init the HFE level - // - if(levelBack >= 0) fLevelBack = levelBack; + // + // Init the HFE level + // + if(levelBack >= 0) fLevelBack = levelBack; } //_____________________________________________________________________________________________ void AliHFENonPhotonicElectron::SetMCEvent(AliMCEvent *mcEvent) { - // - // Pass the mcEvent - // - - fMCEvent = mcEvent; - + // + // Pass the mcEvent + // + + fMCEvent = mcEvent; + } //_____________________________________________________________________________________________ void AliHFENonPhotonicElectron::SetAODArrayMCInfo(TClonesArray *aodArrayMCInfo) { - // - // Pass the mcEvent info - // + // + // Pass the mcEvent info + // + + fAODArrayMCInfo = aodArrayMCInfo; - fAODArrayMCInfo = aodArrayMCInfo; - } //_____________________________________________________________________________________________ void AliHFENonPhotonicElectron::InitRun(const AliVEvent *inputEvent,const AliPIDResponse *pidResponse) { - // - // Init run - // - - if(!pidResponse) - { - AliDebug(1, "Using default PID Response"); - Bool_t hasmc = kFALSE; - if(fMCEvent || fAODArrayMCInfo) hasmc=kTRUE; - pidResponse = AliHFEtools::GetDefaultPID(hasmc, inputEvent->IsA() == AliESDEvent::Class()); - } - - if(!fPIDBackground) return; - fPIDBackground->SetPIDResponse(pidResponse); - - if(!fPIDBackground->IsInitialized()) - { - // Initialize PID with the given run number - fPIDBackground->InitializePID(inputEvent->GetRunNumber()); - } + // + // Init run + // + + if(!pidResponse) + { + AliDebug(1, "Using default PID Response"); + Bool_t hasmc = kFALSE; + if(fMCEvent || fAODArrayMCInfo) hasmc=kTRUE; + pidResponse = AliHFEtools::GetDefaultPID(hasmc, inputEvent->IsA() == AliESDEvent::Class()); + } + + if(!fPIDBackground) return; + fPIDBackground->SetPIDResponse(pidResponse); + + if(!fPIDBackground->IsInitialized()) + { + // Initialize PID with the given run number + fPIDBackground->InitializePID(inputEvent->GetRunNumber()); + } } //_____________________________________________________________________________________________ Int_t AliHFENonPhotonicElectron::FillPoolAssociatedTracks(AliVEvent *inputEvent, Int_t binct) { - // - // Fill the pool of associated tracks - // Return the number of associated tracks - // - - fnumberfound = 0; - - fHFEBackgroundCuts->SetRecEvent(inputEvent); - Int_t nbtracks = inputEvent->GetNumberOfTracks(); - - if( fArraytrack ){ - fArraytrack->~TArrayI(); - new(fArraytrack) TArrayI(nbtracks); - } else { - fArraytrack = new TArrayI(nbtracks); - } - - fCounterPoolBackground = 0; - - Bool_t isSelected(kFALSE); - Bool_t isAOD = (dynamic_cast(inputEvent) != NULL); - AliDebug(2, Form("isAOD: %s", isAOD ? "yes" : "no")); - for(Int_t k = 0; k < nbtracks; k++) { - AliVTrack *track = (AliVTrack *) inputEvent->GetTrack(k); - if(!track) continue; - // - isSelected = kFALSE; - if(fSelectCategory1tracks && FilterCategory1Track(track, isAOD, binct)) isSelected = kTRUE; - else if(fSelectCategory2tracks && FilterCategory2Track(track, isAOD)) isSelected = kTRUE; - - if(isSelected){ - AliDebug(2,Form("fCounterPoolBackground %d, track %d",fCounterPoolBackground,k)); - fArraytrack->AddAt(k,fCounterPoolBackground); - fCounterPoolBackground++; + // Fill the pool of associated tracks + // Return the number of associated tracks + // + + fnumberfound = 0; + + fHFEBackgroundCuts->SetRecEvent(inputEvent); + Int_t nbtracks = inputEvent->GetNumberOfTracks(); + + if( fArraytrack ){ + fArraytrack->~TArrayI(); + new(fArraytrack) TArrayI(nbtracks); + } else { + fArraytrack = new TArrayI(nbtracks); } - } // loop tracks - //printf(Form("Associated Pool: Tracks %d, fCounterPoolBackground %d \n", nbtracks, fCounterPoolBackground)); + fCounterPoolBackground = 0; + + Bool_t isSelected(kFALSE); + Bool_t isAOD = (dynamic_cast(inputEvent) != NULL); + AliDebug(2, Form("isAOD: %s", isAOD ? "yes" : "no")); + for(Int_t k = 0; k < nbtracks; k++) { + AliVTrack *track = (AliVTrack *) inputEvent->GetTrack(k); + if(!track) continue; + + // + isSelected = kFALSE; + if(fSelectCategory1tracks && FilterCategory1Track(track, isAOD, binct)) isSelected = kTRUE; + else if(fSelectCategory2tracks && FilterCategory2Track(track, isAOD)) isSelected = kTRUE; + + if(isSelected){ + AliDebug(2,Form("fCounterPoolBackground %d, track %d",fCounterPoolBackground,k)); + fArraytrack->AddAt(k,fCounterPoolBackground); + fCounterPoolBackground++; + } + } // loop tracks + + //printf(Form("Associated Pool: Tracks %d, fCounterPoolBackground %d \n", nbtracks, fCounterPoolBackground)); - return fCounterPoolBackground; + return fCounterPoolBackground; } //_____________________________________________________________________________________________ Int_t AliHFENonPhotonicElectron::CountPoolAssociated(AliVEvent *inputEvent, Int_t binct) { - // - // Count the pool of assiocated tracks - // + // + // Count the pool of assiocated tracks + // - if(fnumberfound > 0) //!count only events with an inclusive electron - { - Double_t valueAssElectron[4] = { (Double_t)binct, -1, -1}; //Centrality Pt Source - Int_t iTrack2 = 0; - Int_t indexmother2 = -1; - AliVTrack *track2 = 0x0; + if(fnumberfound > 0) //!count only events with an inclusive electron + { + Double_t valueAssElectron[4] = {(Double_t) binct, -1, -1}; //Centrality Pt Source + Int_t iTrack2 = 0; + Int_t indexmother2 = -1; + AliVTrack *track2 = 0x0; - for(Int_t ii = 0; ii < fCounterPoolBackground; ii++){ - iTrack2 = fArraytrack->At(ii); - AliDebug(2,Form("track %d",iTrack2)); - track2 = (AliVTrack *)inputEvent->GetTrack(iTrack2); + for(Int_t ii = 0; ii < fCounterPoolBackground; ii++){ + iTrack2 = fArraytrack->At(ii); + AliDebug(2,Form("track %d",iTrack2)); + track2 = (AliVTrack *)inputEvent->GetTrack(iTrack2); - if(!track2){ - //printf("ERROR: Could not receive track %d", iTrack2); - continue; - } + if(!track2){ + //printf("ERROR: Could not receive track %d", iTrack2); + continue; + } - // if MC look - if(fMCEvent || fAODArrayMCInfo) valueAssElectron[2] = FindMother(TMath::Abs(track2->GetLabel()), indexmother2) ; + // if MC look + if(fMCEvent || fAODArrayMCInfo) valueAssElectron[2] = FindMother(TMath::Abs(track2->GetLabel()), indexmother2) ; - fkPIDRespons = fPIDBackground->GetPIDResponse(); + fkPIDRespons = fPIDBackground->GetPIDResponse(); - valueAssElectron[1] = track2->Pt() ; - valueAssElectron[3] = track2->Eta() ; + valueAssElectron[1] = track2->Pt() ; + valueAssElectron[3] = track2->Eta() ; - fAssElectron->Fill( valueAssElectron) ; + fAssElectron->Fill( valueAssElectron) ; + } + //printf(Form("Associated Pool: fCounterPoolBackground %d \n", fCounterPoolBackground)); } - //printf(Form("Associated Pool: fCounterPoolBackground %d \n", fCounterPoolBackground)); - } - return fnumberfound; + return fnumberfound; } //_____________________________________________________________________________________________ Int_t AliHFENonPhotonicElectron::LookAtNonHFE(Int_t iTrack1, AliVTrack *track1, AliVEvent *vEvent, Double_t weight, Int_t binct, Double_t deltaphi, Int_t source, Int_t indexmother,Int_t mcQAsource) { - // - // Look At Non HFE - // - - /*********************************************************************************** - * * - * iTrack1: index of the tagged electrons in AliVEvent * - * track1: tagged electron * - * vEvent: event * - * weight: weight in pt if not realistic * - * binct: centrality bin * - * deltaphi: phi-phi event plane for v2 * - * source: MC sources * - * indexmother: MC index mother * - * * - * * - * return -1 if nothing * - * return 2 if opposite charge within the mass range * - * return 4 if like charge within the mass range * - * return 6 if opposite & like charge within the mass range * - * * - ***********************************************************************************/ - - //printf("weight %f and source %d\n",weight,source); - - - AliAODEvent *aodeventu = dynamic_cast(vEvent); - Int_t taggedphotonic = -1; - - AliDebug(2,Form("fCounterPoolBackground %d in LookAtNonHFE!!!",fCounterPoolBackground)); - if(!fArraytrack) return taggedphotonic; - AliDebug(2,Form("process track %d",iTrack1)); - AliDebug(1,Form("Inclusive source is %d\n", source)); - - fkPIDRespons = fPIDBackground->GetPIDResponse(); - - //Set Fill-Arrays for THnSparse - Double_t valueIncElectron[4] = { (Double_t)binct, track1->Pt(), (Double_t)source, track1->Eta()}; //Centrality Pt Source P - Double_t valueSign[9] = { deltaphi, (Double_t)binct, track1->Pt(), -1, (Double_t)source, -1, -1, track1->Eta(), -1}; //DeltaPhi Centrality Pt InvariantMass Source Angle Pt - //Double_t valueAngle[3] = { -1, binct, source}; - Double_t valueradius[4] = { (Double_t)binct, track1->Pt(), 0.,(Double_t)source}; - - - Int_t pdg1 = CheckPdg(TMath::Abs(track1->GetLabel())); - Double_t radius = Radius(TMath::Abs(track1->GetLabel())); - AliKFParticle::SetField(vEvent->GetMagneticField()); - AliKFVertex primV(*(vEvent->GetPrimaryVertex())); - valueradius[2] = radius; - - AliVTrack *track2(NULL); - Int_t iTrack2 = 0; - Int_t indexmother2 = -1; - Int_t pdg2 = -100; - Int_t source2 = -1; - Float_t fCharge2 = 0; - - // count number of matches with opposite/same sign track in the given mass range - Int_t countsMatchLikesign(0), - countsMatchUnlikesign(0); - - // Values to fill - Double_t angle(-1.); - Double_t invmass(-1); - - Float_t fCharge1 = track1->Charge(); //Charge from track1 - - Bool_t kUSignPhotonic = kFALSE; - Bool_t kLSignPhotonic = kFALSE; - - //! FILL Inclusive Electron - fWeightsSource->Fill(source,mcQAsource); - fIncElectron->Fill(valueIncElectron,weight); - fnumberfound++; - fIncElectronRadius->Fill(valueradius,weight); - - //printf(Form("Inclusive Pool: TrackNr. %d, fnumberfound %d \n", iTrack1, fnumberfound)); - - for(Int_t idex = 0; idex < fCounterPoolBackground; idex++){ - iTrack2 = fArraytrack->At(idex); - AliDebug(2,Form("track %d",iTrack2)); - track2 = (AliVTrack *)vEvent->GetTrack(iTrack2); - - if(!track2){ - //printf("ERROR: Could not receive track %d", iTrack2); - continue; - } + // + // Look At Non HFE + // + + /*********************************************************************************** + * * + * iTrack1: index of the tagged electrons in AliVEvent * + * track1: tagged electron * + * vEvent: event * + * weight: weight in pt if not realistic * + * binct: centrality bin * + * deltaphi: phi-phi event plane for v2 * + * source: MC sources * + * indexmother: MC index mother * + * * + * * + * return -1 if nothing * + * return 2 if opposite charge within the mass range * + * return 4 if like charge within the mass range * + * return 6 if opposite & like charge within the mass range * + * * + ***********************************************************************************/ + + //printf("weight %f and source %d\n",weight,source); + + + AliAODEvent *aodeventu = dynamic_cast(vEvent); + Int_t taggedphotonic = -1; + + AliDebug(2,Form("fCounterPoolBackground %d in LookAtNonHFE!!!",fCounterPoolBackground)); + if(!fArraytrack) return taggedphotonic; + AliDebug(2,Form("process track %d",iTrack1)); + AliDebug(1,Form("Inclusive source is %d\n", source)); + + fkPIDRespons = fPIDBackground->GetPIDResponse(); + + //Set Fill-Arrays for THnSparse + Double_t valueIncElectron[4] = { (Double_t) binct, track1->Pt(), (Double_t)source, track1->Eta()}; //Centrality Pt Source P + Double_t valueSign[9] = { deltaphi, (Double_t)binct, track1->Pt(), -1, (Double_t)source, -1, -1, track1->Eta(), -1}; //DeltaPhi Centrality Pt InvariantMass Source Angle Pt + //Double_t valueAngle[3] = { -1, binct, source}; + Double_t valueradius[4] = { (Double_t)binct, track1->Pt(), 0.,(Double_t)source}; + + + Int_t pdg1 = CheckPdg(TMath::Abs(track1->GetLabel())); + Double_t radius = Radius(TMath::Abs(track1->GetLabel())); + AliKFParticle::SetField(vEvent->GetMagneticField()); + AliKFVertex primV(*(vEvent->GetPrimaryVertex())); + valueradius[2] = radius; + + AliVTrack *track2(NULL); + Int_t iTrack2 = 0; + Int_t indexmother2 = -1; + Int_t pdg2 = -100; + Int_t source2 = -1; + Float_t fCharge2 = 0; + + // count number of matches with opposite/same sign track in the given mass range + Int_t countsMatchLikesign(0), + countsMatchUnlikesign(0); + + // Values to fill + Double_t angle(-1.); + Double_t invmass(-1); - fCharge2 = track2->Charge(); //Charge from track2 - - // Reset the MC info - //valueAngle[2] = source; - valueSign[4] = source; - valueSign[6] = track2->Pt(); - valueSign[8] = track2->Eta(); - - // track cuts and PID already done - - // Checking if it is the same Track! - if(iTrack2==iTrack1) continue; - AliDebug(2,"Different"); - - // if MC look - if(fMCEvent || fAODArrayMCInfo){ - AliDebug(2, "Checking for source"); - source2 = FindMother(TMath::Abs(track2->GetLabel()), indexmother2); - AliDebug(2, Form("source is %d", source2)); - pdg2 = CheckPdg(TMath::Abs(track2->GetLabel())); - - if(source == kElectronfromconversion){ - AliDebug(2, Form("Electron from conversion (source %d), paired with source %d", source, source2)); - AliDebug(2, Form("Index of the mothers: incl %d, associated %d", indexmother, indexmother2)); - AliDebug(2, Form("PDGs: incl %d, associated %d", pdg1, pdg2)); - } - - if(source2 >=0 ){ - if((indexmother2 == indexmother) && (source == source2) && ((pdg1*pdg2)<0.0)){ - AliDebug(1, "Real pair"); - switch(source){ - case kElectronfromconversion: - valueSign[4] = kElectronfromconversionboth; - valueradius[3] = kElectronfromconversionboth; - break; - case kElectronfrompi0: - valueSign[4] = kElectronfrompi0both; - valueradius[3] = kElectronfrompi0both; - break; - case kElectronfrometa: - valueSign[4] = kElectronfrometaboth; - valueradius[3] = kElectronfrometaboth; - break; - }; + Float_t fCharge1 = track1->Charge(); //Charge from track1 + + Bool_t kUSignPhotonic = kFALSE; + Bool_t kLSignPhotonic = kFALSE; + + // + //TEMPORARY SWITCH + //changes the weighting factor for electrons from Eta Dalitz decays + // + if(mcQAsource == AliHFEmcQA::kEta) weight *= fEtaDalitzWeightFactor; + + // -------------------------- + // | Switches for Generations | + // -------------------------- + // Number of Generations + // Display MC stack for likesign pairs with common mother in generation 1. + + //! FILL Inclusive Electron + fWeightsSource->Fill(source,mcQAsource); + fIncElectron->Fill(valueIncElectron,weight); + fnumberfound++; + if(fStudyRadius) fIncElectronRadius->Fill(valueradius,weight); + + //printf(Form("Inclusive Pool: TrackNr. %d, fnumberfound %d \n", iTrack1, fnumberfound)); + + for(Int_t idex = 0; idex < fCounterPoolBackground; idex++){ + iTrack2 = fArraytrack->At(idex); + AliDebug(2,Form("track %d",iTrack2)); + track2 = (AliVTrack *)vEvent->GetTrack(iTrack2); + + if(!track2){ + //printf("ERROR: Could not receive track %d", iTrack2); + continue; } - } - } - if(fAlgorithmMA){ - // Use TLorentzVector - if(!MakePairDCA(track1, track2, vEvent, (aodeventu != NULL), invmass, angle)) continue; - } else { - // Use AliKF package - if(!MakePairKF(track1, track2, primV, invmass, angle)) continue; - } + fCharge2 = track2->Charge(); //Charge from track2 + + // Reset the MC info + //valueAngle[2] = source; + valueradius[3] = source; + valueSign[4] = source; + valueSign[6] = track2->Pt(); + valueSign[8] = track2->Eta(); + + // track cuts and PID already done + + // Checking if it is the same Track! + if(iTrack2==iTrack1) continue; + AliDebug(2,"Different"); + + // if MC look + if(fMCEvent || fAODArrayMCInfo){ + AliDebug(2, "Checking for source"); + source2 = FindMother(TMath::Abs(track2->GetLabel()), indexmother2); + AliDebug(2, Form("source is %d", source2)); + AliDebug(2, Form("sourceindex is %i", indexmother2)); + AliDebug(2, Form("getlabel: %i", track2->GetLabel())); + pdg2 = CheckPdg(TMath::Abs(track2->GetLabel())); + + if(source == kElectronfromconversion){ + AliDebug(2, Form("Electron from conversion (source %d), paired with source %d", source, source2)); + AliDebug(2, Form("Index of the mothers: incl %d, associated %d", indexmother, indexmother2)); + AliDebug(2, Form("PDGs: incl %d, associated %d", pdg1, pdg2)); + } + + if(source2 >=0 ){ + AliDebug(1,"------------------------------------ \n"); + if((indexmother2 == indexmother) && (source == source2) && ((pdg1*pdg2)<0.0)){ + AliDebug(1, "Real pair"); + switch(source){ + case kElectronfromconversion: + valueSign[4] = kElectronfromconversionboth; + valueradius[3] = kElectronfromconversionboth; + break; + case kElectronfrompi0: + valueSign[4] = kElectronfrompi0both; + valueradius[3] = kElectronfrompi0both; + break; + case kElectronfrometa: + valueSign[4] = kElectronfrometaboth; + valueradius[3] = kElectronfrometaboth; + break; + case kElectronfromomega: + valueSign[4] = kElectronfromomegaboth; + valueradius[3] = kElectronfromomegaboth; + break; + }; + } + + if(fAnaPairGen){ + + Int_t MotherArray1[fNumberofGenerations]; + Int_t MotherArray2[fNumberofGenerations]; + for(Int_t i = 0; i < fNumberofGenerations;++i){ + MotherArray1[i]=-1; + MotherArray2[i]=-1; + } + FillMotherArray(TMath::Abs(track1->GetLabel()),0,MotherArray1,fNumberofGenerations); + FillMotherArray(TMath::Abs(track2->GetLabel()),0,MotherArray2,fNumberofGenerations); + AliDebug(2,Form(" indextrack inclusive: %i pdg: %i || indextrack assoc: %i pdg: %i \n",track1->GetLabel(),pdg1 , track2->GetLabel(),pdg2)); + AliDebug(2,Form(" Mother Gen 1: %i || Mother Gen 1: %i \n", MotherArray1[0],MotherArray2[0])); + AliDebug(2,Form(" Mother Gen 2: %i || Mother Gen 2: %i \n", MotherArray1[1],MotherArray2[1])); + AliDebug(2,Form(" Mother Gen 3: %i || Mother Gen 3: %i \n", MotherArray1[2],MotherArray2[2])); + AliDebug(2,Form(" Mother Gen 4: %i || Mother Gen 4: %i \n", MotherArray1[3],MotherArray2[3])); + valueSign[5] = FindGeneration(MotherArray1,MotherArray2,fNumberofGenerations); + } + } + } + + if(fAlgorithmMA){ + // Use TLorentzVector + if(!MakePairDCA(track1, track2, vEvent, (aodeventu != NULL), invmass, angle)) continue; + } else { + // Use AliKF package + if(!MakePairKF(track1, track2, primV, invmass, angle)) continue; + } - valueSign[3] = invmass; - valueSign[5] = angle; + valueSign[3] = invmass; + // valueSign[5] = angle; - //if((fCharge1*fCharge2)>0.0) fLSignAngle->Fill(&valueAngle[0],weight); - //else fUSignAngle->Fill(&valueAngle[0],weight); + //if((fCharge1*fCharge2)>0.0) fLSignAngle->Fill(&valueAngle[0],weight); + //else fUSignAngle->Fill(&valueAngle[0],weight); - if(angle > fMaxOpening3D) continue; //! Cut on Opening Angle - if(invmass > fMaxInvMass) continue; //! Cut on Invariant Mass + if(angle > fMaxOpening3D) continue; //! Cut on Opening Angle + if(invmass > fMaxInvMass) continue; //! Cut on Invariant Mass - if((fCharge1*fCharge2)>0.0){ - if(invmass < 1.0) fLSign->Fill( valueSign, weight); - // count like-sign background matched pairs per inclusive based on mass cut - if(invmass < 0.14) countsMatchLikesign++; - AliDebug(1, "Selected Like sign"); - } else { - if(invmass < 1.0)fUSign->Fill( valueSign, weight); - // count unlike-sign matched pairs per inclusive based on mass cut - if(invmass < 0.14) { - countsMatchUnlikesign++; - fRecElectronRadius->Fill(valueradius,weight); - } - AliDebug(1, "Selected Unike sign"); - } + if((fCharge1*fCharge2)>0.0){ + if(invmass < 1.0){ + fLSign->Fill( valueSign, weight); + //if switched on produces mcstackdump for likesign with commonmother in gen 1 + if(fDisplayMCStack && fMCEvent && valueSign[5] == 1) { + AliStack* stack = fMCEvent->Stack(); + if(!stack) AliError("No Stack"); + else stack->DumpPStack(); + } + + } + // count like-sign background matched pairs per inclusive based on mass cut + if(invmass < 0.14) countsMatchLikesign++; + AliDebug(1, "-> Selected Like sign"); + } else { + if(invmass < 1.0){ + fUSign->Fill( valueSign, weight); + } + // count unlike-sign matched pairs per inclusive based on mass cut + if(invmass < 0.14) { + countsMatchUnlikesign++; + if(fStudyRadius) fRecElectronRadius->Fill(valueradius,weight); + } + AliDebug(1, "-> Selected Unlike sign"); + + } - if((fCharge1*fCharge2)>0.0) kLSignPhotonic=kTRUE; - else kUSignPhotonic=kTRUE; - } - // Fill counted - Double_t valCountsLS[3] = {(Double_t)binct, track1->Pt(), (Double_t)countsMatchLikesign}, - valCountsUS[3] = {(Double_t)binct, track1->Pt(), (Double_t)countsMatchUnlikesign}; - fUSmatches->Fill(valCountsUS); - fLSmatches->Fill(valCountsLS); + if((fCharge1*fCharge2)>0.0) kLSignPhotonic=kTRUE; + else kUSignPhotonic=kTRUE; + } + + // Fill counted + Double_t valCountsLS[3] = {(Double_t)binct, track1->Pt(),(Double_t)countsMatchLikesign}, + valCountsUS[3] = {(Double_t)binct, track1->Pt(),(Double_t)countsMatchUnlikesign}; + fUSmatches->Fill(valCountsUS); + fLSmatches->Fill(valCountsLS); - if( kUSignPhotonic && kLSignPhotonic) taggedphotonic = 6; - if(!kUSignPhotonic && kLSignPhotonic) taggedphotonic = 4; - if( kUSignPhotonic && !kLSignPhotonic) taggedphotonic = 2; + if( kUSignPhotonic && kLSignPhotonic) taggedphotonic = 6; + if(!kUSignPhotonic && kLSignPhotonic) taggedphotonic = 4; + if( kUSignPhotonic && !kLSignPhotonic) taggedphotonic = 2; - return taggedphotonic; + AliDebug(1,"------------------------------------ \n"); + return taggedphotonic; } //_________________________________________________________________________ Int_t AliHFENonPhotonicElectron::FindMother(Int_t tr, Int_t &indexmother) const { - // - // Find the mother if MC - // - - if(!fMCEvent && !fAODArrayMCInfo) return -1; - - Int_t pdg = CheckPdg(tr); - if(TMath::Abs(pdg)!= 11) - { - indexmother = -1; - return kNoElectron; - } - - indexmother = IsMotherGamma(tr); - if(indexmother > 0) return kElectronfromconversion; - indexmother = IsMotherPi0(tr); - if(indexmother > 0) return kElectronfrompi0; - indexmother = IsMotherC(tr); - if(indexmother > 0) return kElectronfromC; - indexmother = IsMotherB(tr); - if(indexmother > 0) return kElectronfromB; - indexmother = IsMotherEta(tr); - if(indexmother > 0) return kElectronfrometa; - - return kElectronfromother; + // + // Find the mother if MC + // + + if(!fMCEvent && !fAODArrayMCInfo) return -1; + + Int_t pdg = CheckPdg(tr); + if(TMath::Abs(pdg)!= 11) + { + indexmother = -1; + return kNoElectron; + } + + indexmother = IsMotherGamma(tr); + if(indexmother > 0) return kElectronfromconversion; + indexmother = IsMotherPi0(tr); + if(indexmother > 0) return kElectronfrompi0; + indexmother = IsMotherC(tr); + if(indexmother > 0) return kElectronfromC; + indexmother = IsMotherB(tr); + if(indexmother > 0) return kElectronfromB; + indexmother = IsMotherEta(tr); + if(indexmother > 0) return kElectronfrometa; + indexmother = IsMotherOmega(tr); + if(indexmother > 0) return kElectronfromomega; + + return kElectronfromother; } //________________________________________________________________________________________________ Int_t AliHFENonPhotonicElectron::CheckPdg(Int_t tr) const { - // - // Return the pdg of the particle - // + // + // Return the pdg of the particle + // - Int_t pdgcode = -1; - if(tr < 0) return pdgcode; + Int_t pdgcode = -1; + if(tr < 0) return pdgcode; - AliMCParticle *mctrackesd = NULL; AliAODMCParticle *mctrackaod = NULL; - if(fMCEvent){ - AliVParticle *mctrack = fMCEvent->GetTrack(tr); - if(mctrack){ - if((mctrackesd = dynamic_cast(fMCEvent->GetTrack(TMath::Abs(tr))))) pdgcode = mctrackesd->PdgCode(); - else if((mctrackaod = dynamic_cast(fMCEvent->GetTrack(TMath::Abs(tr))))) pdgcode = mctrackaod->GetPdgCode(); - } - } else if(fAODArrayMCInfo) { - if(tr < fAODArrayMCInfo->GetEntriesFast()){ - mctrackaod = (AliAODMCParticle *) fAODArrayMCInfo->At(tr); - if(mctrackaod) return pdgcode = mctrackaod->GetPdgCode(); + AliMCParticle *mctrackesd = NULL; AliAODMCParticle *mctrackaod = NULL; + if(fMCEvent){ + AliVParticle *mctrack = fMCEvent->GetTrack(tr); + if(mctrack){ + if((mctrackesd = dynamic_cast(fMCEvent->GetTrack(TMath::Abs(tr))))) pdgcode = mctrackesd->PdgCode(); + else if((mctrackaod = dynamic_cast(fMCEvent->GetTrack(TMath::Abs(tr))))) pdgcode = mctrackaod->GetPdgCode(); + } + } else if(fAODArrayMCInfo) { + if(tr < fAODArrayMCInfo->GetEntriesFast()){ + mctrackaod = (AliAODMCParticle *) fAODArrayMCInfo->At(tr); + if(mctrackaod) return pdgcode = mctrackaod->GetPdgCode(); + } } - } - return pdgcode; + return pdgcode; } //________________________________________________________________________________________________ Double_t AliHFENonPhotonicElectron::Radius(Int_t tr) const { - // - // Return the production vertex radius - // + // + // Return the production vertex radius + // - Double_t radius = 0.; - if(tr < 0) return radius; + Double_t radius = 0.; + if(tr < 0) return radius; - AliMCParticle *mctrackesd = NULL; AliAODMCParticle *mctrackaod = NULL; - if(fMCEvent){ - AliVParticle *mctrack = fMCEvent->GetTrack(tr); - if(mctrack){ - if((mctrackesd = dynamic_cast(fMCEvent->GetTrack(TMath::Abs(tr))))) radius = TMath::Sqrt(mctrackesd->Xv()*mctrackesd->Xv()+mctrackesd->Yv()*mctrackesd->Yv()); - else if((mctrackaod = dynamic_cast(fMCEvent->GetTrack(TMath::Abs(tr))))) radius = TMath::Sqrt(mctrackaod->Xv()*mctrackaod->Xv()+mctrackaod->Yv()*mctrackaod->Yv()); - } - } else if(fAODArrayMCInfo) { - if(tr < fAODArrayMCInfo->GetEntriesFast()){ - mctrackaod = (AliAODMCParticle *) fAODArrayMCInfo->At(tr); - if(mctrackaod) return radius = TMath::Sqrt(mctrackaod->Xv()*mctrackaod->Xv()+mctrackaod->Yv()*mctrackaod->Yv()); + AliMCParticle *mctrackesd = NULL; AliAODMCParticle *mctrackaod = NULL; + if(fMCEvent){ + AliVParticle *mctrack = fMCEvent->GetTrack(tr); + if(mctrack){ + if((mctrackesd = dynamic_cast(fMCEvent->GetTrack(TMath::Abs(tr))))) radius = TMath::Sqrt(mctrackesd->Xv()*mctrackesd->Xv()+mctrackesd->Yv()*mctrackesd->Yv()); + else if((mctrackaod = dynamic_cast(fMCEvent->GetTrack(TMath::Abs(tr))))) radius = TMath::Sqrt(mctrackaod->Xv()*mctrackaod->Xv()+mctrackaod->Yv()*mctrackaod->Yv()); + } + } else if(fAODArrayMCInfo) { + if(tr < fAODArrayMCInfo->GetEntriesFast()){ + mctrackaod = (AliAODMCParticle *) fAODArrayMCInfo->At(tr); + if(mctrackaod) return radius = TMath::Sqrt(mctrackaod->Xv()*mctrackaod->Xv()+mctrackaod->Yv()*mctrackaod->Yv()); + } } - } - return radius; + return radius; } //_______________________________________________________________________________________________ Int_t AliHFENonPhotonicElectron::GetMotherPDG(Int_t tr, Int_t &motherIndex) const { - // - // Returns the mother PDG of the track (return value) and the index of the - // mother track - // - if(tr < 0) return -1; - - Int_t pdg(-1); - AliMCParticle *mctrackesd(NULL); AliAODMCParticle *mctrackaod(NULL); - - motherIndex = -1; - if(fMCEvent) { - AliDebug(2, "Using MC Event"); - AliVParticle *mctrack = fMCEvent->GetTrack(tr); - if(mctrack){ - if((mctrackesd = dynamic_cast(fMCEvent->GetTrack(TMath::Abs(tr))))){ - // Case ESD - TParticle *particle = mctrackesd->Particle(); - - // Take mother - if(particle){ - motherIndex = particle->GetFirstMother(); - if(motherIndex >= 0){ - AliMCParticle *mothertrack = NULL; - if((mothertrack = dynamic_cast(fMCEvent->GetTrack(TMath::Abs(motherIndex))))){ - TParticle * mother = mothertrack->Particle(); - pdg = mother->GetPdgCode(); + // + // Returns the mother PDG of the track (return value) and the index of the + // mother track + // + if(tr < 0) return -1; + + Int_t pdg(-1); + AliMCParticle *mctrackesd(NULL); AliAODMCParticle *mctrackaod(NULL); + + motherIndex = -1; + if(fMCEvent) { + AliDebug(2, "Using MC Event"); + AliVParticle *mctrack = fMCEvent->GetTrack(tr); + if(mctrack){ + if((mctrackesd = dynamic_cast(fMCEvent->GetTrack(TMath::Abs(tr))))){ + // Case ESD + TParticle *particle = mctrackesd->Particle(); + + // Take mother + if(particle){ + motherIndex = particle->GetFirstMother(); + if(motherIndex >= 0){ + AliMCParticle *mothertrack = NULL; + if((mothertrack = dynamic_cast(fMCEvent->GetTrack(TMath::Abs(motherIndex))))){ + TParticle * mother = mothertrack->Particle(); + pdg = mother->GetPdgCode(); + } + } + } + } else if((mctrackaod = dynamic_cast(fMCEvent->GetTrack(TMath::Abs(tr))))){ + // Case AOD + // Take mother + motherIndex = mctrackaod->GetMother(); + if(motherIndex >= 0){ + AliAODMCParticle *mothertrack = dynamic_cast(fMCEvent->GetTrack(motherIndex)); + if(mothertrack) pdg = mothertrack->GetPdgCode(); + } } - } - } - } else if((mctrackaod = dynamic_cast(fMCEvent->GetTrack(TMath::Abs(tr))))){ - // Case AOD - // Take mother - motherIndex = mctrackaod->GetMother(); - if(motherIndex >= 0){ - AliAODMCParticle *mothertrack = dynamic_cast(fMCEvent->GetTrack(motherIndex)); - if(mothertrack) pdg = mothertrack->GetPdgCode(); } - } - } - } else if(fAODArrayMCInfo) { - AliDebug(2, "Using AOD list"); - if(tr < fAODArrayMCInfo->GetEntriesFast()){ - mctrackaod = (AliAODMCParticle *) fAODArrayMCInfo->At(tr); - - // Take mother - if(mctrackaod){ - motherIndex = mctrackaod->GetMother(); - if(motherIndex >= 0 && motherIndex < fAODArrayMCInfo->GetEntriesFast()){ - AliAODMCParticle *mothertrack = dynamic_cast(fAODArrayMCInfo->At(TMath::Abs(motherIndex))); - if(mothertrack) pdg = mothertrack->GetPdgCode(); + } else if(fAODArrayMCInfo) { + AliDebug(2, "Using AOD list"); + if(tr < fAODArrayMCInfo->GetEntriesFast()){ + mctrackaod = (AliAODMCParticle *) fAODArrayMCInfo->At(tr); + + // Take mother + if(mctrackaod){ + motherIndex = mctrackaod->GetMother(); + if(motherIndex >= 0 && motherIndex < fAODArrayMCInfo->GetEntriesFast()){ + AliAODMCParticle *mothertrack = dynamic_cast(fAODArrayMCInfo->At(TMath::Abs(motherIndex))); + if(mothertrack) pdg = mothertrack->GetPdgCode(); + } + } } - } } - } - return pdg; + return pdg; } //_______________________________________________________________________________________________ Int_t AliHFENonPhotonicElectron::IsMotherGamma(Int_t tr) const { - // - // Return the lab of gamma mother or -1 if not gamma - // - - Int_t imother(-1), pdg(-1); - pdg = GetMotherPDG(tr, imother); - - // Check gamma - if(imother >= 0){ - if(TMath::Abs(pdg) == 22){ - AliDebug(2, "Gamma Mother selected"); - return imother; - } - if(TMath::Abs(pdg) == 11){ - AliDebug(2, "Mother is electron - look further in hierarchy"); - return IsMotherGamma(imother); + // + // Return the lab of gamma mother or -1 if not gamma + // + + Int_t imother(-1), pdg(-1); + pdg = GetMotherPDG(tr, imother); + + // Check gamma + if(imother >= 0){ + if(TMath::Abs(pdg) == 22){ + AliDebug(2, "Gamma Mother selected"); + return imother; + } + if(TMath::Abs(pdg) == 11){ + AliDebug(2, "Mother is electron - look further in hierarchy"); + return IsMotherGamma(imother); + } + AliDebug(2, "Nothing selected"); + return -1; } - AliDebug(2, "Nothing selected"); + AliDebug(2, "Not mother"); return -1; - } - AliDebug(2, "Not mother"); - return -1; } //________________________________________________________________________________________________ Int_t AliHFENonPhotonicElectron::IsMotherPi0(Int_t tr) const { - // - // Return the lab of pi0 mother or -1 if not pi0 - // + // + // Return the lab of pi0 mother or -1 if not pi0 + // - Int_t imother(-1), pdg(-1); - pdg = GetMotherPDG(tr, imother); + Int_t imother(-1), pdg(-1); + pdg = GetMotherPDG(tr, imother); - // Check pi0 - if(imother >= 0){ - if(TMath::Abs(pdg) == 111){ - AliDebug(2, "Pi0 Mother selected"); - return imother; - } - if(TMath::Abs(pdg) == 11){ - AliDebug(2, "Mother is electron - look further in hierarchy"); - return IsMotherPi0(imother); + // Check pi0 + if(imother >= 0){ + if(TMath::Abs(pdg) == 111){ + AliDebug(2, "Pi0 Mother selected"); + return imother; + } + if(TMath::Abs(pdg) == 11){ + AliDebug(2, "Mother is electron - look further in hierarchy"); + return IsMotherPi0(imother); + } + AliDebug(2, "Nothing selected"); + return -1; } - AliDebug(2, "Nothing selected"); + AliDebug(2, "Not mother"); return -1; - } - AliDebug(2, "Not mother"); - return -1; } //________________________________________________________________________________________________ Int_t AliHFENonPhotonicElectron::IsMotherC(Int_t tr) const { - // - // Return the lab of signal mother or -1 if not from C - // + // + // Return the lab of signal mother or -1 if not from C + // - Int_t imother(-1), pdg(-1); - pdg = GetMotherPDG(tr, imother); + Int_t imother(-1), pdg(-1); + pdg = GetMotherPDG(tr, imother); // Check C - if(imother >= 0){ - if((TMath::Abs(pdg)==411) || (TMath::Abs(pdg)==421) || (TMath::Abs(pdg)==431) || (TMath::Abs(pdg)==4122) || (TMath::Abs(pdg)==4132) || (TMath::Abs(pdg)==4232) || (TMath::Abs(pdg)==43320)){ - AliDebug(2, "Charm Mother selected"); - return imother; - } - if(TMath::Abs(pdg) == 11){ - AliDebug(2, "Mother is electron - look further in hierarchy"); - return IsMotherC(imother); + if(imother >= 0){ + if((TMath::Abs(pdg)==411) || (TMath::Abs(pdg)==421) || (TMath::Abs(pdg)==431) || (TMath::Abs(pdg)==4122) || (TMath::Abs(pdg)==4132) || (TMath::Abs(pdg)==4232) || (TMath::Abs(pdg)==43320)){ + AliDebug(2, "Charm Mother selected"); + return imother; + } + if(TMath::Abs(pdg) == 11){ + AliDebug(2, "Mother is electron - look further in hierarchy"); + return IsMotherC(imother); + } + AliDebug(2, "Nothing selected"); + return -1; } - AliDebug(2, "Nothing selected"); + AliDebug(2, "Not mother"); return -1; - } - AliDebug(2, "Not mother"); - return -1; } //_______________________________________________________________________________________________ Int_t AliHFENonPhotonicElectron::IsMotherB(Int_t tr) const { - // - // Return the lab of signal mother or -1 if not B - // + // + // Return the lab of signal mother or -1 if not B + // - Int_t imother(-1), pdg(-1); - pdg = GetMotherPDG(tr, imother); + Int_t imother(-1), pdg(-1); + pdg = GetMotherPDG(tr, imother); - // Check B - if(imother >= 0){ - if((TMath::Abs(pdg)==511) || (TMath::Abs(pdg)==521) || (TMath::Abs(pdg)==531) || (TMath::Abs(pdg)==5122) || (TMath::Abs(pdg)==5132) || (TMath::Abs(pdg)==5232) || (TMath::Abs(pdg)==53320)){ - AliDebug(2, "Bottom Mother selected"); - return imother; - } - if(TMath::Abs(pdg) == 11){ - return IsMotherB(imother); - AliDebug(2, "Mother is electron - look further in hierarchy"); + // Check B + if(imother >= 0){ + if((TMath::Abs(pdg)==511) || (TMath::Abs(pdg)==521) || (TMath::Abs(pdg)==531) || (TMath::Abs(pdg)==5122) || (TMath::Abs(pdg)==5132) || (TMath::Abs(pdg)==5232) || (TMath::Abs(pdg)==53320)){ + AliDebug(2, "Bottom Mother selected"); + return imother; + } + if(TMath::Abs(pdg) == 11){ + return IsMotherB(imother); + AliDebug(2, "Mother is electron - look further in hierarchy"); + } + AliDebug(2, "Nothing selected"); + return -1; } - AliDebug(2, "Nothing selected"); + AliDebug(2, "Not mother"); return -1; - } - AliDebug(2, "Not mother"); - return -1; } //_______________________________________________________________________________________________ Int_t AliHFENonPhotonicElectron::IsMotherEta(Int_t tr) const { - // - // Return the lab of eta mother or -1 if not eta - // + // + // Return the lab of eta mother or -1 if not eta + // - Int_t imother(-1), pdg(-1); - pdg = GetMotherPDG(tr, imother); + Int_t imother(-1), pdg(-1); + pdg = GetMotherPDG(tr, imother); - // Check eta - if(imother >= 0){ - if(TMath::Abs(pdg) == 221){ - AliDebug(2, "Eta mother selected"); - return imother; + // Check eta + if(imother >= 0){ + if(TMath::Abs(pdg) == 221){ + AliDebug(2, "Eta mother selected"); + return imother; + } + if(TMath::Abs(pdg) == 11){ + AliDebug(2, "Mother is electron - look further in hierarchy"); + return IsMotherEta(imother); + } + AliDebug(2, "Nothing selected"); + return -1; } - if(TMath::Abs(pdg) == 11){ - AliDebug(2, "Mother is electron - look further in hierarchy"); - return IsMotherEta(imother); + AliDebug(2, "Not mother"); + return -1; +} + +//_______________________________________________________________________________________________ +Int_t AliHFENonPhotonicElectron::IsMotherOmega(Int_t tr) const { + + // + // Return the lab of omega mother or -1 if not omega + // + + Int_t imother(-1), pdg(-1); + pdg = GetMotherPDG(tr, imother); + + // Check omega + if(imother >= 0){ + if(TMath::Abs(pdg) == 223){ + AliDebug(2, "Omega mother selected"); + return imother; + } + if(TMath::Abs(pdg) == 11){ + AliDebug(2, "Mother is electron - look further in hierarchy"); + return IsMotherOmega(imother); + } + AliDebug(2, "Nothing selected"); + return -1; } - AliDebug(2, "Nothing selected"); + AliDebug(2, "Not mother"); return -1; - } - AliDebug(2, "Not mother"); - return -1; } //_______________________________________________________________________________________________ Bool_t AliHFENonPhotonicElectron::MakePairDCA(const AliVTrack *inclusive, const AliVTrack *associated, AliVEvent *vEvent, Bool_t isAOD, Double_t &invMass, Double_t &angle) const { - // - // Make Pairs of electrons using TLorentzVector - // - Double_t eMass = TDatabasePDG::Instance()->GetParticle(11)->Mass(); //Electron mass in GeV - Double_t bfield = vEvent->GetMagneticField(); - - AliESDtrack *esdtrack1, *esdtrack2; - if(isAOD){ - // call copy constructor for AODs - esdtrack1 = new AliESDtrack(inclusive); - esdtrack2 = new AliESDtrack(associated); - } else { - // call copy constructor for ESDs - esdtrack1 = new AliESDtrack(*(static_cast(inclusive))); - esdtrack2 = new AliESDtrack(*(static_cast(associated))); - } - if((!esdtrack1) || (!esdtrack2)){ - delete esdtrack1; - delete esdtrack2; - return kFALSE; - } - - Double_t xt1 = 0; //radial position track 1 at the DCA point - Double_t xt2 = 0; //radial position track 2 at the DCA point - Double_t dca = esdtrack2->GetDCA(esdtrack1,bfield,xt2,xt1); //DCA track1-track2 - if(dca > fMaxDCA){ - // Apply DCA cut already in the function + // + // Make Pairs of electrons using TLorentzVector + // + Double_t eMass = TDatabasePDG::Instance()->GetParticle(11)->Mass(); //Electron mass in GeV + Double_t bfield = vEvent->GetMagneticField(); + + AliESDtrack *esdtrack1, *esdtrack2; + if(isAOD){ + // call copy constructor for AODs + esdtrack1 = new AliESDtrack(inclusive); + esdtrack2 = new AliESDtrack(associated); + } else { + // call copy constructor for ESDs + esdtrack1 = new AliESDtrack(*(static_cast(inclusive))); + esdtrack2 = new AliESDtrack(*(static_cast(associated))); + } + if((!esdtrack1) || (!esdtrack2)){ + delete esdtrack1; + delete esdtrack2; + return kFALSE; + } + + Double_t xt1 = 0; //radial position track 1 at the DCA point + Double_t xt2 = 0; //radial position track 2 at the DCA point + Double_t dca = esdtrack2->GetDCA(esdtrack1,bfield,xt2,xt1); //DCA track1-track2 + if(dca > fMaxDCA){ + // Apply DCA cut already in the function + delete esdtrack1; + delete esdtrack2; + return kFALSE; + } + + //Momenta of the track extrapolated to DCA track-track + Double_t p1[3] = {0,0,0}; + Double_t p2[3] = {0,0,0}; + Bool_t kHasdcaT1 = esdtrack1->GetPxPyPzAt(xt1,bfield,p1); //Track1 + Bool_t kHasdcaT2 = esdtrack2->GetPxPyPzAt(xt2,bfield,p2); //Track2 + if(!kHasdcaT1 || !kHasdcaT2) AliWarning("It could be a problem in the extrapolation"); + + TLorentzVector electron1, electron2, mother; + electron1.SetXYZM(p1[0], p1[1], p1[2], eMass); + electron2.SetXYZM(p2[0], p2[1], p2[2], eMass); + + mother = electron1 + electron2; + invMass = mother.M(); + angle = TVector2::Phi_0_2pi(electron1.Angle(electron2.Vect())); + delete esdtrack1; delete esdtrack2; - return kFALSE; - } - - //Momenta of the track extrapolated to DCA track-track - Double_t p1[3] = {0,0,0}; - Double_t p2[3] = {0,0,0}; - Bool_t kHasdcaT1 = esdtrack1->GetPxPyPzAt(xt1,bfield,p1); //Track1 - Bool_t kHasdcaT2 = esdtrack2->GetPxPyPzAt(xt2,bfield,p2); //Track2 - if(!kHasdcaT1 || !kHasdcaT2) AliWarning("It could be a problem in the extrapolation"); - - TLorentzVector electron1, electron2, mother; - electron1.SetXYZM(p1[0], p1[1], p1[2], eMass); - electron2.SetXYZM(p2[0], p2[1], p2[2], eMass); - - mother = electron1 + electron2; - invMass = mother.M(); - angle = TVector2::Phi_0_2pi(electron1.Angle(electron2.Vect())); - - delete esdtrack1; - delete esdtrack2; - return kTRUE; + return kTRUE; } //_______________________________________________________________________________________________ Bool_t AliHFENonPhotonicElectron::MakePairKF(const AliVTrack *inclusive, const AliVTrack *associated, AliKFVertex &primV, Double_t &invMass, Double_t &angle) const { - // - // Make pairs of electrons using the AliKF package - // - - //printf("AOD HFE non photonic\n"); - - Int_t fPDGtrack1 = 11; - if(inclusive->Charge()>0) fPDGtrack1 = -11; - Int_t fPDGtrack2 = 11; - if(associated->Charge()>0) fPDGtrack2 = -11; - - AliKFParticle ktrack1(*inclusive, fPDGtrack1); - AliKFParticle ktrack2(*associated, fPDGtrack2); - AliKFParticle recoGamma(ktrack1,ktrack2); - - if(recoGamma.GetNDF()<1) return kFALSE; //! Cut on Reconstruction - - Double_t chi2OverNDF = recoGamma.GetChi2()/recoGamma.GetNDF(); - if(TMath::Sqrt(TMath::Abs(chi2OverNDF))>fChi2OverNDFCut) return kFALSE; - - if(fSetMassConstraint){ - primV += recoGamma; - primV -= ktrack1; - primV -= ktrack2; - recoGamma.SetProductionVertex(primV); - recoGamma.SetMassConstraint(0,0.0001); - } - - Double_t width(0.); - recoGamma.GetMass(invMass,width); - angle = ktrack1.GetAngle(ktrack2); - return kTRUE; + // + // Make pairs of electrons using the AliKF package + // + + //printf("AOD HFE non photonic\n"); + + Int_t fPDGtrack1 = 11; + if(inclusive->Charge()>0) fPDGtrack1 = -11; + Int_t fPDGtrack2 = 11; + if(associated->Charge()>0) fPDGtrack2 = -11; + + AliKFParticle ktrack1(*inclusive, fPDGtrack1); + AliKFParticle ktrack2(*associated, fPDGtrack2); + AliKFParticle recoGamma(ktrack1,ktrack2); + + if(recoGamma.GetNDF()<1) return kFALSE; //! Cut on Reconstruction + + Double_t chi2OverNDF = recoGamma.GetChi2()/recoGamma.GetNDF(); + if(TMath::Sqrt(TMath::Abs(chi2OverNDF))>fChi2OverNDFCut) return kFALSE; + + if(fSetMassConstraint){ + primV += recoGamma; + primV -= ktrack1; + primV -= ktrack2; + recoGamma.SetProductionVertex(primV); + recoGamma.SetMassConstraint(0,0.0001); + } + + Double_t width(0.); + recoGamma.GetMass(invMass,width); + angle = ktrack1.GetAngle(ktrack2); + return kTRUE; } //_______________________________________________________________________________________________ Bool_t AliHFENonPhotonicElectron::FilterCategory1Track(const AliVTrack * const track, Bool_t isAOD, Int_t binct){ - // - // Selection of good associated tracks for the pool - // selection is done using strong cuts - // Tracking in the TPC and the ITS is a minimal requirement - // - Bool_t survivedbackground = kTRUE; - - if(!fHFEBackgroundCuts->CheckParticleCuts(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack, (TObject *) track)) survivedbackground = kFALSE; - AliDebug(3, Form("First cut: %s\n", survivedbackground == kTRUE ? "yes" : "no")); - if(!fHFEBackgroundCuts->CheckParticleCuts(AliHFEcuts::kStepRecPrim + AliHFEcuts::kNcutStepsMCTrack, (TObject *) track)) survivedbackground = kFALSE; - AliDebug(3, Form("Second cut: %s\n", survivedbackground == kTRUE ? "yes" : "no")); - - if(survivedbackground){ - // PID track cuts - AliHFEpidObject hfetrack2; - - if(!isAOD) hfetrack2.SetAnalysisType(AliHFEpidObject::kESDanalysis); - else hfetrack2.SetAnalysisType(AliHFEpidObject::kAODanalysis); - - hfetrack2.SetRecTrack(track); - if(binct>-1){ - hfetrack2.SetCentrality((Int_t)binct); - AliDebug(3,Form("centrality %d and %d",binct,hfetrack2.GetCentrality())); - hfetrack2.SetPbPb(); - } + // + // Selection of good associated tracks for the pool + // selection is done using strong cuts + // Tracking in the TPC and the ITS is a minimal requirement + // + Bool_t survivedbackground = kTRUE; + + if(!fHFEBackgroundCuts->CheckParticleCuts(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack, (TObject *) track)) survivedbackground = kFALSE; + AliDebug(3, Form("First cut: %s\n", survivedbackground == kTRUE ? "yes" : "no")); + if(!fHFEBackgroundCuts->CheckParticleCuts(AliHFEcuts::kStepRecPrim + AliHFEcuts::kNcutStepsMCTrack, (TObject *) track)) survivedbackground = kFALSE; + AliDebug(3, Form("Second cut: %s\n", survivedbackground == kTRUE ? "yes" : "no")); + + if(survivedbackground){ + // PID track cuts + AliHFEpidObject hfetrack2; + + if(!isAOD) hfetrack2.SetAnalysisType(AliHFEpidObject::kESDanalysis); + else hfetrack2.SetAnalysisType(AliHFEpidObject::kAODanalysis); + + hfetrack2.SetRecTrack(track); + if(binct>-1){ + hfetrack2.SetCentrality((Int_t)binct); + AliDebug(3,Form("centrality %d and %d",binct,hfetrack2.GetCentrality())); + hfetrack2.SetPbPb(); + } - if(fPIDBackground->IsSelected(&hfetrack2,0x0,"recTrackCont",fPIDBackgroundQA)){ - survivedbackground = kTRUE; - } else survivedbackground = kFALSE; - } - AliDebug(3, Form("PID: %s\n", survivedbackground == kTRUE ? "yes" : "no")); - return survivedbackground; + if(fPIDBackground->IsSelected(&hfetrack2,0x0,"recTrackCont",fPIDBackgroundQA)){ + survivedbackground = kTRUE; + } else survivedbackground = kFALSE; + } + AliDebug(3, Form("PID: %s\n", survivedbackground == kTRUE ? "yes" : "no")); + return survivedbackground; } //_______________________________________________________________________________________________ Bool_t AliHFENonPhotonicElectron::FilterCategory2Track(const AliVTrack * const track, Bool_t isAOD){ - // - // Selection of category 2 tracks: These tracks are exclusively low pt tracks below - // 300 MeV/c which have at least 2 hits in the 4 outer ITS layers and are identified as - // electron candidates by the ITS - // - if(TMath::Abs(track->Pt()) > 0.3) return kFALSE; - if(TMath::Abs(track->Pt()) < fminPt) return kFALSE; - Int_t nclustersITS(0), nclustersOuter(0); - if(isAOD){ - const AliAODTrack *aodtrack = static_cast(track); - if(!(aodtrack->TestFilterBit(AliAODTrack::kTrkGlobalNoDCA) || aodtrack->TestFilterBit(AliAODTrack::kTrkITSsa))) return kFALSE; - if(!aodtrack->IsOn(AliAODTrack::kITSrefit)) return kFALSE; - nclustersITS = aodtrack->GetITSNcls(); - for(int ily = 2; ily < 5; ily++) - if(aodtrack->HasPointOnITSLayer(ily)) nclustersOuter++; - } else { - const AliESDtrack *esdtrack = static_cast(track); - if(esdtrack->GetStatus() & AliESDtrack::kITSpureSA) return kFALSE; - if(esdtrack->GetStatus() & AliESDtrack::kTPCin) return kFALSE; - if(!(esdtrack->GetStatus() & AliESDtrack::kITSrefit)) return kFALSE; - nclustersITS = esdtrack->GetITSclusters(NULL); - for(int ily = 2; ily < 5; ily++) - if(esdtrack->HasPointOnITSLayer(ily)) nclustersOuter++; - } - if(nclustersITS < 4) return kFALSE; - if(nclustersOuter < 3) return kFALSE; - - // Do ITS PID - Double_t nsigmaITS = fPIDBackground->GetPIDResponse()->NumberOfSigmasITS(track, AliPID::kElectron); - fHnsigmaITS->Fill(track->Pt(), nsigmaITS); - if((nsigmaITS - fITSmeanShift) > fITSnSigmaHigh ) return kFALSE; - if((nsigmaITS - fITSmeanShift) < fITSnSigmaLow ) return kFALSE; - // if global track, we apply also TPC PID - return kTRUE; + // + // Selection of category 2 tracks: These tracks are exclusively low pt tracks below + // 300 MeV/c which have at least 2 hits in the 4 outer ITS layers and are identified as + // electron candidates by the ITS + // + if(TMath::Abs(track->Pt()) > 0.3) return kFALSE; + if(TMath::Abs(track->Pt()) < fminPt) return kFALSE; + Int_t nclustersITS(0), nclustersOuter(0); + if(isAOD){ + const AliAODTrack *aodtrack = static_cast(track); + if(!(aodtrack->TestFilterBit(AliAODTrack::kTrkGlobalNoDCA) || aodtrack->TestFilterBit(AliAODTrack::kTrkITSsa))) return kFALSE; + if(!aodtrack->IsOn(AliAODTrack::kITSrefit)) return kFALSE; + nclustersITS = aodtrack->GetITSNcls(); + for(Int_t ily = 2; ily < 5; ily++) + if(aodtrack->HasPointOnITSLayer(ily)) nclustersOuter++; + } else { + const AliESDtrack *esdtrack = static_cast(track); + if(esdtrack->GetStatus() & AliESDtrack::kITSpureSA) return kFALSE; + if(esdtrack->GetStatus() & AliESDtrack::kTPCin) return kFALSE; + if(!(esdtrack->GetStatus() & AliESDtrack::kITSrefit)) return kFALSE; + nclustersITS = esdtrack->GetITSclusters(NULL); + for(Int_t ily = 2; ily < 5; ily++) + if(esdtrack->HasPointOnITSLayer(ily)) nclustersOuter++; + } + if(nclustersITS < 4) return kFALSE; + if(nclustersOuter < 3) return kFALSE; + + // Do ITS PID + Double_t nsigmaITS = fPIDBackground->GetPIDResponse()->NumberOfSigmasITS(track, AliPID::kElectron); + fHnsigmaITS->Fill(track->Pt(), nsigmaITS); + if((nsigmaITS - fITSmeanShift) > fITSnSigmaHigh ) return kFALSE; + if((nsigmaITS - fITSmeanShift) < fITSnSigmaLow ) return kFALSE; + // if global track, we apply also TPC PID + return kTRUE; +} + +//_______________________________________________________________________________________________ +void AliHFENonPhotonicElectron::FillMotherArray(Int_t tr, Int_t index, Int_t a[], Int_t NumberofGenerations){ + // + // Fill an array of mothers for a particle of a given trackid + // + Int_t imother(-1),pdg(-1); + pdg = GetMotherPDG(tr,imother); + if(index < NumberofGenerations){ + if(TMath::Abs(pdg) == 11){ + AliDebug(2, "Mother is electron, look further to fill motherarray"); + FillMotherArray(imother,index,a,NumberofGenerations); + } else { + a[index] = imother; + index++; + FillMotherArray(imother,index,a,NumberofGenerations); + } + } +} + + +//_______________________________________________________________________________________________ +Int_t AliHFENonPhotonicElectron::FindGeneration(Int_t a[], Int_t b[], Int_t NumberofGenerations){ + // + // Find the common mother in 2 given arrays and return its generation. + // + Int_t Generation = 0; + for(Int_t iGeneration = 0; iGeneration < NumberofGenerations; iGeneration++){ + for(Int_t jGeneration = 0; jGeneration < NumberofGenerations; jGeneration++){ + if(a[iGeneration] == b[jGeneration] && a[iGeneration]!= -1 && b[jGeneration]!= -1){ + AliDebug(3,Form("* compared a and b %i == %i \n", a[iGeneration], b[jGeneration])); + if(iGeneration > jGeneration){ + Generation = iGeneration + 1; + } else { + Generation = jGeneration + 1; + } + AliDebug(1,Form(" Found common mother gen: %i \n",Generation)); + return Generation; + } + } + } + AliDebug(1,Form(" Found common mother gen: %i \n",Generation)); + return Generation; } + + diff --git a/PWGHF/hfe/AliHFENonPhotonicElectron.h b/PWGHF/hfe/AliHFENonPhotonicElectron.h index fca2f67e9f3..d3164cc8dff 100644 --- a/PWGHF/hfe/AliHFENonPhotonicElectron.h +++ b/PWGHF/hfe/AliHFENonPhotonicElectron.h @@ -44,10 +44,12 @@ class AliHFENonPhotonicElectron : public TNamed { kElectronfrompi0both = 3, kElectronfrometa = 4, kElectronfrometaboth = 5, - kElectronfromC = 6, - kElectronfromB = 7, - kElectronfromother = 8, - kNoElectron = 9 + kElectronfromomega = 6, + kElectronfromomegaboth = 7, + kElectronfromC = 8, + kElectronfromB = 9, + kElectronfromother = 10, + kNoElectron = 11 } Source_t; typedef enum{ @@ -74,15 +76,21 @@ class AliHFENonPhotonicElectron : public TNamed { void SetMaxOpening3D (Double_t MaxOpening3D) { fMaxOpening3D = MaxOpening3D; }; // void SetMaxOpeningTheta (Double_t MaxOpeningTheta) { fMaxOpeningTheta = MaxOpeningTheta; }; // void SetMaxOpeningPhi (Double_t MaxOpeningPhi) { fMaxOpeningPhi = MaxOpeningPhi; }; + void SetStudyRadius (Bool_t studyRadius) { fStudyRadius = studyRadius; }; void SetAlgorithmMA (Bool_t algorithmMA) { fAlgorithmMA = algorithmMA; }; void SetMassConstraint (Bool_t MassConstraint) { fSetMassConstraint = MassConstraint; }; void SetITSMeanShift (Double_t meanshift) { fITSmeanShift = meanshift; } void SetITSnSigmaHigh (Double_t nSigmaHigh) { fITSnSigmaHigh = nSigmaHigh; } void SetITSnSigmaLow (Double_t nSigmaLow) { fITSnSigmaLow = nSigmaLow; } - void SetminPt (Double_t minpt) { fminPt = minpt; } + void SetminPt (Double_t minpt) { fminPt = minpt; } + void SetEtaDalitzWeightFactor(Double_t etaDalitzWeightFactor){ fEtaDalitzWeightFactor = etaDalitzWeightFactor;} - void SelectCategory1Tracks(Bool_t doSelect = kTRUE) { fSelectCategory1tracks = doSelect; } - void SelectCategory2Tracks(Bool_t doSelect = kTRUE) { fSelectCategory2tracks = doSelect; } + void SelectCategory1Tracks(Bool_t doSelect = kTRUE) { fSelectCategory1tracks = doSelect; } + void SelectCategory2Tracks(Bool_t doSelect = kTRUE) { fSelectCategory2tracks = doSelect; } + + void SetAnaPairGen(Bool_t setAna = kTRUE, Int_t nGen = 2) { fAnaPairGen = setAna; fNumberofGenerations = nGen;}; + void SetNPairGenerations(Int_t nGen) { fNumberofGenerations = nGen;}; + void SetDisplayMCStack(Bool_t setDisplay = kTRUE) { fDisplayMCStack = setDisplay;}; TList *GetListOutput() const { return fListOutput; }; THnSparseF *GetAssElectronHisto() const { return fAssElectron; }; @@ -104,9 +112,13 @@ class AliHFENonPhotonicElectron : public TNamed { void SetPtBinning(Int_t nbins, const Double_t *const binning) { fPtBinning.Set(nbins+1, binning); } void SetEtaBinning(const TArrayD &binning) { fEtaBinning = binning; } void SetEtaBinning(Int_t nbins, const Double_t *const binning) { fEtaBinning.Set(nbins+1, binning); } + void SetInvMassBinning(const TArrayD &binning) { fInvMassBinning = binning; } + void SetInvMassBinning(Int_t nbins, const Double_t *const binning) { fInvMassBinning.Set(nbins+1, binning); } private: + void FillMotherArray(Int_t tr, int index, Int_t a[], int NumberofGenerations); + Int_t FindGeneration(Int_t a[], Int_t b[], int NumberofGenerations); Int_t GetMotherPDG(Int_t tr, Int_t &motherIndex) const; Int_t CheckPdg (Int_t tr) const; Double_t Radius (Int_t tr) const; @@ -115,6 +127,7 @@ class AliHFENonPhotonicElectron : public TNamed { Int_t IsMotherC (Int_t tr) const; Int_t IsMotherB (Int_t tr) const; Int_t IsMotherEta (Int_t tr) const; + Int_t IsMotherOmega (Int_t tr) const; Bool_t MakePairDCA(const AliVTrack *inclusive, const AliVTrack *associated, AliVEvent *vEvent, Bool_t isAOD, Double_t &invMass, Double_t &angle) const; Bool_t MakePairKF(const AliVTrack *inclusive, const AliVTrack *associated, AliKFVertex &primV, Double_t &invMass, Double_t &angle) const; Bool_t FilterCategory1Track(const AliVTrack * const track, Bool_t isAOD, Int_t binct); @@ -130,6 +143,8 @@ class AliHFENonPhotonicElectron : public TNamed { const AliPIDResponse *fkPIDRespons; // PID response TArrayD fPtBinning; // pt binning TArrayD fEtaBinning; // eta binning + TArrayD fInvMassBinning; // Inv mass binning + Bool_t fStudyRadius; // Study radius Bool_t fAlgorithmMA; // algorithm MA Double_t fChi2OverNDFCut; // Limit chi2 Double_t fMaxDCA; // Limit dca @@ -144,6 +159,7 @@ class AliHFENonPhotonicElectron : public TNamed { Double_t fITSnSigmaHigh; // ITS n Sigma electron cut high (>0) Double_t fITSnSigmaLow; // ITS n Sigma electron cut low (<0) Double_t fminPt; // min pT cut for the associated leg + Double_t fEtaDalitzWeightFactor; // Relative modification for the weighting factor for electrons from Eta Dalitz decays (default = 1); TArrayI *fArraytrack; //! list of associated tracks Int_t fCounterPoolBackground; // number of associated electrons Int_t fnumberfound; // number of inclusive electrons @@ -162,10 +178,13 @@ class AliHFENonPhotonicElectron : public TNamed { // THnSparseF *fUSignAngle; //! angle, c, source // THnSparseF *fLSignAngle; //! angle, c, source + Bool_t fAnaPairGen; // switch on the analysis of the pair generation (switch for performance) + Int_t fNumberofGenerations; // number of generations stored in pair container variable nGen + Bool_t fDisplayMCStack; // display MC stack for true likesign pairs (usually misidentification), for debugging AliHFENonPhotonicElectron(const AliHFENonPhotonicElectron &ref); - ClassDef(AliHFENonPhotonicElectron, 4); //!example of analysis + ClassDef(AliHFENonPhotonicElectron, 5); //!example of analysis }; #endif diff --git a/PWGHF/hfe/macros/AddTaskHFEnpePbPb.C b/PWGHF/hfe/macros/AddTaskHFEnpePbPb.C index f00e12c2f1a..7e3f181aa09 100755 --- a/PWGHF/hfe/macros/AddTaskHFEnpePbPb.C +++ b/PWGHF/hfe/macros/AddTaskHFEnpePbPb.C @@ -1,9 +1,13 @@ AliAnalysisTask *AddTaskHFEnpePbPb(Bool_t MCthere, Bool_t isAOD, - Bool_t kNPERef = kTRUE, - Bool_t kNPEkAny = kFALSE, - Bool_t kNPERefMCf = kTRUE, - Bool_t kNPERefTPConly = kTRUE) + Bool_t kNPERef = kTRUE, + Bool_t kNPEkAny = kFALSE, + Bool_t kNPERefTPConly = kFALSE, + Bool_t kNPETOFITS = kFALSE, + Bool_t kNPETOFlast = kFALSE, + Bool_t kNPEw = kFALSE, + Bool_t kNPEkf = kFALSE) + { // Default settings (TOF-TPC PbPb) const int kDefTPCcl = 130; @@ -33,6 +37,18 @@ AliAnalysisTask *AddTaskHFEnpePbPb(Bool_t MCthere, const double kassTPCSminus = -3.0; const double kassTPCSplus = 3.0; + Int_t kWei = -1; + /* + if (MCthere) kWei = 9; // default Pb-Pb + enum { + + k11a10abisweiData = 6, // LHC11a10abis weights + k11a10bplusweiData = 7, // LHC11a10b_plus weights + k11a10bpluswei11a10abis = 8, // LHC11a10b_plus weights for LHC11a10abis + k11a10bbisweiData = 9, // LHC11a10bbis weights + }; + */ + //get the current analysis manager AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager(); if (!mgr) { @@ -53,14 +69,27 @@ AliAnalysisTask *AddTaskHFEnpePbPb(Bool_t MCthere, dEdxachm[icent] = kassTPCSplus; } + + const Bool_t isBeauty = kFALSE; // should be false to prevent inclusive analysis + if(kNPERef){ // ************************************************************** // // Reference task // // ************************************************************** - RegisterTaskNPEPbPb( MCthere, isAOD, kDefTPCcl, kDefTPCclPID, kDefITScl, kDefDCAr, kDefDCAz, tpcl1, dEdxhm, kDefTOFs, AliHFEextraCuts::kBoth, kDefITSchi2percluster, kDefTPCclshared, etacorrection, multicorrection, kDefEtaIncMin, kDefEtaIncMax, - kassETAm, kassETAp, kassITS, kassTPCcl, kassTPCPIDcl, kassDCAr, kassDCAz, dEdxaclm, dEdxachm, kTRUE, kFALSE,kFALSE); + RegisterTaskNPEPbPb( MCthere, isAOD, isBeauty, kDefTPCcl, kDefTPCclPID, kDefITScl, kDefDCAr, kDefDCAz, tpcl1, dEdxhm, kDefTOFs,0., AliHFEextraCuts::kBoth, kDefITSchi2percluster, kDefTPCclshared, etacorrection, multicorrection, kFALSE, kDefEtaIncMin, kDefEtaIncMax, + kassETAm, kassETAp, kassITS, kassTPCcl, kassTPCPIDcl, kassDCAr, kassDCAz, dEdxaclm, dEdxachm, kTRUE, kFALSE,-1); + } + + if(kNPETOFlast){ + // ************************************************************** + // + // Apply TOF after TPC for mismatch background studies + // + // ************************************************************** + RegisterTaskNPEPbPb( MCthere, isAOD, isBeauty, kDefTPCcl, kDefTPCclPID, kDefITScl, kDefDCAr, kDefDCAz, tpcl1, dEdxhm, kDefTOFs,0., AliHFEextraCuts::kBoth, kDefITSchi2percluster, kDefTPCclshared, etacorrection, multicorrection, kTRUE, kDefEtaIncMin, kDefEtaIncMax, + kassETAm, kassETAp, kassITS, kassTPCcl, kassTPCPIDcl, kassDCAr, kassDCAz, dEdxaclm, dEdxachm, kTRUE, kFALSE,-1); } if(kNPEkAny){ @@ -69,17 +98,18 @@ AliAnalysisTask *AddTaskHFEnpePbPb(Bool_t MCthere, // task for kAny instead of kBoth // // ************************************************************** - RegisterTaskNPEPbPb( MCthere, isAOD, kDefTPCcl, kDefTPCclPID, kDefITScl, kDefDCAr, kDefDCAz, tpcl1, dEdxhm, kDefTOFs, AliHFEextraCuts::kAny, kDefITSchi2percluster, kDefTPCclshared, etacorrection, multicorrection, kDefEtaIncMin, kDefEtaIncMax, - kassETAm, kassETAp, kassITS, kassTPCcl, kassTPCPIDcl, kassDCAr, kassDCAz, dEdxaclm, dEdxachm, kTRUE, kFALSE,kFALSE); + RegisterTaskNPEPbPb( MCthere, isAOD, isBeauty, kDefTPCcl, kDefTPCclPID, kDefITScl, kDefDCAr, kDefDCAz, tpcl1, dEdxhm, kDefTOFs,0., AliHFEextraCuts::kAny, kDefITSchi2percluster, kDefTPCclshared, etacorrection, multicorrection, kFALSE, kDefEtaIncMin, kDefEtaIncMax, + kassETAm, kassETAp, kassITS, kassTPCcl, kassTPCPIDcl, kassDCAr, kassDCAz, dEdxaclm, dEdxachm, kTRUE, kFALSE,-1); } - if(kNPERefMCf){ + + if(kNPEw && MCthere){ // ************************************************************** // - // Reference task + MC fake rejected + // Reference task // // ************************************************************** - RegisterTaskNPEPbPb( MCthere, isAOD, kDefTPCcl, kDefTPCclPID, kDefITScl, kDefDCAr, kDefDCAz, tpcl1, dEdxhm, kDefTOFs, AliHFEextraCuts::kBoth, kDefITSchi2percluster, kDefTPCclshared, etacorrection, multicorrection, kDefEtaIncMin, kDefEtaIncMax, - kassETAm, kassETAp, kassITS, kassTPCcl, kassTPCPIDcl, kassDCAr, kassDCAz, dEdxaclm, dEdxachm, kTRUE, kFALSE, kTRUE); + RegisterTaskNPEPbPb( MCthere, isAOD, isBeauty, kDefTPCcl, kDefTPCclPID, kDefITScl, kDefDCAr, kDefDCAz, tpcl1, dEdxhm, kDefTOFs,0., AliHFEextraCuts::kBoth, kDefITSchi2percluster, kDefTPCclshared, etacorrection, multicorrection, kFALSE, kDefEtaIncMin, kDefEtaIncMax, + kassETAm, kassETAp, kassITS, kassTPCcl, kassTPCPIDcl, kassDCAr, kassDCAz, dEdxaclm, dEdxachm, kTRUE, kFALSE, 0,kWei); } if(kNPERefTPConly){ @@ -88,26 +118,57 @@ AliAnalysisTask *AddTaskHFEnpePbPb(Bool_t MCthere, // Reference task // // ************************************************************** - RegisterTaskNPEPbPb( MCthere, isAOD, kDefTPCcl, kDefTPCclPID, kDefITScl, kDefDCAr, kDefDCAz, tpcl1, dEdxhm, 0., AliHFEextraCuts::kBoth, kDefITSchi2percluster, kDefTPCclshared, etacorrection, multicorrection, kDefEtaIncMin, kDefEtaIncMax, - kassETAm, kassETAp, kassITS, kassTPCcl, kassTPCPIDcl, kassDCAr, kassDCAz, dEdxaclm, dEdxachm, kTRUE, kFALSE, kFALSE); + RegisterTaskNPEPbPb( MCthere, isAOD, isBeauty, kDefTPCcl, kDefTPCclPID, kDefITScl, kDefDCAr, kDefDCAz, tpcl1, dEdxhm, 0.,0., AliHFEextraCuts::kBoth, kDefITSchi2percluster, kDefTPCclshared, etacorrection, multicorrection, kFALSE, kDefEtaIncMin, kDefEtaIncMax, + kassETAm, kassETAp, kassITS, kassTPCcl, kassTPCPIDcl, kassDCAr, kassDCAz, dEdxaclm, dEdxachm, kTRUE, kFALSE,-1); + } + + + if(kNPETOFITS){ + // ************************************************************** + // + // Reference task + // + // ************************************************************** + RegisterTaskNPEPbPb( MCthere, isAOD, isBeauty, kDefTPCcl, kDefTPCclPID, kDefITScl, kDefDCAr, kDefDCAz, tpcl1, dEdxhm, kDefTOFs, kDefITSs, AliHFEextraCuts::kBoth, kDefITSchi2percluster, kDefTPCclshared, etacorrection, multicorrection, kFALSE, kDefEtaIncMin, kDefEtaIncMax, + kassETAm, kassETAp, kassITS, kassTPCcl, kassTPCPIDcl, kassDCAr, kassDCAz, dEdxaclm, dEdxachm, kTRUE, kFALSE,-1); + } + + + if(kNPEkf){ + // ************************************************************** + // + // Use KF particle + // + // ************************************************************** + RegisterTaskNPEPbPb( MCthere, isAOD, isBeauty, kDefTPCcl, kDefTPCclPID, kDefITScl, kDefDCAr, kDefDCAz, tpcl1, dEdxhm, kDefTOFs,0., AliHFEextraCuts::kBoth, kDefITSchi2percluster, kDefTPCclshared, etacorrection, multicorrection, kFALSE, kDefEtaIncMin, kDefEtaIncMax, + kassETAm, kassETAp, kassITS, kassTPCcl, kassTPCPIDcl, kassDCAr, kassDCAz, dEdxaclm, dEdxachm, kTRUE, kFALSE,-1,2,kFALSE,kFALSE,kFALSE,kTRUE); } + return NULL; + } //=============================================================================== -AliAnalysisTask *RegisterTaskNPEPbPb(Bool_t useMC, Bool_t isAOD, - Int_t tpcCls=120, Int_t tpcClsPID=80, - Int_t itsCls=4, Double_t dcaxy=1.0, Double_t dcaz=2.0, - Double_t *tpcdEdxcutlow=NULL, Double_t *tpcdEdxcuthigh=NULL, - Double_t tofs=3., Int_t itshitpixel =AliHFEextraCuts::kBoth, - Double_t itschi2percluster = -1, Double_t tpcsharedcluster = 1.1, - Bool_t etacorr=kFALSE, Bool_t multicorr = kFALSE, - Double_t etaIncMin = -0.8, Double_t etaIncMax = 0.8, - Double_t assETAm=-0.8, Double_t assETAp=0.8, Int_t assITS=2, Int_t assTPCcl=100, - Int_t assTPCPIDcl=80, Double_t assDCAr=1.0, Double_t assDCAz=2.0, - Double_t *assTPCSminus = NULL, Double_t *assTPCSplus=NULL, - Bool_t useCat1Tracks = kTRUE, Bool_t useCat2Tracks = kTRUE, Bool_t rejectMCFake = kFALSE) + +//=============================================================================== +AliAnalysisTask *RegisterTaskNPEPbPb(Bool_t useMC, Bool_t isAOD, Bool_t beauty, + Int_t tpcCls=120, Int_t tpcClsPID=80, + Int_t itsCls=4, Double_t dcaxy=1.0, Double_t dcaz=2.0, + Double_t *tpcdEdxcutlow=NULL, Double_t *tpcdEdxcuthigh=NULL, + Double_t tofs=3., Double_t itss=0., Int_t itshitpixel =AliHFEextraCuts::kBoth, + Double_t itschi2percluster = -1, Double_t tpcsharedcluster = 1.1, + Bool_t etacorr=kFALSE, Bool_t multicorr = kFALSE, Bool_t toflast = kFALSE, + Double_t etaIncMin = -0.8, Double_t etaIncMax = 0.8, + Double_t assETAm=-0.8, Double_t assETAp=0.8, Int_t assITS=2, Int_t assTPCcl=100, + Int_t assTPCPIDcl=80, Double_t assDCAr=1.0, Double_t assDCAz=2.0, + Double_t *assTPCSminus = NULL, Double_t *assTPCSplus=NULL, + Bool_t useCat1Tracks = kTRUE, Bool_t useCat2Tracks = kTRUE, + Int_t weightlevelback = -1,Int_t wei = 2, + Bool_t releasemcvx = kFALSE, + Bool_t ipCharge = kFALSE, + Bool_t ipOpp = kFALSE, + Bool_t usekfparticle = kFALSE) { // @@ -118,8 +179,10 @@ AliAnalysisTask *RegisterTaskNPEPbPb(Bool_t useMC, Bool_t isAOD, Int_t tpclow = 0; if(tpcdEdxcutlow) tpclow = (Int_t) (tpcdEdxcutlow[0]*1000.); Int_t itofs = (Int_t)(tofs*10.); + Int_t iitss = (Int_t)(itss*10.); Int_t ipixelany = itshitpixel; Int_t imult = multicorr ? 1 : 0; + Int_t itofpos = toflast ? 1 : 0; // // Cuts on the associated leg @@ -129,38 +192,62 @@ AliAnalysisTask *RegisterTaskNPEPbPb(Bool_t useMC, Bool_t isAOD, Int_t iassTPCSplus = assTPCSplus ? (Int_t)(assTPCSplus[0]*1000) : 0; Int_t icat1 = useCat1Tracks ? 1 : 0; Int_t icat2 = useCat2Tracks ? 1 : 0; - Int_t irejectMCFake = rejectMCFake ? 1 : 0; + + Bool_t nondefaultcentr = kFALSE; - TString appendix(TString::Format("SPD%d_incTPCc%dTPCp%dITS%dDCAr%dz%dTPCs%dTOFs%dm%d_photTPCc%dTPCp%dITS%dDCAr%dDCAz%dTPCs%dMCf%d",ipixelany,tpcCls,tpcClsPID,itsCls,idcaxy,idcaz,tpclow,itofs,imult,assTPCcl,assTPCPIDcl,assITS,iassDCAr,iassDCAz,iassTPCSplus,irejectMCFake)); - - printf("Add macro appendix %s\n", appendix.Data()); + TString cweightsback(""); + if(weightlevelback>=0) { + cweightsback += "Wa"; + cweightsback += weightlevelback; + } - if(!gROOT->GetListOfGlobalFunctions()->FindObject("ConfigHFEnpePbPb"))gROOT->LoadMacro("$ALICE_ROOT/PWGHF/hfe/macros/configs/PbPb/ConfigHFEnpePbPb.C"); + TString cmvx(""); + if(releasemcvx) { + cmvx += "MCVR"; + } + TString kfp(""); + if(usekfparticle) { + kfp += "kf"; + } + + if(beauty) { + if(ipCharge && ipOpp) TString cbeauty("BeautyIPopp"); + else if(ipCharge) TString cbeauty("BeautyIPcrg"); + else if(!ipCharge) TString cbeauty("Beauty"); + else TString cbeauty("BeautyWrong"); + } + else TString cbeauty(""); + + TString appendix(TString::Format("SPD%d_incTPCc%dTPCp%dITS%dDCAr%dz%dTPCs%dTOFs%dITSs%dm%dt%d_photTPCc%dTPCp%dITS%dDCAr%dDCAz%dTPCs%d%s%s%s%s",ipixelany,tpcCls,tpcClsPID,itsCls,idcaxy,idcaz,tpclow,itofs,iitss,imult,itofpos,assTPCcl,assTPCPIDcl,assITS,iassDCAr,iassDCAz,iassTPCSplus,cweightsback.Data(),cmvx.Data(),cbeauty.Data(),kfp.Data())); + + printf("Add macro appendix %s\n", appendix.Data()); + + if(useMC&&!gROOT->GetListOfGlobalFunctions()->FindObject("ConfigWeightFactors")) gROOT->LoadMacro("$TRAIN_ROOT/util/hfe/configs/ConfigWeightFactors.C"); + if(!gROOT->GetListOfGlobalFunctions()->FindObject("ConfigHFEnpePbPb"))gROOT->LoadMacro("$TRAIN_ROOT/util/hfe/configs/ConfigHFEnpePbPb.C"); + AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager(); AliAnalysisDataContainer *cinput = mgr->GetCommonInputContainer(); - AliAnalysisTaskHFE *task = ConfigHFEnpePbPb(useMC, isAOD, appendix, tpcCls, tpcClsPID, itsCls, dcaxy, dcaz, tpcdEdxcutlow, tpcdEdxcuthigh, tofs, 0, itshitpixel, itschi2percluster, tpcsharedcluster, etacorr, multicorr, etaIncMin, etaIncMax, - assETAm, assETAp, assITS, assTPCcl, assTPCPIDcl, assDCAr, assDCAz, assTPCSminus, assTPCSplus, useCat1Tracks, useCat2Tracks,rejectMCFake); + AliAnalysisTaskHFE *task = ConfigHFEnpePbPb(useMC, isAOD, appendix, tpcCls, tpcClsPID, itsCls, dcaxy, dcaz, tpcdEdxcutlow, tpcdEdxcuthigh, tofs, 0, itss, itshitpixel, itschi2percluster, tpcsharedcluster, etacorr, multicorr, toflast, etaIncMin, etaIncMax, + assETAm, assETAp, assITS, assTPCcl, assTPCPIDcl, + assDCAr, assDCAz, assTPCSminus, assTPCSplus, + useCat1Tracks, useCat2Tracks, weightlevelback,usekfparticle); if(isAOD) task->SetAODAnalysis(); else task->SetESDAnalysis(); - + if (useMC) task->SetHasMCData(kTRUE); else task->SetHasMCData(kFALSE); + if(useMC&&(beauty || (weightlevelback>=0))) ConfigWeightFactors(task,kFALSE,wei);//2;For default PbPb task->SelectCollisionCandidates(AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral); - TString containerName = mgr->GetCommonFileName(); - containerName += ":HFE"; - containerName += appendix.Data(); - printf("container name: %s\n", containerName.Data()); - //create data containers - task->ConnectOutput(1, mgr->CreateContainer(Form("HFE_Results_%s", appendix.Data()), TList::Class(), AliAnalysisManager::kOutputContainer, containerName.Data())); - task->ConnectOutput(2, mgr->CreateContainer(Form("HFE_QA_%s", appendix.Data()), TList::Class(), AliAnalysisManager::kOutputContainer, containerName.Data())); + task->ConnectOutput(1, mgr->CreateContainer(Form("HFE_Results_%s", appendix.Data()), TList::Class(), AliAnalysisManager::kOutputContainer, Form("HFE%s.root", appendix.Data()))); + task->ConnectOutput(2, mgr->CreateContainer(Form("HFE_QA_%s", appendix.Data()), TList::Class(), AliAnalysisManager::kOutputContainer, Form("HFE%s.root", appendix.Data()))); mgr->ConnectInput(task, 0, cinput ); - + mgr->AddTask(task); return NULL; diff --git a/PWGHF/hfe/macros/configs/PbPb/ConfigHFEnpePbPb.C b/PWGHF/hfe/macros/configs/PbPb/ConfigHFEnpePbPb.C index 86d23a97cfd..5370bdada7d 100755 --- a/PWGHF/hfe/macros/configs/PbPb/ConfigHFEnpePbPb.C +++ b/PWGHF/hfe/macros/configs/PbPb/ConfigHFEnpePbPb.C @@ -45,20 +45,21 @@ AliAnalysisTaskHFE* ConfigHFEnpePbPb(Bool_t useMC, Bool_t isAOD, TString appendi UChar_t TPCcl=70, UChar_t TPCclPID = 80, UChar_t ITScl=3, Double_t DCAxy=1000., Double_t DCAz=1000., Double_t* tpcdEdxcutlow=NULL, Double_t* tpcdEdxcuthigh=NULL, - Double_t TOFs=3., Int_t TOFmis=0, + Double_t TOFs=3., Int_t TOFmis=0, + Double_t ITSs=0., Int_t itshitpixel = 0, Double_t itsChi2PerClusters, Double_t tpcClShared, - Bool_t etacor = kFALSE, Bool_t multicor = kFALSE, - Double_t etami=-0.8, Double_t etama=0.8, + Bool_t etacor = kFALSE, Bool_t multicor = kFALSE,Bool_t toflast = kFALSE, + Double_t etami=-0.8, Double_t etama=0.8, Double_t assETAm=-0.8, Double_t assETAp=0.8, Int_t assITS=2, Int_t assTPCcl=100, Int_t assTPCPIDcl=80, Double_t assDCAr=1.0, Double_t assDCAz=2.0, Double_t *assTPCSminus=NULL, Double_t *assTPCSplus=NULL, Bool_t useCat1Tracks = kTRUE, Bool_t useCat2Tracks = kTRUE, - Bool_t rejectMCFake = kFALSE) + Int_t weightlevelback = -1,Bool_t usekfparticle = kFALSE) { Bool_t kAnalyseTaggedTracks = kFALSE; - Bool_t kApplyPreselection = kTRUE; + Bool_t kApplyPreselection = kFALSE; //***************************************// // Setting up the HFE cuts // @@ -78,7 +79,9 @@ AliAnalysisTaskHFE* ConfigHFEnpePbPb(Bool_t useMC, Bool_t isAOD, TString appendi hfecuts->SetEtaRange(etami,etama); hfecuts->SetFractionOfSharedTPCClusters(tpcClShared); hfecuts->SetAcceptKinkMothers(); - if(isAOD) hfecuts->SetAODFilterBit(2); + //if(isAOD) hfecuts->SetAODFilterBit(2); // 2010 + if(isAOD) hfecuts->SetAODFilterBit(4); // 2011 + if((itshitpixel==AliHFEextraCuts::kAny) || (itshitpixel==AliHFEextraCuts::kSecond)) hfecuts->SetProductionVertex(0,7,0,7); @@ -87,6 +90,10 @@ AliAnalysisTaskHFE* ConfigHFEnpePbPb(Bool_t useMC, Bool_t isAOD, TString appendi hfecuts->SetUseMixedVertex(kTRUE); hfecuts->SetVertexRange(10.); + //Bool_t ipSig = kFALSE; + //hfecuts->SetIPcutParam(0.0054,0.078,-0.56,0,ipSig,ipCharge,ipOpp); + //if(isBeauty || releasemcvx) hfecuts->SetProductionVertex(0,100,0,100); + // TOF settings: Int_t usetof=0; Bool_t kTOFmis=kFALSE; @@ -94,7 +101,7 @@ AliAnalysisTaskHFE* ConfigHFEnpePbPb(Bool_t useMC, Bool_t isAOD, TString appendi usetof = 1; printf("CONFIGURATION FILE: TOF is used \n"); hfecuts->SetTOFPIDStep(kTRUE); - if(useMC) hfecuts->SetMatchTOFLabel(kTRUE); + if(useMC && (!isAOD)) hfecuts->SetMatchTOFLabel(kTRUE); //if(useMC) hfecuts->SetMatchTOFLabel(kFALSE); printf("CONFIGURATION FILE: TOF PID step is requested !!!! \n"); if (TOFmis>0){ @@ -103,6 +110,13 @@ AliAnalysisTaskHFE* ConfigHFEnpePbPb(Bool_t useMC, Bool_t isAOD, TString appendi } } + // ITS settings: + Int_t useits=0; + if (ITSs>0.){ + useits = 1; + printf("CONFIGURATION FILE: ITS is used \n"); + } + //***************************************// // Setting up the task // //***************************************// @@ -112,13 +126,16 @@ AliAnalysisTaskHFE* ConfigHFEnpePbPb(Bool_t useMC, Bool_t isAOD, TString appendi task->SetPbPbAnalysis(); task->SetRemovePileUp(kFALSE); task->SetHFECuts(hfecuts); - task->SetRejectKinkMother(kFALSE); task->GetPIDQAManager()->SetHighResolutionHistos(); - if(useMC && rejectMCFake) task->SetRejectMCFakeTracks(kTRUE); // MC label negative + task->SetRejectKinkMother(kFALSE); + //if(useMC && rejectMCFake) task->SetRejectMCFakeTracks(kTRUE); // MC label negative // Determine the centrality estimator task->SetCentralityEstimator("V0M"); + // Get weights + task->SetWeightHist(); + //***************************************// // Prepare preselection // // This mimics the ESD->AOD filter in // @@ -167,13 +184,30 @@ AliAnalysisTaskHFE* ConfigHFEnpePbPb(Bool_t useMC, Bool_t isAOD, TString appendi AliHFEpid *pid = task->GetPID(); if(useMC) pid->SetHasMCData(kTRUE); - if (usetof){ - pid->AddDetector("TOF", 0); - pid->AddDetector("TPC", 1); - } else { + if (usetof && (useits<1)){ + if(toflast){ + pid->AddDetector("TPC", 0); + pid->AddDetector("TOF", 1); + } else { + pid->AddDetector("TOF", 0); + pid->AddDetector("TPC", 1); + } + } else if(usetof && (useits>0)){ + if(toflast){ + pid->AddDetector("ITS", 0); + pid->AddDetector("TPC", 1); + pid->AddDetector("TOF", 2); + + } else { + pid->AddDetector("TOF", 0); + pid->AddDetector("ITS", 1); + pid->AddDetector("TPC", 2); + } + } + else { pid->AddDetector("TPC", 0); } - + // Configure TPC PID // do the identical thing in data and MC Double_t paramsTPCdEdxcutlow[12] ={0.0, 0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; @@ -215,6 +249,13 @@ AliAnalysisTaskHFE* ConfigHFEnpePbPb(Bool_t useMC, Bool_t isAOD, TString appendi if (kTOFmis){ tofpid->SetRejectTOFmismatch(); } + if(toflast) tofpid->SetGenerateTOFmismatch(); // Makes only sense if TOF is the last detector + } + + // Configure ITS PID + if (useits>0){ + AliHFEpidITS *itspid = pid->GetDetPID(AliHFEpid::kITSpid); + itspid->SetITSnSigma(1.); } // To make different upper TOF cut to see contamination effect @@ -250,7 +291,8 @@ AliAnalysisTaskHFE* ConfigHFEnpePbPb(Bool_t useMC, Bool_t isAOD, TString appendi hfeBackgroundCuts->SetMinNClustersTPC(assTPCcl); hfeBackgroundCuts->SetMinNClustersTPCPID(assTPCPIDcl); hfeBackgroundCuts->SetMaxImpactParam(assDCAr,assDCAz); - if(isAOD) hfeBackgroundCuts->SetAODFilterBit(0); + if(isAOD) hfeBackgroundCuts->SetAODFilterBit(0); // 20102011 + if(usekfparticle) backe->SetAlgorithmMA(kTRUE); //hfeBackgroundCuts->SetQAOn(); // QA AliHFEpid *pidbackground = backe->GetPIDBackground(); @@ -282,9 +324,16 @@ AliAnalysisTaskHFE* ConfigHFEnpePbPb(Bool_t useMC, Bool_t isAOD, TString appendi // apply opening angle cut to reduce file size backe->SetMaxInvMass(0.3); + backe->SetStudyRadius(kTRUE); backe->SetPtBinning(sizept, ptbinning); backe->SetEtaBinning(sizeeta, etabinning); + // MC weight + if(useMC) { + //printf("test put weight %d\n",weightlevelback); + if((weightlevelback >=0) && (weightlevelback < 3)) backe->SetWithWeights(weightlevelback); + } + task->SetHFEBackgroundSubtraction(backe); //***************************************// diff --git a/PWGHF/hfe/macros/configs/PbPb/ConfigWeightFactors.C b/PWGHF/hfe/macros/configs/PbPb/ConfigWeightFactors.C new file mode 100644 index 00000000000..5b656a8d6e5 --- /dev/null +++ b/PWGHF/hfe/macros/configs/PbPb/ConfigWeightFactors.C @@ -0,0 +1,164 @@ +void ConfigWeightFactors(AliAnalysisTaskHFE *task, Bool_t syst = kFALSE, Int_t collType = 1, TString filename = "nonHFEcorrect.root"){ + // + // Set weighting factors for nonHFE backgrounds + // Option "collType": 0 for pp 2.76 TeV; 1 for pp 7 TeV; 2 for PbPb; 3 for DPMJET pPb; 4 for HIJING pPb; 5 for DPMJET/HIJING pPb: 6 Pb-Pb LHC11a10abis; 7 Pb-Pb LHC11a10b_plus; 8 Pb-Pb LHC11a10b_plus for LHC11a10abis ; 9 Pb-Pb LHC11a10b_plus for LHC11a10bbis; 10 for pp LHC106; 11 for pp LHC106a; 12 for pp LHC107a_d + // + //Get the correction factors for Non-HF electron yields from a root-file + Double_t elecBackGroundWeight[11][6][44][3];//centrality, species, momentum, background level + for(Int_t iCent = 0; iCent < 11; iCent++){ + for(Int_t iSpecies = 0; iSpecies < 6; iSpecies++){ + for(Int_t iBin = 0; iBin < 44; iBin++){ + for(Int_t iError = 0; iError < 3; iError++){ + elecBackGroundWeight[iCent][iSpecies][iBin][iError] = 0; + } + } + } + } + const Char_t *backNameMC[6] = {"pion","eta","omega","phi","etap","rho"}; + printf("Take the weights from %s\n",Form("$ALICE_ROOT/PWGHF/hfe/macros/%s",filename.Data())); + printf("collType %d\n",collType); + TFile *weightFile = TFile::Open(Form("$ALICE_ROOT/PWGHF/hfe/macros/%s",filename.Data())); + if(weightFile){ + if(syst){ + TH1F *hRelErr[2][2];//errors for pion yields, which form the correlated component of the relative error for all other decaying mesons, except for eta, which are parameterized independently + if(collType == 1){ + hRelErr[0][0] = (TH1F*)weightFile->Get("hErrorspionLower"); + hRelErr[0][1] = (TH1F*)weightFile->Get("hErrorspionUpper"); + hRelErr[1][0] = (TH1F*)weightFile->Get("hErrorsetaLower"); + hRelErr[1][1] = (TH1F*)weightFile->Get("hErrorsetaUpper"); + } + else if(collType == 0){ + hRelErr[0][0] = (TH1F*)weightFile->Get("hErrors_2.76TeV_pionLower"); + hRelErr[0][1] = (TH1F*)weightFile->Get("hErrors_2.76TeV_pionUpper"); + //hRelErr[1][0] = (TH1F*)weightFile->Get("hErrors_2.76TeV_etaLower"); + //hRelErr[1][1] = (TH1F*)weightFile->Get("hErrors_2.76TeV_etaUpper"); + } + else if(collType == 3 || collType == 4 || collType == 5){ + hRelErr[0][0] = (TH1F*)weightFile->Get("hErrors_pPb_5.023TeV_pionLower"); + hRelErr[0][1] = (TH1F*)weightFile->Get("hErrors_pPb_5.023TeV_pionUpper"); + for(int i=0; iGetNbinsX(); i++){ //assign 7% systematic uncertainties for pPb + hRelErr[0][0]->SetBinContent(i+1, -0.07); + hRelErr[0][1]->SetBinContent(i+1, 0.07); + } + } + } + for(Int_t iCent = 0; iCent < 11; iCent++){//centrality bins + for(Int_t iSpecies = 0; iSpecies < 6; iSpecies++){//species of decaying mesons + TH1F *hRatio = 0x0; + if(collType == 1){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio%s",backNameMC[iSpecies])); + } + else if(collType == 0){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_2.76TeV_%s",backNameMC[iSpecies])); + } + else if(collType == 3){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_pPb_5.023TeV_DPMJET_%s",backNameMC[iSpecies])); + } + else if(collType == 4){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_pPb_5.023TeV_HIJING_%s",backNameMC[iSpecies])); + } + else if(collType == 5){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_pPb_5.023TeV_DvsH_%s",backNameMC[iSpecies])); + } + else if(collType == 10){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_10f6_%s",backNameMC[iSpecies])); + } + else if(collType == 11){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_10f6a_%s",backNameMC[iSpecies])); + } + else if(collType == 12){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_10f7a_d_%s",backNameMC[iSpecies])); + } + else if(collType == 2){ + if((iCent == 1)||(iCent == 4)){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio%s%d",backNameMC[iSpecies],iCent-1)); + } + else if(iCent > 7){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio%s7",backNameMC[iSpecies])); + } + else{ + hRatio = (TH1F*)weightFile->Get(Form("hRatio%s%d",backNameMC[iSpecies],iCent)); + } + } + else if(collType == 6){ + if((iCent == 1)||(iCent == 4)){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_PbPb_2.76TeV_LHC11a10abis_%s%d",backNameMC[iSpecies],iCent-1)); + } + else if(iCent > 7){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_PbPb_2.76TeV_LHC11a10abis_%s7",backNameMC[iSpecies])); + } + else{ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_PbPb_2.76TeV_LHC11a10abis_%s%d",backNameMC[iSpecies],iCent)); + } + } + else if(collType == 7){ + if((iCent == 1)||(iCent == 4)){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_PbPb_2.76TeV_LHC11a10bplus_%s%d",backNameMC[iSpecies],iCent-1)); + } + else if(iCent > 7){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_PbPb_2.76TeV_LHC11a10bplus_%s7",backNameMC[iSpecies])); + } + else{ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_PbPb_2.76TeV_LHC11a10bplus_%s%d",backNameMC[iSpecies],iCent)); + } + } + else if(collType == 8){ + if((iCent == 1)||(iCent == 4)){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_PbPb_2.76TeV_bplusvasabis_%s%d",backNameMC[iSpecies],iCent-1)); + } + else if(iCent > 7){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_PbPb_2.76TeV_bplusvasabis_%s7",backNameMC[iSpecies])); + } + else{ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_PbPb_2.76TeV_bplusvasabis_%s%d",backNameMC[iSpecies],iCent)); + } + } + else { + if((iCent == 1)||(iCent == 4)){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_PbPb_2.76TeV_LHC11a10bbis_%s%d",backNameMC[iSpecies],iCent-1)); + } + else if(iCent > 7){ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_PbPb_2.76TeV_LHC11a10bbis_%s7",backNameMC[iSpecies])); + } + else{ + hRatio = (TH1F*)weightFile->Get(Form("hRatio_PbPb_2.76TeV_LHC11a10bbis_%s%d",backNameMC[iSpecies],iCent)); + } + } + for(Int_t iBin = 1; iBin < 45; iBin++){//momentum bin of mother meson + if(iCent == 0){ + elecBackGroundWeight[iCent][iSpecies][iBin-1][0] = hRatio->GetBinContent(iBin); + if(syst && (collType != 2)){ + for(Int_t iError = 0; iError < 2; iError++){//0: best estimate, 1,2: lower, upper uncertainty level + if((iSpecies == 1) && (collType == 1)) + elecBackGroundWeight[iCent][iSpecies][iBin-1][iError+1]=elecBackGroundWeight[iCent][iSpecies][iBin-1][0]*(1+hRelErr[1][iError]->GetBinContent(iBin)); + else + elecBackGroundWeight[iCent][iSpecies][iBin-1][iError+1]=elecBackGroundWeight[iCent][iSpecies][iBin-1][0]*(1+hRelErr[0][iError]->GetBinContent(iBin));//Addition of relative errors from histograms with "+", because lower errors are defined as negative numbers in the reference histograms! + } + } + } + else{ + if((collType == 2) || (collType > 5)){ + elecBackGroundWeight[iCent][iSpecies][iBin-1][0] = hRatio->GetBinContent(iBin); + } + } + } + } + } + weightFile->Close(); + } + else{ + printf("No reference file for background electron weighting found!\n"); + } + + const Double_t binLimit[45] = {0.1,0.112797,0.127231,0.143512,0.161877,0.182592,0.205957,0.232313,0.262041,0.295573,0.333397,0.37606,0.424183,0.478465,0.539692,0.608754,0.686654,0.774523,0.873636,0.985432,1.11153,1.25377,1.41421,1.59519,1.79932,2.02957,2.28928,2.58223,2.91267,3.2854,3.70582,4.18004,4.71494,5.3183,5.99886,6.76651,7.6324,8.60909,9.71076,10.9534,12.3551,13.9361,15.7195,17.731,20};//bin limits from the measured pi0 spectrum + + for(Int_t iCent = 0; iCent < 11; iCent++){//centrality bins + for(Int_t iBin = 1; iBin < 45; iBin++){//for all centralities, pt bins and all meson decays, set weighting factors for daughter electrons + task->SetBinLimits(iBin-1,binLimit[iBin-1]); + for(Int_t iSpecies = 0; iSpecies < 6; iSpecies++){ + for(Int_t iError = 0; iError < 3; iError++) + task->SetElecBackGroundFactors(iBin-1, iSpecies, iCent, iError, elecBackGroundWeight[iCent][iSpecies][iBin-1][iError]); + } + } + } +} diff --git a/PWGHF/hfe/macros/nonHFEcorrect.root b/PWGHF/hfe/macros/nonHFEcorrect.root new file mode 100644 index 0000000000000000000000000000000000000000..3f1d28bb4f549c206eec1de5369d8a0f4a934bcd GIT binary patch literal 248214 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 <>Xvrqxl=l3H)b`sA7ntNQ7t}ocXtC)w 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%0Dhcc4(ynO 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≷APS;zdah^-to{Uy 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