3 #include "AliHBTAnalysis.h"
5 #include "AliHBTEvent.h"
6 #include "AliHBTReader.h"
7 #include "AliHBTParticle.h"
8 #include "AliHBTParticleCut.h"
9 #include "AliHBTPair.h"
10 #include "AliHBTPairCut.h"
11 #include "AliHBTFunction.h"
12 #include "AliHBTMonitorFunction.h"
14 #include <TBenchmark.h>
17 //_________________________________________________________
18 ///////////////////////////////////////////////////////////
20 //Central Object Of HBTAnalyser:
21 //This class performs main looping within HBT Analysis
22 //User must plug a reader of Type AliHBTReader
23 //User plugs in coorelation and monitor functions
24 //as well as monitor functions
26 //HBT Analysis Tool, which is integral part of AliRoot,
27 //ALICE Off-Line framework:
29 //Piotr.Skowronski@cern.ch
30 //more info: http://alisoft.cern.ch/people/skowron/analyzer/index.html
32 //_________________________________________________________
34 ClassImp(AliHBTAnalysis)
36 const UInt_t AliHBTAnalysis::fgkFctnArraySize = 100;
37 const UInt_t AliHBTAnalysis::fgkDefaultMixingInfo = 1000;
38 const Int_t AliHBTAnalysis::fgkDefaultBufferSize = 5;
40 AliHBTAnalysis::AliHBTAnalysis():
43 fNParticleFunctions(0),
44 fNParticleAndTrackFunctions(0),
45 fNTrackMonitorFunctions(0),
46 fNParticleMonitorFunctions(0),
47 fNParticleAndTrackMonitorFunctions(0),
49 fDisplayMixingInfo(fgkDefaultMixingInfo),
53 fTrackFunctions = new AliHBTOnePairFctn* [fgkFctnArraySize];
54 fParticleFunctions = new AliHBTOnePairFctn* [fgkFctnArraySize];
55 fParticleAndTrackFunctions = new AliHBTTwoPairFctn* [fgkFctnArraySize];
57 fParticleMonitorFunctions = new AliHBTMonOneParticleFctn* [fgkFctnArraySize];
58 fTrackMonitorFunctions = new AliHBTMonOneParticleFctn* [fgkFctnArraySize];
59 fParticleAndTrackMonitorFunctions = new AliHBTMonTwoParticleFctn* [fgkFctnArraySize];
61 fPairCut = new AliHBTEmptyPairCut();//empty cut - accepts all particles
63 /*************************************************************************************/
65 AliHBTAnalysis::AliHBTAnalysis(const AliHBTAnalysis& in):
68 fNParticleFunctions(0),
69 fNParticleAndTrackFunctions(0),
70 fNTrackMonitorFunctions(0),
71 fNParticleMonitorFunctions(0),
72 fNParticleAndTrackMonitorFunctions(0),
74 fParticleFunctions(0x0),
75 fParticleAndTrackFunctions(0x0),
76 fParticleMonitorFunctions(0x0),
77 fTrackMonitorFunctions(0x0),
78 fParticleAndTrackMonitorFunctions(0x0),
80 fBufferSize(fgkDefaultBufferSize),
81 fDisplayMixingInfo(fgkDefaultMixingInfo),
85 Fatal("AliHBTAnalysis(const AliHBTAnalysis&)","Sensless");
87 /*************************************************************************************/
88 AliHBTAnalysis& AliHBTAnalysis::operator=(const AliHBTAnalysis& right)
91 Fatal("AliHBTAnalysis(const AliHBTAnalysis&)","Sensless");
94 /*************************************************************************************/
95 AliHBTAnalysis::~AliHBTAnalysis()
98 //note that we do not delete functions itself
99 // they should be deleted by whom where created
100 //we only store pointers, and we use "new" only for pointers array
103 delete [] fTrackFunctions;
104 delete [] fParticleFunctions;
105 delete [] fParticleAndTrackFunctions;
107 delete [] fParticleMonitorFunctions;
108 delete [] fTrackMonitorFunctions;
109 delete [] fParticleAndTrackMonitorFunctions;
111 delete fPairCut; // always have an copy of an object - we create we dstroy
114 /*************************************************************************************/
116 void AliHBTAnalysis::DeleteFunctions()
118 //Deletes all functions added to analysis
120 for(ii = 0;ii<fNParticleFunctions;ii++)
121 delete fParticleFunctions[ii];
122 fNParticleFunctions = 0;
124 for(ii = 0;ii<fNTrackFunctions;ii++)
125 delete fTrackFunctions[ii];
126 fNTrackFunctions = 0;
128 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
129 delete fParticleAndTrackFunctions[ii];
130 fNParticleAndTrackFunctions = 0;
132 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
133 delete fParticleMonitorFunctions[ii];
134 fNParticleMonitorFunctions = 0;
136 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
137 delete fTrackMonitorFunctions[ii];
138 fNTrackMonitorFunctions = 0;
140 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
141 delete fParticleAndTrackMonitorFunctions[ii];
142 fNParticleAndTrackMonitorFunctions = 0;
144 /*************************************************************************************/
146 void AliHBTAnalysis::Init()
148 //Initializeation method
149 //calls Init for all functions
151 for(ii = 0;ii<fNParticleFunctions;ii++)
152 fParticleFunctions[ii]->Init();
154 for(ii = 0;ii<fNTrackFunctions;ii++)
155 fTrackFunctions[ii]->Init();
157 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
158 fParticleAndTrackFunctions[ii]->Init();
160 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
161 fParticleMonitorFunctions[ii]->Init();
163 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
164 fTrackMonitorFunctions[ii]->Init();
166 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
167 fParticleAndTrackMonitorFunctions[ii]->Init();
169 /*************************************************************************************/
171 void AliHBTAnalysis::ResetFunctions()
173 //In case fOwner is true, deletes all functions
174 //in other case, just set number of analysis to 0
175 if (fIsOwner) DeleteFunctions();
178 fNParticleFunctions = 0;
179 fNTrackFunctions = 0;
180 fNParticleAndTrackFunctions = 0;
181 fNParticleMonitorFunctions = 0;
182 fNTrackMonitorFunctions = 0;
183 fNParticleAndTrackMonitorFunctions = 0;
186 /*************************************************************************************/
188 void AliHBTAnalysis::Process(Option_t* option)
190 //default option = "TracksAndParticles"
191 //Main method of the HBT Analysis Package
192 //It triggers reading with the global cut (default is an empty cut)
193 //Than it checks options and data which are read
194 //if everything is OK, then it calls one of the looping methods
195 //depending on tfReaderhe option
196 //These methods differs on what thay are looping on
199 //--------------------------------------------------------------------
200 //ProcessTracksAndParticles - "TracksAndParticles"
202 // it loops over both, tracks(reconstructed) and particles(simulated)
203 // all function gethered in all 3 lists are called for each (double)pair
205 //ProcessTracks - "Tracks"
206 // it loops only on tracks(reconstructed),
207 // functions ONLY from fTrackFunctions list are called
209 //ProcessParticles - "Particles"
210 // it loops only on particles(simulated),
211 // functions ONLY from fParticleAndTrackFunctions list are called
216 Error("Process","The reader is not set");
220 const char *oT = strstr(option,"Tracks");
221 const char *oP = strstr(option,"Particles");
223 Bool_t nonid = IsNonIdentAnalysis();
227 if (fReader->GetNumberOfPartEvents() <1)
229 Error("Process","There is no Particles. Maybe change the option?");
232 if (fReader->GetNumberOfTrackEvents() <1)
234 Error("Process","There is no Tracks. Maybe change the option?");
238 if ( RunCoherencyCheck() )
241 "Coherency check not passed. Maybe change the option?\n");
245 if (nonid) ProcessTracksAndParticlesNonIdentAnal();
246 else ProcessTracksAndParticles();
252 if (fReader->GetNumberOfTrackEvents() <1)
254 Error("Process","There is no data to analyze.");
258 if (nonid) ProcessTracksNonIdentAnal();
259 else ProcessTracks();
265 if (fReader->GetNumberOfPartEvents() <1)
267 Error("Process","There is no data to analyze.");
271 if (nonid) ProcessParticlesNonIdentAnal();
272 else ProcessParticles();
277 /*************************************************************************************/
279 void AliHBTAnalysis::ProcessTracksAndParticles()
281 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
282 //the loops are splited
285 AliHBTParticle * part1, * part2;
286 AliHBTParticle * track1, * track2;
288 AliHBTEvent * trackEvent, *partEvent;
289 AliHBTEvent * trackEvent2,*partEvent2;
291 // Int_t N1, N2, N=0; //number of particles in current event(we prcess two events in one time)
293 Int_t nev = fReader->GetNumberOfTrackEvents();
295 /***************************************/
296 /****** Looping same events ********/
297 /****** filling numerators ********/
298 /***************************************/
299 AliHBTPair * trackpair = new AliHBTPair();
300 AliHBTPair * partpair = new AliHBTPair();
302 AliHBTPair * tmptrackpair;//temprary pointers to pairs
303 AliHBTPair * tmppartpair;
307 for (Int_t i = 0;i<nev;i++)
309 partEvent= fReader->GetParticleEvent(i);
310 trackEvent = fReader->GetTrackEvent(i);
312 if (!partEvent) continue;
316 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
319 if ( (j%fDisplayMixingInfo) == 0)
320 Info("ProcessTracksAndParticles",
321 "Mixing particle %d from event %d with particles from event %d",j,i,i);
323 part1= partEvent->GetParticle(j);
324 track1= trackEvent->GetParticle(j);
326 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
328 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
329 fParticleMonitorFunctions[ii]->Process(part1);
330 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
331 fTrackMonitorFunctions[ii]->Process(track1);
332 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
333 fParticleAndTrackMonitorFunctions[ii]->Process(track1,part1);
335 if ( (fNParticleFunctions == 0) && (fNTrackFunctions ==0) && (fNParticleAndTrackFunctions == 0))
338 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
340 part2= partEvent->GetParticle(k);
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);
373 /***************************************/
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 trackpair->SetParticles(track1,track2);
501 if(fPairCut->Pass(trackpair)) //check pair cut
502 { //do not meets crietria of the
503 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
504 else tmptrackpair = trackpair->GetSwapedPair();
508 tmptrackpair = trackpair;
510 for(ii = 0;ii<fNTrackFunctions;ii++)
511 fTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair);
516 /***************************************/
517 /***** Filling diff histogram *********/
518 /***************************************/
519 if (fBufferSize != 0)
520 for (Int_t i = 0;i<nev-1;i++) //In each event (but last) ....
522 if ( fNTrackFunctions ==0 )
525 trackEvent = fReader->GetTrackEvent(i);
526 if (!trackEvent) continue;
528 for (Int_t j = 0; j< trackEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
530 track1= trackEvent->GetParticle(j);
531 if (fPairCut->GetFirstPartCut()->Pass(track1)) continue;
533 Int_t maxeventnumber;
535 if ( ((i+fBufferSize) >= nev) ||( fBufferSize < 0) ) //if buffer size is negative
536 //or current event+buffersize is greater
537 //than max nuber of events
539 maxeventnumber = nev; //set the max event number
543 maxeventnumber = i+fBufferSize; //set the current event number + fBufferSize
546 for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
548 trackEvent2 = fReader->GetTrackEvent(k);
549 if (!trackEvent2) continue;
551 if ( (j%fDisplayMixingInfo) == 0)
552 Info("ProcessTracks",
553 "Mixing particle %d from event %d with particles from event %d",j,i,k);
555 for(Int_t l = 0; l<trackEvent2->GetNumberOfParticles();l++) // ... on all particles
557 track2= trackEvent2->GetParticle(l);
558 trackpair->SetParticles(track1,track2);
560 if(fPairCut->Pass(trackpair)) //check pair cut
561 { //do not meets crietria of the
562 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
563 else tmptrackpair = trackpair->GetSwapedPair();
567 tmptrackpair = trackpair;
569 for(ii = 0;ii<fNTrackFunctions;ii++)
570 fTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair);
572 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
573 }//for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
576 /***************************************/
579 /*************************************************************************************/
581 void AliHBTAnalysis::ProcessParticles()
583 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
584 //the loops are splited
585 AliHBTParticle * part1, * part2;
587 AliHBTEvent * partEvent;
588 AliHBTEvent * partEvent2;
590 AliHBTPair * partpair = new AliHBTPair();
591 AliHBTPair * tmppartpair; //temporary pointer to the pair
593 Int_t nev = fReader->GetNumberOfPartEvents();
595 /***************************************/
596 /****** Looping same events ********/
597 /****** filling numerators ********/
598 /***************************************/
599 for (Int_t i = 0;i<nev;i++)
601 partEvent= fReader->GetParticleEvent(i);
602 if (!partEvent) continue;
605 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
607 if ( (j%fDisplayMixingInfo) == 0)
608 Info("ProcessParticles",
609 "Mixing particle %d from event %d with particles from event %d",j,i,i);
611 part1= partEvent->GetParticle(j);
612 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
615 for(zz = 0; zz<fNParticleMonitorFunctions; zz++)
616 fParticleMonitorFunctions[zz]->Process(part1);
618 if ( fNParticleFunctions ==0 )
621 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
623 part2= partEvent->GetParticle(k);
624 partpair->SetParticles(part1,part2);
626 if( fPairCut->Pass(partpair) ) //check pair cut
627 { //do not meets crietria of the pair cut, try with swaped pairs
628 if( fPairCut->Pass(partpair->GetSwapedPair() ) )
629 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
631 { //swaped pair meets all the criteria
632 tmppartpair = partpair->GetSwapedPair();
637 tmppartpair = partpair;
641 for(ii = 0;ii<fNParticleFunctions;ii++)
642 fParticleFunctions[ii]->ProcessSameEventParticles(tmppartpair);
647 /***************************************/
648 /***** Filling diff histogram *********/
649 /***************************************/
650 if (fBufferSize != 0) //less then 0 mix everything, == 0 do not mix denominator
651 for (Int_t i = 0;i<nev-1;i++) //In each event (but last)....
653 if ( fNParticleFunctions ==0 )
656 partEvent= fReader->GetParticleEvent(i);
657 if (!partEvent) continue;
659 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
661 part1= partEvent->GetParticle(j);
662 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
663 Int_t maxeventnumber;
665 if ( ((i+fBufferSize) >= nev) ||( fBufferSize < 0) ) //if buffer size is negative
666 //or current event+buffersize is greater
667 //than max nuber of events
669 maxeventnumber = nev; //set the max event number
673 maxeventnumber = i+fBufferSize; //set the current event number + fBufferSize
676 for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
679 partEvent2= fReader->GetParticleEvent(k);
680 if (!partEvent2) continue;
682 if ( (j%fDisplayMixingInfo) == 0)
683 Info("ProcessParticles",
684 "Mixing particle %d from event %d with particles from event %d",j,i,k);
686 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
688 part2= partEvent2->GetParticle(l);
689 partpair->SetParticles(part1,part2);
691 if(fPairCut->Pass(partpair)) //check pair cut
692 { //do not meets crietria of the
693 if( fPairCut->Pass(partpair->GetSwapedPair()) ) continue;
694 else tmppartpair = partpair->GetSwapedPair();
698 tmppartpair = partpair;
701 for(ii = 0;ii<fNParticleFunctions;ii++)
702 fParticleFunctions[ii]->ProcessDiffEventParticles(tmppartpair);
704 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
705 }//for (Int_t k = i+1; k<maxeventnumber;k++) // ... Loop over next event
708 /***************************************/
711 /*************************************************************************************/
713 void AliHBTAnalysis::WriteFunctions()
715 //Calls Write for all defined functions in analysis
716 //== writes all results
718 for(ii = 0;ii<fNParticleFunctions;ii++)
719 fParticleFunctions[ii]->Write();
721 for(ii = 0;ii<fNTrackFunctions;ii++)
722 fTrackFunctions[ii]->Write();
724 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
725 fParticleAndTrackFunctions[ii]->Write();
727 for(ii = 0;ii<fNParticleMonitorFunctions;ii++)
728 fParticleMonitorFunctions[ii]->Write();
730 for(ii = 0;ii<fNTrackMonitorFunctions;ii++)
731 fTrackMonitorFunctions[ii]->Write();
733 for(ii = 0;ii<fNParticleAndTrackMonitorFunctions;ii++)
734 fParticleAndTrackMonitorFunctions[ii]->Write();
736 /*************************************************************************************/
738 void AliHBTAnalysis::SetGlobalPairCut(AliHBTPairCut* cut)
740 //Sets the global cut
743 Error("AliHBTAnalysis::SetGlobalPairCut","Pointer is NULL. Ignoring");
746 fPairCut = (AliHBTPairCut*)cut->Clone();
749 /*************************************************************************************/
751 void AliHBTAnalysis::AddTrackFunction(AliHBTOnePairFctn* f)
753 //Adds track function
754 if (f == 0x0) return;
755 if (fNTrackFunctions == fgkFctnArraySize)
757 Error("AliHBTAnalysis::AddTrackFunction","Can not add this function, not enough place in the array.");
759 fTrackFunctions[fNTrackFunctions] = f;
762 /*************************************************************************************/
764 void AliHBTAnalysis::AddParticleFunction(AliHBTOnePairFctn* f)
766 //adds particle function
767 if (f == 0x0) return;
769 if (fNParticleFunctions == fgkFctnArraySize)
771 Error("AliHBTAnalysis::AddParticleFunction","Can not add this function, not enough place in the array.");
773 fParticleFunctions[fNParticleFunctions] = f;
774 fNParticleFunctions++;
776 /*************************************************************************************/
778 void AliHBTAnalysis::AddParticleAndTrackFunction(AliHBTTwoPairFctn* f)
780 //add resolution function
781 if (f == 0x0) return;
782 if (fNParticleAndTrackFunctions == fgkFctnArraySize)
784 Error("AliHBTAnalysis::AddParticleAndTrackFunction","Can not add this function, not enough place in the array.");
786 fParticleAndTrackFunctions[fNParticleAndTrackFunctions] = f;
787 fNParticleAndTrackFunctions++;
789 /*************************************************************************************/
791 void AliHBTAnalysis::AddParticleMonitorFunction(AliHBTMonOneParticleFctn* f)
793 //add particle monitoring function
794 if (f == 0x0) return;
796 if (fNParticleMonitorFunctions == fgkFctnArraySize)
798 Error("AliHBTAnalysis::AddParticleMonitorFunction","Can not add this function, not enough place in the array.");
800 fParticleMonitorFunctions[fNParticleMonitorFunctions] = f;
801 fNParticleMonitorFunctions++;
803 /*************************************************************************************/
805 void AliHBTAnalysis::AddTrackMonitorFunction(AliHBTMonOneParticleFctn* f)
807 //add track monitoring function
808 if (f == 0x0) return;
810 if (fNTrackMonitorFunctions == fgkFctnArraySize)
812 Error("AliHBTAnalysis::AddTrackMonitorFunction","Can not add this function, not enough place in the array.");
814 fTrackMonitorFunctions[fNTrackMonitorFunctions] = f;
815 fNTrackMonitorFunctions++;
817 /*************************************************************************************/
819 void AliHBTAnalysis::AddParticleAndTrackMonitorFunction(AliHBTMonTwoParticleFctn* f)
821 //add resolution monitoring function
822 if (f == 0x0) return;
823 if (fNParticleAndTrackMonitorFunctions == fgkFctnArraySize)
825 Error("AliHBTAnalysis::AddParticleAndTrackMonitorFunction","Can not add this function, not enough place in the array.");
827 fParticleAndTrackMonitorFunctions[fNParticleAndTrackMonitorFunctions] = f;
828 fNParticleAndTrackMonitorFunctions++;
832 /*************************************************************************************/
833 /*************************************************************************************/
835 Bool_t AliHBTAnalysis::RunCoherencyCheck()
837 //Checks if both HBTRuns are similar
838 //return true if error found
839 //if they seem to be OK return false
841 Info("RunCoherencyCheck","Checking HBT Runs Coherency");
843 Info("RunCoherencyCheck","Number of events ...");
844 if (fReader->GetNumberOfPartEvents() == fReader->GetNumberOfTrackEvents() ) //check whether there is the same number of events
846 Info("RunCoherencyCheck","OK. %d found\n",fReader->GetNumberOfTrackEvents());
849 { //if not the same - ERROR
850 Error("AliHBTAnalysis::RunCoherencyCheck()",
851 "Number of simulated events (%d) is not equal to number of reconstructed events(%d)",
852 fReader->GetNumberOfPartEvents(),fReader->GetNumberOfTrackEvents());
856 Info("RunCoherencyCheck","Checking number of Particles AND Particles Types in each event ...");
858 AliHBTEvent *partEvent;
859 AliHBTEvent *trackEvent;
860 for( i = 0; i<fReader->GetNumberOfTrackEvents();i++)
862 partEvent= fReader->GetParticleEvent(i); //gets the "ith" event
863 trackEvent = fReader->GetTrackEvent(i);
865 if ( (partEvent == 0x0) && (partEvent == 0x0) ) continue;
866 if ( (partEvent == 0x0) || (partEvent == 0x0) )
868 Error("AliHBTAnalysis::RunCoherencyCheck()",
869 "One event is NULL and the other one not. Event Number %d",i);
873 if ( partEvent->GetNumberOfParticles() != trackEvent->GetNumberOfParticles() )
875 Error("AliHBTAnalysis::RunCoherencyCheck()",
876 "Event %d: Number of simulated particles (%d) not equal to number of reconstructed tracks (%d)",
877 i,partEvent->GetNumberOfParticles() , trackEvent->GetNumberOfParticles());
881 for (Int_t j = 0; j<partEvent->GetNumberOfParticles(); j++)
883 if( partEvent->GetParticle(j)->GetPdgCode() != trackEvent->GetParticle(j)->GetPdgCode() )
885 Error("AliHBTAnalysis::RunCoherencyCheck()",
886 "Event %d: Particle %d: PID of simulated particle (%d) not the same of reconstructed track (%d)",
887 i,j, partEvent->GetParticle(j)->GetPdgCode(),trackEvent->GetParticle(j)->GetPdgCode() );
893 Info("RunCoherencyCheck"," Done");
894 Info("RunCoherencyCheck"," Everything looks OK");
898 /*************************************************************************************/
900 void AliHBTAnalysis::ProcessTracksAndParticlesNonIdentAnal()
902 //Performs analysis for both, tracks and particles
904 AliHBTParticle * part1, * part2;
905 AliHBTParticle * track1, * track2;
907 AliHBTEvent * trackEvent1=0x0,*partEvent1=0x0;
908 AliHBTEvent * trackEvent2=0x0,*partEvent2=0x0;
909 AliHBTEvent * trackEvent3=0x0,*partEvent3=0x0;
911 AliHBTEvent * rawtrackEvent, *rawpartEvent;
913 Int_t nev = fReader->GetNumberOfTrackEvents();
915 AliHBTPair * trackpair = new AliHBTPair();
916 AliHBTPair * partpair = new AliHBTPair();
923 trackEvent1 = new AliHBTEvent();
924 partEvent1 = new AliHBTEvent();
925 trackEvent1->SetOwner(kFALSE);
926 partEvent1->SetOwner(kFALSE);;
928 Info("ProcessTracksAndParticlesNonIdentAnal","**************************************");
929 Info("ProcessTracksAndParticlesNonIdentAnal","***** NON IDENT MODE ****************");
930 Info("ProcessTracksAndParticlesNonIdentAnal","**************************************");
932 for (Int_t i = 0;i<nev;i++)
934 rawpartEvent = fReader->GetParticleEvent(i);
935 rawtrackEvent = fReader->GetTrackEvent(i);
936 if ( (rawpartEvent == 0x0) || (rawtrackEvent == 0x0) ) continue;//in case of any error
938 /********************************/
940 /********************************/
941 if ( (fBufferSize != 0) || ( (partEvent2==0x0)||(trackEvent2==0x0)) )//in case fBufferSize == 0 and pointers are created do not eneter
942 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
943 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
944 partEvent2 = (AliHBTEvent*)pbuffer.Remove(pbuffer.Last()); //remove from the end to be reset, filled and put on the beginning
945 trackEvent2 = (AliHBTEvent*)tbuffer.Remove(tbuffer.Last());
950 partEvent2 = new AliHBTEvent();
951 trackEvent2 = new AliHBTEvent();
952 partEvent2->SetOwner(kFALSE);
953 trackEvent2->SetOwner(kFALSE);
955 FilterOut(partEvent1, partEvent2, rawpartEvent, trackEvent1, trackEvent2, rawtrackEvent);
957 for (Int_t j = 0; j<partEvent1->GetNumberOfParticles() ; j++)
959 if ( (j%fDisplayMixingInfo) == 0)
960 Info("ProcessTracksAndParticlesNonIdentAnal",
961 "Mixing particle %d from event %d with particles from event %d",j,i,i);
963 part1= partEvent1->GetParticle(j);
964 track1= trackEvent1->GetParticle(j);
966 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
967 fParticleMonitorFunctions[ii]->Process(part1);
968 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
969 fTrackMonitorFunctions[ii]->Process(track1);
970 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
971 fParticleAndTrackMonitorFunctions[ii]->Process(track1,part1);
973 /***************************************/
974 /****** filling numerators ********/
975 /****** (particles from event2) ********/
976 /***************************************/
977 for (Int_t k = 0; k < partEvent2->GetNumberOfParticles() ; k++)
979 part2= partEvent2->GetParticle(k);
980 partpair->SetParticles(part1,part2);
982 track2= trackEvent2->GetParticle(k);
983 trackpair->SetParticles(track1,track2);
985 if( (fPairCut->PassPairProp(partpair)) ) //check pair cut
986 { //do not meets crietria of the pair cut
990 {//meets criteria of the pair cut
991 for(ii = 0;ii<fNParticleFunctions;ii++)
992 fParticleFunctions[ii]->ProcessSameEventParticles(partpair);
994 for(ii = 0;ii<fNTrackFunctions;ii++)
995 fTrackFunctions[ii]->ProcessSameEventParticles(trackpair);
997 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
998 fParticleAndTrackFunctions[ii]->ProcessSameEventParticles(trackpair,partpair);
1002 if ( fBufferSize == 0) continue;//do not mix diff histograms
1003 /***************************************/
1004 /***** Filling denominators *********/
1005 /***************************************/
1006 TIter piter(&pbuffer);
1007 TIter titer(&tbuffer);
1010 while ( (partEvent3 = (AliHBTEvent*)piter.Next()) != 0x0)
1012 trackEvent3 = (AliHBTEvent*)titer.Next();
1013 if ( (j%fDisplayMixingInfo) == 0)
1014 Info("ProcessTracksAndParticlesNonIdentAnal",
1015 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
1017 for (Int_t k = 0; k < partEvent3->GetNumberOfParticles() ; k++)
1019 part2= partEvent3->GetParticle(k);
1020 partpair->SetParticles(part1,part2);
1022 track2= trackEvent3->GetParticle(k);
1023 trackpair->SetParticles(track1,track2);
1025 if( (fPairCut->PassPairProp(partpair)) ) //check pair cut
1026 { //do not meets crietria of the pair cut
1030 {//meets criteria of the pair cut
1032 for(ii = 0;ii<fNParticleFunctions;ii++)
1033 fParticleFunctions[ii]->ProcessDiffEventParticles(partpair);
1035 for(ii = 0;ii<fNTrackFunctions;ii++)
1036 fTrackFunctions[ii]->ProcessDiffEventParticles(trackpair);
1038 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
1039 fParticleAndTrackFunctions[ii]->ProcessDiffEventParticles(trackpair,partpair);
1041 }// for particles event2
1043 }//for over particles in event1
1045 if ( fBufferSize == 0) continue;//do not mix diff histograms-> do not add to buffer list
1046 pbuffer.AddFirst(partEvent2);
1047 tbuffer.AddFirst(trackEvent2);
1052 }//end of loop over events (1)
1053 pbuffer.SetOwner(); //to clean stored events by the way of buffer destruction
1059 if ( fBufferSize == 0)
1060 {//in that case we did not add these events to list
1066 /*************************************************************************************/
1068 void AliHBTAnalysis::ProcessTracksNonIdentAnal()
1070 //Process Tracks only with non identical mode
1071 AliHBTParticle * track1, * track2;
1073 AliHBTEvent * trackEvent1=0x0;
1074 AliHBTEvent * trackEvent2=0x0;
1075 AliHBTEvent * trackEvent3=0x0;
1077 AliHBTEvent * rawtrackEvent;
1079 Int_t nev = fReader->GetNumberOfTrackEvents();
1081 AliHBTPair * trackpair = new AliHBTPair();
1084 Int_t ninbuffer = 0;
1087 trackEvent1 = new AliHBTEvent();
1088 trackEvent1->SetOwner(kFALSE);
1090 Info("ProcessTracksNonIdentAnal","**************************************");
1091 Info("ProcessTracksNonIdentAnal","***** NON IDENT MODE ****************");
1092 Info("ProcessTracksNonIdentAnal","**************************************");
1094 for (Int_t i = 0;i<nev;i++)
1096 rawtrackEvent = fReader->GetTrackEvent(i);
1097 if (rawtrackEvent == 0x0) continue;//in case of any error
1099 /********************************/
1101 /********************************/
1102 if ( (fBufferSize != 0) || ( trackEvent2==0x0) )//in case fBufferSize == 0 and pointers are created do not eneter
1103 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
1104 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
1105 trackEvent2 = (AliHBTEvent*)tbuffer.Remove(tbuffer.Last());
1110 trackEvent2 = new AliHBTEvent();
1111 trackEvent2->SetOwner(kFALSE);
1113 FilterOut(trackEvent1, trackEvent2, rawtrackEvent);
1115 for (Int_t j = 0; j<trackEvent1->GetNumberOfParticles() ; j++)
1117 if ( (j%fDisplayMixingInfo) == 0)
1118 Info("ProcessTracksNonIdentAnal",
1119 "Mixing particle %d from event %d with particles from event %d",j,i,i);
1121 track1= trackEvent1->GetParticle(j);
1123 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
1124 fTrackMonitorFunctions[ii]->Process(track1);
1126 /***************************************/
1127 /****** filling numerators ********/
1128 /****** (particles from event2) ********/
1129 /***************************************/
1130 for (Int_t k = 0; k < trackEvent2->GetNumberOfParticles() ; k++)
1132 track2= trackEvent2->GetParticle(k);
1133 trackpair->SetParticles(track1,track2);
1136 if( fPairCut->PassPairProp(trackpair)) //check pair cut
1137 { //do not meets crietria of the pair cut
1141 {//meets criteria of the pair cut
1143 for(ii = 0;ii<fNTrackFunctions;ii++)
1144 fTrackFunctions[ii]->ProcessSameEventParticles(trackpair);
1147 if ( fBufferSize == 0) continue;//do not mix diff histograms
1148 /***************************************/
1149 /***** Filling denominators *********/
1150 /***************************************/
1151 TIter titer(&tbuffer);
1154 while ( (trackEvent3 = (AliHBTEvent*)titer.Next()) != 0x0)
1157 if ( (j%fDisplayMixingInfo) == 0)
1158 Info("ProcessTracksNonIdentAnal",
1159 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
1161 for (Int_t k = 0; k < trackEvent3->GetNumberOfParticles() ; k++)
1164 track2= trackEvent3->GetParticle(k);
1165 trackpair->SetParticles(track1,track2);
1168 if( fPairCut->PassPairProp(trackpair)) //check pair cut
1169 { //do not meets crietria of the pair cut
1173 {//meets criteria of the pair cut
1174 for(ii = 0;ii<fNTrackFunctions;ii++)
1175 fTrackFunctions[ii]->ProcessDiffEventParticles(trackpair);
1177 }// for particles event2
1179 }//for over particles in event1
1181 if ( fBufferSize == 0) continue;//do not mix diff histograms
1182 tbuffer.AddFirst(trackEvent2);
1186 }//end of loop over events (1)
1190 if (fBufferSize == 0) delete trackEvent2;
1193 /*************************************************************************************/
1195 void AliHBTAnalysis::ProcessParticlesNonIdentAnal()
1197 //process paricles only with non identical mode
1198 AliHBTParticle * part1 = 0x0, * part2 = 0x0;
1200 AliHBTEvent * partEvent1 = 0x0;
1201 AliHBTEvent * partEvent2 = 0x0;
1202 AliHBTEvent * partEvent3 = 0x0;
1204 AliHBTEvent * rawpartEvent = 0x0;
1206 Int_t nev = fReader->GetNumberOfPartEvents();
1208 AliHBTPair * partpair = new AliHBTPair();
1211 Int_t ninbuffer = 0;
1213 partEvent1 = new AliHBTEvent();
1214 partEvent1->SetOwner(kFALSE);;
1216 Info("ProcessParticlesNonIdentAnal","**************************************");
1217 Info("ProcessParticlesNonIdentAnal","***** NON IDENT MODE ****************");
1218 Info("ProcessParticlesNonIdentAnal","**************************************");
1220 for (Int_t i = 0;i<nev;i++)
1222 rawpartEvent = fReader->GetParticleEvent(i);
1223 if ( rawpartEvent == 0x0 ) continue;//in case of any error
1225 /********************************/
1227 /********************************/
1228 if ( (fBufferSize != 0) || ( partEvent2==0x0) )//in case fBufferSize == 0 and pointers are created do not eneter
1229 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
1230 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
1231 partEvent2 = (AliHBTEvent*)pbuffer.Remove(pbuffer.Last()); //remove from the end to be reset, filled and put on the beginning
1236 partEvent2 = new AliHBTEvent();
1237 partEvent2->SetOwner(kFALSE);
1239 FilterOut(partEvent1, partEvent2, rawpartEvent);
1241 for (Int_t j = 0; j<partEvent1->GetNumberOfParticles() ; j++)
1243 if ( (j%fDisplayMixingInfo) == 0)
1244 Info("ProcessParticlesNonIdentAnal",
1245 "Mixing particle %d from event %d with particles from event %d",j,i,i);
1247 part1= partEvent1->GetParticle(j);
1250 for(zz = 0; zz<fNParticleMonitorFunctions; zz++)
1251 fParticleMonitorFunctions[zz]->Process(part1);
1253 /***************************************/
1254 /****** filling numerators ********/
1255 /****** (particles from event2) ********/
1256 /***************************************/
1257 for (Int_t k = 0; k < partEvent2->GetNumberOfParticles() ; k++)
1259 part2= partEvent2->GetParticle(k);
1260 partpair->SetParticles(part1,part2);
1262 if(fPairCut->PassPairProp(partpair) ) //check pair cut
1263 { //do not meets crietria of the pair cut
1267 {//meets criteria of the pair cut
1269 for(ii = 0;ii<fNParticleFunctions;ii++)
1271 fParticleFunctions[ii]->ProcessSameEventParticles(partpair);
1275 if ( fBufferSize == 0) continue;//do not mix diff histograms
1276 /***************************************/
1277 /***** Filling denominators *********/
1278 /***************************************/
1279 TIter piter(&pbuffer);
1282 while ( (partEvent3 = (AliHBTEvent*)piter.Next()) != 0x0)
1284 if ( (j%fDisplayMixingInfo) == 0)
1285 Info("ProcessParticlesNonIdentAnal",
1286 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
1288 for (Int_t k = 0; k < partEvent3->GetNumberOfParticles() ; k++)
1290 part2= partEvent3->GetParticle(k);
1291 partpair->SetParticles(part1,part2);
1293 if(fPairCut->PassPairProp(partpair) ) //check pair cut
1294 { //do not meets crietria of the pair cut
1298 {//meets criteria of the pair cut
1300 for(ii = 0;ii<fNParticleFunctions;ii++)
1302 fParticleFunctions[ii]->ProcessDiffEventParticles(partpair);
1305 }// for particles event2
1307 }//for over particles in event1
1308 if ( fBufferSize == 0) continue;//do not mix diff histograms
1309 pbuffer.AddFirst(partEvent2);
1313 }//end of loop over events (1)
1316 if ( fBufferSize == 0) delete partEvent2;
1317 pbuffer.SetOwner();//to delete stered events.
1320 /*************************************************************************************/
1321 void AliHBTAnalysis::FilterOut(AliHBTEvent* outpart1, AliHBTEvent* outpart2, AliHBTEvent* inpart,
1322 AliHBTEvent* outtrack1, AliHBTEvent* outtrack2, AliHBTEvent* intrack)
1324 //Puts particles accepted as a first particle by global cut in out1
1325 //and as a second particle in out2
1327 AliHBTParticle* part, *track;
1334 AliHBTParticleCut *cut1 = fPairCut->GetFirstPartCut();
1335 AliHBTParticleCut *cut2 = fPairCut->GetSecondPartCut();
1339 for (Int_t i = 0; i < inpart->GetNumberOfParticles(); i++)
1342 part = inpart->GetParticle(i);
1343 track = intrack->GetParticle(i);
1345 if ( (cut1->Pass(part)) ) in1 = kFALSE; //if part is rejected by cut1, in1 is false
1346 if ( (cut2->Pass(part)) ) in2 = kFALSE; //if part is rejected by cut2, in2 is false
1348 if (gDebug)//to be removed in real analysis
1349 if ( in1 && in2 ) //both cuts accepted, should never happen, just in case
1351 //Particle accpted by both cuts
1352 Error("FilterOut","Particle accepted by both cuts");
1358 outpart1->AddParticle(part);
1359 outtrack1->AddParticle(track);
1365 outpart2->AddParticle(part);
1366 outtrack2->AddParticle(track);
1371 /*************************************************************************************/
1373 void AliHBTAnalysis::FilterOut(AliHBTEvent* out1, AliHBTEvent* out2, AliHBTEvent* in)
1375 //Puts particles accepted as a first particle by global cut in out1
1376 //and as a second particle in out2
1377 AliHBTParticle* part;
1382 AliHBTParticleCut *cut1 = fPairCut->GetFirstPartCut();
1383 AliHBTParticleCut *cut2 = fPairCut->GetSecondPartCut();
1387 for (Int_t i = 0; i < in->GetNumberOfParticles(); i++)
1390 part = in->GetParticle(i);
1392 if ( cut1->Pass(part) ) in1 = kFALSE; //if part is rejected by cut1, in1 is false
1393 if ( cut2->Pass(part) ) in2 = kFALSE; //if part is rejected by cut2, in2 is false
1395 if (gDebug)//to be removed in real analysis
1396 if ( in1 && in2 ) //both cuts accepted, should never happen, just in case
1398 //Particle accpted by both cuts
1399 Error("FilterOut","Particle accepted by both cuts");
1405 out1->AddParticle(part);
1411 out2->AddParticle(part);
1416 /*************************************************************************************/
1418 Bool_t AliHBTAnalysis::IsNonIdentAnalysis()
1420 //checks if it is possible to use special analysis for non identical particles
1421 //it means - in global pair cut first particle id is different than second one
1422 //and both are different from 0
1423 //in the future is possible to perform more sophisticated check
1424 //if cuts have excluding requirements
1426 if (fPairCut->IsEmpty())
1429 if (fPairCut->GetFirstPartCut()->IsEmpty())
1432 if (fPairCut->GetSecondPartCut()->IsEmpty())
1435 Int_t id1 = fPairCut->GetFirstPartCut()->GetPID();
1436 Int_t id2 = fPairCut->GetSecondPartCut()->GetPID();
1438 if ( (id1==0) || (id2==0) || (id1==id2) )