ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

// The class AliCFTrackIsPrimaryCut is designed to select reconstructed tracks
// with a small impact parameter and tracks which are (not) daughters of kink
// decays and to provide corresponding QA histograms.
// This class inherits from the Analysis' Framework abstract base class
// AliAnalysisCuts and is a part of the Correction Framework.
// This class acts on single, reconstructed tracks, it is applicable on
// ESD and AOD data.
// It mainly consists of a IsSelected function that returns a boolean.
// This function checks whether the considered track passes a set of cuts:
// - min. and max. distance to main vertex in transverse plane (xy)
// - min. and max. longitudinal distance to main vertex (z)
// - min. and max. distance to main vertex as ellpise in xy - z plane
// - all above cuts on absolute values or in units of sigma (resolution)
// - min. and max. distance to main vertex in units of sigma (resolution)
// - max. transverse (xy) and longitudinal (z) impact parameter resolution
// - require that the dca calculation doesn't fail
// - accept or not accept daughter tracks of kink decays
//
// By default, the distance to 'vertex calculated from tracks' is used.
// Optionally the SPD (tracklet based) or TPC (TPC only tracks based) vertex
// can be used.
// Note: the distance to the TPC-vertex is already stored in the ESD,
// the distance to the SPD-vertex has to be re-calculated by propagating each
// track while executing this cut.
//
// The cut values for these cuts are set with the corresponding set functions.
// All cut classes provided by the correction framework are supposed to be
// added in the Analysis Framwork's class AliAnalysisFilter and applied by
// the filter via a loop.
//
// author: I. Kraus (Ingrid.Kraus@cern.ch)
// idea taken form
// AliESDtrackCuts writte by Jan Fiete Grosse-Oetringhaus and
// AliRsnDaughterCut class written by A. Pulvirenti.

#ifndef ALICFTRACKISPRIMARYCUTS_H
#define ALICFTRACKISPRIMARYCUTS_H

#include "AliCFCutBase.h"
#include "AliAODTrack.h"
#include <TH2.h>
#include "AliESDtrackCuts.h"
class TBits;
class AliESDtrack;
class AliAODTrack;
class AliVEvent;

class AliCFTrackIsPrimaryCuts : public AliCFCutBase
{
 public :
  AliCFTrackIsPrimaryCuts() ;
  AliCFTrackIsPrimaryCuts(Char_t* name, Char_t* title) ;
  AliCFTrackIsPrimaryCuts(const AliCFTrackIsPrimaryCuts& c) ;
  AliCFTrackIsPrimaryCuts& operator=(const AliCFTrackIsPrimaryCuts& c) ;
  ~AliCFTrackIsPrimaryCuts();
  void Copy(TObject &c) const;

  Bool_t IsSelected(TObject* obj);
  Bool_t IsSelected(TList* /*list*/) {return kTRUE;}

  // cut value setter
  void UseSPDvertex(Bool_t b=kFALSE);
  void UseTPCvertex(Bool_t b=kFALSE);
  void SetMinDCAToVertexXY(Float_t dist=0.)             {fMinDCAToVertexXY = dist;}
  void SetMinDCAToVertexZ(Float_t dist=0.)              {fMinDCAToVertexZ = dist;}
  void SetMaxDCAToVertexXY(Float_t dist=1e10)           {fMaxDCAToVertexXY = dist;}
  void SetMaxDCAToVertexZ(Float_t dist=1e10)            {fMaxDCAToVertexZ = dist;}
  void SetDCAToVertex2D(Bool_t b=kFALSE)                {fDCAToVertex2D = b;}
  void SetAbsDCAToVertex(Bool_t b=kTRUE)                {fAbsDCAToVertex = b;}
  void SetMinNSigmaToVertex(Double_t sigmaMin=0.)	{fNSigmaToVertexMin = sigmaMin;}
  void SetMaxNSigmaToVertex(Double_t sigmaMax=1.e+10)	{fNSigmaToVertexMax = sigmaMax;}
  void SetMaxSigmaDCAxy(Double_t sigmaMax=1.e+10)	{fSigmaDCAxy = sigmaMax;}
  void SetMaxSigmaDCAz(Double_t sigmaMax=1.e+10)	{fSigmaDCAz = sigmaMax;}
  void SetRequireSigmaToVertex(Bool_t b=kFALSE)	        {fRequireSigmaToVertex=b;}
  void SetAcceptKinkDaughters(Bool_t b=kTRUE)	        {fAcceptKinkDaughters=b;}
  void SetAODType(Char_t type=AliAODTrack::kUndef)      {fAODType = type;}

