2 // Class AliRsnCutAOD2010
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()]
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.
15 // authors: Martin Vala (martin.vala@cern.ch)
16 // Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
19 #include <Riostream.h>
23 #include "AliESDtrack.h"
24 #include "AliAODTrack.h"
26 #include "AliRsnEvent.h"
27 #include "AliRsnDaughter.h"
28 #include "AliRsnCutAOD2010.h"
30 ClassImp(AliRsnCutAOD2010)
33 //_________________________________________________________________________________________________
34 AliRsnCutAOD2010::AliRsnCutAOD2010(const char *name, Bool_t isMC) :
35 AliRsnCut(name, AliRsnCut::kDaughter, 0.0, 0.0),
46 fPIDtype(AliPID::kKaon),
50 fTPCmaxNSigmaDCA(7.0),
57 fITSmaxNSigmaDCA(7.0),
66 // Default constructor.
67 // Sets all parameters to the currently used values, and requires
68 // to know if we are running on data or MonteCarlo to set some others.
71 fTPCparamDCA[0] = 0.0050;
72 fTPCparamDCA[1] = 0.0070;
73 fTPCparamDCA[2] = 1.0000;
75 fITSparamDCA[0] = 0.0085;
76 fITSparamDCA[1] = 0.0026;
77 fITSparamDCA[2] = 1.5500;
82 //_________________________________________________________________________________________________
83 AliRsnCutAOD2010::AliRsnCutAOD2010
84 (const AliRsnCutAOD2010& copy) :
88 fCheckITS(copy.fCheckITS),
89 fCheckTPC(copy.fCheckTPC),
90 fCheckTOF(copy.fCheckTOF),
91 fUseGlobal(copy.fUseGlobal),
92 fUseITSSA(copy.fUseITSSA),
94 fMaxEta(copy.fMaxEta),
96 fPIDtype(copy.fPIDtype),
98 fTPCminNclusters(copy.fTPCminNclusters),
99 fTPCmaxChi2(copy.fTPCmaxChi2),
100 fTPCmaxNSigmaDCA(copy.fTPCmaxNSigmaDCA),
101 fTPClowBand(copy.fTPClowBand),
102 fTPChighBand(copy.fTPChighBand),
103 fTPClowLimit(copy.fTPClowLimit),
105 fITSminNclusters(copy.fITSminNclusters),
106 fITSmaxChi2(copy.fITSmaxChi2),
107 fITSmaxNSigmaDCA(copy.fITSmaxNSigmaDCA),
108 fITSband(copy.fITSband),
110 fTOFlowLimit(copy.fTOFlowLimit),
111 fTOFhighLimit(copy.fTOFhighLimit),
120 for (i = 0; i < 3; i++)
122 fTPCparamDCA[i] = copy.fTPCparamDCA[i];
123 fITSparamDCA[i] = copy.fITSparamDCA[i];
127 //_________________________________________________________________________________________________
128 void AliRsnCutAOD2010::SetMC(Bool_t yn)
131 // Sets some parameters depending on MC or dataanalysis
138 AliDebug(AliLog::kDebug + 2, "Setting for MC");
139 fPID.GetTPCResponse().SetBetheBlochParameters(2.15898 / 50.0, 1.75295E1, 3.40030E-9, 1.96178, 3.91720);
143 AliDebug(AliLog::kDebug + 2, "Setting for DATA");
144 fPID.GetTPCResponse().SetBetheBlochParameters(1.41543 / 50.0, 2.63394E1, 5.0411E-11, 2.12543, 4.88663);
147 AliITSPIDResponse itsrsp(fIsMC);
148 fPID.GetITSResponse() = itsrsp;
151 //_________________________________________________________________________________________________
152 Bool_t AliRsnCutAOD2010::IsSelected(TObject *object)
158 // coherence check: require an AOD track
159 AliRsnDaughter *daughter = dynamic_cast<AliRsnDaughter*>(object);
160 if (!daughter) return kFALSE;
161 AliAODTrack *track = daughter->GetRefAODtrack();
162 if (!track) return kFALSE;
164 // step #0: check presence of an SPD cluster
165 Int_t nITS = 0, nSPD = 0;
166 nSPD = TESTBIT(track->GetITSClusterMap(), 0);
167 nSPD += TESTBIT(track->GetITSClusterMap(), 1);
168 nITS = track->GetITSNcls() - nSPD;
171 AliDebug(AliLog::kDebug + 2, "No SPD clusters in this track. Rejected");
175 // step #1: check status flags and reject track if it does not match any possibility
177 if (!track->IsOn(AliESDtrack::kTPCin) && track->IsOn(AliESDtrack::kITSrefit) && (!track->IsOn(AliESDtrack::kITSpureSA)))
183 AliDebug(AliLog::kDebug + 2, "ITS standalone not used. Rejected");
187 else if (track->IsOn(AliESDtrack::kTPCin) && track->IsOn(AliESDtrack::kTPCrefit) && track->IsOn(AliESDtrack::kITSrefit))
192 AliDebug(AliLog::kDebug + 2, "ITS standalone not used. Rejected");
195 if (track->IsOn(AliESDtrack::kTOFout) && track->IsOn(AliESDtrack::kTIME))
202 AliDebug(AliLog::kDebug + 2, "Track is not either a TPC track or a ITS standalone. Rejected");
206 // step #2: check number of clusters
209 if (track->GetTPCNcls() < fTPCminNclusters)
211 AliDebug(AliLog::kDebug + 2, "Too few clusters. Rejected");
217 if (track->GetITSNcls() < fITSminNclusters)
219 AliDebug(AliLog::kDebug + 2, "Too few clusters. Rejected");
224 // step #3: check chi square
227 if (track->Chi2perNDF() > fTPCmaxChi2)
229 AliDebug(AliLog::kDebug + 2, "Bad chi2. Rejected");
235 if (track->Chi2perNDF() > fITSmaxChi2)
237 AliDebug(AliLog::kDebug + 2, "Bad chi2. Rejected");
242 // step #4: reject kink daughters
243 AliAODVertex *vertex = track->GetProdVertex();
244 if (isTPC && vertex != 0x0)
246 if (vertex->GetType() == AliAODVertex::kKink)
248 AliDebug(AliLog::kDebug + 2, "Kink daughter. Rejected");
253 // step #5: DCA cut (transverse)
254 Double_t dz[2], cov[3], sigmaDCA = 0.0, nsigma = 0.0;
255 vertex = AliRsnTarget::GetCurrentEvent()->GetRefAOD()->GetPrimaryVertex();
258 AliDebug(AliLog::kDebug + 2, "NULL vertex");
261 if (!track->PropagateToDCA(vertex, AliRsnTarget::GetCurrentEvent()->GetRefAOD()->GetMagneticField(), kVeryBig, dz, cov))
263 AliDebug(AliLog::kDebug + 2, "Failed propagation to vertex");
266 // compute the pt-dependent sigma
269 sigmaDCA = fTPCparamDCA[0] + fTPCparamDCA[1] / TMath::Power(track->Pt(), fTPCparamDCA[2]);
270 nsigma = fTPCmaxNSigmaDCA;
274 sigmaDCA = fITSparamDCA[0] + fITSparamDCA[1] / TMath::Power(track->Pt(), fITSparamDCA[2]);
275 nsigma = fITSmaxNSigmaDCA;
278 if (dz[0] > nsigma * sigmaDCA)
280 AliDebug(AliLog::kDebug + 2, "Excceeded cut in DCA. Rejected");
284 // step #6: check eta range
285 if (TMath::Abs(track->Eta()) >= fMaxEta)
287 AliDebug(AliLog::kDebug + 2, "Outside ETA acceptance");
296 AliAODPid *pidObj = track->GetDetPid();
297 Double_t mom = pidObj->GetTPCmomentum();
298 Double_t nsigmaTPC = fPID.NumberOfSigmasTPC(track, fPIDtype);
299 Double_t bandTPC = fTPChighBand;
300 if (mom <= fTPClowLimit) bandTPC = fTPClowBand;
301 if (TMath::Abs(nsigmaTPC) > bandTPC)
303 AliDebug(AliLog::kDebug + 2, "Bad TPC PID. Rejected");
308 AliDebug(AliLog::kDebug + 2, "Good TPC PID");
309 if (fCheckTOF && isTOF)
311 Double_t nsigmaTOF = (Double_t)fPID.NumberOfSigmasTOF(track, fPIDtype);
312 if (nsigmaTOF < fTOFlowLimit || nsigmaTOF > fTOFhighLimit)
314 AliDebug(AliLog::kDebug + 2, "Bad TOF PID. Rejected");
319 AliDebug(AliLog::kDebug + 2, "Good TOF PID. Accepted");
325 AliDebug(AliLog::kDebug + 2, "TOF not checked. Accepted");
332 if (fCheckTOF && isTOF)
334 Double_t nsigmaTOF = (Double_t)fPID.NumberOfSigmasTOF(track, fPIDtype);
335 if (nsigmaTOF < fTOFlowLimit || nsigmaTOF > fTOFhighLimit)
337 AliDebug(AliLog::kDebug + 2, "Bad TOF PID. Rejected");
342 AliDebug(AliLog::kDebug + 2, "Good TOF PID. Accepted");
348 AliDebug(AliLog::kDebug + 2, "No PID checked. Accepted");
357 if (nITS < 3 || !track->IsOn(AliESDtrack::kITSpid)) return kFALSE;
358 Double_t nsigmaITS = (Double_t)fPID.NumberOfSigmasITS(track, fPIDtype);
359 if (TMath::Abs(nsigmaITS) > fITSband)
361 AliDebug(AliLog::kDebug + 2, "Bad ITS PID. Rejected");
366 AliDebug(AliLog::kDebug + 2, "Good ITS PID. Accepted");
372 AliDebug(AliLog::kDebug + 2, "No PID checked. Accepted");