ROOT logo
///////////////////////////////////////////////////////////////////////////
//                                                                       //
// AliFemtoManager: main class managing femtoscopic analysis             //
// The Manager is the top-level object that coordinates activities       //
// and performs event, particle, and pair loops, and checks the          //
// various Cuts of the Analyses in its AnalysisCollection                //
//                                                                       //
///////////////////////////////////////////////////////////////////////////

#include "AliFemtoManager.h"
//#include "AliFemtoParticleCollection.h"
//#include "AliFemtoTrackCut.h"
//#include "AliFemtoV0Cut.h"
#include <cstdio>

#ifdef __ROOT__
ClassImp(AliFemtoManager)
#endif



//____________________________
AliFemtoManager::AliFemtoManager():
  fAnalysisCollection(0),
  fEventReader(0),
  fEventWriterCollection(0)
{
  // default constructor
  fAnalysisCollection = new AliFemtoAnalysisCollection;
  fEventWriterCollection = new AliFemtoEventWriterCollection;
  fEventReader = 0;
}
//____________________________
AliFemtoManager::AliFemtoManager(const AliFemtoManager& aManager) :
  fAnalysisCollection(0),
  fEventReader(0),
  fEventWriterCollection(0)
{
  // copy constructor
  fEventReader = aManager.fEventReader;
  AliFemtoSimpleAnalysisIterator tAnalysisIter;
  fAnalysisCollection = new AliFemtoAnalysisCollection;
  for (tAnalysisIter=aManager.fAnalysisCollection->begin();tAnalysisIter!=aManager.fAnalysisCollection->end();tAnalysisIter++){
    fAnalysisCollection->push_back(*tAnalysisIter);
  }
  AliFemtoEventWriterIterator tEventWriterIter;
  fEventWriterCollection = new AliFemtoEventWriterCollection;
  for (tEventWriterIter=aManager.fEventWriterCollection->begin();tEventWriterIter!=aManager.fEventWriterCollection->end();tEventWriterIter++){
    fEventWriterCollection->push_back(*tEventWriterIter);
  }
}

//____________________________
AliFemtoManager::~AliFemtoManager(){
  // destructor
  delete fEventReader;
  // now delete each Analysis in the Collection, and then the Collection itself
  AliFemtoSimpleAnalysisIterator tAnalysisIter;
  for (tAnalysisIter=fAnalysisCollection->begin();tAnalysisIter!=fAnalysisCollection->end();tAnalysisIter++){
    delete *tAnalysisIter;
    *tAnalysisIter = 0;
  }
  delete fAnalysisCollection;
  // now delete each EventWriter in the Collection, and then the Collection itself
  AliFemtoEventWriterIterator tEventWriterIter;
  for (tEventWriterIter=fEventWriterCollection->begin();tEventWriterIter!=fEventWriterCollection->end();tEventWriterIter++){
    delete *tEventWriterIter;
    *tEventWriterIter = 0;
  }
  delete fEventWriterCollection;
}
//____________________________
AliFemtoManager& AliFemtoManager::operator=(const AliFemtoManager& aManager)
{
  // assignment operator
  if (this == &aManager)
    return *this;

  fEventReader = aManager.fEventReader;
  AliFemtoSimpleAnalysisIterator tAnalysisIter;
  if (fAnalysisCollection) {
    for (tAnalysisIter=fAnalysisCollection->begin();tAnalysisIter!=fAnalysisCollection->end();tAnalysisIter++){
      delete *tAnalysisIter;
      *tAnalysisIter = 0;
    }
    delete fAnalysisCollection;
  }
  // now delete each EventWriter in the Collection, and then the Collection itself
  AliFemtoEventWriterIterator tEventWriterIter;
  if (fEventWriterCollection) {
    for (tEventWriterIter=fEventWriterCollection->begin();tEventWriterIter!=fEventWriterCollection->end();tEventWriterIter++){
      delete *tEventWriterIter;
      *tEventWriterIter = 0;
    }
    delete fEventWriterCollection;
  }

  fAnalysisCollection = new AliFemtoAnalysisCollection;
  for (tAnalysisIter=aManager.fAnalysisCollection->begin();tAnalysisIter!=aManager.fAnalysisCollection->end();tAnalysisIter++){
    fAnalysisCollection->push_back(*tAnalysisIter);
  }

  fEventWriterCollection = new AliFemtoEventWriterCollection;
  for (tEventWriterIter=aManager.fEventWriterCollection->begin();tEventWriterIter!=aManager.fEventWriterCollection->end();tEventWriterIter++){
    fEventWriterCollection->push_back(*tEventWriterIter);
  }
  return *this;
}

