]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG2/RESONANCES/AliRsnCutESD2010.cxx
In AliMUONGeometryModuleTransformer, AliMUONVGeometryBuilder:
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnCutESD2010.cxx
CommitLineData
2dab9030 1//
2// Class AliRsnCutESD2010
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 <Riostream.h>
20
21#include "AliESDpid.h"
22#include "AliTOFT0maker.h"
23#include "AliTOFcalib.h"
24#include "AliCDBManager.h"
25#include "AliITSPIDResponse.h"
26
27#include "AliRsnEvent.h"
28#include "AliRsnDaughter.h"
29#include "AliRsnCutESD2010.h"
30
31ClassImp(AliRsnCutESD2010)
32
33//_________________________________________________________________________________________________
34AliRsnCutESD2010::AliRsnCutESD2010() :
35 AliRsnCut(AliRsnCut::kDaughter),
36 fIsMC(kFALSE),
37 fCheckITS(kTRUE),
38 fCheckTPC(kTRUE),
39 fCheckTOF(kTRUE),
35765294 40 fUseGlobal(kTRUE),
41 fUseITSSA(kTRUE),
2dab9030 42 fMaxITSband(1E6),
43 fTPCpLimit(0.35),
44 fMinTPCband(-1E6),
45 fMaxTPCband( 1E6),
46 fESDtrackCutsTPC(),
47 fESDtrackCutsITS(),
48 fESDpid(0x0),
49 fTOFmaker(0x0),
50 fTOFcalib(0x0),
51 fTOFcalibrateESD(kFALSE),
52 fTOFcorrectTExp(kFALSE),
53 fTOFuseT0(kFALSE),
54 fTOFtuneMC(kFALSE),
55 fTOFresolution(0.0),
56 fLastRun(-1)
57{
58//
59// Default constructor.
60//
61}
62
63//_________________________________________________________________________________________________
64AliRsnCutESD2010::AliRsnCutESD2010
65(const char *name) :
66 AliRsnCut(name, AliRsnCut::kDaughter, 0.0, 0.0),
67 fIsMC(kFALSE),
68 fCheckITS(kTRUE),
69 fCheckTPC(kTRUE),
70 fCheckTOF(kTRUE),
35765294 71 fUseGlobal(kTRUE),
72 fUseITSSA(kTRUE),
2dab9030 73 fMaxITSband(1E6),
74 fTPCpLimit(0.35),
75 fMinTPCband(-1E6),
76 fMaxTPCband( 1E6),
77 fESDtrackCutsTPC(),
78 fESDtrackCutsITS(),
79 fESDpid(0x0),
80 fTOFmaker(0x0),
81 fTOFcalib(0x0),
82 fTOFcalibrateESD(kFALSE),
83 fTOFcorrectTExp(kFALSE),
84 fTOFuseT0(kFALSE),
85 fTOFtuneMC(kFALSE),
86 fTOFresolution(0.0),
87 fLastRun(-1)
88{
89//
90// Main constructor.
91//
92}
93
94//_________________________________________________________________________________________________
95AliRsnCutESD2010::AliRsnCutESD2010
96(const AliRsnCutESD2010& copy) :
97 AliRsnCut(copy),
98 fIsMC(kFALSE),
99 fCheckITS(copy.fCheckITS),
100 fCheckTPC(copy.fCheckTPC),
101 fCheckTOF(copy.fCheckTOF),
35765294 102 fUseGlobal(copy.fUseGlobal),
103 fUseITSSA(copy.fUseITSSA),
2dab9030 104 fMaxITSband(copy.fMaxITSband),
105 fTPCpLimit(copy.fTPCpLimit),
106 fMinTPCband(copy.fMinTPCband),
107 fMaxTPCband(copy.fMaxTPCband),
108 fESDtrackCutsTPC(copy.fESDtrackCutsTPC),
109 fESDtrackCutsITS(copy.fESDtrackCutsITS),
110 fESDpid(0x0),
111 fTOFmaker(0x0),
112 fTOFcalib(0x0),
113 fTOFcalibrateESD(copy.fTOFcalibrateESD),
114 fTOFcorrectTExp(copy.fTOFcorrectTExp),
115 fTOFuseT0(copy.fTOFuseT0),
116 fTOFtuneMC(copy.fTOFtuneMC),
117 fTOFresolution(copy.fTOFresolution),
118 fLastRun(-1)
119{
120//
121// Main constructor.
122//
2dab9030 123}
124
125//_________________________________________________________________________________________________
c79c04e1 126void AliRsnCutESD2010::InitializeToDefaults(Bool_t isSim)
2dab9030 127{
128//
129// Main constructor.
130//
c79c04e1 131
132 // ----> set TPC range for PID and calibration
133 SetTPCrange(5.0, 3.0);
134 SetTPCpLimit(0.35);
135
136 // ----> set ITS range for PID
137 SetITSband(4.0);
138
139 // ----> set TPC calibration
140 if (isSim) SetTPCpar(2.15898 / 50.0, 1.75295E1, 3.40030E-9, 1.96178, 3.91720);
141 else SetTPCpar(1.41543 / 50.0, 2.63394E1, 5.0411E-11, 2.12543, 4.88663);
142
143 // ----> set standard quality cuts for TPC global tracks
144 fESDtrackCutsTPC.SetRequireTPCStandAlone(kTRUE); // require to have the projection at inner TPC wall
145 fESDtrackCutsTPC.SetMinNClustersTPC(70);
146 fESDtrackCutsTPC.SetMaxChi2PerClusterTPC(4);
147 fESDtrackCutsTPC.SetAcceptKinkDaughters(kFALSE);
148 fESDtrackCutsTPC.SetRequireTPCRefit(kTRUE);
149 fESDtrackCutsTPC.SetRequireITSRefit(kTRUE);
150 fESDtrackCutsTPC.SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
151 fESDtrackCutsTPC.SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9"); // DCA pt dependent: 7*(0.0050+0.0060/pt0.9)
152 fESDtrackCutsTPC.SetMaxDCAToVertexZ(1e6); // disabled
153 fESDtrackCutsTPC.SetDCAToVertex2D(kFALSE); // each DCA is checked separately
154 fESDtrackCutsTPC.SetRequireSigmaToVertex(kFALSE);
155
156 // ----> set standard quality cuts for ITS standalone tracks
0274b76f 157 fESDtrackCutsITS.SetRequireITSStandAlone(kTRUE);
c79c04e1 158 fESDtrackCutsITS.SetRequireITSRefit(kTRUE);
159 fESDtrackCutsITS.SetMinNClustersITS(4);
160 fESDtrackCutsITS.SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
161 fESDtrackCutsITS.SetMaxChi2PerClusterITS(1.);
162 fESDtrackCutsITS.SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55"); // DCA pt dependent
163 fESDtrackCutsITS.SetMaxDCAToVertexZ(1e6); // disabled
164 fESDtrackCutsITS.SetDCAToVertex2D(kFALSE); // each DCA is checked separately
165
166 // ----> set the TOF calibration depending on type of input (sim/data)
167 SetTOFcorrectTExp(kTRUE);
168 SetTOFuseT0(kTRUE);
169 SetTOFresolution(100.0);
170 if (isSim)
171 {
172 SetTOFcalibrateESD(kFALSE);
173 SetTOFtuneMC(kTRUE);
174 }
175 else
176 {
177 //if (isPass2) SetTOFcalibrateESD(kFALSE); // potrebbe anche essere kFALSE
178 SetTOFcalibrateESD(kTRUE);
179 SetTOFtuneMC(kFALSE);
180 }
2dab9030 181}
182
183//_________________________________________________________________________________________________
184void AliRsnCutESD2010::SetEvent(AliRsnEvent *event)
185{
186 // don't do anything if the event is the same as before
187 if (fEvent != 0x0 && fEvent == event) return;
188
189 // retrieve the ESD event
190 AliESDEvent *esd = event->GetRefESD();
191 if (!esd)
192 {
193 fEvent = 0x0;
194 return;
195 }
196 else
197 {
198 fEvent = event;
199 }
200
4820b1ae 201 // if absent, initialize ESD pid responst
202 if (!fESDpid)
203 {
204 fESDpid = new AliESDpid;
205 fESDpid->GetTPCResponse().SetBetheBlochParameters(fTPCpar[0],fTPCpar[1],fTPCpar[2],fTPCpar[3],fTPCpar[4]);
206 }
207
2dab9030 208 // initialize DB to current run
209 Int_t run = esd->GetRunNumber();
210 if (run != fLastRun)
211 {
212 cout << "Run = " << run << " -- LAST = " << fLastRun << endl;
213 fLastRun = run;
4820b1ae 214
215 // setup TOF maker & calibration
216 if (!fTOFcalib) fTOFcalib = new AliTOFcalib;
217 fTOFcalib->SetCorrectTExp(fTOFcorrectTExp);
218 if (!fTOFmaker) fTOFmaker = new AliTOFT0maker(fESDpid, fTOFcalib);
219 fTOFmaker->SetTimeResolution(fTOFresolution);
220
2dab9030 221 AliCDBManager *cdb = AliCDBManager::Instance();
6256671b 222 cdb->ClearCache(); // suggestion by Annalisa
223 cdb->Clear(); // suggestion by Annalisa
2dab9030 224 cdb->SetDefaultStorage("raw://");
225 cdb->SetRun(run);
6256671b 226
2dab9030 227 fTOFcalib->SetCorrectTExp(fTOFcorrectTExp);
228 fTOFcalib->Init();
229 }
230
231 // if required, calibrate the TOF t0 maker with current event
232 if (fTOFcalibrateESD) fTOFcalib->CalibrateESD(esd);
233 if (fTOFtuneMC) fTOFmaker->TuneForMC(esd);
234 if (fTOFuseT0)
235 {
236 fTOFmaker->ComputeT0TOF(esd);
237 fTOFmaker->ApplyT0TOF(esd);
238 fESDpid->MakePID(esd, kFALSE, 0.);
239 }
240}
241
242//_________________________________________________________________________________________________
243Bool_t AliRsnCutESD2010::IsSelected(TObject *obj1, TObject* /*obj2*/)
244{
245//
246// Cut checker.
247//
248
249 // coherence check: require an ESD track
250 AliRsnDaughter *daughter = dynamic_cast<AliRsnDaughter*>(obj1);
251 if (!daughter) return kFALSE;
252 AliESDtrack *track = daughter->GetRefESDtrack();
253 if (!track) return kFALSE;
254
255 // if no reference event, skip
256 if (!fEvent) return kFALSE;
257
258 // ITS stuff #1 create the response function
259 AliITSPIDResponse itsrsp(fIsMC);
260
261 // TOF: define fixed function for compatibility range
262 Double_t a1 = 0.01, a2 = -0.03;
263 Double_t b1 = 0.25, b2 = 0.25;
264 Double_t c1 = 0.05, c2 = -0.03;
265 Double_t ymax, ymin;
266
267 ULong_t status;
268 Int_t k, nITS;
269 Double_t times[10], tpcNSigma, tpcMaxNSigma, itsSignal, itsNSigma, mom, tofTime, tofSigma, tofRef, tofRel;
0d73200d 270 Bool_t okQuality, okTOF, okTPC, okITS, okTrack, isTPC, isITSSA;
2dab9030 271 UChar_t itsCluMap;
272
273 // get commonly used variables
274 status = (ULong_t)track->GetStatus();
275 mom = track->P();
276 isTPC = ((status & AliESDtrack::kTPCin) != 0);
277 isITSSA = ((status & AliESDtrack::kTPCin) == 0 && (status & AliESDtrack::kITSrefit) != 0 && (status & AliESDtrack::kITSpureSA) == 0 && (status & AliESDtrack::kITSpid) != 0);
278
279 // accept only tracks which are TPC+ITS or ITS standalone
35765294 280 if (!isTPC && !isITSSA) return kFALSE;
281 if ( isTPC && !fUseGlobal) return kFALSE;
282 if ( isITSSA && !fUseITSSA) return kFALSE;
2dab9030 283
284 if (isTPC)
285 {
286 // check standard ESD cuts
0d73200d 287 okQuality = fESDtrackCutsTPC.IsSelected(track);
288 //cout << "GLOBAL -- quality = " << (okQuality ? "GOOD" : "BAD") << endl;
289 if (!okQuality) return kFALSE;
290
2dab9030 291 // check TPC dE/dx
292 if (fCheckTPC)
293 {
294 tpcNSigma = TMath::Abs(fESDpid->NumberOfSigmasTPC(track, AliPID::kKaon));
295 if (track->GetInnerParam()->P() > fTPCpLimit) tpcMaxNSigma = fMinTPCband; else tpcMaxNSigma = fMaxTPCband;
0d73200d 296 okTPC = (tpcNSigma <= tpcMaxNSigma);
297 //cout << "RSN -- TPC -- nsigma = " << tpcNSigma << ", max = " << tpcMaxNSigma << " --> " << (okTPC ? "OK" : "FAILED") << endl;
298 //cout << "RSNTPC -- " << fTPCpar[0] << ' ' << fTPCpar[1] << ' ' << fTPCpar[2] << ' ' << fTPCpar[3] << ' ' << fTPCpar[4] << endl;
299 }
300 else
301 {
302 okTPC = kTRUE;
2dab9030 303 }
304
305 // check TOF (only if momentum is large than function asymptote and flags are OK)
306 if (fCheckTOF)
307 {
2dab9030 308 if (((status & AliESDtrack::kTOFout) != 0) && ((status & AliESDtrack::kTIME) != 0) && mom > TMath::Max(b1, b2))
309 {
310 track->GetIntegratedTimes(times);
311 tofTime = (Double_t)track->GetTOFsignal();
312 tofSigma = fTOFmaker->GetExpectedSigma(mom, times[AliPID::kKaon], AliPID::ParticleMass(AliPID::kKaon));
313 tofRef = times[AliPID::kKaon];
314 if (tofRef > 0.0)
315 {
316 tofRel = (tofTime - tofRef) / tofRef;
317 ymax = a1 / (mom - b1) + c1;
318 ymin = a2 / (mom - b2) + c2;
319 okTOF = (tofRel >= ymin && tofRel <= ymax);
0d73200d 320 //cout << "TOF -- diff = " << tofDiff << ", rel diff = " << tofRel << ", range = " << ymin << " to " << ymax << ", sigma = " << tofSigma << " --> " << (okTOF ? "OK" : "FAILED") << endl;
321 }
322 else
323 {
324 okTOF = kTRUE;
c79c04e1 325 if (!fCheckTPC) okTOF = kFALSE;
0d73200d 326 //cout << "TOF -- not checked due to ZERO reference time" << endl;
2dab9030 327 }
328 }
0d73200d 329 else
330 {
331 okTOF = kTRUE;
c79c04e1 332 if (!fCheckTPC) okTOF = kFALSE;
0d73200d 333 //cout << "TOF -- not checked because TOF pid absent" << endl;
334 }
335 }
336 else
337 {
338 okTOF = kTRUE;
2dab9030 339 }
0d73200d 340
341 // combine checks
342 okTrack = okQuality && okTPC && okTOF;
343 //cout << "GLOBAL -- overall = " << (okTrack ? "ACCEPTED" : "REJECTED") << endl;
2dab9030 344 }
345 else
346 {
347 // check standard ESD cuts
0d73200d 348 okQuality = fESDtrackCutsITS.IsSelected(track);
349 //cout << "ITSSA -- quality = " << (okQuality ? "GOOD" : "BAD") << endl;
350 if (!okQuality) return kFALSE;
2dab9030 351
352 // check dE/dx
353 if (fCheckITS)
354 {
2dab9030 355 itsSignal = track->GetITSsignal();
356 itsCluMap = track->GetITSClusterMap();
357 nITS = 0;
358 for(k = 2; k < 6; k++) if(itsCluMap & (1 << k)) ++nITS;
0d73200d 359 if (nITS < 3)
360 {
361 okITS = kFALSE;
362 //cout << "ITS -- not checked due to too few PID clusters" << endl;
363 }
364 else
365 {
366 itsNSigma = itsrsp.GetNumberOfSigmas(mom, itsSignal, AliPID::kKaon, nITS, kTRUE);
367 okITS = (TMath::Abs(itsNSigma) <= fMaxITSband);
368 //cout << "ITS -- nsigma = " << itsNSigma << ", max = " << fMaxITSband << " --> " << (okITS ? "OK" : "FAILED") << endl;
369 }
2dab9030 370 }
0d73200d 371 else
372 {
373 okITS = kTRUE;
374 }
375
376 okTrack = okQuality && okITS;
377 //cout << "ITSSA -- overall = " << (okTrack ? "ACCEPTED" : "REJECTED") << endl;
2dab9030 378 }
379
0d73200d 380 return okTrack;
2dab9030 381}