ROOT logo
#ifndef AliEventPoolManager_h
#define AliEventPoolManager_h

#include <vector>
#include <deque>
#include <Rtypes.h>
#include <Riostream.h>
#include <TObjArray.h>
#include <TFile.h>
#include <TMath.h>
#include <TRandom.h>
#include <TSystem.h>

// Generic event mixing classes
//
// Stores a buffer of tracks that updates continuously. The track type
// contained by the pools can be anything inheriting from
// TObject. Pools are updated based on maintaining a minimum fixed
// number of tracks. Multiplicity/centrality and z-vertex bins must be
// passed in at initialization. For example of implementation, see
// $ALICE_ROOT/PWGCF/Correlations/DPhi/AliAnalysisTaskPhiCorrelations.cxx
//
// Authors: A. Adare and C. Loizides

using std::deque;

class AliEventPool : public TObject
{
 public:
 AliEventPool(Int_t d) 
   : fEvents(0),
    fNTracksInEvent(0),
    fEventIndex(0),
    fMixDepth(d), 
    fMultMin(-999), 
    fMultMax(+999), 
    fZvtxMin(-999), 
    fZvtxMax(+999), 
    fPsiMin(-999), 
    fPsiMax(+999), 
    fWasUpdated(0), 
    fMultBinIndex(0), 
    fZvtxBinIndex(0), 
    fPsiBinIndex(0), 
    fDebug(0), 
    fTargetTrackDepth(0),
    fFirstFilled(0),
    fNTimes(0),
    fTargetFraction(1),
    fTargetEvents(0)  {;}
  

 AliEventPool(Int_t d, Double_t multMin, Double_t multMax, 
	      Double_t zvtxMin, Double_t zvtxMax,
	      Double_t psiMin=-999., Double_t psiMax=999.) 
   : fEvents(0),
    fNTracksInEvent(0),
    fEventIndex(0),
    fMixDepth(d), 
    fMultMin(multMin), 
    fMultMax(multMax), 
    fZvtxMin(zvtxMin),
    fZvtxMax(zvtxMax),
    fPsiMin(psiMin),
    fPsiMax(psiMax),
    fWasUpdated(0),
    fMultBinIndex(0), 
    fZvtxBinIndex(0),
    fPsiBinIndex(0),
    fDebug(0),
    fTargetTrackDepth(0),
    fFirstFilled(0),
    fNTimes(0),
    fTargetFraction(1),
    fTargetEvents(0) {;}
  
  ~AliEventPool() {;}
  
  Bool_t      EventMatchesBin(Int_t mult,    Double_t zvtx, Double_t psi=0.) const;
  Bool_t      EventMatchesBin(Double_t mult, Double_t zvtx, Double_t psi=0.) const;
  Bool_t      IsReady()                    const { return IsReady(NTracksInPool(), GetCurrentNEvents()); }
  Bool_t      IsFirstReady()               const { return fFirstFilled;   }
  Int_t       GetNTimes()                  const { return fNTimes;        }
  Int_t       GetCurrentNEvents()          const { return fEvents.size(); }
  Int_t       GlobalEventIndex(Int_t j)    const;
  TObject    *GetRandomTrack()             const;
  TObjArray  *GetRandomEvent()             const;
  TObjArray  *GetEvent(Int_t i)            const;
  Int_t       MultBinIndex()               const { return fMultBinIndex; }
  Int_t       NTracksInEvent(Int_t iEvent) const;
  Int_t       NTracksInCurrentEvent()      const { return fNTracksInEvent.back(); }
  void        PrintInfo()                  const;
  Int_t       PsiBinIndex()                   const { return fPsiBinIndex; }
  Int_t       NTracksInPool()              const;
  Bool_t      WasUpdated()                 const { return fWasUpdated; }
  Int_t       ZvtxBinIndex()               const { return fZvtxBinIndex; }
  void        SetDebug(Bool_t b)                 { fDebug = b; }
  void        SetTargetTrackDepth(Int_t d, Float_t fraction = 1.0) { fTargetTrackDepth = d; fTargetFraction = fraction; }
  void        SetTargetEvents(Int_t ev)          { fTargetEvents = ev; }
  Int_t       SetEventMultRange(Int_t    multMin, Int_t multMax);
  Int_t       SetEventMultRange(Double_t multMin, Double_t multMax);
  Int_t       SetEventZvtxRange(Double_t zvtxMin, Double_t zvtxMax);
  Int_t       SetEventPsiRange(Double_t psiMin, Double_t psiMax);
  void        SetMultBinIndex(Int_t iM) { fMultBinIndex = iM; }
  void        SetZvtxBinIndex(Int_t iZ) { fZvtxBinIndex = iZ; }
  void        SetPsiBinIndex(Int_t iP) { fPsiBinIndex  = iP; }
  Int_t       UpdatePool(TObjArray *trk);
  
protected:
  Bool_t      IsReady(Int_t tracks, Int_t events) const { return (tracks >= fTargetFraction * fTargetTrackDepth) || ((fTargetEvents > 0) && (events >= fTargetEvents)); }
  
