1 ///////////////////////////////////////////////////////////////////////////
3 // AliFemtoManager: main class managing femtoscopic analysis //
4 // The Manager is the top-level object that coordinates activities //
5 // and performs event, particle, and pair loops, and checks the //
6 // various Cuts of the Analyses in its AnalysisCollection //
8 ///////////////////////////////////////////////////////////////////////////
10 #include "AliFemtoManager.h"
11 //#include "AliFemtoParticleCollection.h"
12 //#include "AliFemtoTrackCut.h"
13 //#include "AliFemtoV0Cut.h"
17 ClassImp(AliFemtoManager)
22 //____________________________
23 AliFemtoManager::AliFemtoManager():
24 fAnalysisCollection(0),
26 fEventWriterCollection(0)
28 // default constructor
29 fAnalysisCollection = new AliFemtoAnalysisCollection;
30 fEventWriterCollection = new AliFemtoEventWriterCollection;
33 //____________________________
34 AliFemtoManager::AliFemtoManager(const AliFemtoManager& aManager) :
35 fAnalysisCollection(0),
37 fEventWriterCollection(0)
40 fEventReader = aManager.fEventReader;
41 AliFemtoSimpleAnalysisIterator tAnalysisIter;
42 fAnalysisCollection = new AliFemtoAnalysisCollection;
43 for (tAnalysisIter=aManager.fAnalysisCollection->begin();tAnalysisIter!=aManager.fAnalysisCollection->end();tAnalysisIter++){
44 fAnalysisCollection->push_back(*tAnalysisIter);
46 AliFemtoEventWriterIterator tEventWriterIter;
47 fEventWriterCollection = new AliFemtoEventWriterCollection;
48 for (tEventWriterIter=aManager.fEventWriterCollection->begin();tEventWriterIter!=aManager.fEventWriterCollection->end();tEventWriterIter++){
49 fEventWriterCollection->push_back(*tEventWriterIter);
53 //____________________________
54 AliFemtoManager::~AliFemtoManager(){
57 // now delete each Analysis in the Collection, and then the Collection itself
58 AliFemtoSimpleAnalysisIterator tAnalysisIter;
59 for (tAnalysisIter=fAnalysisCollection->begin();tAnalysisIter!=fAnalysisCollection->end();tAnalysisIter++){
60 delete *tAnalysisIter;
63 delete fAnalysisCollection;
64 // now delete each EventWriter in the Collection, and then the Collection itself
65 AliFemtoEventWriterIterator tEventWriterIter;
66 for (tEventWriterIter=fEventWriterCollection->begin();tEventWriterIter!=fEventWriterCollection->end();tEventWriterIter++){
67 delete *tEventWriterIter;
68 *tEventWriterIter = 0;
70 delete fEventWriterCollection;
72 //____________________________
73 AliFemtoManager& AliFemtoManager::operator=(const AliFemtoManager& aManager)
75 // assignment operator
76 if (this == &aManager)
79 fEventReader = aManager.fEventReader;
80 AliFemtoSimpleAnalysisIterator tAnalysisIter;
81 if (fAnalysisCollection) {
82 for (tAnalysisIter=fAnalysisCollection->begin();tAnalysisIter!=fAnalysisCollection->end();tAnalysisIter++){
83 delete *tAnalysisIter;
86 delete fAnalysisCollection;
88 // now delete each EventWriter in the Collection, and then the Collection itself
89 AliFemtoEventWriterIterator tEventWriterIter;
90 if (fEventWriterCollection) {
91 for (tEventWriterIter=fEventWriterCollection->begin();tEventWriterIter!=fEventWriterCollection->end();tEventWriterIter++){
92 delete *tEventWriterIter;
93 *tEventWriterIter = 0;
95 delete fEventWriterCollection;
98 fAnalysisCollection = new AliFemtoAnalysisCollection;
99 for (tAnalysisIter=aManager.fAnalysisCollection->begin();tAnalysisIter!=aManager.fAnalysisCollection->end();tAnalysisIter++){
100 fAnalysisCollection->push_back(*tAnalysisIter);
103 fEventWriterCollection = new AliFemtoEventWriterCollection;
104 for (tEventWriterIter=aManager.fEventWriterCollection->begin();tEventWriterIter!=aManager.fEventWriterCollection->end();tEventWriterIter++){
105 fEventWriterCollection->push_back(*tEventWriterIter);
110 //____________________________
111 int AliFemtoManager::Init(){
112 // Execute initialization procedures
113 AliFemtoString readerMessage;
114 readerMessage += "*** *** *** *** *** *** *** *** *** *** *** *** \n";
117 if (fEventReader->Init("r",readerMessage)){
118 cout << " AliFemtoManager::Init() - Reader initialization failed " << endl;
121 readerMessage += fEventReader->Report();
124 AliFemtoEventWriterIterator tEventWriterIter;
125 for (tEventWriterIter=fEventWriterCollection->begin();tEventWriterIter!=fEventWriterCollection->end();tEventWriterIter++){
126 //cout << "*EventWriterIter " << *EventWriterIter << endl;
127 // The message (AliFemtoString) passed into Init will be at the file header.
128 // for that reason take the readerReport, add my own report and pass as message
129 AliFemtoString writerMessage = readerMessage;
130 writerMessage += "*** *** *** *** *** *** *** *** *** *** *** *** \n";
131 writerMessage += (*tEventWriterIter)->Report();
132 if (*tEventWriterIter) {
133 if ( (*tEventWriterIter)->Init("w",writerMessage)){ // yes, the message from the reader is passed into the writer
134 cout << " AliFemtoManager::Init() - Writer initialization failed " << endl;
143 //____________________________
144 void AliFemtoManager::Finish(){
145 // Initialize finish procedures
147 if (fEventReader) fEventReader->Finish();
149 AliFemtoEventWriterIterator tEventWriterIter;
150 AliFemtoEventWriter* currentEventWriter;
151 for (tEventWriterIter=fEventWriterCollection->begin();tEventWriterIter!=fEventWriterCollection->end();tEventWriterIter++){
152 currentEventWriter = *tEventWriterIter;
153 currentEventWriter->Finish();
156 AliFemtoSimpleAnalysisIterator tAnalysisIter;
157 AliFemtoAnalysis* currentAnalysis;
158 for (tAnalysisIter=fAnalysisCollection->begin();tAnalysisIter!=fAnalysisCollection->end();tAnalysisIter++){
159 currentAnalysis = *tAnalysisIter;
160 currentAnalysis->Finish();
163 //____________________________
164 AliFemtoString AliFemtoManager::Report(){
165 // Construct a report from all the classes
169 stemp = fEventReader->Report();
171 snprintf(ctemp , 100, "\nAliFemtoManager Reporting %u EventWriters\n",(unsigned int) fEventWriterCollection->size());
173 AliFemtoEventWriterIterator tEventWriterIter;
174 AliFemtoEventWriter* currentEventWriter;
175 for (tEventWriterIter=fEventWriterCollection->begin();tEventWriterIter!=fEventWriterCollection->end();tEventWriterIter++){
176 // cout << "AliFemtoManager - asking for EventWriter Report" << endl;
177 currentEventWriter = *tEventWriterIter;
178 stemp+=currentEventWriter->Report();
181 snprintf(ctemp , 100, "\nAliFemtoManager Reporting %u Analyses\n",(unsigned int) fAnalysisCollection->size());
183 AliFemtoSimpleAnalysisIterator tAnalysisIter;
184 AliFemtoAnalysis* currentAnalysis;
185 for (tAnalysisIter=fAnalysisCollection->begin();tAnalysisIter!=fAnalysisCollection->end();tAnalysisIter++){
186 // cout << "AliFemtoManager - asking for Analysis Report" << endl;
187 currentAnalysis = *tAnalysisIter;
188 stemp+=currentAnalysis->Report();
191 AliFemtoString returnThis = stemp;
194 //____________________________
195 AliFemtoAnalysis* AliFemtoManager::Analysis( int n ){ // return pointer to n-th analysis
196 // return analysis number n
197 if ( n<0 || n > (int) fAnalysisCollection->size() )
199 AliFemtoSimpleAnalysisIterator iter = fAnalysisCollection->begin();
200 for (int i=0; i<n ;i++){
205 //____________________________
206 AliFemtoEventWriter* AliFemtoManager::EventWriter( int n ){ // return pointer to n-th analysis
207 // return event writern number n
208 if ( n<0 || n > (int) fEventWriterCollection->size() )
210 AliFemtoEventWriterIterator iter = fEventWriterCollection->begin();
211 for (int i=0; i<n ;i++){
216 //____________________________
217 int AliFemtoManager::ProcessEvent(){
218 // process a single event by reading it and passing it to each
219 // analysis and event writer
220 // cout << "AliFemtoManager::ProcessEvent" << endl;
221 // NOTE - this ReturnHbtEvent makes a *new* AliFemtoEvent - delete it when done!
222 AliFemtoEvent* currentHbtEvent = fEventReader->ReturnHbtEvent();
223 // cout << "Event reader has returned control to manager" << endl;
224 // if no HbtEvent is returned, then we abort processing.
225 // the question is now: do we try again next time (i.e. there may be an HbtEvent next time)
226 // or are we at EOF or something? If Reader says Status=0, then that means try again later.
227 // so, we just return the Reader's Status.
228 if (!currentHbtEvent){
230 cout << "AliFemtoManager::ProcessEvent() - Reader::ReturnHbtEvent() has returned null pointer\n";
232 return fEventReader->Status();
235 // loop over all the EventWriters
236 AliFemtoEventWriterIterator tEventWriterIter;
237 for (tEventWriterIter=fEventWriterCollection->begin();tEventWriterIter!=fEventWriterCollection->end();tEventWriterIter++){
239 cout << " *tEventWriterIter " << *tEventWriterIter << endl;
241 (*tEventWriterIter)->WriteHbtEvent(currentHbtEvent);
244 // loop over all the Analysis
245 AliFemtoSimpleAnalysisIterator tAnalysisIter;
246 for (tAnalysisIter=fAnalysisCollection->begin();tAnalysisIter!=fAnalysisCollection->end();tAnalysisIter++){
247 (*tAnalysisIter)->ProcessEvent(currentHbtEvent);
250 if (currentHbtEvent) delete currentHbtEvent;
252 cout << "AliFemtoManager::ProcessEvent() - return to caller ... " << endl;
254 return 0; // 0 = "good return"