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   AliDxHFEParticleSelection.cxx
/// @author Sedat Altinpinar, Hege Erdal, Matthias Richter
/// @date   2012-03-19
/// @brief  Base class for particle selection
///

#include "AliDxHFEParticleSelection.h"
#include "AliLog.h"
#include "AliVEvent.h"
#include "AliVParticle.h"
#include "TObjArray.h"
#include "TList.h"
#include "TMath.h"
#include "TH1D.h"
#include "TH2D.h"
#include "THnSparse.h"
#include "AliReducedParticle.h"
#include "TFile.h"
#include "TPRegexp.h" // for TStringToken
#include <iostream>
#include <cerrno>
#include <memory>

using namespace std;

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

AliDxHFEParticleSelection::AliDxHFEParticleSelection(const char* name, const char* opt)
  : TNamed(name?name:"AliDxHFEParticleSelection", name?name:"AliDxHFEParticleSelection")
  , fOption(opt)
  , fSelectedTracks(NULL)
  , fControlObjects(NULL)
  , fhEventControl(NULL)
  , fhTrackControl(NULL)
  , fhNrTracksPerEvent(NULL)
  , fUseMC(0)
  , fVerbosity(0)
  , fDimThn(-1)
  , fParticleProperties(NULL)
  , fSystem(0)
{
  // constructor
  // 
  // 
  // 
  // 
}

const char* AliDxHFEParticleSelection::fgkEventControlBinNames[]={
  "nEventsAll",
  "nEventsSelected",
  "nEventsWParticle"
};

const char* AliDxHFEParticleSelection::fgkTrackControlBinNames[]={
  "nTrackAll",
  "nTrackSelected",
};

AliDxHFEParticleSelection::~AliDxHFEParticleSelection()
{
  // destructor
  if (fParticleProperties) delete[] fParticleProperties;
  fParticleProperties=NULL;
  if (fSelectedTracks) delete fSelectedTracks;
  fSelectedTracks=NULL;
  if (fControlObjects) delete fControlObjects;
  fControlObjects=NULL;
  fhEventControl=NULL;
  fhTrackControl=NULL;
  fhNrTracksPerEvent=NULL;
}

int AliDxHFEParticleSelection::Init()
{
  //
  // Init part sel. Calls InitControlObjects()
  //

  InitControlObjects();
  return 0;
}


int AliDxHFEParticleSelection::InitControlObjects()
{
  //
  // init control objects
  // TODO: Change to private now that have Init()?
  //
  if (fVerbosity>0) {
    AliInfo("Setting up control objects");
  }

  /// init the control objects, can be overloaded by childs which should
  /// call AliDxHFEParticleSelection::InitControlObjects() explicitly
  TString name;
  name.Form("hEventControl%s", GetName());
  fhEventControl=CreateControlHistogram(name.Data(), name.Data(),kNEventPropertyLabels,fgkEventControlBinNames);

  name.Form("hTrackControl%s", GetName());
  fhTrackControl=CreateControlHistogram(name.Data(), name.Data(),kNTrackPropertyLabels,fgkTrackControlBinNames);
  
  name.Form("hNrTracksPerEvent%s", GetName());
  fhNrTracksPerEvent=CreateControlHistogram(name.Data(), name.Data(),100);
  
  AddControlObject(fhEventControl);
  AddControlObject(fhTrackControl);
  AddControlObject(fhNrTracksPerEvent);

  return 0;
}


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


TH2* AliDxHFEParticleSelection::CreateControl2DHistogram(const char* name,
							 const char* title,
							 double* nBins,
							 const char* xaxis,
							 const char* yaxis
							 ) const
{
  /// create control 2D histogram. Requires as input:
  // name = name of histogram 
  // title = title of histogram
  // nBins (array with 6 elements) containing apropriate binning and range for x and y axis
  // xaxis = title of x axis 
  // yaxis = title of y axis 

  std::auto_ptr<TH2> h(new TH2D(name, title, (Int_t)nBins[0], nBins[1], nBins[2], (Int_t)nBins[3], nBins[4],nBins[5]));
  if (!h.get()) return NULL;
  h->GetXaxis()->SetTitle(xaxis);
  h->GetYaxis()->SetTitle(yaxis);
  
  return h.release();
}

