ROOT logo
#ifndef ALI_ANALYSIS_TASK_PID_H
#define ALI_ANALYSIS_TASK_PID_H

/*
This task collects PID output from different detectors.
Only tracks fulfilling some standard quality cuts are taken into account.
At the moment, only data from TPC and TOF is collected. But in future,
data from e.g. HMPID is also foreseen.

Class written by Benjamin Hess.
Contact: bhess@cern.ch
*/

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; // Number of additional axes for jets
  static const Double_t fgkEpsilon; // Double_t threshold above zero
  static const Int_t fgkMaxNumGenEntries; // Maximum number of generated detector responses per track and delta(Prime) and associated species

  static const Double_t fgkOneOverSqrt2; // = 1. / TMath::Sqrt2();
  
 private:
  Int_t fRun; // Current run number
  AliPIDCombined* fPIDcombined; //! PID combined object
  
  Bool_t fInputFromOtherTask; // If set to kTRUE, no events are processed and the input must be fed in from another task. If set to kFALSE, normal event processing
  
  Bool_t fDoPID; // Do PID processing (and post the output), if flag is set to kTRUE
  Bool_t fDoEfficiency; // Do efficiency processing (and post the output), if flag is set to kTRUE
  Bool_t fDoPtResolution; // Do pT resolution processing (and post the output), if flag is set to kTRUE
  Bool_t fDoDeDxCheck; // Check dEdx, if flag set to kTRUE
  Bool_t fDoBinZeroStudy; // Do bin zero study, if flag is set to kTRUE
  
  Bool_t fStoreCentralityPercentile; // If set to kTRUE, store centrality percentile for each event. In case of kFALSE (appropriate for pp), centrality percentile will be set to -1 for every event
  Bool_t fStoreAdditionalJetInformation; // If set to kTRUE, additional jet information like jetPt, z, xi will be stored in the THnSparses

  Bool_t fTakeIntoAccountMuons; // Also take into account muons for the generation of the expected response and the most probable PID
  Bool_t fUseITS; // Use ITS for PID combined probabilities
  Bool_t fUseTOF; // Use TOF for PID combined probabilities
  Bool_t fUsePriors; // Use priors for PID combined probabilities
  Bool_t fTPCDefaultPriors; // Use TPC default priors for PID combined probabilities, if priors are enabled
    
  Bool_t fUseMCidForGeneration; // If MC, use MCid instead of PIDcombined to generate the signals
  
  Bool_t fUseConvolutedGaus; // Use convoluted gaus to generate detector response instead of pure gaus  
  const Int_t fkConvolutedGausNPar; // Number of parameters for convoluted gaus
  Double_t fAccuracyNonGaussianTail; // Accuracy of the non-gaussian tail (fraction of the maximum)
  const Double_t fkDeltaPrimeLowLimit; // Lower deltaPrime limit
  const Double_t fkDeltaPrimeUpLimit; // Upper deltaPrime limit
  TF1* fConvolutedGausDeltaPrime; // Gaus convoluted with exponential tail to generate detector response (deltaPrime)
  
  Int_t fTOFmode; // TOF mode used for TOF PID info (affects num sigma inclusion/exclusion)
  Double_t fConvolutedGaussTransitionPars[3]; // Parameter for transition from gaussian parameters to asymmetric shape
  static const Double_t fgkSigmaReferenceForTransitionPars; // Reference sigma chosen to calculate transition parameters
  
  Double_t fEtaAbsCutLow; // Lower cut value on |eta|
  Double_t fEtaAbsCutUp;  // Upper cut value on |eta|
  
  AliAnalysisTaskPIDV0base::PileUpRejectionType fPileUpRejectionType; // Which pile-up rejection is used (if any)
  
  // For systematic studies
  Bool_t   fDoAnySystematicStudiesOnTheExpectedSignal; // Internal flag indicating whether any systematic studies are going to be performed
  Double_t fSystematicScalingSplinesThreshold;         // beta-gamma threshold for the systematic spline scale factor
  Double_t fSystematicScalingSplinesBelowThreshold;        // Systematic scale factor for the splines (1. = no systematics) below threshold
  Double_t fSystematicScalingSplinesAboveThreshold;        // Systematic scale factor for the splines (1. = no systematics) above threshold
  Double_t fSystematicScalingEtaCorrectionMomentumThr;  // Momentum threshold for the systematic scale factor for the eta correction (separates low-p from high-p
  Double_t fSystematicScalingEtaCorrectionLowMomenta;   // Systematic scale factor for the eta correction (1. = no systematics) at low momenta
  Double_t fSystematicScalingEtaCorrectionHighMomenta;  // Systematic scale factor for the eta correction (1. = no systematics) at high momenta
  
  Double_t fSystematicScalingEtaSigmaParaThreshold; // dEdx threshold for the systematic scale factor for the parametrisation of the relative signal width
  Double_t fSystematicScalingEtaSigmaParaBelowThreshold; // Systematic scale factor for the parametrisation of the relative signal width (1. = no systematics) below threshold
  Double_t fSystematicScalingEtaSigmaParaAboveThreshold; // Systematic scale factor for the parametrisation of the relative signal width (1. = no systematics) above threshold 
  Double_t fSystematicScalingMultCorrection; // Systematic scale factor for the multiplicity correction (1. = no systematics) 
  
  TH3D* fFractionHists[AliPID::kSPECIES]; // 3D histos of particle fraction as function  with trackPt, jetPt (-1 for inclusive spectra), centralityPercentile (-1 for pp)
  TH3D* fFractionSysErrorHists[AliPID::kSPECIES]; // 3D histos of sys. error of particle fraction as function  with trackPt, jetPt (-1 for inclusive spectra), centralityPercentile (-1 for pp)
  
  TString fCentralityEstimator; // Estimator for the centrality (e.g. V0A, V0M)
  
  THnSparseD* fhPIDdataAll; //! Data histo
  
  // Generated response information
  THnSparseD* fhGenEl; //! Generated response for el
  THnSparseD* fhGenKa; //! Generated response for ka
  THnSparseD* fhGenPi; //! Generated response for pi
  THnSparseD* fhGenMu; //! Generated response for mu
  THnSparseD* fhGenPr; //! Generated response for pr
  
  // Generated responses for a single track
  Double_t* fGenRespElDeltaPrimeEl; //! Generated responses for a single track
  Double_t* fGenRespElDeltaPrimeKa; //! Generated responses for a single track
  Double_t* fGenRespElDeltaPrimePi; //! Generated responses for a single track
  Double_t* fGenRespElDeltaPrimePr; //! Generated responses for a single track
  Double_t* fGenRespKaDeltaPrimeEl; //! Generated responses for a single track
  Double_t* fGenRespKaDeltaPrimeKa; //! Generated responses for a single track
  Double_t* fGenRespKaDeltaPrimePi; //! Generated responses for a single track
  Double_t* fGenRespKaDeltaPrimePr; //! Generated responses for a single track
  Double_t* fGenRespPiDeltaPrimeEl; //! Generated responses for a single track
  Double_t* fGenRespPiDeltaPrimeKa; //! Generated responses for a single track
  Double_t* fGenRespPiDeltaPrimePi; //! Generated responses for a single track
  Double_t* fGenRespPiDeltaPrimePr; //! Generated responses for a single track
  Double_t* fGenRespMuDeltaPrimeEl; //! Generated responses for a single track
  Double_t* fGenRespMuDeltaPrimeKa; //! Generated responses for a single track
  Double_t* fGenRespMuDeltaPrimePi; //! Generated responses for a single track
  Double_t* fGenRespMuDeltaPrimePr; //! Generated responses for a single track
  Double_t* fGenRespPrDeltaPrimeEl; //! Generated responses for a single track
  Double_t* fGenRespPrDeltaPrimeKa; //! Generated responses for a single track
  Double_t* fGenRespPrDeltaPrimePi; //! Generated responses for a single track
  Double_t* fGenRespPrDeltaPrimePr; //! Generated responses for a single track
  /*
  Double_t* fGenRespElDeltaEl; //! Generated responses for a single track
  Double_t* fGenRespElDeltaKa; //! Generated responses for a single track
  Double_t* fGenRespElDeltaPi; //! Generated responses for a single track
  Double_t* fGenRespElDeltaPr; //! Generated responses for a single track
  Double_t* fGenRespKaDeltaEl; //! Generated responses for a single track
  Double_t* fGenRespKaDeltaKa; //! Generated responses for a single track
  Double_t* fGenRespKaDeltaPi; //! Generated responses for a single track
  Double_t* fGenRespKaDeltaPr; //! Generated responses for a single track
  Double_t* fGenRespPiDeltaEl; //! Generated responses for a single track
  Double_t* fGenRespPiDeltaKa; //! Generated responses for a single track
  Double_t* fGenRespPiDeltaPi; //! Generated responses for a single track
  Double_t* fGenRespPiDeltaPr; //! Generated responses for a single track
  Double_t* fGenRespMuDeltaEl; //! Generated responses for a single track
  Double_t* fGenRespMuDeltaKa; //! Generated responses for a single track
  Double_t* fGenRespMuDeltaPi; //! Generated responses for a single track
  Double_t* fGenRespMuDeltaPr; //! Generated responses for a single track
  Double_t* fGenRespPrDeltaEl; //! Generated responses for a single track
  Double_t* fGenRespPrDeltaKa; //! Generated responses for a single track
  Double_t* fGenRespPrDeltaPi; //! Generated responses for a single track
  Double_t* fGenRespPrDeltaPr; //! Generated responses for a single track
  */
  
  TAxis* fDeltaPrimeAxis; //! Axis holding the deltaPrime binning
  TH1D* fhMaxEtaVariation; //! Histo holding the maximum deviation of the eta correction factor from unity vs. 1/dEdx(splines)
  
  TH1D* fhEventsProcessed; //! Histo holding the number of processed events (i.e. passing trigger selection, vtx and zvtx cuts and (if enabled) pile-up rejection)
  TH1D* fhEventsTriggerSel; //! Histo holding the number of events passing trigger selection
  TH1D* fhEventsTriggerSelVtxCut; //! Histo holding the number of events passing trigger selection and vtx cut
  TH1D* fhEventsProcessedNoPileUpRejection; //! Histo holding the number of processed events before pile-up rejection
  
  THnSparseD* fChargedGenPrimariesTriggerSel; //! Histo holding the generated charged primary yields for triggered events
  THnSparseD* fChargedGenPrimariesTriggerSelVtxCut; //! Histo holding the generated charged primary yields for triggered events passing vertex cuts
  THnSparseD* fChargedGenPrimariesTriggerSelVtxCutZ; //! Histo holding the generated charged primary yields for triggered events passing vertex cuts (including cut on z)
  THnSparseD* fChargedGenPrimariesTriggerSelVtxCutZPileUpRej; //! Histo holding the generated charged primary yields for triggered events passing vertex cuts (including cut on z) and pile-up rejection
  
  THnSparseD* fhMCgeneratedYieldsPrimaries; //! Histo holding the generated (no reco, no cuts) primary particle yields in considered eta range
  
  TH2D* fh2FFJetPtRec;            //! Number of reconstructed jets vs. jetPt and centrality
  TH2D* fh2FFJetPtGen;            //! Number of generated jets vs. jetPt and centrality
  
  TProfile* fh1Xsec;              //! pythia cross section and trials
  TH1D*     fh1Trials;            //! sum of trials
  TH1F*     fh1EvtsPtHardCut;     //! Number events before and after the cut on MC pT hard
  
  AliCFContainer* fContainerEff; //! Container for efficiency determination
  
  THnSparseD* fPtResolution[AliPID::kSPECIES]; //! Pt Resolution for the individual species
  THnSparseD* fQASharedCls; //! QA for shared clusters
  
  THnSparseD* fDeDxCheck; //! dEdx check
  
  TObjArray* fOutputContainer;  //! output data container
  
  TObjArray* fQAContainer; //! output data container for QA
  
  AliAnalysisTaskPID(const AliAnalysisTaskPID&); // not implemented
  AliAnalysisTaskPID& operator=(const AliAnalysisTaskPID&); // not implemented
  
  ClassDef(AliAnalysisTaskPID, 22);
};


