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>        *
//*                  Sedat Altinpinar <Sedat.Altinpinar@cern.ch>           *
//*                  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   AliDxHFEParticleSelectionD0.cxx
/// @author Sedat Altinpinar, Hege Erdal, Matthias Richter
/// @date   2012-03-19
/// @brief  D0 selection for D0-HFE correlation
///

#include "AliDxHFEParticleSelectionD0.h"
#include "AliVParticle.h"
//#include "AliAnalysisCuts.h"       // required dependency libANALYSISalice.so
//#include "AliFlowTrackSimple.h"    // required dependency libPWGflowBase.so
//#include "AliFlowCandidateTrack.h" // required dependency libPWGflowTasks.so
//#include "AliCFContainer.h"        // required dependency libCORRFW.so
#include "AliAODRecoDecayHF2Prong.h" // libPWGHFvertexingHF
#include "AliRDHFCutsD0toKpi.h"
#include "TObjArray.h"
#include "THnSparse.h"
#include "AliReducedParticle.h"
#include "TAxis.h"
#include "TString.h"
#include <iostream>
#include <cerrno>
#include <memory>

using namespace std;

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

AliDxHFEParticleSelectionD0::AliDxHFEParticleSelectionD0(const char* opt)
  : AliDxHFEParticleSelection("D0", opt)
  , fD0Properties(NULL)
  , fD0Daughter0(NULL)
  , fD0Daughter1(NULL)
  , fCuts(NULL)
  , fFillOnlyD0D0bar(0)
  , fD0InvMass(0.0)
  , fPtBin(-1)
  , fHistoList(NULL)
{
  // constructor
  // 
  // 
  // 
  // 
  ParseArguments(opt);
}

AliDxHFEParticleSelectionD0::~AliDxHFEParticleSelectionD0()
{
  // destructor
  if (fD0Properties) {
    delete fD0Properties;
    fD0Properties=NULL;
  }
  if (fD0Daughter0) {
    delete fD0Daughter0;
    fD0Daughter0=NULL;
  }
  if (fD0Daughter1) {
    delete fD0Daughter1;
    fD0Daughter1=NULL;
  }
  if (fHistoList){
    delete fHistoList;
    fHistoList=NULL;
  }

  // Note: external object deleted elsewhere  
  fCuts=NULL;
}

const char* AliDxHFEParticleSelectionD0::fgkDgTrackControlBinNames[]={
  "Pt",
  "Phi",
  "Ptbin", 
  "D0InvMass", 
  "Eta"
};

const char* AliDxHFEParticleSelectionD0::fgkCutBinNames[]={
  "nDstar->D0",
  "nCandSel(Tr)",
  "IsInFiducialAcceptance",
  "ptbin-1",
  "No daugthers",
  "Selectioncode 0",
  "Selected D0",
  "Selected D0bar",
  "Selected as both"
};


int AliDxHFEParticleSelectionD0::InitControlObjects()
{
  /// init the control objects, can be overloaded by childs which should
  /// call AliDxHFEParticleSelection::InitControlObjects() explicitly

  fD0Properties=DefineTHnSparse();
  AddControlObject(fD0Properties);

  //Adding control objects for the daughters
  InitControlObjectsDaughters("pi information",0);
  InitControlObjectsDaughters("K information",1);
  AliInfo(Form("D0 filling scheme: %d\n",fFillOnlyD0D0bar));

  fHistoList=new TList;
  fHistoList->SetName("D0 Histograms");
  fHistoList->SetOwner();

  // Histogram storing which cuts have been applied to the tracks
  fHistoList->Add(CreateControlHistogram("fWhichCutD0","effective cut for a rejected particle", kNCutLabels, fgkCutBinNames));

  AddControlObject(fHistoList);

  return AliDxHFEParticleSelection::InitControlObjects();
}

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

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

  // 			             0     1     2       3         4
  // 	 	                     Pt   Phi   Ptbin  D0InvMass  Eta  
  int         thnBins [thnSize2] = {1000, 200,  15,     200,     500 };
  double      thnMin  [thnSize2] = {  0,    0,   0,    1.5648,   -1. };
  double      thnMax  [thnSize2] = { 100, 2*Pi, 14,    2.1648,    1. };
  const char* thnNames[thnSize2] = {"Pt", "Phi","Ptbin","D0InvMass","Eta"};

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

