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   AliDxHFEParticleSelectionMCEl.cxx
/// @author Hege Erdal, Matthias Richter
/// @date   2012-07-19
/// @brief  MC El selection for D0-HFE correlation
///

#include "AliDxHFEParticleSelectionMCEl.h"
#include "AliVParticle.h"
#include "AliLog.h"
#include "THnSparse.h"
#include "AliAODMCParticle.h"
#include "TH1F.h"
#include "TAxis.h"
#include "AliAODTrack.h"
#include "AliReducedParticle.h"
#include <iostream>
#include <cerrno>
#include <memory>

using namespace std;
using std::vector;


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

AliDxHFEParticleSelectionMCEl::AliDxHFEParticleSelectionMCEl(const char* opt)
  : AliDxHFEParticleSelectionEl(opt)
  , fMCTools()
  , fPDGnotMCElectron(NULL)
  , fPDGNotHFMother(NULL)
  , fOriginMother(0)
  , fResultMC(0)
  , fUseKine(kFALSE)
  , fMotherPDGs(0)
  , fUseMCReco(kFALSE)
  , fSelectionStep(AliDxHFEParticleSelectionEl::kNoCuts)
  , fStoreCutStepInfo(kFALSE)
{
  // constructor
  // 
  // 
  // 
  // 

  fMCTools.~AliDxHFEToolsMC();

  ParseArguments(opt);

  // This is also checked in AddTasks, but just for safety! 
  if(fUseMCReco && fUseKine) AliFatal("CAN'T SET BOTH usekine AND elmcreco AT THE SAME TIME");

  // TODO: argument scan, build tool options accordingly
  // e.g. set mc mode first/last, skip control histograms
  TString toolopt("pdg=11 mc-last");
  if(fUseKine) toolopt+=" usekine";
  new (&fMCTools) AliDxHFEToolsMC(toolopt);
}

//at the moment not used, keep for now (to be used when plotting)
const char* AliDxHFEParticleSelectionMCEl::fgkPDGMotherBinLabels[]={
  "d",
  "u",
  "s",
  "c",
  "b",
  "gluon",
  "gamma",
  "#pi^{0}",
  "#eta",
  "proton",
  "others"
};

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

AliDxHFEParticleSelectionMCEl::~AliDxHFEParticleSelectionMCEl()
{
  // destructor

  if(fPDGnotMCElectron){
    delete fPDGnotMCElectron;
    fPDGnotMCElectron=NULL;
  }

}

int AliDxHFEParticleSelectionMCEl::Init()
{
  //
  // init function
  // 

  // Particles considered HFE background. can be expanded
  fMotherPDGs.push_back(AliDxHFEToolsMC::kPDGpi0); 
  fMotherPDGs.push_back(AliDxHFEToolsMC::kPDGeta);
  fMotherPDGs.push_back(AliDxHFEToolsMC::kPDGgamma);
  fMotherPDGs.push_back(AliDxHFEToolsMC::kPDGJpsi);

  int iResult=0;
  iResult=AliDxHFEParticleSelectionEl::Init();
  if (iResult<0) return iResult;

  // Histo containing PDG of track which was not MC truth electron
  // TODO: Add to list in baseclass
  fPDGnotMCElectron=CreateControlHistogram("fPDGnotMCElectron","PDG of track not MC truth electron",AliDxHFEToolsMC::kNofPDGLabels,fgkPDGBinLabels);  
  fPDGNotHFMother=CreateControlHistogram("fPDGNotHFMother","PDG of mother not HF",5000);  
  AddControlObject(fPDGnotMCElectron);
  AddControlObject(fPDGNotHFMother);
  return 0;
}

THnSparse* AliDxHFEParticleSelectionMCEl::DefineTHnSparse()
{
  //
  // Defines the THnSparse. 

  const double Pi=TMath::Pi();
  TString name;
  THnSparse* thn=NULL;
  name.Form("%s info", GetName());

  if(fStoreCutStepInfo){
    const int thnSizeExt =5;

    InitTHnSparseArray(thnSizeExt);

    // TODO: Redo binning of distributions more?
    //     		       0    1      2     3     
    // 	 	               Pt   Phi   Eta   mother 
    int    thnBinsExt[thnSizeExt] = { 100,  100, 100,    15, kNCutLabels };
    double thnMinExt [thnSizeExt] = {   0,    0, -1.,  -1.5, kRecKineITSTPC };
    double thnMaxExt [thnSizeExt] = {  10, 2*Pi,  1.,  13.5, kSelected };
    const char* thnNamesExt[thnSizeExt]={
      "Pt",
      "Phi",
      "Eta", 
      "Mother", //bin==-1: Not MC truth electron
      "Last survived cut step"
    };
    thn=(THnSparse*)CreateControlTHnSparse(name,thnSizeExt,thnBinsExt,thnMinExt,thnMaxExt,thnNamesExt);
  }
  else{

    const int thnSize =4;
    InitTHnSparseArray(thnSize);

    // TODO: Redo binning of distributions more?
    //     		       0    1      2     3     
    // 	 	               Pt   Phi   Eta   mother 
    int    thnBins[thnSize] = { 100,  100, 100,    15  };
    double thnMin [thnSize] = {   0,    0, -1.,  -1.5  };
    double thnMax [thnSize] = {  10, 2*Pi,  1.,  13.5  };
    const char* thnNames[thnSize]={
      "Pt",
      "Phi",
      "Eta", 
      "Mother", //bin==-1: Not MC truth electron
    };
    thn=(THnSparse*)CreateControlTHnSparse(name,thnSize,thnBins,thnMin,thnMax,thnNames);

  }
  return thn;
}

