]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG2/RESONANCES/AliRsnCutPIDNSigma.cxx
Re-enable trigger calculation removing STU OCDB access. Improve simulation (L0 time...
[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
64129b35 28//_________________________________________________________________________________________________
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
c865cb1d 44//_________________________________________________________________________________________________
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);
86
87 fSpecies = copy.fSpecies;
88 fDetector = copy.fDetector;
64129b35 89 fRejectUnmatched = copy.fRejectUnmatched;
b6ab153d 90 fMyPID = copy.fMyPID;
91 fRanges = copy.fRanges;
c865cb1d 92
93 return (*this);
94}
95
b6ab153d 96//__________________________________________________________________________________________________
97void AliRsnCutPIDNSigma::InitMyPID(Bool_t isMC, Bool_t isESD)
98{
99//
100// Initialize manual PID object
101//
102
103 if (isESD)
104 fMyPID = new AliESDpid(isMC);
105 else
106 fMyPID = new AliAODpidUtil(isMC);
107}
108
c865cb1d 109//_________________________________________________________________________________________________
110Bool_t AliRsnCutPIDNSigma::IsSelected(TObject *object)
111{
112//
113// Cut checker.
b6ab153d 114// As usual, there are 'kFALSE' exit points whenever one of the conditions is not passed,
115// and at the end, it returns kTRUE since it bypassed all possible exit points.
c865cb1d 116//
117
118 // coherence check
119 if (!TargetOK(object)) return kFALSE;
120
121 // check initialization of PID object
b6ab153d 122 // if manual PID is used, use that, otherwise get from source event
123 AliPIDResponse *pid = 0x0;
124 if (fMyPID)
125 pid = fMyPID;
126 else
127 pid = fEvent->GetPIDResponse();
c865cb1d 128 if (!pid) {
129 AliFatal("NULL PID response");
130 return kFALSE;
131 }
132
b6ab153d 133 // convert input object into AliVTrack
134 // if this fails, the cut cannot be checked
64129b35 135 AliVTrack *vtrack = fDaughter->Ref2Vtrack();
136 if (!vtrack) {
c865cb1d 137 AliDebugClass(2, "Referenced daughter is not a track");
138 return kFALSE;
139 }
b6ab153d 140
141 // check matching, if required
142 // a) if detector is not matched and matching is required, reject the track
143 // b) if detector is not matched and matching is not required, accept blindly the track
144 // since missing the matching causes one not to be able to rely that detector
145 if (!MatchDetector(vtrack)) {
146 AliDebugClass(2, Form("Detector not matched. fRejectUnmatched = %s --> track is %s", (fRejectUnmatched ? "true" : "false"), (fRejectUnmatched ? "rejected" : "accepted")));
147 return (!fRejectUnmatched);
c865cb1d 148 }
149
b6ab153d 150 // get reference momentum
151 fTrackMom = (fDetector == kTPC) ? vtrack->GetTPCmomentum() : vtrack->P();
152
153 // get number of sigmas
c865cb1d 154 switch (fDetector) {
155 case kITS:
b6ab153d 156 fTrackNSigma = TMath::Abs(pid->NumberOfSigmasITS(vtrack, fSpecies));
c865cb1d 157 break;
158 case kTPC:
b6ab153d 159 fTrackNSigma = TMath::Abs(pid->NumberOfSigmasTPC(vtrack, fSpecies));
c865cb1d 160 break;
161 case kTOF:
b6ab153d 162 fTrackNSigma = TMath::Abs(pid->NumberOfSigmasTOF(vtrack, fSpecies));
c865cb1d 163 break;
164 default:
64129b35 165 AliError("Bad detector chosen. Rejecting track");
c865cb1d 166 return kFALSE;
167 }
168
b6ab153d 169 // loop on all ranges, and use the one which contains this momentum
170 // if none is found, the cut is not passed
171 Bool_t accept = kFALSE;
172 Int_t i, goodRange = -1, nRanges = fRanges.GetEntriesFast();
173 for (i = 0; i < nRanges; i++) {
174 AliRsnPIDRange *range = (AliRsnPIDRange*)fRanges[i];
175 if (!range) continue;
176 if (!range->IsInRange(fTrackMom)) continue;
177 else {
178 goodRange = i;
179 accept = range->CutPass(fTrackNSigma);
180 AliDebugClass(2, Form("[%s] NSigma = %.3f, max = %.3f, track %s", GetName(), fTrackNSigma, range->NSigmaCut(), (accept ? "accepted" : "rejected")));
181 break;
182 }
183 }
184 if (goodRange < 0) {
185 AliDebugClass(2, Form("[%s] No good range found. Rejecting track", GetName()));
64129b35 186 return kFALSE;
187 } else {
b6ab153d 188 AliDebugClass(2, Form("[%s] Mom = %.3f, good range found (#%d), track was %s", GetName(), fTrackMom, goodRange, (accept ? "accepted" : "rejected")));
189 return accept;
64129b35 190 }
c865cb1d 191}
192
193//_________________________________________________________________________________________________
194void AliRsnCutPIDNSigma::Print(const Option_t *) const
195{
196//
197// Print information on this cut
198//
199
4f926d1d 200 Char_t mom[200], det[100], match[200];
c865cb1d 201
202 if (fRejectUnmatched)
e187bd70 203 snprintf(match, 200, "Unmatched tracks are rejected");
c865cb1d 204 else
e187bd70 205 snprintf(match, 200, "No check on track matching");
c865cb1d 206
207 switch (fDetector) {
4f926d1d 208 case kITS: snprintf(det, 3, "ITS"); break;
209 case kTPC: snprintf(det, 3, "TPC"); break;
210 case kTOF: snprintf(det, 3, "TOF"); break;
211 default : snprintf(det, 3, "undefined");
c865cb1d 212 }
213
214 AliInfo(Form("Cut name : %s", GetName()));
215 AliInfo(Form("--> PID detector : %s", det));
216 AliInfo(Form("--> match criteria: %s", match));
217 AliInfo(Form("--> momentum range: %s", mom));
218}