int AliDxHFEParticleSelectionD0::FillParticleProperties(AliVParticle* p, Double_t* data, int dimension) const
{
  // fill the data array from the particle data
  if (!data) return -EINVAL;
  AliAODRecoDecayHF2Prong* track=dynamic_cast<AliAODRecoDecayHF2Prong*>(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++]=fPtBin;
  data[i++]=fD0InvMass;
  data[i++]=track->Eta();

  return i;
}

int AliDxHFEParticleSelectionD0::InitControlObjectsDaughters(TString name, int daughter)
{
  // Setting up Control objects for the daughters.
  // Move to ParticleSelection?? 
  AliInfo("Setting up daughter THnSparse");

  const int thnSize2 = 5;
  const double Pi=TMath::Pi();
  // 			       0    1      2      3          4
  // 	 	               Pt   Phi   Ptbin  D0InvMass  Eta
  int    thnBins[thnSize2] = { 1000,  200, 21,     200,     500};
  double thnMin [thnSize2] = {    0,    0,  0,    1.5648,   -1.};
  double thnMax [thnSize2] = {  100, 2*Pi, 20,    2.1648,    1.};

  std::auto_ptr<THnSparseF> DaughterProperties(new THnSparseF(name, name, thnSize2, thnBins, thnMin, thnMax));

  if (DaughterProperties.get()==NULL) {
    return -ENOMEM;
  }

  for(int iLabel=0; iLabel< 5;iLabel++)
    DaughterProperties->GetAxis(iLabel)->SetTitle(fgkDgTrackControlBinNames[iLabel]);  

  if(daughter==0){ 
    fD0Daughter0=DaughterProperties.release();
    AddControlObject(fD0Daughter0);
  }
  
  if(daughter==1){
    fD0Daughter1=DaughterProperties.release();
    AddControlObject(fD0Daughter1);
  }
  return 0;
}

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

  /// 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;

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

  if(!part) return 0;
  // Convention: 1. daughter is postive track, 2. = negative
  AliAODTrack *prongpos=(AliAODTrack*)part->GetDaughter(0);
  AliAODTrack *prongneg=(AliAODTrack*)part->GetDaughter(1);

  if(!prongpos || !prongneg) {
    return 0;
  }
 
  fD0InvMass= part->InvMassD0();
  fPtBin=fCuts->PtBin(part->Pt());
  
  // TODO: avoid repeated allocation of the arrays
  Double_t KProperties[]={prongneg->Pt(),prongneg->Phi(),(Double_t)fPtBin, fD0InvMass,prongneg->Eta()};
  Double_t piProperties[]={prongpos->Pt(),prongpos->Phi(),(Double_t)fPtBin,fD0InvMass,prongpos->Eta()};


  // Fills only for D0 or both.. 
  if ((selectionCode==1 || selectionCode==3) && fFillOnlyD0D0bar<2) {

    if(fD0Properties && ParticleProperties()) {
      memset(ParticleProperties(), 0, GetDimTHnSparse()*sizeof(ParticleProperties()[0]));
      FillParticleProperties(p, ParticleProperties(), GetDimTHnSparse());
      fD0Properties->Fill(ParticleProperties());
    }
    if(fD0Daughter0) fD0Daughter0->Fill(piProperties);
    if(fD0Daughter1) fD0Daughter1->Fill(KProperties);
  }
  // Checks for D0bar (or hypothesis both)
  if ((selectionCode==2 || selectionCode==3) && (fFillOnlyD0D0bar==0 || fFillOnlyD0D0bar==2)) {
    // Set the fD0InvMass to InvMassD0bar instead..
    fD0InvMass= part->InvMassD0bar();
    if(fD0Properties && ParticleProperties()) {
      memset(ParticleProperties(), 0, GetDimTHnSparse()*sizeof(ParticleProperties()[0]));
      FillParticleProperties(p, ParticleProperties(), GetDimTHnSparse());
      fD0Properties->Fill(ParticleProperties());
    }
    if(fD0Daughter0) fD0Daughter0->Fill(piProperties);
    if(fD0Daughter1) fD0Daughter1->Fill(KProperties);
    //reset value to InvMassD0 for when CreateParticle() is called
    fD0InvMass= part->InvMassD0();
    
  }
  return 0;
}