int AliDxHFEParticleSelectionMCEl::FillParticleProperties(AliVParticle* p, Double_t* data, int dimension) const
{
  // fill the data array from the particle data
  if (!data) return -EINVAL;
  if (!p) return -ENODATA;
  // handle different types of tracks, can be extended
  AliReducedParticle *trRP=dynamic_cast<AliReducedParticle*>(p);
  int i=0;
  if (dimension!=GetDimTHnSparse()) {
    // TODO: think about filling only the available data and throwing a warning
    return -ENOSPC;
  }
  memset(data, 0, dimension*sizeof(data[0]));
  data[i++]=p->Pt();
  data[i++]=p->Phi();
  data[i++]=p->Eta();
  if (trRP) data[i]=trRP->GetOriginMother();
  else data[i]=fOriginMother;
  i++; // take out of conditionals to be save
  if (i<dimension) {
    if(fStoreCutStepInfo) data[i]=GetLastSurvivedCutsStep();
    i++; // take out of conditionals to be save
  }
  return i;
}

int AliDxHFEParticleSelectionMCEl::IsSelected(AliVParticle* p, const AliVEvent* pEvent)
{
  /// overloaded from AliDxHFEParticleSelection: check particle
  /// H: Have changed function. Now doing particle selection first, then run MC over 
  /// selected tracks. Could configure it to be configurable, but not sure if it
  /// is needed.  
  /// Result from normal track selection is returned, result from MC is stored in
  /// THnSparse. 

  int iResult=0;
  if (!p || !pEvent){
    return -EINVAL;
  }
  fOriginMother=-1;

  if(!fUseKine && !fUseMCReco){
  // step 1:
  // optional MC selection before the particle selection
  if (fMCTools.MCFirst() && (iResult=CheckMC(p, pEvent))==0) {
    // histograming?
    return iResult;
  }

  // step 2 or 1, depending on sequence:
  // normal particle selection
  iResult=AliDxHFEParticleSelectionEl::IsSelected(p, pEvent);
  if (fMCTools.MCFirst() || iResult==0) return iResult;


  }

  // step 2, only executed if MC check is last
  // optional MC selection after the particle selection
  // result stored to be filled into THnSparse
  // TODO: strictly speaken the particles should be rejected
  // if not mc selected, however skip this for the moment, because of
  // the logic outside
  // This line will run always when running directly over the stack or over MC reconstructed tracks
  // For MC reconstructed tracks, should consider adding more constrictions on the tracks,
  // maybe do the track selection first (which means could call AliDxHFEParticleSelectionEl::IsSelected()
  // and don't do PID
  
  if(fUseMCReco) {// && ( fSelectionStep > AliDxHFEParticleSelectionEl::kNoCuts )){
    // always check the base class method in mode fUseMCReco
    iResult=AliDxHFEParticleSelectionEl::IsSelected(p, pEvent);
    if(iResult == 0) return iResult;
  }
  fResultMC=CheckMC(p, pEvent);
  
  if(fUseKine || fUseMCReco)
    return fResultMC;

  return iResult;
   
}

int AliDxHFEParticleSelectionMCEl::CheckMC(AliVParticle* p, const AliVEvent* pEvent)
{
  /// check if MC criteria are fulfilled
  if (!p || !pEvent){
    return -EINVAL;
  }
  int iResult=0;

  if (!fMCTools.IsInitialized() && (iResult=fMCTools.InitMCParticles(pEvent))<0) {
    // TODO: message? but has to be filtered in order to avoid message flood
    return 0; // no meaningful filtering on mc possible
  }

  if(fUseKine){
    // If run on kinematical level, check if particle is electron (only ones who are relevant) 
    // and if pass IsPhysicalPrimary()
    Int_t test = fMCTools.CheckMCParticle(p);
    if(test==1) return 0;
    // Add additional contraints on the electrons? 
    // remove delta e? also remove E<300MeV?
    // Should also mark dalitz decay and gamma conversion..
    AliAODMCParticle *mcp=dynamic_cast<AliAODMCParticle*>(p);
    if(!mcp || !mcp->IsPhysicalPrimary()) return 0; 

  }

  int pdgParticle=-1;
  if (!fUseKine && fMCTools.RejectByPDG(p,false, &pdgParticle)) {
    // rejected by pdg
    // TODO: Move this to fMCTools???? Can this be part of the statistics in the MC class?
    fPDGnotMCElectron->Fill(fMCTools.MapPDGLabel(pdgParticle));
    return 0;
  }

  int pdgMother=0;
  // Find PDG of first mother
  pdgMother=fMCTools.FindMotherPDG(p,AliDxHFEToolsMC::kGetFirstMother);

  // Check if first mother is counted as background
  Bool_t isNotBackground=fMCTools.RejectByPDG(pdgMother,fMotherPDGs);

  if(!isNotBackground){
    // Set fOriginMother if mother is counted as background
    // TODO: Could this be done in a more elegant way?
    switch(pdgMother){
    case(AliDxHFEToolsMC::kPDGpi0): fOriginMother=AliDxHFEToolsMC::kNrOrginMother; break;
    case(AliDxHFEToolsMC::kPDGeta): fOriginMother=AliDxHFEToolsMC::kNrOrginMother+1; break;
    case(AliDxHFEToolsMC::kPDGgamma): fOriginMother=AliDxHFEToolsMC::kNrOrginMother+2;break;
    case(AliDxHFEToolsMC::kPDGJpsi): fOriginMother=AliDxHFEToolsMC::kNrOrginMother+3;break;
    }
  }
  else{
    // If loop over Stack, also checks if First mother is a HF meson
    Bool_t isHFmeson =fMCTools.TestMotherHFMeson(TMath::Abs(pdgMother));

    if(isHFmeson){
      // If first mother is a HF meson, loops back to find 
      // original quark + if there was a gluon. Result is 
      // stored in fOriginMother
      pdgMother=fMCTools.FindMotherPDG(p,AliDxHFEToolsMC::kGetOriginMother);
      fOriginMother=fMCTools.GetOriginMother();
    }
    else{
      //NotHFmother
      fPDGNotHFMother->Fill(pdgMother);
      fOriginMother=AliDxHFEToolsMC::kNrOrginMother+4;
    }

  }

  return 1;
}