THnSparse* AliDxHFEParticleSelection::CreateControlTHnSparse(const char* name,
							     int thnSize,
							     int* thnBins,
							     double* thnMin,
							     double* thnMax,
							     const char** binLabels) const
{
  //
  // Creates THnSparse. 
  //

  AliInfo("Setting up THnSparse");

  std::auto_ptr<THnSparseF> th(new THnSparseF(name, name, thnSize, thnBins, thnMin, thnMax));
  if (th.get()==NULL) {
    return NULL;
  }
  for (int iLabel=0; iLabel<thnSize; iLabel++) {
    th->GetAxis(iLabel)->SetTitle(binLabels[iLabel]);    
   
  }
 return th.release();

}

THnSparse* AliDxHFEParticleSelection::DefineTHnSparse() 
{
  //
  // Defines the THnSparse. For now, only calls CreatControlTHnSparse

  //TODO: Should make it more general. Or maybe one can use this here, and skip in PartSelEl?

  // here is the only place to change the dimension
  const int thnSize = 3;
  InitTHnSparseArray(thnSize);

  const double Pi=TMath::Pi();
  TString name;
  //     		            0    1       2
  // 	 	                    Pt   Phi    Eta
  int         thnBins [thnSize] = { 1000,  200, 500};
  double      thnMin  [thnSize] = {    0,    0, -1.};
  double      thnMax  [thnSize] = {  100, 2*Pi,  1.};
  const char* thnNames[thnSize] = { "Pt","Phi","Eta"};

  name.Form("%s info", GetName());

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

int AliDxHFEParticleSelection::AddControlObject(TObject* pObj)
{
  /// add control object to list, the base class becomes owner of the object
  if (!pObj) return -EINVAL;
  if (!fControlObjects) {
    fControlObjects=new TList;
    if (!fControlObjects) return -ENOMEM;
    fControlObjects->SetOwner();
  }
  if (fControlObjects->FindObject(pObj->GetName())) {
    AliError(Form("ignoring duplicate object '%s' of type %s", pObj->GetName(), pObj->ClassName()));
    return -EEXIST;
  }
  if (GetVerbosity()>0) {
    AliInfo(Form("Adding object '%s' of type %s",pObj->GetName(),pObj->ClassName()));
  }
  fControlObjects->Add(pObj);
  return 0;
}

int AliDxHFEParticleSelection::HistogramEventProperties(int histonr,int bin)
{
  /// histogram event properties
  if (!fControlObjects) return 0;

  // TODO: use enums for the bins of the control histogram
  // for now: 0=all, 1=events with D0s, 2=events with correlated D0s
  if(histonr==kHistoEvent){
    fhEventControl->Fill(bin);
  }
  if(histonr==kHistoNrTracksPrEvent){
    fhNrTracksPerEvent->Fill(bin);
  }
  return 0;
}

int AliDxHFEParticleSelection::HistogramParticleProperties(AliVParticle* p, int selected)
{
  /// histogram particle properties

  if (!p) return -EINVAL;
  if (!fControlObjects) return 0;

  // TODO: use enums for the bins of the control histogram
  fhTrackControl->Fill(kTrackAll);
  if (selected) fhTrackControl->Fill(kTrackSel);
  return 0;
}

int AliDxHFEParticleSelection::FillParticleProperties(AliVParticle* p, Double_t* data, int dimension) const
{
  // fill the data array from the particle data
  if (!data) return -EINVAL;
  int i=0;
  if (dimension!=GetDimTHnSparse()) {
    // TODO: think about filling only the available data and throwing a warning
    return -ENOSPC;
  }
  data[i++]=p->Pt();
  data[i++]=p->Phi();
  data[i++]=p->Eta();
  return i;
}

TObjArray* AliDxHFEParticleSelection::Select(const AliVEvent* pEvent)
{
  /// create selection from 'Tracks' member of the event,
  /// array contains only pointers but does not own the objects
  /// object array needs to be deleted by caller
  if (!pEvent) return NULL;
  TObjArray* selectedTracks=new TObjArray;
  if (!selectedTracks) return NULL;
  selectedTracks->SetOwner(kFALSE); // creating new track objects below
  int nofTracks=pEvent->GetNumberOfTracks();
  for (int itrack=0; itrack<nofTracks; itrack++) {
    AliVParticle* track=pEvent->GetTrack(itrack);
    int selectionCode=IsSelected(track,pEvent);
    HistogramParticleProperties(track, selectionCode);
    if (selectionCode==0) continue;
    selectedTracks->Add(CreateParticle(track));
  }
  return selectedTracks;
}

TObjArray* AliDxHFEParticleSelection::Select(TObjArray* pParticles, const AliVEvent* pEvent)
{
  /// create selection from the array of particles,
  /// array contains only pointers but does not own the objects
  /// object array needs to be deleted by caller
  if (!pParticles) return NULL;
  TObjArray* selectedTracks=new TObjArray;
  if (!selectedTracks) return NULL;
  selectedTracks->SetOwner(kFALSE); // creating new track objects below
  TIter next(pParticles);
  TObject* pObj=NULL;
  while ((pObj=next())) {
    AliVParticle* track=dynamic_cast<AliVParticle*>(pObj);
    if (!track) continue;
    int selectionCode=IsSelected(track, pEvent);
    HistogramParticleProperties(track, selectionCode);
    if (selectionCode ==0) continue;
    selectedTracks->Add(CreateParticle(track));
  }
  return selectedTracks;
}

int AliDxHFEParticleSelection::CheckAndAdd(AliVParticle* /*p*/)
{
  /// check and add track to internal array
  /// TODO: check if needed
  return -ENOSYS;
}

int AliDxHFEParticleSelection::IsSelected(AliVParticle* /*p*/, const AliVEvent* /*e*/)
{
  /// check particle if it passes the selection criteria
  /// childs can overload, by default all tracks are selected
  return 1;
}

void AliDxHFEParticleSelection::AliDxHFEParticleSelection::Clear(Option_t * /*option*/)
{
  /// inherited from TObject: cleanup
}

void AliDxHFEParticleSelection::Print(Option_t */*option*/) const
{
  /// inherited from TObject: print info
  cout << "====================================================================" << endl;
  TNamed::Print();
  if (fControlObjects) fControlObjects->Print();
}
 
void AliDxHFEParticleSelection::SaveAs(const char* filename, Option_t */*option*/) const
{
  /// inherited from TObject: save selection criteria
  TString fileoption;
  // TODO: options recreate
  fileoption="RECREATE";
  //else fileoption="UPDATE";

  std::auto_ptr<TFile> output(TFile::Open(filename,fileoption));
  if (!output.get() || output->IsZombie()) {
    AliError(Form("can not open file %s from writing", filename));
    return;
  }
  output->cd();
  if (fControlObjects) fControlObjects->Write();
  output->Close();
}

void AliDxHFEParticleSelection::Draw(Option_t* /*option*/)
{
  /// inherited from TObject: draw content

  // TODO: implement drawing code
  // - create canvas objects
  // - plot internal objects
  // - optionally save canvases to file
  //
  // It might be appropriate to have another Draw function taking a
  // TList as argument and implementing the actual drawing. If this
  // function is 'static', it can be used stand-alone also from macros
}

TObject* AliDxHFEParticleSelection::FindObject(const char* name) const
{
  /// inherited from TObject: find object by name

  if (fControlObjects) {
    return fControlObjects->FindObject(name);
  }
  return NULL;
}

TObject* AliDxHFEParticleSelection::FindObject(const TObject* obj) const
{
  /// inherited from TObject: find object by pointer
  if (fControlObjects) {
    return fControlObjects->FindObject(obj);
  }
  return NULL;
}

AliVParticle *AliDxHFEParticleSelection::CreateParticle(AliVParticle* track)
{
  // Creating object with reduced particle properties
  AliReducedParticle *part = new AliReducedParticle(track->Eta(), track->Phi(), track->Pt(), track->Charge(), 0);

  return part;

}

int AliDxHFEParticleSelection::ParseArguments(const char* arguments)
{
  // parse arguments and set internal flags
  const char* key=NULL;
  const TString delimiter(" ");
  TStringToken token(arguments, delimiter);
  while (token.NextToken()) {
    TString argument=token;
    key="system=";
    if (argument.BeginsWith(key)) {
      argument.ReplaceAll(key, "");
      if (argument.CompareTo("pp")==0) fSystem=0;
      else if (argument.CompareTo("Pb-Pb")==0) fSystem=1;
      else if (argument.CompareTo("p-Pb")==0) fSystem=2;
      else {
	AliWarning(Form("can not set collision system, unknown parameter '%s'", argument.Data()));
	// TODO: check what makes sense
	fSystem=0;
      }
      continue;
    }

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