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

#include "AliDxHFEParticleSelectionMCD0.h"
#include "AliAODRecoDecayHF2Prong.h"
#include "AliAODTrack.h"
#include "AliAODMCParticle.h"
#include "AliRDHFCuts.h"
#include "AliVParticle.h"
#include "AliReducedParticle.h"
#include "THnSparse.h"
#include "TH1F.h"
#include <iostream>
#include <cerrno>
#include <memory>

using namespace std;

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

AliDxHFEParticleSelectionMCD0::AliDxHFEParticleSelectionMCD0(const char* opt)
  : AliDxHFEParticleSelectionD0(opt)
  , fMCTools()
  , fPDGnotMCD0(NULL)
  , fResultMC(0)
  , fOriginMother(0)
  , fUseKine(kFALSE)  
  , fD0PropertiesKine(NULL)
{
  // constructor
  // 
  // 
  // 
  // TODO: Could implement ParseArgument if need more arguments for MC
  TString strOption(opt);
  AliInfo(strOption.Data());
  if (strOption.Contains("usekine")) fUseKine=kTRUE;

  // TODO: argument scan, pass only relevant arguments to tools
  fMCTools.~AliDxHFEToolsMC();
  TString toolopt("pdg=421 mc-last");
  if(fUseKine) toolopt+=" usekine";  
  new (&fMCTools) AliDxHFEToolsMC(toolopt);
}

AliDxHFEParticleSelectionMCD0::~AliDxHFEParticleSelectionMCD0()
{
  // destructor
  if (fD0PropertiesKine) {
    delete fD0PropertiesKine;
    fD0PropertiesKine=NULL;
  }
  if(fPDGnotMCD0){
    delete fPDGnotMCD0;
    fPDGnotMCD0=NULL;
  }
}

int AliDxHFEParticleSelectionMCD0::InitControlObjects()
{
  /// init the control objects, can be overloaded by childs which should
  /// call AliDxHFEParticleSelection::InitControlObjects() explicitly
  AliInfo("Setting up control objects");

  if(fUseKine) {
    fD0PropertiesKine=DefineTHnSparse();
    AddControlObject(fD0PropertiesKine);
    return AliDxHFEParticleSelection::InitControlObjects();
  }
  else{
    return AliDxHFEParticleSelectionD0::InitControlObjects();
  }
}

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

  // here is the only place to change the dimension
  const int thnSize2 = 6;
  InitTHnSparseArray(thnSize2);
  const double Pi=TMath::Pi();
  TString name;
  name.Form("%s info", GetName());

  // 			             0     1      2       3        4     5
  // 	 	                     Pt   Phi   Ptbin  D0InvMass  Eta   mother 
  int         thnBins [thnSize2] = {1000, 200,   15,     200,     500,    10  };
  double      thnMin  [thnSize2] = {   0,  0,     0,    1.5648,   -1.,  -1.5  };
  double      thnMax  [thnSize2] = { 100, 2*Pi,  14,    2.1648,    1.,   8.5  };
  const char* thnNames[thnSize2] = {
    "Pt",
    "Phi",
    "Ptbin", 
    "D0InvMass", 
    "Eta",
    "Mother of D0"  // Bin -1 = not MC truth D0, rest OK
  };

  // Add Histo displaying pdg of D0 candidates not passing MatchToMC()
  // TODO: Add it to the TList of D0 main class
  fPDGnotMCD0= new TH1F("fPDGnotMCD0","PDG of track not MC truth D0",1002,-2.5,999.5);
  AddControlObject(fPDGnotMCD0);

  return CreateControlTHnSparse(name,thnSize2,thnBins,thnMin,thnMax,thnNames);
}

