ROOT logo
#include "AliPool.h"

// ===================================================================
//                             AliEvtPool
// ===================================================================

using std::cout;
using std::endl;

ClassImp(AliEvtPool)

AliEvtPool::~AliEvtPool()
{
  while (!fEvents.empty()) {
    MiniEvent* fe= fEvents.front();
    delete fe;
    fe = 0;
    fEvents.pop_front();
  }
}

void 
AliEvtPool::PrintInfo() const
{
  cout << Form("%20s: %d events", "Pool capacity", fMixDepth) << endl;
  cout << Form("%20s: %d events, %d tracks", "Current size", 
	       GetCurrentNEvents(), NTracksInPool()) << endl;
  cout << Form("%20s: %.1f to %.1f", "Sub-event mult.", fMultMin, fMultMax) << endl;
  cout << Form("%20s: %.1f to %.1f", "Z-vtx range", fZvtxMin, fZvtxMax) << endl;

  return;
}

Bool_t 
AliEvtPool::EventMatchesBin(Int_t mult, Double_t zvtx) const
{
  return EventMatchesBin((Double_t) mult, zvtx);
}

Bool_t 
AliEvtPool::EventMatchesBin(Double_t mult, Double_t zvtx) const
{
  // Lower bin limit included; upper limit excluded.

  Bool_t multOK = (mult >= fMultMin && mult < fMultMax);
  Bool_t zvtxOK = (zvtx >= fZvtxMin && zvtx < fZvtxMax);
  return (multOK && zvtxOK);
}

Int_t 
AliEvtPool::NTracksInPool() const
{
  // Number of tracks for this cent, zvtx bin; possibly includes many events.

  Int_t ntrk=0;
  for (Int_t i=0; i<(Int_t)fEvents.size(); ++i) {
    ntrk += fNTracksInEvent.at(i);
  }
  return ntrk;
}

Int_t
AliEvtPool::SetEventMultRange(Int_t multMin, Int_t multMax)
{
  fMultMin = (Double_t)multMin;
  fMultMax = (Double_t)multMax;
  return 0;
}

Int_t
AliEvtPool::SetEventMultRange(Double_t multMin, Double_t multMax)
{
  fMultMin = multMin;
  fMultMax = multMax;
  return 0;
}

Int_t
AliEvtPool::SetEventZvtxRange(Double_t zvtxMin, Double_t zvtxMax)
{
  fZvtxMin = zvtxMin;
  fZvtxMax = zvtxMax;
  return 0;
}

Int_t
AliEvtPool::GlobalEventIndex(Int_t j) const
{
  // Index returned from passing local pool event index.

  if (j < 0 || j >= (Int_t)fEventIndex.size()) {
    cout << "ERROR in AliEvtPool::GlobalEventIndex(): "
	 << " Invalid index " << j << endl;
    return -99;
  }
  return fEventIndex.at(j);
}

Int_t
AliEvtPool::UpdatePool(MiniEvent* miniEvt)
{
  // A rolling buffer (a double-ended queue) is updated by removing
  // the oldest event, and appending the newest.

  static Int_t iEvent = -1; 
  iEvent++;

  Int_t mult = miniEvt->size(); // # tracks in this (mini) event
  Int_t nTrk = NTracksInPool();

  if (nTrk < fTargetTrackDepth && ((nTrk + mult) >= fTargetTrackDepth)) 
    fNTimes++;

  // remove 0th element before appending this event
  Bool_t removeFirstEvent = 0;
  if (nTrk>fTargetTrackDepth) {
    Int_t nTrksFirstEvent= fNTracksInEvent.front();
    Int_t diff = nTrk - nTrksFirstEvent + mult;
    if (diff>fTargetTrackDepth)
      removeFirstEvent = 1;
  }
  if (removeFirstEvent) {
    MiniEvent* oldestEvent = fEvents.front();
    oldestEvent->clear();
    delete oldestEvent;
    fEvents.pop_front();         // remove first track array 
    fNTracksInEvent.pop_front(); // remove first int
    fEventIndex.pop_front();
  }

  fNTracksInEvent.push_back(mult);
  fEvents.push_back(miniEvt);
  fEventIndex.push_back(iEvent);

  if (fNTimes==1) {
    fFirstFilled = kTRUE;
    if (AliEvtPool::fDebug) {
      cout << "\nPool " << MultBinIndex() << ", " << ZvtxBinIndex() 
           << " ready at event "<< iEvent;
      PrintInfo();
      cout << endl;
    }
    fNTimes++; // See this message exactly once/pool
  } else {
    fFirstFilled = kFALSE;
  }

  fWasUpdated = true;

  if (AliEvtPool::fDebug) {
    cout << " Event " << fEventIndex.back();
    cout << " PoolDepth = " << GetCurrentNEvents(); 
    cout << " NTracksInCurrentEvent = " << " " << mult << endl;
  }

  return fEvents.size();
}