TObjArray* AliDxHFEParticleSelectionD0::Select(TObjArray* pTracks, const AliVEvent *pEvent)
{
  /// create selection, array contains only pointers but does not own the objects
  /// object array needs to be deleted by caller
  if (!pTracks) return NULL;
  TObjArray* selectedTracks=new TObjArray;
  if (!selectedTracks) return NULL;
  selectedTracks->SetOwner(kFALSE);
  TIter itrack(pTracks);
  TObject* pObj=NULL;
  while ((pObj=itrack())!=NULL) {
    AliVParticle* track=dynamic_cast<AliVParticle*>(pObj);
    if (!track) continue;
    int selectionCode=IsSelected(track,pEvent);
    HistogramParticleProperties(track, selectionCode);

    // Add track if it is either defined as D0(selectionCode==1) or both 
    // D0bar and a D0 (selectionCode==3)
    if ((selectionCode==1 || selectionCode==3) && fFillOnlyD0D0bar<2) 
      selectedTracks->Add(CreateParticle(track));
    
    // Add track if it is either defined as D0bar(selectionCode==2) or both 
    // D0bar and a D0 (selectionCode==3)
    if ((selectionCode==2 || selectionCode==3) && (fFillOnlyD0D0bar==0 || fFillOnlyD0D0bar==2)){
      AliAODRecoDecayHF2Prong* prong=dynamic_cast<AliAODRecoDecayHF2Prong*>(track);
      fD0InvMass=prong?prong->InvMassD0bar():0.;
      selectedTracks->Add(CreateParticle(track));
    }    
  }

  HistogramEventProperties(AliDxHFEParticleSelection::kHistoNrTracksPrEvent,selectedTracks->GetEntries());
  return selectedTracks;
}

