ROOT logo
//-*- Mode: C++ -*-
// $Id$

//* This file is property of and copyright by the ALICE Project        * 
//* ALICE Experiment at CERN, All rights reserved.                     *
//* See cxx source for full Copyright notice                           *

/// @file   AliDxHFEParticleSelection.h
/// @author Sedat Altinpinar, Hege Erdal, Matthias Richter
/// @date   2012-03-19
/// @brief  Base class for particle selection
///

#ifndef ALIDXHFEPARTICLESELECTION_H
#define ALIDXHFEPARTICLESELECTION_H

#include "TNamed.h"
#include "TString.h"
class AliVEvent;
class AliVParticle;
class AliPIDResponse;
class TObjArray;
class TH1;
class TH2;
class THnSparse;

/**
 * @class AliDxHFEParticleSelection
 * This is the base class for particle selections for the D0 - HFE
 * correlation studies.
 *
 * Ideas:
 * - configurable particle selection
 * - eventually histogramming of particle properties before vs. after
 *   selection
 *
 * Might be that there is already something similar, then this class
 * can be merged with some other class.
 */
class AliDxHFEParticleSelection : public TNamed {
  public:
  /// constructor
  AliDxHFEParticleSelection(const char* name=NULL, const char* opt="");
  /// destructor
  virtual ~AliDxHFEParticleSelection();

  enum {
    kEventsAll = 0,
    kEventsSel,
    kEventsWithParticle,
    kNEventPropertyLabels
  };
  
  enum {
    kTrackAll = 0,
    kTrackSel,
    kNTrackPropertyLabels
  };

  enum {
    kHistoEvent=0,
    kHistoNrTracksPrEvent
  };

  /// set options
  void SetOption(const char* opt) { fOption = opt; }
  /// overloaded from TObject: get option
  virtual Option_t* GetOption() const { return fOption;}

  /// init the control objects
  virtual int Init();
  virtual int InitControlObjects();

