]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGCF/FEMTOSCOPY/AliFemto/AliFemtoManager.cxx
Merge branch 'master_patch'
[u/mrichter/AliRoot.git] / PWGCF / FEMTOSCOPY / AliFemto / AliFemtoManager.cxx
1 ///////////////////////////////////////////////////////////////////////////
2 //                                                                       //
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                //
7 //                                                                       //
8 ///////////////////////////////////////////////////////////////////////////
9
10 #include "AliFemtoManager.h"
11 //#include "AliFemtoParticleCollection.h"
12 //#include "AliFemtoTrackCut.h"
13 //#include "AliFemtoV0Cut.h"
14 #include <cstdio>
15
16 #ifdef __ROOT__
17 ClassImp(AliFemtoManager)
18 #endif
19
20
21
22 //____________________________
23 AliFemtoManager::AliFemtoManager():
24   fAnalysisCollection(0),
25   fEventReader(0),
26   fEventWriterCollection(0)
27 {
28   // default constructor
29   fAnalysisCollection = new AliFemtoAnalysisCollection;
30   fEventWriterCollection = new AliFemtoEventWriterCollection;
31   fEventReader = 0;
32 }
33 //____________________________
34 AliFemtoManager::AliFemtoManager(const AliFemtoManager& aManager) :
35   fAnalysisCollection(0),
36   fEventReader(0),
37   fEventWriterCollection(0)
38 {
39   // copy constructor
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);
45   }
46   AliFemtoEventWriterIterator tEventWriterIter;
47   fEventWriterCollection = new AliFemtoEventWriterCollection;
48   for (tEventWriterIter=aManager.fEventWriterCollection->begin();tEventWriterIter!=aManager.fEventWriterCollection->end();tEventWriterIter++){
49     fEventWriterCollection->push_back(*tEventWriterIter);
50   }
51 }
52
53 //____________________________
54 AliFemtoManager::~AliFemtoManager(){
55   // destructor
56   delete fEventReader;
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;
61     *tAnalysisIter = 0;
62   }
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;
69   }
70   delete fEventWriterCollection;
71 }
72 //____________________________
73 AliFemtoManager& AliFemtoManager::operator=(const AliFemtoManager& aManager)
74 {
75   // assignment operator
76   if (this == &aManager)
77     return *this;
78
79   fEventReader = aManager.fEventReader;
80   AliFemtoSimpleAnalysisIterator tAnalysisIter;
81   if (fAnalysisCollection) {
82     for (tAnalysisIter=fAnalysisCollection->begin();tAnalysisIter!=fAnalysisCollection->end();tAnalysisIter++){
83       delete *tAnalysisIter;
84       *tAnalysisIter = 0;
85     }
86     delete fAnalysisCollection;
87   }
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;
94     }
95     delete fEventWriterCollection;
96   }
97
98   fAnalysisCollection = new AliFemtoAnalysisCollection;
99   for (tAnalysisIter=aManager.fAnalysisCollection->begin();tAnalysisIter!=aManager.fAnalysisCollection->end();tAnalysisIter++){
100     fAnalysisCollection->push_back(*tAnalysisIter);
101   }
102
103   fEventWriterCollection = new AliFemtoEventWriterCollection;
104   for (tEventWriterIter=aManager.fEventWriterCollection->begin();tEventWriterIter!=aManager.fEventWriterCollection->end();tEventWriterIter++){
105     fEventWriterCollection->push_back(*tEventWriterIter);
106   }
107   return *this;
108 }
109
110 //____________________________
111 int AliFemtoManager::Init(){
112   // Execute initialization procedures
113   AliFemtoString readerMessage;
114   readerMessage += "*** *** *** *** *** *** *** *** *** *** *** *** \n";
115   // EventReader
116   if (fEventReader) {
117     if (fEventReader->Init("r",readerMessage)){
118       cout << " AliFemtoManager::Init() - Reader initialization failed " << endl;
119       return (1);
120     }
121     readerMessage += fEventReader->Report();
122   }
123   // EventWriters
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;
135         return (1);
136       }
137     }
138   }
139   
140   
141   return (0);
142 }
143 //____________________________
144 void AliFemtoManager::Finish(){
145   // Initialize finish procedures
146   // EventReader
147   if (fEventReader) fEventReader->Finish();
148   // EventWriters
149   AliFemtoEventWriterIterator tEventWriterIter;
150   AliFemtoEventWriter* currentEventWriter;
151   for (tEventWriterIter=fEventWriterCollection->begin();tEventWriterIter!=fEventWriterCollection->end();tEventWriterIter++){
152     currentEventWriter = *tEventWriterIter;
153     currentEventWriter->Finish();
154   }
155   // Analyses
156   AliFemtoSimpleAnalysisIterator tAnalysisIter;
157   AliFemtoAnalysis* currentAnalysis;
158   for (tAnalysisIter=fAnalysisCollection->begin();tAnalysisIter!=fAnalysisCollection->end();tAnalysisIter++){
159     currentAnalysis = *tAnalysisIter;
160     currentAnalysis->Finish();
161   }
162 }
163 //____________________________
164 AliFemtoString AliFemtoManager::Report(){
165   // Construct a report from all the classes
166   string stemp;
167   char ctemp[100];
168   // EventReader
169   stemp = fEventReader->Report();
170   // EventWriters
171   snprintf(ctemp , 100, "\nAliFemtoManager Reporting %u EventWriters\n",(unsigned int) fEventWriterCollection->size());
172   stemp += ctemp;
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();
179   }
180   // Analyses
181   snprintf(ctemp , 100, "\nAliFemtoManager Reporting %u Analyses\n",(unsigned int) fAnalysisCollection->size());
182   stemp += ctemp;
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();
189   }
190
191   AliFemtoString returnThis = stemp;
192   return returnThis;
193 }
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() )
198     return NULL;
199   AliFemtoSimpleAnalysisIterator iter = fAnalysisCollection->begin();
200   for (int i=0; i<n ;i++){
201     iter++;
202   }
203   return *iter;
204 }
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() )
209     return NULL;
210   AliFemtoEventWriterIterator iter = fEventWriterCollection->begin();
211   for (int i=0; i<n ;i++){
212     iter++;
213   }
214   return *iter;
215 }
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){
229 #ifdef STHBRDEBUG
230     cout << "AliFemtoManager::ProcessEvent() - Reader::ReturnHbtEvent() has returned null pointer\n";
231 #endif
232     return fEventReader->Status();
233   }
234
235   // loop over all the EventWriters
236   AliFemtoEventWriterIterator tEventWriterIter;
237   for (tEventWriterIter=fEventWriterCollection->begin();tEventWriterIter!=fEventWriterCollection->end();tEventWriterIter++){
238 #ifdef STHBRDEBUG
239     cout << " *tEventWriterIter " <<  *tEventWriterIter << endl;
240 #endif
241     (*tEventWriterIter)->WriteHbtEvent(currentHbtEvent);
242   } 
243
244   // loop over all the Analysis
245   AliFemtoSimpleAnalysisIterator tAnalysisIter;
246   for (tAnalysisIter=fAnalysisCollection->begin();tAnalysisIter!=fAnalysisCollection->end();tAnalysisIter++){
247     (*tAnalysisIter)->ProcessEvent(currentHbtEvent);
248   } 
249
250   if (currentHbtEvent) delete currentHbtEvent;
251 #ifdef STHBRDEBUG
252   cout << "AliFemtoManager::ProcessEvent() - return to caller ... " << endl;
253 #endif
254   return 0;    // 0 = "good return"
255 }       // ProcessEvent