1 #include "AliHBTAnalysis.h"
3 #include "AliHBTEvent.h"
4 #include "AliHBTReader.h"
5 #include "AliHBTParticle.h"
6 #include "AliHBTParticleCut.h"
7 #include "AliHBTPair.h"
8 #include "AliHBTPairCut.h"
9 #include "AliHBTFunction.h"
10 #include "AliHBTMonitorFunction.h"
12 #include <TBenchmark.h>
15 //_________________________________________________________
16 ///////////////////////////////////////////////////////////
18 //Central Object Of HBTAnalyser:
19 //This class performs main looping within HBT Analysis
20 //User must plug a reader of Type AliHBTReader
21 //User plugs in coorelation and monitor functions
22 //as well as monitor functions
24 //HBT Analysis Tool, which is integral part of AliRoot,
25 //ALICE Off-Line framework:
27 //Piotr.Skowronski@cern.ch
28 //more info: http://alisoft.cern.ch/people/skowron/analyzer/index.html
30 //_________________________________________________________
32 ClassImp(AliHBTAnalysis)
34 const UInt_t AliHBTAnalysis::fgkFctnArraySize = 100;
35 const UInt_t AliHBTAnalysis::fgkDefaultMixingInfo = 1000;
36 const Int_t AliHBTAnalysis::fgkDefaultBufferSize = 5;
38 AliHBTAnalysis::AliHBTAnalysis():
41 fNParticleFunctions(0),
42 fNParticleAndTrackFunctions(0),
43 fNTrackMonitorFunctions(0),
44 fNParticleMonitorFunctions(0),
45 fNParticleAndTrackMonitorFunctions(0),
47 fDisplayMixingInfo(fgkDefaultMixingInfo),
51 fTrackFunctions = new AliHBTOnePairFctn* [fgkFctnArraySize];
52 fParticleFunctions = new AliHBTOnePairFctn* [fgkFctnArraySize];
53 fParticleAndTrackFunctions = new AliHBTTwoPairFctn* [fgkFctnArraySize];
55 fParticleMonitorFunctions = new AliHBTMonOneParticleFctn* [fgkFctnArraySize];
56 fTrackMonitorFunctions = new AliHBTMonOneParticleFctn* [fgkFctnArraySize];
57 fParticleAndTrackMonitorFunctions = new AliHBTMonTwoParticleFctn* [fgkFctnArraySize];
59 fPairCut = new AliHBTEmptyPairCut();//empty cut - accepts all particles
61 /*************************************************************************************/
63 AliHBTAnalysis::AliHBTAnalysis(const AliHBTAnalysis& in):
66 fNParticleFunctions(0),
67 fNParticleAndTrackFunctions(0),
68 fNTrackMonitorFunctions(0),
69 fNParticleMonitorFunctions(0),
70 fNParticleAndTrackMonitorFunctions(0),
72 fParticleFunctions(0x0),
73 fParticleAndTrackFunctions(0x0),
74 fParticleMonitorFunctions(0x0),
75 fTrackMonitorFunctions(0x0),
76 fParticleAndTrackMonitorFunctions(0x0),
78 fBufferSize(fgkDefaultBufferSize),
79 fDisplayMixingInfo(fgkDefaultMixingInfo),
83 Fatal("AliHBTAnalysis(const AliHBTAnalysis&)","Sensless");
85 /*************************************************************************************/
86 const AliHBTAnalysis& AliHBTAnalysis::operator=(const AliHBTAnalysis& right)
89 Fatal("AliHBTAnalysis(const AliHBTAnalysis&)","Sensless");
92 /*************************************************************************************/
93 AliHBTAnalysis::~AliHBTAnalysis()
96 //note that we do not delete functions itself
97 // they should be deleted by whom where created
98 //we only store pointers, and we use "new" only for pointers array
101 delete [] fTrackFunctions;
102 delete [] fParticleFunctions;
103 delete [] fParticleAndTrackFunctions;
105 delete [] fParticleMonitorFunctions;
106 delete [] fTrackMonitorFunctions;
107 delete [] fParticleAndTrackMonitorFunctions;
109 delete fPairCut; // always have an copy of an object - we create we dstroy
112 /*************************************************************************************/
114 void AliHBTAnalysis::DeleteFunctions()
116 //Deletes all functions added to analysis
118 for(ii = 0;ii<fNParticleFunctions;ii++)
119 delete fParticleFunctions[ii];
120 fNParticleFunctions = 0;
122 for(ii = 0;ii<fNTrackFunctions;ii++)
123 delete fTrackFunctions[ii];
124 fNTrackFunctions = 0;
126 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
127 delete fParticleAndTrackFunctions[ii];
128 fNParticleAndTrackFunctions = 0;
130 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
131 delete fParticleMonitorFunctions[ii];
132 fNParticleMonitorFunctions = 0;
134 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
135 delete fTrackMonitorFunctions[ii];
136 fNTrackMonitorFunctions = 0;
138 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
139 delete fParticleAndTrackMonitorFunctions[ii];
140 fNParticleAndTrackMonitorFunctions = 0;
142 /*************************************************************************************/
144 void AliHBTAnalysis::Init()
146 //Initializeation method
147 //calls Init for all functions
149 for(ii = 0;ii<fNParticleFunctions;ii++)
150 fParticleFunctions[ii]->Init();
152 for(ii = 0;ii<fNTrackFunctions;ii++)
153 fTrackFunctions[ii]->Init();
155 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
156 fParticleAndTrackFunctions[ii]->Init();
158 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
159 fParticleMonitorFunctions[ii]->Init();
161 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
162 fTrackMonitorFunctions[ii]->Init();
164 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
165 fParticleAndTrackMonitorFunctions[ii]->Init();
167 /*************************************************************************************/
169 void AliHBTAnalysis::ResetFunctions()
171 //In case fOwner is true, deletes all functions
172 //in other case, just set number of analysis to 0
173 if (fIsOwner) DeleteFunctions();
176 fNParticleFunctions = 0;
177 fNTrackFunctions = 0;
178 fNParticleAndTrackFunctions = 0;
179 fNParticleMonitorFunctions = 0;
180 fNTrackMonitorFunctions = 0;
181 fNParticleAndTrackMonitorFunctions = 0;
184 /*************************************************************************************/
186 void AliHBTAnalysis::Process(Option_t* option)
188 //default option = "TracksAndParticles"
189 //Main method of the HBT Analysis Package
190 //It triggers reading with the global cut (default is an empty cut)
191 //Than it checks options and data which are read
192 //if everything is OK, then it calls one of the looping methods
193 //depending on tfReaderhe option
194 //These methods differs on what thay are looping on
197 //--------------------------------------------------------------------
198 //ProcessTracksAndParticles - "TracksAndParticles"
200 // it loops over both, tracks(reconstructed) and particles(simulated)
201 // all function gethered in all 3 lists are called for each (double)pair
203 //ProcessTracks - "Tracks"
204 // it loops only on tracks(reconstructed),
205 // functions ONLY from fTrackFunctions list are called
207 //ProcessParticles - "Particles"
208 // it loops only on particles(simulated),
209 // functions ONLY from fParticleAndTrackFunctions list are called
214 Error("Process","The reader is not set");
218 const char *oT = strstr(option,"Tracks");
219 const char *oP = strstr(option,"Particles");
221 Bool_t nonid = IsNonIdentAnalysis();
225 if (fReader->GetNumberOfPartEvents() <1)
227 Error("Process","There is no Particles. Maybe change the option?");
230 if (fReader->GetNumberOfTrackEvents() <1)
232 Error("Process","There is no Tracks. Maybe change the option?");
236 if ( RunCoherencyCheck() )
239 "Coherency check not passed. Maybe change the option?\n");
243 if (nonid) ProcessTracksAndParticlesNonIdentAnal();
244 else ProcessTracksAndParticles();
250 if (fReader->GetNumberOfTrackEvents() <1)
252 Error("Process","There is no data to analyze.");
256 if (nonid) ProcessTracksNonIdentAnal();
257 else ProcessTracks();
263 if (fReader->GetNumberOfPartEvents() <1)
265 Error("Process","There is no data to analyze.");
269 if (nonid) ProcessParticlesNonIdentAnal();
270 else ProcessParticles();
275 /*************************************************************************************/
277 void AliHBTAnalysis::ProcessTracksAndParticles()
279 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
280 //the loops are splited
283 AliHBTParticle * part1, * part2;
284 AliHBTParticle * track1, * track2;
286 AliHBTEvent * trackEvent, *partEvent;
287 AliHBTEvent * trackEvent2,*partEvent2;
289 // Int_t N1, N2, N=0; //number of particles in current event(we prcess two events in one time)
291 Int_t nev = fReader->GetNumberOfTrackEvents();
293 /***************************************/
294 /****** Looping same events ********/
295 /****** filling numerators ********/
296 /***************************************/
297 AliHBTPair * trackpair = new AliHBTPair();
298 AliHBTPair * partpair = new AliHBTPair();
300 AliHBTPair * tmptrackpair;//temprary pointers to pairs
301 AliHBTPair * tmppartpair;
305 for (Int_t i = 0;i<nev;i++)
307 partEvent= fReader->GetParticleEvent(i);
308 trackEvent = fReader->GetTrackEvent(i);
310 if (!partEvent) continue;
314 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
317 if ( (j%fDisplayMixingInfo) == 0)
318 Info("ProcessTracksAndParticles",
319 "Mixing particle %d from event %d with particles from event %d",j,i,i);
321 part1= partEvent->GetParticle(j);
322 track1= trackEvent->GetParticle(j);
324 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
326 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
327 fParticleMonitorFunctions[ii]->Process(part1);
328 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
329 fTrackMonitorFunctions[ii]->Process(track1);
330 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
331 fParticleAndTrackMonitorFunctions[ii]->Process(track1,part1);
333 if ( (fNParticleFunctions == 0) && (fNTrackFunctions ==0) && (fNParticleAndTrackFunctions == 0))
336 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
338 part2= partEvent->GetParticle(k);
339 if (part1->GetUID() == part2->GetUID()) continue;
340 partpair->SetParticles(part1,part2);
342 track2= trackEvent->GetParticle(k);
343 trackpair->SetParticles(track1,track2);
345 if(fPairCut->Pass(partpair) ) //check pair cut
346 { //do not meets crietria of the pair cut, try with swaped pairs
347 if( fPairCut->Pass(partpair->GetSwapedPair()) )
348 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
350 { //swaped pair meets all the criteria
351 tmppartpair = partpair->GetSwapedPair();
352 tmptrackpair = trackpair->GetSwapedPair();
356 {//meets criteria of the pair cut
357 tmptrackpair = trackpair;
358 tmppartpair = partpair;
360 for(ii = 0;ii<fNParticleFunctions;ii++)
361 fParticleFunctions[ii]->ProcessSameEventParticles(tmppartpair);
363 for(ii = 0;ii<fNTrackFunctions;ii++)
364 fTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair);
366 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
367 fParticleAndTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair,tmppartpair);
373 /***** Filling denominators *********/
374 /***************************************/
375 if (fBufferSize != 0)
376 for (Int_t i = 0;i<nev-1;i++) //In each event (but last) ....
379 if ((fNParticleFunctions == 0) && (fNTrackFunctions ==0) && (fNParticleAndTrackFunctions == 0))
382 partEvent= fReader->GetParticleEvent(i);
383 if (!partEvent) continue;
385 trackEvent = fReader->GetTrackEvent(i);
387 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
389 part1= partEvent->GetParticle(j);
390 track1= trackEvent->GetParticle(j);
392 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
394 Int_t maxeventnumber;
396 if ( ((i+fBufferSize) >= nev) ||( fBufferSize < 0) ) //if buffer size is negative
397 //or current event+buffersize is greater
398 //than max nuber of events
400 maxeventnumber = nev; //set the max event number
404 maxeventnumber = i+fBufferSize; //set the current event number + fBufferSize
407 for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
410 partEvent2= fReader->GetParticleEvent(k);
411 if (!partEvent2) continue;
413 trackEvent2 = fReader->GetTrackEvent(k);
415 if ( (j%fDisplayMixingInfo) == 0)
416 Info("ProcessTracksAndParticles",
417 "Mixing particle %d from event %d with particles from event %d",j,i,k);
419 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
421 part2= partEvent2->GetParticle(l);
422 partpair->SetParticles(part1,part2);
424 track2= trackEvent2->GetParticle(l);
425 trackpair->SetParticles(track1,track2);
427 if( fPairCut->Pass(partpair) ) //check pair cut
428 { //do not meets crietria of the
429 if( fPairCut->Pass(partpair->GetSwapedPair()) )
433 tmppartpair = partpair->GetSwapedPair();
434 tmptrackpair = trackpair->GetSwapedPair();
438 {//meets criteria of the pair cut
439 tmptrackpair = trackpair;
440 tmppartpair = partpair;
442 for(ii = 0;ii<fNParticleFunctions;ii++)
443 fParticleFunctions[ii]->ProcessDiffEventParticles(tmppartpair);
445 for(ii = 0;ii<fNTrackFunctions;ii++)
446 fTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair);
448 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
449 fParticleAndTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair,tmppartpair);
450 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
451 }//for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
454 /***************************************/
456 /*************************************************************************************/
458 void AliHBTAnalysis::ProcessTracks()
460 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
461 //the loops are splited
462 AliHBTParticle * track1, * track2;
463 AliHBTEvent * trackEvent;
464 AliHBTEvent * trackEvent2;
467 Int_t nev = fReader->GetNumberOfTrackEvents();
469 AliHBTPair * trackpair = new AliHBTPair();
470 AliHBTPair * tmptrackpair; //temporary pointer
472 /***************************************/
473 /****** Looping same events ********/
474 /****** filling numerators ********/
475 /***************************************/
476 for (Int_t i = 0;i<nev;i++)
478 trackEvent = fReader->GetTrackEvent(i);
479 if (!trackEvent) continue;
481 for (Int_t j = 0; j<trackEvent->GetNumberOfParticles() ; j++)
483 if ( (j%fDisplayMixingInfo) == 0)
484 Info("ProcessTracks",
485 "Mixing particle %d from event %d with particles from event %d",j,i,i);
487 track1= trackEvent->GetParticle(j);
488 if (fPairCut->GetFirstPartCut()->Pass(track1)) continue;
490 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
491 fTrackMonitorFunctions[ii]->Process(track1);
493 if ( fNTrackFunctions ==0 )
496 for (Int_t k =j+1; k < trackEvent->GetNumberOfParticles() ; k++)
498 track2= trackEvent->GetParticle(k);
499 if (track1->GetUID() == track2->GetUID()) continue;
501 trackpair->SetParticles(track1,track2);
502 if(fPairCut->Pass(trackpair)) //check pair cut
503 { //do not meets crietria of the
504 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
505 else tmptrackpair = trackpair->GetSwapedPair();
509 tmptrackpair = trackpair;
511 for(ii = 0;ii<fNTrackFunctions;ii++)
512 fTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair);
517 /***************************************/
518 /***** Filling diff histogram *********/
519 /***************************************/
520 if (fBufferSize != 0)
521 for (Int_t i = 0;i<nev-1;i++) //In each event (but last) ....
523 if ( fNTrackFunctions ==0 )
526 trackEvent = fReader->GetTrackEvent(i);
527 if (!trackEvent) continue;
529 for (Int_t j = 0; j< trackEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
531 track1= trackEvent->GetParticle(j);
532 if (fPairCut->GetFirstPartCut()->Pass(track1)) continue;
534 Int_t maxeventnumber;
536 if ( ((i+fBufferSize) >= nev) ||( fBufferSize < 0) ) //if buffer size is negative
537 //or current event+buffersize is greater
538 //than max nuber of events
540 maxeventnumber = nev; //set the max event number
544 maxeventnumber = i+fBufferSize; //set the current event number + fBufferSize
547 for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
549 trackEvent2 = fReader->GetTrackEvent(k);
550 if (!trackEvent2) continue;
552 if ( (j%fDisplayMixingInfo) == 0)
553 Info("ProcessTracks",
554 "Mixing particle %d from event %d with particles from event %d",j,i,k);
556 for(Int_t l = 0; l<trackEvent2->GetNumberOfParticles();l++) // ... on all particles
558 track2= trackEvent2->GetParticle(l);
559 trackpair->SetParticles(track1,track2);
561 if(fPairCut->Pass(trackpair)) //check pair cut
562 { //do not meets crietria of the
563 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
564 else tmptrackpair = trackpair->GetSwapedPair();
568 tmptrackpair = trackpair;
570 for(ii = 0;ii<fNTrackFunctions;ii++)
571 fTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair);
573 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
574 }//for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
577 /***************************************/
580 /*************************************************************************************/
582 void AliHBTAnalysis::ProcessParticles()
584 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
585 //the loops are splited
586 AliHBTParticle * part1, * part2;
588 AliHBTEvent * partEvent;
589 AliHBTEvent * partEvent2;
591 AliHBTPair * partpair = new AliHBTPair();
592 AliHBTPair * tmppartpair; //temporary pointer to the pair
594 Int_t nev = fReader->GetNumberOfPartEvents();
596 /***************************************/
597 /****** Looping same events ********/
598 /****** filling numerators ********/
599 /***************************************/
600 for (Int_t i = 0;i<nev;i++)
602 partEvent= fReader->GetParticleEvent(i);
603 if (!partEvent) continue;
606 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
608 if ( (j%fDisplayMixingInfo) == 0)
609 Info("ProcessParticles",
610 "Mixing particle %d from event %d with particles from event %d",j,i,i);
612 part1= partEvent->GetParticle(j);
613 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
616 for(zz = 0; zz<fNParticleMonitorFunctions; zz++)
617 fParticleMonitorFunctions[zz]->Process(part1);
619 if ( fNParticleFunctions ==0 )
622 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
624 part2= partEvent->GetParticle(k);
625 if (part1->GetUID() == part2->GetUID()) continue; //this is the same particle but different incarnation (PID)
626 partpair->SetParticles(part1,part2);
628 if( fPairCut->Pass(partpair) ) //check pair cut
629 { //do not meets crietria of the pair cut, try with swaped pairs
630 if( fPairCut->Pass(partpair->GetSwapedPair() ) )
631 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
633 { //swaped pair meets all the criteria
634 tmppartpair = partpair->GetSwapedPair();
639 tmppartpair = partpair;
643 for(ii = 0;ii<fNParticleFunctions;ii++)
644 fParticleFunctions[ii]->ProcessSameEventParticles(tmppartpair);
649 /***************************************/
650 /***** Filling diff histogram *********/
651 /***************************************/
652 if (fBufferSize != 0) //less then 0 mix everything, == 0 do not mix denominator
653 for (Int_t i = 0;i<nev-1;i++) //In each event (but last)....
655 if ( fNParticleFunctions ==0 )
658 partEvent= fReader->GetParticleEvent(i);
659 if (!partEvent) continue;
661 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
663 part1= partEvent->GetParticle(j);
664 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
665 Int_t maxeventnumber;
667 if ( ((i+fBufferSize) >= nev) ||( fBufferSize < 0) ) //if buffer size is negative
668 //or current event+buffersize is greater
669 //than max nuber of events
671 maxeventnumber = nev; //set the max event number
675 maxeventnumber = i+fBufferSize; //set the current event number + fBufferSize
678 for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
681 partEvent2= fReader->GetParticleEvent(k);
682 if (!partEvent2) continue;
684 if ( (j%fDisplayMixingInfo) == 0)
685 Info("ProcessParticles",
686 "Mixing particle %d from event %d with particles from event %d",j,i,k);
688 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
690 part2= partEvent2->GetParticle(l);
691 partpair->SetParticles(part1,part2);
693 if(fPairCut->Pass(partpair)) //check pair cut
694 { //do not meets crietria of the
695 if( fPairCut->Pass(partpair->GetSwapedPair()) ) continue;
696 else tmppartpair = partpair->GetSwapedPair();
700 tmppartpair = partpair;
703 for(ii = 0;ii<fNParticleFunctions;ii++)
704 fParticleFunctions[ii]->ProcessDiffEventParticles(tmppartpair);
706 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
707 }//for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
710 /***************************************/
713 /*************************************************************************************/
715 void AliHBTAnalysis::WriteFunctions()
717 //Calls Write for all defined functions in analysis
718 //== writes all results
720 for(ii = 0;ii<fNParticleFunctions;ii++)
721 fParticleFunctions[ii]->Write();
723 for(ii = 0;ii<fNTrackFunctions;ii++)
724 fTrackFunctions[ii]->Write();
726 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
727 fParticleAndTrackFunctions[ii]->Write();
729 for(ii = 0;ii<fNParticleMonitorFunctions;ii++)
730 fParticleMonitorFunctions[ii]->Write();
732 for(ii = 0;ii<fNTrackMonitorFunctions;ii++)
733 fTrackMonitorFunctions[ii]->Write();
735 for(ii = 0;ii<fNParticleAndTrackMonitorFunctions;ii++)
736 fParticleAndTrackMonitorFunctions[ii]->Write();
738 /*************************************************************************************/
740 void AliHBTAnalysis::SetGlobalPairCut(AliHBTPairCut* cut)
742 //Sets the global cut
745 Error("AliHBTAnalysis::SetGlobalPairCut","Pointer is NULL. Ignoring");
748 fPairCut = (AliHBTPairCut*)cut->Clone();
751 /*************************************************************************************/
753 void AliHBTAnalysis::AddTrackFunction(AliHBTOnePairFctn* f)
755 //Adds track function
756 if (f == 0x0) return;
757 if (fNTrackFunctions == fgkFctnArraySize)
759 Error("AliHBTAnalysis::AddTrackFunction","Can not add this function, not enough place in the array.");
761 fTrackFunctions[fNTrackFunctions] = f;
764 /*************************************************************************************/
766 void AliHBTAnalysis::AddParticleFunction(AliHBTOnePairFctn* f)
768 //adds particle function
769 if (f == 0x0) return;
771 if (fNParticleFunctions == fgkFctnArraySize)
773 Error("AliHBTAnalysis::AddParticleFunction","Can not add this function, not enough place in the array.");
775 fParticleFunctions[fNParticleFunctions] = f;
776 fNParticleFunctions++;
778 /*************************************************************************************/
780 void AliHBTAnalysis::AddParticleAndTrackFunction(AliHBTTwoPairFctn* f)
782 //add resolution function
783 if (f == 0x0) return;
784 if (fNParticleAndTrackFunctions == fgkFctnArraySize)
786 Error("AliHBTAnalysis::AddParticleAndTrackFunction","Can not add this function, not enough place in the array.");
788 fParticleAndTrackFunctions[fNParticleAndTrackFunctions] = f;
789 fNParticleAndTrackFunctions++;
791 /*************************************************************************************/
793 void AliHBTAnalysis::AddParticleMonitorFunction(AliHBTMonOneParticleFctn* f)
795 //add particle monitoring function
796 if (f == 0x0) return;
798 if (fNParticleMonitorFunctions == fgkFctnArraySize)
800 Error("AliHBTAnalysis::AddParticleMonitorFunction","Can not add this function, not enough place in the array.");
802 fParticleMonitorFunctions[fNParticleMonitorFunctions] = f;
803 fNParticleMonitorFunctions++;
805 /*************************************************************************************/
807 void AliHBTAnalysis::AddTrackMonitorFunction(AliHBTMonOneParticleFctn* f)
809 //add track monitoring function
810 if (f == 0x0) return;
812 if (fNTrackMonitorFunctions == fgkFctnArraySize)
814 Error("AliHBTAnalysis::AddTrackMonitorFunction","Can not add this function, not enough place in the array.");
816 fTrackMonitorFunctions[fNTrackMonitorFunctions] = f;
817 fNTrackMonitorFunctions++;
819 /*************************************************************************************/
821 void AliHBTAnalysis::AddParticleAndTrackMonitorFunction(AliHBTMonTwoParticleFctn* f)
823 //add resolution monitoring function
824 if (f == 0x0) return;
825 if (fNParticleAndTrackMonitorFunctions == fgkFctnArraySize)
827 Error("AliHBTAnalysis::AddParticleAndTrackMonitorFunction","Can not add this function, not enough place in the array.");
829 fParticleAndTrackMonitorFunctions[fNParticleAndTrackMonitorFunctions] = f;
830 fNParticleAndTrackMonitorFunctions++;
834 /*************************************************************************************/
835 /*************************************************************************************/
837 Bool_t AliHBTAnalysis::RunCoherencyCheck()
839 //Checks if both HBTRuns are similar
840 //return true if error found
841 //if they seem to be OK return false
843 Info("RunCoherencyCheck","Checking HBT Runs Coherency");
845 Info("RunCoherencyCheck","Number of events ...");
846 if (fReader->GetNumberOfPartEvents() == fReader->GetNumberOfTrackEvents() ) //check whether there is the same number of events
848 Info("RunCoherencyCheck","OK. %d found\n",fReader->GetNumberOfTrackEvents());
851 { //if not the same - ERROR
852 Error("AliHBTAnalysis::RunCoherencyCheck()",
853 "Number of simulated events (%d) is not equal to number of reconstructed events(%d)",
854 fReader->GetNumberOfPartEvents(),fReader->GetNumberOfTrackEvents());
858 Info("RunCoherencyCheck","Checking number of Particles AND Particles Types in each event ...");
860 AliHBTEvent *partEvent;
861 AliHBTEvent *trackEvent;
862 for( i = 0; i<fReader->GetNumberOfTrackEvents();i++)
864 partEvent= fReader->GetParticleEvent(i); //gets the "ith" event
865 trackEvent = fReader->GetTrackEvent(i);
867 if ( (partEvent == 0x0) && (partEvent == 0x0) ) continue;
868 if ( (partEvent == 0x0) || (partEvent == 0x0) )
870 Error("AliHBTAnalysis::RunCoherencyCheck()",
871 "One event is NULL and the other one not. Event Number %d",i);
875 if ( partEvent->GetNumberOfParticles() != trackEvent->GetNumberOfParticles() )
877 Error("AliHBTAnalysis::RunCoherencyCheck()",
878 "Event %d: Number of simulated particles (%d) not equal to number of reconstructed tracks (%d)",
879 i,partEvent->GetNumberOfParticles() , trackEvent->GetNumberOfParticles());
883 for (Int_t j = 0; j<partEvent->GetNumberOfParticles(); j++)
885 if( partEvent->GetParticle(j)->GetPdgCode() != trackEvent->GetParticle(j)->GetPdgCode() )
887 Error("AliHBTAnalysis::RunCoherencyCheck()",
888 "Event %d: Particle %d: PID of simulated particle (%d) not the same of reconstructed track (%d)",
889 i,j, partEvent->GetParticle(j)->GetPdgCode(),trackEvent->GetParticle(j)->GetPdgCode() );
895 Info("RunCoherencyCheck"," Done");
896 Info("RunCoherencyCheck"," Everything looks OK");
900 /*************************************************************************************/
902 void AliHBTAnalysis::ProcessTracksAndParticlesNonIdentAnal()
904 //Performs analysis for both, tracks and particles
906 AliHBTParticle * part1, * part2;
907 AliHBTParticle * track1, * track2;
909 AliHBTEvent * trackEvent1=0x0,*partEvent1=0x0;
910 AliHBTEvent * trackEvent2=0x0,*partEvent2=0x0;
911 AliHBTEvent * trackEvent3=0x0,*partEvent3=0x0;
913 AliHBTEvent * rawtrackEvent, *rawpartEvent;
915 Int_t nev = fReader->GetNumberOfTrackEvents();
917 AliHBTPair * trackpair = new AliHBTPair();
918 AliHBTPair * partpair = new AliHBTPair();
925 trackEvent1 = new AliHBTEvent();
926 partEvent1 = new AliHBTEvent();
927 trackEvent1->SetOwner(kFALSE);
928 partEvent1->SetOwner(kFALSE);;
930 Info("ProcessTracksAndParticlesNonIdentAnal","**************************************");
931 Info("ProcessTracksAndParticlesNonIdentAnal","***** NON IDENT MODE ****************");
932 Info("ProcessTracksAndParticlesNonIdentAnal","**************************************");
934 for (Int_t i = 0;i<nev;i++)
936 rawpartEvent = fReader->GetParticleEvent(i);
937 rawtrackEvent = fReader->GetTrackEvent(i);
938 if ( (rawpartEvent == 0x0) || (rawtrackEvent == 0x0) ) continue;//in case of any error
940 /********************************/
942 /********************************/
943 if ( (fBufferSize != 0) || ( (partEvent2==0x0)||(trackEvent2==0x0)) )//in case fBufferSize == 0 and pointers are created do not eneter
944 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
945 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
946 partEvent2 = (AliHBTEvent*)pbuffer.Remove(pbuffer.Last()); //remove from the end to be reset, filled and put on the beginning
947 trackEvent2 = (AliHBTEvent*)tbuffer.Remove(tbuffer.Last());
952 partEvent2 = new AliHBTEvent();
953 trackEvent2 = new AliHBTEvent();
954 partEvent2->SetOwner(kFALSE);
955 trackEvent2->SetOwner(kFALSE);
957 FilterOut(partEvent1, partEvent2, rawpartEvent, trackEvent1, trackEvent2, rawtrackEvent);
959 for (Int_t j = 0; j<partEvent1->GetNumberOfParticles() ; j++)
961 if ( (j%fDisplayMixingInfo) == 0)
962 Info("ProcessTracksAndParticlesNonIdentAnal",
963 "Mixing particle %d from event %d with particles from event %d",j,i,i);
965 part1= partEvent1->GetParticle(j);
966 track1= trackEvent1->GetParticle(j);
968 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
969 fParticleMonitorFunctions[ii]->Process(part1);
970 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
971 fTrackMonitorFunctions[ii]->Process(track1);
972 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
973 fParticleAndTrackMonitorFunctions[ii]->Process(track1,part1);
975 /***************************************/
976 /****** filling numerators ********/
977 /****** (particles from event2) ********/
978 /***************************************/
979 for (Int_t k = 0; k < partEvent2->GetNumberOfParticles() ; k++)
981 part2= partEvent2->GetParticle(k);
982 if (part1->GetUID() == part2->GetUID()) continue;//this is the same particle but with different PID
983 partpair->SetParticles(part1,part2);
985 track2= trackEvent2->GetParticle(k);
986 trackpair->SetParticles(track1,track2);
988 if( (fPairCut->PassPairProp(partpair)) ) //check pair cut
989 { //do not meets crietria of the pair cut
993 {//meets criteria of the pair cut
994 for(ii = 0;ii<fNParticleFunctions;ii++)
995 fParticleFunctions[ii]->ProcessSameEventParticles(partpair);
997 for(ii = 0;ii<fNTrackFunctions;ii++)
998 fTrackFunctions[ii]->ProcessSameEventParticles(trackpair);
1000 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
1001 fParticleAndTrackFunctions[ii]->ProcessSameEventParticles(trackpair,partpair);
1005 if ( fBufferSize == 0) continue;//do not mix diff histograms
1006 /***************************************/
1007 /***** Filling denominators *********/
1008 /***************************************/
1009 TIter piter(&pbuffer);
1010 TIter titer(&tbuffer);
1013 while ( (partEvent3 = (AliHBTEvent*)piter.Next()) != 0x0)
1015 trackEvent3 = (AliHBTEvent*)titer.Next();
1016 if ( (j%fDisplayMixingInfo) == 0)
1017 Info("ProcessTracksAndParticlesNonIdentAnal",
1018 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
1020 for (Int_t k = 0; k < partEvent3->GetNumberOfParticles() ; k++)
1022 part2= partEvent3->GetParticle(k);
1023 partpair->SetParticles(part1,part2);
1025 track2= trackEvent3->GetParticle(k);
1026 trackpair->SetParticles(track1,track2);
1028 if( (fPairCut->PassPairProp(partpair)) ) //check pair cut
1029 { //do not meets crietria of the pair cut
1033 {//meets criteria of the pair cut
1035 for(ii = 0;ii<fNParticleFunctions;ii++)
1036 fParticleFunctions[ii]->ProcessDiffEventParticles(partpair);
1038 for(ii = 0;ii<fNTrackFunctions;ii++)
1039 fTrackFunctions[ii]->ProcessDiffEventParticles(trackpair);
1041 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
1042 fParticleAndTrackFunctions[ii]->ProcessDiffEventParticles(trackpair,partpair);
1044 }// for particles event2
1046 }//for over particles in event1
1048 if ( fBufferSize == 0) continue;//do not mix diff histograms-> do not add to buffer list
1049 pbuffer.AddFirst(partEvent2);
1050 tbuffer.AddFirst(trackEvent2);
1055 }//end of loop over events (1)
1056 pbuffer.SetOwner(); //to clean stored events by the way of buffer destruction
1062 if ( fBufferSize == 0)
1063 {//in that case we did not add these events to list
1069 /*************************************************************************************/
1071 void AliHBTAnalysis::ProcessTracksNonIdentAnal()
1073 //Process Tracks only with non identical mode
1074 AliHBTParticle * track1, * track2;
1076 AliHBTEvent * trackEvent1=0x0;
1077 AliHBTEvent * trackEvent2=0x0;
1078 AliHBTEvent * trackEvent3=0x0;
1081 AliHBTEvent * rawtrackEvent;
1083 Int_t nev = fReader->GetNumberOfTrackEvents();
1085 AliHBTPair * trackpair = new AliHBTPair();
1088 Int_t ninbuffer = 0;
1091 trackEvent1 = new AliHBTEvent();
1092 trackEvent1->SetOwner(kFALSE);
1094 Info("ProcessTracksNonIdentAnal","**************************************");
1095 Info("ProcessTracksNonIdentAnal","***** NON IDENT MODE ****************");
1096 Info("ProcessTracksNonIdentAnal","**************************************");
1098 for (Int_t i = 0;i<nev;i++)
1100 rawtrackEvent = fReader->GetTrackEvent(i);
1101 if (rawtrackEvent == 0x0) continue;//in case of any error
1103 /********************************/
1105 /********************************/
1106 if ( (fBufferSize != 0) || ( trackEvent2==0x0) )//in case fBufferSize == 0 and pointers are created do not eneter
1107 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
1108 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
1109 trackEvent2 = (AliHBTEvent*)tbuffer.Remove(tbuffer.Last());
1114 trackEvent2 = new AliHBTEvent();
1115 trackEvent2->SetOwner(kFALSE);
1117 FilterOut(trackEvent1, trackEvent2, rawtrackEvent);
1119 for (Int_t j = 0; j<trackEvent1->GetNumberOfParticles() ; j++)
1121 if ( (j%fDisplayMixingInfo) == 0)
1122 Info("ProcessTracksNonIdentAnal",
1123 "Mixing particle %d from event %d with particles from event %d",j,i,i);
1125 track1= trackEvent1->GetParticle(j);
1127 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
1128 fTrackMonitorFunctions[ii]->Process(track1);
1130 /***************************************/
1131 /****** filling numerators ********/
1132 /****** (particles from event2) ********/
1133 /***************************************/
1134 for (Int_t k = 0; k < trackEvent2->GetNumberOfParticles() ; k++)
1136 track2= trackEvent2->GetParticle(k);
1137 if (track1->GetUID() == track2->GetUID()) continue;//this is the same particle but with different PID
1138 trackpair->SetParticles(track1,track2);
1141 if( fPairCut->PassPairProp(trackpair)) //check pair cut
1142 { //do not meets crietria of the pair cut
1146 {//meets criteria of the pair cut
1148 for(ii = 0;ii<fNTrackFunctions;ii++)
1149 fTrackFunctions[ii]->ProcessSameEventParticles(trackpair);
1152 if ( fBufferSize == 0) continue;//do not mix diff histograms
1153 /***************************************/
1154 /***** Filling denominators *********/
1155 /***************************************/
1156 TIter titer(&tbuffer);
1159 while ( (trackEvent3 = (AliHBTEvent*)titer.Next()) != 0x0)
1162 if ( (j%fDisplayMixingInfo) == 0)
1163 Info("ProcessTracksNonIdentAnal",
1164 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
1166 for (Int_t k = 0; k < trackEvent3->GetNumberOfParticles() ; k++)
1169 track2= trackEvent3->GetParticle(k);
1170 trackpair->SetParticles(track1,track2);
1173 if( fPairCut->PassPairProp(trackpair)) //check pair cut
1174 { //do not meets crietria of the pair cut
1178 {//meets criteria of the pair cut
1179 for(ii = 0;ii<fNTrackFunctions;ii++)
1180 fTrackFunctions[ii]->ProcessDiffEventParticles(trackpair);
1182 }// for particles event2
1184 }//for over particles in event1
1186 if ( fBufferSize == 0) continue;//do not mix diff histograms
1187 tbuffer.AddFirst(trackEvent2);
1191 }//end of loop over events (1)
1195 if (fBufferSize == 0) delete trackEvent2;
1198 /*************************************************************************************/
1200 void AliHBTAnalysis::ProcessParticlesNonIdentAnal()
1202 //process paricles only with non identical mode
1203 AliHBTParticle * part1 = 0x0, * part2 = 0x0;
1205 AliHBTEvent * partEvent1 = 0x0;
1206 AliHBTEvent * partEvent2 = 0x0;
1207 AliHBTEvent * partEvent3 = 0x0;
1209 AliHBTEvent * rawpartEvent = 0x0;
1211 Int_t nev = fReader->GetNumberOfPartEvents();
1213 AliHBTPair * partpair = new AliHBTPair();
1216 Int_t ninbuffer = 0;
1218 partEvent1 = new AliHBTEvent();
1219 partEvent1->SetOwner(kFALSE);;
1221 Info("ProcessParticlesNonIdentAnal","**************************************");
1222 Info("ProcessParticlesNonIdentAnal","***** NON IDENT MODE ****************");
1223 Info("ProcessParticlesNonIdentAnal","**************************************");
1225 for (Int_t i = 0;i<nev;i++)
1227 rawpartEvent = fReader->GetParticleEvent(i);
1228 if ( rawpartEvent == 0x0 ) continue;//in case of any error
1230 /********************************/
1232 /********************************/
1233 if ( (fBufferSize != 0) || ( partEvent2==0x0) )//in case fBufferSize == 0 and pointers are created do not eneter
1234 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
1235 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
1236 partEvent2 = (AliHBTEvent*)pbuffer.Remove(pbuffer.Last()); //remove from the end to be reset, filled and put on the beginning
1241 partEvent2 = new AliHBTEvent();
1242 partEvent2->SetOwner(kFALSE);
1244 FilterOut(partEvent1, partEvent2, rawpartEvent);
1246 for (Int_t j = 0; j<partEvent1->GetNumberOfParticles() ; j++)
1248 if ( (j%fDisplayMixingInfo) == 0)
1249 Info("ProcessParticlesNonIdentAnal",
1250 "Mixing particle %d from event %d with particles from event %d",j,i,i);
1252 part1= partEvent1->GetParticle(j);
1255 for(zz = 0; zz<fNParticleMonitorFunctions; zz++)
1256 fParticleMonitorFunctions[zz]->Process(part1);
1258 /***************************************/
1259 /****** filling numerators ********/
1260 /****** (particles from event2) ********/
1261 /***************************************/
1262 for (Int_t k = 0; k < partEvent2->GetNumberOfParticles() ; k++)
1264 part2= partEvent2->GetParticle(k);
1265 if (part1->GetUID() == part2->GetUID()) continue;//this is the same particle but with different PID
1266 partpair->SetParticles(part1,part2);
1268 if(fPairCut->PassPairProp(partpair) ) //check pair cut
1269 { //do not meets crietria of the pair cut
1273 {//meets criteria of the pair cut
1275 for(ii = 0;ii<fNParticleFunctions;ii++)
1277 fParticleFunctions[ii]->ProcessSameEventParticles(partpair);
1281 if ( fBufferSize == 0) continue;//do not mix diff histograms
1282 /***************************************/
1283 /***** Filling denominators *********/
1284 /***************************************/
1285 TIter piter(&pbuffer);
1288 while ( (partEvent3 = (AliHBTEvent*)piter.Next()) != 0x0)
1290 if ( (j%fDisplayMixingInfo) == 0)
1291 Info("ProcessParticlesNonIdentAnal",
1292 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
1294 for (Int_t k = 0; k < partEvent3->GetNumberOfParticles() ; k++)
1296 part2= partEvent3->GetParticle(k);
1297 partpair->SetParticles(part1,part2);
1299 if(fPairCut->PassPairProp(partpair) ) //check pair cut
1300 { //do not meets crietria of the pair cut
1304 {//meets criteria of the pair cut
1306 for(ii = 0;ii<fNParticleFunctions;ii++)
1308 fParticleFunctions[ii]->ProcessDiffEventParticles(partpair);
1311 }// for particles event2
1313 }//for over particles in event1
1314 if ( fBufferSize == 0) continue;//do not mix diff histograms
1315 pbuffer.AddFirst(partEvent2);
1319 }//end of loop over events (1)
1322 if ( fBufferSize == 0) delete partEvent2;
1323 pbuffer.SetOwner();//to delete stered events.
1326 /*************************************************************************************/
1327 void AliHBTAnalysis::FilterOut(AliHBTEvent* outpart1, AliHBTEvent* outpart2, AliHBTEvent* inpart,
1328 AliHBTEvent* outtrack1, AliHBTEvent* outtrack2, AliHBTEvent* intrack)
1330 //Puts particles accepted as a first particle by global cut in out1
1331 //and as a second particle in out2
1333 AliHBTParticle* part, *track;
1340 AliHBTParticleCut *cut1 = fPairCut->GetFirstPartCut();
1341 AliHBTParticleCut *cut2 = fPairCut->GetSecondPartCut();
1345 for (Int_t i = 0; i < inpart->GetNumberOfParticles(); i++)
1348 part = inpart->GetParticle(i);
1349 track = intrack->GetParticle(i);
1351 if ( (cut1->Pass(part)) ) in1 = kFALSE; //if part is rejected by cut1, in1 is false
1352 if ( (cut2->Pass(part)) ) in2 = kFALSE; //if part is rejected by cut2, in2 is false
1354 if (gDebug)//to be removed in real analysis
1355 if ( in1 && in2 ) //both cuts accepted, should never happen, just in case
1357 //Particle accpted by both cuts
1358 Error("FilterOut","Particle accepted by both cuts");
1364 outpart1->AddParticle(part);
1365 outtrack1->AddParticle(track);
1371 outpart2->AddParticle(part);
1372 outtrack2->AddParticle(track);
1377 /*************************************************************************************/
1379 void AliHBTAnalysis::FilterOut(AliHBTEvent* out1, AliHBTEvent* out2, AliHBTEvent* in)
1381 //Puts particles accepted as a first particle by global cut in out1
1382 //and as a second particle in out2
1383 AliHBTParticle* part;
1388 AliHBTParticleCut *cut1 = fPairCut->GetFirstPartCut();
1389 AliHBTParticleCut *cut2 = fPairCut->GetSecondPartCut();
1393 for (Int_t i = 0; i < in->GetNumberOfParticles(); i++)
1396 part = in->GetParticle(i);
1398 if ( cut1->Pass(part) ) in1 = kFALSE; //if part is rejected by cut1, in1 is false
1399 if ( cut2->Pass(part) ) in2 = kFALSE; //if part is rejected by cut2, in2 is false
1401 if (gDebug)//to be removed in real analysis
1402 if ( in1 && in2 ) //both cuts accepted, should never happen, just in case
1404 //Particle accpted by both cuts
1405 Error("FilterOut","Particle accepted by both cuts");
1411 out1->AddParticle(part);
1417 out2->AddParticle(part);
1422 /*************************************************************************************/
1424 Bool_t AliHBTAnalysis::IsNonIdentAnalysis()
1426 //checks if it is possible to use special analysis for non identical particles
1427 //it means - in global pair cut first particle id is different than second one
1428 //and both are different from 0
1429 //in the future is possible to perform more sophisticated check
1430 //if cuts have excluding requirements
1432 if (fPairCut->IsEmpty())
1435 if (fPairCut->GetFirstPartCut()->IsEmpty())
1438 if (fPairCut->GetSecondPartCut()->IsEmpty())
1441 Int_t id1 = fPairCut->GetFirstPartCut()->GetPID();
1442 Int_t id2 = fPairCut->GetSecondPartCut()->GetPID();
1444 if ( (id1==0) || (id2==0) || (id1==id2) )