  // QA histograms
  void DrawHistograms();
  void SaveHistograms(const Char_t* dir = 0);
  void AddQAHistograms(TList *qaList);
  // QA histogram setter
  // please use indices from the enumeration below
  void SetHistogramBins(Int_t index, Int_t nbins, Double_t *bins);
  void SetHistogramBins(Int_t index, Int_t nbins, Double_t xmin, Double_t xmax);
  virtual void SetRecEventInfo(const TObject* esd);

  // indeces/counters for single selections
  enum { 
    kCutNSigmaToVertex=0,	// tracks's distance to main vertex in units of sigma
    kCutRequireSigmaToVertex,	// calculation is successful
    kCutAcceptKinkDaughters,	// do (not) accept secondaries
    kDcaXY,			// controll histogram: dca in xy plane
    kDcaZ,			// controll histogram: dca along z axis
    kDcaXYnorm,			// controll histogram: normalised dca in xy plane
    kDcaZnorm,			// controll histogram: normalised dca along z axis
    kSigmaDcaXY,		// controll histogram: impact parameter resolution in transverse plane
    kSigmaDcaZ,			// controll histogram: impact parameter resolution along z axis
    kCutAODType,                // cut on AliAODTrack::fType
    kNCuts=9,			// number of single selections
    kNStepQA=2,			// number of QA steps (before/after the cuts)
    kNHist=9			// number of QA histograms
  };

 private:
  void SelectionBitMap(TObject* obj);
  void GetDCA(AliESDtrack* esdTrack);
  void GetDCA(AliAODTrack* aodTrack);
  void DefineHistograms(); 		// books histograms and TList
  void Initialise();			// sets everything to 0
  void FillHistograms(TObject* obj, Bool_t b);
					// Fills histograms before and after cuts
  AliVEvent*  fEvt;			// pointer to event, needed for SPD vertex and DCA in AODs
  Bool_t   fUseSPDvertex;		// flag: calculate dca to SPD-vertex, off by default
  Bool_t   fUseTPCvertex;		// flag: calculate dca to TPC-vertex, off by default
  Double_t fMinDCAToVertexXY;		// cut value: min distance to main vertex in transverse plane
  Double_t fMinDCAToVertexZ;		// cut value: min longitudinal distance to main vertex
  Double_t fMaxDCAToVertexXY;		// cut value: max distance to main vertex in transverse plane
  Double_t fMaxDCAToVertexZ;		// cut value: max longitudinal distance to main vertex
  Bool_t   fDCAToVertex2D;		// flag: cut on ellipse in xy - z plane
  Bool_t   fAbsDCAToVertex;		// flag: cut on absolute values or in units of sigma
  Double_t fNSigmaToVertexMin;		// cut value: min distance to main vertex in units of sigma
  Double_t fNSigmaToVertexMax;		// cut value: max distance to main vertex in units of sigma
  Double_t fSigmaDCAxy;			// cut value: impact parameter resolution in xy plane
  Double_t fSigmaDCAz;			// cut value: impact parameter resolution in z direction
  Double_t fDCA[6];			// impact parameters
  Bool_t   fRequireSigmaToVertex;	// require calculable distance to main vertex
  Char_t   fAODType;                    // type of AOD track (undef, primary, secondary, orphan)
                                        // applicable at AOD level only !

  TH2F* fhDcaXYvsDcaZ[2];		// Histogram: dca xy vs. z
  Bool_t fAcceptKinkDaughters;		// accepting kink daughters

  TH1F* fhCutStatistics;		// Histogram: statistics of what cuts the tracks did not survive
  TH2F* fhCutCorrelation;		// Histogram: 2d statistics plot

  TH1F* fhQA[kNHist][kNStepQA];		// QA Histograms
  TBits *fBitmap ; 			// stores single selection decisions

