This commit was generated by cvs2svn to compensate for changes in r18145,
[u/mrichter/AliRoot.git] / PWG2 / FEMTOSCOPY / AliFemto / Analysis / AliFemtoAnalysis.cxx
1 /***************************************************************************
2  * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
3  ***************************************************************************
4  *
5  * Description: part of STAR HBT Framework: AliFemtoMaker package
6  *      This is the Class for Analysis objects.  Each of the simultaneous
7  *      Analyses running should have one of these instantiated.  They link
8  *      into the Manager in an Analysis Collection.
9  *
10  ***************************************************************************
11  *
12  *
13  * Revision 1.23  2002/11/20 00:09:26  renault
14  * fill a new monitor with (hbtEvent,partCollection)
15  *
16  * Revision 1.22  2002/11/03 16:40:31  magestro
17  * Modified ProcessEvent(), added MakePairs() method, and implemented immediate event mixing
18  *
19  * Revision 1.21  2002/06/26 17:27:09  lisa
20  * fixed small bug in AliFemtoAnalysis associated with the new feature to require ParticleCollections to have some minimum number of particles
21  *
22  * Revision 1.20  2002/06/22 17:53:31  lisa
23  * implemented switch to allow user to require minimum number of particles in First and Second ParticleCollections - default value is zero so if user does not Set this value then behaviour is like before
24  *
25  * Revision 1.19  2001/11/06 20:20:53  laue
26  * Order of event-mixing fixed.
27  *
28  * Revision 1.18  2001/05/25 23:23:59  lisa
29  * Added in AliFemtoKink stuff
30  *
31  * Revision 1.17  2001/04/05 21:57:45  laue
32  * current pico-event becomes a member of the analysis (fPicoEvent) and gets
33  * an access-function (CurrentPicoEvent)
34  *
35  * Revision 1.15  2000/09/13 18:09:09  laue
36  * Bux fix: Delete track cut only once for identical particle hbt
37  *
38  * Revision 1.14  2000/08/31 22:31:30  laue
39  * AliFemtoAnalysis: output changed (a little bit less)
40  * AliFemtoEvent: new version, members for reference mult added
41  * AliFemtoIOBinary: new IO for new AliFemtoEvent version
42  * AliFemtoTypes: TTree typedef to AliFemtoTTree added
43  * AliFemtoVertexAnalysis: overflow and underflow added
44  *
45  * Revision 1.13  2000/08/11 16:35:40  rcwells
46  * Added number of events processed to each HBT analysis
47  *
48  * Revision 1.12  2000/07/16 22:23:17  laue
49  * I forgot that we moved memberfunctions out of AliFemtoBaseAnalysis.
50  * So my previous check-ins didn't compile with the library.
51  * Now they do.
52  *
53  * Revision 1.11  2000/07/16 21:38:22  laue
54  * AliFemtoCoulomb.cxx AliFemtoSectoredAnalysis.cxx : updated for standalone version
55  * AliFemtoV0.cc AliFemtoV0.h : some cast to prevent compiling warnings
56  * AliFemtoParticle.cc AliFemtoParticle.h : pointers mTrack,mV0 initialized to 0
57  * AliFemtoIOBinary.cc : some printouts in #ifdef STHBTDEBUG
58  * AliFemtoEvent.cc : B-Field set to 0.25Tesla, we have to think about a better
59  *                 solution
60  *
61  * Revision 1.10  2000/07/06 18:45:51  laue
62  * Copy constructor fixed. It couldn't handle identicle particles.
63  *
64  * Revision 1.9  2000/04/13 20:20:22  laue
65  * Event mixing corrected. Now the first collection of the current event is
66  * mixed with the second collection from the mixing buffer _AND_ vice verse
67  *
68  * Revision 1.8  2000/03/23 23:00:01  laue
69  * AliFemtoAnalysis copy constructor now uses Clone() function of cuts
70  * AliFemtoTypes now has AliFemtoTF1 for fitting purposes
71  *
72  * Revision 1.7  2000/03/17 17:23:05  laue
73  * Roberts new three particle correlations implemented.
74  *
75  * Revision 1.6  2000/03/16 02:07:04  laue
76  * Copy constructor added to AliFemtoAnalysis (only known cuts, corrfctn).
77  *
78  * AliFemtoBinaryReader can now derive filename from StIOMaker and read a list
79  * of files.
80  *
81  * AliFemtoManager now holds a collection of AliFemtoEventWriters (multiple writes
82  * possible now)
83  *
84  * Revision 1.5  2000/02/13 17:17:12  laue
85  * Calls to the EventBegin() and EventEnd() functions implemented
86  * The actual analysis is moved from AliFemtoManager to AliFemtoAnalysis
87  *
88  * Revision 1.4  2000/01/25 17:35:16  laue
89  * I. In order to run the stand alone version of the AliFemtoMaker the following
90  * changes have been done:
91  * a) all ClassDefs and ClassImps have been put into #ifdef __ROOT__ statements
92  * b) unnecessary includes of StMaker.h have been removed
93  * c) the subdirectory AliFemtoMaker/doc/Make has been created including everything
94  * needed for the stand alone version
95  *
96  * II. To reduce the amount of compiler warning
97  * a) some variables have been type casted
98  * b) some destructors have been declared as virtual
99  *
100  * Revision 1.3  1999/10/04 15:38:53  lisa
101  * include Franks new accessor methods AliFemtoAnalysis::CorrFctn and AliFemtoManager::Analysis as well as McEvent example macro
102  *
103  * Revision 1.2  1999/07/06 22:33:22  lisa
104  * Adjusted all to work in pro and new - dev itself is broken
105  *
106  * Revision 1.1.1.1  1999/06/29 16:02:57  lisa
107  * Installation of AliFemtoMaker
108  *
109  **************************************************************************/
110
111 #include "Analysis/AliFemtoAnalysis.h"
112 #include "Base/AliFemtoTrackCut.h"
113 #include "Base/AliFemtoV0Cut.h"
114 #include "Base/AliFemtoKinkCut.h"
115 #include <string>
116
117
118 #ifdef __ROOT__ 
119 ClassImp(AliFemtoAnalysis)
120 #endif
121
122 AliFemtoEventCut*    copyTheCut(AliFemtoEventCut*);
123 AliFemtoParticleCut* copyTheCut(AliFemtoParticleCut*);
124 AliFemtoPairCut*     copyTheCut(AliFemtoPairCut*);
125 AliFemtoCorrFctn*    copyTheCorrFctn(AliFemtoCorrFctn*);
126
127 // this little function used to apply ParticleCuts (TrackCuts or V0Cuts) and fill ParticleCollections of picoEvent
128 //  it is called from AliFemtoAnalysis::ProcessEvent()
129 void FillHbtParticleCollection(AliFemtoParticleCut*         partCut,
130                                AliFemtoEvent*               hbtEvent,
131                                AliFemtoParticleCollection*  partCollection)
132 {
133   switch (partCut->Type()) {
134   case hbtTrack:       // cut is cutting on Tracks
135     {
136       AliFemtoTrackCut* pCut = (AliFemtoTrackCut*) partCut;
137       AliFemtoTrack* pParticle;
138       AliFemtoTrackIterator pIter;
139       AliFemtoTrackIterator startLoop = hbtEvent->TrackCollection()->begin();
140       AliFemtoTrackIterator endLoop   = hbtEvent->TrackCollection()->end();
141       for (pIter=startLoop;pIter!=endLoop;pIter++){
142         pParticle = *pIter;
143         bool tmpPassParticle = pCut->Pass(pParticle);
144         pCut->FillCutMonitor(pParticle, tmpPassParticle);
145         if (tmpPassParticle){   
146           AliFemtoParticle* particle = new AliFemtoParticle(pParticle,pCut->Mass());
147           partCollection->push_back(particle);
148         }
149       }
150       break;
151     }
152   case hbtV0:          // cut is cutting on V0s
153     {
154       AliFemtoV0Cut* pCut = (AliFemtoV0Cut*) partCut;
155       AliFemtoV0* pParticle;
156       AliFemtoV0Iterator pIter;
157       AliFemtoV0Iterator startLoop = hbtEvent->V0Collection()->begin();
158       AliFemtoV0Iterator endLoop   = hbtEvent->V0Collection()->end();
159       // this following "for" loop is identical to the one above, but because of scoping, I can's see how to avoid repitition...
160       for (pIter=startLoop;pIter!=endLoop;pIter++){
161         pParticle = *pIter; 
162         bool tmpPassV0 = pCut->Pass(pParticle);
163         pCut->FillCutMonitor(pParticle,tmpPassV0);
164         if (tmpPassV0){
165           AliFemtoParticle* particle = new AliFemtoParticle(pParticle,partCut->Mass());
166           partCollection->push_back(particle);
167         }
168       }
169       pCut->FillCutMonitor(hbtEvent,partCollection);// Gael 19/06/02
170       break;
171     }
172   case hbtKink:          // cut is cutting on Kinks  -- mal 25May2001
173     {
174       AliFemtoKinkCut* pCut = (AliFemtoKinkCut*) partCut;
175       AliFemtoKink* pParticle;
176       AliFemtoKinkIterator pIter;
177       AliFemtoKinkIterator startLoop = hbtEvent->KinkCollection()->begin();
178       AliFemtoKinkIterator endLoop   = hbtEvent->KinkCollection()->end();
179       // this following "for" loop is identical to the one above, but because of scoping, I can's see how to avoid repitition...
180       for (pIter=startLoop;pIter!=endLoop;pIter++){
181         pParticle = *pIter; 
182         bool tmpPass = pCut->Pass(pParticle);
183         pCut->FillCutMonitor(pParticle,tmpPass);
184         if (tmpPass){
185           AliFemtoParticle* particle = new AliFemtoParticle(pParticle,partCut->Mass());
186           partCollection->push_back(particle);
187         }
188       }
189       break;
190     }
191   default:
192     cout << "FillHbtParticleCollection function (in AliFemtoAnalysis.cxx) - undefined Particle Cut type!!! \n";
193   }
194 }
195 //____________________________
196 AliFemtoAnalysis::AliFemtoAnalysis(){
197   //  mControlSwitch     = 0;
198   fEventCut          = 0;
199   fFirstParticleCut  = 0;
200   fSecondParticleCut = 0;
201   fPairCut           = 0;
202   fCorrFctnCollection= 0;
203   fCorrFctnCollection = new AliFemtoCorrFctnCollection;
204   fMixingBuffer = new AliFemtoPicoEventCollection;
205   fNeventsProcessed = 0;
206   fPicoEvent=0;
207
208   fPicoEventCollectionVectorHideAway = 0;
209
210   fMinSizePartCollection=0;  // minimum # particles in ParticleCollection
211
212 }
213 //____________________________
214
215 AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) : AliFemtoBaseAnalysis() {
216   //AliFemtoAnalysis();
217   fEventCut          = 0;
218   fFirstParticleCut  = 0;
219   fSecondParticleCut = 0;
220   fPairCut           = 0;
221   fCorrFctnCollection= 0;
222   fCorrFctnCollection = new AliFemtoCorrFctnCollection;
223   fMixingBuffer = new AliFemtoPicoEventCollection;
224   fNeventsProcessed = 0;
225   fPicoEvent=0;
226
227   // find the right event cut
228   fEventCut = a.fEventCut->Clone();
229   // find the right first particle cut
230   fFirstParticleCut = a.fFirstParticleCut->Clone();
231   // find the right second particle cut
232   if (a.fFirstParticleCut==a.fSecondParticleCut) 
233     SetSecondParticleCut(fFirstParticleCut); // identical particle hbt
234   else
235   fSecondParticleCut = a.fSecondParticleCut->Clone();
236
237   fPairCut = a.fPairCut->Clone();
238   
239   if ( fEventCut ) {
240       SetEventCut(fEventCut); // this will set the myAnalysis pointer inside the cut
241       cout << " AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) - event cut set " << endl;
242   }
243   if ( fFirstParticleCut ) {
244       SetFirstParticleCut(fFirstParticleCut); // this will set the myAnalysis pointer inside the cut
245       cout << " AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) - first particle cut set " << endl;
246   }
247   if ( fSecondParticleCut ) {
248       SetSecondParticleCut(fSecondParticleCut); // this will set the myAnalysis pointer inside the cut
249       cout << " AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) - second particle cut set " << endl;
250   }  if ( fPairCut ) {
251       SetPairCut(fPairCut); // this will set the myAnalysis pointer inside the cut
252       cout << " AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) - pair cut set " << endl;
253   }
254
255   AliFemtoCorrFctnIterator iter;
256   for (iter=a.fCorrFctnCollection->begin(); iter!=a.fCorrFctnCollection->end();iter++){
257     cout << " AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) - looking for correlation functions " << endl;
258     AliFemtoCorrFctn* fctn = (*iter)->Clone();
259     if (fctn) AddCorrFctn(fctn);
260     else cout << " AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) - correlation function not found " << endl;
261   }
262
263   fNumEventsToMix = a.fNumEventsToMix;
264
265   fMinSizePartCollection = a.fMinSizePartCollection;  // minimum # particles in ParticleCollection
266
267   cout << " AliFemtoAnalysis::AliFemtoAnalysis(const AliFemtoAnalysis& a) - analysis copied " << endl;
268
269 }
270 //____________________________
271 AliFemtoAnalysis::~AliFemtoAnalysis(){
272   cout << " AliFemtoAnalysis::~AliFemtoAnalysis()" << endl;
273   if (fEventCut) delete fEventCut; fEventCut=0;
274   if (fFirstParticleCut == fSecondParticleCut) fSecondParticleCut=0;
275   if (fFirstParticleCut)  delete fFirstParticleCut; fFirstParticleCut=0;
276   if (fSecondParticleCut) delete fSecondParticleCut; fSecondParticleCut=0;
277   if (fPairCut) delete fPairCut; fPairCut=0;
278   // now delete every CorrFunction in the Collection, and then the Collection itself
279   AliFemtoCorrFctnIterator iter;
280   for (iter=fCorrFctnCollection->begin(); iter!=fCorrFctnCollection->end();iter++){
281     delete *iter;
282   }
283   delete fCorrFctnCollection;
284   // now delete every PicoEvent in the EventMixingBuffer and then the Buffer itself
285   if (fMixingBuffer) {
286     AliFemtoPicoEventIterator piter;
287     for (piter=fMixingBuffer->begin();piter!=fMixingBuffer->end();piter++){
288       delete *piter;
289     }
290     delete fMixingBuffer;
291   }
292 }
293 //______________________
294 AliFemtoCorrFctn* AliFemtoAnalysis::CorrFctn(int n){  // return pointer to n-th correlation function
295   if ( n<0 || n > (int)fCorrFctnCollection->size() )
296     return NULL;
297   AliFemtoCorrFctnIterator iter=fCorrFctnCollection->begin();
298   for (int i=0; i<n ;i++){
299     iter++;
300   }
301   return *iter;
302 }
303 //____________________________
304 AliFemtoString AliFemtoAnalysis::Report()
305 {
306   cout << "AliFemtoAnalysis - constructing Report..."<<endl;
307   string temp = "-----------\nHbt Analysis Report:\n";
308   temp += "\nEvent Cuts:\n";
309   temp += fEventCut->Report();
310   temp += "\nParticle Cuts - First Particle:\n";
311   temp += fFirstParticleCut->Report();
312   temp += "\nParticle Cuts - Second Particle:\n";
313   temp += fSecondParticleCut->Report();
314   temp += "\nPair Cuts:\n";
315   temp += fPairCut->Report();
316   temp += "\nCorrelation Functions:\n";
317   AliFemtoCorrFctnIterator iter;
318   if ( fCorrFctnCollection->size()==0 ) {
319     cout << "AliFemtoAnalysis-Warning : no correlations functions in this analysis " << endl;
320   }
321   for (iter=fCorrFctnCollection->begin(); iter!=fCorrFctnCollection->end();iter++){
322     temp += (*iter)->Report();
323     temp += "\n";
324   }
325   temp += "-------------\n";
326   AliFemtoString returnThis=temp;
327   return returnThis;
328 }
329 //_________________________
330 void AliFemtoAnalysis::ProcessEvent(const AliFemtoEvent* hbtEvent) {
331   // Add event to processed events
332   fPicoEvent=0; // we will get a new pico event, if not prevent corr. fctn to access old pico event
333   AddEventProcessed();
334   // startup for EbyE 
335   EventBegin(hbtEvent);  
336   // event cut and event cut monitor
337   bool tmpPassEvent = fEventCut->Pass(hbtEvent);
338   fEventCut->FillCutMonitor(hbtEvent, tmpPassEvent);
339   if (tmpPassEvent) {
340     cout << "AliFemtoAnalysis::ProcessEvent() - Event has passed cut - build picoEvent from " <<
341       hbtEvent->TrackCollection()->size() << " tracks in TrackCollection" << endl;
342     // OK, analysis likes the event-- build a pico event from it, using tracks the analysis likes...
343     fPicoEvent = new AliFemtoPicoEvent; // this is what we will make pairs from and put in Mixing Buffer
344     // no memory leak. we will delete picoevents when they come out of the mixing buffer
345     FillHbtParticleCollection(fFirstParticleCut,(AliFemtoEvent*)hbtEvent,fPicoEvent->FirstParticleCollection());
346     if ( !(AnalyzeIdenticalParticles()) )
347       FillHbtParticleCollection(fSecondParticleCut,(AliFemtoEvent*)hbtEvent,fPicoEvent->SecondParticleCollection());
348     cout <<"AliFemtoAnalysis::ProcessEvent - #particles in First, Second Collections: " <<
349       fPicoEvent->FirstParticleCollection()->size() << " " <<
350       fPicoEvent->SecondParticleCollection()->size() << endl;
351     
352     // mal - implement a switch which allows only using events with ParticleCollections containing a minimum
353     // number of entries (jun2002)
354     if ((fPicoEvent->FirstParticleCollection()->size() >= fMinSizePartCollection )
355         && ( AnalyzeIdenticalParticles() || (fPicoEvent->SecondParticleCollection()->size() >= fMinSizePartCollection ))) {
356
357
358 //------------------------------------------------------------------------------
359 //   Temporary comment:
360 //      This whole section rewritten so that all pairs are built using the
361 //      same code... easier to read and manage, and MakePairs() can be called by
362 //      derived classes.  Also, the requirement of a full mixing buffer before
363 //      mixing is removed.
364 //                          Dan Magestro, 11/2002
365
366       //------ Make real pairs. If identical, make pairs for one collection ------//
367
368       if (AnalyzeIdenticalParticles()) {
369         MakePairs("real", fPicoEvent->FirstParticleCollection() );
370       }
371       else {
372         MakePairs("real", fPicoEvent->FirstParticleCollection(),
373                           fPicoEvent->SecondParticleCollection() );
374       }
375       cout << "AliFemtoAnalysis::ProcessEvent() - reals done ";
376
377       //---- Make pairs for mixed events, looping over events in mixingBuffer ----//
378
379       AliFemtoPicoEvent* storedEvent;
380       AliFemtoPicoEventIterator fPicoEventIter;
381       for (fPicoEventIter=MixingBuffer()->begin();fPicoEventIter!=MixingBuffer()->end();fPicoEventIter++){
382         storedEvent = *fPicoEventIter;
383         if (AnalyzeIdenticalParticles()) {
384           MakePairs("mixed",fPicoEvent->FirstParticleCollection(),
385                             storedEvent->FirstParticleCollection() );
386         }
387         else {
388           MakePairs("mixed",fPicoEvent->FirstParticleCollection(),
389                             storedEvent->SecondParticleCollection() );
390
391           MakePairs("mixed",storedEvent->FirstParticleCollection(),
392                             fPicoEvent->SecondParticleCollection() );
393         }
394       }
395       cout << " - mixed done   " << endl;
396
397       //--------- If mixing buffer is full, delete oldest event ---------//
398
399       if ( MixingBufferFull() ) {
400         delete MixingBuffer()->back();
401         MixingBuffer()->pop_back();
402       }
403
404       //-------- Add current event (fPicoEvent) to mixing buffer --------//
405
406       MixingBuffer()->push_front(fPicoEvent);
407
408
409 // Temporary comment: End of rewritten section... Dan Magestro, 11/2002
410 //------------------------------------------------------------------------------
411
412
413     }  // if ParticleCollections are big enough (mal jun2002)
414     else{
415       delete fPicoEvent;
416     }
417   }   // if currentEvent is accepted by currentAnalysis
418   EventEnd(hbtEvent);  // cleanup for EbyE 
419   //cout << "AliFemtoAnalysis::ProcessEvent() - return to caller ... " << endl;
420 }
421 //_________________________
422 void AliFemtoAnalysis::MakePairs(const char* typeIn, AliFemtoParticleCollection *partCollection1,
423                                             AliFemtoParticleCollection *partCollection2){
424 // Build pairs, check pair cuts, and call CFs' AddRealPair() or
425 // AddMixedPair() methods. If no second particle collection is
426 // specfied, make pairs within first particle collection.
427
428   string type = typeIn;
429
430   AliFemtoPair* ThePair = new AliFemtoPair;
431
432   AliFemtoCorrFctnIterator CorrFctnIter;
433
434   AliFemtoParticleIterator PartIter1, PartIter2;
435
436   AliFemtoParticleIterator StartOuterLoop = partCollection1->begin();  // always
437   AliFemtoParticleIterator EndOuterLoop   = partCollection1->end();    // will be one less if identical
438   AliFemtoParticleIterator StartInnerLoop;
439   AliFemtoParticleIterator EndInnerLoop;
440   if (partCollection2) {                        // Two collections:
441     StartInnerLoop = partCollection2->begin();  //   Full inner & outer loops
442     EndInnerLoop   = partCollection2->end();    //
443   }
444   else {                                        // One collection:
445     EndOuterLoop--;                             //   Outer loop goes to next-to-last particle
446     EndInnerLoop = partCollection1->end() ;     //   Inner loop goes to last particle
447   }
448   for (PartIter1=StartOuterLoop;PartIter1!=EndOuterLoop;PartIter1++) {
449     if (!partCollection2){
450       StartInnerLoop = PartIter1;
451       StartInnerLoop++;
452     }
453     ThePair->SetTrack1(*PartIter1);
454     for (PartIter2 = StartInnerLoop; PartIter2!=EndInnerLoop;PartIter2++) {
455       ThePair->SetTrack2(*PartIter2);
456
457       // The following lines have to be uncommented if you want pairCutMonitors
458       // they are not in for speed reasons
459       // bool tmpPassPair = fPairCut->Pass(ThePair);
460       // fPairCut->FillCutMonitor(ThePair, tmpPassPair);
461       // if ( tmpPassPair )
462
463       //---- If pair passes cut, loop over CF's and add pair to real/mixed ----//
464
465       if (fPairCut->Pass(ThePair)){
466         for (CorrFctnIter=fCorrFctnCollection->begin();
467              CorrFctnIter!=fCorrFctnCollection->end();CorrFctnIter++){
468           AliFemtoCorrFctn* CorrFctn = *CorrFctnIter;
469           if(type == "real")
470             CorrFctn->AddRealPair(ThePair);
471           else if(type == "mixed")
472             CorrFctn->AddMixedPair(ThePair);
473           else
474             cout << "Problem with pair type, type = " << type.c_str() << endl;
475         }
476       }
477
478     }    // loop over second particle
479
480   }      // loop over first particle
481
482   delete ThePair;
483
484 }
485 //_________________________
486 void AliFemtoAnalysis::EventBegin(const AliFemtoEvent* ev){
487   //cout << " AliFemtoAnalysis::EventBegin(const AliFemtoEvent* ev) " << endl;
488   fFirstParticleCut->EventBegin(ev);
489   fSecondParticleCut->EventBegin(ev);
490   fPairCut->EventBegin(ev);
491   for (AliFemtoCorrFctnIterator iter=fCorrFctnCollection->begin(); iter!=fCorrFctnCollection->end();iter++){
492     (*iter)->EventBegin(ev);
493   }
494 }
495 //_________________________
496 void AliFemtoAnalysis::EventEnd(const AliFemtoEvent* ev){
497   fFirstParticleCut->EventEnd(ev);
498   fSecondParticleCut->EventEnd(ev);
499   fPairCut->EventEnd(ev);
500   for (AliFemtoCorrFctnIterator iter=fCorrFctnCollection->begin(); iter!=fCorrFctnCollection->end();iter++){
501     (*iter)->EventEnd(ev);
502   }
503 }
504 //_________________________
505 void AliFemtoAnalysis::Finish(){
506   AliFemtoCorrFctnIterator iter;
507   for (iter=fCorrFctnCollection->begin(); iter!=fCorrFctnCollection->end();iter++){
508     (*iter)->Finish();
509   }
510 }
511 //_________________________
512 void AliFemtoAnalysis::AddEventProcessed() {
513   fNeventsProcessed++;
514 }