//_____________________________________________________________________________
inline Bool_t AliAnalysisTaskPID::FillEfficiencyContainer(const Double_t* values, AliAnalysisTaskPID::EffSteps step,
                                                          Double_t weight) 
{
  // Fill efficiency container at step "step" with the values
  
  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)
{
  // Fill histos with generated primary yields with provided values
  
  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)
{
  // Fill histos with pT resolution with provided 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)
{
  // Increment the number of events for the given centrality percentile and the corresponding counter 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)
{
  // Fill cut histo of corresponding type at given value.
  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
{
  // WARNING: This function may not be used in case of special pp centrality estimators which require different handling
  // (and sometimes ESD events)
  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
 AliAnalysisTaskPID.h:1
 AliAnalysisTaskPID.h:2
 AliAnalysisTaskPID.h:3
 AliAnalysisTaskPID.h:4
 AliAnalysisTaskPID.h:5
 AliAnalysisTaskPID.h:6
 AliAnalysisTaskPID.h:7
 AliAnalysisTaskPID.h:8
 AliAnalysisTaskPID.h:9
 AliAnalysisTaskPID.h:10
 AliAnalysisTaskPID.h:11
 AliAnalysisTaskPID.h:12
 AliAnalysisTaskPID.h:13
 AliAnalysisTaskPID.h:14
 AliAnalysisTaskPID.h:15
 AliAnalysisTaskPID.h:16
 AliAnalysisTaskPID.h:17
 AliAnalysisTaskPID.h:18
 AliAnalysisTaskPID.h:19
 AliAnalysisTaskPID.h:20
 AliAnalysisTaskPID.h:21
 AliAnalysisTaskPID.h:22
 AliAnalysisTaskPID.h:23
 AliAnalysisTaskPID.h:24
 AliAnalysisTaskPID.h:25
 AliAnalysisTaskPID.h:26
 AliAnalysisTaskPID.h:27
 AliAnalysisTaskPID.h:28
 AliAnalysisTaskPID.h:29
 AliAnalysisTaskPID.h:30
 AliAnalysisTaskPID.h:31
 AliAnalysisTaskPID.h:32
 AliAnalysisTaskPID.h:33
 AliAnalysisTaskPID.h:34
 AliAnalysisTaskPID.h:35
 AliAnalysisTaskPID.h:36
 AliAnalysisTaskPID.h:37
 AliAnalysisTaskPID.h:38
 AliAnalysisTaskPID.h:39
 AliAnalysisTaskPID.h:40
 AliAnalysisTaskPID.h:41
 AliAnalysisTaskPID.h:42
 AliAnalysisTaskPID.h:43
 AliAnalysisTaskPID.h:44
 AliAnalysisTaskPID.h:45
 AliAnalysisTaskPID.h:46
 AliAnalysisTaskPID.h:47
 AliAnalysisTaskPID.h:48
 AliAnalysisTaskPID.h:49
 AliAnalysisTaskPID.h:50
 AliAnalysisTaskPID.h:51
 AliAnalysisTaskPID.h:52
 AliAnalysisTaskPID.h:53
 AliAnalysisTaskPID.h:54
 AliAnalysisTaskPID.h:55
 AliAnalysisTaskPID.h:56
 AliAnalysisTaskPID.h:57
 AliAnalysisTaskPID.h:58
 AliAnalysisTaskPID.h:59
 AliAnalysisTaskPID.h:60
 AliAnalysisTaskPID.h:61
 AliAnalysisTaskPID.h:62
 AliAnalysisTaskPID.h:63
 AliAnalysisTaskPID.h:64
 AliAnalysisTaskPID.h:65
 AliAnalysisTaskPID.h:66
 AliAnalysisTaskPID.h:67
 AliAnalysisTaskPID.h:68
 AliAnalysisTaskPID.h:69
 AliAnalysisTaskPID.h:70
 AliAnalysisTaskPID.h:71
 AliAnalysisTaskPID.h:72
 AliAnalysisTaskPID.h:73
 AliAnalysisTaskPID.h:74
 AliAnalysisTaskPID.h:75
 AliAnalysisTaskPID.h:76
 AliAnalysisTaskPID.h:77
 AliAnalysisTaskPID.h:78
 AliAnalysisTaskPID.h:79
 AliAnalysisTaskPID.h:80
 AliAnalysisTaskPID.h:81
 AliAnalysisTaskPID.h:82
 AliAnalysisTaskPID.h:83
 AliAnalysisTaskPID.h:84
 AliAnalysisTaskPID.h:85
 AliAnalysisTaskPID.h:86
 AliAnalysisTaskPID.h:87
 AliAnalysisTaskPID.h:88
 AliAnalysisTaskPID.h:89
 AliAnalysisTaskPID.h:90
 AliAnalysisTaskPID.h:91
 AliAnalysisTaskPID.h:92
 AliAnalysisTaskPID.h:93
 AliAnalysisTaskPID.h:94
 AliAnalysisTaskPID.h:95
 AliAnalysisTaskPID.h:96
 AliAnalysisTaskPID.h:97
 AliAnalysisTaskPID.h:98
 AliAnalysisTaskPID.h:99
 AliAnalysisTaskPID.h:100
 AliAnalysisTaskPID.h:101
 AliAnalysisTaskPID.h:102
 AliAnalysisTaskPID.h:103
 AliAnalysisTaskPID.h:104
 AliAnalysisTaskPID.h:105
 AliAnalysisTaskPID.h:106
 AliAnalysisTaskPID.h:107
 AliAnalysisTaskPID.h:108
 AliAnalysisTaskPID.h:109
 AliAnalysisTaskPID.h:110
 AliAnalysisTaskPID.h:111
 AliAnalysisTaskPID.h:112
 AliAnalysisTaskPID.h:113
 AliAnalysisTaskPID.h:114
 AliAnalysisTaskPID.h:115
 AliAnalysisTaskPID.h:116
 AliAnalysisTaskPID.h:117
 AliAnalysisTaskPID.h:118
 AliAnalysisTaskPID.h:119
 AliAnalysisTaskPID.h:120
 AliAnalysisTaskPID.h:121
 AliAnalysisTaskPID.h:122
 AliAnalysisTaskPID.h:123
 AliAnalysisTaskPID.h:124
 AliAnalysisTaskPID.h:125
 AliAnalysisTaskPID.h:126
 AliAnalysisTaskPID.h:127
 AliAnalysisTaskPID.h:128
 AliAnalysisTaskPID.h:129
 AliAnalysisTaskPID.h:130
 AliAnalysisTaskPID.h:131
 AliAnalysisTaskPID.h:132
 AliAnalysisTaskPID.h:133
 AliAnalysisTaskPID.h:134
 AliAnalysisTaskPID.h:135
 AliAnalysisTaskPID.h:136
 AliAnalysisTaskPID.h:137
 AliAnalysisTaskPID.h:138
 AliAnalysisTaskPID.h:139
 AliAnalysisTaskPID.h:140
 AliAnalysisTaskPID.h:141
 AliAnalysisTaskPID.h:142
 AliAnalysisTaskPID.h:143
 AliAnalysisTaskPID.h:144
 AliAnalysisTaskPID.h:145
 AliAnalysisTaskPID.h:146
 AliAnalysisTaskPID.h:147
 AliAnalysisTaskPID.h:148
 AliAnalysisTaskPID.h:149
 AliAnalysisTaskPID.h:150
 AliAnalysisTaskPID.h:151
 AliAnalysisTaskPID.h:152
 AliAnalysisTaskPID.h:153
 AliAnalysisTaskPID.h:154
 AliAnalysisTaskPID.h:155
 AliAnalysisTaskPID.h:156
 AliAnalysisTaskPID.h:157
 AliAnalysisTaskPID.h:158
 AliAnalysisTaskPID.h:159
 AliAnalysisTaskPID.h:160
 AliAnalysisTaskPID.h:161
 AliAnalysisTaskPID.h:162
 AliAnalysisTaskPID.h:163
 AliAnalysisTaskPID.h:164
 AliAnalysisTaskPID.h:165
 AliAnalysisTaskPID.h:166
 AliAnalysisTaskPID.h:167
 AliAnalysisTaskPID.h:168
 AliAnalysisTaskPID.h:169
 AliAnalysisTaskPID.h:170
 AliAnalysisTaskPID.h:171
 AliAnalysisTaskPID.h:172
 AliAnalysisTaskPID.h:173
 AliAnalysisTaskPID.h:174
 AliAnalysisTaskPID.h:175
 AliAnalysisTaskPID.h:176
 AliAnalysisTaskPID.h:177
 AliAnalysisTaskPID.h:178
 AliAnalysisTaskPID.h:179
 AliAnalysisTaskPID.h:180
 AliAnalysisTaskPID.h:181
 AliAnalysisTaskPID.h:182
 AliAnalysisTaskPID.h:183
 AliAnalysisTaskPID.h:184
 AliAnalysisTaskPID.h:185
 AliAnalysisTaskPID.h:186
 AliAnalysisTaskPID.h:187
 AliAnalysisTaskPID.h:188
 AliAnalysisTaskPID.h:189
 AliAnalysisTaskPID.h:190
 AliAnalysisTaskPID.h:191
 AliAnalysisTaskPID.h:192
 AliAnalysisTaskPID.h:193
 AliAnalysisTaskPID.h:194
 AliAnalysisTaskPID.h:195
 AliAnalysisTaskPID.h:196
 AliAnalysisTaskPID.h:197
 AliAnalysisTaskPID.h:198
 AliAnalysisTaskPID.h:199
 AliAnalysisTaskPID.h:200
 AliAnalysisTaskPID.h:201
 AliAnalysisTaskPID.h:202
 AliAnalysisTaskPID.h:203
 AliAnalysisTaskPID.h:204
 AliAnalysisTaskPID.h:205
 AliAnalysisTaskPID.h:206
 AliAnalysisTaskPID.h:207
 AliAnalysisTaskPID.h:208
 AliAnalysisTaskPID.h:209
 AliAnalysisTaskPID.h:210
 AliAnalysisTaskPID.h:211
 AliAnalysisTaskPID.h:212
 AliAnalysisTaskPID.h:213
 AliAnalysisTaskPID.h:214
 AliAnalysisTaskPID.h:215
 AliAnalysisTaskPID.h:216
 AliAnalysisTaskPID.h:217
 AliAnalysisTaskPID.h:218
 AliAnalysisTaskPID.h:219
 AliAnalysisTaskPID.h:220
 AliAnalysisTaskPID.h:221
 AliAnalysisTaskPID.h:222
 AliAnalysisTaskPID.h:223
 AliAnalysisTaskPID.h:224
 AliAnalysisTaskPID.h:225
 AliAnalysisTaskPID.h:226
 AliAnalysisTaskPID.h:227
 AliAnalysisTaskPID.h:228
 AliAnalysisTaskPID.h:229
 AliAnalysisTaskPID.h:230
 AliAnalysisTaskPID.h:231
 AliAnalysisTaskPID.h:232
 AliAnalysisTaskPID.h:233
 AliAnalysisTaskPID.h:234
 AliAnalysisTaskPID.h:235
 AliAnalysisTaskPID.h:236
 AliAnalysisTaskPID.h:237
 AliAnalysisTaskPID.h:238
 AliAnalysisTaskPID.h:239
 AliAnalysisTaskPID.h:240
 AliAnalysisTaskPID.h:241
 AliAnalysisTaskPID.h:242
 AliAnalysisTaskPID.h:243
 AliAnalysisTaskPID.h:244
 AliAnalysisTaskPID.h:245
 AliAnalysisTaskPID.h:246
 AliAnalysisTaskPID.h:247
 AliAnalysisTaskPID.h:248
 AliAnalysisTaskPID.h:249
 AliAnalysisTaskPID.h:250
 AliAnalysisTaskPID.h:251
 AliAnalysisTaskPID.h:252
 AliAnalysisTaskPID.h:253
 AliAnalysisTaskPID.h:254
 AliAnalysisTaskPID.h:255
 AliAnalysisTaskPID.h:256
 AliAnalysisTaskPID.h:257
 AliAnalysisTaskPID.h:258
 AliAnalysisTaskPID.h:259
 AliAnalysisTaskPID.h:260
 AliAnalysisTaskPID.h:261
 AliAnalysisTaskPID.h:262
 AliAnalysisTaskPID.h:263
 AliAnalysisTaskPID.h:264
 AliAnalysisTaskPID.h:265
 AliAnalysisTaskPID.h:266
 AliAnalysisTaskPID.h:267
 AliAnalysisTaskPID.h:268
 AliAnalysisTaskPID.h:269
 AliAnalysisTaskPID.h:270
 AliAnalysisTaskPID.h:271
 AliAnalysisTaskPID.h:272
 AliAnalysisTaskPID.h:273
 AliAnalysisTaskPID.h:274
 AliAnalysisTaskPID.h:275
 AliAnalysisTaskPID.h:276
 AliAnalysisTaskPID.h:277
 AliAnalysisTaskPID.h:278
 AliAnalysisTaskPID.h:279
 AliAnalysisTaskPID.h:280
 AliAnalysisTaskPID.h:281
 AliAnalysisTaskPID.h:282
 AliAnalysisTaskPID.h:283
 AliAnalysisTaskPID.h:284
 AliAnalysisTaskPID.h:285
 AliAnalysisTaskPID.h:286
 AliAnalysisTaskPID.h:287
 AliAnalysisTaskPID.h:288
 AliAnalysisTaskPID.h:289
 AliAnalysisTaskPID.h:290
 AliAnalysisTaskPID.h:291
 AliAnalysisTaskPID.h:292
 AliAnalysisTaskPID.h:293
 AliAnalysisTaskPID.h:294
 AliAnalysisTaskPID.h:295
 AliAnalysisTaskPID.h:296
 AliAnalysisTaskPID.h:297
 AliAnalysisTaskPID.h:298
 AliAnalysisTaskPID.h:299
 AliAnalysisTaskPID.h:300
 AliAnalysisTaskPID.h:301
 AliAnalysisTaskPID.h:302
 AliAnalysisTaskPID.h:303
 AliAnalysisTaskPID.h:304
 AliAnalysisTaskPID.h:305
 AliAnalysisTaskPID.h:306
 AliAnalysisTaskPID.h:307
 AliAnalysisTaskPID.h:308
 AliAnalysisTaskPID.h:309
 AliAnalysisTaskPID.h:310
 AliAnalysisTaskPID.h:311
 AliAnalysisTaskPID.h:312
 AliAnalysisTaskPID.h:313
 AliAnalysisTaskPID.h:314
 AliAnalysisTaskPID.h:315
 AliAnalysisTaskPID.h:316
 AliAnalysisTaskPID.h:317
 AliAnalysisTaskPID.h:318
 AliAnalysisTaskPID.h:319
 AliAnalysisTaskPID.h:320
 AliAnalysisTaskPID.h:321
 AliAnalysisTaskPID.h:322
 AliAnalysisTaskPID.h:323
 AliAnalysisTaskPID.h:324
 AliAnalysisTaskPID.h:325
 AliAnalysisTaskPID.h:326
 AliAnalysisTaskPID.h:327
 AliAnalysisTaskPID.h:328
 AliAnalysisTaskPID.h:329
 AliAnalysisTaskPID.h:330
 AliAnalysisTaskPID.h:331
 AliAnalysisTaskPID.h:332
 AliAnalysisTaskPID.h:333
 AliAnalysisTaskPID.h:334
 AliAnalysisTaskPID.h:335
 AliAnalysisTaskPID.h:336
 AliAnalysisTaskPID.h:337
 AliAnalysisTaskPID.h:338
 AliAnalysisTaskPID.h:339
 AliAnalysisTaskPID.h:340
 AliAnalysisTaskPID.h:341
 AliAnalysisTaskPID.h:342
 AliAnalysisTaskPID.h:343
 AliAnalysisTaskPID.h:344
 AliAnalysisTaskPID.h:345
 AliAnalysisTaskPID.h:346
 AliAnalysisTaskPID.h:347
 AliAnalysisTaskPID.h:348
 AliAnalysisTaskPID.h:349
 AliAnalysisTaskPID.h:350
 AliAnalysisTaskPID.h:351
 AliAnalysisTaskPID.h:352
 AliAnalysisTaskPID.h:353
 AliAnalysisTaskPID.h:354
 AliAnalysisTaskPID.h:355
 AliAnalysisTaskPID.h:356
 AliAnalysisTaskPID.h:357
 AliAnalysisTaskPID.h:358
 AliAnalysisTaskPID.h:359
 AliAnalysisTaskPID.h:360
 AliAnalysisTaskPID.h:361
 AliAnalysisTaskPID.h:362
 AliAnalysisTaskPID.h:363
 AliAnalysisTaskPID.h:364
 AliAnalysisTaskPID.h:365
 AliAnalysisTaskPID.h:366
 AliAnalysisTaskPID.h:367
 AliAnalysisTaskPID.h:368
 AliAnalysisTaskPID.h:369
 AliAnalysisTaskPID.h:370
 AliAnalysisTaskPID.h:371
 AliAnalysisTaskPID.h:372
 AliAnalysisTaskPID.h:373
 AliAnalysisTaskPID.h:374
 AliAnalysisTaskPID.h:375
 AliAnalysisTaskPID.h:376
 AliAnalysisTaskPID.h:377
 AliAnalysisTaskPID.h:378
 AliAnalysisTaskPID.h:379
 AliAnalysisTaskPID.h:380
 AliAnalysisTaskPID.h:381
 AliAnalysisTaskPID.h:382
 AliAnalysisTaskPID.h:383
 AliAnalysisTaskPID.h:384
 AliAnalysisTaskPID.h:385
 AliAnalysisTaskPID.h:386
 AliAnalysisTaskPID.h:387
 AliAnalysisTaskPID.h:388
 AliAnalysisTaskPID.h:389
 AliAnalysisTaskPID.h:390
 AliAnalysisTaskPID.h:391
 AliAnalysisTaskPID.h:392
 AliAnalysisTaskPID.h:393
 AliAnalysisTaskPID.h:394
 AliAnalysisTaskPID.h:395
 AliAnalysisTaskPID.h:396
 AliAnalysisTaskPID.h:397
 AliAnalysisTaskPID.h:398
 AliAnalysisTaskPID.h:399
 AliAnalysisTaskPID.h:400
 AliAnalysisTaskPID.h:401
 AliAnalysisTaskPID.h:402
 AliAnalysisTaskPID.h:403
 AliAnalysisTaskPID.h:404
 AliAnalysisTaskPID.h:405
 AliAnalysisTaskPID.h:406
 AliAnalysisTaskPID.h:407
 AliAnalysisTaskPID.h:408
 AliAnalysisTaskPID.h:409
 AliAnalysisTaskPID.h:410
 AliAnalysisTaskPID.h:411
 AliAnalysisTaskPID.h:412
 AliAnalysisTaskPID.h:413
 AliAnalysisTaskPID.h:414
 AliAnalysisTaskPID.h:415
 AliAnalysisTaskPID.h:416
 AliAnalysisTaskPID.h:417
 AliAnalysisTaskPID.h:418
 AliAnalysisTaskPID.h:419
 AliAnalysisTaskPID.h:420
 AliAnalysisTaskPID.h:421
 AliAnalysisTaskPID.h:422
 AliAnalysisTaskPID.h:423
 AliAnalysisTaskPID.h:424
 AliAnalysisTaskPID.h:425
 AliAnalysisTaskPID.h:426
 AliAnalysisTaskPID.h:427
 AliAnalysisTaskPID.h:428
 AliAnalysisTaskPID.h:429
 AliAnalysisTaskPID.h:430
 AliAnalysisTaskPID.h:431
 AliAnalysisTaskPID.h:432
 AliAnalysisTaskPID.h:433
 AliAnalysisTaskPID.h:434
 AliAnalysisTaskPID.h:435
 AliAnalysisTaskPID.h:436
 AliAnalysisTaskPID.h:437
 AliAnalysisTaskPID.h:438
 AliAnalysisTaskPID.h:439
 AliAnalysisTaskPID.h:440
 AliAnalysisTaskPID.h:441
 AliAnalysisTaskPID.h:442
 AliAnalysisTaskPID.h:443
 AliAnalysisTaskPID.h:444
 AliAnalysisTaskPID.h:445
 AliAnalysisTaskPID.h:446
 AliAnalysisTaskPID.h:447
 AliAnalysisTaskPID.h:448
 AliAnalysisTaskPID.h:449
 AliAnalysisTaskPID.h:450
 AliAnalysisTaskPID.h:451
 AliAnalysisTaskPID.h:452
 AliAnalysisTaskPID.h:453
 AliAnalysisTaskPID.h:454
 AliAnalysisTaskPID.h:455
 AliAnalysisTaskPID.h:456
 AliAnalysisTaskPID.h:457
 AliAnalysisTaskPID.h:458
 AliAnalysisTaskPID.h:459
 AliAnalysisTaskPID.h:460
 AliAnalysisTaskPID.h:461
 AliAnalysisTaskPID.h:462
 AliAnalysisTaskPID.h:463
 AliAnalysisTaskPID.h:464
 AliAnalysisTaskPID.h:465
 AliAnalysisTaskPID.h:466
 AliAnalysisTaskPID.h:467
 AliAnalysisTaskPID.h:468
 AliAnalysisTaskPID.h:469
 AliAnalysisTaskPID.h:470
 AliAnalysisTaskPID.h:471
 AliAnalysisTaskPID.h:472
 AliAnalysisTaskPID.h:473
 AliAnalysisTaskPID.h:474
 AliAnalysisTaskPID.h:475
 AliAnalysisTaskPID.h:476
 AliAnalysisTaskPID.h:477
 AliAnalysisTaskPID.h:478
 AliAnalysisTaskPID.h:479
 AliAnalysisTaskPID.h:480
 AliAnalysisTaskPID.h:481
 AliAnalysisTaskPID.h:482
 AliAnalysisTaskPID.h:483
 AliAnalysisTaskPID.h:484
 AliAnalysisTaskPID.h:485
 AliAnalysisTaskPID.h:486
 AliAnalysisTaskPID.h:487
 AliAnalysisTaskPID.h:488
 AliAnalysisTaskPID.h:489
 AliAnalysisTaskPID.h:490
 AliAnalysisTaskPID.h:491
 AliAnalysisTaskPID.h:492
 AliAnalysisTaskPID.h:493
 AliAnalysisTaskPID.h:494
 AliAnalysisTaskPID.h:495
 AliAnalysisTaskPID.h:496
 AliAnalysisTaskPID.h:497
 AliAnalysisTaskPID.h:498
 AliAnalysisTaskPID.h:499
 AliAnalysisTaskPID.h:500
 AliAnalysisTaskPID.h:501
 AliAnalysisTaskPID.h:502
 AliAnalysisTaskPID.h:503
 AliAnalysisTaskPID.h:504
 AliAnalysisTaskPID.h:505
 AliAnalysisTaskPID.h:506
 AliAnalysisTaskPID.h:507
 AliAnalysisTaskPID.h:508
 AliAnalysisTaskPID.h:509
 AliAnalysisTaskPID.h:510
 AliAnalysisTaskPID.h:511
 AliAnalysisTaskPID.h:512
 AliAnalysisTaskPID.h:513
 AliAnalysisTaskPID.h:514
 AliAnalysisTaskPID.h:515
 AliAnalysisTaskPID.h:516
 AliAnalysisTaskPID.h:517
 AliAnalysisTaskPID.h:518
 AliAnalysisTaskPID.h:519
 AliAnalysisTaskPID.h:520
 AliAnalysisTaskPID.h:521
 AliAnalysisTaskPID.h:522
 AliAnalysisTaskPID.h:523
 AliAnalysisTaskPID.h:524
 AliAnalysisTaskPID.h:525
 AliAnalysisTaskPID.h:526
 AliAnalysisTaskPID.h:527
 AliAnalysisTaskPID.h:528
 AliAnalysisTaskPID.h:529
 AliAnalysisTaskPID.h:530
 AliAnalysisTaskPID.h:531
 AliAnalysisTaskPID.h:532
 AliAnalysisTaskPID.h:533
 AliAnalysisTaskPID.h:534
 AliAnalysisTaskPID.h:535
 AliAnalysisTaskPID.h:536
 AliAnalysisTaskPID.h:537
 AliAnalysisTaskPID.h:538
 AliAnalysisTaskPID.h:539
 AliAnalysisTaskPID.h:540
 AliAnalysisTaskPID.h:541
 AliAnalysisTaskPID.h:542
 AliAnalysisTaskPID.h:543
 AliAnalysisTaskPID.h:544
 AliAnalysisTaskPID.h:545
 AliAnalysisTaskPID.h:546
 AliAnalysisTaskPID.h:547
 AliAnalysisTaskPID.h:548
 AliAnalysisTaskPID.h:549
 AliAnalysisTaskPID.h:550
 AliAnalysisTaskPID.h:551
 AliAnalysisTaskPID.h:552
 AliAnalysisTaskPID.h:553
 AliAnalysisTaskPID.h:554
 AliAnalysisTaskPID.h:555
 AliAnalysisTaskPID.h:556
 AliAnalysisTaskPID.h:557
 AliAnalysisTaskPID.h:558
 AliAnalysisTaskPID.h:559
 AliAnalysisTaskPID.h:560
 AliAnalysisTaskPID.h:561
 AliAnalysisTaskPID.h:562
 AliAnalysisTaskPID.h:563
 AliAnalysisTaskPID.h:564
 AliAnalysisTaskPID.h:565
 AliAnalysisTaskPID.h:566
 AliAnalysisTaskPID.h:567
 AliAnalysisTaskPID.h:568
 AliAnalysisTaskPID.h:569
 AliAnalysisTaskPID.h:570
 AliAnalysisTaskPID.h:571
 AliAnalysisTaskPID.h:572
 AliAnalysisTaskPID.h:573
 AliAnalysisTaskPID.h:574
 AliAnalysisTaskPID.h:575
 AliAnalysisTaskPID.h:576
 AliAnalysisTaskPID.h:577
 AliAnalysisTaskPID.h:578
 AliAnalysisTaskPID.h:579
 AliAnalysisTaskPID.h:580
 AliAnalysisTaskPID.h:581
 AliAnalysisTaskPID.h:582
 AliAnalysisTaskPID.h:583
 AliAnalysisTaskPID.h:584
 AliAnalysisTaskPID.h:585
 AliAnalysisTaskPID.h:586
 AliAnalysisTaskPID.h:587
 AliAnalysisTaskPID.h:588
 AliAnalysisTaskPID.h:589
 AliAnalysisTaskPID.h:590
 AliAnalysisTaskPID.h:591
 AliAnalysisTaskPID.h:592
 AliAnalysisTaskPID.h:593
 AliAnalysisTaskPID.h:594
 AliAnalysisTaskPID.h:595
 AliAnalysisTaskPID.h:596
 AliAnalysisTaskPID.h:597
 AliAnalysisTaskPID.h:598
 AliAnalysisTaskPID.h:599
 AliAnalysisTaskPID.h:600
 AliAnalysisTaskPID.h:601
 AliAnalysisTaskPID.h:602
 AliAnalysisTaskPID.h:603
 AliAnalysisTaskPID.h:604
 AliAnalysisTaskPID.h:605
 AliAnalysisTaskPID.h:606
 AliAnalysisTaskPID.h:607
 AliAnalysisTaskPID.h:608
 AliAnalysisTaskPID.h:609
 AliAnalysisTaskPID.h:610
 AliAnalysisTaskPID.h:611
 AliAnalysisTaskPID.h:612
 AliAnalysisTaskPID.h:613
 AliAnalysisTaskPID.h:614
 AliAnalysisTaskPID.h:615
 AliAnalysisTaskPID.h:616
 AliAnalysisTaskPID.h:617
 AliAnalysisTaskPID.h:618
 AliAnalysisTaskPID.h:619
 AliAnalysisTaskPID.h:620
 AliAnalysisTaskPID.h:621
 AliAnalysisTaskPID.h:622
 AliAnalysisTaskPID.h:623
 AliAnalysisTaskPID.h:624
 AliAnalysisTaskPID.h:625
 AliAnalysisTaskPID.h:626
 AliAnalysisTaskPID.h:627
 AliAnalysisTaskPID.h:628
 AliAnalysisTaskPID.h:629
 AliAnalysisTaskPID.h:630
 AliAnalysisTaskPID.h:631
 AliAnalysisTaskPID.h:632
 AliAnalysisTaskPID.h:633
 AliAnalysisTaskPID.h:634
 AliAnalysisTaskPID.h:635
 AliAnalysisTaskPID.h:636
 AliAnalysisTaskPID.h:637
 AliAnalysisTaskPID.h:638
 AliAnalysisTaskPID.h:639
 AliAnalysisTaskPID.h:640
 AliAnalysisTaskPID.h:641
 AliAnalysisTaskPID.h:642
 AliAnalysisTaskPID.h:643
 AliAnalysisTaskPID.h:644
 AliAnalysisTaskPID.h:645
 AliAnalysisTaskPID.h:646
 AliAnalysisTaskPID.h:647
 AliAnalysisTaskPID.h:648
 AliAnalysisTaskPID.h:649
 AliAnalysisTaskPID.h:650
 AliAnalysisTaskPID.h:651
 AliAnalysisTaskPID.h:652
 AliAnalysisTaskPID.h:653
 AliAnalysisTaskPID.h:654
 AliAnalysisTaskPID.h:655
 AliAnalysisTaskPID.h:656
 AliAnalysisTaskPID.h:657
 AliAnalysisTaskPID.h:658
 AliAnalysisTaskPID.h:659
 AliAnalysisTaskPID.h:660
 AliAnalysisTaskPID.h:661
 AliAnalysisTaskPID.h:662
 AliAnalysisTaskPID.h:663
 AliAnalysisTaskPID.h:664
 AliAnalysisTaskPID.h:665
 AliAnalysisTaskPID.h:666
 AliAnalysisTaskPID.h:667
 AliAnalysisTaskPID.h:668
 AliAnalysisTaskPID.h:669
 AliAnalysisTaskPID.h:670
 AliAnalysisTaskPID.h:671
 AliAnalysisTaskPID.h:672
 AliAnalysisTaskPID.h:673
 AliAnalysisTaskPID.h:674
 AliAnalysisTaskPID.h:675
 AliAnalysisTaskPID.h:676
 AliAnalysisTaskPID.h:677
 AliAnalysisTaskPID.h:678
 AliAnalysisTaskPID.h:679
 AliAnalysisTaskPID.h:680
 AliAnalysisTaskPID.h:681
 AliAnalysisTaskPID.h:682
 AliAnalysisTaskPID.h:683
 AliAnalysisTaskPID.h:684