//____________________________
int AliFemtoManager::Init(){
  // Execute initialization procedures
  AliFemtoString readerMessage;
  readerMessage += "*** *** *** *** *** *** *** *** *** *** *** *** \n";
  // EventReader
  if (fEventReader) {
    if (fEventReader->Init("r",readerMessage)){
      cout << " AliFemtoManager::Init() - Reader initialization failed " << endl;
      return (1);
    }
    readerMessage += fEventReader->Report();
  }
  // EventWriters
  AliFemtoEventWriterIterator tEventWriterIter;
  for (tEventWriterIter=fEventWriterCollection->begin();tEventWriterIter!=fEventWriterCollection->end();tEventWriterIter++){
    //cout << "*EventWriterIter " << *EventWriterIter << endl;
    // The message (AliFemtoString) passed into Init will be at the file header.
    // for that reason take the readerReport, add my own report and pass as message 
    AliFemtoString writerMessage = readerMessage;
    writerMessage += "*** *** *** *** *** *** *** *** *** *** *** *** \n";
    writerMessage += (*tEventWriterIter)->Report();
    if (*tEventWriterIter) {
      if ( (*tEventWriterIter)->Init("w",writerMessage)){ // yes, the message from the reader is passed into the writer
	cout << " AliFemtoManager::Init() - Writer initialization failed " << endl;
	return (1);
      }
    }
  }
  
  
  return (0);
}
//____________________________
void AliFemtoManager::Finish(){
  // Initialize finish procedures
  // EventReader
  if (fEventReader) fEventReader->Finish();
  // EventWriters
  AliFemtoEventWriterIterator tEventWriterIter;
  AliFemtoEventWriter* currentEventWriter;
  for (tEventWriterIter=fEventWriterCollection->begin();tEventWriterIter!=fEventWriterCollection->end();tEventWriterIter++){
    currentEventWriter = *tEventWriterIter;
    currentEventWriter->Finish();
  }
  // Analyses
  AliFemtoSimpleAnalysisIterator tAnalysisIter;
  AliFemtoAnalysis* currentAnalysis;
  for (tAnalysisIter=fAnalysisCollection->begin();tAnalysisIter!=fAnalysisCollection->end();tAnalysisIter++){
    currentAnalysis = *tAnalysisIter;
    currentAnalysis->Finish();
  }
}
//____________________________
AliFemtoString AliFemtoManager::Report(){
  // Construct a report from all the classes
  string stemp;
  char ctemp[100];
  // EventReader
  stemp = fEventReader->Report();
  // EventWriters
  snprintf(ctemp , 100, "\nAliFemtoManager Reporting %u EventWriters\n",(unsigned int) fEventWriterCollection->size());
  stemp += ctemp;
  AliFemtoEventWriterIterator tEventWriterIter;
  AliFemtoEventWriter* currentEventWriter;
  for (tEventWriterIter=fEventWriterCollection->begin();tEventWriterIter!=fEventWriterCollection->end();tEventWriterIter++){
    //    cout << "AliFemtoManager - asking for EventWriter Report" << endl;
    currentEventWriter = *tEventWriterIter;
    stemp+=currentEventWriter->Report();
  }
  // Analyses
  snprintf(ctemp , 100, "\nAliFemtoManager Reporting %u Analyses\n",(unsigned int) fAnalysisCollection->size());
  stemp += ctemp;
  AliFemtoSimpleAnalysisIterator tAnalysisIter;
  AliFemtoAnalysis* currentAnalysis;
  for (tAnalysisIter=fAnalysisCollection->begin();tAnalysisIter!=fAnalysisCollection->end();tAnalysisIter++){
    //    cout << "AliFemtoManager - asking for Analysis Report" << endl;
    currentAnalysis = *tAnalysisIter;
    stemp+=currentAnalysis->Report();
  }

  AliFemtoString returnThis = stemp;
  return returnThis;
}
//____________________________
AliFemtoAnalysis* AliFemtoManager::Analysis( int n ){  // return pointer to n-th analysis
  // return analysis number n
  if ( n<0 || n > (int) fAnalysisCollection->size() )
    return NULL;
  AliFemtoSimpleAnalysisIterator iter = fAnalysisCollection->begin();
  for (int i=0; i<n ;i++){
    iter++;
  }
  return *iter;
}
//____________________________
AliFemtoEventWriter* AliFemtoManager::EventWriter( int n ){  // return pointer to n-th analysis
  // return event writern number n
  if ( n<0 || n > (int) fEventWriterCollection->size() )
    return NULL;
  AliFemtoEventWriterIterator iter = fEventWriterCollection->begin();
  for (int i=0; i<n ;i++){
    iter++;
  }
  return *iter;
}
 //____________________________