int AliDxHFEParticleSelectionD0::IsSelected(AliVParticle* p, const AliVEvent* pEvent)
{
  /// TODO: implement specific selection of D0 candidates
  /// Could also return values based on where where selection "failed
  /// Selected. Return 0 (none), 1(D0), 2(D0bar) or 3 (both)

  int selectionCode=0;

  AliAODRecoDecayHF2Prong *d0 = dynamic_cast<AliAODRecoDecayHF2Prong*>(p);
  if (!d0) return 0;
  if(d0->GetSelectionMap()) if(!d0->HasSelectionBit(AliRDHFCuts::kD0toKpiCuts)){
      AliDebug(1,"Skip D0 from Dstar");
      ((TH1D*)fHistoList->FindObject("fWhichCutD0"))->Fill(kDstar);

      return 0; //skip the D0 from Dstar
    }

  // TODO: the cuts instance should be const but the function definition of
  // AliRDHFCuts::IsSelected does not allow this
  AliRDHFCuts* cuts=const_cast<AliRDHFCuts*>(fCuts);
  if (!cuts) {
    selectionCode=0;
  } 
  else if(cuts->IsInFiducialAcceptance(d0->Pt(),d0->Y(421)) ) {

    // TODO: the aod pointer should also be const but the function definition of
    // AliRDHFCuts::IsSelected does not allow this
    AliAODEvent* aod=NULL;
    if (pEvent) aod=dynamic_cast<AliAODEvent*>(const_cast<AliVEvent*>(pEvent));

    //TODO: Should add fSystem for PbPb    if(fSys==0){
    if(cuts->IsSelected(d0,AliRDHFCuts::kTracks,aod))       ((TH1D*)fHistoList->FindObject("fWhichCutD0"))->Fill(kCandSelTrack);
    
    Int_t ptbin=cuts->PtBin(d0->Pt());
    if(ptbin==-1) {
      ((TH1D*)fHistoList->FindObject("fWhichCutD0"))->Fill(kNegPtbin);
      AliDebug(1,"Pt out of bounds");
      return 0;
    } //out of bounds

    // Selected. Return 0 (none), 1 (D0), 2 (D0bar) or 3 (both)
    selectionCode=cuts->IsSelected(d0,AliRDHFCuts::kAll,aod); 
    if(selectionCode==0)
      ((TH1D*)fHistoList->FindObject("fWhichCutD0"))->Fill(kSelected0);

    if(selectionCode==1)
      ((TH1D*)fHistoList->FindObject("fWhichCutD0"))->Fill(kSelectedD0);

    if(selectionCode==2)
      ((TH1D*)fHistoList->FindObject("fWhichCutD0"))->Fill(kSelectedD0bar);

    if(selectionCode==3)
      ((TH1D*)fHistoList->FindObject("fWhichCutD0"))->Fill(kSelectedboth);

    AliDebug(1,Form("Candidate is %d \n", selectionCode));

    // check daughters before calling as there is unchecked code in
    // AliAODRecoDecayHF::HasBadDaughters called
    TObject* o=NULL;
    if (!((o=d0->GetDaughter(0))!=NULL && dynamic_cast<AliAODTrack*>(o)!=NULL &&
	  (o=d0->GetDaughter(1))!=NULL && dynamic_cast<AliAODTrack*>(o)!=NULL)) {
      ((TH1D*)fHistoList->FindObject("fWhichCutD0"))->Fill(kNoDaugthers);
      AliDebug(1,"at least one daughter not found!");
    
    }
  }
  else{
    ((TH1D*)fHistoList->FindObject("fWhichCutD0"))->Fill(kIsInFinducialAcceptance);
  }

  return selectionCode;
}

void AliDxHFEParticleSelectionD0::SetCuts(TObject* cuts, int level)
{
  /// set cuts objects
  if (level==kCutD0) {
    fCuts=dynamic_cast<AliRDHFCuts*>(cuts);
    if (!fCuts && cuts) {
      AliError(Form("cuts object is not of required type AliRDHFCuts but %s", cuts->ClassName()));
    }
    return;
  }
  if (level==kCutList){
    TList* CutList=dynamic_cast<TList*>(cuts);
    if (!CutList && cuts) {
      AliError(Form("cuts object is not of required type TList but %s", cuts->ClassName()));
    }
    else{
      TObject *obj=NULL;
      int iii=0;
      TIter next(CutList);
      while((obj = next())){
	iii++;
	if(iii==1) {
	  fCuts=dynamic_cast<AliRDHFCuts*>(obj);
	  if (!fCuts) 
	    AliError(Form("Cut object is not of required type AliRDHFCuts but %s", obj->ClassName()));
	}
      }
    }
    return;
  }
  return;
}

int AliDxHFEParticleSelectionD0::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("fillD0scheme=")){
      argument.ReplaceAll("fillD0scheme=", "");
      if (argument.CompareTo("both")==0){ fFillOnlyD0D0bar=0;}
      else if (argument.CompareTo("D0")==0){ fFillOnlyD0D0bar=1;}
      else if (argument.CompareTo("D0bar")==0){ fFillOnlyD0D0bar=2;}
      else {
	AliWarning(Form("can not set D0 filling scheme, unknown parameter '%s'", argument.Data()));
	fFillOnlyD0D0bar=0;
      }
      continue;
    }
    // forwarding of single argument works, unless key-option pairs separated
    // by blanks are introduced
    AliDxHFEParticleSelection::ParseArguments(argument);
  }
  
  return 0;
}

AliVParticle *AliDxHFEParticleSelectionD0::CreateParticle(AliVParticle* track)
{
  //
  // Creates object containing only the variables needed for correlation
  // 

  AliReducedParticle *part = new AliReducedParticle(track->Eta(), track->Phi(), track->Pt(),fD0InvMass,fPtBin);

  return part;

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