ROOT logo
//-*- Mode: C++ -*-
// $Id$

//* This file is property of and copyright by the ALICE Project        * 
//* ALICE Experiment at CERN, All rights reserved.                     *
//* See cxx source for full Copyright notice                           *

/// @file   AliDxHFEToolsMC.h
/// @author Hege Erdal, Matthias Richter
/// @date   2012-07-19
/// @brief  Common Tools for MC particle selection
///

#ifndef ALIDXHFETOOLSMC_H
#define ALIDXHFETOOLSMC_H

#include "TObject.h"
#include <vector>

class AliVEvent;
class AliVParticle;
class TH1;

using std::vector;

/**
 * @class AliDxHFEToolsMC
 * Common Tools for MC particle selection.
 */
class AliDxHFEToolsMC {
  public:
  /// constructor
  AliDxHFEToolsMC(const char* options="");
  /// destructor
  virtual ~AliDxHFEToolsMC();

  // different pdgs
  enum{
    kPDGnone=0,
    kPDGd=1,
    kPDGu=2,
    kPDGs=3,
    kPDGc=4,
    kPDGb=5,
    kPDGelectron=11,
    kPDGmuon=13,
    kPDGgluon=21,
    kPDGgamma=22,
    kPDGpi0=111,
    kPDGpion=211,
    kPDGeta=221,
    kPDGkaon=321,
    kPDGD0=421,
    kPDGJpsi=443,
    kPDGproton=2212
  };

  enum {
    kPDGLabelPositron,
    kPDGLabelElectron,
    kPDGLabelMuPlus,
    kPDGLabelMuMinus,
    kPDGLabelPiPlus,
    kPDGLabelPiMinus,
    kPDGLabelKPlus,
    kPDGLabelKMinus,
    kPDGLabelProton,
    kPDGLabelAntiproton,
    kPDGLabelOthers,
    kNofPDGLabels
  };

  enum {
    kPDGMotherLabelD,
    kPDGMotherLabelU,
    kPDGMotherLabelS,
    kPDGMotherLabelC,
    kPDGMotherLabelB,
    kPDGMotherLabelGluon,
    kPDGMotherLabelGamma,
    kPDGMotherLabelPi0,
    kPDGMotherLabelEta,
    kPDGMotherLabelProton,
    kPDGMotherLabelOthers,
    kNofPDGMotherLabels
  };

  enum {
    kMCFirst = 0,
    kMCLast
  };

  enum {
    kOriginNone=0,
    kOriginDown,
    kOriginUp,
    kOriginStrange,
    kOriginCharm,
    kOriginBeauty,
    kOriginGluon,
    kOriginGluonCharm,
    kOriginGluonBeauty,
    kNrOrginMother
  };

  enum {
    kGetOriginMother=0,
    kGetFirstMother
  };

  /// initialize according to options
  int Init(const char* /*option*/);

  /// init MC info from event object
  int InitMCParticles(const AliVEvent* pEvent);

  /// Returning MC Array
  TObjArray* GetMCArray() const {return fMCParticles;} 
  
  /// check state
  bool IsInitialized() const {return fMCParticles!=NULL;}

  /// clear internal memory
  virtual void Clear(const char* option="");

  /// flag indicating to do the selection on MC first
  bool MCFirst() const {return fSequence==kMCFirst;}
  /// flag indicating to do the selection on MC last
  bool MCLast() const {return fSequence==kMCLast;}

  /// Return the result on check on initial quark
  int GetOriginMother() const {return fOriginMother;}

  /// check if pdg should be rejected
  /// always false if pdg list is not initialized
  bool RejectByPDG(AliVParticle* p, bool doStatistics=true, int* pdgParticleResult=NULL);
  bool RejectByPDG(AliVParticle* p, int* pdgParticleResult) {
    return RejectByPDG(p, true, pdgParticleResult);
  }

  /// check if pdg should be rejected by mother
  /// always false if mother pdg list is not initialized
  bool RejectByMotherPDG(AliVParticle* p, bool doStatistics=true);

  /// Finds pdg of first or origin mother and returns value
  int FindMotherPDG(AliVParticle* p, bool bReturnFirstMother=false);

  /// step through tree and find the original mother particle
  /// TODO: this can possibly be const, however, a member is set inside
  /// check whether this is really necessary
  int FindPdgOriginMother(AliVParticle* p,bool bReturnFirstMother=false);

  // Compare pdg to quark and gluon
  void CheckOriginMother(int pdg);
  // Tests if particle have been marked as HF quark 
  Bool_t TestIfHFquark(int origin);

  //Tests of pdg corresponds to HF meson
  Bool_t TestMotherHFMeson(int pdg);

  // Setting MC label from outside
  void SetMClabel(int mclab){fMClabel=mclab;}

  /// TODO: want to have this function to be private again, currently
  /// used with an external vector
  /// check if pdg should be rejected, particle is not rejected
  /// if it is in the list, returns always false if list is empty
  bool RejectByPDG(int pdg, const vector<int> &list) const;

  int GetNrMCParticles() const {return fNrMCParticles;}
  int CheckMCParticle(AliVParticle* p);

  /// mapping of pdg code to enum
  int MapPDGLabel(int pdg) const;
  /// mapping of pdg code to enum
  int MapPDGMotherLabel(int pdg) const;

 protected:

 private:
  /// copy contructor prohibited
  AliDxHFEToolsMC(const AliDxHFEToolsMC&);
  /// assignment operator prohibited
  AliDxHFEToolsMC& operator=(const AliDxHFEToolsMC&);

  /// create control histogram
  TH1* CreateControlHistogram(const char* name,
			      const char* title,
			      int nBins,
			      const char** binLabels) const;

  static const char* fgkPDGBinLabels[];
  static const char* fgkPDGMotherBinLabels[];
  static const char* fgkStatisticsBinLabels[];

  int fSequence;           //  sequence of checks
  TObjArray* fMCParticles; //! pointer to external array of MC particles
  vector<int> fPDGs;       //  PDGs to be selected
  vector<int> fMotherPDGs; //  mother PDGs to be selected
  TH1* fHistPDG;           //  control histogram pdg of selected particle
  TH1* fHistPDGMother;     //  control histogram pdg of selected particle
  int fOriginMother;       //  Holds the origin motherquark (process)
  int fMClabel;            //  MClabel passed from outside (default =-1)
  int fNrMCParticles;      //  number of MC particles 
  bool fUseKine;           //  For looping over stack directly

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