/* $Id$ */
+/* History of cvs commits:
+ *
+ * $Log$
+ * Revision 1.60 2007/04/01 15:40:15 kharlov
+ * Correction for actual vertex position implemented
+ *
+ * Revision 1.59 2007/03/06 06:57:46 kharlov
+ * DP:calculation of distance to CPV done in TSM
+ *
+ * Revision 1.58 2006/04/12 11:32:03 alibrary
+ * Simplification of Makefile and some small corrections
+ *
+ * Revision 1.57 2006/01/23 17:51:48 hristov
+ * Using the recommended way of forward declarations for TVector and TMatrix (see v5-08-00 release notes). Additional clean-up
+ *
+ * Revision 1.56 2005/05/28 14:19:04 schutz
+ * Compilation warnings fixed by T.P.
+ *
+ */
//_________________________________________________________________________
// Implementation version v1 of the PHOS particle identifier
// Oh yeah
//*-- Author: Yves Schutz (SUBATECH), Gustavo Conesa.
+// --- Standard library ---
+
// --- ROOT system ---
-//class TFormula ;
-class TVector3 ;
-class TMatrixD ;
+class TCanvas ;
+class TFolder ;
+class TFormula;
class TPrincipal ;
-
-// --- Standard library ---
+class TROOT ;
+class TTree ;
+#include "TVector3.h"
+#include <TMatrixDfwd.h>
// --- AliRoot header files ---
+class AliPHOSClusterizerv1 ;
+class AliPHOSCpvRecPoint ;
class AliPHOSEmcRecPoint ;
-class AliPHOSRecPoint ;
-
+class AliPHOSTrackSegment ;
+class AliPHOSTrackSegmentMakerv1 ;
#include "AliPHOSPID.h"
+#include "AliPID.h"
class AliPHOSPIDv1 : public AliPHOSPID {
-
+
public:
-
- AliPHOSPIDv1() ; // ctor
- AliPHOSPIDv1(const char* headerFile, const char * tsBranch = "Default", const char * from = 0) ;
-
+
+ AliPHOSPIDv1() ; // ctor
+ AliPHOSPIDv1(AliPHOSGeometry *geom);
+ AliPHOSPIDv1(const AliPHOSPIDv1 & pid) ; // cpy ctor
+
virtual ~AliPHOSPIDv1() ; // dtor
+
+ virtual void TrackSegments2RecParticles(Option_t *option); // Does the job
+
+ //Get file name that contain the PCA
+ const TString GetFileNamePrincipal(TString particle) const;
+
+ //Get file name that contain PID parameters
+ const TString GetFileNameParameters() const {return fFileNameParameters ;}
+
+ // Get PID parameters as they are defined in fParameters
+ Float_t GetParameterCalibration (Int_t i) const;
+ Float_t GetParameterCpv2Emc (Int_t i, TString axis) const;
+ Float_t GetParameterTimeGate (Int_t i) const;
+ Float_t GetParameterToCalculateEllipse(TString particle, TString param, Int_t i) const ;
+ Float_t GetParameterPhotonBoundary (Int_t i) const;
+ Float_t GetParameterPi0Boundary (Int_t i) const;
+
+ // Get energy-dependent PID parameters
+ Float_t GetCpv2EmcDistanceCut (TString axis, Float_t e) const ;
+ Float_t GetEllipseParameter (TString particle, TString param, Float_t e) const;
+
+ Double_t GetThresholdChargedNeutral () const {return fChargedNeutralThreshold;}
+ Float_t GetTOFEnergyThreshold () const {return fTOFEnThreshold;}
+ Float_t GetDispersionEnergyThreshold () const {return fDispEnThreshold;}
+ Int_t GetDispersionMultiplicityThreshold () const {return fDispMultThreshold;}
+
+ //Do bayesian PID
+ void SetBayesianPID(Bool_t set){ fBayesian = set ;}
+
+ // Set PID parameters to change appropriate element of fParameters
+ void SetParameterCalibration (Int_t i, Float_t param);
+ void SetParameterCpv2Emc (Int_t i, TString axis, Float_t cut) ;
+ void SetParameterTimeGate (Int_t i, Float_t gate) ;
+ void SetParameterToCalculateEllipse(TString particle, TString param, Int_t i, Float_t value) ;
+ void SetParameterPhotonBoundary(Int_t i, Float_t param);
+ void SetParameterPi0Boundary (Int_t i, Float_t param);
+
+ void SetThresholdChargedNeutral (Double_t th) {fChargedNeutralThreshold = th;}
+ void SetTOFEnergyThreshold (Float_t th) {fTOFEnThreshold = th;}
+ void SetDispersionEnergyThreshold (Float_t th) {fDispEnThreshold = th;}
+ void SetDispersionMultiplicityThreshold (Int_t th) {fDispMultThreshold = th;}
+
+ //Switch to "on flyght" mode, without writing to TreeR and file
+ void SetWriting(Bool_t toWrite = kFALSE){fWrite = toWrite;}
+ void Print(const Option_t * = "") const ;
+
+ void GetVertex(void) ; //Extracts vertex in current event
- virtual void Exec(Option_t * option) ;
- virtual char * GetRecParticlesBranch()const {return (char*) fRecParticlesTitle.Data() ;}
- virtual char * GetTrackSegmentsBranch()const{return (char*) fTrackSegmentsTitle.Data(); }
- virtual const Int_t GetRecParticlesInRun() const {return fRecParticlesInRun ;}
-
- virtual void Print(Option_t * option) const {}
- void Print() ;
- // Get CpvtoEmcDistanceCut and TimeGate parameters depending on the custer energy and
- // Purity-Efficiency point (possible options "HIGH EFFICIENCY" "MEDIUM EFFICIENCY" "LOW
- // EFFICIENCY" and 3 more options changing EFFICIENCY by PURITY)
- Double_t GetCpvtoEmcDistanceCut(const Float_t Cluster_En, const TString Eff_Pur) ;
- Double_t GetTimeGate(const Float_t Cluster_En, const TString Eff_Pur) ;
-
- //Get files that contain the PCA
- const TString GetPrincipalFile5( )const {return fFileName5 ;}
- const TString GetPrincipalFilePar5( )const {return fFileNamePar5 ;}
- const TString GetPrincipalFile100( )const {return fFileName100 ;}
- const TString GetPrincipalFilePar100( )const {return fFileNamePar100 ;}
-
- // Set all parameters necessary in the PID depending on the custer energy and
- // Purity-Efficiency point (possible options "HIGH EFFICIENCY" "MEDIUM EFFICIENCY" "LOW
- // EFFICIENCY" and 3 more options changing EFFICIENCY by PURITY)
- void SetCpvtoEmcDistanceCut(Float_t Cluster_En, TString Eff_Pur, Float_t cut) ;
- void SetTimeGate(Float_t Cluster_En, TString Eff_Pur, Float_t gate) ;
- void SetEllipseXCenter(Float_t Cluster_En, TString Eff_Pur, Float_t x) ;
- void SetEllipseYCenter(Float_t Cluster_En, TString Eff_Pur, Float_t y) ;
- void SetEllipseAParameter(Float_t Cluster_En, TString Eff_Pur, Float_t a) ;
- void SetEllipseBParameter(Float_t Cluster_En, TString Eff_Pur, Float_t b) ;
- void SetEllipseAngle(Float_t Cluster_En, TString Eff_Pur, Float_t angle) ;
- void SetEllipseParameters(Float_t Cluster_En, TString Eff_Pur, Float_t x, Float_t y,Float_t a, Float_t b,Float_t angle) ;
-
- //Get and Set energy calibration parameters
- Float_t GetACalParameter() {return fACalParameter ;}
- Float_t GetBCalParameter() {return fBCalParameter ;}
- Float_t GetCCalParameter() {return fCCalParameter ;}
- void SetACalParameter(Float_t a) { fACalParameter = a ;}
- void SetBCalParameter(Float_t b) { fBCalParameter = b ;}
- void SetCCalParameter(Float_t c) { fCCalParameter = c ;}
-
- virtual void SetTrackSegmentsBranch(const char* title) { fTrackSegmentsTitle = title;}
- virtual void SetRecParticlesBranch (const char* title) { fRecParticlesTitle = title;}
virtual const char * Version() const { return "pid-v1" ; }
+
+ AliPHOSPIDv1 & operator = (const AliPHOSPIDv1 & /*pid*/) { return *this ;}
- private:
-
- const TString AliPHOSPIDv1::BranchName() const ;
- virtual void Init() ;
- virtual void InitParameters() ;
- void MakeRecParticles(void ) ;
- // Relative Distance CPV-EMC
- Float_t GetDistance(AliPHOSEmcRecPoint * emc, AliPHOSRecPoint * cpv, Option_t * Axis)const ;
- Int_t GetPrincipalSign(Double_t* P, Int_t ell, Int_t eff_pur)const ; //Principal cut
- TVector3 GetMomentumDirection(AliPHOSEmcRecPoint * emc, AliPHOSRecPoint * cpv)const ;
- void PrintRecParticles(Option_t * option) ;
- // Gives in wich cluster energy range is the event
- void GetClusterOption(const Float_t Cluster_En,const Bool_t range) ;
- // Gives the Efficiency-Purity point.
- Int_t GetEffPurOption(const TString Eff_Pur)const ;
- virtual void WriteRecParticles(Int_t event) ;
- void SetParameters() ; //Fills the matrix of parameters
- //Selects principal and parameters file in function of energy range.
- void GetAnalysisParameters(Float_t ClusterEn) ;
- Double_t CalibratedEnergy(Float_t e) ; //Calibrates energy.
-
-
- private:
-
- TString fFileName5 ; // File that contains the Principal file for analysis from 0.5 to 5 GeV
- TString fFileName100 ; // File that contains the Principal file for analysis from 0.5 to 100 GeV
- TString fFileNamePar5 ; // File that contains the parameters for analysis from 0.5 to 5 GeV
- TString fFileNamePar100 ;// File that contains the parameters for analysis from 0.5 to 100 GeV
+private:
-
- TString fFrom ; // name of Recpoints and TrackSegments
- TString fHeaderFileName ; // file name with event header
- TString fTrackSegmentsTitle; // branch name with track segments
- TString fRecPointsTitle ; // branch name with rec points
- TString fRecParticlesTitle ; // branch name with rec particles
-
- Int_t fNEvent ; //! current event number
- AliPHOSClusterizer * fClusterizer ; //! clusterizer
- AliPHOSTrackSegmentMaker * fTSMaker ; //! track segment maker
-
- TPrincipal * fPrincipal5 ; //! TPrincipal from fFileName5
- TPrincipal * fPrincipal100 ; //! TPrincipal from fFileName100
- TPrincipal * fPrincipal ; //! TPrincipal copy
- Double_t * fX ; //! Principal data
- Double_t * fP ; //! Principal eigenvalues
-
- Int_t fRecParticlesInRun ; //! Total number of recparticles in one run
-
- TMatrixD * fParameters5 ; //! Matrix of identification Parameters 0.5 to 5 GeV
- TMatrixD * fParameters100 ; //! Matrix of identification Parameters 5-100 GeV
- TMatrixD * fParameters; //! Matrix copy of identification Parameters
-
- Int_t fCluster; // Cluster energy range to choose parameters
- Int_t fClusterrcpv; // Cluster energy range to choos rcpv parameters
- Int_t fMatrixExtraRow; // Different size of the parameters file. Depends on range
-
- Float_t fACalParameter ;// A parameter energy calibration Encal=A+B*En+C*En^2
- Float_t fBCalParameter ;// B parameter energy calibration Encal=A+B*En+C*En^2
- Float_t fCCalParameter ;// B parameter energy calibration Encal=A+B*En+C*En^2
-
- ClassDef( AliPHOSPIDv1,4) // Particle identifier implementation version 1
+ virtual void InitParameters() ;
+ void MakeRecParticles(void ) ;
+ void MakePID(void) ;
+
+ //Functions to calculate the PID probability
+ // Double_t ChargedHadronDistProb(Double_t x, Double_t y, Double_t * parg, Double_t * parl) ;
+ Double_t GausF (Double_t x, Double_t y, Double_t *par) ; //gaussian probability, parameter dependence a+b/(x*x)+c/x
+ Double_t GausPol2(Double_t x, Double_t y, Double_t *par) ; //gaussian probability, parameter dependence a+b*x+c*x*x
+ Double_t LandauF(Double_t x, Double_t y, Double_t *par) ; //gaussian probability, parameter dependence a+b/(x*x)+c/x
+ Double_t LandauPol2(Double_t x, Double_t y, Double_t *par) ; //gaussian probability, parameter dependence a+b*x+c*x*x
+ // Relative Distance CPV-EMC
+ Int_t GetCPVBit (AliPHOSTrackSegment * ts, Int_t EffPur, Float_t e) const;
+ Int_t GetPrincipalBit (TString particle, const Double_t* P, Int_t EffPur, Float_t e)const ; //Principal cut
+ Int_t GetHardPhotonBit(AliPHOSEmcRecPoint * emc) const;
+ Int_t GetHardPi0Bit (AliPHOSEmcRecPoint * emc) const;
+ TVector3 GetMomentumDirection(AliPHOSEmcRecPoint * emc, AliPHOSCpvRecPoint * cpv)const ;
+ void PrintRecParticles(Option_t * option) ;
+ void SetParameters() ; //Fills the matrix of parameters
+
+ //PID population
+ void SetInitPID(const Double_t * pid) ;
+ void GetInitPID(Double_t * pid) const ;
+
+private:
+ Bool_t fBayesian ; // Do PID bayesian
+ Bool_t fDefaultInit; //! kTRUE if the task was created by defaut ctor (only parameters are initialized)
+ Bool_t fWrite ; //! To write result to file
+ TString fFileNamePrincipalPhoton ; // File name of the photon principals
+ TString fFileNamePrincipalPi0 ; // File name of the pi0 principals
+ TString fFileNameParameters ; // File name with PID parameters
+ TPrincipal *fPrincipalPhoton ; //! TPrincipal from photon pca file
+ TPrincipal *fPrincipalPi0 ; //! TPrincipal from pi0 pca file
+ Double_t *fX ; //! Shower shape for the principal data
+ Double_t *fPPhoton ; //! Principal photon eigenvalues
+ Double_t *fPPi0 ; //! Principal pi0 eigenvalues
+ TMatrixF *fParameters; //! Matrix of identification Parameters
+
+ TVector3 fVtx ; //! Vertex position in current event
+
+ //Initial pid population
+ Double_t fInitPID[AliPID::kSPECIESCN] ; // Initial population to do bayesian PID
+ // pid probability function parameters
+ // ToF
+ Double_t fTphoton[3] ; // gaussian tof response for photon
+ TFormula * fTFphoton ; // the formula
+ Double_t fTpiong[3] ; // gaussian tof response for pions
+ TFormula * fTFpiong ; // the formula
+ Double_t fTkaong[3] ; // landau tof response for kaons
+ TFormula * fTFkaong ; // the formula
+ Double_t fTkaonl[3] ; // landau tof response for kaons
+ TFormula * fTFkaonl ; // the formula
+ Double_t fThhadrong[3] ; // gaus tof response for heavy hadrons
+ TFormula * fTFhhadrong ; // the formula
+ Double_t fThhadronl[3] ; // landau tof response for heavy hadrons
+ TFormula * fTFhhadronl ; // the formula
+
+ //Shower dispersion
+ Double_t fDmuon[3] ; // gaussian ss response for muon
+ TFormula * fDFmuon ; // the formula
+ Double_t fDphoton[10] ; // gaussian ss response for EM
+ Double_t fDpi0[10] ; // gaussian ss response for pi0
+ Double_t fDhadron[10] ; // gaussian ss response for hadrons
+
+ Double_t fXelectron[10] ; // gaussian emc-cpv distance response for electron
+ Double_t fXcharged[10] ; // landau emc-cpv distance response for charged part (no elect) */
+ Double_t fZelectron[10] ; // gaussian emc-cpv distance response for electron
+ Double_t fZcharged[10] ; // landau emc-cpv distance response for charged part (no elect) */
+
+
+ Double_t fERecWeightPar[4] ; // gaussian tof response for photon
+ TFormula * fERecWeight ; // the formula
+ Double_t fChargedNeutralThreshold ; //Threshold to differentiate between charged and neutral
+ Float_t fTOFEnThreshold; //Maximum energy to use TOF
+ Float_t fDispEnThreshold; //Minimum energy to use shower shape
+ Int_t fDispMultThreshold ; //Minimum multiplicity to use shower shape
+
+ ClassDef( AliPHOSPIDv1,13) // Particle identifier implementation version 1
};