int AliDxHFEParticleSelectionMCD0::HistogramParticleProperties(AliVParticle* p, int selectionCode)
{

  // When looping on kinematical level, need a different HistogramParticleProperties than on reconstructed tracks
  if(fUseKine){
    /// histogram particle properties
    if (!p) return -EINVAL;

    // fill the common histograms
    AliDxHFEParticleSelection::HistogramParticleProperties(p, selectionCode);

    // no daughters to fill if 0 (= no candidate)
    if (selectionCode==0){
      return 0;
    }
    AliAODMCParticle* partMC=dynamic_cast<AliAODMCParticle*>(p);

    if(!partMC) {
      return 0;
    }

    SetInvMass(partMC->GetCalcMass());
    AliRDHFCuts *cuts=GetHFCuts();
    int ptbin=cuts->PtBin(partMC->Pt());
    SetPtBin(ptbin);

    // Fills only for D0 or both.. 
    if ((selectionCode==1 || selectionCode==3) && GetFillOnlyD0D0bar()<2) {
      if(fD0PropertiesKine && ParticleProperties()) {
	memset(ParticleProperties(), 0, GetDimTHnSparse()*sizeof(ParticleProperties()[0]));
	FillParticleProperties(p, ParticleProperties(), GetDimTHnSparse());
	fD0PropertiesKine->Fill(ParticleProperties());
      }
    }

    // Fills for D0bar or both
    if ((selectionCode==1 || selectionCode==2) && (GetFillOnlyD0D0bar()==0 || GetFillOnlyD0D0bar()==2)) {
      if(fD0PropertiesKine && ParticleProperties()) {
	memset(ParticleProperties(), 0, GetDimTHnSparse()*sizeof(ParticleProperties()[0]));
	FillParticleProperties(p, ParticleProperties(), GetDimTHnSparse());
	fD0PropertiesKine->Fill(ParticleProperties());
      }

    }
    return 0;
  }
  else {
    return AliDxHFEParticleSelectionD0::HistogramParticleProperties(p,selectionCode);
  }
}

int AliDxHFEParticleSelectionMCD0::FillParticleProperties(AliVParticle* p, Double_t* data, int dimension) const
{
  // fill the data array from the particle data
  if (!data) return -EINVAL;
  AliAODTrack *track=(AliAODTrack*)p;
  if (!track) return -ENODATA;
  int i=0;
  if (dimension!=GetDimTHnSparse()) {
    // TODO: think about filling only the available data and throwing a warning
    return -ENOSPC;
  }
  data[i++]=track->Pt();
  data[i++]=track->Phi();
  data[i++]=AliDxHFEParticleSelectionMCD0::GetPtBin(); 
  data[i++]=AliDxHFEParticleSelectionMCD0::GetInvMass();
  data[i++]=track->Eta();
  data[i++]=fOriginMother; // at the moment not included background. Should expand

  return i;
}

int AliDxHFEParticleSelectionMCD0::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;
  fOriginMother=-1;
  if(fUseKine){
    // Will here loop on all tracks in the stack, and checks whether they are D0s (through CheckMCParticle())
    if (!fMCTools.IsInitialized() && (iResult=fMCTools.InitMCParticles(pEvent))<0) {
      return 0; // no meaningful filtering on mc possible
    }

    Int_t result = fMCTools.CheckMCParticle(p);
    if(result==1) return 0;
    fMCTools.FindMotherPDG(p);
    fOriginMother=fMCTools.GetOriginMother();
    //TODO: Should also return whether D0 or D0bar... at the moment only care of absolute value of D0
    return 1;
  }
  else{
  // step 1:
  // MC selection
  if (fMCTools.MCFirst() && (iResult=CheckMC(p, pEvent))==0) {
    // histograming?
    return iResult;
  }

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

  // step 2, only executed if MC check is last
  // MC selection  - > Should maybe also distinguish between D0 and D0bar
  // 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
  fResultMC=CheckMC(p, pEvent);

  return iResult;
  }

  return 0;
}

