ROOT logo
#ifndef ALIMCANALYSISUTILS_H
#define ALIMCANALYSISUTILS_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice     */

//_________________________________________________________________________
// Class for analysis utils for MC data
// stored in stack or event header.
// Contains:
//  - method to check the origin of a given track/cluster
//  - method to obtain the generated jets
//
//*-- Author: Gustavo Conesa (INFN-LNF)

// --- ROOT system ---
#include <TObject.h>
#include <TString.h>
#include <TLorentzVector.h>
class TList ;
class TVector3;

//--- AliRoot system ---
class AliCaloTrackReader ;
class AliStack ;

class AliMCAnalysisUtils : public TObject {
	
 public: 
  AliMCAnalysisUtils() ; // ctor
  virtual ~AliMCAnalysisUtils() ;//virtual dtor
    
  //--------------------------------------
  //Enum with tag for origin of particles
  //--------------------------------------
  
  //"Mostly" photon parent types on line 1,
  //                                                  
  //then "mostly" electron parent types on line 3, (e.g. electrons can
  //come from pi0 decay)                              
  //then charged particles on line 4,                                                                                    
  //followed by other and unknown on line 5                                                                              
  enum mcTypes { kMCPhoton,     kMCPrompt,      kMCFragmentation, kMCISR,    
                 kMCPi0Decay,   kMCEtaDecay,    kMCOtherDecay,
                 kMCDecayPairLost, kMCDecayPairInCalo,
                 kMCDecayDalitz,kMCConversion,  kMCElectron,
                 kMCEFromCFromB,kMCEFromC,      kMCEFromB,        kMCZDecay, kMCWDecay,
                 kMCMuon,       kMCPion,        kMCPi0,           kMCKaon,   kMCEta,      kMCProton,   
                 kMCAntiProton, kMCNeutron,     kMCAntiNeutron,
                 kMCUnknown,    kMCBadLabel                                                         } ;
  
  //--------------------------------------
  // Methods to check origin of clusters
  //--------------------------------------
  
  Int_t   CheckCommonAncestor(Int_t index1, Int_t index2, const AliCaloTrackReader* reader, 
			      Int_t & ancPDG, Int_t & ancStatus, TLorentzVector & momentum, TVector3 & v) ;
  
  Int_t   CheckOrigin(Int_t label, const AliCaloTrackReader * reader, Int_t calorimeter) ;
  
  //Check the label of the most significant particle but do checks on the rest of the contributing labels
  Int_t   CheckOrigin       (const Int_t *label,  Int_t nlabels, const AliCaloTrackReader * reader, Int_t calorimeter) ;
  Int_t   CheckOriginInStack(const Int_t *labels, Int_t nlabels, AliStack * stack               , const TObjArray *arrayCluster) ; // ESD
  Int_t   CheckOriginInAOD  (const Int_t *labels, Int_t nlabels, const TClonesArray* mcparticles, const TObjArray *arrayCluster) ; // AOD
  
  void    CheckOverlapped2GammaDecay(const Int_t *labels, Int_t nlabels, Int_t mesonIndex, AliStack * stack,                Int_t & tag); // ESD
  void    CheckOverlapped2GammaDecay(const Int_t *labels, Int_t nlabels, Int_t mesonIndex, const TClonesArray* mcparticles, Int_t & tag); // AOD
  
  void    CheckLostDecayPair(const TObjArray *arrayCluster, Int_t iMom, Int_t iParent, AliStack* stack,                 Int_t & tag); // ESD
  void    CheckLostDecayPair(const TObjArray *arrayCluster, Int_t iMom, Int_t iParent, const TClonesArray* mcparticles, Int_t & tag); // AOD
  
  TLorentzVector GetMother     (Int_t label,const AliCaloTrackReader* reader, Bool_t & ok);
  TLorentzVector GetMother     (Int_t label,const AliCaloTrackReader* reader, Int_t & pdg, Int_t & status, Bool_t & ok);
  TLorentzVector GetMother     (Int_t label,const AliCaloTrackReader* reader, Int_t & pdg, Int_t & status, Bool_t & ok, Int_t & momLabel);
  TLorentzVector GetGrandMother(Int_t label,const AliCaloTrackReader* reader,
                                Int_t & pdg, Int_t & status, Bool_t & ok, Int_t & grandMomLabel, Int_t & greatMomLabel);

  TLorentzVector GetMotherWithPDG(Int_t label, Int_t pdg,const AliCaloTrackReader* reader, Bool_t & ok, Int_t & momLabel);
  
  void GetMCDecayAsymmetryAngleForPDG(Int_t label, Int_t pdg,const AliCaloTrackReader* reader,
                                      Float_t & asy, Float_t & angle, Bool_t & ok);

  Int_t          GetNDaughters(Int_t label,const AliCaloTrackReader* reader, Bool_t & ok);
  TLorentzVector GetDaughter  (Int_t daughter, Int_t label,const AliCaloTrackReader* reader,
                               Int_t & pdg, Int_t & status, Bool_t & ok, Int_t & daugLabel);

  Int_t          GetNOverlaps(const Int_t * label, UInt_t nlabels,
                              Int_t mctag, Int_t mesonLabel,
                              AliCaloTrackReader * reader,Int_t *overpdg);
  
  //Check or set the bits produced in the above methods
  void    SetTagBit(Int_t &tag, UInt_t set) const {
    // Set bit of type set (mcTypes) in tag
    tag |= (1<<set) ; 
  } 
  
  Bool_t  CheckTagBit(Int_t tag, UInt_t test) const {
    // Check if in tag the bit test (mcTypes) is set.
    if (tag & (1<<test) ) return  kTRUE ;    
    else return kFALSE ;
  }
  
  //--------------------------------------
  // Other methods
  //--------------------------------------
    
  // Method to recover MC jets stored in generator
  TList * GetJets(const AliCaloTrackReader * reader) ;
  
  void    SetDebug(Int_t deb)           { fDebug=deb           ; }
  Int_t   GetDebug()              const { return fDebug        ; }	
  
  enum generator {kPythia = 0, kHerwig = 1, kHijing = 2, kBoxLike = 3 } ;
  void    SetMCGenerator(Int_t   mcgen) ;
  void    SetMCGenerator(TString mcgen) ;
  Int_t   GetMCGenerator()        const { return fMCGenerator  ; }
  TString GetMCGeneratorString()  const { return fMCGeneratorString ; }
  
  void    Print(const Option_t * opt) const;
  void    PrintMCTag(Int_t tag) const;

 private:
  Int_t   fCurrentEvent;        // Current Event
  Int_t   fDebug;               // Debug level
  TList * fJetsList;            // List of jets
  Int_t   fMCGenerator;         // MC generator used to generate data in simulation
  TString fMCGeneratorString;   // MC generator used to generate data in simulation
  
  TLorentzVector fDaughMom;     //! particle momentum
  TLorentzVector fDaughMom2;    //! particle momentum
  TLorentzVector fMotherMom;    //! particle momentum
  TLorentzVector fGMotherMom;   //! particle momentum
  
  AliMCAnalysisUtils & operator = (const AliMCAnalysisUtils & mcu) ; // cpy assignment
  AliMCAnalysisUtils(              const AliMCAnalysisUtils & mcu) ; // cpy ctor
  
  ClassDef(AliMCAnalysisUtils,6)

} ;

#endif //ALIMCANALYSISUTILS_H



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