Added AliRsnAction, fix for AliRsnPIDRange, lego_train macros updated
[u/mrichter/AliRoot.git] / PWGLF / RESONANCES / AliRsnCutPIDNSigma.h
1 #ifndef ALIRSNCUTPIDNSIGMA_H
2 #define ALIRSNCUTPIDNSIGMA_H
3
4 //
5 // Class for n-sigma PID cuts.
6 // ---
7 // Requires:
8 //
9 // 1) the used detector, chosen from an enumeration
10 // 2) the reference charged particle species, chosen from AliPID enumeration
11 // 3) a momentum range: outside it, the cut is never passed
12 //
13
14 #include <TMath.h>
15 #include <TClonesArray.h>
16
17 #include "AliPID.h"
18 #include "AliESDtrack.h"
19
20 #include "AliRsnCut.h"
21 #include "AliRsnPIDRange.h"
22
23 class AliVTrack;
24 class AliPIDResponse;
25
26 class AliRsnCutPIDNSigma : public AliRsnCut {
27 public:
28
29    enum EDetector {
30       kITS,
31       kTPC,
32       kTOF,
33       kDetectors
34    };
35    AliRsnCutPIDNSigma();
36    AliRsnCutPIDNSigma(const char *name, AliPID::EParticleType species, EDetector det);
37    AliRsnCutPIDNSigma(const AliRsnCutPIDNSigma &copy);
38    AliRsnCutPIDNSigma &operator=(const AliRsnCutPIDNSigma &copy);
39    virtual ~AliRsnCutPIDNSigma() { }
40
41    void             SetSpecies(AliPID::EParticleType type)        {fSpecies = type;}
42    void             SetDetector(EDetector det)                    {fDetector = det;}
43    void             SetRejectUnmatched(Bool_t yn = kTRUE)         {fRejectUnmatched = yn;}
44
45    AliPIDResponse  *MyPID()                                       {return fMyPID;}
46    void             InitMyPID(Bool_t isMC, Bool_t isESD);
47
48    void             SinglePIDRange(Double_t nsigma);
49    void             AddPIDRange(Double_t nsigma, Double_t pmin = 0.0, Double_t pmax = 1E20);
50
51    Bool_t           MatchITS(const AliVTrack *vtrack) const;
52    Bool_t           MatchTPC(const AliVTrack *vtrack) const;
53    Bool_t           MatchTOF(const AliVTrack *vtrack) const;
54    Bool_t           MatchDetector(const AliVTrack *vtrack) const;
55
56    virtual Bool_t   IsSelected(TObject *object);
57    virtual void     Print(const Option_t *option = "") const;
58
59 private:
60
61    AliPID::EParticleType   fSpecies;         //  particle species
62    EDetector               fDetector;        //  detector used for PID
63    Bool_t                  fRejectUnmatched; //  tracks not matched to this detector do pass the cut?
64    Double_t                fTrackNSigma;     //! tmp track number of sigmas w.r. to chosen detector
65    Double_t                fTrackMom;        //! track reference momentum
66    AliPIDResponse         *fMyPID;           //  PID response object to be configured manyally
67    TClonesArray            fRanges;          //  collection of ranges
68
69    ClassDef(AliRsnCutPIDNSigma, 1)
70 };
71
72 inline Bool_t AliRsnCutPIDNSigma::MatchITS(const AliVTrack *vtrack) const
73 {
74 //
75 // Checks if the track has the status flags required for an ITS standalone track
76 //
77
78    if ((vtrack->GetStatus() & AliESDtrack::kITSin)  == 0) return kFALSE;
79    if ((vtrack->GetStatus() & AliESDtrack::kITSpid) == 0) return kFALSE;
80
81    return kTRUE;
82 }
83
84 inline Bool_t AliRsnCutPIDNSigma::MatchTPC(const AliVTrack *vtrack) const
85 {
86 //
87 // Checks if the track has the status flags required for a TPC track
88 //
89
90    if ((vtrack->GetStatus() & AliESDtrack::kTPCin) == 0) return kFALSE;
91
92    return kTRUE;
93 }
94
95 inline Bool_t AliRsnCutPIDNSigma::MatchTOF(const AliVTrack *vtrack) const
96 {
97 //
98 // Checks if the track has the status flags required for an ITS standalone track
99 //
100
101    if ((vtrack->GetStatus() & AliESDtrack::kTOFout) == 0) return kFALSE;
102    if ((vtrack->GetStatus() & AliESDtrack::kTIME)   == 0) return kFALSE;
103
104    return kTRUE;
105 }
106
107 inline Bool_t AliRsnCutPIDNSigma::MatchDetector(const AliVTrack *vtrack) const
108 {
109 //
110 // Checks if the track has matched the required detector.
111 // If no valid detector is specified, kFALSE is always returned.
112 //
113
114    switch (fDetector) {
115       case kITS: return MatchITS(vtrack);
116       case kTPC: return MatchTPC(vtrack);
117       case kTOF: return MatchTOF(vtrack);
118       default  : return kFALSE;
119    }
120 }
121
122 inline void AliRsnCutPIDNSigma::AddPIDRange(Double_t nsigma, Double_t pmin, Double_t pmax)
123 {
124 //
125 // Add a new slot for checking PID
126 //
127
128    Int_t n = fRanges.GetEntries();
129
130    new (fRanges[n]) AliRsnPIDRange(nsigma, pmin, pmax);
131 }
132
133 inline void AliRsnCutPIDNSigma::SinglePIDRange(Double_t nsigma)
134 {
135 //
136 // Clear all slots and sets a unique one
137 //
138
139    fRanges.Delete();
140
141    new (fRanges[0]) AliRsnPIDRange(nsigma, 0.0, 1E20);
142 }
143
144 #endif