  /// 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
  virtual TObjArray* Select(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
  virtual TObjArray* Select(TObjArray* particles, const AliVEvent* pEvent);

  virtual void SetPIDResponse(const AliPIDResponse* /*const pidresp*/){}

  // Get the list fControlObjects. 
  const TList* GetControlObjects() const {return fControlObjects;}

  /// histogram event properties
  virtual int HistogramEventProperties(int histonr, int bin);
  virtual int HistogramEventProperties(int bin){
    return HistogramEventProperties(kHistoEvent,bin);
  }
  
  virtual int FillParticleProperties(AliVParticle* p, Double_t* date, int dimension) const;
  virtual AliVParticle* CreateParticle(AliVParticle* track);

  /// check and add track to internal array
  int CheckAndAdd(AliVParticle* p);

  /// set cuts object: general TObject pointer is used as argument to support
  // different types; a type cast check is implemented in the method
  virtual void SetCuts(TObject* /*cuts*/, int /*level*/=0) {}

  // TODO: check whether that is needed, should be covered by the specific
  // child implementation
  Bool_t GetUseMC() const {return fUseMC;}

  /// get selected tracks
  const TObjArray* GetSelected() const {return fSelectedTracks;}

  /// check particle if it passes the selection criteria
  virtual int IsSelected(AliVParticle* p, const AliVEvent *pEvent=NULL);

  /// inherited from TObject: cleanup
  virtual void Clear(Option_t * option ="");
  /// inherited from TObject: print info
  virtual void Print(Option_t *option="") const;
  /// inherited from TObject: safe selection criteria
  virtual void SaveAs(const char *filename="", Option_t *option="") const;
  /// inherited from TObject: draw content
  virtual void Draw(Option_t *option="");
  /// inherited from TObject: find object by name
  virtual TObject* FindObject(const char *name) const;
  /// inherited from TObject: find object by pointer
  virtual TObject* FindObject(const TObject *obj) const;

  /// set verbosity
  void SetVerbosity(int verbosity) {fVerbosity=verbosity;}

  /// get verbosity
  inline int GetVerbosity() const {return fVerbosity;}

  /// get the dimension of THn, fixed
  inline int GetDimTHnSparse() const {return fDimThn;}

  /// create 2D control histogram
  TH2* CreateControl2DHistogram(const char* name,
				const char* title,
				double* nBins,
				const char* xaxis,
				const char* yaxis) const;

  /// create control histogram
  TH1* CreateControlHistogram(const char* name,
			      const char* title,
			      int nBins,
			      double min,
			      double max,
			      const char** binLabels=NULL) const;

  /// create control histogram
  TH1* CreateControlHistogram(const char* name,
			      const char* title,
			      int nBins,
			      const char** binLabels=NULL) const {
    return CreateControlHistogram(name, title, nBins, -0.5, nBins-0.5, binLabels);
  }
  
  /// create control THnSparse
  THnSparse* CreateControlTHnSparse(const char* name,
				    int thnSize,
				    int* thnBins,
				    double* thnMin,
				    double* thnMax,
				    const char** binLabels) const;

  // define and create the THnSparse object
  // initializes also the dimension to be used further
  virtual THnSparse* DefineTHnSparse();
  
  Int_t GetSystem() const {return fSystem;}

 protected:
  /// add control object to list, the base class becomes owner of the object
  int AddControlObject(TObject* pObj);

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

  virtual int ParseArguments(const char* arguments);

 private:
  /// copy contructor prohibited
  AliDxHFEParticleSelection(const AliDxHFEParticleSelection&);
  /// assignment operator prohibited
  AliDxHFEParticleSelection& operator=(const AliDxHFEParticleSelection&);

  TString fOption; // option
  TObjArray* fSelectedTracks; //! array of selected tracks

  // control histograms, note: only the list is saved, pointers only used for fast access
  TList* fControlObjects; // list of control objects
  TH1* fhEventControl; //! event control histogram
  TH1* fhTrackControl; //! track control histogram
  TH1* fhNrTracksPerEvent; //! Control histo for nr particles pr event
  bool fUseMC;         // specific implementation for MC selection
  int fVerbosity;      //! verbosity
  int fDimThn;         //  dim of thnsparse
  Double_t* fParticleProperties;  //! filling array for THnSparse
  Int_t     fSystem;            // whether running on pp(0,default), PbPb(1) or pPb(2, not used yet) 

  static const char* fgkEventControlBinNames[]; //! bin labels for event control histogram
  static const char* fgkTrackControlBinNames[]; //! bin labels for track control histogram

  ClassDef(AliDxHFEParticleSelection, 5);

};

#endif
 AliDxHFEParticleSelection.h:1
 AliDxHFEParticleSelection.h:2
 AliDxHFEParticleSelection.h:3
 AliDxHFEParticleSelection.h:4
 AliDxHFEParticleSelection.h:5
 AliDxHFEParticleSelection.h:6
 AliDxHFEParticleSelection.h:7
 AliDxHFEParticleSelection.h:8
 AliDxHFEParticleSelection.h:9
 AliDxHFEParticleSelection.h:10
 AliDxHFEParticleSelection.h:11
 AliDxHFEParticleSelection.h:12
 AliDxHFEParticleSelection.h:13
 AliDxHFEParticleSelection.h:14
 AliDxHFEParticleSelection.h:15
 AliDxHFEParticleSelection.h:16
 AliDxHFEParticleSelection.h:17
 AliDxHFEParticleSelection.h:18
 AliDxHFEParticleSelection.h:19
 AliDxHFEParticleSelection.h:20
 AliDxHFEParticleSelection.h:21
 AliDxHFEParticleSelection.h:22
 AliDxHFEParticleSelection.h:23
 AliDxHFEParticleSelection.h:24
 AliDxHFEParticleSelection.h:25
 AliDxHFEParticleSelection.h:26
 AliDxHFEParticleSelection.h:27
 AliDxHFEParticleSelection.h:28
 AliDxHFEParticleSelection.h:29
 AliDxHFEParticleSelection.h:30
 AliDxHFEParticleSelection.h:31
 AliDxHFEParticleSelection.h:32
 AliDxHFEParticleSelection.h:33
 AliDxHFEParticleSelection.h:34
 AliDxHFEParticleSelection.h:35
 AliDxHFEParticleSelection.h:36
 AliDxHFEParticleSelection.h:37
 AliDxHFEParticleSelection.h:38
 AliDxHFEParticleSelection.h:39
 AliDxHFEParticleSelection.h:40
 AliDxHFEParticleSelection.h:41
 AliDxHFEParticleSelection.h:42
 AliDxHFEParticleSelection.h:43
 AliDxHFEParticleSelection.h:44
 AliDxHFEParticleSelection.h:45
 AliDxHFEParticleSelection.h:46
 AliDxHFEParticleSelection.h:47
 AliDxHFEParticleSelection.h:48
 AliDxHFEParticleSelection.h:49
 AliDxHFEParticleSelection.h:50
 AliDxHFEParticleSelection.h:51
 AliDxHFEParticleSelection.h:52
 AliDxHFEParticleSelection.h:53
 AliDxHFEParticleSelection.h:54
 AliDxHFEParticleSelection.h:55
 AliDxHFEParticleSelection.h:56
 AliDxHFEParticleSelection.h:57
 AliDxHFEParticleSelection.h:58
 AliDxHFEParticleSelection.h:59
 AliDxHFEParticleSelection.h:60
 AliDxHFEParticleSelection.h:61
 AliDxHFEParticleSelection.h:62
 AliDxHFEParticleSelection.h:63
 AliDxHFEParticleSelection.h:64
 AliDxHFEParticleSelection.h:65
 AliDxHFEParticleSelection.h:66
 AliDxHFEParticleSelection.h:67
 AliDxHFEParticleSelection.h:68
 AliDxHFEParticleSelection.h:69
 AliDxHFEParticleSelection.h:70
 AliDxHFEParticleSelection.h:71
 AliDxHFEParticleSelection.h:72
 AliDxHFEParticleSelection.h:73
 AliDxHFEParticleSelection.h:74
 AliDxHFEParticleSelection.h:75
 AliDxHFEParticleSelection.h:76
 AliDxHFEParticleSelection.h:77
 AliDxHFEParticleSelection.h:78
 AliDxHFEParticleSelection.h:79
 AliDxHFEParticleSelection.h:80
 AliDxHFEParticleSelection.h:81
 AliDxHFEParticleSelection.h:82
 AliDxHFEParticleSelection.h:83
 AliDxHFEParticleSelection.h:84
 AliDxHFEParticleSelection.h:85
 AliDxHFEParticleSelection.h:86
 AliDxHFEParticleSelection.h:87
 AliDxHFEParticleSelection.h:88
 AliDxHFEParticleSelection.h:89
 AliDxHFEParticleSelection.h:90
 AliDxHFEParticleSelection.h:91
 AliDxHFEParticleSelection.h:92
 AliDxHFEParticleSelection.h:93
 AliDxHFEParticleSelection.h:94
 AliDxHFEParticleSelection.h:95
 AliDxHFEParticleSelection.h:96
 AliDxHFEParticleSelection.h:97
 AliDxHFEParticleSelection.h:98
 AliDxHFEParticleSelection.h:99
 AliDxHFEParticleSelection.h:100
 AliDxHFEParticleSelection.h:101
 AliDxHFEParticleSelection.h:102
 AliDxHFEParticleSelection.h:103
 AliDxHFEParticleSelection.h:104
 AliDxHFEParticleSelection.h:105
 AliDxHFEParticleSelection.h:106
 AliDxHFEParticleSelection.h:107
 AliDxHFEParticleSelection.h:108
 AliDxHFEParticleSelection.h:109
 AliDxHFEParticleSelection.h:110
 AliDxHFEParticleSelection.h:111
 AliDxHFEParticleSelection.h:112
 AliDxHFEParticleSelection.h:113
 AliDxHFEParticleSelection.h:114
 AliDxHFEParticleSelection.h:115
 AliDxHFEParticleSelection.h:116
 AliDxHFEParticleSelection.h:117
 AliDxHFEParticleSelection.h:118
 AliDxHFEParticleSelection.h:119
 AliDxHFEParticleSelection.h:120
 AliDxHFEParticleSelection.h:121
 AliDxHFEParticleSelection.h:122
 AliDxHFEParticleSelection.h:123
 AliDxHFEParticleSelection.h:124
 AliDxHFEParticleSelection.h:125
 AliDxHFEParticleSelection.h:126
 AliDxHFEParticleSelection.h:127
 AliDxHFEParticleSelection.h:128
 AliDxHFEParticleSelection.h:129
 AliDxHFEParticleSelection.h:130
 AliDxHFEParticleSelection.h:131
 AliDxHFEParticleSelection.h:132
 AliDxHFEParticleSelection.h:133
 AliDxHFEParticleSelection.h:134
 AliDxHFEParticleSelection.h:135
 AliDxHFEParticleSelection.h:136
 AliDxHFEParticleSelection.h:137
 AliDxHFEParticleSelection.h:138
 AliDxHFEParticleSelection.h:139
 AliDxHFEParticleSelection.h:140
 AliDxHFEParticleSelection.h:141
 AliDxHFEParticleSelection.h:142
 AliDxHFEParticleSelection.h:143
 AliDxHFEParticleSelection.h:144
 AliDxHFEParticleSelection.h:145
 AliDxHFEParticleSelection.h:146
 AliDxHFEParticleSelection.h:147
 AliDxHFEParticleSelection.h:148
 AliDxHFEParticleSelection.h:149
 AliDxHFEParticleSelection.h:150
 AliDxHFEParticleSelection.h:151
 AliDxHFEParticleSelection.h:152
 AliDxHFEParticleSelection.h:153
 AliDxHFEParticleSelection.h:154
 AliDxHFEParticleSelection.h:155
 AliDxHFEParticleSelection.h:156
 AliDxHFEParticleSelection.h:157
 AliDxHFEParticleSelection.h:158
 AliDxHFEParticleSelection.h:159
 AliDxHFEParticleSelection.h:160
 AliDxHFEParticleSelection.h:161
 AliDxHFEParticleSelection.h:162
 AliDxHFEParticleSelection.h:163
 AliDxHFEParticleSelection.h:164
 AliDxHFEParticleSelection.h:165
 AliDxHFEParticleSelection.h:166
 AliDxHFEParticleSelection.h:167
 AliDxHFEParticleSelection.h:168
 AliDxHFEParticleSelection.h:169
 AliDxHFEParticleSelection.h:170
 AliDxHFEParticleSelection.h:171
 AliDxHFEParticleSelection.h:172
 AliDxHFEParticleSelection.h:173
 AliDxHFEParticleSelection.h:174
 AliDxHFEParticleSelection.h:175
 AliDxHFEParticleSelection.h:176
 AliDxHFEParticleSelection.h:177
 AliDxHFEParticleSelection.h:178
 AliDxHFEParticleSelection.h:179
 AliDxHFEParticleSelection.h:180
 AliDxHFEParticleSelection.h:181
 AliDxHFEParticleSelection.h:182
 AliDxHFEParticleSelection.h:183
 AliDxHFEParticleSelection.h:184
 AliDxHFEParticleSelection.h:185
 AliDxHFEParticleSelection.h:186
 AliDxHFEParticleSelection.h:187
 AliDxHFEParticleSelection.h:188
 AliDxHFEParticleSelection.h:189
 AliDxHFEParticleSelection.h:190
 AliDxHFEParticleSelection.h:191
 AliDxHFEParticleSelection.h:192
 AliDxHFEParticleSelection.h:193
 AliDxHFEParticleSelection.h:194
 AliDxHFEParticleSelection.h:195
 AliDxHFEParticleSelection.h:196
 AliDxHFEParticleSelection.h:197
 AliDxHFEParticleSelection.h:198
 AliDxHFEParticleSelection.h:199
 AliDxHFEParticleSelection.h:200
 AliDxHFEParticleSelection.h:201
 AliDxHFEParticleSelection.h:202
 AliDxHFEParticleSelection.h:203
 AliDxHFEParticleSelection.h:204
 AliDxHFEParticleSelection.h:205
 AliDxHFEParticleSelection.h:206
 AliDxHFEParticleSelection.h:207
 AliDxHFEParticleSelection.h:208
 AliDxHFEParticleSelection.h:209
 AliDxHFEParticleSelection.h:210
 AliDxHFEParticleSelection.h:211
 AliDxHFEParticleSelection.h:212
 AliDxHFEParticleSelection.h:213
 AliDxHFEParticleSelection.h:214
 AliDxHFEParticleSelection.h:215
 AliDxHFEParticleSelection.h:216
 AliDxHFEParticleSelection.h:217
 AliDxHFEParticleSelection.h:218