This commit was generated by cvs2svn to compensate for changes in r18145,
[u/mrichter/AliRoot.git] / PWG2 / FEMTOSCOPY / AliFemto / Analysis / AliFemtoAnalysis.cxx
CommitLineData
67427ff7 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__
119ClassImp(AliFemtoAnalysis)
120#endif
121
122AliFemtoEventCut* copyTheCut(AliFemtoEventCut*);
123AliFemtoParticleCut* copyTheCut(AliFemtoParticleCut*);
124AliFemtoPairCut* copyTheCut(AliFemtoPairCut*);
125AliFemtoCorrFctn* 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()
129void 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//____________________________
196AliFemtoAnalysis::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
215AliFemtoAnalysis::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//____________________________
271AliFemtoAnalysis::~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//______________________
294AliFemtoCorrFctn* 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//____________________________
304AliFemtoString 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//_________________________
330void 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//_________________________
422void 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//_________________________
486void 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//_________________________
496void 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//_________________________
505void AliFemtoAnalysis::Finish(){
506 AliFemtoCorrFctnIterator iter;
507 for (iter=fCorrFctnCollection->begin(); iter!=fCorrFctnCollection->end();iter++){
508 (*iter)->Finish();
509 }
510}
511//_________________________
512void AliFemtoAnalysis::AddEventProcessed() {
513 fNeventsProcessed++;
514}