ROOT logo
// $Id$

//**************************************************************************
//* This file is property of and copyright by the ALICE Project            * 
//* ALICE Experiment at CERN, All rights reserved.                         *
//*                                                                        *
//* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
//*                  Hege Erdal       <hege.erdal@gmail.com>               *
//*                                                                        *
//* 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.                  *
//**************************************************************************

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

#include "AliDxHFEToolsMC.h"
#include "AliAODMCParticle.h"
#include "AliVEvent.h"
#include "AliVParticle.h"
#include "AliLog.h"
#include "TObjArray.h"
#include "TString.h"
#include "TH1D.h"
#include <iostream>
#include <cerrno>
#include <memory>

using namespace std;

/// ROOT macro for the implementation of ROOT specific class methods
ClassImp(AliDxHFEToolsMC)

AliDxHFEToolsMC::AliDxHFEToolsMC(const char* option)
  : fSequence(kMCLast)
  , fMCParticles(NULL)
  , fPDGs()
  , fMotherPDGs()
  , fHistPDG(NULL)
  , fHistPDGMother(NULL)
  , fOriginMother(kOriginNone)
  , fMClabel(-1)
  , fNrMCParticles(-1)
  , fUseKine(kFALSE)
{
  // constructor
  // 
  // 
  // 
  // 
  Init(option);
}

const char*  AliDxHFEToolsMC::fgkPDGBinLabels[]={
  "positron",
  "electron",
  "#mu+",
  "#mu-",
  "#pi+",
  "#pi-",
  "K+",
  "K-",
  "proton",
  "antiproton",
  "others"
};

const char*  AliDxHFEToolsMC::fgkPDGMotherBinLabels[]={
  "d",
  "u",
  "s",
  "c",
  "b",
  "gluon",
  "gamma",
  "#pi^{0}",
  "#eta",
  "proton",
  "others"
};

const char*  AliDxHFEToolsMC::fgkStatisticsBinLabels[]={
  "all",   // all MC particles
  "found", // selected particles with correct MC
  "fake"   // selected particles without corresponding MC
};

AliDxHFEToolsMC::~AliDxHFEToolsMC()
{
  // destructor
  if (fHistPDG) delete fHistPDG;
  fHistPDG=NULL;
  if (fHistPDGMother) delete fHistPDGMother;
  fHistPDGMother=NULL;
}

int AliDxHFEToolsMC::Init(const char* option)
{
  // initialize according to options
  TString strOption(option);
  bool bControlHist=true;
  std::auto_ptr<TObjArray> tokens(strOption.Tokenize(" "));
  if (tokens.get() && tokens->GetEntriesFast()>0) {
    for (int itoken=0; itoken<tokens->GetEntriesFast(); itoken++) {
      if (tokens->At(itoken)==NULL) continue;
      TString arg=tokens->At(itoken)->GetName();
      const char* key="";
      key="pdg=";
      if (arg.BeginsWith(key)) {
	arg.ReplaceAll(key, "");
	fPDGs.push_back(arg.Atoi());
      }
      key="mother-pdg=";
      if (arg.BeginsWith(key)) {
	arg.ReplaceAll(key, "");
	fMotherPDGs.push_back(arg.Atoi());
      }
      key="control-hist=";
      if (arg.BeginsWith(key)) {
	arg.ReplaceAll(key, "");
	bControlHist=arg.CompareTo("off")!=0;
      }
      key="mc-first";
      if (arg.BeginsWith(key)) {
	fSequence=kMCFirst;	
      }
      key="mc-last";
      if (arg.BeginsWith(key)) {
	fSequence=kMCLast;	
      }
      key="usekine";
      if(arg.BeginsWith(key)) {
	printf("AliDxHFEToolsMC::Init()  Using Kinematical\n");
	fUseKine=kTRUE;
      }
    }
  }
  
  if (bControlHist) {
    fHistPDG=CreateControlHistogram("histPDG",
				    "pdg code of selected particle",
				    sizeof(fgkPDGBinLabels)/sizeof(const char*),
				    fgkPDGBinLabels);
    fHistPDGMother=CreateControlHistogram("histPDGMother",
					  "pdg code of first mother of selected particle",
					  sizeof(fgkPDGMotherBinLabels)/sizeof(fgkPDGMotherBinLabels[0]),
					  fgkPDGMotherBinLabels);
  }
  return 0;
}

int AliDxHFEToolsMC::InitMCParticles(const AliVEvent* pEvent)
{

  // init MC info from event object
  if (!pEvent) return -EINVAL;

  // TODO: choose branch name depending on VEvent type; configurable?
  TString branchname(AliAODMCParticle::StdBranchName());
  TObject* o=pEvent->FindListObject(branchname);
  if (!o) {
    AliWarningClass(Form("can not find MC info '%s' in event of type '%s'", branchname.Data(), pEvent->ClassName()));
    return -ENOENT;
  }
  fMCParticles = dynamic_cast<TObjArray*>(o);
  if (!fMCParticles) {
    AliWarningClass(Form("ignoring MC info '%s' of wrong type '%s', expecting TObjArray", branchname.Data(), o->ClassName()));
    return -ENODATA;
  }
  fNrMCParticles=fMCParticles->GetEntriesFast();
  return 0;
}