  // QA histogram setters
  Int_t fhNBinsNSigma;			// number of bins+1: dca in units of sigma
  Int_t fhNBinsRequireSigma;		// number of bins+1: require successful calcuation
  Int_t fhNBinsAcceptKink;		// number of bins+1: acceptkink daughters
  Int_t fhNBinsDcaXY;			// number of bins+1: dca in transverse plane
  Int_t fhNBinsDcaZ;			// number of bins+1: dca along beam axis
  Int_t fhNBinsDcaXYnorm;		// number of bins+1: normalised dca in transverse plane
  Int_t fhNBinsDcaZnorm;		// number of bins+1: normalised dca along beam axis
  Int_t fhNBinsSigmaDcaXY;		// number of bins+1: impact parameter resolution in transverse plane
  Int_t fhNBinsSigmaDcaZ;		// number of bins+1: impact parameter resolution along beam axis

  Double_t *fhBinLimNSigma; //[fhNBinsNSigma] bin limits: dca in units of sigma
  Double_t *fhBinLimRequireSigma;//[fhNBinsRequireSigma] bin limits: require successful calcuation
  Double_t *fhBinLimAcceptKink;//[fhNBinsAcceptKink] bin limits: acceptkink daughters
  Double_t *fhBinLimDcaXY;//[fhNBinsDcaXY] bin limits: dca in transverse plane
  Double_t *fhBinLimDcaZ; //[fhNBinsDcaZ] bin limits: dca along beam axis
  Double_t *fhBinLimDcaXYnorm; //[fhNBinsDcaXYnorm] bin limits: normalised dca in transverse plane
  Double_t *fhBinLimDcaZnorm;//[fhNBinsDcaZnorm] bin limits: normalised dca along beam axis
  Double_t *fhBinLimSigmaDcaXY; //[fhNBinsSigmaDcaXY] bin limits: impact parameter in transverse plane
  Double_t *fhBinLimSigmaDcaZ; //[fhNBinsSigmaDcaZ] bin limits: impact parameter along beam axis

  ClassDef(AliCFTrackIsPrimaryCuts,3);
};

