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.                  *
 **************************************************************************/

//////////////////////////////////////////////////////////////////////
// AliCFParticleGenCut implementation
// This class is designed to handle 
// particle selection at generated level.
//
// added support for MC in AOD tree (2008-11-04)
// added a bool flag for the alternative (standard MC) vs (AOD MC).
//
// author : R. Vernet (renaud.vernet@cern.ch)
//////////////////////////////////////////////////////////////////////


#ifndef ALICFPARTICLEGENCUTS_H
#define ALICFPARTICLEGENCUTS_H

#include "AliCFCutBase.h"

class AliMCEvent;
class TObject;
class AliMCParticle;
class AliStack;
class TList;
class TH1F;
class TH2F;
class TBits;
class TArrayF;
class TDecayChannel;
class AliVParticle;
class AliVEvent;
class AliAODMCParticle;


class AliCFParticleGenCuts : public AliCFCutBase
{
 public :
  AliCFParticleGenCuts() ;
  AliCFParticleGenCuts           (const Char_t* name, const Char_t* title) ;
  AliCFParticleGenCuts           (const AliCFParticleGenCuts& c) ;
  AliCFParticleGenCuts& operator=(const AliCFParticleGenCuts& c) ;
  virtual ~AliCFParticleGenCuts() { };
  virtual Bool_t IsSelected(TObject* obj) ;
  Bool_t IsSelected(TList* /*list*/) {return kTRUE;}
  virtual void   SetMCEventInfo(const TObject* mcEvent) ;
  void    SetAODMC(Bool_t flag) {fIsAODMC=flag;}

  Bool_t IsPrimaryCharged(AliVParticle *mcPart);
  Bool_t IsPrimary(AliMCParticle    *mcPart) ;
  Bool_t IsPrimary(AliAODMCParticle *mcPart) ;
  //static checkers
  static Bool_t IsCharged(AliVParticle *mcPart);
  static Bool_t IsA(AliMCParticle    *mcPart, Int_t pdg, Bool_t abs=kFALSE);
  static Bool_t IsA(AliAODMCParticle *mcPart, Int_t pdg, Bool_t abs=kFALSE);

  void SetRequireIsCharged   () {fRequireIsCharged  =kTRUE; fRequireIsNeutral  =kFALSE;}
  void SetRequireIsNeutral   () {fRequireIsNeutral  =kTRUE; fRequireIsCharged  =kFALSE;}
  void SetRequireIsPrimary   () {fRequireIsPrimary  =kTRUE; fRequireIsSecondary=kFALSE;}
  void SetRequireIsSecondary () {fRequireIsSecondary=kTRUE; fRequireIsPrimary  =kFALSE;}
  void SetRequirePdgCode     (Int_t pdg, Bool_t useAbsolute=kFALSE) {
                              fRequirePdgCode=kTRUE; 
			      fPdgCode=pdg; 
			      fRequireAbsolutePdg=useAbsolute;
  }
  void SetProdVtxRangeX    (Double32_t xmin, Double32_t xmax) {fProdVtxXMin   =xmin; fProdVtxXMax   =xmax;}
  void SetProdVtxRangeY    (Double32_t ymin, Double32_t ymax) {fProdVtxYMin   =ymin; fProdVtxYMax   =ymax;}
  void SetProdVtxRangeZ    (Double32_t zmin, Double32_t zmax) {fProdVtxZMin   =zmin; fProdVtxZMax   =zmax;}
  void SetProdVtxRange2D   (Bool_t b=kFALSE)		      {fProdVtxRange2D = b;}
  void SetDecayVtxRangeX   (Double32_t xmin, Double32_t xmax) {fDecayVtxXMin  =xmin; fDecayVtxXMax  =xmax;}
  void SetDecayVtxRangeY   (Double32_t ymin, Double32_t ymax) {fDecayVtxYMin  =ymin; fDecayVtxYMax  =ymax;}
  void SetDecayVtxRangeZ   (Double32_t zmin, Double32_t zmax) {fDecayVtxZMin  =zmin; fDecayVtxZMax  =zmax;}
  void SetDecayLengthRange (Double32_t rmin, Double32_t rmax) {fDecayLengthMin=rmin; fDecayLengthMax=rmax;}
  void SetDecayRxyRange    (Double32_t rmin, Double32_t rmax) {fDecayRxyMin   =rmin; fDecayRxyMax   =rmax;}
  void SetDecayChannel     (TDecayChannel* dc) {fDecayChannel = dc ;}