  deque<TObjArray*>     fEvents;              //Holds TObjArrays of MyTracklets
  deque<int>            fNTracksInEvent;      //Tracks in event
  deque<int>            fEventIndex;          //Original event index
  Int_t                 fMixDepth;            //Number of evts. to mix with
  Double_t              fMultMin, fMultMax;   //Track multiplicity bin range
  Double_t              fZvtxMin, fZvtxMax;   //Event z-vertex bin range
  Double_t              fPsiMin, fPsiMax;     //Event plane angle (Psi) bin range
  Bool_t                fWasUpdated;          //Evt. succesfully passed selection?
  Int_t                 fMultBinIndex;        //Multiplicity bin
  Int_t                 fZvtxBinIndex;        //Zvertex bin
  Int_t                 fPsiBinIndex;         //Event plane angle (Psi) bin
  Int_t                 fDebug;               //If 1 then debug on
  Int_t                 fTargetTrackDepth;    //Number of tracks, once full
  Bool_t                fFirstFilled;         //Init to false
  Int_t                 fNTimes;              //Number of times init. condition reached
  Float_t               fTargetFraction;      //fraction of fTargetTrackDepth at which pool is ready (default: 1.0)
  Int_t                 fTargetEvents;        //if non-zero: number of filled events after which pool is ready regardless of fTargetTrackDepth (default: 0)

  ClassDef(AliEventPool,3) // Event pool class
};

class AliEventPoolManager : public TObject
{
public:
  AliEventPoolManager() 
    : fDebug(0),
    fNMultBins(0), 
    fNZvtxBins(0),
    fNPsiBins(0),
    fEvPool(0),
    fTargetTrackDepth(0) {;}
  AliEventPoolManager(Int_t maxEvts, Int_t minNTracks,
		      Int_t nMultBins, Double_t *multbins,
		      Int_t nZvtxBins, Double_t *zvtxbins);
  
  AliEventPoolManager(Int_t maxEvts, Int_t minNTracks,
		      Int_t nMultBins, Double_t *multbins,
		      Int_t nZvtxBins, Double_t *zvtxbins,
		      Int_t nPsiBins, Double_t *psibins);
  
  ~AliEventPoolManager() {;}
  
  // First uses bin indices, second uses the variables themselves.
  AliEventPool *GetEventPool(Int_t iMult, Int_t iZvtx, Int_t iPsi=0) const;
  AliEventPool *GetEventPool(Int_t centVal, Double_t zvtxVal, Double_t psiVal=0.) const;
  AliEventPool *GetEventPool(Double_t centVal, Double_t zvtxVal, Double_t psiVal=0.) const;

