coverity fixes
[u/mrichter/AliRoot.git] / CORRFW / AliCFTrackIsPrimaryCuts.cxx
CommitLineData
563113d0 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
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
22// ESD and AOD data.
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:
89d7d478 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
563113d0 31// - require that the dca calculation doesn't fail
32// - accept or not accept daughter tracks of kink decays
33//
c66800ea 34// By default, the distance to 'vertex calculated from tracks' is used.
c2c45ca4 35// Optionally the SPD (tracklet based) or TPC (TPC only tracks based) vertex
36// can be used.
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.
c66800ea 40//
563113d0 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.
45//
46// author: I. Kraus (Ingrid.Kraus@cern.ch)
47// idea taken form
48// AliESDtrackCuts writte by Jan Fiete Grosse-Oetringhaus and
49// AliRsnDaughterCut class written by A. Pulvirenti.
50
51#include <TCanvas.h>
52#include <TDirectory.h>
563113d0 53#include <TH2.h>
62037e79 54#include <TBits.h>
55
563113d0 56#include <AliESDtrack.h>
03f487b1 57#include <AliAODTrack.h>
8f7575ff 58#include <AliESDEvent.h>
03f487b1 59#include <AliAODEvent.h>
563113d0 60#include <AliLog.h>
61#include "AliCFTrackIsPrimaryCuts.h"
62
63ClassImp(AliCFTrackIsPrimaryCuts)
64
65//__________________________________________________________________________________
66AliCFTrackIsPrimaryCuts::AliCFTrackIsPrimaryCuts() :
67 AliCFCutBase(),
03f487b1 68 fEvt(0x0),
c2c45ca4 69 fUseSPDvertex(0),
c66800ea 70 fUseTPCvertex(0),
89d7d478 71 fMinDCAToVertexXY(0),
72 fMinDCAToVertexZ(0),
73 fMaxDCAToVertexXY(0),
74 fMaxDCAToVertexZ(0),
75 fDCAToVertex2D(0),
76 fAbsDCAToVertex(0),
77 fNSigmaToVertexMin(0),
563113d0 78 fNSigmaToVertexMax(0),
89d7d478 79 fSigmaDCAxy(0),
80 fSigmaDCAz(0),
563113d0 81 fRequireSigmaToVertex(0),
8edd0c2c 82 fAODType(AliAODTrack::kUndef),
563113d0 83 fAcceptKinkDaughters(0),
84 fhCutStatistics(0),
85 fhCutCorrelation(0),
86 fBitmap(0x0),
87 fhNBinsNSigma(0),
88 fhNBinsRequireSigma(0),
89 fhNBinsAcceptKink(0),
90 fhNBinsDcaXY(0),
91 fhNBinsDcaZ(0),
92 fhNBinsDcaXYnorm(0),
93 fhNBinsDcaZnorm(0),
89d7d478 94 fhNBinsSigmaDcaXY(0),
95 fhNBinsSigmaDcaZ(0),
563113d0 96 fhBinLimNSigma(0x0),
97 fhBinLimRequireSigma(0x0),
98 fhBinLimAcceptKink(0x0),
99 fhBinLimDcaXY(0x0),
100 fhBinLimDcaZ(0x0),
101 fhBinLimDcaXYnorm(0x0),
89d7d478 102 fhBinLimDcaZnorm(0x0),
103 fhBinLimSigmaDcaXY(0x0),
104 fhBinLimSigmaDcaZ(0x0)
563113d0 105{
106 //
107 // Default constructor
108 //
563113d0 109 Initialise();
110}
111//__________________________________________________________________________________
112AliCFTrackIsPrimaryCuts::AliCFTrackIsPrimaryCuts(Char_t* name, Char_t* title) :
113 AliCFCutBase(name,title),
03f487b1 114 fEvt(0x0),
c2c45ca4 115 fUseSPDvertex(0),
c66800ea 116 fUseTPCvertex(0),
89d7d478 117 fMinDCAToVertexXY(0),
118 fMinDCAToVertexZ(0),
119 fMaxDCAToVertexXY(0),
120 fMaxDCAToVertexZ(0),
121 fDCAToVertex2D(0),
122 fAbsDCAToVertex(0),
123 fNSigmaToVertexMin(0),
563113d0 124 fNSigmaToVertexMax(0),
89d7d478 125 fSigmaDCAxy(0),
126 fSigmaDCAz(0),
563113d0 127 fRequireSigmaToVertex(0),
8edd0c2c 128 fAODType(AliAODTrack::kUndef),
563113d0 129 fAcceptKinkDaughters(0),
130 fhCutStatistics(0),
131 fhCutCorrelation(0),
132 fBitmap(0x0),
133 fhNBinsNSigma(0),
134 fhNBinsRequireSigma(0),
135 fhNBinsAcceptKink(0),
136 fhNBinsDcaXY(0),
137 fhNBinsDcaZ(0),
138 fhNBinsDcaXYnorm(0),
139 fhNBinsDcaZnorm(0),
89d7d478 140 fhNBinsSigmaDcaXY(0),
141 fhNBinsSigmaDcaZ(0),
563113d0 142 fhBinLimNSigma(0x0),
143 fhBinLimRequireSigma(0x0),
144 fhBinLimAcceptKink(0x0),
145 fhBinLimDcaXY(0x0),
146 fhBinLimDcaZ(0x0),
147 fhBinLimDcaXYnorm(0x0),
89d7d478 148 fhBinLimDcaZnorm(0x0),
149 fhBinLimSigmaDcaXY(0x0),
150 fhBinLimSigmaDcaZ(0x0)
563113d0 151{
152 //
153 // Constructor
154 //
563113d0 155 Initialise();
156}
157//__________________________________________________________________________________
158AliCFTrackIsPrimaryCuts::AliCFTrackIsPrimaryCuts(const AliCFTrackIsPrimaryCuts& c) :
159 AliCFCutBase(c),
03f487b1 160 fEvt(c.fEvt),
c2c45ca4 161 fUseSPDvertex(c.fUseSPDvertex),
c66800ea 162 fUseTPCvertex(c.fUseTPCvertex),
89d7d478 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),
563113d0 170 fNSigmaToVertexMax(c.fNSigmaToVertexMax),
89d7d478 171 fSigmaDCAxy(c.fSigmaDCAxy),
172 fSigmaDCAz(c.fSigmaDCAz),
563113d0 173 fRequireSigmaToVertex(c.fRequireSigmaToVertex),
8edd0c2c 174 fAODType(c.fAODType),
563113d0 175 fAcceptKinkDaughters(c.fAcceptKinkDaughters),
176 fhCutStatistics(c.fhCutStatistics),
177 fhCutCorrelation(c.fhCutCorrelation),
178 fBitmap(c.fBitmap),
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),
89d7d478 186 fhNBinsSigmaDcaXY(c.fhNBinsSigmaDcaXY),
187 fhNBinsSigmaDcaZ(c.fhNBinsSigmaDcaZ),
563113d0 188 fhBinLimNSigma(c.fhBinLimNSigma),
189 fhBinLimRequireSigma(c.fhBinLimRequireSigma),
190 fhBinLimAcceptKink(c.fhBinLimAcceptKink),
191 fhBinLimDcaXY(c.fhBinLimDcaXY),
192 fhBinLimDcaZ(c.fhBinLimDcaZ),
193 fhBinLimDcaXYnorm(c.fhBinLimDcaXYnorm),
89d7d478 194 fhBinLimDcaZnorm(c.fhBinLimDcaZnorm),
195 fhBinLimSigmaDcaXY(c.fhBinLimSigmaDcaXY),
196 fhBinLimSigmaDcaZ(c.fhBinLimSigmaDcaZ)
563113d0 197{
198 //
199 // copy constructor
200 //
201 ((AliCFTrackIsPrimaryCuts &) c).Copy(*this);
202}
203//__________________________________________________________________________________
204AliCFTrackIsPrimaryCuts& AliCFTrackIsPrimaryCuts::operator=(const AliCFTrackIsPrimaryCuts& c)
205{
206 //
207 // Assignment operator
208 //
209 if (this != &c) {
210 AliCFCutBase::operator=(c) ;
03f487b1 211 fEvt = c.fEvt;
c2c45ca4 212 fUseSPDvertex = c.fUseSPDvertex;
c66800ea 213 fUseTPCvertex = c.fUseTPCvertex;
89d7d478 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 ;
563113d0 221 fNSigmaToVertexMax = c.fNSigmaToVertexMax ;
89d7d478 222 fSigmaDCAxy = c.fSigmaDCAxy ;
223 fSigmaDCAz = c.fSigmaDCAz ;
563113d0 224 fRequireSigmaToVertex = c.fRequireSigmaToVertex ;
8edd0c2c 225 fAODType = c.fAODType ;
563113d0 226 fAcceptKinkDaughters = c.fAcceptKinkDaughters ;
227 fhCutStatistics = c.fhCutStatistics ;
228 fhCutCorrelation = c.fhCutCorrelation ;
229 fBitmap = c.fBitmap;
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;
89d7d478 237 fhNBinsSigmaDcaXY = c.fhNBinsSigmaDcaXY;
238 fhNBinsSigmaDcaZ = c.fhNBinsSigmaDcaZ;
563113d0 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;
89d7d478 246 fhBinLimSigmaDcaXY = c.fhBinLimSigmaDcaXY;
247 fhBinLimSigmaDcaZ = c.fhBinLimSigmaDcaZ;
62037e79 248
c66800ea 249 for (Int_t j=0; j<6; j++) fDCA[j] = c.fDCA[j];
8edd0c2c 250 for (Int_t j=0; j<c.kNStepQA; j++){
251 if(c.fhDcaXYvsDcaZ[j]) fhDcaXYvsDcaZ[j] = (TH2F*)c.fhDcaXYvsDcaZ[j]->Clone();
8edd0c2c 252 for (Int_t i=0; i<c.kNHist; i++){
563113d0 253 if(c.fhQA[i][j]) fhQA[i][j] = (TH1F*)c.fhQA[i][j]->Clone();
563113d0 254 }
255 }
563113d0 256 ((AliCFTrackIsPrimaryCuts &) c).Copy(*this);
257 }
258 return *this;
259}
260//__________________________________________________________________________________
261AliCFTrackIsPrimaryCuts::~AliCFTrackIsPrimaryCuts()
262{
263 //
264 // destructor
265 //
266 if (fhCutStatistics) delete fhCutStatistics;
267 if (fhCutCorrelation) delete fhCutCorrelation;
268
269 for (Int_t j=0; j<kNStepQA; j++){
62037e79 270 if(fhDcaXYvsDcaZ[j]) delete fhDcaXYvsDcaZ[j];
62037e79 271 for (Int_t i=0; i<kNHist; i++)
272 if(fhQA[i][j]) delete fhQA[i][j];
563113d0 273 }
03f487b1 274 if(fEvt) delete fEvt;
62037e79 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;
89d7d478 283 if(fhBinLimSigmaDcaXY) delete fhBinLimSigmaDcaXY;
284 if(fhBinLimSigmaDcaZ) delete fhBinLimSigmaDcaZ;
563113d0 285}
286//__________________________________________________________________________________
287void AliCFTrackIsPrimaryCuts::Initialise()
288{
289 //
290 // sets everything to zero
291 //
c2c45ca4 292 fUseSPDvertex = 0;
c66800ea 293 fUseTPCvertex = 0;
89d7d478 294 fMinDCAToVertexXY = 0;
295 fMinDCAToVertexZ = 0;
296 fMaxDCAToVertexXY = 0;
297 fMaxDCAToVertexZ = 0;
298 fDCAToVertex2D = 0;
299 fAbsDCAToVertex = 0;
300 fNSigmaToVertexMin = 0;
563113d0 301 fNSigmaToVertexMax = 0;
89d7d478 302 fSigmaDCAxy = 0;
303 fSigmaDCAz = 0;
563113d0 304 fRequireSigmaToVertex = 0;
305 fAcceptKinkDaughters = 0;
8edd0c2c 306 fAODType = AliAODTrack::kUndef;
563113d0 307
89d7d478 308 SetMinDCAToVertexXY();
309 SetMinDCAToVertexZ();
310 SetMaxDCAToVertexXY();
311 SetMaxDCAToVertexZ();
312 SetDCAToVertex2D();
313 SetAbsDCAToVertex();
314 SetMinNSigmaToVertex();
563113d0 315 SetMaxNSigmaToVertex();
89d7d478 316 SetMaxSigmaDCAxy();
317 SetMaxSigmaDCAz();
563113d0 318 SetRequireSigmaToVertex();
cced7196 319 SetAcceptKinkDaughters();
8edd0c2c 320 SetAODType();
563113d0 321
c66800ea 322 for (Int_t j=0; j<6; j++) fDCA[j] = 0.;
563113d0 323 for (Int_t j=0; j<kNStepQA; j++) {
563113d0 324 fhDcaXYvsDcaZ[j] = 0x0;
62037e79 325 for (Int_t i=0; i<kNHist; i++)
326 fhQA[i][j] = 0x0;
563113d0 327 }
328 fhCutStatistics = 0;
329 fhCutCorrelation = 0;
62037e79 330 fBitmap=new TBits(0);
331
563113d0 332 //set default bining for QA histograms
c66800ea 333 SetHistogramBins(kCutNSigmaToVertex,100,0.,10.);
62037e79 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.);
89d7d478 340 SetHistogramBins(kSigmaDcaXY,500,-0.1,0.9);
341 SetHistogramBins(kSigmaDcaZ,500,-0.1,0.9);
563113d0 342}
343//__________________________________________________________________________________
344void AliCFTrackIsPrimaryCuts::Copy(TObject &c) const
345{
346 //
347 // Copy function
348 //
349 AliCFTrackIsPrimaryCuts& target = (AliCFTrackIsPrimaryCuts &) c;
350
351 target.Initialise();
352
353 if (fhCutStatistics) target.fhCutStatistics = (TH1F*) fhCutStatistics->Clone();
354 if (fhCutCorrelation) target.fhCutCorrelation = (TH2F*) fhCutCorrelation->Clone();
355
c66800ea 356 for (Int_t j=0; j<6; j++) target.fDCA[j] = fDCA[j];
563113d0 357 for (Int_t j=0; j<kNStepQA; j++){
563113d0 358 if(fhDcaXYvsDcaZ[j]) target.fhDcaXYvsDcaZ[j] = (TH2F*)fhDcaXYvsDcaZ[j]->Clone();
62037e79 359 for (Int_t i=0; i<kNHist; i++)
360 if(fhQA[i][j]) target.fhQA[i][j] = (TH1F*)fhQA[i][j]->Clone();
563113d0 361 }
563113d0 362 TNamed::Copy(c);
363}
563113d0 364//__________________________________________________________________________________
03f487b1 365void AliCFTrackIsPrimaryCuts::SetRecEventInfo(const TObject* evt) {
c2c45ca4 366 //
03f487b1 367 // Sets pointer to event information (AliESDEvent or AliAODEvent)
c2c45ca4 368 //
03f487b1 369 if (!evt) {
370 AliError("Pointer to AliVEvent !");
c2c45ca4 371 return;
372 }
03f487b1 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 !");
c2c45ca4 376 return ;
377 }
03f487b1 378 fEvt = (AliVEvent*) evt;
c2c45ca4 379}
380//__________________________________________________________________________________
381void AliCFTrackIsPrimaryCuts::UseSPDvertex(Bool_t b) {
382 fUseSPDvertex = b;
84a7f48a 383 if(fUseTPCvertex && fUseSPDvertex) {
384 fUseSPDvertex = kFALSE;
385 AliError("SPD and TPC vertex chosen. TPC vertex is preferred.");
386 }
c2c45ca4 387}
388//__________________________________________________________________________________
389void AliCFTrackIsPrimaryCuts::UseTPCvertex(Bool_t b) {
390 fUseTPCvertex = b;
391 if(fUseTPCvertex) fUseSPDvertex = kFALSE;
392}
393//__________________________________________________________________________________
c66800ea 394void AliCFTrackIsPrimaryCuts::GetDCA(AliESDtrack* esdTrack)
395{
396 if (!esdTrack) return;
397
398 Float_t b[2] = {0.,0.};
399 Float_t bCov[3] = {0.,0.,0.};
c2c45ca4 400 if(!fUseSPDvertex && !fUseTPCvertex) esdTrack->GetImpactParameters(b,bCov);
401 if( fUseTPCvertex) esdTrack->GetImpactParametersTPC(b,bCov);
402
403 if( fUseSPDvertex) {
03f487b1 404 if (!fEvt) return;
405 AliESDEvent * evt = 0x0 ;
406 evt = dynamic_cast<AliESDEvent*>(fEvt);
407 const AliESDVertex *vtx = evt->GetVertex();
408 const Double_t Bz = evt->GetMagneticField();
c2c45ca4 409 AliExternalTrackParam *cParam = 0;
410 Bool_t success = esdTrack->RelateToVertex(vtx, Bz, kVeryBig, cParam);
411 if (success) esdTrack->GetImpactParameters(b,bCov);
412 }
c66800ea 413
414 if (bCov[0]<=0 || bCov[2]<=0) {
415 bCov[0]=0; bCov[2]=0;
416 }
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
421
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
425 }
426
427 // get n_sigma
c2c45ca4 428 if(!fUseSPDvertex && !fUseTPCvertex)
c66800ea 429 fDCA[5] = AliESDtrackCuts::GetSigmaToVertex(esdTrack);
430
431 if(fUseTPCvertex) {
432 fDCA[5] = -1;
433 if (fDCA[2]==0 || fDCA[3]==0)
434 return;
435 fDCA[5] = 1000.;
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)
438 return;
439 fDCA[5] = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
440 }
441 return;
442}
443//__________________________________________________________________________________
03f487b1 444void AliCFTrackIsPrimaryCuts::GetDCA(AliAODTrack* aodTrack)
445{
446 if (!aodTrack) return;
447
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.};
450
451 aodTrack->XYZAtDCA(p); // position at DCA
452 aodTrack->GetCovarianceXYZPxPyPz(cov);
453
454
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
460 return;
461 }
462
463 if (!fEvt) return;
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]);
475 b[1] = p[2];
476 // resolution
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
481
482 if (bCov[0]<=0 || bCov[2]<=0) {
483 bCov[0]=0; bCov[2]=0;
484 }
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
489
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
494 }
495
496 // get n_sigma
497 if (fDCA[2]==0 || fDCA[3]==0)
498 return;
499 fDCA[5] = 1000.;
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)
502 return;
503 fDCA[5] = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
504
505 return;
506}
507//__________________________________________________________________________________
107a3100 508void AliCFTrackIsPrimaryCuts::SelectionBitMap(TObject* obj)
563113d0 509{
510 //
511 // test if the track passes the single cuts
512 // and store the information in a bitmap
513 //
514
515 // bitmap stores the decision of each single cut
516 for(Int_t i=0; i<kNCuts; i++)fBitmap->SetBitNumber(i,kFALSE);
517
107a3100 518 // check TObject and cast into ESDtrack
519 if (!obj) return;
8edd0c2c 520 if (!obj->InheritsFrom("AliVParticle")) {
521 AliError("object must derived from AliVParticle !");
522 return;
523 }
524
525 Bool_t isESDTrack = strcmp(obj->ClassName(),"AliESDtrack") == 0 ? kTRUE : kFALSE ;
526 Bool_t isAODTrack = strcmp(obj->ClassName(),"AliAODTrack") == 0 ? kTRUE : kFALSE ;
527
528 AliESDtrack * esdTrack = 0x0 ;
529 AliAODTrack * aodTrack = 0x0 ;
530 if (isESDTrack) esdTrack = dynamic_cast<AliESDtrack*>(obj);
531 if (isAODTrack) aodTrack = dynamic_cast<AliAODTrack*>(obj);
563113d0 532
8edd0c2c 533 // get the track to vertex parameter for ESD track
c66800ea 534 if (isESDTrack) GetDCA(esdTrack);
03f487b1 535 if (isAODTrack) GetDCA(aodTrack);
536
537 // check whether dca info is filled
538 Bool_t dcaInfo = 0;
539 if (fDCA[0]>-990. && fDCA[1]>-990.) dcaInfo = 1;
89d7d478 540
c66800ea 541 Float_t bxy = 0, bz = 0;
03f487b1 542 bxy = TMath::Abs(fDCA[0]);
543 bz = TMath::Abs(fDCA[1]);
544
89d7d478 545 Float_t b2Dmin = 0, b2Dmax = 0;
03f487b1 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;
550
563113d0 551
552 // fill the bitmap
553 Int_t iCutBit = 0;
8edd0c2c 554
03f487b1 555 if (!dcaInfo || fDCAToVertex2D || (!fDCAToVertex2D && bxy >= fMinDCAToVertexXY && bxy <= fMaxDCAToVertexXY))
556 fBitmap->SetBitNumber(iCutBit,kTRUE);
89d7d478 557 iCutBit++;
558
03f487b1 559 if (!dcaInfo || fDCAToVertex2D || (!fDCAToVertex2D && bz >= fMinDCAToVertexZ && bz <= fMaxDCAToVertexZ))
560 fBitmap->SetBitNumber(iCutBit,kTRUE);
89d7d478 561 iCutBit++;
562
03f487b1 563 if (!dcaInfo || !fDCAToVertex2D || (fDCAToVertex2D && TMath::Sqrt(b2Dmin) > 1 && TMath::Sqrt(b2Dmax) < 1))
8edd0c2c 564 fBitmap->SetBitNumber(iCutBit,kTRUE);
563113d0 565 iCutBit++;
8edd0c2c 566
3d266236 567 if (!dcaInfo || (fDCA[5] >= fNSigmaToVertexMin && fDCA[5] <= fNSigmaToVertexMax))
89d7d478 568 fBitmap->SetBitNumber(iCutBit,kTRUE);
89d7d478 569 iCutBit++;
570
03f487b1 571 if (!dcaInfo || fDCA[2] < fSigmaDCAxy)
89d7d478 572 fBitmap->SetBitNumber(iCutBit,kTRUE);
89d7d478 573 iCutBit++;
574
03f487b1 575 if (!dcaInfo || fDCA[3] < fSigmaDCAz)
89d7d478 576 fBitmap->SetBitNumber(iCutBit,kTRUE);
89d7d478 577 iCutBit++;
578
03f487b1 579 if (!dcaInfo || !fRequireSigmaToVertex || (fDCA[5]>=0 && fRequireSigmaToVertex))
8edd0c2c 580 fBitmap->SetBitNumber(iCutBit,kTRUE);
563113d0 581 iCutBit++;
563113d0 582
03f487b1 583 if (!dcaInfo || fAcceptKinkDaughters || (!fAcceptKinkDaughters && esdTrack->GetKinkIndex(0)<=0))
8edd0c2c 584 fBitmap->SetBitNumber(iCutBit,kTRUE);
8edd0c2c 585 iCutBit++;
03f487b1 586
8edd0c2c 587 if (isAODTrack) {
588 if (fAODType==AliAODTrack::kUndef || fAODType == aodTrack->GetType()) {
589 fBitmap->SetBitNumber(iCutBit,kTRUE);
590 }
591 }
592 else fBitmap->SetBitNumber(iCutBit,kTRUE);
03f487b1 593
107a3100 594 return;
563113d0 595}
596//__________________________________________________________________________________
9eeae5d5 597Bool_t AliCFTrackIsPrimaryCuts::IsSelected(TObject* obj) {
563113d0 598 //
599 // loops over decisions of single cuts and returns if the track is accepted
600 //
107a3100 601 SelectionBitMap(obj);
563113d0 602
107a3100 603 if (fIsQAOn) FillHistograms(obj,0);
563113d0 604 Bool_t isSelected = kTRUE;
605
107a3100 606 for (UInt_t icut=0; icut<fBitmap->GetNbits();icut++) {
607 if(!fBitmap->TestBitNumber(icut)) {
608 isSelected = kFALSE;
609 break;
610 }
611 }
03f487b1 612
107a3100 613 if (!isSelected) return kFALSE ;
614 if (fIsQAOn) FillHistograms(obj,1);
615 return kTRUE;
563113d0 616}
617//__________________________________________________________________________________
618void AliCFTrackIsPrimaryCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t *bins)
619{
620 //
621 // variable bin size
622 //
623 if(!fIsQAOn) return;
624
625 switch(index){
626 case kCutNSigmaToVertex:
db6722a5 627 fhNBinsNSigma=nbins+1;
563113d0 628 fhBinLimNSigma=new Double_t[nbins+1];
629 for(Int_t i=0;i<nbins+1;i++)fhBinLimNSigma[i]=bins[i];
630 break;
631
632 case kCutRequireSigmaToVertex:
db6722a5 633 fhNBinsRequireSigma=nbins+1;
563113d0 634 fhBinLimRequireSigma=new Double_t[nbins+1];
635 for(Int_t i=0;i<nbins+1;i++)fhBinLimRequireSigma[i]=bins[i];
636 break;
637
638 case kCutAcceptKinkDaughters:
db6722a5 639 fhNBinsAcceptKink=nbins+1;
563113d0 640 fhBinLimAcceptKink=new Double_t[nbins+1];
641 for(Int_t i=0;i<nbins+1;i++)fhBinLimAcceptKink[i]=bins[i];
642 break;
643
644 case kDcaXY:
db6722a5 645 fhNBinsDcaXY=nbins+1;
563113d0 646 fhBinLimDcaXY=new Double_t[nbins+1];
647 for(Int_t i=0;i<nbins+1;i++)fhBinLimDcaXY[i]=bins[i];
648 break;
62037e79 649
563113d0 650 case kDcaZ:
db6722a5 651 fhNBinsDcaZ=nbins+1;
563113d0 652 fhBinLimDcaZ=new Double_t[nbins+1];
653 for(Int_t i=0;i<nbins+1;i++)fhBinLimDcaZ[i]=bins[i];
654 break;
62037e79 655
563113d0 656 case kDcaXYnorm:
db6722a5 657 fhNBinsDcaXYnorm=nbins+1;
563113d0 658 fhBinLimDcaXYnorm=new Double_t[nbins+1];
659 for(Int_t i=0;i<nbins+1;i++)fhBinLimDcaXYnorm[i]=bins[i];
660 break;
62037e79 661
563113d0 662 case kDcaZnorm:
db6722a5 663 fhNBinsDcaZnorm=nbins+1;
563113d0 664 fhBinLimDcaZnorm=new Double_t[nbins+1];
665 for(Int_t i=0;i<nbins+1;i++)fhBinLimDcaZnorm[i]=bins[i];
666 break;
89d7d478 667
668 case kSigmaDcaXY:
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];
672 break;
673
674 case kSigmaDcaZ:
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];
678 break;
563113d0 679 }
680}
681//__________________________________________________________________________________
682void AliCFTrackIsPrimaryCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t xmin, Double_t xmax)
683{
684 //
685 // fixed bin size
686 //
563113d0 687 switch(index){
688 case kCutNSigmaToVertex:
db6722a5 689 fhNBinsNSigma=nbins+1;
563113d0 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);
692 break;
693
694 case kCutRequireSigmaToVertex:
db6722a5 695 fhNBinsRequireSigma=nbins+1;
563113d0 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);
698 break;
699
700 case kCutAcceptKinkDaughters:
db6722a5 701 fhNBinsAcceptKink=nbins+1;
563113d0 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);
704 break;
705
706 case kDcaXY:
db6722a5 707 fhNBinsDcaXY=nbins+1;
563113d0 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);
710 break;
62037e79 711
563113d0 712 case kDcaZ:
db6722a5 713 fhNBinsDcaZ=nbins+1;
563113d0 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);
716 break;
62037e79 717
563113d0 718 case kDcaXYnorm:
db6722a5 719 fhNBinsDcaXYnorm=nbins+1;
563113d0 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);
722 break;
62037e79 723
563113d0 724 case kDcaZnorm:
db6722a5 725 fhNBinsDcaZnorm=nbins+1;
563113d0 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);
728 break;
89d7d478 729
730 case kSigmaDcaXY:
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);
734 break;
735
736 case kSigmaDcaZ:
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);
740 break;
563113d0 741 }
742}
743//__________________________________________________________________________________
744 void AliCFTrackIsPrimaryCuts::DefineHistograms() {
745 //
746 // histograms for cut variables, cut statistics and cut correlations
747 //
563113d0 748 Int_t color = 2;
749
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);
89d7d478 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");
563113d0 762
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);
89d7d478 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");
774
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");
563113d0 784
785 // book QA histograms
786 Char_t str[256];
787 for (Int_t i=0; i<kNStepQA; i++) {
788 if (i==0) sprintf(str," ");
789 else sprintf(str,"_cut");
62037e79 790
563113d0 791 fhDcaXYvsDcaZ[i] = new TH2F(Form("%s_dcaXYvsDcaZ%s",GetName(),str),"",200,-10,10,200,-10,10);
db6722a5 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);
89d7d478 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);
563113d0 801
802 fhDcaXYvsDcaZ[i]->SetXTitle("impact par. d_{z}");
803 fhDcaXYvsDcaZ[i]->SetYTitle("impact par. d_{xy}");
563113d0 804
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}");
89d7d478 812 fhQA[kSigmaDcaXY][i]->SetXTitle("impact par. resolution #sigma_{xy}");
813 fhQA[kSigmaDcaZ][i]->SetXTitle("impact par. resolution #sigma_{z}");
563113d0 814 }
563113d0 815 for(Int_t i=0; i<kNHist; i++) fhQA[i][1]->SetLineColor(color);
563113d0 816}
817//__________________________________________________________________________________
818void AliCFTrackIsPrimaryCuts::FillHistograms(TObject* obj, Bool_t f)
819{
820 //
821 // fill the QA histograms
822 //
563113d0 823
107a3100 824 if (!obj) return;
563113d0 825
8edd0c2c 826 Bool_t isESDTrack = strcmp(obj->ClassName(),"AliESDtrack") == 0 ? kTRUE : kFALSE ;
827 Bool_t isAODTrack = strcmp(obj->ClassName(),"AliAODTrack") == 0 ? kTRUE : kFALSE ;
563113d0 828
8edd0c2c 829 AliESDtrack * esdTrack = 0x0 ;
830 AliAODTrack * aodTrack = 0x0 ;
831 if (isESDTrack) esdTrack = dynamic_cast<AliESDtrack*>(obj);
832 if (isAODTrack) aodTrack = dynamic_cast<AliAODTrack*>(obj);
563113d0 833
8edd0c2c 834 // f = 0: fill histograms before cuts
835 // f = 1: fill histograms after cuts
563113d0 836
89d7d478 837 // get the track to vertex parameter for ESD track
8edd0c2c 838 if (esdTrack) {
563113d0 839
c66800ea 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]);
848
849 fhQA[kCutNSigmaToVertex][f]->Fill(fDCA[5]);
f5b77140 850 if (fDCA[5]<0 && fRequireSigmaToVertex)
851 fhQA[kCutRequireSigmaToVertex][f]->Fill(0.);
852 else
853 fhQA[kCutRequireSigmaToVertex][f]->Fill(1.);
854
855 if (!fAcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
856 fhQA[kCutAcceptKinkDaughters][f]->Fill(0.);
857 else
858 fhQA[kCutAcceptKinkDaughters][f]->Fill(1.);
8edd0c2c 859 }
c66800ea 860
563113d0 861 // fill cut statistics and cut correlation histograms with information from the bitmap
862 if (f) return;
863
864 // Get the bitmap of the single cuts
865 if ( !obj ) return;
107a3100 866 SelectionBitMap(obj);
563113d0 867
868 // Number of single cuts in this class
107a3100 869 UInt_t ncuts = fBitmap->GetNbits();
563113d0 870 for(UInt_t bit=0; bit<ncuts;bit++) {
107a3100 871 if (!fBitmap->TestBitNumber(bit)) {
563113d0 872 fhCutStatistics->Fill(bit+1);
873 for (UInt_t bit2=bit; bit2<ncuts;bit2++) {
107a3100 874 if (!fBitmap->TestBitNumber(bit2))
563113d0 875 fhCutCorrelation->Fill(bit+1,bit2+1);
876 }
877 }
878 }
879}
880//__________________________________________________________________________________
881void AliCFTrackIsPrimaryCuts::SaveHistograms(const Char_t* dir) {
882 //
883 // saves the histograms in a directory (dir)
884 //
885 if(!fIsQAOn) return;
886
887 if (!dir)
888 dir = GetName();
889
890 gDirectory->mkdir(dir);
891 gDirectory->cd(dir);
892
893 gDirectory->mkdir("before_cuts");
894 gDirectory->mkdir("after_cuts");
895
896 fhCutStatistics->Write();
897 fhCutCorrelation->Write();
898
899 for (Int_t j=0; j<kNStepQA; j++) {
900 if (j==0)
901 gDirectory->cd("before_cuts");
902 else
903 gDirectory->cd("after_cuts");
904
905 fhDcaXYvsDcaZ[j] ->Write();
563113d0 906
907 for(Int_t i=0; i<kNHist; i++) fhQA[i][j]->Write();
908
909 gDirectory->cd("../");
910 }
911 gDirectory->cd("../");
912}
913//__________________________________________________________________________________
914void AliCFTrackIsPrimaryCuts::DrawHistograms()
915{
916 //
917 // draws some histograms
918 //
919 if(!fIsQAOn) return;
920
921 // pad margins
922 Float_t right = 0.03;
923 Float_t left = 0.175;
924 Float_t top = 0.03;
925 Float_t bottom = 0.175;
926
927 TCanvas* canvas1 = new TCanvas("Track_QA_Primary_1", "Track QA Primary 1", 800, 500);
928 canvas1->Divide(2, 1);
929
930 canvas1->cd(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();
938
939 canvas1->cd(2);
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");
947
948 canvas1->SaveAs(Form("%s.eps", canvas1->GetName()));
949 canvas1->SaveAs(Form("%s.ps", canvas1->GetName()));
950
951 // -----
952
953 TCanvas* canvas2 = new TCanvas("Track_QA_Primary_2", "Track QA Primary 2", 800, 800);
954 canvas2->Divide(2, 2);
955
956 canvas2->cd(1);
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");
964
965 canvas2->cd(2);
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");
973
974 canvas2->cd(3);
975// fhDXYvsDZ[0]->SetStats(kFALSE);
976 gPad->SetLogz();
977 gPad->SetLeftMargin(bottom);
978 gPad->SetTopMargin(0.1);
979 gPad->SetBottomMargin(bottom);
980 gPad->SetRightMargin(0.2);
981 fhDcaXYvsDcaZ[0]->Draw("COLZ");
982
983 canvas2->cd(4);
984// fhDXYvsDZ[1]->SetStats(kFALSE);
985 gPad->SetLogz();
986 gPad->SetLeftMargin(bottom);
987 gPad->SetTopMargin(0.1);
988 gPad->SetBottomMargin(bottom);
989 gPad->SetRightMargin(0.2);
990 fhDcaXYvsDcaZ[1]->Draw("COLZ");
991
992 canvas2->SaveAs(Form("%s.eps", canvas2->GetName()));
993 canvas2->SaveAs(Form("%s.ps", canvas2->GetName()));
994
995 // -----
996
c66800ea 997 TCanvas* canvas3 = new TCanvas("Track_QA_Primary_3", "Track QA Primary 3", 800, 400);
998 canvas3->Divide(2, 1);
563113d0 999
1000 canvas3->cd(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");
1008
1009 canvas3->cd(2);
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");
1017
563113d0 1018 canvas3->SaveAs(Form("%s.eps", canvas3->GetName()));
1019 canvas3->SaveAs(Form("%s.ps", canvas3->GetName()));
1020
1021 // -----
1022
89d7d478 1023 TCanvas* canvas4 = new TCanvas("Track_QA_Primary_4", "Track QA Primary 4", 1200, 800);
1024 canvas4->Divide(3, 2);
563113d0 1025
1026 canvas4->cd(1);
1027 gPad->SetRightMargin(right);
1028 gPad->SetLeftMargin(left);
1029 gPad->SetTopMargin(top);
1030 gPad->SetBottomMargin(bottom);
89d7d478 1031 fhQA[kSigmaDcaXY][0]->SetStats(kFALSE);
1032 fhQA[kSigmaDcaXY][0]->Draw();
1033 fhQA[kSigmaDcaXY][1]->Draw("same");
1034
1035 canvas4->cd(2);
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");
1043
1044 canvas4->cd(4);
1045 gPad->SetRightMargin(right);
1046 gPad->SetLeftMargin(left);
1047 gPad->SetTopMargin(top);
1048 gPad->SetBottomMargin(bottom);
563113d0 1049 fhQA[kCutNSigmaToVertex][0]->SetStats(kFALSE);
1050 fhQA[kCutNSigmaToVertex][0]->Draw();
1051 fhQA[kCutNSigmaToVertex][1]->Draw("same");
1052
89d7d478 1053 canvas4->cd(5);
563113d0 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");
1061
89d7d478 1062 canvas4->cd(6);
563113d0 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");
1070
1071 canvas4->SaveAs(Form("%s.eps", canvas4->GetName()));
1072 canvas4->SaveAs(Form("%s.ps", canvas4->GetName()));
1073}
1074//__________________________________________________________________________________
107a3100 1075void AliCFTrackIsPrimaryCuts::AddQAHistograms(TList *qaList) {
563113d0 1076 //
1077 // saves the histograms in a TList
1078 //
107a3100 1079 DefineHistograms();
563113d0 1080
1081 qaList->Add(fhCutStatistics);
1082 qaList->Add(fhCutCorrelation);
1083
1084 for (Int_t j=0; j<kNStepQA; j++) {
1085 qaList->Add(fhDcaXYvsDcaZ[j]);
563113d0 1086 for(Int_t i=0; i<kNHist; i++)
62037e79 1087 qaList->Add(fhQA[i][j]);
563113d0 1088 }
1089}