  enum { 
    kCutCharge,       // ischarged cut
    kCutPrimSec,      // isprimary cut
    kCutPDGCode,      // PDG code  cut
    kCutProdVtxXMin,  // production vertex cut
    kCutProdVtxXMax,  // production vertex cut
    kCutProdVtxYMin,  // production vertex cut
    kCutProdVtxYMax,  // production vertex cut
    kCutProdVtxZMin,  // production vertex cut
    kCutProdVtxZMax,  // production vertex cut
    kCutDecVtxXMin,   // decay vertex cut
    kCutDecVtxXMax,   // decay vertex cut
    kCutDecVtxYMin,   // decay vertex cut
    kCutDecVtxYMax,   // decay vertex cut
    kCutDecVtxZMin,   // decay vertex cut
    kCutDecVtxZMax,   // decay vertex cut
    kCutDecLgthMin,   // decay length cut
    kCutDecLgthMax,   // decay length cut
    kCutDecRxyMin,    // transverse decay length cut
    kCutDecRxyMax,    // transverse decay length cut
    kCutDecayChannel, // decay channel reuired
    kNCuts,           // number of single selections
    kNStepQA=2        // number of QA steps (before/after the cuts)
  };

 private:
  Bool_t fIsAODMC ;       // flag for standard MC or MC from AOD tree
  AliVEvent* fMCInfo ;    // pointer to the MC event information
  Bool_t     fRequireIsCharged;   // require charged particle
  Bool_t     fRequireIsNeutral;   // require neutral particle
  Bool_t     fRequireIsPrimary;   // require primary particle
  Bool_t     fRequireIsSecondary; // require secondary particle
  Bool_t     fRequirePdgCode;     // require check of the PDG code
  Bool_t     fRequireAbsolutePdg; // use the PDG code absolute value, used also for the decay channel
  Bool_t     fProdVtxRange2D;     // cut an ellipse in xy plane
  Int_t      fPdgCode ;           // particle PDG code
  Double32_t fProdVtxXMin;        // min X of particle production vertex
  Double32_t fProdVtxYMin;        // min Y of particle production vertex
  Double32_t fProdVtxZMin;        // min Z of particle production vertex
  Double32_t fProdVtxXMax;        // max X of particle production vertex
  Double32_t fProdVtxYMax;        // max Y of particle production vertex
  Double32_t fProdVtxZMax;        // max Z of particle production vertex
  Double32_t fDecayVtxXMin;       // min X of particle decay vertex
  Double32_t fDecayVtxYMin;       // min Y of particle decay vertex
  Double32_t fDecayVtxZMin;       // min Z of particle decay vertex
  Double32_t fDecayVtxXMax;       // max X of particle decay vertex
  Double32_t fDecayVtxYMax;       // max Y of particle decay vertex
  Double32_t fDecayVtxZMax;       // max Z of particle decay vertex
  Double32_t fDecayLengthMin;     // min decay length (absolute)
  Double32_t fDecayLengthMax;     // max decay length (absolute)
  Double32_t fDecayRxyMin;        // min decay length in transverse plane wrt (0,0,0)
  Double32_t fDecayRxyMax;        // max decay length in transverse plane wrt (0,0,0)
  TDecayChannel* fDecayChannel;   // decay channel : if fRequireAbsolutePdg, the antiparticle channel will be checked as well

  //QA histos
  TH1F*    fhCutStatistics;        // Histogram: statistics of what cuts the tracks did not survive
  TH2F*    fhCutCorrelation;	   // Histogram: 2d statistics plot
  TH1F*    fhQA[kNCuts][kNStepQA]; // QA Histograms
  TH2F*    fhProdVtxXY[2];	   // Histogram: production vertex in tranzverse plane
  TArrayF* fCutValues;             // array of cut values
  TBits* fBitmap ;                 // stores single selection decisions

  void SelectionBitMap(AliMCParticle*    obj); // for MC got from Kinematics
  void SelectionBitMap(AliAODMCParticle* obj); // for MC got from AOD
  void FillHistograms(TObject* obj, Bool_t afterCuts);
  void AddQAHistograms(TList *qaList) ;
  void DefineHistograms();

  ClassDef(AliCFParticleGenCuts,2);
};

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