int AliFemtoManager::ProcessEvent(){
  // process a single event by reading it and passing it to each
  // analysis and event writer
  //  cout << "AliFemtoManager::ProcessEvent" << endl;
  // NOTE - this ReturnHbtEvent makes a *new* AliFemtoEvent - delete it when done!
  AliFemtoEvent* currentHbtEvent = fEventReader->ReturnHbtEvent();
  //  cout << "Event reader has returned control to manager" << endl;
  // if no HbtEvent is returned, then we abort processing.
  // the question is now: do we try again next time (i.e. there may be an HbtEvent next time)
  // or are we at EOF or something?  If Reader says Status=0, then that means try again later.
  // so, we just return the Reader's Status.
  if (!currentHbtEvent){
#ifdef STHBRDEBUG
    cout << "AliFemtoManager::ProcessEvent() - Reader::ReturnHbtEvent() has returned null pointer\n";
#endif
    return fEventReader->Status();
  }

  // loop over all the EventWriters
  AliFemtoEventWriterIterator tEventWriterIter;
  for (tEventWriterIter=fEventWriterCollection->begin();tEventWriterIter!=fEventWriterCollection->end();tEventWriterIter++){
#ifdef STHBRDEBUG
    cout << " *tEventWriterIter " <<  *tEventWriterIter << endl;
#endif
    (*tEventWriterIter)->WriteHbtEvent(currentHbtEvent);
  } 

  // loop over all the Analysis
  AliFemtoSimpleAnalysisIterator tAnalysisIter;
  for (tAnalysisIter=fAnalysisCollection->begin();tAnalysisIter!=fAnalysisCollection->end();tAnalysisIter++){
    (*tAnalysisIter)->ProcessEvent(currentHbtEvent);
  } 

  if (currentHbtEvent) delete currentHbtEvent;
#ifdef STHBRDEBUG
  cout << "AliFemtoManager::ProcessEvent() - return to caller ... " << endl;
#endif
  return 0;    // 0 = "good return"
}       // ProcessEvent
 AliFemtoManager.cxx:1
 AliFemtoManager.cxx:2
 AliFemtoManager.cxx:3
 AliFemtoManager.cxx:4
 AliFemtoManager.cxx:5
 AliFemtoManager.cxx:6
 AliFemtoManager.cxx:7
 AliFemtoManager.cxx:8
 AliFemtoManager.cxx:9
 AliFemtoManager.cxx:10
 AliFemtoManager.cxx:11
 AliFemtoManager.cxx:12
 AliFemtoManager.cxx:13
 AliFemtoManager.cxx:14
 AliFemtoManager.cxx:15
 AliFemtoManager.cxx:16
 AliFemtoManager.cxx:17
 AliFemtoManager.cxx:18
 AliFemtoManager.cxx:19
 AliFemtoManager.cxx:20
 AliFemtoManager.cxx:21
 AliFemtoManager.cxx:22
 AliFemtoManager.cxx:23
 AliFemtoManager.cxx:24
 AliFemtoManager.cxx:25
 AliFemtoManager.cxx:26
 AliFemtoManager.cxx:27
 AliFemtoManager.cxx:28
 AliFemtoManager.cxx:29
 AliFemtoManager.cxx:30
 AliFemtoManager.cxx:31
 AliFemtoManager.cxx:32
 AliFemtoManager.cxx:33
 AliFemtoManager.cxx:34
 AliFemtoManager.cxx:35
 AliFemtoManager.cxx:36
 AliFemtoManager.cxx:37
 AliFemtoManager.cxx:38
 AliFemtoManager.cxx:39
 AliFemtoManager.cxx:40
 AliFemtoManager.cxx:41
 AliFemtoManager.cxx:42
 AliFemtoManager.cxx:43
 AliFemtoManager.cxx:44
 AliFemtoManager.cxx:45
 AliFemtoManager.cxx:46
 AliFemtoManager.cxx:47
 AliFemtoManager.cxx:48
 AliFemtoManager.cxx:49
 AliFemtoManager.cxx:50
 AliFemtoManager.cxx:51
 AliFemtoManager.cxx:52
 AliFemtoManager.cxx:53
 AliFemtoManager.cxx:54
 AliFemtoManager.cxx:55
 AliFemtoManager.cxx:56
 AliFemtoManager.cxx:57
 AliFemtoManager.cxx:58
 AliFemtoManager.cxx:59
 AliFemtoManager.cxx:60
 AliFemtoManager.cxx:61
 AliFemtoManager.cxx:62
 AliFemtoManager.cxx:63
 AliFemtoManager.cxx:64
 AliFemtoManager.cxx:65
 AliFemtoManager.cxx:66
 AliFemtoManager.cxx:67
 AliFemtoManager.cxx:68
 AliFemtoManager.cxx:69
 AliFemtoManager.cxx:70
 AliFemtoManager.cxx:71
 AliFemtoManager.cxx:72
 AliFemtoManager.cxx:73
 AliFemtoManager.cxx:74
 AliFemtoManager.cxx:75
 AliFemtoManager.cxx:76
 AliFemtoManager.cxx:77
 AliFemtoManager.cxx:78
 AliFemtoManager.cxx:79
 AliFemtoManager.cxx:80
 AliFemtoManager.cxx:81
 AliFemtoManager.cxx:82
 AliFemtoManager.cxx:83
 AliFemtoManager.cxx:84
 AliFemtoManager.cxx:85
 AliFemtoManager.cxx:86
 AliFemtoManager.cxx:87
 AliFemtoManager.cxx:88
 AliFemtoManager.cxx:89
 AliFemtoManager.cxx:90
 AliFemtoManager.cxx:91
 AliFemtoManager.cxx:92
 AliFemtoManager.cxx:93
 AliFemtoManager.cxx:94
 AliFemtoManager.cxx:95
 AliFemtoManager.cxx:96
 AliFemtoManager.cxx:97
 AliFemtoManager.cxx:98
 AliFemtoManager.cxx:99
 AliFemtoManager.cxx:100
 AliFemtoManager.cxx:101
 AliFemtoManager.cxx:102
 AliFemtoManager.cxx:103
 AliFemtoManager.cxx:104
 AliFemtoManager.cxx:105
 AliFemtoManager.cxx:106
 AliFemtoManager.cxx:107
 AliFemtoManager.cxx:108
 AliFemtoManager.cxx:109
 AliFemtoManager.cxx:110
 AliFemtoManager.cxx:111
 AliFemtoManager.cxx:112
 AliFemtoManager.cxx:113
 AliFemtoManager.cxx:114
 AliFemtoManager.cxx:115
 AliFemtoManager.cxx:116
 AliFemtoManager.cxx:117
 AliFemtoManager.cxx:118
 AliFemtoManager.cxx:119
 AliFemtoManager.cxx:120
 AliFemtoManager.cxx:121
 AliFemtoManager.cxx:122
 AliFemtoManager.cxx:123
 AliFemtoManager.cxx:124
 AliFemtoManager.cxx:125
 AliFemtoManager.cxx:126
 AliFemtoManager.cxx:127
 AliFemtoManager.cxx:128
 AliFemtoManager.cxx:129
 AliFemtoManager.cxx:130
 AliFemtoManager.cxx:131
 AliFemtoManager.cxx:132
 AliFemtoManager.cxx:133
 AliFemtoManager.cxx:134
 AliFemtoManager.cxx:135
 AliFemtoManager.cxx:136
 AliFemtoManager.cxx:137
 AliFemtoManager.cxx:138
 AliFemtoManager.cxx:139
 AliFemtoManager.cxx:140
 AliFemtoManager.cxx:141
 AliFemtoManager.cxx:142
 AliFemtoManager.cxx:143
 AliFemtoManager.cxx:144
 AliFemtoManager.cxx:145
 AliFemtoManager.cxx:146
 AliFemtoManager.cxx:147
 AliFemtoManager.cxx:148
 AliFemtoManager.cxx:149
 AliFemtoManager.cxx:150
 AliFemtoManager.cxx:151
 AliFemtoManager.cxx:152
 AliFemtoManager.cxx:153
 AliFemtoManager.cxx:154
 AliFemtoManager.cxx:155
 AliFemtoManager.cxx:156
 AliFemtoManager.cxx:157
 AliFemtoManager.cxx:158
 AliFemtoManager.cxx:159
 AliFemtoManager.cxx:160
 AliFemtoManager.cxx:161
 AliFemtoManager.cxx:162
 AliFemtoManager.cxx:163
 AliFemtoManager.cxx:164
 AliFemtoManager.cxx:165
 AliFemtoManager.cxx:166
 AliFemtoManager.cxx:167
 AliFemtoManager.cxx:168
 AliFemtoManager.cxx:169
 AliFemtoManager.cxx:170
 AliFemtoManager.cxx:171
 AliFemtoManager.cxx:172
 AliFemtoManager.cxx:173
 AliFemtoManager.cxx:174
 AliFemtoManager.cxx:175
 AliFemtoManager.cxx:176
 AliFemtoManager.cxx:177
 AliFemtoManager.cxx:178
 AliFemtoManager.cxx:179
 AliFemtoManager.cxx:180
 AliFemtoManager.cxx:181
 AliFemtoManager.cxx:182
 AliFemtoManager.cxx:183
 AliFemtoManager.cxx:184
 AliFemtoManager.cxx:185
 AliFemtoManager.cxx:186
 AliFemtoManager.cxx:187
 AliFemtoManager.cxx:188
 AliFemtoManager.cxx:189
 AliFemtoManager.cxx:190
 AliFemtoManager.cxx:191
 AliFemtoManager.cxx:192
 AliFemtoManager.cxx:193
 AliFemtoManager.cxx:194
 AliFemtoManager.cxx:195
 AliFemtoManager.cxx:196
 AliFemtoManager.cxx:197
 AliFemtoManager.cxx:198
 AliFemtoManager.cxx:199
 AliFemtoManager.cxx:200
 AliFemtoManager.cxx:201
 AliFemtoManager.cxx:202
 AliFemtoManager.cxx:203
 AliFemtoManager.cxx:204
 AliFemtoManager.cxx:205
 AliFemtoManager.cxx:206
 AliFemtoManager.cxx:207
 AliFemtoManager.cxx:208
 AliFemtoManager.cxx:209
 AliFemtoManager.cxx:210
 AliFemtoManager.cxx:211
 AliFemtoManager.cxx:212
 AliFemtoManager.cxx:213
 AliFemtoManager.cxx:214
 AliFemtoManager.cxx:215
 AliFemtoManager.cxx:216
 AliFemtoManager.cxx:217
 AliFemtoManager.cxx:218
 AliFemtoManager.cxx:219
 AliFemtoManager.cxx:220
 AliFemtoManager.cxx:221
 AliFemtoManager.cxx:222
 AliFemtoManager.cxx:223
 AliFemtoManager.cxx:224
 AliFemtoManager.cxx:225
 AliFemtoManager.cxx:226
 AliFemtoManager.cxx:227
 AliFemtoManager.cxx:228
 AliFemtoManager.cxx:229
 AliFemtoManager.cxx:230
 AliFemtoManager.cxx:231
 AliFemtoManager.cxx:232
 AliFemtoManager.cxx:233
 AliFemtoManager.cxx:234
 AliFemtoManager.cxx:235
 AliFemtoManager.cxx:236
 AliFemtoManager.cxx:237
 AliFemtoManager.cxx:238
 AliFemtoManager.cxx:239
 AliFemtoManager.cxx:240
 AliFemtoManager.cxx:241
 AliFemtoManager.cxx:242
 AliFemtoManager.cxx:243
 AliFemtoManager.cxx:244
 AliFemtoManager.cxx:245
 AliFemtoManager.cxx:246
 AliFemtoManager.cxx:247
 AliFemtoManager.cxx:248
 AliFemtoManager.cxx:249
 AliFemtoManager.cxx:250
 AliFemtoManager.cxx:251
 AliFemtoManager.cxx:252
 AliFemtoManager.cxx:253
 AliFemtoManager.cxx:254
 AliFemtoManager.cxx:255