#endif
 AliCFTrackIsPrimaryCuts.h:1
 AliCFTrackIsPrimaryCuts.h:2
 AliCFTrackIsPrimaryCuts.h:3
 AliCFTrackIsPrimaryCuts.h:4
 AliCFTrackIsPrimaryCuts.h:5
 AliCFTrackIsPrimaryCuts.h:6
 AliCFTrackIsPrimaryCuts.h:7
 AliCFTrackIsPrimaryCuts.h:8
 AliCFTrackIsPrimaryCuts.h:9
 AliCFTrackIsPrimaryCuts.h:10
 AliCFTrackIsPrimaryCuts.h:11
 AliCFTrackIsPrimaryCuts.h:12
 AliCFTrackIsPrimaryCuts.h:13
 AliCFTrackIsPrimaryCuts.h:14
 AliCFTrackIsPrimaryCuts.h:15
 AliCFTrackIsPrimaryCuts.h:16
 AliCFTrackIsPrimaryCuts.h:17
 AliCFTrackIsPrimaryCuts.h:18
 AliCFTrackIsPrimaryCuts.h:19
 AliCFTrackIsPrimaryCuts.h:20
 AliCFTrackIsPrimaryCuts.h:21
 AliCFTrackIsPrimaryCuts.h:22
 AliCFTrackIsPrimaryCuts.h:23
 AliCFTrackIsPrimaryCuts.h:24
 AliCFTrackIsPrimaryCuts.h:25
 AliCFTrackIsPrimaryCuts.h:26
 AliCFTrackIsPrimaryCuts.h:27
 AliCFTrackIsPrimaryCuts.h:28
 AliCFTrackIsPrimaryCuts.h:29
 AliCFTrackIsPrimaryCuts.h:30
 AliCFTrackIsPrimaryCuts.h:31
 AliCFTrackIsPrimaryCuts.h:32
 AliCFTrackIsPrimaryCuts.h:33
 AliCFTrackIsPrimaryCuts.h:34
 AliCFTrackIsPrimaryCuts.h:35
 AliCFTrackIsPrimaryCuts.h:36
 AliCFTrackIsPrimaryCuts.h:37
 AliCFTrackIsPrimaryCuts.h:38
 AliCFTrackIsPrimaryCuts.h:39
 AliCFTrackIsPrimaryCuts.h:40
 AliCFTrackIsPrimaryCuts.h:41
 AliCFTrackIsPrimaryCuts.h:42
 AliCFTrackIsPrimaryCuts.h:43
 AliCFTrackIsPrimaryCuts.h:44
 AliCFTrackIsPrimaryCuts.h:45
 AliCFTrackIsPrimaryCuts.h:46
 AliCFTrackIsPrimaryCuts.h:47
 AliCFTrackIsPrimaryCuts.h:48
 AliCFTrackIsPrimaryCuts.h:49
 AliCFTrackIsPrimaryCuts.h:50
 AliCFTrackIsPrimaryCuts.h:51
 AliCFTrackIsPrimaryCuts.h:52
 AliCFTrackIsPrimaryCuts.h:53
 AliCFTrackIsPrimaryCuts.h:54
 AliCFTrackIsPrimaryCuts.h:55
 AliCFTrackIsPrimaryCuts.h:56
 AliCFTrackIsPrimaryCuts.h:57
 AliCFTrackIsPrimaryCuts.h:58
 AliCFTrackIsPrimaryCuts.h:59
 AliCFTrackIsPrimaryCuts.h:60
 AliCFTrackIsPrimaryCuts.h:61
 AliCFTrackIsPrimaryCuts.h:62
 AliCFTrackIsPrimaryCuts.h:63
 AliCFTrackIsPrimaryCuts.h:64
 AliCFTrackIsPrimaryCuts.h:65
 AliCFTrackIsPrimaryCuts.h:66
 AliCFTrackIsPrimaryCuts.h:67
 AliCFTrackIsPrimaryCuts.h:68
 AliCFTrackIsPrimaryCuts.h:69
 AliCFTrackIsPrimaryCuts.h:70
 AliCFTrackIsPrimaryCuts.h:71
 AliCFTrackIsPrimaryCuts.h:72
 AliCFTrackIsPrimaryCuts.h:73
 AliCFTrackIsPrimaryCuts.h:74
 AliCFTrackIsPrimaryCuts.h:75
 AliCFTrackIsPrimaryCuts.h:76
 AliCFTrackIsPrimaryCuts.h:77
 AliCFTrackIsPrimaryCuts.h:78
 AliCFTrackIsPrimaryCuts.h:79
 AliCFTrackIsPrimaryCuts.h:80
 AliCFTrackIsPrimaryCuts.h:81
 AliCFTrackIsPrimaryCuts.h:82
 AliCFTrackIsPrimaryCuts.h:83
 AliCFTrackIsPrimaryCuts.h:84
 AliCFTrackIsPrimaryCuts.h:85
 AliCFTrackIsPrimaryCuts.h:86
 AliCFTrackIsPrimaryCuts.h:87
 AliCFTrackIsPrimaryCuts.h:88
 AliCFTrackIsPrimaryCuts.h:89
 AliCFTrackIsPrimaryCuts.h:90
 AliCFTrackIsPrimaryCuts.h:91
 AliCFTrackIsPrimaryCuts.h:92
 AliCFTrackIsPrimaryCuts.h:93
 AliCFTrackIsPrimaryCuts.h:94
 AliCFTrackIsPrimaryCuts.h:95
 AliCFTrackIsPrimaryCuts.h:96
 AliCFTrackIsPrimaryCuts.h:97
 AliCFTrackIsPrimaryCuts.h:98
 AliCFTrackIsPrimaryCuts.h:99
 AliCFTrackIsPrimaryCuts.h:100
 AliCFTrackIsPrimaryCuts.h:101
 AliCFTrackIsPrimaryCuts.h:102
 AliCFTrackIsPrimaryCuts.h:103
 AliCFTrackIsPrimaryCuts.h:104
 AliCFTrackIsPrimaryCuts.h:105
 AliCFTrackIsPrimaryCuts.h:106
 AliCFTrackIsPrimaryCuts.h:107
 AliCFTrackIsPrimaryCuts.h:108
 AliCFTrackIsPrimaryCuts.h:109
 AliCFTrackIsPrimaryCuts.h:110
 AliCFTrackIsPrimaryCuts.h:111
 AliCFTrackIsPrimaryCuts.h:112
 AliCFTrackIsPrimaryCuts.h:113
 AliCFTrackIsPrimaryCuts.h:114
 AliCFTrackIsPrimaryCuts.h:115
 AliCFTrackIsPrimaryCuts.h:116
 AliCFTrackIsPrimaryCuts.h:117
 AliCFTrackIsPrimaryCuts.h:118
 AliCFTrackIsPrimaryCuts.h:119
 AliCFTrackIsPrimaryCuts.h:120
 AliCFTrackIsPrimaryCuts.h:121
 AliCFTrackIsPrimaryCuts.h:122
 AliCFTrackIsPrimaryCuts.h:123
 AliCFTrackIsPrimaryCuts.h:124
 AliCFTrackIsPrimaryCuts.h:125
 AliCFTrackIsPrimaryCuts.h:126
 AliCFTrackIsPrimaryCuts.h:127
 AliCFTrackIsPrimaryCuts.h:128
 AliCFTrackIsPrimaryCuts.h:129
 AliCFTrackIsPrimaryCuts.h:130
 AliCFTrackIsPrimaryCuts.h:131
 AliCFTrackIsPrimaryCuts.h:132
 AliCFTrackIsPrimaryCuts.h:133
 AliCFTrackIsPrimaryCuts.h:134
 AliCFTrackIsPrimaryCuts.h:135
 AliCFTrackIsPrimaryCuts.h:136
 AliCFTrackIsPrimaryCuts.h:137
 AliCFTrackIsPrimaryCuts.h:138
 AliCFTrackIsPrimaryCuts.h:139
 AliCFTrackIsPrimaryCuts.h:140
 AliCFTrackIsPrimaryCuts.h:141
 AliCFTrackIsPrimaryCuts.h:142
 AliCFTrackIsPrimaryCuts.h:143
 AliCFTrackIsPrimaryCuts.h:144
 AliCFTrackIsPrimaryCuts.h:145
 AliCFTrackIsPrimaryCuts.h:146
 AliCFTrackIsPrimaryCuts.h:147
 AliCFTrackIsPrimaryCuts.h:148
 AliCFTrackIsPrimaryCuts.h:149
 AliCFTrackIsPrimaryCuts.h:150
 AliCFTrackIsPrimaryCuts.h:151
 AliCFTrackIsPrimaryCuts.h:152
 AliCFTrackIsPrimaryCuts.h:153
 AliCFTrackIsPrimaryCuts.h:154
 AliCFTrackIsPrimaryCuts.h:155
 AliCFTrackIsPrimaryCuts.h:156
 AliCFTrackIsPrimaryCuts.h:157
 AliCFTrackIsPrimaryCuts.h:158
 AliCFTrackIsPrimaryCuts.h:159
 AliCFTrackIsPrimaryCuts.h:160
 AliCFTrackIsPrimaryCuts.h:161
 AliCFTrackIsPrimaryCuts.h:162
 AliCFTrackIsPrimaryCuts.h:163
 AliCFTrackIsPrimaryCuts.h:164
 AliCFTrackIsPrimaryCuts.h:165
 AliCFTrackIsPrimaryCuts.h:166
 AliCFTrackIsPrimaryCuts.h:167
 AliCFTrackIsPrimaryCuts.h:168
 AliCFTrackIsPrimaryCuts.h:169
 AliCFTrackIsPrimaryCuts.h:170
 AliCFTrackIsPrimaryCuts.h:171
 AliCFTrackIsPrimaryCuts.h:172
 AliCFTrackIsPrimaryCuts.h:173
 AliCFTrackIsPrimaryCuts.h:174
 AliCFTrackIsPrimaryCuts.h:175
 AliCFTrackIsPrimaryCuts.h:176
 AliCFTrackIsPrimaryCuts.h:177
 AliCFTrackIsPrimaryCuts.h:178
 AliCFTrackIsPrimaryCuts.h:179