bool AliDxHFEToolsMC::RejectByPDG(int pdg, const vector<int> &list) const
{
  // check if pdg should be rejected, particle is not rejected
  // if it is in the list, returns always false if list is empty
  if (list.size()==0) return false;
  for (vector<int>::const_iterator i=list.begin();
       i!=list.end(); i++) {
    if (*i==pdg) return false;
  }
  return true;
}

bool AliDxHFEToolsMC::RejectByPDG(AliVParticle* p, bool doStatistics, int* pdgParticleResult)
{
  // check if pdg should be rejected
  // always false if not pdg list is initialized
  if (!p) return false;
  Int_t MClabel = p->GetLabel();
  if(MClabel<0) {
    return true;
  }
  int pdgPart=-1;
  // TODO: there might be more types of particles to be checked
  AliAODMCParticle* aodmcp=0;
  aodmcp=dynamic_cast<AliAODMCParticle*>(fMCParticles->At(MClabel));
  if (aodmcp)
    pdgPart=TMath::Abs(aodmcp->GetPdgCode());
  if (pdgPart<0) return 0;

  if (pdgParticleResult)
    *pdgParticleResult=pdgPart;

  bool bReject=RejectByPDG(pdgPart, fPDGs);
  if (doStatistics && fHistPDG) {
    // TODO: think about histogramming mode, e.g. histogramming of rejected particles?
    if (!bReject) {
      fHistPDG->Fill(MapPDGLabel(p->PdgCode()));
    }
  }
  return bReject;
}

bool AliDxHFEToolsMC::RejectByMotherPDG(AliVParticle* p, bool doStatistics)
{
  // check if pdg should be rejected by mother
  // always false if not mother pdg list is initialized
  // H: think maybe this is particle specific, and should be moved to PartSelMCEl
  if (!p) return false;
  int motherpdg=FindPdgOriginMother(p);
  // TODO: This should be tweaked. Want to 
  bool bReject=RejectByPDG(motherpdg, fMotherPDGs);
  if (doStatistics && fHistPDGMother) {
    // TODO: think about histogramming mode, e.g. histogramming of rejected particles?
    if (!bReject) {
      fHistPDGMother->Fill(MapPDGMotherLabel(p->PdgCode()));
    }
  }
  return bReject;
}

int AliDxHFEToolsMC::FindMotherPDG(AliVParticle* p, bool bReturnFirstMother)
{
  // Will find and return pdg of the mother, either first or loop down to the
  // initial quark

  // To reset fOriginMother. 
  fOriginMother=kOriginNone;

  if (!p) return false;
  int motherpdg=FindPdgOriginMother(p, bReturnFirstMother);

  return motherpdg;
}

TH1* AliDxHFEToolsMC::CreateControlHistogram(const char* name,
					     const char* title,
					     int nBins,
					     const char** binLabels) const
{
  /// create control histogram
  std::auto_ptr<TH1> h(new TH1D(name, title, nBins, -0.5, nBins-0.5));
  if (!h.get()) return NULL;
  for (int iLabel=0; iLabel<nBins; iLabel++) {
    h->GetXaxis()->SetBinLabel(iLabel+1, binLabels[iLabel]);    
  }
  
  return h.release();
}

int AliDxHFEToolsMC::MapPDGLabel(int pdg) const
{
  /// mapping of pdg code to enum
  switch (pdg) {
  case kPDGelectron  : return kPDGLabelElectron;
  case -kPDGelectron : return kPDGLabelPositron;
  case kPDGmuon	     : return kPDGLabelMuPlus;
  case -kPDGmuon     : return kPDGLabelMuMinus;
  case kPDGpion	     : return kPDGLabelPiPlus;
  case -kPDGpion     : return kPDGLabelPiMinus;
  case kPDGkaon	     : return kPDGLabelKPlus;
  case -kPDGkaon     : return kPDGLabelKMinus;
  case kPDGproton    : return kPDGLabelProton;
  case -kPDGproton   : return kPDGLabelAntiproton;
  default:
    return kPDGLabelOthers;
  }
}

int AliDxHFEToolsMC::MapPDGMotherLabel(int pdg) const
{
  /// mapping of pdg code to enum
  switch (pdg) {
  case kPDGd     : return kPDGMotherLabelD;
  case kPDGu     : return kPDGMotherLabelU;
  case kPDGs     : return kPDGMotherLabelS;
  case kPDGc     : return kPDGMotherLabelC;
  case kPDGb     : return kPDGMotherLabelB;
  case kPDGgluon : return kPDGMotherLabelGluon;
  case kPDGgamma : return kPDGMotherLabelGamma;
  case kPDGpi0   : return kPDGMotherLabelPi0;
  case kPDGeta   : return kPDGMotherLabelEta;
  case kPDGproton: return kPDGMotherLabelProton;
  default:
    return kPDGLabelOthers;
  }
}

