public:
AliCaloPID() ; // ctor
- AliCaloPID(const Int_t particleFlux) ; // ctor, to be used when recalculating bayesian PID
+ AliCaloPID(Int_t particleFlux) ; // ctor, to be used when recalculating bayesian PID
AliCaloPID(const TNamed * emcalpid) ; // ctor, to be used when recalculating bayesian PID and need different parameters
virtual ~AliCaloPID() ;//virtual dtor
void InitParameters();
- Bool_t IsInPi0SplitAsymmetryRange(const Float_t energy, const Float_t asy, const Int_t nlm);
+ Bool_t IsInPi0SplitAsymmetryRange(Float_t energy, Float_t asy, Int_t nlm) const;
- Bool_t IsInPi0SplitMassRange (const Float_t energy, const Float_t mass, const Int_t nlm);
+ Bool_t IsInPi0SplitMassRange (Float_t energy, Float_t mass, Int_t nlm) const;
- Bool_t IsInPi0M02Range (const Float_t energy, const Float_t m02, const Int_t nlm);
- Bool_t IsInEtaM02Range (const Float_t energy, const Float_t m02, const Int_t nlm);
- Bool_t IsInConM02Range (const Float_t energy, const Float_t m02, const Int_t nlm);
+ Bool_t IsInM02Range (Float_t m02) const;
+ Bool_t IsInPi0M02Range (Float_t energy, Float_t m02, Int_t nlm) const;
+ Bool_t IsInEtaM02Range (Float_t energy, Float_t m02, Int_t nlm) const;
+ Bool_t IsInConM02Range (Float_t energy, Float_t m02, Int_t nlm) const;
- Int_t GetIdentifiedParticleTypeFromBayesWeights(const Bool_t isEMCAL, const Double_t * pid, const Float_t energy) ;
+ Int_t GetIdentifiedParticleTypeFromBayesWeights(Bool_t isEMCAL, Double_t * pid, Float_t energy) ;
Int_t GetIdentifiedParticleTypeFromClusterSplitting(AliVCluster * cluster, AliVCaloCells* cells,
AliCalorimeterUtils * caloutils,
Double_t vertex[3],
Int_t & nLocMax, Double_t & mass, Double_t & angle,
- Double_t & e1 , Double_t & e2 ) ;
+ TLorentzVector & l1 , TLorentzVector & l2,
+ Int_t & absId1, Int_t & absId2,
+ Float_t & distbad1, Float_t & distbad2,
+ Bool_t & fidcut1, Bool_t & fidcut2 ) const;
- Int_t GetIdentifiedParticleType(const AliVCluster * cluster) ;
+ Int_t GetIdentifiedParticleType(AliVCluster * cluster) ;
TString GetPIDParametersList();
//Check if cluster photon-like. Uses photon cluster parameterization in real pp data
//Returns distance in sigmas. Recommended cut 2.5
- Float_t TestPHOSDispersion(const Double_t pt, const Double_t m20, const Double_t m02) const ;
+ Float_t TestPHOSDispersion(Double_t pt, Double_t m20, Double_t m02) const ;
//Checks distance to the closest track. Takes into account
//non-perpendicular incidence of tracks.
- Float_t TestPHOSChargedVeto(const Double_t dx, const Double_t dz, const Double_t ptTrack,
- const Int_t chargeTrack, const Double_t mf) const ;
+ Float_t TestPHOSChargedVeto(Double_t dx, Double_t dz, Double_t ptTrack,
+ Int_t chargeTrack, Double_t mf) const ;
// Setters, getters
// Cluster splitting analysis
- void SwitchOnClusterSplittingPID() { fDoClusterSplitting = kTRUE ; }
- void SwitchOffClusterplittingPID() { fDoClusterSplitting = kFALSE ; }
-
void SwitchOnSimpleSplitMassCut() { fUseSimpleMassCut = kTRUE ; }
void SwitchOffSimpleSplitMassCut() { fUseSimpleMassCut = kFALSE ; }
void SwitchOnSplitAsymmetryCut() { fUseSplitAsyCut = kTRUE ; }
void SwitchOffSplitAsymmetryCut() { fUseSplitAsyCut = kFALSE ; }
+ Bool_t IsSplitAsymmetryCutOn() { return fUseSplitAsyCut ; }
+
+ void SwitchOnSplitShowerShapeCut() { fUseSplitSSCut = kTRUE ; }
+ void SwitchOffSplitShowerShapeCut() { fUseSplitSSCut = kFALSE ; }
+ Bool_t IsSplitShowerShapeCutOn() { return fUseSplitSSCut ; }
void SetClusterSplittingM02Cut(Float_t min=0, Float_t max=100)
{ fSplitM02MinCut = min ; fSplitM02MaxCut = max ; }
- void SetClusterSplittingMinNCells(Int_t cut) { fSplitMinNCells = cut ; }
+ void SetClusterSplittingMinNCells(Int_t c) { fSplitMinNCells = c ; }
+ Int_t GetClusterSplittingMinNCells() const { return fSplitMinNCells ; }
- void SetSplitEnergyFractionMinimum(Float_t min){ fSplitEFracMin = min ; }
- Float_t GetSplitEnergyFractionMinimum() const { return fSplitEFracMin ; }
+ void SetSplitEnergyFractionMinimum(Int_t i, Float_t min){ if (i < 3 && i >=0 ) fSplitEFracMin[i] = min ; }
+ Float_t GetSplitEnergyFractionMinimum(Int_t i) const { if( i < 3 && i >=0 ) return fSplitEFracMin[i] ; else return 0 ; }
+
+ void SetSubClusterEnergyMinimum (Int_t i, Float_t min){ if (i < 3 && i >=0 ) fSubClusterEMin[i] = min ; }
+ Float_t GetSubClusterEnergyMinimum (Int_t i) const { if( i < 3 && i >=0 ) return fSubClusterEMin[i]; else return 0 ; }
Float_t GetPi0MinMass() const { return fMassPi0Min ; } // Simple cut case
Float_t GetEtaMinMass() const { return fMassEtaMin ; } // Simple cut case
Float_t GetPhotonMaxMass() const { return fMassPhoMax ; }
void SetSplitWidthSigma(Float_t s) { fSplitWidthSigma = s ; }
- void SetPi0MassWidthSelectionParameters (Int_t iparam, Float_t param) { if(iparam < 7 ) fMassWidthPi0Param[iparam] = param ; }
+
+ void SetPi0MassShiftHighECell(Float_t s) { fMassShiftHighECell = s ; }
+
+ void SetPi0MassSelectionParameters (Int_t inlm, Int_t iparam, Float_t param)
+ { if(iparam < 6 ) fMassPi0Param[inlm][iparam] = param ; }
+
+ void SetPi0WidthSelectionParameters (Int_t inlm, Int_t iparam, Float_t param)
+ { if(iparam < 6 ) fWidthPi0Param[inlm][iparam] = param ; }
+
void SetM02MaximumSelectionParameters (Int_t inlm, Int_t iparam, Float_t param)
- { if(iparam < 6 && inlm < 2) fM02MaxParam[inlm][iparam] = param ; }
+ { if(iparam < 5 && inlm < 2) fM02MaxParam[inlm][iparam] = param ; }
+
+ void SetM02MaximumShiftForNLMN(Int_t shift) { fM02MaxParamShiftNLMN = shift ; }
+
void SetM02MinimumSelectionParameters (Int_t inlm, Int_t iparam, Float_t param)
- { if(iparam < 6 && inlm < 2) fM02MinParam[inlm][iparam] = param ; }
+ { if(iparam < 5 && inlm < 2) fM02MinParam[inlm][iparam] = param ; }
+
void SetAsymmetryMinimumSelectionParameters(Int_t inlm, Int_t iparam, Float_t param)
- { if(iparam < 6 && inlm < 2) fAsyMinParam[inlm][iparam] = param ; }
+ { if(iparam < 4 && inlm < 2) fAsyMinParam[inlm][iparam] = param ; }
void SetPi0MassRange(Float_t min, Float_t max) { fMassPi0Min = min ; fMassPi0Max = max ; } // Simple case
void SetEtaMassRange(Float_t min, Float_t max) { fMassEtaMin = min ; fMassEtaMax = max ; }
Float_t fPHOSRCut; // Track-Cluster distance cut for track matching in PHOS
// Cluster splitting mass ranges
- Bool_t fDoClusterSplitting; // Cluster splitting analysis
Bool_t fUseSimpleMassCut; // Use simple min-max pi0 mass cut
Bool_t fUseSimpleM02Cut; // Use simple min-max M02 cut
- Bool_t fUseSplitAsyCut ; // Remove splitted clusters with too large asymmetry, range defined in AliCaloPID
+ Bool_t fUseSplitAsyCut ; // Remove splitted clusters with too large asymmetry
+ Bool_t fUseSplitSSCut ; // Remove splitted clusters out of shower shape band
Float_t fSplitM02MaxCut ; // Study clusters with l0 smaller than cut
Float_t fSplitM02MinCut ; // Study clusters with l0 larger than cut // simple case
Int_t fSplitMinNCells ; // Study clusters with ncells larger than cut
Float_t fMassPi0Max ; // Min Pi0 mass // simple cut case
Float_t fMassPhoMin ; // Min Photon mass
Float_t fMassPhoMax ; // Min Photon mass
- Float_t fMassWidthPi0Param[7] ; // 3 param for pol2 fit on width, 2 param for mass position NLM=1 and NLM>1 for pi0 selection
- Float_t fM02MinParam[2][6] ; // 4 param for pol3 fit on M02 minimum for pi0 selection (maximum for conversions)
- Float_t fM02MaxParam[2][6] ; // 4 param for pol3 fit on M02 maximum for pi0 selection
- Float_t fAsyMinParam[2][6] ; // 4 param for pol3 fit on asymmetry minimum, for 2 cases, NLM=1 and NLM>=2
- Float_t fSplitEFracMin ; // Do not use clusters with too large energy in cluster compared
- // to energy in splitted clusters
+ Float_t fMassPi0Param [2][6] ; // mean mass param, 2 regions in energy
+ Float_t fWidthPi0Param[2][6] ; // width param, 2 regions in energy
+ Float_t fM02MinParam[2][5] ; // 5 param for expo + pol fit on M02 minimum for pi0 selection (maximum for conversions)
+ Float_t fM02MaxParam[2][5] ; // 5 param for expo + pol fit on M02 maximum for pi0 selection
+ Float_t fM02MaxParamShiftNLMN; // shift of max M02 for NLM>2
+ Float_t fAsyMinParam[2][4] ; // 3 param for fit on asymmetry minimum, for 2 cases, NLM=1 and NLM>=2
+ Float_t fSplitEFracMin[3] ; // Do not use clusters with too large energy in cluster compared
+ // to energy in splitted clusters, depeding on NLM
+ Float_t fSubClusterEMin[3] ; // Do not use sub-clusters with too low energy depeding on NLM
Float_t fSplitWidthSigma; // Cut on mass+-width*fSplitWidthSigma
+ Float_t fMassShiftHighECell; // Shift cuts 5 MeV for Ecell > 150 MeV, default Ecell > 50 MeV
-
-
AliCaloPID & operator = (const AliCaloPID & cpid) ; // cpy assignment
AliCaloPID( const AliCaloPID & cpid) ; // cpy ctor
- ClassDef(AliCaloPID,17)
+ ClassDef(AliCaloPID,22)
} ;