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):
67 fNParticleFunctions(0),
68 fNParticleAndTrackFunctions(0),
69 fNTrackMonitorFunctions(0),
70 fNParticleMonitorFunctions(0),
71 fNParticleAndTrackMonitorFunctions(0),
73 fParticleFunctions(0x0),
74 fParticleAndTrackFunctions(0x0),
75 fParticleMonitorFunctions(0x0),
76 fTrackMonitorFunctions(0x0),
77 fParticleAndTrackMonitorFunctions(0x0),
79 fBufferSize(fgkDefaultBufferSize),
80 fDisplayMixingInfo(fgkDefaultMixingInfo),
84 Fatal("AliHBTAnalysis(const AliHBTAnalysis&)","Sensless");
86 /*************************************************************************************/
87 const AliHBTAnalysis& AliHBTAnalysis::operator=(const AliHBTAnalysis& /*right*/)
90 Fatal("AliHBTAnalysis(const AliHBTAnalysis&)","Sensless");
93 /*************************************************************************************/
94 AliHBTAnalysis::~AliHBTAnalysis()
97 //note that we do not delete functions itself
98 // they should be deleted by whom where created
99 //we only store pointers, and we use "new" only for pointers array
102 delete [] fTrackFunctions;
103 delete [] fParticleFunctions;
104 delete [] fParticleAndTrackFunctions;
106 delete [] fParticleMonitorFunctions;
107 delete [] fTrackMonitorFunctions;
108 delete [] fParticleAndTrackMonitorFunctions;
110 delete fPairCut; // always have an copy of an object - we create we dstroy
113 /*************************************************************************************/
115 void AliHBTAnalysis::DeleteFunctions()
117 //Deletes all functions added to analysis
119 for(ii = 0;ii<fNParticleFunctions;ii++)
120 delete fParticleFunctions[ii];
121 fNParticleFunctions = 0;
123 for(ii = 0;ii<fNTrackFunctions;ii++)
124 delete fTrackFunctions[ii];
125 fNTrackFunctions = 0;
127 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
128 delete fParticleAndTrackFunctions[ii];
129 fNParticleAndTrackFunctions = 0;
131 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
132 delete fParticleMonitorFunctions[ii];
133 fNParticleMonitorFunctions = 0;
135 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
136 delete fTrackMonitorFunctions[ii];
137 fNTrackMonitorFunctions = 0;
139 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
140 delete fParticleAndTrackMonitorFunctions[ii];
141 fNParticleAndTrackMonitorFunctions = 0;
143 /*************************************************************************************/
145 void AliHBTAnalysis::Init()
147 //Initializeation method
148 //calls Init for all functions
150 for(ii = 0;ii<fNParticleFunctions;ii++)
151 fParticleFunctions[ii]->Init();
153 for(ii = 0;ii<fNTrackFunctions;ii++)
154 fTrackFunctions[ii]->Init();
156 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
157 fParticleAndTrackFunctions[ii]->Init();
159 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
160 fParticleMonitorFunctions[ii]->Init();
162 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
163 fTrackMonitorFunctions[ii]->Init();
165 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
166 fParticleAndTrackMonitorFunctions[ii]->Init();
168 /*************************************************************************************/
170 void AliHBTAnalysis::ResetFunctions()
172 //In case fOwner is true, deletes all functions
173 //in other case, just set number of analysis to 0
174 if (fIsOwner) DeleteFunctions();
177 fNParticleFunctions = 0;
178 fNTrackFunctions = 0;
179 fNParticleAndTrackFunctions = 0;
180 fNParticleMonitorFunctions = 0;
181 fNTrackMonitorFunctions = 0;
182 fNParticleAndTrackMonitorFunctions = 0;
185 /*************************************************************************************/
187 void AliHBTAnalysis::Process(Option_t* option)
189 //default option = "TracksAndParticles"
190 //Main method of the HBT Analysis Package
191 //It triggers reading with the global cut (default is an empty cut)
192 //Than it checks options and data which are read
193 //if everything is OK, then it calls one of the looping methods
194 //depending on tfReaderhe option
195 //These methods differs on what thay are looping on
198 //--------------------------------------------------------------------
199 //ProcessTracksAndParticles - "TracksAndParticles"
201 // it loops over both, tracks(reconstructed) and particles(simulated)
202 // all function gethered in all 3 lists are called for each (double)pair
204 //ProcessTracks - "Tracks"
205 // it loops only on tracks(reconstructed),
206 // functions ONLY from fTrackFunctions list are called
208 //ProcessParticles - "Particles"
209 // it loops only on particles(simulated),
210 // functions ONLY from fParticleAndTrackFunctions list are called
215 Error("Process","The reader is not set");
219 const char *oT = strstr(option,"Tracks");
220 const char *oP = strstr(option,"Particles");
222 Bool_t nonid = IsNonIdentAnalysis();
226 if (fReader->GetNumberOfPartEvents() <1)
228 Error("Process","There is no Particles. Maybe change the option?");
231 if (fReader->GetNumberOfTrackEvents() <1)
233 Error("Process","There is no Tracks. Maybe change the option?");
237 if ( RunCoherencyCheck() )
240 "Coherency check not passed. Maybe change the option?\n");
244 if (nonid) ProcessTracksAndParticlesNonIdentAnal();
245 else ProcessTracksAndParticles();
251 if (fReader->GetNumberOfTrackEvents() <1)
253 Error("Process","There is no data to analyze.");
257 if (nonid) ProcessTracksNonIdentAnal();
258 else ProcessTracks();
264 if (fReader->GetNumberOfPartEvents() <1)
266 Error("Process","There is no data to analyze.");
270 if (nonid) ProcessParticlesNonIdentAnal();
271 else ProcessParticles();
276 /*************************************************************************************/
278 void AliHBTAnalysis::ProcessTracksAndParticles()
280 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
281 //the loops are splited
284 AliHBTParticle * part1, * part2;
285 AliHBTParticle * track1, * track2;
287 AliHBTEvent * trackEvent, *partEvent;
288 AliHBTEvent * trackEvent2,*partEvent2;
290 // Int_t N1, N2, N=0; //number of particles in current event(we prcess two events in one time)
292 Int_t nev = fReader->GetNumberOfTrackEvents();
294 /***************************************/
295 /****** Looping same events ********/
296 /****** filling numerators ********/
297 /***************************************/
298 AliHBTPair * trackpair = new AliHBTPair();
299 AliHBTPair * partpair = new AliHBTPair();
301 AliHBTPair * tmptrackpair;//temprary pointers to pairs
302 AliHBTPair * tmppartpair;
306 for (Int_t i = 0;i<nev;i++)
308 partEvent= fReader->GetParticleEvent(i);
309 trackEvent = fReader->GetTrackEvent(i);
311 if (!partEvent) continue;
315 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
318 if ( (j%fDisplayMixingInfo) == 0)
319 Info("ProcessTracksAndParticles",
320 "Mixing particle %d from event %d with particles from event %d",j,i,i);
322 part1= partEvent->GetParticle(j);
323 track1= trackEvent->GetParticle(j);
325 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
327 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
328 fParticleMonitorFunctions[ii]->Process(part1);
329 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
330 fTrackMonitorFunctions[ii]->Process(track1);
331 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
332 fParticleAndTrackMonitorFunctions[ii]->Process(track1,part1);
334 if ( (fNParticleFunctions == 0) && (fNTrackFunctions ==0) && (fNParticleAndTrackFunctions == 0))
337 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
339 part2= partEvent->GetParticle(k);
340 if (part1->GetUID() == part2->GetUID()) continue;
341 partpair->SetParticles(part1,part2);
343 track2= trackEvent->GetParticle(k);
344 trackpair->SetParticles(track1,track2);
346 if(fPairCut->Pass(partpair) ) //check pair cut
347 { //do not meets crietria of the pair cut, try with swaped pairs
348 if( fPairCut->Pass(partpair->GetSwapedPair()) )
349 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
351 { //swaped pair meets all the criteria
352 tmppartpair = partpair->GetSwapedPair();
353 tmptrackpair = trackpair->GetSwapedPair();
357 {//meets criteria of the pair cut
358 tmptrackpair = trackpair;
359 tmppartpair = partpair;
361 for(ii = 0;ii<fNParticleFunctions;ii++)
362 fParticleFunctions[ii]->ProcessSameEventParticles(tmppartpair);
364 for(ii = 0;ii<fNTrackFunctions;ii++)
365 fTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair);
367 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
368 fParticleAndTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair,tmppartpair);
374 /***** Filling denominators *********/
375 /***************************************/
376 if (fBufferSize != 0)
377 for (Int_t i = 0;i<nev-1;i++) //In each event (but last) ....
380 if ((fNParticleFunctions == 0) && (fNTrackFunctions ==0) && (fNParticleAndTrackFunctions == 0))
383 partEvent= fReader->GetParticleEvent(i);
384 if (!partEvent) continue;
386 trackEvent = fReader->GetTrackEvent(i);
388 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
390 part1= partEvent->GetParticle(j);
391 track1= trackEvent->GetParticle(j);
393 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
395 Int_t maxeventnumber;
397 if ( ((i+fBufferSize) >= nev) ||( fBufferSize < 0) ) //if buffer size is negative
398 //or current event+buffersize is greater
399 //than max nuber of events
401 maxeventnumber = nev; //set the max event number
405 maxeventnumber = i+fBufferSize; //set the current event number + fBufferSize
408 for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
411 partEvent2= fReader->GetParticleEvent(k);
412 if (!partEvent2) continue;
414 trackEvent2 = fReader->GetTrackEvent(k);
416 if ( (j%fDisplayMixingInfo) == 0)
417 Info("ProcessTracksAndParticles",
418 "Mixing particle %d from event %d with particles from event %d",j,i,k);
420 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
422 part2= partEvent2->GetParticle(l);
423 partpair->SetParticles(part1,part2);
425 track2= trackEvent2->GetParticle(l);
426 trackpair->SetParticles(track1,track2);
428 if( fPairCut->Pass(partpair) ) //check pair cut
429 { //do not meets crietria of the
430 if( fPairCut->Pass(partpair->GetSwapedPair()) )
434 tmppartpair = partpair->GetSwapedPair();
435 tmptrackpair = trackpair->GetSwapedPair();
439 {//meets criteria of the pair cut
440 tmptrackpair = trackpair;
441 tmppartpair = partpair;
443 for(ii = 0;ii<fNParticleFunctions;ii++)
444 fParticleFunctions[ii]->ProcessDiffEventParticles(tmppartpair);
446 for(ii = 0;ii<fNTrackFunctions;ii++)
447 fTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair);
449 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
450 fParticleAndTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair,tmppartpair);
451 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
452 }//for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
455 /***************************************/
457 /*************************************************************************************/
459 void AliHBTAnalysis::ProcessTracks()
461 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
462 //the loops are splited
463 AliHBTParticle * track1, * track2;
464 AliHBTEvent * trackEvent;
465 AliHBTEvent * trackEvent2;
468 Int_t nev = fReader->GetNumberOfTrackEvents();
470 AliHBTPair * trackpair = new AliHBTPair();
471 AliHBTPair * tmptrackpair; //temporary pointer
473 /***************************************/
474 /****** Looping same events ********/
475 /****** filling numerators ********/
476 /***************************************/
477 for (Int_t i = 0;i<nev;i++)
479 trackEvent = fReader->GetTrackEvent(i);
480 if (!trackEvent) continue;
482 for (Int_t j = 0; j<trackEvent->GetNumberOfParticles() ; j++)
484 if ( (j%fDisplayMixingInfo) == 0)
485 Info("ProcessTracks",
486 "Mixing particle %d from event %d with particles from event %d",j,i,i);
488 track1= trackEvent->GetParticle(j);
489 if (fPairCut->GetFirstPartCut()->Pass(track1)) continue;
491 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
492 fTrackMonitorFunctions[ii]->Process(track1);
494 if ( fNTrackFunctions ==0 )
497 for (Int_t k =j+1; k < trackEvent->GetNumberOfParticles() ; k++)
499 track2= trackEvent->GetParticle(k);
500 if (track1->GetUID() == track2->GetUID()) continue;
502 trackpair->SetParticles(track1,track2);
503 if(fPairCut->Pass(trackpair)) //check pair cut
504 { //do not meets crietria of the
505 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
506 else tmptrackpair = trackpair->GetSwapedPair();
510 tmptrackpair = trackpair;
512 for(ii = 0;ii<fNTrackFunctions;ii++)
513 fTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair);
518 /***************************************/
519 /***** Filling diff histogram *********/
520 /***************************************/
521 if (fBufferSize != 0)
522 for (Int_t i = 0;i<nev-1;i++) //In each event (but last) ....
524 if ( fNTrackFunctions ==0 )
527 trackEvent = fReader->GetTrackEvent(i);
528 if (!trackEvent) continue;
530 for (Int_t j = 0; j< trackEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
532 track1= trackEvent->GetParticle(j);
533 if (fPairCut->GetFirstPartCut()->Pass(track1)) continue;
535 Int_t maxeventnumber;
537 if ( ((i+fBufferSize) >= nev) ||( fBufferSize < 0) ) //if buffer size is negative
538 //or current event+buffersize is greater
539 //than max nuber of events
541 maxeventnumber = nev; //set the max event number
545 maxeventnumber = i+fBufferSize; //set the current event number + fBufferSize
548 for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
550 trackEvent2 = fReader->GetTrackEvent(k);
551 if (!trackEvent2) continue;
553 if ( (j%fDisplayMixingInfo) == 0)
554 Info("ProcessTracks",
555 "Mixing particle %d from event %d with particles from event %d",j,i,k);
557 for(Int_t l = 0; l<trackEvent2->GetNumberOfParticles();l++) // ... on all particles
559 track2= trackEvent2->GetParticle(l);
560 trackpair->SetParticles(track1,track2);
562 if(fPairCut->Pass(trackpair)) //check pair cut
563 { //do not meets crietria of the
564 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
565 else tmptrackpair = trackpair->GetSwapedPair();
569 tmptrackpair = trackpair;
571 for(ii = 0;ii<fNTrackFunctions;ii++)
572 fTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair);
574 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
575 }//for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
578 /***************************************/
581 /*************************************************************************************/
583 void AliHBTAnalysis::ProcessParticles()
585 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
586 //the loops are splited
587 AliHBTParticle * part1, * part2;
589 AliHBTEvent * partEvent;
590 AliHBTEvent * partEvent2;
592 AliHBTPair * partpair = new AliHBTPair();
593 AliHBTPair * tmppartpair; //temporary pointer to the pair
595 Int_t nev = fReader->GetNumberOfPartEvents();
597 /***************************************/
598 /****** Looping same events ********/
599 /****** filling numerators ********/
600 /***************************************/
601 for (Int_t i = 0;i<nev;i++)
603 partEvent= fReader->GetParticleEvent(i);
604 if (!partEvent) continue;
607 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
609 if ( (j%fDisplayMixingInfo) == 0)
610 Info("ProcessParticles",
611 "Mixing particle %d from event %d with particles from event %d",j,i,i);
613 part1= partEvent->GetParticle(j);
614 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
617 for(zz = 0; zz<fNParticleMonitorFunctions; zz++)
618 fParticleMonitorFunctions[zz]->Process(part1);
620 if ( fNParticleFunctions ==0 )
623 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
625 part2= partEvent->GetParticle(k);
626 if (part1->GetUID() == part2->GetUID()) continue; //this is the same particle but different incarnation (PID)
627 partpair->SetParticles(part1,part2);
629 if( fPairCut->Pass(partpair) ) //check pair cut
630 { //do not meets crietria of the pair cut, try with swaped pairs
631 if( fPairCut->Pass(partpair->GetSwapedPair() ) )
632 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
634 { //swaped pair meets all the criteria
635 tmppartpair = partpair->GetSwapedPair();
640 tmppartpair = partpair;
644 for(ii = 0;ii<fNParticleFunctions;ii++)
645 fParticleFunctions[ii]->ProcessSameEventParticles(tmppartpair);
650 /***************************************/
651 /***** Filling diff histogram *********/
652 /***************************************/
653 if (fBufferSize != 0) //less then 0 mix everything, == 0 do not mix denominator
654 for (Int_t i = 0;i<nev-1;i++) //In each event (but last)....
656 if ( fNParticleFunctions ==0 )
659 partEvent= fReader->GetParticleEvent(i);
660 if (!partEvent) continue;
662 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
664 part1= partEvent->GetParticle(j);
665 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
666 Int_t maxeventnumber;
668 if ( ((i+fBufferSize) >= nev) ||( fBufferSize < 0) ) //if buffer size is negative
669 //or current event+buffersize is greater
670 //than max nuber of events
672 maxeventnumber = nev; //set the max event number
676 maxeventnumber = i+fBufferSize; //set the current event number + fBufferSize
679 for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
682 partEvent2= fReader->GetParticleEvent(k);
683 if (!partEvent2) continue;
685 if ( (j%fDisplayMixingInfo) == 0)
686 Info("ProcessParticles",
687 "Mixing particle %d from event %d with particles from event %d",j,i,k);
689 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
691 part2= partEvent2->GetParticle(l);
692 partpair->SetParticles(part1,part2);
694 if(fPairCut->Pass(partpair)) //check pair cut
695 { //do not meets crietria of the
696 if( fPairCut->Pass(partpair->GetSwapedPair()) ) continue;
697 else tmppartpair = partpair->GetSwapedPair();
701 tmppartpair = partpair;
704 for(ii = 0;ii<fNParticleFunctions;ii++)
705 fParticleFunctions[ii]->ProcessDiffEventParticles(tmppartpair);
707 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
708 }//for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
711 /***************************************/
714 /*************************************************************************************/
716 void AliHBTAnalysis::WriteFunctions()
718 //Calls Write for all defined functions in analysis
719 //== writes all results
721 for(ii = 0;ii<fNParticleFunctions;ii++)
722 fParticleFunctions[ii]->Write();
724 for(ii = 0;ii<fNTrackFunctions;ii++)
725 fTrackFunctions[ii]->Write();
727 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
728 fParticleAndTrackFunctions[ii]->Write();
730 for(ii = 0;ii<fNParticleMonitorFunctions;ii++)
731 fParticleMonitorFunctions[ii]->Write();
733 for(ii = 0;ii<fNTrackMonitorFunctions;ii++)
734 fTrackMonitorFunctions[ii]->Write();
736 for(ii = 0;ii<fNParticleAndTrackMonitorFunctions;ii++)
737 fParticleAndTrackMonitorFunctions[ii]->Write();
739 /*************************************************************************************/
741 void AliHBTAnalysis::SetGlobalPairCut(AliHBTPairCut* cut)
743 //Sets the global cut
746 Error("AliHBTAnalysis::SetGlobalPairCut","Pointer is NULL. Ignoring");
749 fPairCut = (AliHBTPairCut*)cut->Clone();
752 /*************************************************************************************/
754 void AliHBTAnalysis::AddTrackFunction(AliHBTOnePairFctn* f)
756 //Adds track function
757 if (f == 0x0) return;
758 if (fNTrackFunctions == fgkFctnArraySize)
760 Error("AliHBTAnalysis::AddTrackFunction","Can not add this function, not enough place in the array.");
762 fTrackFunctions[fNTrackFunctions] = f;
765 /*************************************************************************************/
767 void AliHBTAnalysis::AddParticleFunction(AliHBTOnePairFctn* f)
769 //adds particle function
770 if (f == 0x0) return;
772 if (fNParticleFunctions == fgkFctnArraySize)
774 Error("AliHBTAnalysis::AddParticleFunction","Can not add this function, not enough place in the array.");
776 fParticleFunctions[fNParticleFunctions] = f;
777 fNParticleFunctions++;
779 /*************************************************************************************/
781 void AliHBTAnalysis::AddParticleAndTrackFunction(AliHBTTwoPairFctn* f)
783 //add resolution function
784 if (f == 0x0) return;
785 if (fNParticleAndTrackFunctions == fgkFctnArraySize)
787 Error("AliHBTAnalysis::AddParticleAndTrackFunction","Can not add this function, not enough place in the array.");
789 fParticleAndTrackFunctions[fNParticleAndTrackFunctions] = f;
790 fNParticleAndTrackFunctions++;
792 /*************************************************************************************/
794 void AliHBTAnalysis::AddParticleMonitorFunction(AliHBTMonOneParticleFctn* f)
796 //add particle monitoring function
797 if (f == 0x0) return;
799 if (fNParticleMonitorFunctions == fgkFctnArraySize)
801 Error("AliHBTAnalysis::AddParticleMonitorFunction","Can not add this function, not enough place in the array.");
803 fParticleMonitorFunctions[fNParticleMonitorFunctions] = f;
804 fNParticleMonitorFunctions++;
806 /*************************************************************************************/
808 void AliHBTAnalysis::AddTrackMonitorFunction(AliHBTMonOneParticleFctn* f)
810 //add track monitoring function
811 if (f == 0x0) return;
813 if (fNTrackMonitorFunctions == fgkFctnArraySize)
815 Error("AliHBTAnalysis::AddTrackMonitorFunction","Can not add this function, not enough place in the array.");
817 fTrackMonitorFunctions[fNTrackMonitorFunctions] = f;
818 fNTrackMonitorFunctions++;
820 /*************************************************************************************/
822 void AliHBTAnalysis::AddParticleAndTrackMonitorFunction(AliHBTMonTwoParticleFctn* f)
824 //add resolution monitoring function
825 if (f == 0x0) return;
826 if (fNParticleAndTrackMonitorFunctions == fgkFctnArraySize)
828 Error("AliHBTAnalysis::AddParticleAndTrackMonitorFunction","Can not add this function, not enough place in the array.");
830 fParticleAndTrackMonitorFunctions[fNParticleAndTrackMonitorFunctions] = f;
831 fNParticleAndTrackMonitorFunctions++;
835 /*************************************************************************************/
836 /*************************************************************************************/
838 Bool_t AliHBTAnalysis::RunCoherencyCheck()
840 //Checks if both HBTRuns are similar
841 //return true if error found
842 //if they seem to be OK return false
844 Info("RunCoherencyCheck","Checking HBT Runs Coherency");
846 Info("RunCoherencyCheck","Number of events ...");
847 if (fReader->GetNumberOfPartEvents() == fReader->GetNumberOfTrackEvents() ) //check whether there is the same number of events
849 Info("RunCoherencyCheck","OK. %d found\n",fReader->GetNumberOfTrackEvents());
852 { //if not the same - ERROR
853 Error("AliHBTAnalysis::RunCoherencyCheck()",
854 "Number of simulated events (%d) is not equal to number of reconstructed events(%d)",
855 fReader->GetNumberOfPartEvents(),fReader->GetNumberOfTrackEvents());
859 Info("RunCoherencyCheck","Checking number of Particles AND Particles Types in each event ...");
861 AliHBTEvent *partEvent;
862 AliHBTEvent *trackEvent;
863 for( i = 0; i<fReader->GetNumberOfTrackEvents();i++)
865 partEvent= fReader->GetParticleEvent(i); //gets the "ith" event
866 trackEvent = fReader->GetTrackEvent(i);
868 if ( (partEvent == 0x0) && (partEvent == 0x0) ) continue;
869 if ( (partEvent == 0x0) || (partEvent == 0x0) )
871 Error("AliHBTAnalysis::RunCoherencyCheck()",
872 "One event is NULL and the other one not. Event Number %d",i);
876 if ( partEvent->GetNumberOfParticles() != trackEvent->GetNumberOfParticles() )
878 Error("AliHBTAnalysis::RunCoherencyCheck()",
879 "Event %d: Number of simulated particles (%d) not equal to number of reconstructed tracks (%d)",
880 i,partEvent->GetNumberOfParticles() , trackEvent->GetNumberOfParticles());
884 for (Int_t j = 0; j<partEvent->GetNumberOfParticles(); j++)
886 if( partEvent->GetParticle(j)->GetPdgCode() != trackEvent->GetParticle(j)->GetPdgCode() )
888 Error("AliHBTAnalysis::RunCoherencyCheck()",
889 "Event %d: Particle %d: PID of simulated particle (%d) not the same of reconstructed track (%d)",
890 i,j, partEvent->GetParticle(j)->GetPdgCode(),trackEvent->GetParticle(j)->GetPdgCode() );
896 Info("RunCoherencyCheck"," Done");
897 Info("RunCoherencyCheck"," Everything looks OK");
901 /*************************************************************************************/
903 void AliHBTAnalysis::ProcessTracksAndParticlesNonIdentAnal()
905 //Performs analysis for both, tracks and particles
907 AliHBTParticle * part1, * part2;
908 AliHBTParticle * track1, * track2;
910 AliHBTEvent * trackEvent1=0x0,*partEvent1=0x0;
911 AliHBTEvent * trackEvent2=0x0,*partEvent2=0x0;
912 AliHBTEvent * trackEvent3=0x0,*partEvent3=0x0;
914 AliHBTEvent * rawtrackEvent, *rawpartEvent;
916 Int_t nev = fReader->GetNumberOfTrackEvents();
918 AliHBTPair * trackpair = new AliHBTPair();
919 AliHBTPair * partpair = new AliHBTPair();
926 trackEvent1 = new AliHBTEvent();
927 partEvent1 = new AliHBTEvent();
928 trackEvent1->SetOwner(kFALSE);
929 partEvent1->SetOwner(kFALSE);;
931 Info("ProcessTracksAndParticlesNonIdentAnal","**************************************");
932 Info("ProcessTracksAndParticlesNonIdentAnal","***** NON IDENT MODE ****************");
933 Info("ProcessTracksAndParticlesNonIdentAnal","**************************************");
935 for (Int_t i = 0;i<nev;i++)
937 rawpartEvent = fReader->GetParticleEvent(i);
938 rawtrackEvent = fReader->GetTrackEvent(i);
939 if ( (rawpartEvent == 0x0) || (rawtrackEvent == 0x0) ) continue;//in case of any error
941 /********************************/
943 /********************************/
944 if ( (fBufferSize != 0) || ( (partEvent2==0x0)||(trackEvent2==0x0)) )//in case fBufferSize == 0 and pointers are created do not eneter
945 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
946 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
947 partEvent2 = (AliHBTEvent*)pbuffer.Remove(pbuffer.Last()); //remove from the end to be reset, filled and put on the beginning
948 trackEvent2 = (AliHBTEvent*)tbuffer.Remove(tbuffer.Last());
953 partEvent2 = new AliHBTEvent();
954 trackEvent2 = new AliHBTEvent();
955 partEvent2->SetOwner(kFALSE);
956 trackEvent2->SetOwner(kFALSE);
958 FilterOut(partEvent1, partEvent2, rawpartEvent, trackEvent1, trackEvent2, rawtrackEvent);
960 for (Int_t j = 0; j<partEvent1->GetNumberOfParticles() ; j++)
962 if ( (j%fDisplayMixingInfo) == 0)
963 Info("ProcessTracksAndParticlesNonIdentAnal",
964 "Mixing particle %d from event %d with particles from event %d",j,i,i);
966 part1= partEvent1->GetParticle(j);
967 track1= trackEvent1->GetParticle(j);
969 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
970 fParticleMonitorFunctions[ii]->Process(part1);
971 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
972 fTrackMonitorFunctions[ii]->Process(track1);
973 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
974 fParticleAndTrackMonitorFunctions[ii]->Process(track1,part1);
976 /***************************************/
977 /****** filling numerators ********/
978 /****** (particles from event2) ********/
979 /***************************************/
980 for (Int_t k = 0; k < partEvent2->GetNumberOfParticles() ; k++)
982 part2= partEvent2->GetParticle(k);
983 if (part1->GetUID() == part2->GetUID()) continue;//this is the same particle but with different PID
984 partpair->SetParticles(part1,part2);
986 track2= trackEvent2->GetParticle(k);
987 trackpair->SetParticles(track1,track2);
989 if( (fPairCut->PassPairProp(partpair)) ) //check pair cut
990 { //do not meets crietria of the pair cut
994 {//meets criteria of the pair cut
995 for(ii = 0;ii<fNParticleFunctions;ii++)
996 fParticleFunctions[ii]->ProcessSameEventParticles(partpair);
998 for(ii = 0;ii<fNTrackFunctions;ii++)
999 fTrackFunctions[ii]->ProcessSameEventParticles(trackpair);
1001 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
1002 fParticleAndTrackFunctions[ii]->ProcessSameEventParticles(trackpair,partpair);
1006 if ( fBufferSize == 0) continue;//do not mix diff histograms
1007 /***************************************/
1008 /***** Filling denominators *********/
1009 /***************************************/
1010 TIter piter(&pbuffer);
1011 TIter titer(&tbuffer);
1014 while ( (partEvent3 = (AliHBTEvent*)piter.Next()) != 0x0)
1016 trackEvent3 = (AliHBTEvent*)titer.Next();
1017 if ( (j%fDisplayMixingInfo) == 0)
1018 Info("ProcessTracksAndParticlesNonIdentAnal",
1019 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
1021 for (Int_t k = 0; k < partEvent3->GetNumberOfParticles() ; k++)
1023 part2= partEvent3->GetParticle(k);
1024 partpair->SetParticles(part1,part2);
1026 track2= trackEvent3->GetParticle(k);
1027 trackpair->SetParticles(track1,track2);
1029 if( (fPairCut->PassPairProp(partpair)) ) //check pair cut
1030 { //do not meets crietria of the pair cut
1034 {//meets criteria of the pair cut
1036 for(ii = 0;ii<fNParticleFunctions;ii++)
1037 fParticleFunctions[ii]->ProcessDiffEventParticles(partpair);
1039 for(ii = 0;ii<fNTrackFunctions;ii++)
1040 fTrackFunctions[ii]->ProcessDiffEventParticles(trackpair);
1042 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
1043 fParticleAndTrackFunctions[ii]->ProcessDiffEventParticles(trackpair,partpair);
1045 }// for particles event2
1047 }//for over particles in event1
1049 if ( fBufferSize == 0) continue;//do not mix diff histograms-> do not add to buffer list
1050 pbuffer.AddFirst(partEvent2);
1051 tbuffer.AddFirst(trackEvent2);
1056 }//end of loop over events (1)
1057 pbuffer.SetOwner(); //to clean stored events by the way of buffer destruction
1063 if ( fBufferSize == 0)
1064 {//in that case we did not add these events to list
1070 /*************************************************************************************/
1072 void AliHBTAnalysis::ProcessTracksNonIdentAnal()
1074 //Process Tracks only with non identical mode
1075 AliHBTParticle * track1, * track2;
1077 AliHBTEvent * trackEvent1=0x0;
1078 AliHBTEvent * trackEvent2=0x0;
1079 AliHBTEvent * trackEvent3=0x0;
1082 AliHBTEvent * rawtrackEvent;
1084 Int_t nev = fReader->GetNumberOfTrackEvents();
1086 AliHBTPair * trackpair = new AliHBTPair();
1089 Int_t ninbuffer = 0;
1092 trackEvent1 = new AliHBTEvent();
1093 trackEvent1->SetOwner(kFALSE);
1095 Info("ProcessTracksNonIdentAnal","**************************************");
1096 Info("ProcessTracksNonIdentAnal","***** NON IDENT MODE ****************");
1097 Info("ProcessTracksNonIdentAnal","**************************************");
1099 for (Int_t i = 0;i<nev;i++)
1101 rawtrackEvent = fReader->GetTrackEvent(i);
1102 if (rawtrackEvent == 0x0) continue;//in case of any error
1104 /********************************/
1106 /********************************/
1107 if ( (fBufferSize != 0) || ( trackEvent2==0x0) )//in case fBufferSize == 0 and pointers are created do not eneter
1108 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
1109 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
1110 trackEvent2 = (AliHBTEvent*)tbuffer.Remove(tbuffer.Last());
1115 trackEvent2 = new AliHBTEvent();
1116 trackEvent2->SetOwner(kFALSE);
1118 FilterOut(trackEvent1, trackEvent2, rawtrackEvent);
1120 for (Int_t j = 0; j<trackEvent1->GetNumberOfParticles() ; j++)
1122 if ( (j%fDisplayMixingInfo) == 0)
1123 Info("ProcessTracksNonIdentAnal",
1124 "Mixing particle %d from event %d with particles from event %d",j,i,i);
1126 track1= trackEvent1->GetParticle(j);
1128 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
1129 fTrackMonitorFunctions[ii]->Process(track1);
1131 /***************************************/
1132 /****** filling numerators ********/
1133 /****** (particles from event2) ********/
1134 /***************************************/
1135 for (Int_t k = 0; k < trackEvent2->GetNumberOfParticles() ; k++)
1137 track2= trackEvent2->GetParticle(k);
1138 if (track1->GetUID() == track2->GetUID()) continue;//this is the same particle but with different PID
1139 trackpair->SetParticles(track1,track2);
1142 if( fPairCut->PassPairProp(trackpair)) //check pair cut
1143 { //do not meets crietria of the pair cut
1147 {//meets criteria of the pair cut
1149 for(ii = 0;ii<fNTrackFunctions;ii++)
1150 fTrackFunctions[ii]->ProcessSameEventParticles(trackpair);
1153 if ( fBufferSize == 0) continue;//do not mix diff histograms
1154 /***************************************/
1155 /***** Filling denominators *********/
1156 /***************************************/
1157 TIter titer(&tbuffer);
1160 while ( (trackEvent3 = (AliHBTEvent*)titer.Next()) != 0x0)
1163 if ( (j%fDisplayMixingInfo) == 0)
1164 Info("ProcessTracksNonIdentAnal",
1165 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
1167 for (Int_t k = 0; k < trackEvent3->GetNumberOfParticles() ; k++)
1170 track2= trackEvent3->GetParticle(k);
1171 trackpair->SetParticles(track1,track2);
1174 if( fPairCut->PassPairProp(trackpair)) //check pair cut
1175 { //do not meets crietria of the pair cut
1179 {//meets criteria of the pair cut
1180 for(ii = 0;ii<fNTrackFunctions;ii++)
1181 fTrackFunctions[ii]->ProcessDiffEventParticles(trackpair);
1183 }// for particles event2
1185 }//for over particles in event1
1187 if ( fBufferSize == 0) continue;//do not mix diff histograms
1188 tbuffer.AddFirst(trackEvent2);
1192 }//end of loop over events (1)
1196 if (fBufferSize == 0) delete trackEvent2;
1199 /*************************************************************************************/
1201 void AliHBTAnalysis::ProcessParticlesNonIdentAnal()
1203 //process paricles only with non identical mode
1204 AliHBTParticle * part1 = 0x0, * part2 = 0x0;
1206 AliHBTEvent * partEvent1 = 0x0;
1207 AliHBTEvent * partEvent2 = 0x0;
1208 AliHBTEvent * partEvent3 = 0x0;
1210 AliHBTEvent * rawpartEvent = 0x0;
1212 Int_t nev = fReader->GetNumberOfPartEvents();
1214 AliHBTPair * partpair = new AliHBTPair();
1217 Int_t ninbuffer = 0;
1219 partEvent1 = new AliHBTEvent();
1220 partEvent1->SetOwner(kFALSE);;
1222 Info("ProcessParticlesNonIdentAnal","**************************************");
1223 Info("ProcessParticlesNonIdentAnal","***** NON IDENT MODE ****************");
1224 Info("ProcessParticlesNonIdentAnal","**************************************");
1226 for (Int_t i = 0;i<nev;i++)
1228 rawpartEvent = fReader->GetParticleEvent(i);
1229 if ( rawpartEvent == 0x0 ) continue;//in case of any error
1231 /********************************/
1233 /********************************/
1234 if ( (fBufferSize != 0) || ( partEvent2==0x0) )//in case fBufferSize == 0 and pointers are created do not eneter
1235 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
1236 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
1237 partEvent2 = (AliHBTEvent*)pbuffer.Remove(pbuffer.Last()); //remove from the end to be reset, filled and put on the beginning
1242 partEvent2 = new AliHBTEvent();
1243 partEvent2->SetOwner(kFALSE);
1245 FilterOut(partEvent1, partEvent2, rawpartEvent);
1247 for (Int_t j = 0; j<partEvent1->GetNumberOfParticles() ; j++)
1249 if ( (j%fDisplayMixingInfo) == 0)
1250 Info("ProcessParticlesNonIdentAnal",
1251 "Mixing particle %d from event %d with particles from event %d",j,i,i);
1253 part1= partEvent1->GetParticle(j);
1256 for(zz = 0; zz<fNParticleMonitorFunctions; zz++)
1257 fParticleMonitorFunctions[zz]->Process(part1);
1259 /***************************************/
1260 /****** filling numerators ********/
1261 /****** (particles from event2) ********/
1262 /***************************************/
1263 for (Int_t k = 0; k < partEvent2->GetNumberOfParticles() ; k++)
1265 part2= partEvent2->GetParticle(k);
1266 if (part1->GetUID() == part2->GetUID()) continue;//this is the same particle but with different PID
1267 partpair->SetParticles(part1,part2);
1269 if(fPairCut->PassPairProp(partpair) ) //check pair cut
1270 { //do not meets crietria of the pair cut
1274 {//meets criteria of the pair cut
1276 for(ii = 0;ii<fNParticleFunctions;ii++)
1278 fParticleFunctions[ii]->ProcessSameEventParticles(partpair);
1282 if ( fBufferSize == 0) continue;//do not mix diff histograms
1283 /***************************************/
1284 /***** Filling denominators *********/
1285 /***************************************/
1286 TIter piter(&pbuffer);
1289 while ( (partEvent3 = (AliHBTEvent*)piter.Next()) != 0x0)
1291 if ( (j%fDisplayMixingInfo) == 0)
1292 Info("ProcessParticlesNonIdentAnal",
1293 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
1295 for (Int_t k = 0; k < partEvent3->GetNumberOfParticles() ; k++)
1297 part2= partEvent3->GetParticle(k);
1298 partpair->SetParticles(part1,part2);
1300 if(fPairCut->PassPairProp(partpair) ) //check pair cut
1301 { //do not meets crietria of the pair cut
1305 {//meets criteria of the pair cut
1307 for(ii = 0;ii<fNParticleFunctions;ii++)
1309 fParticleFunctions[ii]->ProcessDiffEventParticles(partpair);
1312 }// for particles event2
1314 }//for over particles in event1
1315 if ( fBufferSize == 0) continue;//do not mix diff histograms
1316 pbuffer.AddFirst(partEvent2);
1320 }//end of loop over events (1)
1323 if ( fBufferSize == 0) delete partEvent2;
1324 pbuffer.SetOwner();//to delete stered events.
1327 /*************************************************************************************/
1328 void AliHBTAnalysis::FilterOut(AliHBTEvent* outpart1, AliHBTEvent* outpart2, AliHBTEvent* inpart,
1329 AliHBTEvent* outtrack1, AliHBTEvent* outtrack2, AliHBTEvent* intrack)
1331 //Puts particles accepted as a first particle by global cut in out1
1332 //and as a second particle in out2
1334 AliHBTParticle* part, *track;
1341 AliHBTParticleCut *cut1 = fPairCut->GetFirstPartCut();
1342 AliHBTParticleCut *cut2 = fPairCut->GetSecondPartCut();
1346 for (Int_t i = 0; i < inpart->GetNumberOfParticles(); i++)
1349 part = inpart->GetParticle(i);
1350 track = intrack->GetParticle(i);
1352 if ( (cut1->Pass(part)) ) in1 = kFALSE; //if part is rejected by cut1, in1 is false
1353 if ( (cut2->Pass(part)) ) in2 = kFALSE; //if part is rejected by cut2, in2 is false
1355 if (gDebug)//to be removed in real analysis
1356 if ( in1 && in2 ) //both cuts accepted, should never happen, just in case
1358 //Particle accpted by both cuts
1359 Error("FilterOut","Particle accepted by both cuts");
1365 outpart1->AddParticle(part);
1366 outtrack1->AddParticle(track);
1372 outpart2->AddParticle(part);
1373 outtrack2->AddParticle(track);
1378 /*************************************************************************************/
1380 void AliHBTAnalysis::FilterOut(AliHBTEvent* out1, AliHBTEvent* out2, AliHBTEvent* in)
1382 //Puts particles accepted as a first particle by global cut in out1
1383 //and as a second particle in out2
1384 AliHBTParticle* part;
1389 AliHBTParticleCut *cut1 = fPairCut->GetFirstPartCut();
1390 AliHBTParticleCut *cut2 = fPairCut->GetSecondPartCut();
1394 for (Int_t i = 0; i < in->GetNumberOfParticles(); i++)
1397 part = in->GetParticle(i);
1399 if ( cut1->Pass(part) ) in1 = kFALSE; //if part is rejected by cut1, in1 is false
1400 if ( cut2->Pass(part) ) in2 = kFALSE; //if part is rejected by cut2, in2 is false
1402 if (gDebug)//to be removed in real analysis
1403 if ( in1 && in2 ) //both cuts accepted, should never happen, just in case
1405 //Particle accpted by both cuts
1406 Error("FilterOut","Particle accepted by both cuts");
1412 out1->AddParticle(part);
1418 out2->AddParticle(part);
1423 /*************************************************************************************/
1425 Bool_t AliHBTAnalysis::IsNonIdentAnalysis()
1427 //checks if it is possible to use special analysis for non identical particles
1428 //it means - in global pair cut first particle id is different than second one
1429 //and both are different from 0
1430 //in the future is possible to perform more sophisticated check
1431 //if cuts have excluding requirements
1433 if (fPairCut->IsEmpty())
1436 if (fPairCut->GetFirstPartCut()->IsEmpty())
1439 if (fPairCut->GetSecondPartCut()->IsEmpty())
1442 Int_t id1 = fPairCut->GetFirstPartCut()->GetPID();
1443 Int_t id2 = fPairCut->GetSecondPartCut()->GetPID();
1445 if ( (id1==0) || (id2==0) || (id1==id2) )