int AliDxHFEToolsMC::FindPdgOriginMother(AliVParticle* p, bool bReturnFirstMother) 
{
  // Return the pgd of original mother particle
  // TODO: need also to have specific for D0, electron etc
  // for instance to mark when you have gluon, charm or beauty
  // among the mothers. Or maybe this will be the same anyway?
  // TODO: implement tests on origin, if charm/beauty quark and if
  // they came from gluon. use booleans to set this which can be accessed from 
  // outside? Something like fSequence. 

  if (!p) return kPDGnone;

  Int_t imother=-1;
  Int_t MClabel=0;

  // Either using MClabel set from outside (needed for Dmesons), or find it
  if(fMClabel<0){
    MClabel = p->GetLabel();
    if(MClabel<0){
      return kPDGnone;
    }
  }
  else MClabel=fMClabel;

  // try different classes, unfortunately there is no common base class
  AliAODMCParticle* aodmcp=0;
  if(fUseKine)
    aodmcp=dynamic_cast<AliAODMCParticle*>(p);
  else
    aodmcp=dynamic_cast<AliAODMCParticle*>(fMCParticles->At(MClabel));

  if (!aodmcp) {
    return kPDGnone;
  }
  imother = aodmcp->GetMother();

  // Absolute or +/- on pgd ???
  Int_t pdg=TMath::Abs(aodmcp->GetPdgCode());

  if (imother<0){
    // also check this particle
    CheckOriginMother(pdg);
    return pdg;
  }

  if (!fMCParticles->At(imother)) {
    AliErrorClass(Form("no mc particle with label %d", imother));
    return pdg;
  }

  AliAODMCParticle * mother=dynamic_cast<AliAODMCParticle*>(fMCParticles->At(imother));
  if (!mother) {
    AliErrorClass(Form("mc mother particle of wrong class type %s", fMCParticles->At(imother)->ClassName()));
    return pdg;
  }

  if(bReturnFirstMother){
    return mother->GetPdgCode();
  }

  CheckOriginMother(pdg);
  
  if (mother->GetPdgCode()==kPDGproton){
    // why? - H: This is the proton, can't get further back
    // To be discussed whether to do this a different way
    return pdg;
  }

  //Reset fMClabel to find pdg of mother if looping on D
  fMClabel=-1;
  pdg=FindPdgOriginMother(mother);

  return pdg;  
}

void AliDxHFEToolsMC::CheckOriginMother(int pdg)
{

  // Checking if the particle is a quark or gluon and setting fOriginMother accordingly.
  // Right now only check on quark. Need also check on whether it comes from D or B meson?

  switch(pdg){
  case(kPDGc):
    fOriginMother = kOriginCharm; break;
  case(kPDGb): 
    fOriginMother = kOriginBeauty; break;
  case(kPDGgluon): 
    if(fOriginMother==kOriginCharm) fOriginMother=kOriginGluonCharm;
    else if(fOriginMother==kOriginBeauty) fOriginMother=kOriginGluonBeauty;
    else fOriginMother=kOriginGluon;
    break;
  case(kPDGd):
    if(!TestIfHFquark(fOriginMother))
      fOriginMother=kOriginDown; 
    break;
  case(kPDGu):
    if(!TestIfHFquark(fOriginMother))
      fOriginMother=kOriginUp; 
    break;
  case(kPDGs):
    if(!TestIfHFquark(fOriginMother))
      fOriginMother=kOriginStrange; 
    break;
  }
}

Bool_t AliDxHFEToolsMC::TestIfHFquark(int origin)
{

  // Checking if particle has been marked as charm/beauty quark
  
  Bool_t test=kFALSE;
  switch(origin){
  case(kOriginCharm):
    test=kTRUE; break;
  case(kOriginBeauty): 
    test=kTRUE; break;
  case(kOriginGluonCharm): 
    test=kTRUE; break;
  case(kOriginGluonBeauty): 
    test=kTRUE; break;
  }
  return test; 
}

Bool_t AliDxHFEToolsMC::TestMotherHFMeson(int pdg)
{

  // Checking if the pdg corresponds to a HF meson (D or B meson)

  Bool_t isD = kFALSE;
  Bool_t isB = kFALSE;
  if((pdg>=400 && pdg <500) || (pdg>=4000 && pdg<5000 )) 
    isD = kTRUE;
  if((pdg>=500 && pdg <600) || (pdg>=5000 && pdg<6000 )) 
    {isD = kFALSE; isB = kTRUE;}

  if(isD || isB) return kTRUE;
  else return kFALSE;

}