int AliDxHFEParticleSelectionMCD0::CheckMC(AliVParticle* p, const AliVEvent* pEvent)
{
  /// check if MC criteria are fulfilled
  // Check both D0 and D0bar (for now only D0)

  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
  }

  AliAODRecoDecayHF2Prong *particle = dynamic_cast<AliAODRecoDecayHF2Prong*>(p);

  if(!particle) return 0;

  Int_t pdgDgD0toKpi[2]={AliDxHFEToolsMC::kPDGkaon,AliDxHFEToolsMC::kPDGpion};

  TClonesArray* fMCArray = dynamic_cast<TClonesArray*>(fMCTools.GetMCArray());
  if(!fMCArray) {cout << "no array" << endl; return -1;}

  // find associated MC particle for D0->Kpi
  Int_t MClabel=-9999;

  //return MC particle label if the array corresponds to a D0, -1 if not (cf. AliAODRecoDecay.cxx). Checks both D0s and daughters
  MClabel=particle->MatchToMC(AliDxHFEToolsMC::kPDGD0,fMCArray,2,pdgDgD0toKpi); 
  
  //TODO: Need a different strategy!!!
  // ALSO: look at AliAnalysisTaskSED0Mass for tips
  if(MClabel<0){
    // Checking PDG of particle if not MC truth D0
    // TODO: done the right way??
    Int_t MCl = p->GetLabel();
    if(MCl<0) {
      fPDGnotMCD0->Fill(-2);
      return 0;
    }
    int pdgPart=-1;
    AliAODMCParticle* aodmcp=0;
    aodmcp=dynamic_cast<AliAODMCParticle*>(fMCArray->At(MCl));
    if (aodmcp)
      pdgPart=TMath::Abs(aodmcp->GetPdgCode());
    if (pdgPart<0){
      fPDGnotMCD0->Fill(-1);
      return 0;
    }
    else{
      fPDGnotMCD0->Fill(pdgPart);
    }
    fOriginMother=-1;
    return 0;
  }

  fMCTools.SetMClabel(MClabel);
  fMCTools.FindMotherPDG(p,AliDxHFEToolsMC::kGetOriginMother);
  fOriginMother=fMCTools.GetOriginMother();

  return 1;
}

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