MiniEvent* 
AliEvtPool::GetEvent(Int_t i) const
{
  if (i<0 || i>=(Int_t)fEvents.size()) {
    cout << "AliEvtPool::GetEvent(" 
	 << i << "): Invalid index" << endl;
    return 0x0;
  }

  MiniEvent* ev = fEvents.at(i);
  return ev;
}

Int_t
AliEvtPool::NTracksInEvent(Int_t iEvent) const
{
  // Return number of tracks in iEvent, which is the local pool index.

  Int_t n = -1;
  Int_t curEvent = fEventIndex.back();
  Int_t offset = curEvent - iEvent;
  Int_t pos = fEventIndex.size() - offset - 1;

  if (offset==0)
    n = fNTracksInEvent.back();
  else if (offset < 0 || iEvent < 0) {
    n = 0;
  }
  else if (offset > 0 && offset <= (int)fEventIndex.size()) {
    n = fNTracksInEvent.at(pos);
  }
  else
    cout << "Event info no longer in memory" << endl;
  return n;
}

// ===================================================================
//                          AliEvtPoolManager
// ===================================================================


ClassImp(AliEvtPoolManager)

AliEvtPoolManager::AliEvtPoolManager(Int_t depth,     Int_t minNTracks,
				     Int_t nMultBins, Double_t *multbins,
				     Int_t nZvtxBins, Double_t *zvtxbins) 
: fDebug(0), fNMultBins(0), fNZvtxBins(0), fEvPool(0), fTargetTrackDepth(minNTracks) 
{
  // Constructor.

  InitEventPools(depth, nMultBins, multbins, nZvtxBins, zvtxbins);
  cout << "AliEvtPoolManager initialized." << endl;
}

AliEvtPoolManager::~AliEvtPoolManager()
{
  for (Int_t iM=0; iM<fNMultBins; iM++) {
    for (Int_t iZ=0; iZ<fNZvtxBins; iZ++) {
      AliEvtPool* pool = fEvPool.at(iM).at(iZ);
      delete pool;
    }
  }
}

Int_t AliEvtPoolManager::InitEventPools(Int_t depth, 
                                       Int_t nMultBins, Double_t *multbin, 
                                       Int_t nZvtxBins, Double_t *zvtxbin)
{
  // Assign AliEvtPoolManager members.

  fNMultBins = nMultBins;
  fNZvtxBins = nZvtxBins;

  for (Int_t iM=0; iM<fNMultBins; iM++) {
    std::vector<AliEvtPool*> evp;
    for (Int_t iZ=0; iZ<fNZvtxBins; iZ++) {
      evp.push_back(new AliEvtPool(depth, 
				   multbin[iM], multbin[iM+1], 
				   zvtxbin[iZ], zvtxbin[iZ+1] ));
    }
    fEvPool.push_back(evp);
  }
  
  for (Int_t iM=0; iM<nMultBins; iM++) {
    for (Int_t iZ=0; iZ<nZvtxBins; iZ++) {
      fEvPool.at(iM).at(iZ)->SetMultBinIndex(iM);
      fEvPool.at(iM).at(iZ)->SetZvtxBinIndex(iZ);
      fEvPool.at(iM).at(iZ)->SetTargetTrackDepth(fTargetTrackDepth);
      fEvPool.at(iM).at(iZ)->SetDebug(fDebug);
    }
  }
  
  if (fDebug) {
    cout << "fEvPool outer size: " << fEvPool.size() << endl;
    for (Int_t iM=0; iM<nMultBins; iM++) {
      for (Int_t iZ=0; iZ<nZvtxBins; iZ++) {
	if(fEvPool.at(iM).at(iZ)) {
	  cout << "multiplicity bin: " << iM;
	  cout << ", z-vertex bin: " << iZ;
	  fEvPool.at(iM).at(iZ)->PrintInfo();
	}
      }
    }
  }
  
  return fEvPool.size();
}