void AliDxHFEToolsMC::Clear(const char* /*option*/)
{
  // clear internal memory
  fMCParticles=NULL;
  fNrMCParticles=-1;
}


int AliDxHFEToolsMC::CheckMCParticle(AliVParticle* p){

  // Checks if MC particle is desired particle

  AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(p);
  if (!mcPart) {
    AliInfoClass("MC Particle not found in tree, skipping"); 
    return -1;
  }
			
  Int_t PDG =TMath::Abs(mcPart->PdgCode()); 
  int bReject=RejectByPDG(PDG, fPDGs);

  return bReject;

}
 AliDxHFEToolsMC.cxx:1
 AliDxHFEToolsMC.cxx:2
 AliDxHFEToolsMC.cxx:3
 AliDxHFEToolsMC.cxx:4
 AliDxHFEToolsMC.cxx:5
 AliDxHFEToolsMC.cxx:6
 AliDxHFEToolsMC.cxx:7
 AliDxHFEToolsMC.cxx:8
 AliDxHFEToolsMC.cxx:9
 AliDxHFEToolsMC.cxx:10
 AliDxHFEToolsMC.cxx:11
 AliDxHFEToolsMC.cxx:12
 AliDxHFEToolsMC.cxx:13
 AliDxHFEToolsMC.cxx:14
 AliDxHFEToolsMC.cxx:15
 AliDxHFEToolsMC.cxx:16
 AliDxHFEToolsMC.cxx:17
 AliDxHFEToolsMC.cxx:18
 AliDxHFEToolsMC.cxx:19
 AliDxHFEToolsMC.cxx:20
 AliDxHFEToolsMC.cxx:21
 AliDxHFEToolsMC.cxx:22
 AliDxHFEToolsMC.cxx:23
 AliDxHFEToolsMC.cxx:24
 AliDxHFEToolsMC.cxx:25
 AliDxHFEToolsMC.cxx:26
 AliDxHFEToolsMC.cxx:27
 AliDxHFEToolsMC.cxx:28
 AliDxHFEToolsMC.cxx:29
 AliDxHFEToolsMC.cxx:30
 AliDxHFEToolsMC.cxx:31
 AliDxHFEToolsMC.cxx:32
 AliDxHFEToolsMC.cxx:33
 AliDxHFEToolsMC.cxx:34
 AliDxHFEToolsMC.cxx:35
 AliDxHFEToolsMC.cxx:36
 AliDxHFEToolsMC.cxx:37
 AliDxHFEToolsMC.cxx:38
 AliDxHFEToolsMC.cxx:39
 AliDxHFEToolsMC.cxx:40
 AliDxHFEToolsMC.cxx:41
 AliDxHFEToolsMC.cxx:42
 AliDxHFEToolsMC.cxx:43
 AliDxHFEToolsMC.cxx:44
 AliDxHFEToolsMC.cxx:45
 AliDxHFEToolsMC.cxx:46
 AliDxHFEToolsMC.cxx:47
 AliDxHFEToolsMC.cxx:48
 AliDxHFEToolsMC.cxx:49
 AliDxHFEToolsMC.cxx:50
 AliDxHFEToolsMC.cxx:51
 AliDxHFEToolsMC.cxx:52
 AliDxHFEToolsMC.cxx:53
 AliDxHFEToolsMC.cxx:54
 AliDxHFEToolsMC.cxx:55
 AliDxHFEToolsMC.cxx:56
 AliDxHFEToolsMC.cxx:57
 AliDxHFEToolsMC.cxx:58
 AliDxHFEToolsMC.cxx:59
 AliDxHFEToolsMC.cxx:60
 AliDxHFEToolsMC.cxx:61
 AliDxHFEToolsMC.cxx:62
 AliDxHFEToolsMC.cxx:63
 AliDxHFEToolsMC.cxx:64
 AliDxHFEToolsMC.cxx:65
 AliDxHFEToolsMC.cxx:66
 AliDxHFEToolsMC.cxx:67
 AliDxHFEToolsMC.cxx:68
 AliDxHFEToolsMC.cxx:69
 AliDxHFEToolsMC.cxx:70
 AliDxHFEToolsMC.cxx:71
 AliDxHFEToolsMC.cxx:72
 AliDxHFEToolsMC.cxx:73
 AliDxHFEToolsMC.cxx:74
 AliDxHFEToolsMC.cxx:75
 AliDxHFEToolsMC.cxx:76
 AliDxHFEToolsMC.cxx:77
 AliDxHFEToolsMC.cxx:78
 AliDxHFEToolsMC.cxx:79
 AliDxHFEToolsMC.cxx:80
 AliDxHFEToolsMC.cxx:81
 AliDxHFEToolsMC.cxx:82
 AliDxHFEToolsMC.cxx:83
 AliDxHFEToolsMC.cxx:84
 AliDxHFEToolsMC.cxx:85
 AliDxHFEToolsMC.cxx:86
 AliDxHFEToolsMC.cxx:87
 AliDxHFEToolsMC.cxx:88
 AliDxHFEToolsMC.cxx:89
 AliDxHFEToolsMC.cxx:90
 AliDxHFEToolsMC.cxx:91
 AliDxHFEToolsMC.cxx:92
 AliDxHFEToolsMC.cxx:93
 AliDxHFEToolsMC.cxx:94
 AliDxHFEToolsMC.cxx:95
 AliDxHFEToolsMC.cxx:96
 AliDxHFEToolsMC.cxx:97
 AliDxHFEToolsMC.cxx:98
 AliDxHFEToolsMC.cxx:99
 AliDxHFEToolsMC.cxx:100
 AliDxHFEToolsMC.cxx:101
 AliDxHFEToolsMC.cxx:102
 AliDxHFEToolsMC.cxx:103
 AliDxHFEToolsMC.cxx:104
 AliDxHFEToolsMC.cxx:105
 AliDxHFEToolsMC.cxx:106
 AliDxHFEToolsMC.cxx:107
 AliDxHFEToolsMC.cxx:108
 AliDxHFEToolsMC.cxx:109
 AliDxHFEToolsMC.cxx:110
 AliDxHFEToolsMC.cxx:111
 AliDxHFEToolsMC.cxx:112
 AliDxHFEToolsMC.cxx:113
 AliDxHFEToolsMC.cxx:114
 AliDxHFEToolsMC.cxx:115
 AliDxHFEToolsMC.cxx:116
 AliDxHFEToolsMC.cxx:117
 AliDxHFEToolsMC.cxx:118
 AliDxHFEToolsMC.cxx:119
 AliDxHFEToolsMC.cxx:120
 AliDxHFEToolsMC.cxx:121
 AliDxHFEToolsMC.cxx:122
 AliDxHFEToolsMC.cxx:123
 AliDxHFEToolsMC.cxx:124
 AliDxHFEToolsMC.cxx:125
 AliDxHFEToolsMC.cxx:126
 AliDxHFEToolsMC.cxx:127
 AliDxHFEToolsMC.cxx:128
 AliDxHFEToolsMC.cxx:129
 AliDxHFEToolsMC.cxx:130
 AliDxHFEToolsMC.cxx:131
 AliDxHFEToolsMC.cxx:132
 AliDxHFEToolsMC.cxx:133
 AliDxHFEToolsMC.cxx:134
 AliDxHFEToolsMC.cxx:135
 AliDxHFEToolsMC.cxx:136
 AliDxHFEToolsMC.cxx:137
 AliDxHFEToolsMC.cxx:138
 AliDxHFEToolsMC.cxx:139
 AliDxHFEToolsMC.cxx:140
 AliDxHFEToolsMC.cxx:141
 AliDxHFEToolsMC.cxx:142
 AliDxHFEToolsMC.cxx:143
 AliDxHFEToolsMC.cxx:144
 AliDxHFEToolsMC.cxx:145
 AliDxHFEToolsMC.cxx:146
 AliDxHFEToolsMC.cxx:147
 AliDxHFEToolsMC.cxx:148
 AliDxHFEToolsMC.cxx:149
 AliDxHFEToolsMC.cxx:150
 AliDxHFEToolsMC.cxx:151
 AliDxHFEToolsMC.cxx:152
 AliDxHFEToolsMC.cxx:153
 AliDxHFEToolsMC.cxx:154
 AliDxHFEToolsMC.cxx:155
 AliDxHFEToolsMC.cxx:156
 AliDxHFEToolsMC.cxx:157
 AliDxHFEToolsMC.cxx:158
 AliDxHFEToolsMC.cxx:159
 AliDxHFEToolsMC.cxx:160
 AliDxHFEToolsMC.cxx:161
 AliDxHFEToolsMC.cxx:162
 AliDxHFEToolsMC.cxx:163
 AliDxHFEToolsMC.cxx:164
 AliDxHFEToolsMC.cxx:165
 AliDxHFEToolsMC.cxx:166
 AliDxHFEToolsMC.cxx:167
 AliDxHFEToolsMC.cxx:168
 AliDxHFEToolsMC.cxx:169
 AliDxHFEToolsMC.cxx:170
 AliDxHFEToolsMC.cxx:171
 AliDxHFEToolsMC.cxx:172
 AliDxHFEToolsMC.cxx:173
 AliDxHFEToolsMC.cxx:174
 AliDxHFEToolsMC.cxx:175
 AliDxHFEToolsMC.cxx:176
 AliDxHFEToolsMC.cxx:177
 AliDxHFEToolsMC.cxx:178
 AliDxHFEToolsMC.cxx:179
 AliDxHFEToolsMC.cxx:180
 AliDxHFEToolsMC.cxx:181
 AliDxHFEToolsMC.cxx:182
 AliDxHFEToolsMC.cxx:183
 AliDxHFEToolsMC.cxx:184
 AliDxHFEToolsMC.cxx:185
 AliDxHFEToolsMC.cxx:186
 AliDxHFEToolsMC.cxx:187
 AliDxHFEToolsMC.cxx:188
 AliDxHFEToolsMC.cxx:189
 AliDxHFEToolsMC.cxx:190
 AliDxHFEToolsMC.cxx:191
 AliDxHFEToolsMC.cxx:192
 AliDxHFEToolsMC.cxx:193
 AliDxHFEToolsMC.cxx:194
 AliDxHFEToolsMC.cxx:195
 AliDxHFEToolsMC.cxx:196
 AliDxHFEToolsMC.cxx:197
 AliDxHFEToolsMC.cxx:198
 AliDxHFEToolsMC.cxx:199
 AliDxHFEToolsMC.cxx:200
 AliDxHFEToolsMC.cxx:201
 AliDxHFEToolsMC.cxx:202
 AliDxHFEToolsMC.cxx:203
 AliDxHFEToolsMC.cxx:204
 AliDxHFEToolsMC.cxx:205
 AliDxHFEToolsMC.cxx:206
 AliDxHFEToolsMC.cxx:207
 AliDxHFEToolsMC.cxx:208
 AliDxHFEToolsMC.cxx:209
 AliDxHFEToolsMC.cxx:210
 AliDxHFEToolsMC.cxx:211
 AliDxHFEToolsMC.cxx:212
 AliDxHFEToolsMC.cxx:213
 AliDxHFEToolsMC.cxx:214
 AliDxHFEToolsMC.cxx:215
 AliDxHFEToolsMC.cxx:216
 AliDxHFEToolsMC.cxx:217
 AliDxHFEToolsMC.cxx:218
 AliDxHFEToolsMC.cxx:219
 AliDxHFEToolsMC.cxx:220
 AliDxHFEToolsMC.cxx:221
 AliDxHFEToolsMC.cxx:222
 AliDxHFEToolsMC.cxx:223
 AliDxHFEToolsMC.cxx:224
 AliDxHFEToolsMC.cxx:225
 AliDxHFEToolsMC.cxx:226
 AliDxHFEToolsMC.cxx:227
 AliDxHFEToolsMC.cxx:228
 AliDxHFEToolsMC.cxx:229
 AliDxHFEToolsMC.cxx:230
 AliDxHFEToolsMC.cxx:231
 AliDxHFEToolsMC.cxx:232
 AliDxHFEToolsMC.cxx:233
 AliDxHFEToolsMC.cxx:234
 AliDxHFEToolsMC.cxx:235
 AliDxHFEToolsMC.cxx:236
 AliDxHFEToolsMC.cxx:237
 AliDxHFEToolsMC.cxx:238
 AliDxHFEToolsMC.cxx:239
 AliDxHFEToolsMC.cxx:240
 AliDxHFEToolsMC.cxx:241
 AliDxHFEToolsMC.cxx:242
 AliDxHFEToolsMC.cxx:243
 AliDxHFEToolsMC.cxx:244
 AliDxHFEToolsMC.cxx:245
 AliDxHFEToolsMC.cxx:246
 AliDxHFEToolsMC.cxx:247
 AliDxHFEToolsMC.cxx:248
 AliDxHFEToolsMC.cxx:249
 AliDxHFEToolsMC.cxx:250
 AliDxHFEToolsMC.cxx:251
 AliDxHFEToolsMC.cxx:252
 AliDxHFEToolsMC.cxx:253
 AliDxHFEToolsMC.cxx:254
 AliDxHFEToolsMC.cxx:255
 AliDxHFEToolsMC.cxx:256
 AliDxHFEToolsMC.cxx:257
 AliDxHFEToolsMC.cxx:258
 AliDxHFEToolsMC.cxx:259
 AliDxHFEToolsMC.cxx:260
 AliDxHFEToolsMC.cxx:261
 AliDxHFEToolsMC.cxx:262
 AliDxHFEToolsMC.cxx:263
 AliDxHFEToolsMC.cxx:264
 AliDxHFEToolsMC.cxx:265
 AliDxHFEToolsMC.cxx:266
 AliDxHFEToolsMC.cxx:267
 AliDxHFEToolsMC.cxx:268
 AliDxHFEToolsMC.cxx:269
 AliDxHFEToolsMC.cxx:270
 AliDxHFEToolsMC.cxx:271
 AliDxHFEToolsMC.cxx:272
 AliDxHFEToolsMC.cxx:273
 AliDxHFEToolsMC.cxx:274
 AliDxHFEToolsMC.cxx:275
 AliDxHFEToolsMC.cxx:276
 AliDxHFEToolsMC.cxx:277
 AliDxHFEToolsMC.cxx:278
 AliDxHFEToolsMC.cxx:279
 AliDxHFEToolsMC.cxx:280
 AliDxHFEToolsMC.cxx:281
 AliDxHFEToolsMC.cxx:282
 AliDxHFEToolsMC.cxx:283
 AliDxHFEToolsMC.cxx:284
 AliDxHFEToolsMC.cxx:285
 AliDxHFEToolsMC.cxx:286
 AliDxHFEToolsMC.cxx:287
 AliDxHFEToolsMC.cxx:288
 AliDxHFEToolsMC.cxx:289
 AliDxHFEToolsMC.cxx:290
 AliDxHFEToolsMC.cxx:291
 AliDxHFEToolsMC.cxx:292
 AliDxHFEToolsMC.cxx:293
 AliDxHFEToolsMC.cxx:294
 AliDxHFEToolsMC.cxx:295
 AliDxHFEToolsMC.cxx:296
 AliDxHFEToolsMC.cxx:297
 AliDxHFEToolsMC.cxx:298
 AliDxHFEToolsMC.cxx:299
 AliDxHFEToolsMC.cxx:300
 AliDxHFEToolsMC.cxx:301
 AliDxHFEToolsMC.cxx:302
 AliDxHFEToolsMC.cxx:303
 AliDxHFEToolsMC.cxx:304
 AliDxHFEToolsMC.cxx:305
 AliDxHFEToolsMC.cxx:306
 AliDxHFEToolsMC.cxx:307
 AliDxHFEToolsMC.cxx:308
 AliDxHFEToolsMC.cxx:309
 AliDxHFEToolsMC.cxx:310
 AliDxHFEToolsMC.cxx:311
 AliDxHFEToolsMC.cxx:312
 AliDxHFEToolsMC.cxx:313
 AliDxHFEToolsMC.cxx:314
 AliDxHFEToolsMC.cxx:315
 AliDxHFEToolsMC.cxx:316
 AliDxHFEToolsMC.cxx:317
 AliDxHFEToolsMC.cxx:318
 AliDxHFEToolsMC.cxx:319
 AliDxHFEToolsMC.cxx:320
 AliDxHFEToolsMC.cxx:321
 AliDxHFEToolsMC.cxx:322
 AliDxHFEToolsMC.cxx:323
 AliDxHFEToolsMC.cxx:324
 AliDxHFEToolsMC.cxx:325
 AliDxHFEToolsMC.cxx:326
 AliDxHFEToolsMC.cxx:327
 AliDxHFEToolsMC.cxx:328
 AliDxHFEToolsMC.cxx:329
 AliDxHFEToolsMC.cxx:330
 AliDxHFEToolsMC.cxx:331
 AliDxHFEToolsMC.cxx:332
 AliDxHFEToolsMC.cxx:333
 AliDxHFEToolsMC.cxx:334
 AliDxHFEToolsMC.cxx:335
 AliDxHFEToolsMC.cxx:336
 AliDxHFEToolsMC.cxx:337
 AliDxHFEToolsMC.cxx:338
 AliDxHFEToolsMC.cxx:339
 AliDxHFEToolsMC.cxx:340
 AliDxHFEToolsMC.cxx:341
 AliDxHFEToolsMC.cxx:342
 AliDxHFEToolsMC.cxx:343
 AliDxHFEToolsMC.cxx:344
 AliDxHFEToolsMC.cxx:345
 AliDxHFEToolsMC.cxx:346
 AliDxHFEToolsMC.cxx:347
 AliDxHFEToolsMC.cxx:348
 AliDxHFEToolsMC.cxx:349
 AliDxHFEToolsMC.cxx:350
 AliDxHFEToolsMC.cxx:351
 AliDxHFEToolsMC.cxx:352
 AliDxHFEToolsMC.cxx:353
 AliDxHFEToolsMC.cxx:354
 AliDxHFEToolsMC.cxx:355
 AliDxHFEToolsMC.cxx:356
 AliDxHFEToolsMC.cxx:357
 AliDxHFEToolsMC.cxx:358
 AliDxHFEToolsMC.cxx:359
 AliDxHFEToolsMC.cxx:360
 AliDxHFEToolsMC.cxx:361
 AliDxHFEToolsMC.cxx:362
 AliDxHFEToolsMC.cxx:363
 AliDxHFEToolsMC.cxx:364
 AliDxHFEToolsMC.cxx:365
 AliDxHFEToolsMC.cxx:366
 AliDxHFEToolsMC.cxx:367
 AliDxHFEToolsMC.cxx:368
 AliDxHFEToolsMC.cxx:369
 AliDxHFEToolsMC.cxx:370
 AliDxHFEToolsMC.cxx:371
 AliDxHFEToolsMC.cxx:372
 AliDxHFEToolsMC.cxx:373
 AliDxHFEToolsMC.cxx:374
 AliDxHFEToolsMC.cxx:375
 AliDxHFEToolsMC.cxx:376
 AliDxHFEToolsMC.cxx:377
 AliDxHFEToolsMC.cxx:378
 AliDxHFEToolsMC.cxx:379
 AliDxHFEToolsMC.cxx:380
 AliDxHFEToolsMC.cxx:381
 AliDxHFEToolsMC.cxx:382
 AliDxHFEToolsMC.cxx:383
 AliDxHFEToolsMC.cxx:384
 AliDxHFEToolsMC.cxx:385
 AliDxHFEToolsMC.cxx:386
 AliDxHFEToolsMC.cxx:387
 AliDxHFEToolsMC.cxx:388
 AliDxHFEToolsMC.cxx:389
 AliDxHFEToolsMC.cxx:390
 AliDxHFEToolsMC.cxx:391
 AliDxHFEToolsMC.cxx:392
 AliDxHFEToolsMC.cxx:393
 AliDxHFEToolsMC.cxx:394
 AliDxHFEToolsMC.cxx:395
 AliDxHFEToolsMC.cxx:396
 AliDxHFEToolsMC.cxx:397
 AliDxHFEToolsMC.cxx:398
 AliDxHFEToolsMC.cxx:399
 AliDxHFEToolsMC.cxx:400
 AliDxHFEToolsMC.cxx:401
 AliDxHFEToolsMC.cxx:402
 AliDxHFEToolsMC.cxx:403
 AliDxHFEToolsMC.cxx:404
 AliDxHFEToolsMC.cxx:405
 AliDxHFEToolsMC.cxx:406
 AliDxHFEToolsMC.cxx:407
 AliDxHFEToolsMC.cxx:408
 AliDxHFEToolsMC.cxx:409
 AliDxHFEToolsMC.cxx:410
 AliDxHFEToolsMC.cxx:411
 AliDxHFEToolsMC.cxx:412
 AliDxHFEToolsMC.cxx:413
 AliDxHFEToolsMC.cxx:414
 AliDxHFEToolsMC.cxx:415
 AliDxHFEToolsMC.cxx:416
 AliDxHFEToolsMC.cxx:417
 AliDxHFEToolsMC.cxx:418
 AliDxHFEToolsMC.cxx:419
 AliDxHFEToolsMC.cxx:420
 AliDxHFEToolsMC.cxx:421
 AliDxHFEToolsMC.cxx:422
 AliDxHFEToolsMC.cxx:423
 AliDxHFEToolsMC.cxx:424
 AliDxHFEToolsMC.cxx:425
 AliDxHFEToolsMC.cxx:426
 AliDxHFEToolsMC.cxx:427
 AliDxHFEToolsMC.cxx:428
 AliDxHFEToolsMC.cxx:429
 AliDxHFEToolsMC.cxx:430
 AliDxHFEToolsMC.cxx:431
 AliDxHFEToolsMC.cxx:432
 AliDxHFEToolsMC.cxx:433
 AliDxHFEToolsMC.cxx:434
 AliDxHFEToolsMC.cxx:435
 AliDxHFEToolsMC.cxx:436
 AliDxHFEToolsMC.cxx:437
 AliDxHFEToolsMC.cxx:438
 AliDxHFEToolsMC.cxx:439
 AliDxHFEToolsMC.cxx:440
 AliDxHFEToolsMC.cxx:441
 AliDxHFEToolsMC.cxx:442
 AliDxHFEToolsMC.cxx:443
 AliDxHFEToolsMC.cxx:444
 AliDxHFEToolsMC.cxx:445
 AliDxHFEToolsMC.cxx:446
 AliDxHFEToolsMC.cxx:447
 AliDxHFEToolsMC.cxx:448
 AliDxHFEToolsMC.cxx:449
 AliDxHFEToolsMC.cxx:450
 AliDxHFEToolsMC.cxx:451
 AliDxHFEToolsMC.cxx:452
 AliDxHFEToolsMC.cxx:453
 AliDxHFEToolsMC.cxx:454
 AliDxHFEToolsMC.cxx:455
 AliDxHFEToolsMC.cxx:456
 AliDxHFEToolsMC.cxx:457
 AliDxHFEToolsMC.cxx:458
 AliDxHFEToolsMC.cxx:459
 AliDxHFEToolsMC.cxx:460
 AliDxHFEToolsMC.cxx:461
 AliDxHFEToolsMC.cxx:462
 AliDxHFEToolsMC.cxx:463
 AliDxHFEToolsMC.cxx:464
 AliDxHFEToolsMC.cxx:465
 AliDxHFEToolsMC.cxx:466
 AliDxHFEToolsMC.cxx:467
 AliDxHFEToolsMC.cxx:468
 AliDxHFEToolsMC.cxx:469
 AliDxHFEToolsMC.cxx:470
 AliDxHFEToolsMC.cxx:471
 AliDxHFEToolsMC.cxx:472
 AliDxHFEToolsMC.cxx:473
 AliDxHFEToolsMC.cxx:474
 AliDxHFEToolsMC.cxx:475
 AliDxHFEToolsMC.cxx:476
 AliDxHFEToolsMC.cxx:477