#ifndef ALI_ANALYSIS_TASK_PID_H
#define ALI_ANALYSIS_TASK_PID_H
class TF1;
class TRandom3;
class AliAnalysisFilter;
class AliCFContainer;
class AliESDEvent;
class AliMCEvent;
class AliMCParticle;
class AliPID;
class AliPIDCombined;
class AliPIDResponse;
class AliTOFPIDResponse;
class AliVEvent;
class AliVTrack;
#include "TAxis.h"
#include "TH1D.h"
#include "TH2D.h"
#include "TH3D.h"
#include "THnSparse.h"
#include "TProfile.h"
#include "TString.h"
#include "AliCentrality.h"
#include "AliCFContainer.h"
#include "AliPID.h"
#include "AliAnalysisTaskPIDV0base.h"
class AliAnalysisTaskPID : public AliAnalysisTaskPIDV0base {
public:
AliAnalysisTaskPID();
AliAnalysisTaskPID(const char *name);
virtual ~AliAnalysisTaskPID();
virtual void UserCreateOutputObjects();
virtual void UserExec(Option_t *option);
virtual void Terminate(const Option_t*);
enum ErrorCode { kNoErrors = 1, kWarning = 0, kError = -1};
enum dataAxes { kDataMCID = 0, kDataSelectSpecies = 1, kDataPt = 2, kDataDeltaPrimeSpecies = 3, kDataCentrality = 4,
kDataJetPt = 5, kDataZ = 6, kDataXi = 7, kDataCharge = 8, kDataTOFpidInfo = 9, kDataNumAxes = 10 };
enum genAxes { kGenMCID = 0, kGenSelectSpecies = 1, kGenPt = 2, kGenDeltaPrimeSpecies = 3, kGenCentrality = 4,
kGenJetPt = 5, kGenZ = 6, kGenXi = 7, kGenCharge = 8, kGenTOFpidInfo = 9, kGenNumAxes = 10 };
enum genYieldAxes { kGenYieldMCID = 0, kGenYieldPt = 1, kGenYieldCentrality = 2, kGenYieldJetPt = 3, kGenYieldZ = 4, kGenYieldXi = 5,
kGenYieldCharge = 6, kGenYieldNumAxes = 7 };
enum ptResolutionAxes { kPtResJetPt = 0, kPtResGenPt = 1, kPtResRecPt = 2, kPtResCharge = 3, kPtResCentrality = 4, kPtResNumAxes = 5 };
enum qaSharedClsAxes { kQASharedClsJetPt = 0, kQASharedClsPt = 1, kQASharedClsNumSharedCls = 2, kQASharedClsPadRow = 3,
kQASharedClsNumAxes = 4 };
enum dEdxCheckAxes { kDeDxCheckPID = 0, kDeDxCheckP = 1, kDeDxCheckJetPt = 2, kDeDxCheckEtaAbs = 3 , kDeDxCheckDeDx = 4,
kDeDxCheckNumAxes = 5 };
enum binZeroStudyAxes { kBinZeroStudyCentrality = 0, kBinZeroStudyGenPt = 1, kBinZeroStudyGenEta = 2, kBinZeroStudyNumAxes = 3 };
enum efficiencyAxes { kEffMCID = 0, kEffTrackPt = 1, kEffTrackEta = 2, kEffTrackCharge = 3, kEffCentrality = 4, kEffJetPt = 5,
kEffZ = 6, kEffXi = 7, kEffNumAxes = 8 };
enum EffSteps { kStepGenWithGenCuts = 0, kStepRecWithGenCuts = 1, kStepRecWithGenCutsMeasuredObs = 2,
kStepRecWithRecCutsMeasuredObs = 3, kStepRecWithRecCutsMeasuredObsPrimaries = 4,
kStepRecWithRecCutsMeasuredObsStrangenessScaled = 5, kStepRecWithRecCutsPrimaries = 6, kNumSteps = 7};
enum TOFpidInfo { kNoTOFinfo = -2, kNoTOFpid = -1, kTOFpion = 0, kTOFkaon = 1, kTOFproton = 2, kNumTOFspecies = 3,
kNumTOFpidInfoBins = 5 };
enum EventCounterType { kTriggerSel = 0, kTriggerSelAndVtxCut = 1, kTriggerSelAndVtxCutAndZvtxCutNoPileUpRejection = 2,
kTriggerSelAndVtxCutAndZvtxCut = 3 };
enum CutHistoType { kMCPtHardCut = 0 };
static Int_t PDGtoMCID(Int_t pdg);
static void GetJetTrackObservables(Double_t trackPt, Double_t jetPt, Double_t& z, Double_t& xi);
static Double_t GetMCStrangenessFactorCMS(Int_t motherPDG, Double_t motherGenPt);
static Double_t GetMCStrangenessFactorCMS(AliMCEvent* mcEvent, AliMCParticle* daughter);
static Bool_t IsSecondaryWithStrangeMotherMC(AliMCEvent* mcEvent, Int_t partLabel);
virtual void ConfigureTaskForCurrentEvent(AliVEvent* event);
Int_t GetIndexOfChargeAxisData() const
{ return fStoreAdditionalJetInformation ? kDataCharge : kDataCharge - fgkNumJetAxes; };
Int_t GetIndexOfChargeAxisGen() const
{ return fStoreAdditionalJetInformation ? kGenCharge : kGenCharge - fgkNumJetAxes; };
Int_t GetIndexOfChargeAxisGenYield() const
{ return fStoreAdditionalJetInformation ? kGenYieldCharge : kGenYieldCharge - fgkNumJetAxes; };
Int_t GetIndexOfTOFpidInfoAxisData() const
{ return fStoreAdditionalJetInformation ? kDataTOFpidInfo : kDataTOFpidInfo - fgkNumJetAxes; };
Int_t GetIndexOfTOFpidInfoAxisGen() const
{ return fStoreAdditionalJetInformation ? kGenTOFpidInfo : kGenTOFpidInfo - fgkNumJetAxes; };
Bool_t FillXsec(Double_t xsection)
{ if (!fh1Xsec) return kFALSE; fh1Xsec->Fill("<#sigma>", xsection); return kTRUE; };
Bool_t FillPythiaTrials(Double_t avgTrials)
{ if (!fh1Trials) return kFALSE; fh1Trials->Fill("#sum{ntrials}", avgTrials); return kTRUE; };
Bool_t FillEfficiencyContainer(const Double_t* values, EffSteps step, Double_t weight = 1.0);
Bool_t FillGeneratedYield(const Double_t* values, Double_t weight = 1.0);
Bool_t FillPtResolution(Int_t mcID, const Double_t* values);
Bool_t FillGenJets(Double_t centralityPercentile, Double_t jetPt, Double_t norm = -1.);
Bool_t FillRecJets(Double_t centralityPercentile, Double_t jetPt, Double_t norm = -1.);
Bool_t IncrementEventCounter(Double_t centralityPercentile, EventCounterType type);
Bool_t FillCutHisto(Double_t value, CutHistoType type);
void PostOutputData();
void PrintSettings(Bool_t printSystematicsSettings = kFALSE) const;
void PrintSystematicsSettings() const;
Bool_t ProcessTrack(const AliVTrack* track, Int_t particlePDGcode, Double_t centralityPercentile, Double_t jetPt) ;
ErrorCode GenerateDetectorResponse(ErrorCode errCode, Double_t mean, Double_t sigma, Double_t* responses,
Int_t nResponses,
Bool_t usePureGaus = kFALSE);
ErrorCode SetParamsForConvolutedGaus(Double_t gausMean, Double_t gausSigma);
const TString GetCentralityEstimator() const { return fCentralityEstimator; };
const TString GetPPCentralityEstimator() const {
TString ppCentEstimator = fCentralityEstimator; ppCentEstimator = ppCentEstimator.ReplaceAll("ppMult", ""); return ppCentEstimator; }
void SetCentralityEstimator(TString estimator) { fCentralityEstimator = estimator; };
Double_t GetCentralityPercentile(AliVEvent* evt) const;
inline Double_t GetConvolutedGaussTransitionPar(Int_t index) const;
Bool_t SetConvolutedGaussLambdaParameter(Double_t lambda);
Bool_t GetInputFromOtherTask() const { return fInputFromOtherTask; };
void SetInputFromOtherTask(Bool_t flag) { fInputFromOtherTask = flag; };
Bool_t GetDoPID() const { return fDoPID; };
void SetDoPID(Bool_t flag) { fDoPID = flag; };
Bool_t GetDoEfficiency() const { return fDoEfficiency; };
void SetDoEfficiency(Bool_t flag) { fDoEfficiency = flag; };
Bool_t GetDoPtResolution() const { return fDoPtResolution; };
void SetDoPtResolution(Bool_t flag) { fDoPtResolution = flag; };
Bool_t GetDoDeDxCheck() const { return fDoDeDxCheck; };
void SetDoDeDxCheck(Bool_t flag) { fDoDeDxCheck = flag; };
Bool_t GetDoBinZeroStudy() const { return fDoBinZeroStudy; };
void SetDoBinZeroStudy(Bool_t flag) { fDoBinZeroStudy = flag; };
Bool_t GetStoreCentralityPercentile() const { return fStoreCentralityPercentile; };
void SetStoreCentralityPercentile(Bool_t flag) { fStoreCentralityPercentile = flag; };
Bool_t GetStoreAdditionalJetInformation() const { return fStoreAdditionalJetInformation; };
void SetStoreAdditionalJetInformation(Bool_t flag) { fStoreAdditionalJetInformation = flag; };
Bool_t GetUseMCidForGeneration() const { return fUseMCidForGeneration; };
void SetUseMCidForGeneration(Bool_t flag) { fUseMCidForGeneration = flag; };
Bool_t GetUseConvolutedGaus() const { return fUseConvolutedGaus; };
void SetUseConvolutedGaus(Bool_t flag) { fUseConvolutedGaus = flag; };
Double_t GetAccuracyNonGaussianTail() const { return fAccuracyNonGaussianTail; };
void SetAccuracyNonGaussianTail(Double_t value) { fAccuracyNonGaussianTail = value; };
Bool_t GetTakeIntoAccountMuons() const { return fTakeIntoAccountMuons; };
void SetTakeIntoAccountMuons(Bool_t flag) { fTakeIntoAccountMuons = flag; };
Int_t GetTOFmode() const { return fTOFmode; };
void SetTOFmode(Int_t tofMode) { fTOFmode = tofMode; };
Bool_t GetUseTPCDefaultPriors() const { return fTPCDefaultPriors; };
void SetUseTPCDefaultPriors(Bool_t flag) { fTPCDefaultPriors = flag; };
Bool_t GetUsePriors() const { return fUsePriors; };
void SetUsePriors(Bool_t flag) { fUsePriors = flag; };
Bool_t GetUseITS() const { return fUseITS; };
void SetUseITS(Bool_t flag) { fUseITS = flag; };
Bool_t GetUseTOF() const { return fUseTOF; };
void SetUseTOF(Bool_t flag) { fUseTOF = flag; };
Double_t GetEtaAbsCutLow() const { return fEtaAbsCutLow; };
Double_t GetEtaAbsCutUp() const { return fEtaAbsCutUp; };
Bool_t SetEtaAbsCutRange(Double_t lowerLimit, Double_t upperLimit);
Bool_t IsInAcceptedEtaRange(Double_t etaAbs) const { return (etaAbs >= fEtaAbsCutLow && etaAbs <= fEtaAbsCutUp); };
AliAnalysisTaskPIDV0base::PileUpRejectionType GetPileUpRejectionType() const { return fPileUpRejectionType; };
void SetPileUpRejectionType(AliAnalysisTaskPIDV0base::PileUpRejectionType newType) { fPileUpRejectionType = newType; };
Double_t GetSystematicScalingSplinesThreshold() const { return fSystematicScalingSplinesThreshold; };
void SetSystematicScalingSplinesThreshold(Double_t threshold) { fSystematicScalingSplinesThreshold = threshold; };
Double_t GetSystematicScalingSplinesBelowThreshold() const { return fSystematicScalingSplinesBelowThreshold; };
void SetSystematicScalingSplinesBelowThreshold(Double_t scaleFactor)
{ fSystematicScalingSplinesBelowThreshold = scaleFactor; CheckDoAnyStematicStudiesOnTheExpectedSignal(); };
Double_t GetSystematicScalingSplinesAboveThreshold() const { return fSystematicScalingSplinesAboveThreshold; };
void SetSystematicScalingSplinesAboveThreshold(Double_t scaleFactor)
{ fSystematicScalingSplinesAboveThreshold = scaleFactor; CheckDoAnyStematicStudiesOnTheExpectedSignal(); };
Double_t GetSystematicScalingEtaCorrectionMomentumThr() const { return fSystematicScalingEtaCorrectionMomentumThr; };
void SetSystematicScalingEtaCorrectionMomentumThr(Double_t threshold) { fSystematicScalingEtaCorrectionMomentumThr = threshold; };
Double_t GetSystematicScalingEtaCorrectionLowMomenta() const { return fSystematicScalingEtaCorrectionLowMomenta; };
void SetSystematicScalingEtaCorrectionLowMomenta(Double_t scaleFactor)
{ fSystematicScalingEtaCorrectionLowMomenta = scaleFactor; CheckDoAnyStematicStudiesOnTheExpectedSignal(); };
Double_t GetSystematicScalingEtaCorrectionHighMomenta() const { return fSystematicScalingEtaCorrectionHighMomenta; };
void SetSystematicScalingEtaCorrectionHighMomenta(Double_t scaleFactor)
{ fSystematicScalingEtaCorrectionHighMomenta = scaleFactor; CheckDoAnyStematicStudiesOnTheExpectedSignal(); };
Double_t GetSystematicScalingEtaSigmaParaThreshold() const { return fSystematicScalingEtaSigmaParaThreshold; };
void SetSystematicScalingEtaSigmaParaThreshold(Double_t threshold) { fSystematicScalingEtaSigmaParaThreshold = threshold; };
Double_t GetSystematicScalingEtaSigmaParaBelowThreshold() const { return fSystematicScalingEtaSigmaParaBelowThreshold; };
void SetSystematicScalingEtaSigmaParaBelowThreshold(Double_t scaleFactor)
{ fSystematicScalingEtaSigmaParaBelowThreshold = scaleFactor; CheckDoAnyStematicStudiesOnTheExpectedSignal(); };
Double_t GetSystematicScalingEtaSigmaParaAboveThreshold() const { return fSystematicScalingEtaSigmaParaAboveThreshold; };
void SetSystematicScalingEtaSigmaParaAboveThreshold(Double_t scaleFactor)
{ fSystematicScalingEtaSigmaParaAboveThreshold = scaleFactor; CheckDoAnyStematicStudiesOnTheExpectedSignal(); };
Double_t GetSystematicScalingMultCorrection() const { return fSystematicScalingMultCorrection; };
void SetSystematicScalingMultCorrection(Double_t scaleFactor)
{ fSystematicScalingMultCorrection = scaleFactor; CheckDoAnyStematicStudiesOnTheExpectedSignal(); };
Double_t GetMaxEtaVariation(Double_t dEdxSplines);
Bool_t CalculateMaxEtaVariationMapFromPIDResponse();
void CleanupParticleFractionHistos();
Bool_t GetParticleFraction(Double_t trackPt, Double_t jetPt, Double_t multiplicity,
AliPID::EParticleType species, Double_t& fraction, Double_t& fractionErrorStat,
Double_t& fractionErrorSys) const;
Bool_t GetParticleFractions(Double_t trackPt, Double_t jetPt, Double_t centralityPercentile,
Double_t* prob, Int_t smearSpeciesByError, Int_t takeIntoAccountSpeciesSysError,
Bool_t uniformSystematicError = kFALSE) const;
const TH3D* GetParticleFractionHisto(Int_t species, Bool_t sysError = kFALSE) const;
Bool_t SetParticleFractionHisto(const TH3D* hist, Int_t species, Bool_t sysError = kFALSE);
Int_t GetParticleFractionHistoNbinsTrackPt() const;
Int_t GetParticleFractionHistoNbinsJetPt() const;
Int_t GetParticleFractionHistoNbinsCentrality() const;
Bool_t SetParticleFractionHistosFromFile(const TString filePathName, Bool_t sysError = kFALSE);
Int_t GetRandomParticleTypeAccordingToParticleFractions(Double_t trackPt, Double_t jetPt,
Double_t centralityPercentile,
Bool_t smearByError,
Bool_t takeIntoAccountSysError = kFALSE) const;
TOFpidInfo GetTOFType(const AliVTrack* track, Int_t tofMode) const;
protected:
void CheckDoAnyStematicStudiesOnTheExpectedSignal();
Double_t ConvolutedGaus(const Double_t* xx, const Double_t* par) const;
inline Double_t FastGaus(Double_t x, Double_t mean, Double_t sigma) const;
inline Double_t FastNormalisedGaus(Double_t x, Double_t mean, Double_t sigma) const;
Int_t FindBinWithinRange(TAxis* axis, Double_t value) const;
Int_t FindFirstBinAboveIn3dSubset(const TH3* hist, Double_t threshold, Int_t yValue, Int_t zValue) const;
Int_t FindLastBinAboveIn3dSubset(const TH3* hist, Double_t threshold, Int_t yValue, Int_t zValue) const;
virtual void SetUpGenHist(THnSparse* hist, Double_t* binsPt, Double_t* binsDeltaPrime, Double_t* binsCent, Double_t* binsJetPt) const;
virtual void SetUpGenYieldHist(THnSparse* hist, Double_t* binsPt, Double_t* binsCent, Double_t* binsJetPt) const;
virtual void SetUpHist(THnSparse* hist, Double_t* binsPt, Double_t* binsDeltaPrime, Double_t* binsCent, Double_t* binsJetPt) const;
virtual void SetUpPtResHist(THnSparse* hist, Double_t* binsPt, Double_t* binsJetPt, Double_t* binsCent) const;
virtual void SetUpSharedClsHist(THnSparse* hist, Double_t* binsPt, Double_t* binsJetPt) const;
virtual void SetUpDeDxCheckHist(THnSparse* hist, const Double_t* binsPt, const Double_t* binsJetPt, const Double_t* binsEtaAbs) const;
virtual void SetUpBinZeroStudyHist(THnSparse* hist, const Double_t* binsCent, const Double_t* binsPt) const;
virtual void SetUpPIDcombined();
static const Int_t fgkNumJetAxes;
static const Double_t fgkEpsilon;
static const Int_t fgkMaxNumGenEntries;
static const Double_t fgkOneOverSqrt2;
private:
Int_t fRun;
AliPIDCombined* fPIDcombined;
Bool_t fInputFromOtherTask;
Bool_t fDoPID;
Bool_t fDoEfficiency;
Bool_t fDoPtResolution;
Bool_t fDoDeDxCheck;
Bool_t fDoBinZeroStudy;
Bool_t fStoreCentralityPercentile;
Bool_t fStoreAdditionalJetInformation;
Bool_t fTakeIntoAccountMuons;
Bool_t fUseITS;
Bool_t fUseTOF;
Bool_t fUsePriors;
Bool_t fTPCDefaultPriors;
Bool_t fUseMCidForGeneration;
Bool_t fUseConvolutedGaus;
const Int_t fkConvolutedGausNPar;
Double_t fAccuracyNonGaussianTail;
const Double_t fkDeltaPrimeLowLimit;
const Double_t fkDeltaPrimeUpLimit;
TF1* fConvolutedGausDeltaPrime;
Int_t fTOFmode;
Double_t fConvolutedGaussTransitionPars[3];
static const Double_t fgkSigmaReferenceForTransitionPars;
Double_t fEtaAbsCutLow;
Double_t fEtaAbsCutUp;
AliAnalysisTaskPIDV0base::PileUpRejectionType fPileUpRejectionType;
Bool_t fDoAnySystematicStudiesOnTheExpectedSignal;
Double_t fSystematicScalingSplinesThreshold;
Double_t fSystematicScalingSplinesBelowThreshold;
Double_t fSystematicScalingSplinesAboveThreshold;
Double_t fSystematicScalingEtaCorrectionMomentumThr;
Double_t fSystematicScalingEtaCorrectionLowMomenta;
Double_t fSystematicScalingEtaCorrectionHighMomenta;
Double_t fSystematicScalingEtaSigmaParaThreshold;
Double_t fSystematicScalingEtaSigmaParaBelowThreshold;
Double_t fSystematicScalingEtaSigmaParaAboveThreshold;
Double_t fSystematicScalingMultCorrection;
TH3D* fFractionHists[AliPID::kSPECIES];
TH3D* fFractionSysErrorHists[AliPID::kSPECIES];
TString fCentralityEstimator;
THnSparseD* fhPIDdataAll;
THnSparseD* fhGenEl;
THnSparseD* fhGenKa;
THnSparseD* fhGenPi;
THnSparseD* fhGenMu;
THnSparseD* fhGenPr;
Double_t* fGenRespElDeltaPrimeEl;
Double_t* fGenRespElDeltaPrimeKa;
Double_t* fGenRespElDeltaPrimePi;
Double_t* fGenRespElDeltaPrimePr;
Double_t* fGenRespKaDeltaPrimeEl;
Double_t* fGenRespKaDeltaPrimeKa;
Double_t* fGenRespKaDeltaPrimePi;
Double_t* fGenRespKaDeltaPrimePr;
Double_t* fGenRespPiDeltaPrimeEl;
Double_t* fGenRespPiDeltaPrimeKa;
Double_t* fGenRespPiDeltaPrimePi;
Double_t* fGenRespPiDeltaPrimePr;
Double_t* fGenRespMuDeltaPrimeEl;
Double_t* fGenRespMuDeltaPrimeKa;
Double_t* fGenRespMuDeltaPrimePi;
Double_t* fGenRespMuDeltaPrimePr;
Double_t* fGenRespPrDeltaPrimeEl;
Double_t* fGenRespPrDeltaPrimeKa;
Double_t* fGenRespPrDeltaPrimePi;
Double_t* fGenRespPrDeltaPrimePr;
TAxis* fDeltaPrimeAxis;
TH1D* fhMaxEtaVariation;
TH1D* fhEventsProcessed;
TH1D* fhEventsTriggerSel;
TH1D* fhEventsTriggerSelVtxCut;
TH1D* fhEventsProcessedNoPileUpRejection;
THnSparseD* fChargedGenPrimariesTriggerSel;
THnSparseD* fChargedGenPrimariesTriggerSelVtxCut;
THnSparseD* fChargedGenPrimariesTriggerSelVtxCutZ;
THnSparseD* fChargedGenPrimariesTriggerSelVtxCutZPileUpRej;
THnSparseD* fhMCgeneratedYieldsPrimaries;
TH2D* fh2FFJetPtRec;
TH2D* fh2FFJetPtGen;
TProfile* fh1Xsec;
TH1D* fh1Trials;
TH1F* fh1EvtsPtHardCut;
AliCFContainer* fContainerEff;
THnSparseD* fPtResolution[AliPID::kSPECIES];
THnSparseD* fQASharedCls;
THnSparseD* fDeDxCheck;
TObjArray* fOutputContainer;
TObjArray* fQAContainer;
AliAnalysisTaskPID(const AliAnalysisTaskPID&);
AliAnalysisTaskPID& operator=(const AliAnalysisTaskPID&);
ClassDef(AliAnalysisTaskPID, 22);
};
inline Bool_t AliAnalysisTaskPID::FillEfficiencyContainer(const Double_t* values, AliAnalysisTaskPID::EffSteps step,
Double_t weight)
{
if (!fDoEfficiency)
return kFALSE;
if (!fContainerEff) {
AliError("Efficiency container not initialised -> cannot be filled!");
return kFALSE;
}
fContainerEff->Fill(values, step, weight);
return kTRUE;
}
inline Bool_t AliAnalysisTaskPID::FillGeneratedYield(const Double_t* values, Double_t weight)
{
if (!fDoPID)
return kFALSE;
if (!fhMCgeneratedYieldsPrimaries) {
AliError("Histo for generated primary yield not initialised -> cannot be filled!");
return kFALSE;
}
fhMCgeneratedYieldsPrimaries->Fill(values, weight);
return kTRUE;
}
inline Bool_t AliAnalysisTaskPID::FillGenJets(Double_t centralityPercentile, Double_t jetPt, Double_t norm)
{
if (!fDoPID && !fDoEfficiency)
return kFALSE;
if (!fh2FFJetPtGen)
return kFALSE;
if (norm > 0.)
fh2FFJetPtGen->Fill(centralityPercentile, jetPt, 1. / norm);
else
fh2FFJetPtGen->Fill(centralityPercentile, jetPt);
return kTRUE;
}
inline Bool_t AliAnalysisTaskPID::FillRecJets(Double_t centralityPercentile, Double_t jetPt, Double_t norm)
{
if (!fDoPID && !fDoEfficiency)
return kFALSE;
if (!fh2FFJetPtRec)
return kFALSE;
if (norm > 0.)
fh2FFJetPtRec->Fill(centralityPercentile, jetPt, 1. / norm);
else
fh2FFJetPtRec->Fill(centralityPercentile, jetPt);
return kTRUE;
}
inline Bool_t AliAnalysisTaskPID::FillPtResolution(Int_t mcID, const Double_t* values)
{
if (!fDoPtResolution || mcID < 0 || mcID >= AliPID::kSPECIES)
return kFALSE;
if (!fPtResolution[mcID]) {
AliError(Form("Histo for pT resolution (species: %s) not initialised -> cannot be filled!", AliPID::ParticleName(mcID)));
return kFALSE;
}
fPtResolution[mcID]->Fill(values);
return kTRUE;
}
inline Bool_t AliAnalysisTaskPID::IncrementEventCounter(Double_t centralityPercentile, AliAnalysisTaskPID::EventCounterType type)
{
if (type == kTriggerSel) {
if (!fhEventsTriggerSel) {
AliError("Histogram for number of events (kTriggerSel) not initialised -> cannot be incremented!");
return kFALSE;
}
fhEventsTriggerSel->Fill(centralityPercentile);
}
else if (type == kTriggerSelAndVtxCut) {
if (!fhEventsTriggerSelVtxCut) {
AliError("Histogram for number of events (kTriggerSelAndVtxCut) not initialised -> cannot be incremented!");
return kFALSE;
}
fhEventsTriggerSelVtxCut->Fill(centralityPercentile);
}
else if (type == kTriggerSelAndVtxCutAndZvtxCut) {
if (!fhEventsProcessed) {
AliError("Histogram for number of events (kTriggerSelAndVtxCutAndZvtxCut) not initialised -> cannot be incremented!");
return kFALSE;
}
fhEventsProcessed->Fill(centralityPercentile);
}
else if (type == kTriggerSelAndVtxCutAndZvtxCutNoPileUpRejection) {
if (!fhEventsProcessedNoPileUpRejection) {
AliError("Histogram for number of events (kTriggerSelAndVtxCutAndZvtxCutNoPileUpRejection) not initialised -> cannot be incremented!");
return kFALSE;
}
fhEventsProcessedNoPileUpRejection->Fill(centralityPercentile);
}
return kTRUE;
};
inline Bool_t AliAnalysisTaskPID::FillCutHisto(Double_t value, AliAnalysisTaskPID::CutHistoType type)
{
if (type == kMCPtHardCut) {
if (!fh1EvtsPtHardCut) {
AliError("Histogram \"fh1EvtsPtHardCut\" not initialised -> cannot be filled!");
return kFALSE;
}
fh1EvtsPtHardCut->Fill(value);
}
return kTRUE;
}
inline Bool_t AliAnalysisTaskPID::SetEtaAbsCutRange(Double_t lowerLimit, Double_t upperLimit)
{
if (lowerLimit >= upperLimit) {
AliError(Form("Requested lower |eta| cut limit >= upper |eta| cut limit. Old eta cut range will be used (low %f, high %f).",
fEtaAbsCutLow, fEtaAbsCutUp));
return kFALSE;
}
fEtaAbsCutLow = lowerLimit;
fEtaAbsCutUp = upperLimit;
return kTRUE;
};
inline Double_t AliAnalysisTaskPID::GetConvolutedGaussTransitionPar(Int_t index) const
{
if (index < 0 || index >= 3) {
printf("Invalid index %d!\n", index);
return -1;
}
return fConvolutedGaussTransitionPars[index];
}
inline Int_t AliAnalysisTaskPID::GetParticleFractionHistoNbinsTrackPt() const
{
if (!fFractionHists[AliPID::kPion])
return -1;
return fFractionHists[AliPID::kPion]->GetNbinsX();
}
inline Int_t AliAnalysisTaskPID::GetParticleFractionHistoNbinsJetPt() const
{
if (!fFractionHists[AliPID::kPion])
return -1;
return fFractionHists[AliPID::kPion]->GetNbinsY();
}
inline Int_t AliAnalysisTaskPID::GetParticleFractionHistoNbinsCentrality() const
{
if (!fFractionHists[AliPID::kPion])
return -1;
return fFractionHists[AliPID::kPion]->GetNbinsZ();
}
inline Double_t AliAnalysisTaskPID::GetCentralityPercentile(AliVEvent* evt) const
{
if (!evt)
return -1;
Double_t centralityPercentile = -1.;
if (fStoreCentralityPercentile)
centralityPercentile = evt->GetCentrality()->GetCentralityPercentile(fCentralityEstimator.Data());
return centralityPercentile;
}
inline void AliAnalysisTaskPID::PostOutputData()
{
PostData(1, fOutputContainer);
if (fDoEfficiency)
PostData(2, fContainerEff);
if (fDoPtResolution || fDoDeDxCheck)
PostData(3, fQAContainer);
}
#endif