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 AliCFTrackKineCuts is designed to select both generated 
// and reconstructed tracks of a given range in momentum space,
// electric charge and azimuthal emission angle phi 
// 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, generated and 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:
// - total momentum
// - pt
// - px
// - py
// - pz
// - eta
// - rapidity
// - phi
// - charge
// - is charged
//
// 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 ALICFTRACKKINECUTS_H
#define ALICFTRACKKINECUTS_H

#include "AliCFCutBase.h"

class TH2 ;
class TBits;
class AliVParticle;

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

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

  // cut value setter
  void SetMomentumRange(Double_t momentumMin=0., Double_t momentumMax=1e99) {fMomentumMin=momentumMin; fMomentumMax=momentumMax;}
  void SetPtRange(Double_t ptMin=0., Double_t ptMax=1e99) {fPtMin=ptMin; fPtMax=ptMax;}
  void SetPxRange(Double_t pxMin=-1e99, Double_t pxMax=1e99) {fPxMin=pxMin; fPxMax=pxMax;}
  void SetPyRange(Double_t pyMin=-1e99, Double_t pyMax=1e99) {fPyMin=pyMin; fPyMax=pyMax;}
  void SetPzRange(Double_t pzMin=-1e99, Double_t pzMax=1e99) {fPzMin=pzMin; fPzMax=pzMax;}
  void SetEtaRange(Double_t etaMin=-1e99, Double_t etaMax=1e99) {fEtaMin=etaMin; fEtaMax=etaMax;}
  void SetRapidityRange(Double_t rapMin=-1e99, Double_t rapMax=1e99) {fRapidityMin=rapMin; fRapidityMax=rapMax;} 
  void SetPhiRange(Double_t phiMin=-10., Double_t phiMax=10.) {fPhiMin=phiMin; fPhiMax=phiMax;}
  void SetChargeRec(Double_t charge=10.) {fCharge=charge;}
  void SetChargeMC(Double_t charge=10.) {fCharge=charge*3.;}
  void SetRequireIsCharged(Bool_t b=kFALSE) {fRequireIsCharged=b;}

  // QA histograms
  void DrawHistograms(Bool_t drawLogScale=kTRUE);
  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);

  // indeces/counters for single selections
  enum { 
    kCutP=0,	// momentum
    kCutPt,	// pt
    kCutPx,	// px
    kCutPy,	// py
    kCutPz,	// pz
    kCutRapidity,// raptidity
    kCutEta,	// eta
    kCutPhi,	// phi
    kCutCharge,	// charge
    kNCuts=10,	// 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 DefineHistograms(); 		// books histograms and TList
  void Initialise();			// sets everything to 0
  void FillHistograms(TObject* obj, Bool_t b);
					// Fills histograms before and after cuts
  Double_t fMomentumMin ;		// lower limit of accepted total momentum range
  Double_t fMomentumMax ;		// upper limit of accepted total momentum range
  Double_t fPtMin ;			// lower limit of accepted transverse momentum range
  Double_t fPtMax ;			// upper limit of accepted transverse momentum range
  Double_t fPxMin ;			// lower limit of accepted px range
  Double_t fPxMax ;			// upper limit of accepted px range
  Double_t fPyMin ;			// lower limit of accepted py range
  Double_t fPyMax ;			// upper limit of accepted py range
  Double_t fPzMin ;			// lower limit of accepted pz range
  Double_t fPzMax ;			// upper limit of accepted pz range
  Double_t fEtaMin ;			// lower limit of accepted pseudo-rapidity range
  Double_t fEtaMax ;			// upper limit of accepted pseudo-rapidity range
  Double_t fRapidityMin ;		// lower limit of accepted rapidity range
  Double_t fRapidityMax ;		// upper limit of accepted rapidity range
  Double_t fPhiMin ;			// lower limit of accepted phi range
  Double_t fPhiMax ;			// upper limit of accepted phi range
  Double_t fCharge ;			// electric charge
  Bool_t  fRequireIsCharged;		// accept charged particles only

  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 fhNBinsMomentum;		// number of bins+1: momentum
  Int_t fhNBinsPt;			// number of bins+1: pt
  Int_t fhNBinsPx;			// number of bins+1: px
  Int_t fhNBinsPy;			// number of bins+1: py
  Int_t fhNBinsPz;			// number of bins+1: pz
  Int_t fhNBinsEta;			// number of bins+1: eta
  Int_t fhNBinsRapidity;		// number of bins+1: rapidity
  Int_t fhNBinsPhi;			// number of bins+1: phi
  Int_t fhNBinsCharge;			// number of bins+1: charge
  
  Double_t *fhBinLimMomentum;	//[fhNBinsMomentum] bin limits: momentum
  Double_t *fhBinLimPt;		//[fhNBinsPt] bin limits: pt
  Double_t *fhBinLimPx;		//[fhNBinsPx] bin limits: px
  Double_t *fhBinLimPy;		//[fhNBinsPy] bin limits: py
  Double_t *fhBinLimPz;		//[fhNBinsPz] bin limits: pz
  Double_t *fhBinLimEta;	//[fhNBinsEta] bin limits: eta
  Double_t *fhBinLimRapidity;	//[fhNBinsRapidity] bin limits: rapidity
  Double_t *fhBinLimPhi;	//[fhNBinsPhi] bin limits: phi
  Double_t *fhBinLimCharge;	//[fhNBinsCharge] bin limits: charge

  ClassDef(AliCFTrackKineCuts,2);
};

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