AliVParticle *AliDxHFEParticleSelectionMCD0::CreateParticle(AliVParticle* track)
{
  //
  //Created object which contain variables needed for correlation. 
  //

  AliReducedParticle *part = new AliReducedParticle(track->Eta(), track->Phi(), track->Pt(),AliDxHFEParticleSelectionMCD0::GetInvMass(),AliDxHFEParticleSelectionMCD0::GetPtBin(), fOriginMother);

  return part;

}
 AliDxHFEParticleSelectionMCD0.cxx:1
 AliDxHFEParticleSelectionMCD0.cxx:2
 AliDxHFEParticleSelectionMCD0.cxx:3
 AliDxHFEParticleSelectionMCD0.cxx:4
 AliDxHFEParticleSelectionMCD0.cxx:5
 AliDxHFEParticleSelectionMCD0.cxx:6
 AliDxHFEParticleSelectionMCD0.cxx:7
 AliDxHFEParticleSelectionMCD0.cxx:8
 AliDxHFEParticleSelectionMCD0.cxx:9
 AliDxHFEParticleSelectionMCD0.cxx:10
 AliDxHFEParticleSelectionMCD0.cxx:11
 AliDxHFEParticleSelectionMCD0.cxx:12
 AliDxHFEParticleSelectionMCD0.cxx:13
 AliDxHFEParticleSelectionMCD0.cxx:14
 AliDxHFEParticleSelectionMCD0.cxx:15
 AliDxHFEParticleSelectionMCD0.cxx:16
 AliDxHFEParticleSelectionMCD0.cxx:17
 AliDxHFEParticleSelectionMCD0.cxx:18
 AliDxHFEParticleSelectionMCD0.cxx:19
 AliDxHFEParticleSelectionMCD0.cxx:20
 AliDxHFEParticleSelectionMCD0.cxx:21
 AliDxHFEParticleSelectionMCD0.cxx:22
 AliDxHFEParticleSelectionMCD0.cxx:23
 AliDxHFEParticleSelectionMCD0.cxx:24
 AliDxHFEParticleSelectionMCD0.cxx:25
 AliDxHFEParticleSelectionMCD0.cxx:26
 AliDxHFEParticleSelectionMCD0.cxx:27
 AliDxHFEParticleSelectionMCD0.cxx:28
 AliDxHFEParticleSelectionMCD0.cxx:29
 AliDxHFEParticleSelectionMCD0.cxx:30
 AliDxHFEParticleSelectionMCD0.cxx:31
 AliDxHFEParticleSelectionMCD0.cxx:32
 AliDxHFEParticleSelectionMCD0.cxx:33
 AliDxHFEParticleSelectionMCD0.cxx:34
 AliDxHFEParticleSelectionMCD0.cxx:35
 AliDxHFEParticleSelectionMCD0.cxx:36
 AliDxHFEParticleSelectionMCD0.cxx:37
 AliDxHFEParticleSelectionMCD0.cxx:38
 AliDxHFEParticleSelectionMCD0.cxx:39
 AliDxHFEParticleSelectionMCD0.cxx:40
 AliDxHFEParticleSelectionMCD0.cxx:41
 AliDxHFEParticleSelectionMCD0.cxx:42
 AliDxHFEParticleSelectionMCD0.cxx:43
 AliDxHFEParticleSelectionMCD0.cxx:44
 AliDxHFEParticleSelectionMCD0.cxx:45
 AliDxHFEParticleSelectionMCD0.cxx:46
 AliDxHFEParticleSelectionMCD0.cxx:47
 AliDxHFEParticleSelectionMCD0.cxx:48
 AliDxHFEParticleSelectionMCD0.cxx:49
 AliDxHFEParticleSelectionMCD0.cxx:50
 AliDxHFEParticleSelectionMCD0.cxx:51
 AliDxHFEParticleSelectionMCD0.cxx:52
 AliDxHFEParticleSelectionMCD0.cxx:53
 AliDxHFEParticleSelectionMCD0.cxx:54
 AliDxHFEParticleSelectionMCD0.cxx:55
 AliDxHFEParticleSelectionMCD0.cxx:56
 AliDxHFEParticleSelectionMCD0.cxx:57
 AliDxHFEParticleSelectionMCD0.cxx:58
 AliDxHFEParticleSelectionMCD0.cxx:59
 AliDxHFEParticleSelectionMCD0.cxx:60
 AliDxHFEParticleSelectionMCD0.cxx:61
 AliDxHFEParticleSelectionMCD0.cxx:62
 AliDxHFEParticleSelectionMCD0.cxx:63
 AliDxHFEParticleSelectionMCD0.cxx:64
 AliDxHFEParticleSelectionMCD0.cxx:65
 AliDxHFEParticleSelectionMCD0.cxx:66
 AliDxHFEParticleSelectionMCD0.cxx:67
 AliDxHFEParticleSelectionMCD0.cxx:68
 AliDxHFEParticleSelectionMCD0.cxx:69
 AliDxHFEParticleSelectionMCD0.cxx:70
 AliDxHFEParticleSelectionMCD0.cxx:71
 AliDxHFEParticleSelectionMCD0.cxx:72
 AliDxHFEParticleSelectionMCD0.cxx:73
 AliDxHFEParticleSelectionMCD0.cxx:74
 AliDxHFEParticleSelectionMCD0.cxx:75
 AliDxHFEParticleSelectionMCD0.cxx:76
 AliDxHFEParticleSelectionMCD0.cxx:77
 AliDxHFEParticleSelectionMCD0.cxx:78
 AliDxHFEParticleSelectionMCD0.cxx:79
 AliDxHFEParticleSelectionMCD0.cxx:80
 AliDxHFEParticleSelectionMCD0.cxx:81
 AliDxHFEParticleSelectionMCD0.cxx:82
 AliDxHFEParticleSelectionMCD0.cxx:83
 AliDxHFEParticleSelectionMCD0.cxx:84
 AliDxHFEParticleSelectionMCD0.cxx:85
 AliDxHFEParticleSelectionMCD0.cxx:86
 AliDxHFEParticleSelectionMCD0.cxx:87
 AliDxHFEParticleSelectionMCD0.cxx:88
 AliDxHFEParticleSelectionMCD0.cxx:89
 AliDxHFEParticleSelectionMCD0.cxx:90
 AliDxHFEParticleSelectionMCD0.cxx:91
 AliDxHFEParticleSelectionMCD0.cxx:92
 AliDxHFEParticleSelectionMCD0.cxx:93
 AliDxHFEParticleSelectionMCD0.cxx:94
 AliDxHFEParticleSelectionMCD0.cxx:95
 AliDxHFEParticleSelectionMCD0.cxx:96
 AliDxHFEParticleSelectionMCD0.cxx:97
 AliDxHFEParticleSelectionMCD0.cxx:98
 AliDxHFEParticleSelectionMCD0.cxx:99
 AliDxHFEParticleSelectionMCD0.cxx:100
 AliDxHFEParticleSelectionMCD0.cxx:101
 AliDxHFEParticleSelectionMCD0.cxx:102
 AliDxHFEParticleSelectionMCD0.cxx:103
 AliDxHFEParticleSelectionMCD0.cxx:104
 AliDxHFEParticleSelectionMCD0.cxx:105
 AliDxHFEParticleSelectionMCD0.cxx:106
 AliDxHFEParticleSelectionMCD0.cxx:107
 AliDxHFEParticleSelectionMCD0.cxx:108
 AliDxHFEParticleSelectionMCD0.cxx:109
 AliDxHFEParticleSelectionMCD0.cxx:110
 AliDxHFEParticleSelectionMCD0.cxx:111
 AliDxHFEParticleSelectionMCD0.cxx:112
 AliDxHFEParticleSelectionMCD0.cxx:113
 AliDxHFEParticleSelectionMCD0.cxx:114
 AliDxHFEParticleSelectionMCD0.cxx:115
 AliDxHFEParticleSelectionMCD0.cxx:116
 AliDxHFEParticleSelectionMCD0.cxx:117
 AliDxHFEParticleSelectionMCD0.cxx:118
 AliDxHFEParticleSelectionMCD0.cxx:119
 AliDxHFEParticleSelectionMCD0.cxx:120
 AliDxHFEParticleSelectionMCD0.cxx:121
 AliDxHFEParticleSelectionMCD0.cxx:122
 AliDxHFEParticleSelectionMCD0.cxx:123
 AliDxHFEParticleSelectionMCD0.cxx:124
 AliDxHFEParticleSelectionMCD0.cxx:125
 AliDxHFEParticleSelectionMCD0.cxx:126
 AliDxHFEParticleSelectionMCD0.cxx:127
 AliDxHFEParticleSelectionMCD0.cxx:128
 AliDxHFEParticleSelectionMCD0.cxx:129
 AliDxHFEParticleSelectionMCD0.cxx:130
 AliDxHFEParticleSelectionMCD0.cxx:131
 AliDxHFEParticleSelectionMCD0.cxx:132
 AliDxHFEParticleSelectionMCD0.cxx:133
 AliDxHFEParticleSelectionMCD0.cxx:134
 AliDxHFEParticleSelectionMCD0.cxx:135
 AliDxHFEParticleSelectionMCD0.cxx:136
 AliDxHFEParticleSelectionMCD0.cxx:137
 AliDxHFEParticleSelectionMCD0.cxx:138
 AliDxHFEParticleSelectionMCD0.cxx:139
 AliDxHFEParticleSelectionMCD0.cxx:140
 AliDxHFEParticleSelectionMCD0.cxx:141
 AliDxHFEParticleSelectionMCD0.cxx:142
 AliDxHFEParticleSelectionMCD0.cxx:143
 AliDxHFEParticleSelectionMCD0.cxx:144
 AliDxHFEParticleSelectionMCD0.cxx:145
 AliDxHFEParticleSelectionMCD0.cxx:146
 AliDxHFEParticleSelectionMCD0.cxx:147
 AliDxHFEParticleSelectionMCD0.cxx:148
 AliDxHFEParticleSelectionMCD0.cxx:149
 AliDxHFEParticleSelectionMCD0.cxx:150
 AliDxHFEParticleSelectionMCD0.cxx:151
 AliDxHFEParticleSelectionMCD0.cxx:152
 AliDxHFEParticleSelectionMCD0.cxx:153
 AliDxHFEParticleSelectionMCD0.cxx:154
 AliDxHFEParticleSelectionMCD0.cxx:155
 AliDxHFEParticleSelectionMCD0.cxx:156
 AliDxHFEParticleSelectionMCD0.cxx:157
 AliDxHFEParticleSelectionMCD0.cxx:158
 AliDxHFEParticleSelectionMCD0.cxx:159
 AliDxHFEParticleSelectionMCD0.cxx:160
 AliDxHFEParticleSelectionMCD0.cxx:161
 AliDxHFEParticleSelectionMCD0.cxx:162
 AliDxHFEParticleSelectionMCD0.cxx:163
 AliDxHFEParticleSelectionMCD0.cxx:164
 AliDxHFEParticleSelectionMCD0.cxx:165
 AliDxHFEParticleSelectionMCD0.cxx:166
 AliDxHFEParticleSelectionMCD0.cxx:167
 AliDxHFEParticleSelectionMCD0.cxx:168
 AliDxHFEParticleSelectionMCD0.cxx:169
 AliDxHFEParticleSelectionMCD0.cxx:170
 AliDxHFEParticleSelectionMCD0.cxx:171
 AliDxHFEParticleSelectionMCD0.cxx:172
 AliDxHFEParticleSelectionMCD0.cxx:173
 AliDxHFEParticleSelectionMCD0.cxx:174
 AliDxHFEParticleSelectionMCD0.cxx:175
 AliDxHFEParticleSelectionMCD0.cxx:176
 AliDxHFEParticleSelectionMCD0.cxx:177
 AliDxHFEParticleSelectionMCD0.cxx:178
 AliDxHFEParticleSelectionMCD0.cxx:179
 AliDxHFEParticleSelectionMCD0.cxx:180
 AliDxHFEParticleSelectionMCD0.cxx:181
 AliDxHFEParticleSelectionMCD0.cxx:182
 AliDxHFEParticleSelectionMCD0.cxx:183
 AliDxHFEParticleSelectionMCD0.cxx:184
 AliDxHFEParticleSelectionMCD0.cxx:185
 AliDxHFEParticleSelectionMCD0.cxx:186
 AliDxHFEParticleSelectionMCD0.cxx:187
 AliDxHFEParticleSelectionMCD0.cxx:188
 AliDxHFEParticleSelectionMCD0.cxx:189
 AliDxHFEParticleSelectionMCD0.cxx:190
 AliDxHFEParticleSelectionMCD0.cxx:191
 AliDxHFEParticleSelectionMCD0.cxx:192
 AliDxHFEParticleSelectionMCD0.cxx:193
 AliDxHFEParticleSelectionMCD0.cxx:194
 AliDxHFEParticleSelectionMCD0.cxx:195
 AliDxHFEParticleSelectionMCD0.cxx:196
 AliDxHFEParticleSelectionMCD0.cxx:197
 AliDxHFEParticleSelectionMCD0.cxx:198
 AliDxHFEParticleSelectionMCD0.cxx:199
 AliDxHFEParticleSelectionMCD0.cxx:200
 AliDxHFEParticleSelectionMCD0.cxx:201
 AliDxHFEParticleSelectionMCD0.cxx:202
 AliDxHFEParticleSelectionMCD0.cxx:203
 AliDxHFEParticleSelectionMCD0.cxx:204
 AliDxHFEParticleSelectionMCD0.cxx:205
 AliDxHFEParticleSelectionMCD0.cxx:206
 AliDxHFEParticleSelectionMCD0.cxx:207
 AliDxHFEParticleSelectionMCD0.cxx:208
 AliDxHFEParticleSelectionMCD0.cxx:209
 AliDxHFEParticleSelectionMCD0.cxx:210
 AliDxHFEParticleSelectionMCD0.cxx:211
 AliDxHFEParticleSelectionMCD0.cxx:212
 AliDxHFEParticleSelectionMCD0.cxx:213
 AliDxHFEParticleSelectionMCD0.cxx:214
 AliDxHFEParticleSelectionMCD0.cxx:215
 AliDxHFEParticleSelectionMCD0.cxx:216
 AliDxHFEParticleSelectionMCD0.cxx:217
 AliDxHFEParticleSelectionMCD0.cxx:218
 AliDxHFEParticleSelectionMCD0.cxx:219
 AliDxHFEParticleSelectionMCD0.cxx:220
 AliDxHFEParticleSelectionMCD0.cxx:221
 AliDxHFEParticleSelectionMCD0.cxx:222
 AliDxHFEParticleSelectionMCD0.cxx:223
 AliDxHFEParticleSelectionMCD0.cxx:224
 AliDxHFEParticleSelectionMCD0.cxx:225
 AliDxHFEParticleSelectionMCD0.cxx:226
 AliDxHFEParticleSelectionMCD0.cxx:227
 AliDxHFEParticleSelectionMCD0.cxx:228
 AliDxHFEParticleSelectionMCD0.cxx:229
 AliDxHFEParticleSelectionMCD0.cxx:230
 AliDxHFEParticleSelectionMCD0.cxx:231
 AliDxHFEParticleSelectionMCD0.cxx:232
 AliDxHFEParticleSelectionMCD0.cxx:233
 AliDxHFEParticleSelectionMCD0.cxx:234
 AliDxHFEParticleSelectionMCD0.cxx:235
 AliDxHFEParticleSelectionMCD0.cxx:236
 AliDxHFEParticleSelectionMCD0.cxx:237
 AliDxHFEParticleSelectionMCD0.cxx:238
 AliDxHFEParticleSelectionMCD0.cxx:239
 AliDxHFEParticleSelectionMCD0.cxx:240
 AliDxHFEParticleSelectionMCD0.cxx:241
 AliDxHFEParticleSelectionMCD0.cxx:242
 AliDxHFEParticleSelectionMCD0.cxx:243
 AliDxHFEParticleSelectionMCD0.cxx:244
 AliDxHFEParticleSelectionMCD0.cxx:245
 AliDxHFEParticleSelectionMCD0.cxx:246
 AliDxHFEParticleSelectionMCD0.cxx:247
 AliDxHFEParticleSelectionMCD0.cxx:248
 AliDxHFEParticleSelectionMCD0.cxx:249
 AliDxHFEParticleSelectionMCD0.cxx:250
 AliDxHFEParticleSelectionMCD0.cxx:251
 AliDxHFEParticleSelectionMCD0.cxx:252
 AliDxHFEParticleSelectionMCD0.cxx:253
 AliDxHFEParticleSelectionMCD0.cxx:254
 AliDxHFEParticleSelectionMCD0.cxx:255
 AliDxHFEParticleSelectionMCD0.cxx:256
 AliDxHFEParticleSelectionMCD0.cxx:257
 AliDxHFEParticleSelectionMCD0.cxx:258
 AliDxHFEParticleSelectionMCD0.cxx:259
 AliDxHFEParticleSelectionMCD0.cxx:260
 AliDxHFEParticleSelectionMCD0.cxx:261
 AliDxHFEParticleSelectionMCD0.cxx:262
 AliDxHFEParticleSelectionMCD0.cxx:263
 AliDxHFEParticleSelectionMCD0.cxx:264
 AliDxHFEParticleSelectionMCD0.cxx:265
 AliDxHFEParticleSelectionMCD0.cxx:266
 AliDxHFEParticleSelectionMCD0.cxx:267
 AliDxHFEParticleSelectionMCD0.cxx:268
 AliDxHFEParticleSelectionMCD0.cxx:269
 AliDxHFEParticleSelectionMCD0.cxx:270
 AliDxHFEParticleSelectionMCD0.cxx:271
 AliDxHFEParticleSelectionMCD0.cxx:272
 AliDxHFEParticleSelectionMCD0.cxx:273
 AliDxHFEParticleSelectionMCD0.cxx:274
 AliDxHFEParticleSelectionMCD0.cxx:275
 AliDxHFEParticleSelectionMCD0.cxx:276
 AliDxHFEParticleSelectionMCD0.cxx:277
 AliDxHFEParticleSelectionMCD0.cxx:278
 AliDxHFEParticleSelectionMCD0.cxx:279
 AliDxHFEParticleSelectionMCD0.cxx:280
 AliDxHFEParticleSelectionMCD0.cxx:281
 AliDxHFEParticleSelectionMCD0.cxx:282
 AliDxHFEParticleSelectionMCD0.cxx:283
 AliDxHFEParticleSelectionMCD0.cxx:284
 AliDxHFEParticleSelectionMCD0.cxx:285
 AliDxHFEParticleSelectionMCD0.cxx:286
 AliDxHFEParticleSelectionMCD0.cxx:287
 AliDxHFEParticleSelectionMCD0.cxx:288
 AliDxHFEParticleSelectionMCD0.cxx:289
 AliDxHFEParticleSelectionMCD0.cxx:290
 AliDxHFEParticleSelectionMCD0.cxx:291
 AliDxHFEParticleSelectionMCD0.cxx:292
 AliDxHFEParticleSelectionMCD0.cxx:293
 AliDxHFEParticleSelectionMCD0.cxx:294
 AliDxHFEParticleSelectionMCD0.cxx:295
 AliDxHFEParticleSelectionMCD0.cxx:296
 AliDxHFEParticleSelectionMCD0.cxx:297
 AliDxHFEParticleSelectionMCD0.cxx:298
 AliDxHFEParticleSelectionMCD0.cxx:299
 AliDxHFEParticleSelectionMCD0.cxx:300
 AliDxHFEParticleSelectionMCD0.cxx:301
 AliDxHFEParticleSelectionMCD0.cxx:302
 AliDxHFEParticleSelectionMCD0.cxx:303
 AliDxHFEParticleSelectionMCD0.cxx:304
 AliDxHFEParticleSelectionMCD0.cxx:305
 AliDxHFEParticleSelectionMCD0.cxx:306
 AliDxHFEParticleSelectionMCD0.cxx:307
 AliDxHFEParticleSelectionMCD0.cxx:308
 AliDxHFEParticleSelectionMCD0.cxx:309
 AliDxHFEParticleSelectionMCD0.cxx:310
 AliDxHFEParticleSelectionMCD0.cxx:311
 AliDxHFEParticleSelectionMCD0.cxx:312
 AliDxHFEParticleSelectionMCD0.cxx:313
 AliDxHFEParticleSelectionMCD0.cxx:314
 AliDxHFEParticleSelectionMCD0.cxx:315
 AliDxHFEParticleSelectionMCD0.cxx:316
 AliDxHFEParticleSelectionMCD0.cxx:317
 AliDxHFEParticleSelectionMCD0.cxx:318
 AliDxHFEParticleSelectionMCD0.cxx:319
 AliDxHFEParticleSelectionMCD0.cxx:320
 AliDxHFEParticleSelectionMCD0.cxx:321
 AliDxHFEParticleSelectionMCD0.cxx:322
 AliDxHFEParticleSelectionMCD0.cxx:323
 AliDxHFEParticleSelectionMCD0.cxx:324
 AliDxHFEParticleSelectionMCD0.cxx:325
 AliDxHFEParticleSelectionMCD0.cxx:326
 AliDxHFEParticleSelectionMCD0.cxx:327
 AliDxHFEParticleSelectionMCD0.cxx:328
 AliDxHFEParticleSelectionMCD0.cxx:329
 AliDxHFEParticleSelectionMCD0.cxx:330
 AliDxHFEParticleSelectionMCD0.cxx:331
 AliDxHFEParticleSelectionMCD0.cxx:332
 AliDxHFEParticleSelectionMCD0.cxx:333