void AliDxHFEParticleSelectionMCEl::Clear(const char* option)
{
  /// clear internal memory
  fMCTools.Clear(option);
}

AliVParticle *AliDxHFEParticleSelectionMCEl::CreateParticle(AliVParticle* track)
{

  AliReducedParticle *part = new AliReducedParticle(track->Eta(), track->Phi(), track->Pt(),track->Charge(),fOriginMother);

  return part;

}

int AliDxHFEParticleSelectionMCEl::ParseArguments(const char* arguments)
{
  // parse arguments and set internal flags
  TString strArguments(arguments);
  auto_ptr<TObjArray> tokens(strArguments.Tokenize(" "));
  if (!tokens.get()) return 0;

  AliInfo(strArguments);
  TIter next(tokens.get());
  TObject* token;
  while ((token=next())) {
    TString argument=token->GetName();
    if (argument.BeginsWith("usekine") ){
      fUseKine=kTRUE;
      continue;
    }
    if (argument.BeginsWith("elmcreco")){
      fUseMCReco=kTRUE;
      if(argument.BeginsWith("elmcreco=")){
	argument.ReplaceAll("elmcreco=", "");
	if(argument.CompareTo("alltracks")==0) fSelectionStep=AliDxHFEParticleSelectionEl::kNoCuts;
	if(argument.CompareTo("afterreckineitstpc")==0) fSelectionStep=AliDxHFEParticleSelectionEl::kRecKineITSTPC;
	if(argument.CompareTo("afterrecprim")==0) fSelectionStep=AliDxHFEParticleSelectionEl::kRecPrim;
	if(argument.CompareTo("afterhfeits")==0) fSelectionStep=AliDxHFEParticleSelectionEl::kHFEcutsITS;
	if(argument.CompareTo("afterhfetof")==0) fSelectionStep=AliDxHFEParticleSelectionEl::kHFEcutsTOF;
	if(argument.CompareTo("afterhfetpc")==0) fSelectionStep=AliDxHFEParticleSelectionEl::kHFEcutsTPC;
	if(argument.CompareTo("aftertrackcuts")==0) fSelectionStep=AliDxHFEParticleSelectionEl::kHFEcutsTPC;
	if(argument.CompareTo("aftertofpid")==0) fSelectionStep=AliDxHFEParticleSelectionEl::kPIDTOF;
	if(argument.CompareTo("aftertpcpid")==0) fSelectionStep=AliDxHFEParticleSelectionEl::kPIDTPC;
	if(argument.CompareTo("afterfullpid")==0) fSelectionStep=AliDxHFEParticleSelectionEl::kPIDTOFTPC;

	AliDxHFEParticleSelectionEl::SetFinalCutStep(fSelectionStep);
      }
	continue;
    }
    if(argument.BeginsWith("storelastcutstep")){
      AliInfo("Stores the last cut step");
      fUseMCReco=kTRUE;
      fStoreCutStepInfo=kTRUE;
      AliDxHFEParticleSelectionEl::SetStoreLastCutStep(kTRUE);
      continue;
    }
    // forwarding of single argument works, unless key-option pairs separated
    // by blanks are introduced
    AliDxHFEParticleSelection::ParseArguments(argument);
  }
  
  return 0;
}
 AliDxHFEParticleSelectionMCEl.cxx:1
 AliDxHFEParticleSelectionMCEl.cxx:2
 AliDxHFEParticleSelectionMCEl.cxx:3
 AliDxHFEParticleSelectionMCEl.cxx:4
 AliDxHFEParticleSelectionMCEl.cxx:5
 AliDxHFEParticleSelectionMCEl.cxx:6
 AliDxHFEParticleSelectionMCEl.cxx:7
 AliDxHFEParticleSelectionMCEl.cxx:8
 AliDxHFEParticleSelectionMCEl.cxx:9
 AliDxHFEParticleSelectionMCEl.cxx:10
 AliDxHFEParticleSelectionMCEl.cxx:11
 AliDxHFEParticleSelectionMCEl.cxx:12
 AliDxHFEParticleSelectionMCEl.cxx:13
 AliDxHFEParticleSelectionMCEl.cxx:14
 AliDxHFEParticleSelectionMCEl.cxx:15
 AliDxHFEParticleSelectionMCEl.cxx:16
 AliDxHFEParticleSelectionMCEl.cxx:17
 AliDxHFEParticleSelectionMCEl.cxx:18
 AliDxHFEParticleSelectionMCEl.cxx:19
 AliDxHFEParticleSelectionMCEl.cxx:20
 AliDxHFEParticleSelectionMCEl.cxx:21
 AliDxHFEParticleSelectionMCEl.cxx:22
 AliDxHFEParticleSelectionMCEl.cxx:23
 AliDxHFEParticleSelectionMCEl.cxx:24
 AliDxHFEParticleSelectionMCEl.cxx:25
 AliDxHFEParticleSelectionMCEl.cxx:26
 AliDxHFEParticleSelectionMCEl.cxx:27
 AliDxHFEParticleSelectionMCEl.cxx:28
 AliDxHFEParticleSelectionMCEl.cxx:29
 AliDxHFEParticleSelectionMCEl.cxx:30
 AliDxHFEParticleSelectionMCEl.cxx:31
 AliDxHFEParticleSelectionMCEl.cxx:32
 AliDxHFEParticleSelectionMCEl.cxx:33
 AliDxHFEParticleSelectionMCEl.cxx:34
 AliDxHFEParticleSelectionMCEl.cxx:35
 AliDxHFEParticleSelectionMCEl.cxx:36
 AliDxHFEParticleSelectionMCEl.cxx:37
 AliDxHFEParticleSelectionMCEl.cxx:38
 AliDxHFEParticleSelectionMCEl.cxx:39
 AliDxHFEParticleSelectionMCEl.cxx:40
 AliDxHFEParticleSelectionMCEl.cxx:41
 AliDxHFEParticleSelectionMCEl.cxx:42
 AliDxHFEParticleSelectionMCEl.cxx:43
 AliDxHFEParticleSelectionMCEl.cxx:44
 AliDxHFEParticleSelectionMCEl.cxx:45
 AliDxHFEParticleSelectionMCEl.cxx:46
 AliDxHFEParticleSelectionMCEl.cxx:47
 AliDxHFEParticleSelectionMCEl.cxx:48
 AliDxHFEParticleSelectionMCEl.cxx:49
 AliDxHFEParticleSelectionMCEl.cxx:50
 AliDxHFEParticleSelectionMCEl.cxx:51
 AliDxHFEParticleSelectionMCEl.cxx:52
 AliDxHFEParticleSelectionMCEl.cxx:53
 AliDxHFEParticleSelectionMCEl.cxx:54
 AliDxHFEParticleSelectionMCEl.cxx:55
 AliDxHFEParticleSelectionMCEl.cxx:56
 AliDxHFEParticleSelectionMCEl.cxx:57
 AliDxHFEParticleSelectionMCEl.cxx:58
 AliDxHFEParticleSelectionMCEl.cxx:59
 AliDxHFEParticleSelectionMCEl.cxx:60
 AliDxHFEParticleSelectionMCEl.cxx:61
 AliDxHFEParticleSelectionMCEl.cxx:62
 AliDxHFEParticleSelectionMCEl.cxx:63
 AliDxHFEParticleSelectionMCEl.cxx:64
 AliDxHFEParticleSelectionMCEl.cxx:65
 AliDxHFEParticleSelectionMCEl.cxx:66
 AliDxHFEParticleSelectionMCEl.cxx:67
 AliDxHFEParticleSelectionMCEl.cxx:68
 AliDxHFEParticleSelectionMCEl.cxx:69
 AliDxHFEParticleSelectionMCEl.cxx:70
 AliDxHFEParticleSelectionMCEl.cxx:71
 AliDxHFEParticleSelectionMCEl.cxx:72
 AliDxHFEParticleSelectionMCEl.cxx:73
 AliDxHFEParticleSelectionMCEl.cxx:74
 AliDxHFEParticleSelectionMCEl.cxx:75
 AliDxHFEParticleSelectionMCEl.cxx:76
 AliDxHFEParticleSelectionMCEl.cxx:77
 AliDxHFEParticleSelectionMCEl.cxx:78
 AliDxHFEParticleSelectionMCEl.cxx:79
 AliDxHFEParticleSelectionMCEl.cxx:80
 AliDxHFEParticleSelectionMCEl.cxx:81
 AliDxHFEParticleSelectionMCEl.cxx:82
 AliDxHFEParticleSelectionMCEl.cxx:83
 AliDxHFEParticleSelectionMCEl.cxx:84
 AliDxHFEParticleSelectionMCEl.cxx:85
 AliDxHFEParticleSelectionMCEl.cxx:86
 AliDxHFEParticleSelectionMCEl.cxx:87
 AliDxHFEParticleSelectionMCEl.cxx:88
 AliDxHFEParticleSelectionMCEl.cxx:89
 AliDxHFEParticleSelectionMCEl.cxx:90
 AliDxHFEParticleSelectionMCEl.cxx:91
 AliDxHFEParticleSelectionMCEl.cxx:92
 AliDxHFEParticleSelectionMCEl.cxx:93
 AliDxHFEParticleSelectionMCEl.cxx:94
 AliDxHFEParticleSelectionMCEl.cxx:95
 AliDxHFEParticleSelectionMCEl.cxx:96
 AliDxHFEParticleSelectionMCEl.cxx:97
 AliDxHFEParticleSelectionMCEl.cxx:98
 AliDxHFEParticleSelectionMCEl.cxx:99
 AliDxHFEParticleSelectionMCEl.cxx:100
 AliDxHFEParticleSelectionMCEl.cxx:101
 AliDxHFEParticleSelectionMCEl.cxx:102
 AliDxHFEParticleSelectionMCEl.cxx:103
 AliDxHFEParticleSelectionMCEl.cxx:104
 AliDxHFEParticleSelectionMCEl.cxx:105
 AliDxHFEParticleSelectionMCEl.cxx:106
 AliDxHFEParticleSelectionMCEl.cxx:107
 AliDxHFEParticleSelectionMCEl.cxx:108
 AliDxHFEParticleSelectionMCEl.cxx:109
 AliDxHFEParticleSelectionMCEl.cxx:110
 AliDxHFEParticleSelectionMCEl.cxx:111
 AliDxHFEParticleSelectionMCEl.cxx:112
 AliDxHFEParticleSelectionMCEl.cxx:113
 AliDxHFEParticleSelectionMCEl.cxx:114
 AliDxHFEParticleSelectionMCEl.cxx:115
 AliDxHFEParticleSelectionMCEl.cxx:116
 AliDxHFEParticleSelectionMCEl.cxx:117
 AliDxHFEParticleSelectionMCEl.cxx:118
 AliDxHFEParticleSelectionMCEl.cxx:119
 AliDxHFEParticleSelectionMCEl.cxx:120
 AliDxHFEParticleSelectionMCEl.cxx:121
 AliDxHFEParticleSelectionMCEl.cxx:122
 AliDxHFEParticleSelectionMCEl.cxx:123
 AliDxHFEParticleSelectionMCEl.cxx:124
 AliDxHFEParticleSelectionMCEl.cxx:125
 AliDxHFEParticleSelectionMCEl.cxx:126
 AliDxHFEParticleSelectionMCEl.cxx:127
 AliDxHFEParticleSelectionMCEl.cxx:128
 AliDxHFEParticleSelectionMCEl.cxx:129
 AliDxHFEParticleSelectionMCEl.cxx:130
 AliDxHFEParticleSelectionMCEl.cxx:131
 AliDxHFEParticleSelectionMCEl.cxx:132
 AliDxHFEParticleSelectionMCEl.cxx:133
 AliDxHFEParticleSelectionMCEl.cxx:134
 AliDxHFEParticleSelectionMCEl.cxx:135
 AliDxHFEParticleSelectionMCEl.cxx:136
 AliDxHFEParticleSelectionMCEl.cxx:137
 AliDxHFEParticleSelectionMCEl.cxx:138
 AliDxHFEParticleSelectionMCEl.cxx:139
 AliDxHFEParticleSelectionMCEl.cxx:140
 AliDxHFEParticleSelectionMCEl.cxx:141
 AliDxHFEParticleSelectionMCEl.cxx:142
 AliDxHFEParticleSelectionMCEl.cxx:143
 AliDxHFEParticleSelectionMCEl.cxx:144
 AliDxHFEParticleSelectionMCEl.cxx:145
 AliDxHFEParticleSelectionMCEl.cxx:146
 AliDxHFEParticleSelectionMCEl.cxx:147
 AliDxHFEParticleSelectionMCEl.cxx:148
 AliDxHFEParticleSelectionMCEl.cxx:149
 AliDxHFEParticleSelectionMCEl.cxx:150
 AliDxHFEParticleSelectionMCEl.cxx:151
 AliDxHFEParticleSelectionMCEl.cxx:152
 AliDxHFEParticleSelectionMCEl.cxx:153
 AliDxHFEParticleSelectionMCEl.cxx:154
 AliDxHFEParticleSelectionMCEl.cxx:155
 AliDxHFEParticleSelectionMCEl.cxx:156
 AliDxHFEParticleSelectionMCEl.cxx:157
 AliDxHFEParticleSelectionMCEl.cxx:158
 AliDxHFEParticleSelectionMCEl.cxx:159
 AliDxHFEParticleSelectionMCEl.cxx:160
 AliDxHFEParticleSelectionMCEl.cxx:161
 AliDxHFEParticleSelectionMCEl.cxx:162
 AliDxHFEParticleSelectionMCEl.cxx:163
 AliDxHFEParticleSelectionMCEl.cxx:164
 AliDxHFEParticleSelectionMCEl.cxx:165
 AliDxHFEParticleSelectionMCEl.cxx:166
 AliDxHFEParticleSelectionMCEl.cxx:167
 AliDxHFEParticleSelectionMCEl.cxx:168
 AliDxHFEParticleSelectionMCEl.cxx:169
 AliDxHFEParticleSelectionMCEl.cxx:170
 AliDxHFEParticleSelectionMCEl.cxx:171
 AliDxHFEParticleSelectionMCEl.cxx:172
 AliDxHFEParticleSelectionMCEl.cxx:173
 AliDxHFEParticleSelectionMCEl.cxx:174
 AliDxHFEParticleSelectionMCEl.cxx:175
 AliDxHFEParticleSelectionMCEl.cxx:176
 AliDxHFEParticleSelectionMCEl.cxx:177
 AliDxHFEParticleSelectionMCEl.cxx:178
 AliDxHFEParticleSelectionMCEl.cxx:179
 AliDxHFEParticleSelectionMCEl.cxx:180
 AliDxHFEParticleSelectionMCEl.cxx:181
 AliDxHFEParticleSelectionMCEl.cxx:182
 AliDxHFEParticleSelectionMCEl.cxx:183
 AliDxHFEParticleSelectionMCEl.cxx:184
 AliDxHFEParticleSelectionMCEl.cxx:185
 AliDxHFEParticleSelectionMCEl.cxx:186
 AliDxHFEParticleSelectionMCEl.cxx:187
 AliDxHFEParticleSelectionMCEl.cxx:188
 AliDxHFEParticleSelectionMCEl.cxx:189
 AliDxHFEParticleSelectionMCEl.cxx:190
 AliDxHFEParticleSelectionMCEl.cxx:191
 AliDxHFEParticleSelectionMCEl.cxx:192
 AliDxHFEParticleSelectionMCEl.cxx:193
 AliDxHFEParticleSelectionMCEl.cxx:194
 AliDxHFEParticleSelectionMCEl.cxx:195
 AliDxHFEParticleSelectionMCEl.cxx:196
 AliDxHFEParticleSelectionMCEl.cxx:197
 AliDxHFEParticleSelectionMCEl.cxx:198
 AliDxHFEParticleSelectionMCEl.cxx:199
 AliDxHFEParticleSelectionMCEl.cxx:200
 AliDxHFEParticleSelectionMCEl.cxx:201
 AliDxHFEParticleSelectionMCEl.cxx:202
 AliDxHFEParticleSelectionMCEl.cxx:203
 AliDxHFEParticleSelectionMCEl.cxx:204
 AliDxHFEParticleSelectionMCEl.cxx:205
 AliDxHFEParticleSelectionMCEl.cxx:206
 AliDxHFEParticleSelectionMCEl.cxx:207
 AliDxHFEParticleSelectionMCEl.cxx:208
 AliDxHFEParticleSelectionMCEl.cxx:209
 AliDxHFEParticleSelectionMCEl.cxx:210
 AliDxHFEParticleSelectionMCEl.cxx:211
 AliDxHFEParticleSelectionMCEl.cxx:212
 AliDxHFEParticleSelectionMCEl.cxx:213
 AliDxHFEParticleSelectionMCEl.cxx:214
 AliDxHFEParticleSelectionMCEl.cxx:215
 AliDxHFEParticleSelectionMCEl.cxx:216
 AliDxHFEParticleSelectionMCEl.cxx:217
 AliDxHFEParticleSelectionMCEl.cxx:218
 AliDxHFEParticleSelectionMCEl.cxx:219
 AliDxHFEParticleSelectionMCEl.cxx:220
 AliDxHFEParticleSelectionMCEl.cxx:221
 AliDxHFEParticleSelectionMCEl.cxx:222
 AliDxHFEParticleSelectionMCEl.cxx:223
 AliDxHFEParticleSelectionMCEl.cxx:224
 AliDxHFEParticleSelectionMCEl.cxx:225
 AliDxHFEParticleSelectionMCEl.cxx:226
 AliDxHFEParticleSelectionMCEl.cxx:227
 AliDxHFEParticleSelectionMCEl.cxx:228
 AliDxHFEParticleSelectionMCEl.cxx:229
 AliDxHFEParticleSelectionMCEl.cxx:230
 AliDxHFEParticleSelectionMCEl.cxx:231
 AliDxHFEParticleSelectionMCEl.cxx:232
 AliDxHFEParticleSelectionMCEl.cxx:233
 AliDxHFEParticleSelectionMCEl.cxx:234
 AliDxHFEParticleSelectionMCEl.cxx:235
 AliDxHFEParticleSelectionMCEl.cxx:236
 AliDxHFEParticleSelectionMCEl.cxx:237
 AliDxHFEParticleSelectionMCEl.cxx:238
 AliDxHFEParticleSelectionMCEl.cxx:239
 AliDxHFEParticleSelectionMCEl.cxx:240
 AliDxHFEParticleSelectionMCEl.cxx:241
 AliDxHFEParticleSelectionMCEl.cxx:242
 AliDxHFEParticleSelectionMCEl.cxx:243
 AliDxHFEParticleSelectionMCEl.cxx:244
 AliDxHFEParticleSelectionMCEl.cxx:245
 AliDxHFEParticleSelectionMCEl.cxx:246
 AliDxHFEParticleSelectionMCEl.cxx:247
 AliDxHFEParticleSelectionMCEl.cxx:248
 AliDxHFEParticleSelectionMCEl.cxx:249
 AliDxHFEParticleSelectionMCEl.cxx:250
 AliDxHFEParticleSelectionMCEl.cxx:251
 AliDxHFEParticleSelectionMCEl.cxx:252
 AliDxHFEParticleSelectionMCEl.cxx:253
 AliDxHFEParticleSelectionMCEl.cxx:254
 AliDxHFEParticleSelectionMCEl.cxx:255
 AliDxHFEParticleSelectionMCEl.cxx:256
 AliDxHFEParticleSelectionMCEl.cxx:257
 AliDxHFEParticleSelectionMCEl.cxx:258
 AliDxHFEParticleSelectionMCEl.cxx:259
 AliDxHFEParticleSelectionMCEl.cxx:260
 AliDxHFEParticleSelectionMCEl.cxx:261
 AliDxHFEParticleSelectionMCEl.cxx:262
 AliDxHFEParticleSelectionMCEl.cxx:263
 AliDxHFEParticleSelectionMCEl.cxx:264
 AliDxHFEParticleSelectionMCEl.cxx:265
 AliDxHFEParticleSelectionMCEl.cxx:266
 AliDxHFEParticleSelectionMCEl.cxx:267
 AliDxHFEParticleSelectionMCEl.cxx:268
 AliDxHFEParticleSelectionMCEl.cxx:269
 AliDxHFEParticleSelectionMCEl.cxx:270
 AliDxHFEParticleSelectionMCEl.cxx:271
 AliDxHFEParticleSelectionMCEl.cxx:272
 AliDxHFEParticleSelectionMCEl.cxx:273
 AliDxHFEParticleSelectionMCEl.cxx:274
 AliDxHFEParticleSelectionMCEl.cxx:275
 AliDxHFEParticleSelectionMCEl.cxx:276
 AliDxHFEParticleSelectionMCEl.cxx:277
 AliDxHFEParticleSelectionMCEl.cxx:278
 AliDxHFEParticleSelectionMCEl.cxx:279
 AliDxHFEParticleSelectionMCEl.cxx:280
 AliDxHFEParticleSelectionMCEl.cxx:281
 AliDxHFEParticleSelectionMCEl.cxx:282
 AliDxHFEParticleSelectionMCEl.cxx:283
 AliDxHFEParticleSelectionMCEl.cxx:284
 AliDxHFEParticleSelectionMCEl.cxx:285
 AliDxHFEParticleSelectionMCEl.cxx:286
 AliDxHFEParticleSelectionMCEl.cxx:287
 AliDxHFEParticleSelectionMCEl.cxx:288
 AliDxHFEParticleSelectionMCEl.cxx:289
 AliDxHFEParticleSelectionMCEl.cxx:290
 AliDxHFEParticleSelectionMCEl.cxx:291
 AliDxHFEParticleSelectionMCEl.cxx:292
 AliDxHFEParticleSelectionMCEl.cxx:293
 AliDxHFEParticleSelectionMCEl.cxx:294
 AliDxHFEParticleSelectionMCEl.cxx:295
 AliDxHFEParticleSelectionMCEl.cxx:296
 AliDxHFEParticleSelectionMCEl.cxx:297
 AliDxHFEParticleSelectionMCEl.cxx:298
 AliDxHFEParticleSelectionMCEl.cxx:299
 AliDxHFEParticleSelectionMCEl.cxx:300
 AliDxHFEParticleSelectionMCEl.cxx:301
 AliDxHFEParticleSelectionMCEl.cxx:302
 AliDxHFEParticleSelectionMCEl.cxx:303
 AliDxHFEParticleSelectionMCEl.cxx:304
 AliDxHFEParticleSelectionMCEl.cxx:305
 AliDxHFEParticleSelectionMCEl.cxx:306
 AliDxHFEParticleSelectionMCEl.cxx:307
 AliDxHFEParticleSelectionMCEl.cxx:308
 AliDxHFEParticleSelectionMCEl.cxx:309
 AliDxHFEParticleSelectionMCEl.cxx:310
 AliDxHFEParticleSelectionMCEl.cxx:311
 AliDxHFEParticleSelectionMCEl.cxx:312
 AliDxHFEParticleSelectionMCEl.cxx:313
 AliDxHFEParticleSelectionMCEl.cxx:314
 AliDxHFEParticleSelectionMCEl.cxx:315
 AliDxHFEParticleSelectionMCEl.cxx:316
 AliDxHFEParticleSelectionMCEl.cxx:317
 AliDxHFEParticleSelectionMCEl.cxx:318
 AliDxHFEParticleSelectionMCEl.cxx:319
 AliDxHFEParticleSelectionMCEl.cxx:320
 AliDxHFEParticleSelectionMCEl.cxx:321
 AliDxHFEParticleSelectionMCEl.cxx:322
 AliDxHFEParticleSelectionMCEl.cxx:323
 AliDxHFEParticleSelectionMCEl.cxx:324
 AliDxHFEParticleSelectionMCEl.cxx:325
 AliDxHFEParticleSelectionMCEl.cxx:326
 AliDxHFEParticleSelectionMCEl.cxx:327
 AliDxHFEParticleSelectionMCEl.cxx:328
 AliDxHFEParticleSelectionMCEl.cxx:329
 AliDxHFEParticleSelectionMCEl.cxx:330
 AliDxHFEParticleSelectionMCEl.cxx:331
 AliDxHFEParticleSelectionMCEl.cxx:332
 AliDxHFEParticleSelectionMCEl.cxx:333
 AliDxHFEParticleSelectionMCEl.cxx:334
 AliDxHFEParticleSelectionMCEl.cxx:335
 AliDxHFEParticleSelectionMCEl.cxx:336
 AliDxHFEParticleSelectionMCEl.cxx:337
 AliDxHFEParticleSelectionMCEl.cxx:338
 AliDxHFEParticleSelectionMCEl.cxx:339
 AliDxHFEParticleSelectionMCEl.cxx:340
 AliDxHFEParticleSelectionMCEl.cxx:341
 AliDxHFEParticleSelectionMCEl.cxx:342
 AliDxHFEParticleSelectionMCEl.cxx:343
 AliDxHFEParticleSelectionMCEl.cxx:344
 AliDxHFEParticleSelectionMCEl.cxx:345
 AliDxHFEParticleSelectionMCEl.cxx:346
 AliDxHFEParticleSelectionMCEl.cxx:347
 AliDxHFEParticleSelectionMCEl.cxx:348
 AliDxHFEParticleSelectionMCEl.cxx:349
 AliDxHFEParticleSelectionMCEl.cxx:350
 AliDxHFEParticleSelectionMCEl.cxx:351
 AliDxHFEParticleSelectionMCEl.cxx:352
 AliDxHFEParticleSelectionMCEl.cxx:353
 AliDxHFEParticleSelectionMCEl.cxx:354
 AliDxHFEParticleSelectionMCEl.cxx:355
 AliDxHFEParticleSelectionMCEl.cxx:356
 AliDxHFEParticleSelectionMCEl.cxx:357
 AliDxHFEParticleSelectionMCEl.cxx:358
 AliDxHFEParticleSelectionMCEl.cxx:359
 AliDxHFEParticleSelectionMCEl.cxx:360
 AliDxHFEParticleSelectionMCEl.cxx:361
 AliDxHFEParticleSelectionMCEl.cxx:362
 AliDxHFEParticleSelectionMCEl.cxx:363
 AliDxHFEParticleSelectionMCEl.cxx:364
 AliDxHFEParticleSelectionMCEl.cxx:365
 AliDxHFEParticleSelectionMCEl.cxx:366
 AliDxHFEParticleSelectionMCEl.cxx:367
 AliDxHFEParticleSelectionMCEl.cxx:368
 AliDxHFEParticleSelectionMCEl.cxx:369
 AliDxHFEParticleSelectionMCEl.cxx:370
 AliDxHFEParticleSelectionMCEl.cxx:371
 AliDxHFEParticleSelectionMCEl.cxx:372
 AliDxHFEParticleSelectionMCEl.cxx:373
 AliDxHFEParticleSelectionMCEl.cxx:374
 AliDxHFEParticleSelectionMCEl.cxx:375
 AliDxHFEParticleSelectionMCEl.cxx:376
 AliDxHFEParticleSelectionMCEl.cxx:377
 AliDxHFEParticleSelectionMCEl.cxx:378
 AliDxHFEParticleSelectionMCEl.cxx:379
 AliDxHFEParticleSelectionMCEl.cxx:380
 AliDxHFEParticleSelectionMCEl.cxx:381
 AliDxHFEParticleSelectionMCEl.cxx:382
 AliDxHFEParticleSelectionMCEl.cxx:383
 AliDxHFEParticleSelectionMCEl.cxx:384
 AliDxHFEParticleSelectionMCEl.cxx:385
 AliDxHFEParticleSelectionMCEl.cxx:386
 AliDxHFEParticleSelectionMCEl.cxx:387
 AliDxHFEParticleSelectionMCEl.cxx:388
 AliDxHFEParticleSelectionMCEl.cxx:389
 AliDxHFEParticleSelectionMCEl.cxx:390
 AliDxHFEParticleSelectionMCEl.cxx:391
 AliDxHFEParticleSelectionMCEl.cxx:392
 AliDxHFEParticleSelectionMCEl.cxx:393
 AliDxHFEParticleSelectionMCEl.cxx:394
 AliDxHFEParticleSelectionMCEl.cxx:395
 AliDxHFEParticleSelectionMCEl.cxx:396
 AliDxHFEParticleSelectionMCEl.cxx:397
 AliDxHFEParticleSelectionMCEl.cxx:398
 AliDxHFEParticleSelectionMCEl.cxx:399
 AliDxHFEParticleSelectionMCEl.cxx:400
 AliDxHFEParticleSelectionMCEl.cxx:401
 AliDxHFEParticleSelectionMCEl.cxx:402
 AliDxHFEParticleSelectionMCEl.cxx:403
 AliDxHFEParticleSelectionMCEl.cxx:404
 AliDxHFEParticleSelectionMCEl.cxx:405
 AliDxHFEParticleSelectionMCEl.cxx:406
 AliDxHFEParticleSelectionMCEl.cxx:407
 AliDxHFEParticleSelectionMCEl.cxx:408
 AliDxHFEParticleSelectionMCEl.cxx:409
 AliDxHFEParticleSelectionMCEl.cxx:410
 AliDxHFEParticleSelectionMCEl.cxx:411
 AliDxHFEParticleSelectionMCEl.cxx:412
 AliDxHFEParticleSelectionMCEl.cxx:413
 AliDxHFEParticleSelectionMCEl.cxx:414
 AliDxHFEParticleSelectionMCEl.cxx:415