AliEvtPool*
AliEvtPoolManager::GetEventPool(Int_t iMult, Int_t iZvtx) const
{
  if (iMult < 0 || iMult >= fNMultBins) 
    return 0x0;
  if (iZvtx < 0 || iZvtx >= fNZvtxBins) 
    return 0x0;
  return fEvPool.at(iMult).at(iZvtx);
}

AliEvtPool*
AliEvtPoolManager::GetEventPool(Int_t centVal, Double_t zVtxVal) const
{
  return GetEventPool((Double_t)centVal, zVtxVal);
}

AliEvtPool*
AliEvtPoolManager::GetEventPool(Double_t centVal, Double_t zVtxVal) const
{
  // Return appropriate pool for this centrality and z-vertex value.

  for (Int_t iM=0; iM<fNMultBins; iM++) {
    for (Int_t iZ=0; iZ<fNZvtxBins; iZ++) {
      AliEvtPool* pool = GetEventPool(iM, iZ);
      if (pool->EventMatchesBin(centVal, zVtxVal))
	return pool;
    }
  }
  return 0x0;
}

Int_t
AliEvtPoolManager::UpdatePools(MiniEvent* miniEvt)
{
  // Call UpdatePool for all bins.

  for (Int_t iM=0; iM<fNMultBins; iM++) {
    for (Int_t iZ=0; iZ<fNZvtxBins; iZ++) {
      if (fEvPool.at(iM).at(iZ)->UpdatePool(miniEvt) > -1)
        break;
    }
  }
  return 0;
}
 AliPool.cxx:1
 AliPool.cxx:2
 AliPool.cxx:3
 AliPool.cxx:4
 AliPool.cxx:5
 AliPool.cxx:6
 AliPool.cxx:7
 AliPool.cxx:8
 AliPool.cxx:9
 AliPool.cxx:10
 AliPool.cxx:11
 AliPool.cxx:12
 AliPool.cxx:13
 AliPool.cxx:14
 AliPool.cxx:15
 AliPool.cxx:16
 AliPool.cxx:17
 AliPool.cxx:18
 AliPool.cxx:19
 AliPool.cxx:20
 AliPool.cxx:21
 AliPool.cxx:22
 AliPool.cxx:23
 AliPool.cxx:24
 AliPool.cxx:25
 AliPool.cxx:26
 AliPool.cxx:27
 AliPool.cxx:28
 AliPool.cxx:29
 AliPool.cxx:30
 AliPool.cxx:31
 AliPool.cxx:32
 AliPool.cxx:33
 AliPool.cxx:34
 AliPool.cxx:35
 AliPool.cxx:36
 AliPool.cxx:37
 AliPool.cxx:38
 AliPool.cxx:39
 AliPool.cxx:40
 AliPool.cxx:41
 AliPool.cxx:42
 AliPool.cxx:43
 AliPool.cxx:44
 AliPool.cxx:45
 AliPool.cxx:46
 AliPool.cxx:47
 AliPool.cxx:48
 AliPool.cxx:49
 AliPool.cxx:50
 AliPool.cxx:51
 AliPool.cxx:52
 AliPool.cxx:53
 AliPool.cxx:54
 AliPool.cxx:55
 AliPool.cxx:56
 AliPool.cxx:57
 AliPool.cxx:58
 AliPool.cxx:59
 AliPool.cxx:60
 AliPool.cxx:61
 AliPool.cxx:62
 AliPool.cxx:63
 AliPool.cxx:64
 AliPool.cxx:65
 AliPool.cxx:66
 AliPool.cxx:67
 AliPool.cxx:68
 AliPool.cxx:69
 AliPool.cxx:70
 AliPool.cxx:71
 AliPool.cxx:72
 AliPool.cxx:73
 AliPool.cxx:74
 AliPool.cxx:75
 AliPool.cxx:76
 AliPool.cxx:77
 AliPool.cxx:78
 AliPool.cxx:79
 AliPool.cxx:80
 AliPool.cxx:81
 AliPool.cxx:82
 AliPool.cxx:83
 AliPool.cxx:84
 AliPool.cxx:85
 AliPool.cxx:86
 AliPool.cxx:87
 AliPool.cxx:88
 AliPool.cxx:89
 AliPool.cxx:90
 AliPool.cxx:91
 AliPool.cxx:92
 AliPool.cxx:93
 AliPool.cxx:94
 AliPool.cxx:95
 AliPool.cxx:96
 AliPool.cxx:97
 AliPool.cxx:98
 AliPool.cxx:99
 AliPool.cxx:100
 AliPool.cxx:101
 AliPool.cxx:102
 AliPool.cxx:103
 AliPool.cxx:104
 AliPool.cxx:105
 AliPool.cxx:106
 AliPool.cxx:107
 AliPool.cxx:108
 AliPool.cxx:109
 AliPool.cxx:110
 AliPool.cxx:111
 AliPool.cxx:112
 AliPool.cxx:113
 AliPool.cxx:114
 AliPool.cxx:115
 AliPool.cxx:116
 AliPool.cxx:117
 AliPool.cxx:118
 AliPool.cxx:119
 AliPool.cxx:120
 AliPool.cxx:121
 AliPool.cxx:122
 AliPool.cxx:123
 AliPool.cxx:124
 AliPool.cxx:125
 AliPool.cxx:126
 AliPool.cxx:127
 AliPool.cxx:128
 AliPool.cxx:129
 AliPool.cxx:130
 AliPool.cxx:131
 AliPool.cxx:132
 AliPool.cxx:133
 AliPool.cxx:134
 AliPool.cxx:135
 AliPool.cxx:136
 AliPool.cxx:137
 AliPool.cxx:138
 AliPool.cxx:139
 AliPool.cxx:140
 AliPool.cxx:141
 AliPool.cxx:142
 AliPool.cxx:143
 AliPool.cxx:144
 AliPool.cxx:145
 AliPool.cxx:146
 AliPool.cxx:147
 AliPool.cxx:148
 AliPool.cxx:149
 AliPool.cxx:150
 AliPool.cxx:151
 AliPool.cxx:152
 AliPool.cxx:153
 AliPool.cxx:154
 AliPool.cxx:155
 AliPool.cxx:156
 AliPool.cxx:157
 AliPool.cxx:158
 AliPool.cxx:159
 AliPool.cxx:160
 AliPool.cxx:161
 AliPool.cxx:162
 AliPool.cxx:163
 AliPool.cxx:164
 AliPool.cxx:165
 AliPool.cxx:166
 AliPool.cxx:167
 AliPool.cxx:168
 AliPool.cxx:169
 AliPool.cxx:170
 AliPool.cxx:171
 AliPool.cxx:172
 AliPool.cxx:173
 AliPool.cxx:174
 AliPool.cxx:175
 AliPool.cxx:176
 AliPool.cxx:177
 AliPool.cxx:178
 AliPool.cxx:179
 AliPool.cxx:180
 AliPool.cxx:181
 AliPool.cxx:182
 AliPool.cxx:183
 AliPool.cxx:184
 AliPool.cxx:185
 AliPool.cxx:186
 AliPool.cxx:187
 AliPool.cxx:188
 AliPool.cxx:189
 AliPool.cxx:190
 AliPool.cxx:191
 AliPool.cxx:192
 AliPool.cxx:193
 AliPool.cxx:194
 AliPool.cxx:195
 AliPool.cxx:196
 AliPool.cxx:197
 AliPool.cxx:198
 AliPool.cxx:199
 AliPool.cxx:200
 AliPool.cxx:201
 AliPool.cxx:202
 AliPool.cxx:203
 AliPool.cxx:204
 AliPool.cxx:205
 AliPool.cxx:206
 AliPool.cxx:207
 AliPool.cxx:208
 AliPool.cxx:209
 AliPool.cxx:210
 AliPool.cxx:211
 AliPool.cxx:212
 AliPool.cxx:213
 AliPool.cxx:214
 AliPool.cxx:215
 AliPool.cxx:216
 AliPool.cxx:217
 AliPool.cxx:218
 AliPool.cxx:219
 AliPool.cxx:220
 AliPool.cxx:221
 AliPool.cxx:222
 AliPool.cxx:223
 AliPool.cxx:224
 AliPool.cxx:225
 AliPool.cxx:226
 AliPool.cxx:227
 AliPool.cxx:228
 AliPool.cxx:229
 AliPool.cxx:230
 AliPool.cxx:231
 AliPool.cxx:232
 AliPool.cxx:233
 AliPool.cxx:234
 AliPool.cxx:235
 AliPool.cxx:236
 AliPool.cxx:237
 AliPool.cxx:238
 AliPool.cxx:239
 AliPool.cxx:240
 AliPool.cxx:241
 AliPool.cxx:242
 AliPool.cxx:243
 AliPool.cxx:244
 AliPool.cxx:245
 AliPool.cxx:246
 AliPool.cxx:247
 AliPool.cxx:248
 AliPool.cxx:249
 AliPool.cxx:250
 AliPool.cxx:251
 AliPool.cxx:252
 AliPool.cxx:253
 AliPool.cxx:254
 AliPool.cxx:255
 AliPool.cxx:256
 AliPool.cxx:257
 AliPool.cxx:258
 AliPool.cxx:259
 AliPool.cxx:260
 AliPool.cxx:261
 AliPool.cxx:262
 AliPool.cxx:263
 AliPool.cxx:264
 AliPool.cxx:265
 AliPool.cxx:266
 AliPool.cxx:267
 AliPool.cxx:268
 AliPool.cxx:269
 AliPool.cxx:270
 AliPool.cxx:271
 AliPool.cxx:272
 AliPool.cxx:273
 AliPool.cxx:274
 AliPool.cxx:275
 AliPool.cxx:276
 AliPool.cxx:277
 AliPool.cxx:278
 AliPool.cxx:279
 AliPool.cxx:280
 AliPool.cxx:281
 AliPool.cxx:282
 AliPool.cxx:283
 AliPool.cxx:284
 AliPool.cxx:285
 AliPool.cxx:286
 AliPool.cxx:287
 AliPool.cxx:288
 AliPool.cxx:289
 AliPool.cxx:290
 AliPool.cxx:291
 AliPool.cxx:292
 AliPool.cxx:293
 AliPool.cxx:294
 AliPool.cxx:295
 AliPool.cxx:296
 AliPool.cxx:297
 AliPool.cxx:298
 AliPool.cxx:299
 AliPool.cxx:300
 AliPool.cxx:301
 AliPool.cxx:302
 AliPool.cxx:303
 AliPool.cxx:304
 AliPool.cxx:305
 AliPool.cxx:306
 AliPool.cxx:307
 AliPool.cxx:308
 AliPool.cxx:309
 AliPool.cxx:310