  Int_t       InitEventPools(Int_t depth, 
			     Int_t nmultbins, Double_t *multbins, 
			     Int_t nzvtxbins, Double_t *zvtxbins,
			     Int_t npsibins, Double_t *psibins);
  
  void        SetTargetTrackDepth(Int_t d) { fTargetTrackDepth = d;} // Same as for G.E.P. class
  Int_t       UpdatePools(TObjArray *trk);
  void        SetDebug(Bool_t b) { fDebug = b; }
  void        SetTargetValues(Int_t trackDepth, Float_t fraction, Int_t events);
  
 protected:
  Int_t      fDebug;                                    // If 1 then debug on
  Int_t      fNMultBins;                                // number mult bins
  Int_t      fNZvtxBins;                                // number vertex bins
  Int_t      fNPsiBins;                                 // number Event plane angle (Psi) bins
  std::vector<AliEventPool*> fEvPool;                   // pool in bins of [fNMultBin][fNZvtxBin][fNPsiBin]
  Int_t      fTargetTrackDepth;                         // Required track size, same for all pools.
  
  ClassDef(AliEventPoolManager,2)
};
#endif
 AliEventPoolManager.h:1
 AliEventPoolManager.h:2
 AliEventPoolManager.h:3
 AliEventPoolManager.h:4
 AliEventPoolManager.h:5
 AliEventPoolManager.h:6
 AliEventPoolManager.h:7
 AliEventPoolManager.h:8
 AliEventPoolManager.h:9
 AliEventPoolManager.h:10
 AliEventPoolManager.h:11
 AliEventPoolManager.h:12
 AliEventPoolManager.h:13
 AliEventPoolManager.h:14
 AliEventPoolManager.h:15
 AliEventPoolManager.h:16
 AliEventPoolManager.h:17
 AliEventPoolManager.h:18
 AliEventPoolManager.h:19
 AliEventPoolManager.h:20
 AliEventPoolManager.h:21
 AliEventPoolManager.h:22
 AliEventPoolManager.h:23
 AliEventPoolManager.h:24
 AliEventPoolManager.h:25
 AliEventPoolManager.h:26
 AliEventPoolManager.h:27
 AliEventPoolManager.h:28
 AliEventPoolManager.h:29
 AliEventPoolManager.h:30
 AliEventPoolManager.h:31
 AliEventPoolManager.h:32
 AliEventPoolManager.h:33
 AliEventPoolManager.h:34
 AliEventPoolManager.h:35
 AliEventPoolManager.h:36
 AliEventPoolManager.h:37
 AliEventPoolManager.h:38
 AliEventPoolManager.h:39
 AliEventPoolManager.h:40
 AliEventPoolManager.h:41
 AliEventPoolManager.h:42
 AliEventPoolManager.h:43
 AliEventPoolManager.h:44
 AliEventPoolManager.h:45
 AliEventPoolManager.h:46
 AliEventPoolManager.h:47
 AliEventPoolManager.h:48
 AliEventPoolManager.h:49
 AliEventPoolManager.h:50
 AliEventPoolManager.h:51
 AliEventPoolManager.h:52
 AliEventPoolManager.h:53
 AliEventPoolManager.h:54
 AliEventPoolManager.h:55
 AliEventPoolManager.h:56
 AliEventPoolManager.h:57
 AliEventPoolManager.h:58
 AliEventPoolManager.h:59
 AliEventPoolManager.h:60
 AliEventPoolManager.h:61
 AliEventPoolManager.h:62
 AliEventPoolManager.h:63
 AliEventPoolManager.h:64
 AliEventPoolManager.h:65
 AliEventPoolManager.h:66
 AliEventPoolManager.h:67
 AliEventPoolManager.h:68
 AliEventPoolManager.h:69
 AliEventPoolManager.h:70
 AliEventPoolManager.h:71
 AliEventPoolManager.h:72
 AliEventPoolManager.h:73
 AliEventPoolManager.h:74
 AliEventPoolManager.h:75
 AliEventPoolManager.h:76
 AliEventPoolManager.h:77
 AliEventPoolManager.h:78
 AliEventPoolManager.h:79
 AliEventPoolManager.h:80
 AliEventPoolManager.h:81
 AliEventPoolManager.h:82
 AliEventPoolManager.h:83
 AliEventPoolManager.h:84
 AliEventPoolManager.h:85
 AliEventPoolManager.h:86
 AliEventPoolManager.h:87
 AliEventPoolManager.h:88
 AliEventPoolManager.h:89
 AliEventPoolManager.h:90
 AliEventPoolManager.h:91
 AliEventPoolManager.h:92
 AliEventPoolManager.h:93
 AliEventPoolManager.h:94
 AliEventPoolManager.h:95
 AliEventPoolManager.h:96
 AliEventPoolManager.h:97
 AliEventPoolManager.h:98
 AliEventPoolManager.h:99
 AliEventPoolManager.h:100
 AliEventPoolManager.h:101
 AliEventPoolManager.h:102
 AliEventPoolManager.h:103
 AliEventPoolManager.h:104
 AliEventPoolManager.h:105
 AliEventPoolManager.h:106
 AliEventPoolManager.h:107
 AliEventPoolManager.h:108
 AliEventPoolManager.h:109
 AliEventPoolManager.h:110
 AliEventPoolManager.h:111
 AliEventPoolManager.h:112
 AliEventPoolManager.h:113
 AliEventPoolManager.h:114
 AliEventPoolManager.h:115
 AliEventPoolManager.h:116
 AliEventPoolManager.h:117
 AliEventPoolManager.h:118
 AliEventPoolManager.h:119
 AliEventPoolManager.h:120
 AliEventPoolManager.h:121
 AliEventPoolManager.h:122
 AliEventPoolManager.h:123
 AliEventPoolManager.h:124
 AliEventPoolManager.h:125
 AliEventPoolManager.h:126
 AliEventPoolManager.h:127
 AliEventPoolManager.h:128
 AliEventPoolManager.h:129
 AliEventPoolManager.h:130
 AliEventPoolManager.h:131
 AliEventPoolManager.h:132
 AliEventPoolManager.h:133
 AliEventPoolManager.h:134
 AliEventPoolManager.h:135
 AliEventPoolManager.h:136
 AliEventPoolManager.h:137
 AliEventPoolManager.h:138
 AliEventPoolManager.h:139
 AliEventPoolManager.h:140
 AliEventPoolManager.h:141
 AliEventPoolManager.h:142
 AliEventPoolManager.h:143
 AliEventPoolManager.h:144
 AliEventPoolManager.h:145
 AliEventPoolManager.h:146
 AliEventPoolManager.h:147
 AliEventPoolManager.h:148
 AliEventPoolManager.h:149
 AliEventPoolManager.h:150
 AliEventPoolManager.h:151
 AliEventPoolManager.h:152
 AliEventPoolManager.h:153
 AliEventPoolManager.h:154
 AliEventPoolManager.h:155
 AliEventPoolManager.h:156
 AliEventPoolManager.h:157
 AliEventPoolManager.h:158
 AliEventPoolManager.h:159
 AliEventPoolManager.h:160
 AliEventPoolManager.h:161
 AliEventPoolManager.h:162
 AliEventPoolManager.h:163
 AliEventPoolManager.h:164
 AliEventPoolManager.h:165
 AliEventPoolManager.h:166
 AliEventPoolManager.h:167
 AliEventPoolManager.h:168
 AliEventPoolManager.h:169
 AliEventPoolManager.h:170
 AliEventPoolManager.h:171
 AliEventPoolManager.h:172
 AliEventPoolManager.h:173
 AliEventPoolManager.h:174
 AliEventPoolManager.h:175
 AliEventPoolManager.h:176
 AliEventPoolManager.h:177
 AliEventPoolManager.h:178
 AliEventPoolManager.h:179