First version of macros for lego_train
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnCutPIDNSigma.cxx
CommitLineData
c865cb1d 1//
2// Class AliRsnCutPIDNSigma
3//
4// General implementation of a single cut strategy, which can be:
5// - a value contained in a given interval [--> IsBetween() ]
6// - a value equal to a given reference [--> MatchesValue()]
7//
8// In all cases, the reference value(s) is (are) given as data members
9// and each kind of cut requires a given value type (Int, UInt, Double),
10// but the cut check procedure is then automatized and chosen thanks to
11// an enumeration of the implemented cut types.
12// At the end, the user (or any other point which uses this object) has
13// to use the method IsSelected() to check if this cut has been passed.
14//
15// authors: Martin Vala (martin.vala@cern.ch)
16// Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
17//
18
19#include "AliPIDResponse.h"
b6ab153d 20#include "AliESDpid.h"
21#include "AliAODpidUtil.h"
c865cb1d 22
23#include "AliRsnCutPIDNSigma.h"
24
b6ab153d 25ClassImp(AliRsnCutPIDNSigma::AliRsnPIDRange)
c31027eb 26ClassImp(AliRsnCutPIDNSigma)
c865cb1d 27
28//_________________________________________________________________________________________________
64129b35 29AliRsnCutPIDNSigma::AliRsnCutPIDNSigma() :
30 AliRsnCut("cut", AliRsnTarget::kDaughter),
31 fSpecies(AliPID::kUnknown),
32 fDetector(kDetectors),
33 fRejectUnmatched(kFALSE),
b6ab153d 34 fTrackNSigma(0.0),
35 fTrackMom(0.0),
36 fMyPID(0x0),
37 fRanges("AliRsnCutPIDNSigma::AliRsnPIDRange", 0)
64129b35 38{
39//
40// Main constructor.
41//
42}
43
44//_________________________________________________________________________________________________
c865cb1d 45AliRsnCutPIDNSigma::AliRsnCutPIDNSigma
b6ab153d 46(const char *name, AliPID::EParticleType species, EDetector det) :
64129b35 47 AliRsnCut(name, AliRsnTarget::kDaughter),
c865cb1d 48 fSpecies(species),
49 fDetector(det),
64129b35 50 fRejectUnmatched(kFALSE),
b6ab153d 51 fTrackNSigma(0.0),
52 fTrackMom(0.0),
53 fMyPID(0x0),
54 fRanges("AliRsnCutPIDNSigma::AliRsnPIDRange", 0)
c865cb1d 55{
56//
57// Main constructor.
58//
59}
60
61//_________________________________________________________________________________________________
62AliRsnCutPIDNSigma::AliRsnCutPIDNSigma
63(const AliRsnCutPIDNSigma& copy) :
64 AliRsnCut(copy),
65 fSpecies(copy.fSpecies),
66 fDetector(copy.fDetector),
64129b35 67 fRejectUnmatched(copy.fRejectUnmatched),
b6ab153d 68 fTrackNSigma(0.0),
69 fTrackMom(0.0),
70 fMyPID(copy.fMyPID),
71 fRanges(copy.fRanges)
c865cb1d 72{
73//
74// Copy constructor.
75//
76}
77
78//_________________________________________________________________________________________________
79AliRsnCutPIDNSigma& AliRsnCutPIDNSigma::operator=(const AliRsnCutPIDNSigma& copy)
80{
81//
82// Assignment operator
83//
84
85 AliRsnCut::operator=(copy);
e6f3a909 86 if (this == &copy)
87 return *this;
c865cb1d 88 fSpecies = copy.fSpecies;
89 fDetector = copy.fDetector;
64129b35 90 fRejectUnmatched = copy.fRejectUnmatched;
b6ab153d 91 fMyPID = copy.fMyPID;
92 fRanges = copy.fRanges;
c865cb1d 93
94 return (*this);
95}
96
b6ab153d 97//__________________________________________________________________________________________________
98void AliRsnCutPIDNSigma::InitMyPID(Bool_t isMC, Bool_t isESD)
99{
100//
101// Initialize manual PID object
102//
103
104 if (isESD)
105 fMyPID = new AliESDpid(isMC);
106 else
107 fMyPID = new AliAODpidUtil(isMC);
108}
109
c865cb1d 110//_________________________________________________________________________________________________
111Bool_t AliRsnCutPIDNSigma::IsSelected(TObject *object)
112{
113//
114// Cut checker.
b6ab153d 115// As usual, there are 'kFALSE' exit points whenever one of the conditions is not passed,
116// and at the end, it returns kTRUE since it bypassed all possible exit points.
c865cb1d 117//
118
119 // coherence check
120 if (!TargetOK(object)) return kFALSE;
121
122 // check initialization of PID object
b6ab153d 123 // if manual PID is used, use that, otherwise get from source event
124 AliPIDResponse *pid = 0x0;
125 if (fMyPID)
126 pid = fMyPID;
127 else
128 pid = fEvent->GetPIDResponse();
c865cb1d 129 if (!pid) {
130 AliFatal("NULL PID response");
131 return kFALSE;
132 }
133
b6ab153d 134 // convert input object into AliVTrack
135 // if this fails, the cut cannot be checked
64129b35 136 AliVTrack *vtrack = fDaughter->Ref2Vtrack();
137 if (!vtrack) {
c865cb1d 138 AliDebugClass(2, "Referenced daughter is not a track");
139 return kFALSE;
140 }
b6ab153d 141
142 // check matching, if required
143 // a) if detector is not matched and matching is required, reject the track
144 // b) if detector is not matched and matching is not required, accept blindly the track
145 // since missing the matching causes one not to be able to rely that detector
146 if (!MatchDetector(vtrack)) {
147 AliDebugClass(2, Form("Detector not matched. fRejectUnmatched = %s --> track is %s", (fRejectUnmatched ? "true" : "false"), (fRejectUnmatched ? "rejected" : "accepted")));
148 return (!fRejectUnmatched);
c865cb1d 149 }
150
b6ab153d 151 // get reference momentum
152 fTrackMom = (fDetector == kTPC) ? vtrack->GetTPCmomentum() : vtrack->P();
153
154 // get number of sigmas
c865cb1d 155 switch (fDetector) {
156 case kITS:
b6ab153d 157 fTrackNSigma = TMath::Abs(pid->NumberOfSigmasITS(vtrack, fSpecies));
c865cb1d 158 break;
159 case kTPC:
b6ab153d 160 fTrackNSigma = TMath::Abs(pid->NumberOfSigmasTPC(vtrack, fSpecies));
c865cb1d 161 break;
162 case kTOF:
b6ab153d 163 fTrackNSigma = TMath::Abs(pid->NumberOfSigmasTOF(vtrack, fSpecies));
c865cb1d 164 break;
165 default:
64129b35 166 AliError("Bad detector chosen. Rejecting track");
c865cb1d 167 return kFALSE;
168 }
169
b6ab153d 170 // loop on all ranges, and use the one which contains this momentum
171 // if none is found, the cut is not passed
172 Bool_t accept = kFALSE;
173 Int_t i, goodRange = -1, nRanges = fRanges.GetEntriesFast();
174 for (i = 0; i < nRanges; i++) {
175 AliRsnPIDRange *range = (AliRsnPIDRange*)fRanges[i];
176 if (!range) continue;
177 if (!range->IsInRange(fTrackMom)) continue;
178 else {
179 goodRange = i;
180 accept = range->CutPass(fTrackNSigma);
181 AliDebugClass(2, Form("[%s] NSigma = %.3f, max = %.3f, track %s", GetName(), fTrackNSigma, range->NSigmaCut(), (accept ? "accepted" : "rejected")));
182 break;
183 }
184 }
185 if (goodRange < 0) {
186 AliDebugClass(2, Form("[%s] No good range found. Rejecting track", GetName()));
64129b35 187 return kFALSE;
188 } else {
b6ab153d 189 AliDebugClass(2, Form("[%s] Mom = %.3f, good range found (#%d), track was %s", GetName(), fTrackMom, goodRange, (accept ? "accepted" : "rejected")));
190 return accept;
64129b35 191 }
c865cb1d 192}
193
194//_________________________________________________________________________________________________
195void AliRsnCutPIDNSigma::Print(const Option_t *) const
196{
197//
198// Print information on this cut
199//
200
4f926d1d 201 Char_t mom[200], det[100], match[200];
c865cb1d 202
203 if (fRejectUnmatched)
e187bd70 204 snprintf(match, 200, "Unmatched tracks are rejected");
c865cb1d 205 else
e187bd70 206 snprintf(match, 200, "No check on track matching");
c865cb1d 207
208 switch (fDetector) {
4f926d1d 209 case kITS: snprintf(det, 3, "ITS"); break;
210 case kTPC: snprintf(det, 3, "TPC"); break;
211 case kTOF: snprintf(det, 3, "TOF"); break;
212 default : snprintf(det, 3, "undefined");
c865cb1d 213 }
214
215 AliInfo(Form("Cut name : %s", GetName()));
216 AliInfo(Form("--> PID detector : %s", det));
217 AliInfo(Form("--> match criteria: %s", match));
218 AliInfo(Form("--> momentum range: %s", mom));
219}