ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

//
// author : A. Mastroserio
//

#ifndef ALICFTRACKCUTPID_H
#define ALICFTRACKCUTPID_H

#include "AliCFCutBase.h"
#include "AliPID.h"
#include "AliESDtrack.h"
#include "AliAODTrack.h"
#include <TString.h>
#include <TObject.h>
#include <TH1F.h>
#include <TF1.h>
//__________________________________________________________________________________
// CUT ON TRACK PID
//__________________________________________________________________________________
class AliESDtrack;

class AliCFTrackCutPid : public AliCFCutBase
{
  public :
    AliCFTrackCutPid() ;
  AliCFTrackCutPid(const Char_t* name, const Char_t* title) ;
  AliCFTrackCutPid(const AliCFTrackCutPid& c) ;
  AliCFTrackCutPid& operator=(const AliCFTrackCutPid& c) ;
  
  virtual ~AliCFTrackCutPid();
  
  enum EDetType {kITS = 0, kTPC, kTRD,  kTOF, kHMPID=4, kNoDet=-11};
  enum EDetNum {kNdets=5};
  enum ENoId {kCheckProb = -10, kCheckResp = -11, kDetRestr = -12};
  
  // Setters 
  
  void SetDetectors(TString dets);                            
  void SetPriors(Double_t r[AliPID::kSPECIES]);                    
  void SetProbabilityCut(Double_t cut) {fCut=cut;}                  
  void SetParticleType(Int_t iType, Bool_t tocombine) {fgParticleType=iType; fgIsComb=tocombine;} 
  void SetMinDiffResp(Bool_t check, Double_t mindiff) {fCheckResponse=check; fMinDiffResponse=mindiff;}  
  void SetMinDiffProb(Bool_t check, Double_t mindiff) {fCheckSelection=check; fMinDiffProbability=mindiff;} 
  void SetPriorFunctions(TF1 *func[AliPID::kSPECIES]);
  void SetANDstatus(TString dets);
  void SetDetectorProbabilityRestriction(TString det, Int_t iPart, Double_t upperprob); 
  void SetHistogramAxis(Int_t nbins, Double_t xmin, Double_t xmax) {fNbins=nbins; fXmin = xmin; fXmax = xmax;}
  void SetAODmode(Bool_t isaod = kFALSE) {fgIsAOD=isaod;}  
  void SetProbThreshold(Double_t value) {fProbThreshold=value;}
 
  //returns the track identification number  
  Int_t GetID(ULong_t status[kNdets+1], Double_t pid[kNdets+1][AliPID::kSPECIES]) const;  
  //returns the track identification number in caso of an AliAODTrack
  Int_t GetAODID(AliAODTrack *aodtrack) const;
  
 
  //main 
  virtual Bool_t IsSelected(TObject *track); 
  Bool_t IsSelected(TList* /*list*/) {return kTRUE;}  
  //histos are added to a list
  void AddQAHistograms(TList *qalist);
  
  
 private:

  //loads the track detector responses and the track status
  void TrackInfo(const AliESDtrack *pTrk,ULong_t status[kNdets+1], Double_t pid[kNdets+1][AliPID::kSPECIES]) const;

  //identifies the track
  Int_t Identify(Double_t pid[AliPID::kSPECIES]) const;

  //identifies the track filling the QA histograms
  Int_t IdentifyQA(const Double_t pid[AliPID::kSPECIES],Int_t idets) const;

  void SetPPriors(AliESDtrack *pTrk);                          
  ULong_t StatusForAND(ULong_t status[kNdets+1]) const; 
  void InitialiseHisto();
  void DefineHistograms();                                 // histo booking  
  Bool_t Check(const Double_t *p, Int_t iPsel, Double_t minDiff) const;
  void CombPID(ULong_t status[kNdets+1],Double_t pid[kNdets+1][AliPID::kSPECIES],Double_t *combpid) const;
  
  Double_t fCut;                                            // probability cut
  Double_t fMinDiffResponse;                                // minimum difference between detector resposes
  Double_t fMinDiffProbability;                             // minimum difference between probability values
  Int_t fgParticleType;                                     // requested particle type
  Bool_t fgIsComb;                                          // flag for the combined pid
  Bool_t fgIsAOD;                                           // flag for AOD QA histograms
  Bool_t fCheckResponse;                                    // flag to check the minimum difference of det responsess
  Bool_t fCheckSelection;                                   // flag to check the minimum difference of probabilities
  Bool_t fIsPpriors;                                        // flag for momentum dependent priors
  Bool_t fIsDetAND;                                         // flag for AND with multiple detectors
  Double_t fXmin;                                           // x min QA histo
  Double_t fXmax;                                           // x max QA histo
  Int_t fNbins;                                             // n bins QA histo 
  Int_t fDetRestr;                                          // id of the detector for the restriction
  Int_t fiPartRestr;                                        // id of the particle for the restriction
  Double_t fDetProbRestr;                                   // probability restriction value
  Double_t fProbThreshold;                                  // if different from 0, the assigned PID will be set to 
                                                            // fgParticleType if the probability is larger than this threshold,
                                                            // regardless it is the highest or not (!)

  Double_t fPriors[AliPID::kSPECIES];                       // a priori concentrations
  TF1 *fPriorsFunc[AliPID::kSPECIES];                       // momentum dependent priors
  Bool_t fDets[kNdets];                                     // boolean(s) corresponding to the chosen detector(s) 
  Bool_t fDetsInAnd[kNdets];                                // detector to be in AND for the combined PID
  TH1F *fhResp[kNdets][AliPID::kSPECIES];                   // QA histo
  TH1F *fhProb[kNdets][AliPID::kSPECIES];                   // QA histo
  TH1F *fhCombResp[AliPID::kSPECIES];                       // QA histo
  TH1F *fhCombProb[AliPID::kSPECIES];                       // QA histo
  
