]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG/CaloTrackCorrBase/AliCaloPID.h
Merge branch 'master_patch'
[u/mrichter/AliRoot.git] / PWG / CaloTrackCorrBase / AliCaloPID.h
index df28734d238dc9e1c440fbc98f0b75e249da0f1f..b652d1be4fbf81700565c126c8cb9a45272073d0 100755 (executable)
@@ -48,7 +48,7 @@ class AliCaloPID : public TObject {
  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
        
@@ -73,24 +73,28 @@ class AliCaloPID : public TObject {
 
   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();
   
@@ -105,11 +109,11 @@ class AliCaloPID : public TObject {
   
   //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
   
@@ -200,9 +204,6 @@ class AliCaloPID : public TObject {
   
   // Cluster splitting analysis
   
-  void    SwitchOnClusterSplittingPID()        { fDoClusterSplitting = kTRUE  ; }
-  void    SwitchOffClusterplittingPID()        { fDoClusterSplitting = kFALSE ; }
-  
   void    SwitchOnSimpleSplitMassCut()         { fUseSimpleMassCut   = kTRUE  ; }
   void    SwitchOffSimpleSplitMassCut()        { fUseSimpleMassCut   = kFALSE ; }
 
@@ -211,14 +212,23 @@ class AliCaloPID : public TObject {
   
   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
@@ -228,13 +238,25 @@ class AliCaloPID : public TObject {
   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 ; }
@@ -279,10 +301,10 @@ private:
   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  
@@ -292,20 +314,22 @@ private:
   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)
   
 } ;