Consistent handling of THnSparse dimensions for different selection classes; code...
authorprino <prino@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 24 Sep 2012 21:36:27 +0000 (21:36 +0000)
committerprino <prino@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 24 Sep 2012 21:36:27 +0000 (21:36 +0000)
PWGHF/correlationHF/AliDxHFEParticleSelection.cxx
PWGHF/correlationHF/AliDxHFEParticleSelection.h
PWGHF/correlationHF/AliDxHFEParticleSelectionD0.cxx
PWGHF/correlationHF/AliDxHFEParticleSelectionD0.h
PWGHF/correlationHF/AliDxHFEParticleSelectionEl.cxx
PWGHF/correlationHF/AliDxHFEParticleSelectionEl.h
PWGHF/correlationHF/AliDxHFEParticleSelectionMCD0.cxx
PWGHF/correlationHF/AliDxHFEParticleSelectionMCD0.h
PWGHF/correlationHF/AliDxHFEParticleSelectionMCEl.cxx
PWGHF/correlationHF/AliDxHFEParticleSelectionMCEl.h

index 4d72677..71ae886 100644 (file)
@@ -51,6 +51,8 @@ AliDxHFEParticleSelection::AliDxHFEParticleSelection(const char* name, const cha
   , fhTrackControl(NULL)
   , fUseMC(0)
   , fVerbosity(0)
+  , fDimThn(-1)
+  , fParticleProperties(NULL)
 {
   // constructor
   // 
@@ -70,15 +72,11 @@ const char* AliDxHFEParticleSelection::fgkTrackControlBinNames[]={
   "nTrackSelected",
 };
 
-const char* AliDxHFEParticleSelection::fgkTrackControlDimNames[]={
-  "Pt",
-  "Phi",
-  "Eta"
-};
-
 AliDxHFEParticleSelection::~AliDxHFEParticleSelection()
 {
   // destructor
+  if (fParticleProperties) delete[] fParticleProperties;
+  fParticleProperties=NULL;
   if (fSelectedTracks) delete fSelectedTracks;
   fSelectedTracks=NULL;
   if (fControlObjects) delete fControlObjects;
@@ -150,26 +148,29 @@ THnSparse* AliDxHFEParticleSelection::CreateControlTHnSparse(const char* name,
 
 }
 
-THnSparse* AliDxHFEParticleSelection::DefineTHnSparse() const
+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.};
+  //                               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,fgkTrackControlDimNames);
-
+  return CreateControlTHnSparse(name,thnSize,thnBins,thnMin,thnMax,thnNames);
 }
 
 int AliDxHFEParticleSelection::AddControlObject(TObject* pObj)
@@ -216,15 +217,12 @@ int AliDxHFEParticleSelection::HistogramParticleProperties(AliVParticle* p, int
   return 0;
 }
 
-int AliDxHFEParticleSelection::DefineParticleProperties(AliVParticle* p, Double_t* data, int dimension) const
+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;
-  // TODO: this corresponds to the THnSparse dimensions which is available in the same class
-  // use this consistently
-  const int requiredDimension=3;
-  if (dimension!=requiredDimension) {
+  if (dimension!=GetDimTHnSparse()) {
     // TODO: think about filling only the available data and throwing a warning
     return -ENOSPC;
   }
index 62f29ac..b276745 100644 (file)
@@ -79,8 +79,7 @@ class AliDxHFEParticleSelection : public TNamed {
   /// histogram event properties
   virtual int HistogramEventProperties(int bin);
 
-  // TODO: function can be renamed to better describe what it's doing
-  virtual int DefineParticleProperties(AliVParticle* p, Double_t* date, int dimension) const;
+  virtual int FillParticleProperties(AliVParticle* p, Double_t* date, int dimension) const;
 
   /// check and add track to internal array
   int CheckAndAdd(AliVParticle* p);
@@ -114,8 +113,12 @@ class AliDxHFEParticleSelection : public TNamed {
 
   /// set verbosity
   void SetVerbosity(int verbosity) {fVerbosity=verbosity;}
+
   /// get verbosity
-  int GetVerbosity() const {return fVerbosity;}
+  inline int GetVerbosity() const {return fVerbosity;}
+
+  /// get the dimension of THn, fixed
+  inline int GetDimTHnSparse() const {return fDimThn;}
   
   /// create control THnSparse
   THnSparse* CreateControlTHnSparse(const char* name,
@@ -125,7 +128,9 @@ class AliDxHFEParticleSelection : public TNamed {
                                    double* thnMax,
                                    const char** binLabels) const;
 
-  virtual THnSparse* DefineTHnSparse() const;
+  // define and create the THnSparse object
+  // initializes also the dimension to be used further
+  virtual THnSparse* DefineTHnSparse();
 
  protected:
   /// add control object to list, the base class becomes owner of the object
@@ -134,6 +139,15 @@ class AliDxHFEParticleSelection : public TNamed {
   /// histogram particle properties
   virtual int HistogramParticleProperties(AliVParticle* p, int selected=1);
 
+  /// set the dimension of THn and allocate filling array
+  void InitTHnSparseArray(int dimension) {
+    fDimThn=dimension; 
+    if (fParticleProperties) delete[] fParticleProperties; fParticleProperties=NULL;
+    if (dimension>0) fParticleProperties=new Double_t[dimension];
+  }
+
+  inline Double_t* ParticleProperties() const {return fParticleProperties;}
+
  private:
   /// copy contructor prohibited
   AliDxHFEParticleSelection(const AliDxHFEParticleSelection&);
@@ -149,12 +163,13 @@ class AliDxHFEParticleSelection : public TNamed {
   TH1* fhTrackControl; //! track control histogram
   bool fUseMC;         // specific implementation for MC selection
   int fVerbosity;      //! verbosity
+  int fDimThn;         //  dim of thnsparse
+  Double_t* fParticleProperties;  //! filling array for THnSparse
 
   static const char* fgkEventControlBinNames[]; //! bin labels for event control histogram
   static const char* fgkTrackControlBinNames[]; //! bin labels for track control histogram
-  static const char* fgkTrackControlDimNames[]; //! bin labels fro track thnsparse
 
-  ClassDef(AliDxHFEParticleSelection, 2);
+  ClassDef(AliDxHFEParticleSelection, 3);
 
 };
 
index 648d7da..9776b97 100644 (file)
@@ -87,14 +87,6 @@ AliDxHFEParticleSelectionD0::~AliDxHFEParticleSelectionD0()
   fCuts=NULL;
 }
 
-const char* AliDxHFEParticleSelectionD0::fgkTrackControlBinNames[]={
-  "Pt",
-  "Phi",
-  "Ptbin", 
-  "D0InvMass", 
-  "Eta"
-};
-
 const char* AliDxHFEParticleSelectionD0::fgkDgTrackControlBinNames[]={
   "Pt",
   "Phi",
@@ -118,28 +110,31 @@ int AliDxHFEParticleSelectionD0::InitControlObjects()
   return AliDxHFEParticleSelection::InitControlObjects();
 }
 
-THnSparse* AliDxHFEParticleSelectionD0::DefineTHnSparse() const
+THnSparse* AliDxHFEParticleSelectionD0::DefineTHnSparse()
 {
   //
   // Defines the THnSparse. For now, only calls CreateControlTHnSparse
   // TODO: remove pt?? (Have ptbin)
 
+  // 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, 21,     200,     500 };
-  double thnMin [thnSize2] = {    0,    0,  0,    1.5648,   -1. };
-  double thnMax [thnSize2] = {  100, 2*Pi, 20,    2.1648,    1. };
-
-  return CreateControlTHnSparse(name,thnSize2,thnBins,thnMin,thnMax,fgkTrackControlBinNames);
+  //                                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. };
+  const char* thnNames[thnSize2] = { "Pt","Phi","Ptbin","D0InvMass","Eta"};
 
+  return CreateControlTHnSparse(name,thnSize2,thnBins,thnMin,thnMax,thnNames);
 }
 
-int AliDxHFEParticleSelectionD0::DefineParticleProperties(AliVParticle* p, Double_t* data, int dimension) const
+int AliDxHFEParticleSelectionD0::FillParticleProperties(AliVParticle* p, Double_t* data, int dimension) const
 {
   // fill the data array from the particle data
   if (!data) return -EINVAL;
@@ -147,10 +142,7 @@ int AliDxHFEParticleSelectionD0::DefineParticleProperties(AliVParticle* p, Doubl
   AliAODRecoDecayHF2Prong* track=dynamic_cast<AliAODRecoDecayHF2Prong*>(p);
   if (!track) return -ENODATA;
   int i=0;
-  // TODO: this corresponds to the THnSparse dimensions which is available in the same class
-  // use this consistently
-  const int requiredDimension=5;
-  if (dimension!=requiredDimension) {
+  if (dimension!=GetDimTHnSparse()) {
     // TODO: think about filling only the available data and throwing a warning
     return -ENOSPC;
   }
@@ -231,10 +223,11 @@ int AliDxHFEParticleSelectionD0::HistogramParticleProperties(AliVParticle* p, in
     Double_t KProperties[]={prongneg->Pt(),prongneg->Phi(),fPtBin, fD0InvMass,prongneg->Eta()};
     Double_t piProperties[]={prongpos->Pt(),prongpos->Phi(),fPtBin,fD0InvMass,prongpos->Eta()};
 
-    // TODO: make array a member, consistent dimensions for THnSparse and array
-    Double_t d0Properties[5]={0.0, 0.0, 0.0, 0.0, 0.0};
-    DefineParticleProperties(p, d0Properties, 5);
-    if(fD0Properties) fD0Properties->Fill(d0Properties);
+    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);
   }
index f0bacb2..eaa1078 100644 (file)
@@ -33,9 +33,8 @@ class AliDxHFEParticleSelectionD0 : public AliDxHFEParticleSelection {
 
   /// overloaded from AliDxHFEParticleSelection: init the control objects
   virtual int InitControlObjects();
-  virtual THnSparse* DefineTHnSparse() const;
-  // TODO: function can be renamed to better describe what it's doing
-  virtual int DefineParticleProperties(AliVParticle* p, Double_t* date, int dimension) const;
+  virtual THnSparse* DefineTHnSparse();
+  virtual int FillParticleProperties(AliVParticle* p, Double_t* date, int dimension) const;
 
   //Function for daughter control objects
   //TODO: move to AliDxHFEParticleSelection to be used for several particles?
@@ -73,7 +72,6 @@ class AliDxHFEParticleSelectionD0 : public AliDxHFEParticleSelection {
   Double_t fD0InvMass;          // D0InvMass
   Int_t fPtBin;                 // Pt Bin
 
-  static const char* fgkTrackControlBinNames[]; //! bin labels for track control histogram
   static const char* fgkDgTrackControlBinNames[]; //! bin labels for track control histogram
 
   // TODO: at the moment the dimensions of the different THnSparse objects are different
index 74b08c5..926d170 100644 (file)
@@ -86,12 +86,6 @@ AliDxHFEParticleSelectionEl::~AliDxHFEParticleSelectionEl()
   fCuts=NULL;
 }
 
-const char* AliDxHFEParticleSelectionEl::fgkTrackControlBinNames[]={
-  "Pt",
-  "Phi",
-  "Eta"
-};
-
 const char* AliDxHFEParticleSelectionEl::fgkCutBinNames[]={
   "kRecKineITSTPC",
   "kRecPrim",
@@ -141,23 +135,26 @@ int AliDxHFEParticleSelectionEl::Init()
 
 }
 
-THnSparse* AliDxHFEParticleSelectionEl::DefineTHnSparse() const
+THnSparse* AliDxHFEParticleSelectionEl::DefineTHnSparse()
 {
   //
   // Defines the THnSparse. For now, only calls CreatControlTHnSparse
+
+  // here is the only place to change the dimension
   const int thnSize = 3;
+  InitTHnSparseArray(thnSize);
   const double Pi=TMath::Pi();
   TString name;
   name.Form("%s info", GetName());
 
-  //                          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.};
-
-  return CreateControlTHnSparse(name,thnSize,thnBins,thnMin,thnMax,fgkTrackControlBinNames);
+  //                                 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"};
 
+  return CreateControlTHnSparse(name,thnSize,thnBins,thnMin,thnMax,thnNames);
 }
 
 int AliDxHFEParticleSelectionEl::InitControlObjects()
@@ -183,25 +180,23 @@ int AliDxHFEParticleSelectionEl::HistogramParticleProperties(AliVParticle* p, in
   if (!p) return -EINVAL;
   //if (!fControlObjects) return 0;
   if(selectionCode==0) return  0;
-  // TODO: make array a member, consistent dimensions for THnSparse and array
-  Double_t eProperties[3]={0.0, 0.0, 0.0};
-  DefineParticleProperties(p, eProperties, 3);
-  if(fElectronProperties) fElectronProperties->Fill(eProperties);
-    
+  
+  if(fElectronProperties && ParticleProperties()) {
+    FillParticleProperties(p, ParticleProperties(), GetDimTHnSparse());
+    fElectronProperties->Fill(ParticleProperties());
+  }
+
   return 0;
 }
 
-int AliDxHFEParticleSelectionEl::DefineParticleProperties(AliVParticle* p, Double_t* data, int dimension) const
+int AliDxHFEParticleSelectionEl::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;
-  // TODO: this corresponds to the THnSparse dimensions which is available in the same class
-  // use this consistently
-  const int requiredDimension=3;
-  if (dimension!=requiredDimension) {
+  if (dimension!=GetDimTHnSparse()) {
     // TODO: think about filling only the available data and throwing a warning
     return -ENOSPC;
   }
index 84c5cfc..cc467ef 100644 (file)
@@ -73,15 +73,14 @@ class AliDxHFEParticleSelectionEl : public AliDxHFEParticleSelection {
 
   /// overloaded from AliDxHFEParticleSelection: init the control objects
   virtual int InitControlObjects();
-  virtual THnSparse* DefineTHnSparse() const;
+  virtual THnSparse* DefineTHnSparse();
 
   /// overloaded from AliDxHFEParticleSelection: check particle
   virtual int IsSelected(AliVParticle* p, const AliVEvent* pEvent);
 
   virtual int HistogramParticleProperties(AliVParticle* p, int selected);
 
-  // TODO: function can be renamed to better describe what it's doing
-  virtual int DefineParticleProperties(AliVParticle* p, Double_t* date, int dimension) const;
+  virtual int FillParticleProperties(AliVParticle* p, Double_t* date, int dimension) const;
 
   /// set cuts object: a type cast check is implemented in the method
   virtual void SetCuts(TObject* /*cuts*/, int /*level*/=0);
@@ -103,7 +102,6 @@ class AliDxHFEParticleSelectionEl : public AliDxHFEParticleSelection {
   AliHFEcuts*   fCuts;               //! Cuts for HF electrons
   AliCFManager* fCFM;                //! Correction Framework Manager
 
-  static const char* fgkTrackControlBinNames[]; //! bin labels for track control histogram
   static const char* fgkCutBinNames[]; //! bin labels for cuts histogram
 
   ClassDef(AliDxHFEParticleSelectionEl, 2);
index 1f843fe..c01c5d8 100644 (file)
@@ -36,17 +36,6 @@ using namespace std;
 /// ROOT macro for the implementation of ROOT specific class methods
 ClassImp(AliDxHFEParticleSelectionMCD0)
 
-// TODO: can that be a common definition
-const char* AliDxHFEParticleSelectionMCD0::fgkTrackControlBinNames[]={
-"Pt",
-"Phi",
-"Ptbin", 
-"D0InvMass", 
-"Eta",
-"Statistics D0",
-"Mother of D0"
-};
-
 AliDxHFEParticleSelectionMCD0::AliDxHFEParticleSelectionMCD0(const char* opt)
   : AliDxHFEParticleSelectionD0(opt)
   , fMCTools()
@@ -69,38 +58,46 @@ AliDxHFEParticleSelectionMCD0::~AliDxHFEParticleSelectionMCD0()
 {
   // destructor
 }
-THnSparse* AliDxHFEParticleSelectionMCD0::DefineTHnSparse() const
+
+THnSparse* AliDxHFEParticleSelectionMCD0::DefineTHnSparse()
 {
   //
   // Defines the THnSparse.
   // could/should remove Pt and leave Ptbin
 
+  // here is the only place to change the dimension
   const int thnSize2 = 7;
+  InitTHnSparseArray(thnSize2);
   const double Pi=TMath::Pi();
   TString name;
   name.Form("%s info", GetName());
 
-  //                          0    1      2      3          4     5         6      
-  //                          Pt   Phi   Ptbin  D0InvMass  Eta  'stat D0'  mother 
-  int    thnBins[thnSize2] = { 1000,  200, 21,     200,     500,     2,       10  };
-  double thnMin [thnSize2] = {    0,    0,  0,    1.5648,   -1.,  -0.5,     -1.5  };
-  double thnMax [thnSize2] = {  100, 2*Pi, 20,    2.1648,    1.,   1.5,      8.5  };
-
-  return CreateControlTHnSparse(name,thnSize2,thnBins,thnMin,thnMax,fgkTrackControlBinNames);
-
+  //                                0    1      2      3          4     5         6      
+  //                                Pt   Phi   Ptbin  D0InvMass  Eta  'stat D0'  mother 
+  int         thnBins [thnSize2] = { 1000,  200, 21,     200,     500,     2,       10  };
+  double      thnMin  [thnSize2] = {    0,    0,  0,    1.5648,   -1.,  -0.5,     -1.5  };
+  double      thnMax  [thnSize2] = {  100, 2*Pi, 20,    2.1648,    1.,   1.5,      8.5  };
+  const char* thnNames[thnSize2] = {
+    "Pt",
+    "Phi",
+    "Ptbin", 
+    "D0InvMass", 
+    "Eta",
+    "Statistics D0",
+    "Mother of D0"
+  };
+
+  return CreateControlTHnSparse(name,thnSize2,thnBins,thnMin,thnMax,thnNames);
 }
 
-int AliDxHFEParticleSelectionMCD0::DefineParticleProperties(AliVParticle* p, Double_t* data, int dimension) const
+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;
-  // TODO: this corresponds to the THnSparse dimensions which is available in the same class
-  // use this consistently
-  const int requiredDimension=7;
-  if (dimension!=requiredDimension) {
+  if (dimension!=GetDimTHnSparse()) {
     // TODO: think about filling only the available data and throwing a warning
     return -ENOSPC;
   }
@@ -141,9 +138,11 @@ int AliDxHFEParticleSelectionMCD0::IsSelected(AliVParticle* p, const AliVEvent*
 
   // step 2, only executed if MC check is last
   // MC selection  - > Should maybe also distinguish between D0 and D0bar
-  iResult=CheckMC(p, pEvent);
-  // TODO: why do we need to store the result in a member?
-  fResultMC=iResult;
+  // 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;
 }
index 6a3a9cd..4664799 100644 (file)
@@ -32,9 +32,8 @@ class AliDxHFEParticleSelectionMCD0 : public AliDxHFEParticleSelectionD0 {
   /// overloaded from AliDxHFEParticleSelection: check particle
   virtual int IsSelected(AliVParticle* p, const AliVEvent *pEvent=NULL);
 
-  virtual THnSparse* DefineTHnSparse() const;
-  // TODO: function can be renamed to better describe what it's doing
-  virtual int DefineParticleProperties(AliVParticle* p, Double_t* date, int dimension) const;
+  virtual THnSparse* DefineTHnSparse();
+  virtual int FillParticleProperties(AliVParticle* p, Double_t* date, int dimension) const;
 
   /// check MC criteria
   int CheckMC(AliVParticle* p, const AliVEvent* pEvent);
@@ -53,8 +52,6 @@ class AliDxHFEParticleSelectionMCD0 : public AliDxHFEParticleSelectionD0 {
   AliDxHFEToolsMC fMCTools;  // MC selction tools
   int fResultMC;             // Result on MC check
   int fOriginMother;         // Holds info on the original mother particle
-  static const char* fgkTrackControlBinNames[]; //! bin labels for track control histogram
-
 
   ClassDef(AliDxHFEParticleSelectionMCD0, 1);
 };
index 2c7418f..0874d84 100644 (file)
@@ -78,26 +78,18 @@ const char* AliDxHFEParticleSelectionMCEl::fgkPDGMotherBinLabels[]={
   "others"
 };
 
-const char* AliDxHFEParticleSelectionMCEl::fgkTrackControlBinNames[]={
-  "Pt",
-  "Phi",
-  "Eta", 
-  "MC statistics electron"
-  "Mother", 
-  "PDG of selected electron", 
-};
-
 AliDxHFEParticleSelectionMCEl::~AliDxHFEParticleSelectionMCEl()
 {
   // destructor
 }
 
-THnSparse* AliDxHFEParticleSelectionMCEl::DefineTHnSparse() const
+THnSparse* AliDxHFEParticleSelectionMCEl::DefineTHnSparse()
 {
   //
   // Defines the THnSparse. 
 
   const int thnSize = 6;
+  InitTHnSparseArray(thnSize);
   const double Pi=TMath::Pi();
   TString name;
   name.Form("%s info", GetName());
@@ -107,22 +99,26 @@ THnSparse* AliDxHFEParticleSelectionMCEl::DefineTHnSparse() const
   int    thnBins[thnSize] = { 1000,  200, 500,    2,       14,      10 };
   double thnMin [thnSize] = {    0,    0, -1., -0.5,     -1.5,    -0.5 };
   double thnMax [thnSize] = {  100, 2*Pi,  1.,  1.5,     12.5,     9.5 };
+  const char* thnNames[thnSize]={
+    "Pt",
+    "Phi",
+    "Eta", 
+    "MC statistics electron",
+    "Mother", 
+    "PDG of selected electron"
+  };
  
-  return CreateControlTHnSparse(name,thnSize,thnBins,thnMin,thnMax,fgkTrackControlBinNames);
-
+  return CreateControlTHnSparse(name,thnSize,thnBins,thnMin,thnMax,thnNames);
 }
 
-int AliDxHFEParticleSelectionMCEl::DefineParticleProperties(AliVParticle* p, Double_t* data, int dimension) const
+int AliDxHFEParticleSelectionMCEl::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;
-  // TODO: this corresponds to the THnSparse dimensions which is available in the same class
-  // use this consistently
-  const int requiredDimension=6;
-  if (dimension!=requiredDimension) {
+  if (dimension!=GetDimTHnSparse()) {
     // TODO: think about filling only the available data and throwing a warning
     return -ENOSPC;
   }
@@ -163,10 +159,12 @@ int AliDxHFEParticleSelectionMCEl::IsSelected(AliVParticle* p, const AliVEvent*
 
   // step 2, only executed if MC check is last
   // optional MC selection after the particle selection
-  iResult=CheckMC(p, pEvent);
-  // TODO: why do we need to store the result in a member?
-  fResultMC=iResult;
+  // 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;
 }
 
index c9780c7..c02dc30 100644 (file)
@@ -33,10 +33,9 @@ class AliDxHFEParticleSelectionMCEl : public AliDxHFEParticleSelectionEl {
   virtual ~AliDxHFEParticleSelectionMCEl();
 
   // Setting up control objects: overloaded from AliDxHFEParticleSelection
-  virtual THnSparse* DefineTHnSparse() const;
+  virtual THnSparse* DefineTHnSparse();
 
-  // TODO: function can be renamed to better describe what it's doing
-  virtual int DefineParticleProperties(AliVParticle* p, Double_t* date, int dimension) const;
+  virtual int FillParticleProperties(AliVParticle* p, Double_t* date, int dimension) const;
 
   /// overloaded from AliDxHFEParticleSelection: check particle
   virtual int IsSelected(AliVParticle* p, const AliVEvent *pEvent=NULL);
@@ -57,7 +56,6 @@ class AliDxHFEParticleSelectionMCEl : public AliDxHFEParticleSelectionEl {
 
   /// TODO: check if the label definitions can be used from the ToolsMC
   static const char* fgkPDGMotherBinLabels[];
-  static const char* fgkTrackControlBinNames[]; //! bin labels for track control histogram
 
   AliDxHFEToolsMC fMCTools;            // MC selection tools
   THnSparse*      fElectronProperties; // the particle properties of selected particles