1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 // The class AliCFTrackIsPrimaryCut is designed to select reconstructed tracks
17 // with a small impact parameter and tracks which are (not) daughters of kink
18 // decays and to provide corresponding QA histograms.
19 // This class inherits from the Analysis' Framework abstract base class
20 // AliAnalysisCuts and is a part of the Correction Framework.
21 // This class acts on single, reconstructed tracks, it is applicable on
23 // It mainly consists of a IsSelected function that returns a boolean.
24 // This function checks whether the considered track passes a set of cuts:
25 // - min. and max. distance to main vertex in transverse plane (xy)
26 // - min. and max. longitudinal distance to main vertex (z)
27 // - min. and max. distance to main vertex as ellpise in xy - z plane
28 // - all above cuts on absolute values or in units of sigma (resolution)
29 // - min. and max. distance to main vertex in units of sigma (resolution)
30 // - max. transverse (xy) and longitudinal (z) impact parameter resolution
31 // - require that the dca calculation doesn't fail
32 // - accept or not accept daughter tracks of kink decays
34 // By default, the distance to 'vertex calculated from tracks' is used.
35 // Optionally the SPD (tracklet based) or TPC (TPC only tracks based) vertex
37 // Note: the distance to the TPC-vertex is already stored in the ESD,
38 // the distance to the SPD-vertex has to be re-calculated by propagating each
39 // track while executing this cut.
41 // The cut values for these cuts are set with the corresponding set functions.
42 // All cut classes provided by the correction framework are supposed to be
43 // added in the Analysis Framwork's class AliAnalysisFilter and applied by
44 // the filter via a loop.
46 // author: I. Kraus (Ingrid.Kraus@cern.ch)
48 // AliESDtrackCuts writte by Jan Fiete Grosse-Oetringhaus and
49 // AliRsnDaughterCut class written by A. Pulvirenti.
52 #include <TDirectory.h>
56 #include <AliESDtrack.h>
57 #include <AliAODTrack.h>
58 #include <AliESDEvent.h>
59 #include <AliAODEvent.h>
61 #include "AliCFTrackIsPrimaryCuts.h"
63 ClassImp(AliCFTrackIsPrimaryCuts)
65 //__________________________________________________________________________________
66 AliCFTrackIsPrimaryCuts::AliCFTrackIsPrimaryCuts() :
77 fNSigmaToVertexMin(0),
78 fNSigmaToVertexMax(0),
81 fRequireSigmaToVertex(0),
82 fAODType(AliAODTrack::kUndef),
83 fAcceptKinkDaughters(0),
88 fhNBinsRequireSigma(0),
97 fhBinLimRequireSigma(0x0),
98 fhBinLimAcceptKink(0x0),
101 fhBinLimDcaXYnorm(0x0),
102 fhBinLimDcaZnorm(0x0),
103 fhBinLimSigmaDcaXY(0x0),
104 fhBinLimSigmaDcaZ(0x0)
107 // Default constructor
111 //__________________________________________________________________________________
112 AliCFTrackIsPrimaryCuts::AliCFTrackIsPrimaryCuts(Char_t* name, Char_t* title) :
113 AliCFCutBase(name,title),
117 fMinDCAToVertexXY(0),
119 fMaxDCAToVertexXY(0),
123 fNSigmaToVertexMin(0),
124 fNSigmaToVertexMax(0),
127 fRequireSigmaToVertex(0),
128 fAODType(AliAODTrack::kUndef),
129 fAcceptKinkDaughters(0),
134 fhNBinsRequireSigma(0),
135 fhNBinsAcceptKink(0),
140 fhNBinsSigmaDcaXY(0),
143 fhBinLimRequireSigma(0x0),
144 fhBinLimAcceptKink(0x0),
147 fhBinLimDcaXYnorm(0x0),
148 fhBinLimDcaZnorm(0x0),
149 fhBinLimSigmaDcaXY(0x0),
150 fhBinLimSigmaDcaZ(0x0)
157 //__________________________________________________________________________________
158 AliCFTrackIsPrimaryCuts::AliCFTrackIsPrimaryCuts(const AliCFTrackIsPrimaryCuts& c) :
161 fUseSPDvertex(c.fUseSPDvertex),
162 fUseTPCvertex(c.fUseTPCvertex),
163 fMinDCAToVertexXY(c.fMinDCAToVertexXY),
164 fMinDCAToVertexZ(c.fMinDCAToVertexZ),
165 fMaxDCAToVertexXY(c.fMaxDCAToVertexXY),
166 fMaxDCAToVertexZ(c.fMaxDCAToVertexZ),
167 fDCAToVertex2D(c.fDCAToVertex2D),
168 fAbsDCAToVertex(c.fAbsDCAToVertex),
169 fNSigmaToVertexMin(c.fNSigmaToVertexMin),
170 fNSigmaToVertexMax(c.fNSigmaToVertexMax),
171 fSigmaDCAxy(c.fSigmaDCAxy),
172 fSigmaDCAz(c.fSigmaDCAz),
173 fRequireSigmaToVertex(c.fRequireSigmaToVertex),
174 fAODType(c.fAODType),
175 fAcceptKinkDaughters(c.fAcceptKinkDaughters),
176 fhCutStatistics(c.fhCutStatistics),
177 fhCutCorrelation(c.fhCutCorrelation),
179 fhNBinsNSigma(c.fhNBinsNSigma),
180 fhNBinsRequireSigma(c.fhNBinsRequireSigma),
181 fhNBinsAcceptKink(c.fhNBinsAcceptKink),
182 fhNBinsDcaXY(c.fhNBinsDcaXY),
183 fhNBinsDcaZ(c.fhNBinsDcaZ),
184 fhNBinsDcaXYnorm(c.fhNBinsDcaXYnorm),
185 fhNBinsDcaZnorm(c.fhNBinsDcaZnorm),
186 fhNBinsSigmaDcaXY(c.fhNBinsSigmaDcaXY),
187 fhNBinsSigmaDcaZ(c.fhNBinsSigmaDcaZ),
188 fhBinLimNSigma(c.fhBinLimNSigma),
189 fhBinLimRequireSigma(c.fhBinLimRequireSigma),
190 fhBinLimAcceptKink(c.fhBinLimAcceptKink),
191 fhBinLimDcaXY(c.fhBinLimDcaXY),
192 fhBinLimDcaZ(c.fhBinLimDcaZ),
193 fhBinLimDcaXYnorm(c.fhBinLimDcaXYnorm),
194 fhBinLimDcaZnorm(c.fhBinLimDcaZnorm),
195 fhBinLimSigmaDcaXY(c.fhBinLimSigmaDcaXY),
196 fhBinLimSigmaDcaZ(c.fhBinLimSigmaDcaZ)
201 ((AliCFTrackIsPrimaryCuts &) c).Copy(*this);
203 //__________________________________________________________________________________
204 AliCFTrackIsPrimaryCuts& AliCFTrackIsPrimaryCuts::operator=(const AliCFTrackIsPrimaryCuts& c)
207 // Assignment operator
210 AliCFCutBase::operator=(c) ;
212 fUseSPDvertex = c.fUseSPDvertex;
213 fUseTPCvertex = c.fUseTPCvertex;
214 fMinDCAToVertexXY = c.fMinDCAToVertexXY;
215 fMinDCAToVertexZ = c.fMinDCAToVertexZ;
216 fMaxDCAToVertexXY = c.fMaxDCAToVertexXY;
217 fMaxDCAToVertexZ = c.fMaxDCAToVertexZ;
218 fDCAToVertex2D = c.fDCAToVertex2D;
219 fAbsDCAToVertex = c.fAbsDCAToVertex;
220 fNSigmaToVertexMin = c.fNSigmaToVertexMin ;
221 fNSigmaToVertexMax = c.fNSigmaToVertexMax ;
222 fSigmaDCAxy = c.fSigmaDCAxy ;
223 fSigmaDCAz = c.fSigmaDCAz ;
224 fRequireSigmaToVertex = c.fRequireSigmaToVertex ;
225 fAODType = c.fAODType ;
226 fAcceptKinkDaughters = c.fAcceptKinkDaughters ;
227 fhCutStatistics = c.fhCutStatistics ;
228 fhCutCorrelation = c.fhCutCorrelation ;
230 fhNBinsNSigma = c.fhNBinsNSigma;
231 fhNBinsRequireSigma = c.fhNBinsRequireSigma;
232 fhNBinsAcceptKink = c.fhNBinsAcceptKink;
233 fhNBinsDcaXY = c.fhNBinsDcaXY;
234 fhNBinsDcaZ = c.fhNBinsDcaZ;
235 fhNBinsDcaXYnorm = c.fhNBinsDcaXYnorm;
236 fhNBinsDcaZnorm = c.fhNBinsDcaZnorm;
237 fhNBinsSigmaDcaXY = c.fhNBinsSigmaDcaXY;
238 fhNBinsSigmaDcaZ = c.fhNBinsSigmaDcaZ;
239 fhBinLimNSigma = c.fhBinLimNSigma;
240 fhBinLimRequireSigma = c.fhBinLimRequireSigma;
241 fhBinLimAcceptKink = c.fhBinLimAcceptKink;
242 fhBinLimDcaXY = c.fhBinLimDcaXY;
243 fhBinLimDcaZ = c.fhBinLimDcaZ;
244 fhBinLimDcaXYnorm = c.fhBinLimDcaXYnorm;
245 fhBinLimDcaZnorm = c.fhBinLimDcaZnorm;
246 fhBinLimSigmaDcaXY = c.fhBinLimSigmaDcaXY;
247 fhBinLimSigmaDcaZ = c.fhBinLimSigmaDcaZ;
249 for (Int_t j=0; j<6; j++) fDCA[j] = c.fDCA[j];
250 for (Int_t j=0; j<c.kNStepQA; j++){
251 if(c.fhDcaXYvsDcaZ[j]) fhDcaXYvsDcaZ[j] = (TH2F*)c.fhDcaXYvsDcaZ[j]->Clone();
252 for (Int_t i=0; i<c.kNHist; i++){
253 if(c.fhQA[i][j]) fhQA[i][j] = (TH1F*)c.fhQA[i][j]->Clone();
256 ((AliCFTrackIsPrimaryCuts &) c).Copy(*this);
260 //__________________________________________________________________________________
261 AliCFTrackIsPrimaryCuts::~AliCFTrackIsPrimaryCuts()
266 if (fhCutStatistics) delete fhCutStatistics;
267 if (fhCutCorrelation) delete fhCutCorrelation;
269 for (Int_t j=0; j<kNStepQA; j++){
270 if(fhDcaXYvsDcaZ[j]) delete fhDcaXYvsDcaZ[j];
271 for (Int_t i=0; i<kNHist; i++)
272 if(fhQA[i][j]) delete fhQA[i][j];
274 if(fEvt) delete fEvt;
275 if(fBitmap) delete fBitmap;
276 if(fhBinLimNSigma) delete fhBinLimNSigma;
277 if(fhBinLimRequireSigma) delete fhBinLimRequireSigma;
278 if(fhBinLimAcceptKink) delete fhBinLimAcceptKink;
279 if(fhBinLimDcaXY) delete fhBinLimDcaXY;
280 if(fhBinLimDcaZ) delete fhBinLimDcaZ;
281 if(fhBinLimDcaXYnorm) delete fhBinLimDcaXYnorm;
282 if(fhBinLimDcaZnorm) delete fhBinLimDcaZnorm;
283 if(fhBinLimSigmaDcaXY) delete fhBinLimSigmaDcaXY;
284 if(fhBinLimSigmaDcaZ) delete fhBinLimSigmaDcaZ;
286 //__________________________________________________________________________________
287 void AliCFTrackIsPrimaryCuts::Initialise()
290 // sets everything to zero
294 fMinDCAToVertexXY = 0;
295 fMinDCAToVertexZ = 0;
296 fMaxDCAToVertexXY = 0;
297 fMaxDCAToVertexZ = 0;
300 fNSigmaToVertexMin = 0;
301 fNSigmaToVertexMax = 0;
304 fRequireSigmaToVertex = 0;
305 fAcceptKinkDaughters = 0;
306 fAODType = AliAODTrack::kUndef;
308 SetMinDCAToVertexXY();
309 SetMinDCAToVertexZ();
310 SetMaxDCAToVertexXY();
311 SetMaxDCAToVertexZ();
314 SetMinNSigmaToVertex();
315 SetMaxNSigmaToVertex();
318 SetRequireSigmaToVertex();
319 SetAcceptKinkDaughters();
322 for (Int_t j=0; j<6; j++) fDCA[j] = 0.;
323 for (Int_t j=0; j<kNStepQA; j++) {
324 fhDcaXYvsDcaZ[j] = 0x0;
325 for (Int_t i=0; i<kNHist; i++)
329 fhCutCorrelation = 0;
330 fBitmap=new TBits(0);
332 //set default bining for QA histograms
333 SetHistogramBins(kCutNSigmaToVertex,100,0.,10.);
334 SetHistogramBins(kCutRequireSigmaToVertex,5,-0.75,1.75);
335 SetHistogramBins(kCutAcceptKinkDaughters,5,-0.75,1.75);
336 SetHistogramBins(kDcaXY,500,-10.,10.);
337 SetHistogramBins(kDcaZ,500,-10.,10.);
338 SetHistogramBins(kDcaXYnorm,500,-10.,10.);
339 SetHistogramBins(kDcaZnorm,500,-10.,10.);
340 SetHistogramBins(kSigmaDcaXY,500,-0.1,0.9);
341 SetHistogramBins(kSigmaDcaZ,500,-0.1,0.9);
343 //__________________________________________________________________________________
344 void AliCFTrackIsPrimaryCuts::Copy(TObject &c) const
349 AliCFTrackIsPrimaryCuts& target = (AliCFTrackIsPrimaryCuts &) c;
353 if (fhCutStatistics) target.fhCutStatistics = (TH1F*) fhCutStatistics->Clone();
354 if (fhCutCorrelation) target.fhCutCorrelation = (TH2F*) fhCutCorrelation->Clone();
356 for (Int_t j=0; j<6; j++) target.fDCA[j] = fDCA[j];
357 for (Int_t j=0; j<kNStepQA; j++){
358 if(fhDcaXYvsDcaZ[j]) target.fhDcaXYvsDcaZ[j] = (TH2F*)fhDcaXYvsDcaZ[j]->Clone();
359 for (Int_t i=0; i<kNHist; i++)
360 if(fhQA[i][j]) target.fhQA[i][j] = (TH1F*)fhQA[i][j]->Clone();
364 //__________________________________________________________________________________
365 void AliCFTrackIsPrimaryCuts::SetRecEventInfo(const TObject* evt) {
367 // Sets pointer to event information (AliESDEvent or AliAODEvent)
370 AliError("Pointer to AliVEvent !");
373 TString className(evt->ClassName());
374 if (! (className.CompareTo("AliESDEvent")==0 || className.CompareTo("AliAODEvent")==0)) {
375 AliError("argument must point to an AliESDEvent or AliAODEvent !");
378 fEvt = (AliVEvent*) evt;
380 //__________________________________________________________________________________
381 void AliCFTrackIsPrimaryCuts::UseSPDvertex(Bool_t b) {
383 if(fUseTPCvertex && fUseSPDvertex) {
384 fUseSPDvertex = kFALSE;
385 AliError("SPD and TPC vertex chosen. TPC vertex is preferred.");
388 //__________________________________________________________________________________
389 void AliCFTrackIsPrimaryCuts::UseTPCvertex(Bool_t b) {
391 if(fUseTPCvertex) fUseSPDvertex = kFALSE;
393 //__________________________________________________________________________________
394 void AliCFTrackIsPrimaryCuts::GetDCA(AliESDtrack* esdTrack)
396 if (!esdTrack) return;
398 Float_t b[2] = {0.,0.};
399 Float_t bCov[3] = {0.,0.,0.};
400 if(!fUseSPDvertex && !fUseTPCvertex) esdTrack->GetImpactParameters(b,bCov);
401 if( fUseTPCvertex) esdTrack->GetImpactParametersTPC(b,bCov);
405 AliESDEvent * evt = 0x0 ;
406 evt = dynamic_cast<AliESDEvent*>(fEvt);
407 const AliESDVertex *vtx = evt->GetVertex();
408 const Double_t Bz = evt->GetMagneticField();
409 AliExternalTrackParam *cParam = 0;
410 Bool_t success = esdTrack->RelateToVertex(vtx, Bz, kVeryBig, cParam);
411 if (success) esdTrack->GetImpactParameters(b,bCov);
414 if (bCov[0]<=0 || bCov[2]<=0) {
415 bCov[0]=0; bCov[2]=0;
417 fDCA[0] = b[0]; // impact parameter xy
418 fDCA[1] = b[1]; // impact parameter z
419 fDCA[2] = TMath::Sqrt(bCov[0]); // resolution xy
420 fDCA[3] = TMath::Sqrt(bCov[2]); // resolution z
422 if (!fAbsDCAToVertex) {
423 if (fDCA[2] > 0) fDCA[0] = fDCA[0]/fDCA[2]; // normalised impact parameter xy
424 if (fDCA[3] > 0) fDCA[1] = fDCA[1]/fDCA[3]; // normalised impact parameter z
428 if(!fUseSPDvertex && !fUseTPCvertex)
429 fDCA[5] = AliESDtrackCuts::GetSigmaToVertex(esdTrack);
433 if (fDCA[2]==0 || fDCA[3]==0)
436 Float_t d = TMath::Sqrt(TMath::Power(b[0]/fDCA[2],2) + TMath::Power(b[1]/fDCA[3],2));
437 if (TMath::Exp(-d * d / 2) < 1e-15)
439 fDCA[5] = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
443 //__________________________________________________________________________________
444 void AliCFTrackIsPrimaryCuts::GetDCA(AliAODTrack* aodTrack)
446 if (!aodTrack) return;
448 Double_t p[3] = {0.,0.,0.};
449 Double_t cov[21] = {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.};
451 aodTrack->XYZAtDCA(p); // position at DCA
452 aodTrack->GetCovarianceXYZPxPyPz(cov);
455 fDCA[5] = -1; // n_sigma
456 if (p[0]==-999. || p[1]==-999. || p[2]==-999.) {
457 AliError("dca info not available !");
458 fDCA[0] = -999.; // impact parameter xy
459 fDCA[1] = -999.; // impact parameter z
464 AliAODEvent * evt = 0x0;
465 evt = dynamic_cast<AliAODEvent*>(fEvt);
466 // primary vertex is the "best": tracks, SPD or TPC vertex
467 AliAODVertex * primaryVertex = evt->GetVertex(0);
468 // dca = track postion - primary vertex position
469 p[0] = p[0] - primaryVertex->GetX();
470 p[1] = p[1] - primaryVertex->GetY();
471 p[2] = p[2] - primaryVertex->GetZ();
472 // calculate dca in transverse plane
473 Float_t b[2] = {0.,0.};
474 b[0] = TMath::Sqrt(p[0]*p[0]+p[1]*p[1]);
477 Double_t bCov[3] = {0.,0.,0.};
478 // how to calculate the resoultion in the transverse plane ?
479 bCov[0] = 0.; // to do: calculate cov in transverse plane
480 bCov[2] = 0.; // from cov in x and y, need to know correlation
482 if (bCov[0]<=0 || bCov[2]<=0) {
483 bCov[0]=0; bCov[2]=0;
485 fDCA[0] = b[0]; // impact parameter xy
486 fDCA[1] = b[1]; // impact parameter z
487 fDCA[2] = TMath::Sqrt(bCov[0]); // resolution xy
488 fDCA[3] = TMath::Sqrt(bCov[2]); // resolution z
490 if (!fAbsDCAToVertex) {
491 AliError("resolution of impact parameter not available, use absolute dca cut instead !");
492 if (fDCA[2] > 0) fDCA[0] = fDCA[0]/fDCA[2]; // normalised impact parameter xy
493 if (fDCA[3] > 0) fDCA[1] = fDCA[1]/fDCA[3]; // normalised impact parameter z
497 if (fDCA[2]==0 || fDCA[3]==0)
500 Float_t d = TMath::Sqrt(TMath::Power(b[0]/fDCA[2],2) + TMath::Power(b[1]/fDCA[3],2));
501 if (TMath::Exp(-d * d / 2) < 1e-15)
503 fDCA[5] = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
507 //__________________________________________________________________________________
508 void AliCFTrackIsPrimaryCuts::SelectionBitMap(TObject* obj)
511 // test if the track passes the single cuts
512 // and store the information in a bitmap
515 // bitmap stores the decision of each single cut
516 for(Int_t i=0; i<kNCuts; i++)fBitmap->SetBitNumber(i,kFALSE);
518 // check TObject and cast into ESDtrack
520 if (!obj->InheritsFrom("AliVParticle")) {
521 AliError("object must derived from AliVParticle !");
525 Bool_t isESDTrack = strcmp(obj->ClassName(),"AliESDtrack") == 0 ? kTRUE : kFALSE ;
526 Bool_t isAODTrack = strcmp(obj->ClassName(),"AliAODTrack") == 0 ? kTRUE : kFALSE ;
528 AliESDtrack * esdTrack = 0x0 ;
529 AliAODTrack * aodTrack = 0x0 ;
530 if (isESDTrack) esdTrack = dynamic_cast<AliESDtrack*>(obj);
531 if (isAODTrack) aodTrack = dynamic_cast<AliAODTrack*>(obj);
533 // get the track to vertex parameter for ESD track
534 if (isESDTrack) GetDCA(esdTrack);
535 if (isAODTrack) GetDCA(aodTrack);
537 // check whether dca info is filled
539 if (fDCA[0]>-990. && fDCA[1]>-990.) dcaInfo = 1;
541 Float_t bxy = 0, bz = 0;
542 bxy = TMath::Abs(fDCA[0]);
543 bz = TMath::Abs(fDCA[1]);
545 Float_t b2Dmin = 0, b2Dmax = 0;
546 if (fMinDCAToVertexXY>0 && fMinDCAToVertexZ>0)
547 b2Dmin = fDCA[0]*fDCA[0]/fMinDCAToVertexXY/fMinDCAToVertexXY + fDCA[1]*fDCA[1]/fMinDCAToVertexZ/fMinDCAToVertexZ;
548 if (fMaxDCAToVertexXY>0 && fMaxDCAToVertexZ>0)
549 b2Dmax = fDCA[0]*fDCA[0]/fMaxDCAToVertexXY/fMaxDCAToVertexXY + fDCA[1]*fDCA[1]/fMaxDCAToVertexZ/fMaxDCAToVertexZ;
555 if (!dcaInfo || fDCAToVertex2D || (!fDCAToVertex2D && bxy >= fMinDCAToVertexXY && bxy <= fMaxDCAToVertexXY))
556 fBitmap->SetBitNumber(iCutBit,kTRUE);
559 if (!dcaInfo || fDCAToVertex2D || (!fDCAToVertex2D && bz >= fMinDCAToVertexZ && bz <= fMaxDCAToVertexZ))
560 fBitmap->SetBitNumber(iCutBit,kTRUE);
563 if (!dcaInfo || !fDCAToVertex2D || (fDCAToVertex2D && TMath::Sqrt(b2Dmin) > 1 && TMath::Sqrt(b2Dmax) < 1))
564 fBitmap->SetBitNumber(iCutBit,kTRUE);
567 if (!dcaInfo || (fDCA[5] >= fNSigmaToVertexMin && fDCA[5] <= fNSigmaToVertexMax))
568 fBitmap->SetBitNumber(iCutBit,kTRUE);
571 if (!dcaInfo || fDCA[2] < fSigmaDCAxy)
572 fBitmap->SetBitNumber(iCutBit,kTRUE);
575 if (!dcaInfo || fDCA[3] < fSigmaDCAz)
576 fBitmap->SetBitNumber(iCutBit,kTRUE);
579 if (!dcaInfo || !fRequireSigmaToVertex || (fDCA[5]>=0 && fRequireSigmaToVertex))
580 fBitmap->SetBitNumber(iCutBit,kTRUE);
583 if (!dcaInfo || fAcceptKinkDaughters || (!fAcceptKinkDaughters && esdTrack->GetKinkIndex(0)<=0))
584 fBitmap->SetBitNumber(iCutBit,kTRUE);
588 if (fAODType==AliAODTrack::kUndef || fAODType == aodTrack->GetType()) {
589 fBitmap->SetBitNumber(iCutBit,kTRUE);
592 else fBitmap->SetBitNumber(iCutBit,kTRUE);
596 //__________________________________________________________________________________
597 Bool_t AliCFTrackIsPrimaryCuts::IsSelected(TObject* obj) {
599 // loops over decisions of single cuts and returns if the track is accepted
601 SelectionBitMap(obj);
603 if (fIsQAOn) FillHistograms(obj,0);
604 Bool_t isSelected = kTRUE;
606 for (UInt_t icut=0; icut<fBitmap->GetNbits();icut++) {
607 if(!fBitmap->TestBitNumber(icut)) {
613 if (!isSelected) return kFALSE ;
614 if (fIsQAOn) FillHistograms(obj,1);
617 //__________________________________________________________________________________
618 void AliCFTrackIsPrimaryCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t *bins)
626 case kCutNSigmaToVertex:
627 fhNBinsNSigma=nbins+1;
628 fhBinLimNSigma=new Double_t[nbins+1];
629 for(Int_t i=0;i<nbins+1;i++)fhBinLimNSigma[i]=bins[i];
632 case kCutRequireSigmaToVertex:
633 fhNBinsRequireSigma=nbins+1;
634 fhBinLimRequireSigma=new Double_t[nbins+1];
635 for(Int_t i=0;i<nbins+1;i++)fhBinLimRequireSigma[i]=bins[i];
638 case kCutAcceptKinkDaughters:
639 fhNBinsAcceptKink=nbins+1;
640 fhBinLimAcceptKink=new Double_t[nbins+1];
641 for(Int_t i=0;i<nbins+1;i++)fhBinLimAcceptKink[i]=bins[i];
645 fhNBinsDcaXY=nbins+1;
646 fhBinLimDcaXY=new Double_t[nbins+1];
647 for(Int_t i=0;i<nbins+1;i++)fhBinLimDcaXY[i]=bins[i];
652 fhBinLimDcaZ=new Double_t[nbins+1];
653 for(Int_t i=0;i<nbins+1;i++)fhBinLimDcaZ[i]=bins[i];
657 fhNBinsDcaXYnorm=nbins+1;
658 fhBinLimDcaXYnorm=new Double_t[nbins+1];
659 for(Int_t i=0;i<nbins+1;i++)fhBinLimDcaXYnorm[i]=bins[i];
663 fhNBinsDcaZnorm=nbins+1;
664 fhBinLimDcaZnorm=new Double_t[nbins+1];
665 for(Int_t i=0;i<nbins+1;i++)fhBinLimDcaZnorm[i]=bins[i];
669 fhNBinsSigmaDcaXY=nbins+1;
670 fhBinLimSigmaDcaXY=new Double_t[nbins+1];
671 for(Int_t i=0;i<nbins+1;i++)fhBinLimSigmaDcaXY[i]=bins[i];
675 fhNBinsSigmaDcaZ=nbins+1;
676 fhBinLimSigmaDcaZ=new Double_t[nbins+1];
677 for(Int_t i=0;i<nbins+1;i++)fhBinLimSigmaDcaZ[i]=bins[i];
681 //__________________________________________________________________________________
682 void AliCFTrackIsPrimaryCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t xmin, Double_t xmax)
688 case kCutNSigmaToVertex:
689 fhNBinsNSigma=nbins+1;
690 fhBinLimNSigma=new Double_t[nbins+1];
691 for(Int_t i=0;i<nbins+1;i++)fhBinLimNSigma[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
694 case kCutRequireSigmaToVertex:
695 fhNBinsRequireSigma=nbins+1;
696 fhBinLimRequireSigma=new Double_t[nbins+1];
697 for(Int_t i=0;i<nbins+1;i++)fhBinLimRequireSigma[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
700 case kCutAcceptKinkDaughters:
701 fhNBinsAcceptKink=nbins+1;
702 fhBinLimAcceptKink=new Double_t[nbins+1];
703 for(Int_t i=0;i<nbins+1;i++)fhBinLimAcceptKink[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
707 fhNBinsDcaXY=nbins+1;
708 fhBinLimDcaXY=new Double_t[nbins+1];
709 for(Int_t i=0;i<nbins+1;i++)fhBinLimDcaXY[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
714 fhBinLimDcaZ=new Double_t[nbins+1];
715 for(Int_t i=0;i<nbins+1;i++)fhBinLimDcaZ[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
719 fhNBinsDcaXYnorm=nbins+1;
720 fhBinLimDcaXYnorm=new Double_t[nbins+1];
721 for(Int_t i=0;i<nbins+1;i++)fhBinLimDcaXYnorm[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
725 fhNBinsDcaZnorm=nbins+1;
726 fhBinLimDcaZnorm=new Double_t[nbins+1];
727 for(Int_t i=0;i<nbins+1;i++)fhBinLimDcaZnorm[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
731 fhNBinsSigmaDcaXY=nbins+1;
732 fhBinLimSigmaDcaXY=new Double_t[nbins+1];
733 for(Int_t i=0;i<nbins+1;i++)fhBinLimSigmaDcaXY[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
737 fhNBinsSigmaDcaZ=nbins+1;
738 fhBinLimSigmaDcaZ=new Double_t[nbins+1];
739 for(Int_t i=0;i<nbins+1;i++)fhBinLimSigmaDcaZ[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
743 //__________________________________________________________________________________
744 void AliCFTrackIsPrimaryCuts::DefineHistograms() {
746 // histograms for cut variables, cut statistics and cut correlations
750 // book cut statistics and cut correlation histograms
751 fhCutStatistics = new TH1F(Form("%s_cut_statistics",GetName()), Form("%s cut statistics",GetName()), kNCuts,0.5,kNCuts+0.5);
752 fhCutStatistics->SetLineWidth(2);
753 fhCutStatistics->GetXaxis()->SetBinLabel(1,"dca xy");
754 fhCutStatistics->GetXaxis()->SetBinLabel(2,"dca z");
755 fhCutStatistics->GetXaxis()->SetBinLabel(3,"dca ellipse");
756 fhCutStatistics->GetXaxis()->SetBinLabel(4,"n dca");
757 fhCutStatistics->GetXaxis()->SetBinLabel(5,"sigma dca xy");
758 fhCutStatistics->GetXaxis()->SetBinLabel(6,"sigma dca z");
759 fhCutStatistics->GetXaxis()->SetBinLabel(7,"require dca");
760 fhCutStatistics->GetXaxis()->SetBinLabel(8,"kink daughter");
761 fhCutStatistics->GetXaxis()->SetBinLabel(9,"AOD type");
763 fhCutCorrelation = new TH2F(Form("%s_cut_correlation",GetName()), Form("%s cut correlation",GetName()), kNCuts,0.5,kNCuts+0.5,kNCuts,0.5,kNCuts+0.5);
764 fhCutCorrelation->SetLineWidth(2);
765 fhCutCorrelation->GetXaxis()->SetBinLabel(1,"dca xy");
766 fhCutCorrelation->GetXaxis()->SetBinLabel(2,"dca z");
767 fhCutCorrelation->GetXaxis()->SetBinLabel(3,"dca ellipse");
768 fhCutCorrelation->GetXaxis()->SetBinLabel(4,"n dca");
769 fhCutCorrelation->GetXaxis()->SetBinLabel(5,"sigma dca xy");
770 fhCutCorrelation->GetXaxis()->SetBinLabel(6,"sigma dca z");
771 fhCutCorrelation->GetXaxis()->SetBinLabel(7,"require dca");
772 fhCutCorrelation->GetXaxis()->SetBinLabel(8,"kink daughter");
773 fhCutCorrelation->GetXaxis()->SetBinLabel(9,"AOD type");
775 fhCutCorrelation->GetYaxis()->SetBinLabel(1,"dca xy");
776 fhCutCorrelation->GetYaxis()->SetBinLabel(2,"dca z");
777 fhCutCorrelation->GetYaxis()->SetBinLabel(3,"dca ellipse");
778 fhCutCorrelation->GetYaxis()->SetBinLabel(4,"n dca");
779 fhCutCorrelation->GetYaxis()->SetBinLabel(5,"sigma dca xy");
780 fhCutCorrelation->GetYaxis()->SetBinLabel(6,"sigma dca z");
781 fhCutCorrelation->GetYaxis()->SetBinLabel(7,"require dca");
782 fhCutCorrelation->GetYaxis()->SetBinLabel(8,"kink daughter");
783 fhCutCorrelation->GetYaxis()->SetBinLabel(9,"AOD type");
785 // book QA histograms
787 for (Int_t i=0; i<kNStepQA; i++) {
788 if (i==0) sprintf(str," ");
789 else sprintf(str,"_cut");
791 fhDcaXYvsDcaZ[i] = new TH2F(Form("%s_dcaXYvsDcaZ%s",GetName(),str),"",200,-10,10,200,-10,10);
792 fhQA[kCutNSigmaToVertex][i] = new TH1F(Form("%s_nSigmaToVertex%s",GetName(),str),"",fhNBinsNSigma-1,fhBinLimNSigma);
793 fhQA[kCutRequireSigmaToVertex][i] = new TH1F(Form("%s_requireSigmaToVertex%s",GetName(),str),"",fhNBinsRequireSigma-1,fhBinLimRequireSigma);
794 fhQA[kCutAcceptKinkDaughters][i] = new TH1F(Form("%s_acceptKinkDaughters%s",GetName(),str),"",fhNBinsAcceptKink-1,fhBinLimAcceptKink);
795 fhQA[kDcaXY][i] = new TH1F(Form("%s_dcaXY%s",GetName(),str),"",fhNBinsDcaXY-1,fhBinLimDcaXY);
796 fhQA[kDcaZ][i] = new TH1F(Form("%s_dcaZ%s",GetName(),str),"",fhNBinsDcaZ-1,fhBinLimDcaZ);
797 fhQA[kDcaXYnorm][i] = new TH1F(Form("%s_dcaXYnorm%s",GetName(),str),"",fhNBinsDcaXYnorm-1,fhBinLimDcaXYnorm);
798 fhQA[kDcaZnorm][i] = new TH1F(Form("%s_dcaZnorm%s",GetName(),str),"",fhNBinsDcaZnorm-1,fhBinLimDcaZnorm);
799 fhQA[kSigmaDcaXY][i] = new TH1F(Form("%s_sigmaDcaXY%s",GetName(),str),"",fhNBinsSigmaDcaXY-1,fhBinLimSigmaDcaXY);
800 fhQA[kSigmaDcaZ][i] = new TH1F(Form("%s_sigmaDcaZ%s",GetName(),str),"",fhNBinsSigmaDcaZ-1,fhBinLimSigmaDcaZ);
802 fhDcaXYvsDcaZ[i]->SetXTitle("impact par. d_{z}");
803 fhDcaXYvsDcaZ[i]->SetYTitle("impact par. d_{xy}");
805 fhQA[kCutNSigmaToVertex][i]->SetXTitle("n #sigma to vertex");
806 fhQA[kCutRequireSigmaToVertex][i]->SetXTitle("require #sigma to vertex");
807 fhQA[kCutAcceptKinkDaughters][i]->SetXTitle("accept kink daughters");
808 fhQA[kDcaXY][i]->SetXTitle("impact par. d_{xy}");
809 fhQA[kDcaZ][i]->SetXTitle("impact par. d_{z}");
810 fhQA[kDcaXYnorm][i]->SetXTitle("norm. impact par. d_{xy} / #sigma_{xy}");
811 fhQA[kDcaZnorm][i]->SetXTitle("norm. impact par. d_{z} / #sigma_{z}");
812 fhQA[kSigmaDcaXY][i]->SetXTitle("impact par. resolution #sigma_{xy}");
813 fhQA[kSigmaDcaZ][i]->SetXTitle("impact par. resolution #sigma_{z}");
815 for(Int_t i=0; i<kNHist; i++) fhQA[i][1]->SetLineColor(color);
817 //__________________________________________________________________________________
818 void AliCFTrackIsPrimaryCuts::FillHistograms(TObject* obj, Bool_t f)
821 // fill the QA histograms
826 Bool_t isESDTrack = strcmp(obj->ClassName(),"AliESDtrack") == 0 ? kTRUE : kFALSE ;
827 Bool_t isAODTrack = strcmp(obj->ClassName(),"AliAODTrack") == 0 ? kTRUE : kFALSE ;
829 AliESDtrack * esdTrack = 0x0 ;
830 AliAODTrack * aodTrack = 0x0 ;
831 if (isESDTrack) esdTrack = dynamic_cast<AliESDtrack*>(obj);
832 if (isAODTrack) aodTrack = dynamic_cast<AliAODTrack*>(obj);
834 // f = 0: fill histograms before cuts
835 // f = 1: fill histograms after cuts
837 // get the track to vertex parameter for ESD track
840 fhQA[kDcaZ][f]->Fill(fDCA[1]);
841 fhQA[kDcaXY][f]->Fill(fDCA[0]);
842 fhDcaXYvsDcaZ[f]->Fill(fDCA[1],fDCA[0]);
843 fhQA[kSigmaDcaXY][f]->Fill(fDCA[2]);
844 fhQA[kSigmaDcaZ][f]->Fill(fDCA[3]);
845 // // // // // // // delete histograms
846 fhQA[kDcaZnorm][f]->Fill(fDCA[1]);
847 fhQA[kDcaXYnorm][f]->Fill(fDCA[0]);
849 fhQA[kCutNSigmaToVertex][f]->Fill(fDCA[5]);
850 if (fDCA[5]<0 && fRequireSigmaToVertex)
851 fhQA[kCutRequireSigmaToVertex][f]->Fill(0.);
853 fhQA[kCutRequireSigmaToVertex][f]->Fill(1.);
855 if (!fAcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
856 fhQA[kCutAcceptKinkDaughters][f]->Fill(0.);
858 fhQA[kCutAcceptKinkDaughters][f]->Fill(1.);
861 // fill cut statistics and cut correlation histograms with information from the bitmap
864 // Get the bitmap of the single cuts
866 SelectionBitMap(obj);
868 // Number of single cuts in this class
869 UInt_t ncuts = fBitmap->GetNbits();
870 for(UInt_t bit=0; bit<ncuts;bit++) {
871 if (!fBitmap->TestBitNumber(bit)) {
872 fhCutStatistics->Fill(bit+1);
873 for (UInt_t bit2=bit; bit2<ncuts;bit2++) {
874 if (!fBitmap->TestBitNumber(bit2))
875 fhCutCorrelation->Fill(bit+1,bit2+1);
880 //__________________________________________________________________________________
881 void AliCFTrackIsPrimaryCuts::SaveHistograms(const Char_t* dir) {
883 // saves the histograms in a directory (dir)
890 gDirectory->mkdir(dir);
893 gDirectory->mkdir("before_cuts");
894 gDirectory->mkdir("after_cuts");
896 fhCutStatistics->Write();
897 fhCutCorrelation->Write();
899 for (Int_t j=0; j<kNStepQA; j++) {
901 gDirectory->cd("before_cuts");
903 gDirectory->cd("after_cuts");
905 fhDcaXYvsDcaZ[j] ->Write();
907 for(Int_t i=0; i<kNHist; i++) fhQA[i][j]->Write();
909 gDirectory->cd("../");
911 gDirectory->cd("../");
913 //__________________________________________________________________________________
914 void AliCFTrackIsPrimaryCuts::DrawHistograms()
917 // draws some histograms
922 Float_t right = 0.03;
923 Float_t left = 0.175;
925 Float_t bottom = 0.175;
927 TCanvas* canvas1 = new TCanvas("Track_QA_Primary_1", "Track QA Primary 1", 800, 500);
928 canvas1->Divide(2, 1);
931 fhCutStatistics->SetStats(kFALSE);
932 fhCutStatistics->LabelsOption("v");
933 gPad->SetLeftMargin(left);
934 gPad->SetBottomMargin(0.25);
935 gPad->SetRightMargin(right);
936 gPad->SetTopMargin(0.1);
937 fhCutStatistics->Draw();
940 fhCutCorrelation->SetStats(kFALSE);
941 fhCutCorrelation->LabelsOption("v");
942 gPad->SetLeftMargin(0.30);
943 gPad->SetRightMargin(bottom);
944 gPad->SetTopMargin(0.1);
945 gPad->SetBottomMargin(0.25);
946 fhCutCorrelation->Draw("COLZ");
948 canvas1->SaveAs(Form("%s.eps", canvas1->GetName()));
949 canvas1->SaveAs(Form("%s.ps", canvas1->GetName()));
953 TCanvas* canvas2 = new TCanvas("Track_QA_Primary_2", "Track QA Primary 2", 800, 800);
954 canvas2->Divide(2, 2);
957 gPad->SetRightMargin(right);
958 gPad->SetLeftMargin(left);
959 gPad->SetTopMargin(top);
960 gPad->SetBottomMargin(bottom);
961 fhQA[kDcaXY][0]->SetStats(kFALSE);
962 fhQA[kDcaXY][0]->Draw();
963 fhQA[kDcaXY][1]->Draw("same");
966 gPad->SetRightMargin(right);
967 gPad->SetLeftMargin(left);
968 gPad->SetTopMargin(top);
969 gPad->SetBottomMargin(bottom);
970 fhQA[kDcaZ][0]->SetStats(kFALSE);
971 fhQA[kDcaZ][0]->Draw();
972 fhQA[kDcaZ][1]->Draw("same");
975 // fhDXYvsDZ[0]->SetStats(kFALSE);
977 gPad->SetLeftMargin(bottom);
978 gPad->SetTopMargin(0.1);
979 gPad->SetBottomMargin(bottom);
980 gPad->SetRightMargin(0.2);
981 fhDcaXYvsDcaZ[0]->Draw("COLZ");
984 // fhDXYvsDZ[1]->SetStats(kFALSE);
986 gPad->SetLeftMargin(bottom);
987 gPad->SetTopMargin(0.1);
988 gPad->SetBottomMargin(bottom);
989 gPad->SetRightMargin(0.2);
990 fhDcaXYvsDcaZ[1]->Draw("COLZ");
992 canvas2->SaveAs(Form("%s.eps", canvas2->GetName()));
993 canvas2->SaveAs(Form("%s.ps", canvas2->GetName()));
997 TCanvas* canvas3 = new TCanvas("Track_QA_Primary_3", "Track QA Primary 3", 800, 400);
998 canvas3->Divide(2, 1);
1001 gPad->SetRightMargin(right);
1002 gPad->SetLeftMargin(left);
1003 gPad->SetTopMargin(top);
1004 gPad->SetBottomMargin(bottom);
1005 fhQA[kDcaXYnorm][0]->SetStats(kFALSE);
1006 fhQA[kDcaXYnorm][0]->Draw();
1007 fhQA[kDcaXYnorm][1]->Draw("same");
1010 gPad->SetRightMargin(right);
1011 gPad->SetLeftMargin(left);
1012 gPad->SetTopMargin(top);
1013 gPad->SetBottomMargin(bottom);
1014 fhQA[kDcaZnorm][0]->SetStats(kFALSE);
1015 fhQA[kDcaZnorm][0]->Draw();
1016 fhQA[kDcaZnorm][1]->Draw("same");
1018 canvas3->SaveAs(Form("%s.eps", canvas3->GetName()));
1019 canvas3->SaveAs(Form("%s.ps", canvas3->GetName()));
1023 TCanvas* canvas4 = new TCanvas("Track_QA_Primary_4", "Track QA Primary 4", 1200, 800);
1024 canvas4->Divide(3, 2);
1027 gPad->SetRightMargin(right);
1028 gPad->SetLeftMargin(left);
1029 gPad->SetTopMargin(top);
1030 gPad->SetBottomMargin(bottom);
1031 fhQA[kSigmaDcaXY][0]->SetStats(kFALSE);
1032 fhQA[kSigmaDcaXY][0]->Draw();
1033 fhQA[kSigmaDcaXY][1]->Draw("same");
1036 gPad->SetRightMargin(right);
1037 gPad->SetLeftMargin(left);
1038 gPad->SetTopMargin(top);
1039 gPad->SetBottomMargin(bottom);
1040 fhQA[kSigmaDcaZ][0]->SetStats(kFALSE);
1041 fhQA[kSigmaDcaZ][0]->Draw();
1042 fhQA[kSigmaDcaZ][1]->Draw("same");
1045 gPad->SetRightMargin(right);
1046 gPad->SetLeftMargin(left);
1047 gPad->SetTopMargin(top);
1048 gPad->SetBottomMargin(bottom);
1049 fhQA[kCutNSigmaToVertex][0]->SetStats(kFALSE);
1050 fhQA[kCutNSigmaToVertex][0]->Draw();
1051 fhQA[kCutNSigmaToVertex][1]->Draw("same");
1054 gPad->SetRightMargin(right);
1055 gPad->SetLeftMargin(left);
1056 gPad->SetTopMargin(top);
1057 gPad->SetBottomMargin(bottom);
1058 fhQA[kCutRequireSigmaToVertex][0]->SetStats(kFALSE);
1059 fhQA[kCutRequireSigmaToVertex][0]->Draw();
1060 fhQA[kCutRequireSigmaToVertex][1]->Draw("same");
1063 gPad->SetRightMargin(right);
1064 gPad->SetLeftMargin(left);
1065 gPad->SetTopMargin(top);
1066 gPad->SetBottomMargin(bottom);
1067 fhQA[kCutAcceptKinkDaughters][0]->SetStats(kFALSE);
1068 fhQA[kCutAcceptKinkDaughters][0]->Draw();
1069 fhQA[kCutAcceptKinkDaughters][1]->Draw("same");
1071 canvas4->SaveAs(Form("%s.eps", canvas4->GetName()));
1072 canvas4->SaveAs(Form("%s.ps", canvas4->GetName()));
1074 //__________________________________________________________________________________
1075 void AliCFTrackIsPrimaryCuts::AddQAHistograms(TList *qaList) {
1077 // saves the histograms in a TList
1081 qaList->Add(fhCutStatistics);
1082 qaList->Add(fhCutCorrelation);
1084 for (Int_t j=0; j<kNStepQA; j++) {
1085 qaList->Add(fhDcaXYvsDcaZ[j]);
1086 for(Int_t i=0; i<kNHist; i++)
1087 qaList->Add(fhQA[i][j]);