  ClassDef(AliCFTrackCutPid,1);
};
#endif
    
 AliCFTrackCutPid.h:1
 AliCFTrackCutPid.h:2
 AliCFTrackCutPid.h:3
 AliCFTrackCutPid.h:4
 AliCFTrackCutPid.h:5
 AliCFTrackCutPid.h:6
 AliCFTrackCutPid.h:7
 AliCFTrackCutPid.h:8
 AliCFTrackCutPid.h:9
 AliCFTrackCutPid.h:10
 AliCFTrackCutPid.h:11
 AliCFTrackCutPid.h:12
 AliCFTrackCutPid.h:13
 AliCFTrackCutPid.h:14
 AliCFTrackCutPid.h:15
 AliCFTrackCutPid.h:16
 AliCFTrackCutPid.h:17
 AliCFTrackCutPid.h:18
 AliCFTrackCutPid.h:19
 AliCFTrackCutPid.h:20
 AliCFTrackCutPid.h:21
 AliCFTrackCutPid.h:22
 AliCFTrackCutPid.h:23
 AliCFTrackCutPid.h:24
 AliCFTrackCutPid.h:25
 AliCFTrackCutPid.h:26
 AliCFTrackCutPid.h:27
 AliCFTrackCutPid.h:28
 AliCFTrackCutPid.h:29
 AliCFTrackCutPid.h:30
 AliCFTrackCutPid.h:31
 AliCFTrackCutPid.h:32
 AliCFTrackCutPid.h:33
 AliCFTrackCutPid.h:34
 AliCFTrackCutPid.h:35
 AliCFTrackCutPid.h:36
 AliCFTrackCutPid.h:37
 AliCFTrackCutPid.h:38
 AliCFTrackCutPid.h:39
 AliCFTrackCutPid.h:40
 AliCFTrackCutPid.h:41
 AliCFTrackCutPid.h:42
 AliCFTrackCutPid.h:43
 AliCFTrackCutPid.h:44
 AliCFTrackCutPid.h:45
 AliCFTrackCutPid.h:46
 AliCFTrackCutPid.h:47
 AliCFTrackCutPid.h:48
 AliCFTrackCutPid.h:49
 AliCFTrackCutPid.h:50
 AliCFTrackCutPid.h:51
 AliCFTrackCutPid.h:52
 AliCFTrackCutPid.h:53
 AliCFTrackCutPid.h:54
 AliCFTrackCutPid.h:55
 AliCFTrackCutPid.h:56
 AliCFTrackCutPid.h:57
 AliCFTrackCutPid.h:58
 AliCFTrackCutPid.h:59
 AliCFTrackCutPid.h:60
 AliCFTrackCutPid.h:61
 AliCFTrackCutPid.h:62
 AliCFTrackCutPid.h:63
 AliCFTrackCutPid.h:64
 AliCFTrackCutPid.h:65
 AliCFTrackCutPid.h:66
 AliCFTrackCutPid.h:67
 AliCFTrackCutPid.h:68
 AliCFTrackCutPid.h:69
 AliCFTrackCutPid.h:70
 AliCFTrackCutPid.h:71
 AliCFTrackCutPid.h:72
 AliCFTrackCutPid.h:73
 AliCFTrackCutPid.h:74
 AliCFTrackCutPid.h:75
 AliCFTrackCutPid.h:76
 AliCFTrackCutPid.h:77
 AliCFTrackCutPid.h:78
 AliCFTrackCutPid.h:79
 AliCFTrackCutPid.h:80
 AliCFTrackCutPid.h:81
 AliCFTrackCutPid.h:82
 AliCFTrackCutPid.h:83
 AliCFTrackCutPid.h:84
 AliCFTrackCutPid.h:85
 AliCFTrackCutPid.h:86
 AliCFTrackCutPid.h:87
 AliCFTrackCutPid.h:88
 AliCFTrackCutPid.h:89
 AliCFTrackCutPid.h:90
 AliCFTrackCutPid.h:91
 AliCFTrackCutPid.h:92
 AliCFTrackCutPid.h:93
 AliCFTrackCutPid.h:94
 AliCFTrackCutPid.h:95
 AliCFTrackCutPid.h:96
 AliCFTrackCutPid.h:97
 AliCFTrackCutPid.h:98
 AliCFTrackCutPid.h:99
 AliCFTrackCutPid.h:100
 AliCFTrackCutPid.h:101
 AliCFTrackCutPid.h:102
 AliCFTrackCutPid.h:103
 AliCFTrackCutPid.h:104
 AliCFTrackCutPid.h:105
 AliCFTrackCutPid.h:106
 AliCFTrackCutPid.h:107
 AliCFTrackCutPid.h:108
 AliCFTrackCutPid.h:109
 AliCFTrackCutPid.h:110
 AliCFTrackCutPid.h:111
 AliCFTrackCutPid.h:112
 AliCFTrackCutPid.h:113
 AliCFTrackCutPid.h:114
 AliCFTrackCutPid.h:115
 AliCFTrackCutPid.h:116
 AliCFTrackCutPid.h:117
 AliCFTrackCutPid.h:118
 AliCFTrackCutPid.h:119
 AliCFTrackCutPid.h:120
 AliCFTrackCutPid.h:121
 AliCFTrackCutPid.h:122
 AliCFTrackCutPid.h:123
 AliCFTrackCutPid.h:124
 AliCFTrackCutPid.h:125
 AliCFTrackCutPid.h:126
 AliCFTrackCutPid.h:127
 AliCFTrackCutPid.h:128