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),
50 fTrackFunctions = new AliHBTOnePairFctn* [fgkFctnArraySize];
51 fParticleFunctions = new AliHBTOnePairFctn* [fgkFctnArraySize];
52 fParticleAndTrackFunctions = new AliHBTTwoPairFctn* [fgkFctnArraySize];
54 fParticleMonitorFunctions = new AliHBTMonOneParticleFctn* [fgkFctnArraySize];
55 fTrackMonitorFunctions = new AliHBTMonOneParticleFctn* [fgkFctnArraySize];
56 fParticleAndTrackMonitorFunctions = new AliHBTMonTwoParticleFctn* [fgkFctnArraySize];
58 fPairCut = new AliHBTEmptyPairCut();//empty cut - accepts all particles
60 /*************************************************************************************/
62 AliHBTAnalysis::AliHBTAnalysis(const AliHBTAnalysis& in):
65 fNParticleFunctions(0),
66 fNParticleAndTrackFunctions(0),
67 fNTrackMonitorFunctions(0),
68 fNParticleMonitorFunctions(0),
69 fNParticleAndTrackMonitorFunctions(0),
71 fParticleFunctions(0x0),
72 fParticleAndTrackFunctions(0x0),
73 fParticleMonitorFunctions(0x0),
74 fTrackMonitorFunctions(0x0),
75 fParticleAndTrackMonitorFunctions(0x0),
77 fBufferSize(fgkDefaultBufferSize),
78 fDisplayMixingInfo(fgkDefaultMixingInfo),
81 Fatal("AliHBTAnalysis(const AliHBTAnalysis&)","Sensless");
83 /*************************************************************************************/
84 const AliHBTAnalysis& AliHBTAnalysis::operator=(const AliHBTAnalysis& right)
86 Fatal("AliHBTAnalysis(const AliHBTAnalysis&)","Sensless");
89 /*************************************************************************************/
90 AliHBTAnalysis::~AliHBTAnalysis()
93 //note that we do not delete functions itself
94 // they should be deleted by whom where created
95 //we only store pointers, and we use "new" only for pointers array
98 delete [] fTrackFunctions;
99 delete [] fParticleFunctions;
100 delete [] fParticleAndTrackFunctions;
102 delete [] fParticleMonitorFunctions;
103 delete [] fTrackMonitorFunctions;
104 delete [] fParticleAndTrackMonitorFunctions;
106 delete fPairCut; // always have an copy of an object - we create we dstroy
109 /*************************************************************************************/
111 void AliHBTAnalysis::DeleteFunctions()
113 //Deletes all functions added to analysis
115 for(ii = 0;ii<fNParticleFunctions;ii++)
116 delete fParticleFunctions[ii];
117 fNParticleFunctions = 0;
119 for(ii = 0;ii<fNTrackFunctions;ii++)
120 delete fTrackFunctions[ii];
121 fNTrackFunctions = 0;
123 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
124 delete fParticleAndTrackFunctions[ii];
125 fNParticleAndTrackFunctions = 0;
127 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
128 delete fParticleMonitorFunctions[ii];
129 fNParticleMonitorFunctions = 0;
131 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
132 delete fTrackMonitorFunctions[ii];
133 fNTrackMonitorFunctions = 0;
135 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
136 delete fParticleAndTrackMonitorFunctions[ii];
137 fNParticleAndTrackMonitorFunctions = 0;
139 /*************************************************************************************/
141 void AliHBTAnalysis::Init()
144 for(ii = 0;ii<fNParticleFunctions;ii++)
145 fParticleFunctions[ii]->Init();
147 for(ii = 0;ii<fNTrackFunctions;ii++)
148 fTrackFunctions[ii]->Init();
150 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
151 fParticleAndTrackFunctions[ii]->Init();
153 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
154 fParticleMonitorFunctions[ii]->Init();
156 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
157 fTrackMonitorFunctions[ii]->Init();
159 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
160 fParticleAndTrackMonitorFunctions[ii]->Init();
162 /*************************************************************************************/
164 void AliHBTAnalysis::ResetFunctions()
166 //In case fOwner is true, deletes all functions
167 //in other case, just set number of analysis to 0
168 if (fIsOwner) DeleteFunctions();
171 fNParticleFunctions = 0;
172 fNTrackFunctions = 0;
173 fNParticleAndTrackFunctions = 0;
174 fNParticleMonitorFunctions = 0;
175 fNTrackMonitorFunctions = 0;
176 fNParticleAndTrackMonitorFunctions = 0;
179 /*************************************************************************************/
181 void AliHBTAnalysis::Process(Option_t* option)
183 //default option = "TracksAndParticles"
184 //Main method of the HBT Analysis Package
185 //It triggers reading with the global cut (default is an empty cut)
186 //Than it checks options and data which are read
187 //if everything is OK, then it calls one of the looping methods
188 //depending on tfReaderhe option
189 //These methods differs on what thay are looping on
192 //--------------------------------------------------------------------
193 //ProcessTracksAndParticles - "TracksAndParticles"
195 // it loops over both, tracks(reconstructed) and particles(simulated)
196 // all function gethered in all 3 lists are called for each (double)pair
198 //ProcessTracks - "Tracks"
199 // it loops only on tracks(reconstructed),
200 // functions ONLY from fTrackFunctions list are called
202 //ProcessParticles - "Particles"
203 // it loops only on particles(simulated),
204 // functions ONLY from fParticleAndTrackFunctions list are called
209 Error("Process","The reader is not set");
213 const char *oT = strstr(option,"Tracks");
214 const char *oP = strstr(option,"Particles");
216 Bool_t nonid = IsNonIdentAnalysis();
220 if (fReader->GetNumberOfPartEvents() <1)
222 Error("Process","There is no Particles. Maybe change the option?");
225 if (fReader->GetNumberOfTrackEvents() <1)
227 Error("Process","There is no Tracks. Maybe change the option?");
231 if ( RunCoherencyCheck() )
234 "Coherency check not passed. Maybe change the option?\n");
238 if (nonid) ProcessTracksAndParticlesNonIdentAnal();
239 else ProcessTracksAndParticles();
245 if (fReader->GetNumberOfTrackEvents() <1)
247 Error("Process","There is no data to analyze.");
251 if (nonid) ProcessTracksNonIdentAnal();
252 else ProcessTracks();
258 if (fReader->GetNumberOfPartEvents() <1)
260 Error("Process","There is no data to analyze.");
264 if (nonid) ProcessParticlesNonIdentAnal();
265 else ProcessParticles();
270 /*************************************************************************************/
272 void AliHBTAnalysis::ProcessTracksAndParticles()
275 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
276 //the loops are splited
279 AliHBTParticle * part1, * part2;
280 AliHBTParticle * track1, * track2;
282 AliHBTEvent * trackEvent, *partEvent;
283 AliHBTEvent * trackEvent2,*partEvent2;
285 // Int_t N1, N2, N=0; //number of particles in current event(we prcess two events in one time)
287 Int_t Nev = fReader->GetNumberOfTrackEvents();
289 /***************************************/
290 /****** Looping same events ********/
291 /****** filling numerators ********/
292 /***************************************/
293 AliHBTPair * trackpair = new AliHBTPair();
294 AliHBTPair * partpair = new AliHBTPair();
296 AliHBTPair * tmptrackpair;//temprary pointers to pairs
297 AliHBTPair * tmppartpair;
301 for (Int_t i = 0;i<Nev;i++)
303 partEvent= fReader->GetParticleEvent(i);
304 trackEvent = fReader->GetTrackEvent(i);
306 if (!partEvent) continue;
310 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
313 if ( (j%fDisplayMixingInfo) == 0)
314 Info("ProcessTracksAndParticles",
315 "Mixing particle %d from event %d with particles from event %d",j,i,i);
317 part1= partEvent->GetParticle(j);
318 track1= trackEvent->GetParticle(j);
320 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
322 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
323 fParticleMonitorFunctions[ii]->Process(part1);
324 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
325 fTrackMonitorFunctions[ii]->Process(track1);
326 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
327 fParticleAndTrackMonitorFunctions[ii]->Process(track1,part1);
329 if ( (fNParticleFunctions == 0) && (fNTrackFunctions ==0) && (fNParticleAndTrackFunctions == 0))
332 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
334 part2= partEvent->GetParticle(k);
335 partpair->SetParticles(part1,part2);
337 track2= trackEvent->GetParticle(k);
338 trackpair->SetParticles(track1,track2);
340 if(fPairCut->Pass(partpair) ) //check pair cut
341 { //do not meets crietria of the pair cut, try with swaped pairs
342 if( fPairCut->Pass(partpair->GetSwapedPair()) )
343 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
345 { //swaped pair meets all the criteria
346 tmppartpair = partpair->GetSwapedPair();
347 tmptrackpair = trackpair->GetSwapedPair();
351 {//meets criteria of the pair cut
352 tmptrackpair = trackpair;
353 tmppartpair = partpair;
355 for(ii = 0;ii<fNParticleFunctions;ii++)
356 fParticleFunctions[ii]->ProcessSameEventParticles(tmppartpair);
358 for(ii = 0;ii<fNTrackFunctions;ii++)
359 fTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair);
361 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
362 fParticleAndTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair,tmppartpair);
367 /***************************************/
368 /***** Filling denominators *********/
369 /***************************************/
370 if (fBufferSize != 0)
371 for (Int_t i = 0;i<Nev-1;i++) //In each event (but last) ....
374 if ((fNParticleFunctions == 0) && (fNTrackFunctions ==0) && (fNParticleAndTrackFunctions == 0))
377 partEvent= fReader->GetParticleEvent(i);
378 if (!partEvent) continue;
380 trackEvent = fReader->GetTrackEvent(i);
382 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
384 part1= partEvent->GetParticle(j);
385 track1= trackEvent->GetParticle(j);
387 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
391 if ( ((i+fBufferSize) >= Nev) ||( fBufferSize < 0) ) //if buffer size is negative
392 //or current event+buffersize is greater
393 //than max nuber of events
395 NNN = Nev; //set the max event number
399 NNN = i+fBufferSize; //set the current event number + fBufferSize
402 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
405 partEvent2= fReader->GetParticleEvent(k);
406 if (!partEvent2) continue;
408 trackEvent2 = fReader->GetTrackEvent(k);
410 if ( (j%fDisplayMixingInfo) == 0)
411 Info("ProcessTracksAndParticles",
412 "Mixing particle %d from event %d with particles from event %d",j,i,k);
414 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
416 part2= partEvent2->GetParticle(l);
417 partpair->SetParticles(part1,part2);
419 track2= trackEvent2->GetParticle(l);
420 trackpair->SetParticles(track1,track2);
422 if( fPairCut->Pass(partpair) ) //check pair cut
423 { //do not meets crietria of the
424 if( fPairCut->Pass(partpair->GetSwapedPair()) )
428 tmppartpair = partpair->GetSwapedPair();
429 tmptrackpair = trackpair->GetSwapedPair();
433 {//meets criteria of the pair cut
434 tmptrackpair = trackpair;
435 tmppartpair = partpair;
437 for(ii = 0;ii<fNParticleFunctions;ii++)
438 fParticleFunctions[ii]->ProcessDiffEventParticles(tmppartpair);
440 for(ii = 0;ii<fNTrackFunctions;ii++)
441 fTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair);
443 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
444 fParticleAndTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair,tmppartpair);
445 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
446 }//for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
449 /***************************************/
451 /*************************************************************************************/
453 void AliHBTAnalysis::ProcessTracks()
455 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
456 //the loops are splited
457 AliHBTParticle * track1, * track2;
458 AliHBTEvent * trackEvent;
459 AliHBTEvent * trackEvent2;
462 Int_t Nev = fReader->GetNumberOfTrackEvents();
464 AliHBTPair * trackpair = new AliHBTPair();
465 AliHBTPair * tmptrackpair; //temporary pointer
467 /***************************************/
468 /****** Looping same events ********/
469 /****** filling numerators ********/
470 /***************************************/
471 for (Int_t i = 0;i<Nev;i++)
473 trackEvent = fReader->GetTrackEvent(i);
474 if (!trackEvent) continue;
476 for (Int_t j = 0; j<trackEvent->GetNumberOfParticles() ; j++)
478 if ( (j%fDisplayMixingInfo) == 0)
479 Info("ProcessTracks",
480 "Mixing particle %d from event %d with particles from event %d",j,i,i);
482 track1= trackEvent->GetParticle(j);
483 if (fPairCut->GetFirstPartCut()->Pass(track1)) continue;
485 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
486 fTrackMonitorFunctions[ii]->Process(track1);
488 if ( fNTrackFunctions ==0 )
491 for (Int_t k =j+1; k < trackEvent->GetNumberOfParticles() ; k++)
493 track2= trackEvent->GetParticle(k);
494 trackpair->SetParticles(track1,track2);
495 if(fPairCut->Pass(trackpair)) //check pair cut
496 { //do not meets crietria of the
497 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
498 else tmptrackpair = trackpair->GetSwapedPair();
502 tmptrackpair = trackpair;
504 for(ii = 0;ii<fNTrackFunctions;ii++)
505 fTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair);
510 /***************************************/
511 /***** Filling diff histogram *********/
512 /***************************************/
513 if (fBufferSize != 0)
514 for (Int_t i = 0;i<Nev-1;i++) //In each event (but last) ....
516 if ( fNTrackFunctions ==0 )
519 trackEvent = fReader->GetTrackEvent(i);
520 if (!trackEvent) continue;
522 for (Int_t j = 0; j< trackEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
524 track1= trackEvent->GetParticle(j);
525 if (fPairCut->GetFirstPartCut()->Pass(track1)) continue;
529 if ( ((i+fBufferSize) >= Nev) ||( fBufferSize < 0) ) //if buffer size is negative
530 //or current event+buffersize is greater
531 //than max nuber of events
533 NNN = Nev; //set the max event number
537 NNN = i+fBufferSize; //set the current event number + fBufferSize
540 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
542 trackEvent2 = fReader->GetTrackEvent(k);
543 if (!trackEvent2) continue;
545 if ( (j%fDisplayMixingInfo) == 0)
546 Info("ProcessTracksAndParticles",
547 "Mixing particle %d from event %d with particles from event %d",j,i,k);
549 for(Int_t l = 0; l<trackEvent2->GetNumberOfParticles();l++) // ... on all particles
551 track2= trackEvent2->GetParticle(l);
552 trackpair->SetParticles(track1,track2);
554 if(fPairCut->Pass(trackpair)) //check pair cut
555 { //do not meets crietria of the
556 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
557 else tmptrackpair = trackpair->GetSwapedPair();
561 tmptrackpair = trackpair;
563 for(ii = 0;ii<fNTrackFunctions;ii++)
564 fTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair);
566 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
567 }//for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
570 /***************************************/
573 /*************************************************************************************/
575 void AliHBTAnalysis::ProcessParticles()
577 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
578 //the loops are splited
579 AliHBTParticle * part1, * part2;
581 AliHBTEvent * partEvent;
582 AliHBTEvent * partEvent2;
584 AliHBTPair * partpair = new AliHBTPair();
585 AliHBTPair * tmppartpair; //temporary pointer to the pair
587 Int_t Nev = fReader->GetNumberOfPartEvents();
589 /***************************************/
590 /****** Looping same events ********/
591 /****** filling numerators ********/
592 /***************************************/
593 for (Int_t i = 0;i<Nev;i++)
595 partEvent= fReader->GetParticleEvent(i);
596 if (!partEvent) continue;
599 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
601 if ( (j%fDisplayMixingInfo) == 0)
602 Info("ProcessParticles",
603 "Mixing particle %d from event %d with particles from event %d",j,i,i);
605 part1= partEvent->GetParticle(j);
606 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
609 for(zz = 0; zz<fNParticleMonitorFunctions; zz++)
610 fParticleMonitorFunctions[zz]->Process(part1);
612 if ( fNParticleFunctions ==0 )
615 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
617 part2= partEvent->GetParticle(k);
618 partpair->SetParticles(part1,part2);
620 if( fPairCut->Pass(partpair) ) //check pair cut
621 { //do not meets crietria of the pair cut, try with swaped pairs
622 if( fPairCut->Pass(partpair->GetSwapedPair() ) )
623 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
625 { //swaped pair meets all the criteria
626 tmppartpair = partpair->GetSwapedPair();
631 tmppartpair = partpair;
635 for(ii = 0;ii<fNParticleFunctions;ii++)
636 fParticleFunctions[ii]->ProcessSameEventParticles(tmppartpair);
641 /***************************************/
642 /***** Filling diff histogram *********/
643 /***************************************/
644 if (fBufferSize != 0) //less then 0 mix everything, == 0 do not mix denominator
645 for (Int_t i = 0;i<Nev-1;i++) //In each event (but last)....
647 if ( fNParticleFunctions ==0 )
650 partEvent= fReader->GetParticleEvent(i);
651 if (!partEvent) continue;
653 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
655 part1= partEvent->GetParticle(j);
656 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
659 if ( ((i+fBufferSize) >= Nev) ||( fBufferSize < 0) ) //if buffer size is negative
660 //or current event+buffersize is greater
661 //than max nuber of events
663 NNN = Nev; //set the max event number
667 NNN = i+fBufferSize; //set the current event number + fBufferSize
670 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
673 partEvent2= fReader->GetParticleEvent(k);
674 if (!partEvent2) continue;
676 if ( (j%fDisplayMixingInfo) == 0)
677 Info("ProcessParticles",
678 "Mixing particle %d from event %d with particles from event %d",j,i,k);
680 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
682 part2= partEvent2->GetParticle(l);
683 partpair->SetParticles(part1,part2);
685 if(fPairCut->Pass(partpair)) //check pair cut
686 { //do not meets crietria of the
687 if( fPairCut->Pass(partpair->GetSwapedPair()) ) continue;
688 else tmppartpair = partpair->GetSwapedPair();
692 tmppartpair = partpair;
695 for(ii = 0;ii<fNParticleFunctions;ii++)
696 fParticleFunctions[ii]->ProcessDiffEventParticles(tmppartpair);
698 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
699 }//for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
702 /***************************************/
705 /*************************************************************************************/
707 void AliHBTAnalysis::WriteFunctions()
709 //Calls Write for all defined functions in analysis
710 //== writes all results
712 for(ii = 0;ii<fNParticleFunctions;ii++)
713 fParticleFunctions[ii]->Write();
715 for(ii = 0;ii<fNTrackFunctions;ii++)
716 fTrackFunctions[ii]->Write();
718 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
719 fParticleAndTrackFunctions[ii]->Write();
721 for(ii = 0;ii<fNParticleMonitorFunctions;ii++)
722 fParticleMonitorFunctions[ii]->Write();
724 for(ii = 0;ii<fNTrackMonitorFunctions;ii++)
725 fTrackMonitorFunctions[ii]->Write();
727 for(ii = 0;ii<fNParticleAndTrackMonitorFunctions;ii++)
728 fParticleAndTrackMonitorFunctions[ii]->Write();
730 /*************************************************************************************/
732 void AliHBTAnalysis::SetGlobalPairCut(AliHBTPairCut* cut)
734 //Sets the global cut
737 Error("AliHBTAnalysis::SetGlobalPairCut","Pointer is NULL. Ignoring");
740 fPairCut = (AliHBTPairCut*)cut->Clone();
743 /*************************************************************************************/
745 void AliHBTAnalysis::AddTrackFunction(AliHBTOnePairFctn* f)
747 //Adds track function
748 if (f == 0x0) return;
749 if (fNTrackFunctions == fgkFctnArraySize)
751 Error("AliHBTAnalysis::AddTrackFunction","Can not add this function, not enough place in the array.");
753 fTrackFunctions[fNTrackFunctions] = f;
756 /*************************************************************************************/
758 void AliHBTAnalysis::AddParticleFunction(AliHBTOnePairFctn* f)
760 //adds particle function
761 if (f == 0x0) return;
763 if (fNParticleFunctions == fgkFctnArraySize)
765 Error("AliHBTAnalysis::AddParticleFunction","Can not add this function, not enough place in the array.");
767 fParticleFunctions[fNParticleFunctions] = f;
768 fNParticleFunctions++;
770 /*************************************************************************************/
772 void AliHBTAnalysis::AddParticleAndTrackFunction(AliHBTTwoPairFctn* f)
774 //add resolution function
775 if (f == 0x0) return;
776 if (fNParticleAndTrackFunctions == fgkFctnArraySize)
778 Error("AliHBTAnalysis::AddParticleAndTrackFunction","Can not add this function, not enough place in the array.");
780 fParticleAndTrackFunctions[fNParticleAndTrackFunctions] = f;
781 fNParticleAndTrackFunctions++;
783 /*************************************************************************************/
785 void AliHBTAnalysis::AddParticleMonitorFunction(AliHBTMonOneParticleFctn* f)
787 //add particle monitoring function
788 if (f == 0x0) return;
790 if (fNParticleMonitorFunctions == fgkFctnArraySize)
792 Error("AliHBTAnalysis::AddParticleMonitorFunction","Can not add this function, not enough place in the array.");
794 fParticleMonitorFunctions[fNParticleMonitorFunctions] = f;
795 fNParticleMonitorFunctions++;
797 /*************************************************************************************/
799 void AliHBTAnalysis::AddTrackMonitorFunction(AliHBTMonOneParticleFctn* f)
801 //add track monitoring function
802 if (f == 0x0) return;
804 if (fNTrackMonitorFunctions == fgkFctnArraySize)
806 Error("AliHBTAnalysis::AddTrackMonitorFunction","Can not add this function, not enough place in the array.");
808 fTrackMonitorFunctions[fNTrackMonitorFunctions] = f;
809 fNTrackMonitorFunctions++;
811 /*************************************************************************************/
813 void AliHBTAnalysis::AddParticleAndTrackMonitorFunction(AliHBTMonTwoParticleFctn* f)
815 //add resolution monitoring function
816 if (f == 0x0) return;
817 if (fNParticleAndTrackMonitorFunctions == fgkFctnArraySize)
819 Error("AliHBTAnalysis::AddParticleAndTrackMonitorFunction","Can not add this function, not enough place in the array.");
821 fParticleAndTrackMonitorFunctions[fNParticleAndTrackMonitorFunctions] = f;
822 fNParticleAndTrackMonitorFunctions++;
826 /*************************************************************************************/
827 /*************************************************************************************/
829 Bool_t AliHBTAnalysis::RunCoherencyCheck()
831 //Checks if both HBTRuns are similar
832 //return true if error found
833 //if they seem to be OK return false
835 Info("RunCoherencyCheck","Checking HBT Runs Coherency");
837 Info("RunCoherencyCheck","Number of events ...");
838 if (fReader->GetNumberOfPartEvents() == fReader->GetNumberOfTrackEvents() ) //check whether there is the same number of events
840 Info("RunCoherencyCheck","OK. %d found\n",fReader->GetNumberOfTrackEvents());
843 { //if not the same - ERROR
844 Error("AliHBTAnalysis::RunCoherencyCheck()",
845 "Number of simulated events (%d) is not equal to number of reconstructed events(%d)",
846 fReader->GetNumberOfPartEvents(),fReader->GetNumberOfTrackEvents());
850 Info("RunCoherencyCheck","Checking number of Particles AND Particles Types in each event ...");
852 AliHBTEvent *partEvent;
853 AliHBTEvent *trackEvent;
854 for( i = 0; i<fReader->GetNumberOfTrackEvents();i++)
856 partEvent= fReader->GetParticleEvent(i); //gets the "ith" event
857 trackEvent = fReader->GetTrackEvent(i);
859 if ( (partEvent == 0x0) && (partEvent == 0x0) ) continue;
860 if ( (partEvent == 0x0) || (partEvent == 0x0) )
862 Error("AliHBTAnalysis::RunCoherencyCheck()",
863 "One event is NULL and the other one not. Event Number %d",i);
867 if ( partEvent->GetNumberOfParticles() != trackEvent->GetNumberOfParticles() )
869 Error("AliHBTAnalysis::RunCoherencyCheck()",
870 "Event %d: Number of simulated particles (%d) not equal to number of reconstructed tracks (%d)",
871 i,partEvent->GetNumberOfParticles() , trackEvent->GetNumberOfParticles());
875 for (Int_t j = 0; j<partEvent->GetNumberOfParticles(); j++)
877 if( partEvent->GetParticle(j)->GetPdgCode() != trackEvent->GetParticle(j)->GetPdgCode() )
879 Error("AliHBTAnalysis::RunCoherencyCheck()",
880 "Event %d: Particle %d: PID of simulated particle (%d) not the same of reconstructed track (%d)",
881 i,j, partEvent->GetParticle(j)->GetPdgCode(),trackEvent->GetParticle(j)->GetPdgCode() );
887 Info("RunCoherencyCheck"," Done");
888 Info("RunCoherencyCheck"," Everything looks OK");
892 /*************************************************************************************/
894 void AliHBTAnalysis::ProcessTracksAndParticlesNonIdentAnal()
896 //Performs analysis for both, tracks and particles
898 AliHBTParticle * part1, * part2;
899 AliHBTParticle * track1, * track2;
901 AliHBTEvent * trackEvent1=0x0,*partEvent1=0x0;
902 AliHBTEvent * trackEvent2=0x0,*partEvent2=0x0;
903 AliHBTEvent * trackEvent3=0x0,*partEvent3=0x0;
905 AliHBTEvent * rawtrackEvent, *rawpartEvent;
907 Int_t Nev = fReader->GetNumberOfTrackEvents();
909 AliHBTPair * trackpair = new AliHBTPair();
910 AliHBTPair * partpair = new AliHBTPair();
917 trackEvent1 = new AliHBTEvent();
918 partEvent1 = new AliHBTEvent();
919 trackEvent1->SetOwner(kFALSE);
920 partEvent1->SetOwner(kFALSE);;
922 Info("ProcessTracksAndParticlesNonIdentAnal","**************************************");
923 Info("ProcessTracksAndParticlesNonIdentAnal","***** NON IDENT MODE ****************");
924 Info("ProcessTracksAndParticlesNonIdentAnal","**************************************");
926 for (Int_t i = 0;i<Nev;i++)
928 rawpartEvent = fReader->GetParticleEvent(i);
929 rawtrackEvent = fReader->GetTrackEvent(i);
930 if ( (rawpartEvent == 0x0) || (rawtrackEvent == 0x0) ) continue;//in case of any error
932 /********************************/
934 /********************************/
935 if ( (fBufferSize != 0) || ( (partEvent2==0x0)||(trackEvent2==0x0)) )//in case fBufferSize == 0 and pointers are created do not eneter
936 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
937 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
938 partEvent2 = (AliHBTEvent*)pbuffer.Remove(pbuffer.Last()); //remove from the end to be reset, filled and put on the beginning
939 trackEvent2 = (AliHBTEvent*)tbuffer.Remove(tbuffer.Last());
944 partEvent2 = new AliHBTEvent();
945 trackEvent2 = new AliHBTEvent();
946 partEvent2->SetOwner(kFALSE);
947 trackEvent2->SetOwner(kFALSE);
949 FilterOut(partEvent1, partEvent2, rawpartEvent, trackEvent1, trackEvent2, rawtrackEvent);
951 for (Int_t j = 0; j<partEvent1->GetNumberOfParticles() ; j++)
953 if ( (j%fDisplayMixingInfo) == 0)
954 Info("ProcessTracksAndParticlesNonIdentAnal",
955 "Mixing particle %d from event %d with particles from event %d",j,i,i);
957 part1= partEvent1->GetParticle(j);
958 track1= trackEvent1->GetParticle(j);
960 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
961 fParticleMonitorFunctions[ii]->Process(part1);
962 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
963 fTrackMonitorFunctions[ii]->Process(track1);
964 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
965 fParticleAndTrackMonitorFunctions[ii]->Process(track1,part1);
967 /***************************************/
968 /****** filling numerators ********/
969 /****** (particles from event2) ********/
970 /***************************************/
971 for (Int_t k = 0; k < partEvent2->GetNumberOfParticles() ; k++)
973 part2= partEvent2->GetParticle(k);
974 partpair->SetParticles(part1,part2);
976 track2= trackEvent2->GetParticle(k);
977 trackpair->SetParticles(track1,track2);
979 if( (fPairCut->PassPairProp(partpair)) ) //check pair cut
980 { //do not meets crietria of the pair cut
984 {//meets criteria of the pair cut
985 for(ii = 0;ii<fNParticleFunctions;ii++)
986 fParticleFunctions[ii]->ProcessSameEventParticles(partpair);
988 for(ii = 0;ii<fNTrackFunctions;ii++)
989 fTrackFunctions[ii]->ProcessSameEventParticles(trackpair);
991 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
992 fParticleAndTrackFunctions[ii]->ProcessSameEventParticles(trackpair,partpair);
996 if ( fBufferSize == 0) continue;//do not mix diff histograms
997 /***************************************/
998 /***** Filling denominators *********/
999 /***************************************/
1000 TIter piter(&pbuffer);
1001 TIter titer(&tbuffer);
1004 while ( (partEvent3 = (AliHBTEvent*)piter.Next()) != 0x0)
1006 trackEvent3 = (AliHBTEvent*)titer.Next();
1007 if ( (j%fDisplayMixingInfo) == 0)
1008 Info("ProcessTracksAndParticlesNonIdentAnal",
1009 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
1011 for (Int_t k = 0; k < partEvent3->GetNumberOfParticles() ; k++)
1013 part2= partEvent3->GetParticle(k);
1014 partpair->SetParticles(part1,part2);
1016 track2= trackEvent3->GetParticle(k);
1017 trackpair->SetParticles(track1,track2);
1019 if( (fPairCut->PassPairProp(partpair)) ) //check pair cut
1020 { //do not meets crietria of the pair cut
1024 {//meets criteria of the pair cut
1026 for(ii = 0;ii<fNParticleFunctions;ii++)
1027 fParticleFunctions[ii]->ProcessDiffEventParticles(partpair);
1029 for(ii = 0;ii<fNTrackFunctions;ii++)
1030 fTrackFunctions[ii]->ProcessDiffEventParticles(trackpair);
1032 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
1033 fParticleAndTrackFunctions[ii]->ProcessDiffEventParticles(trackpair,partpair);
1035 }// for particles event2
1037 }//for over particles in event1
1039 if ( fBufferSize == 0) continue;//do not mix diff histograms-> do not add to buffer list
1040 pbuffer.AddFirst(partEvent2);
1041 tbuffer.AddFirst(trackEvent2);
1046 }//end of loop over events (1)
1047 pbuffer.SetOwner(); //to clean stored events by the way of buffer destruction
1053 if ( fBufferSize == 0)
1054 {//in that case we did not add these events to list
1060 /*************************************************************************************/
1062 void AliHBTAnalysis::ProcessTracksNonIdentAnal()
1064 AliHBTParticle * track1, * track2;
1066 AliHBTEvent * trackEvent1=0x0;
1067 AliHBTEvent * trackEvent2=0x0;
1068 AliHBTEvent * trackEvent3=0x0;
1070 AliHBTEvent * rawtrackEvent;
1072 Int_t Nev = fReader->GetNumberOfTrackEvents();
1074 AliHBTPair * trackpair = new AliHBTPair();
1077 Int_t ninbuffer = 0;
1080 trackEvent1 = new AliHBTEvent();
1081 trackEvent1->SetOwner(kFALSE);
1083 Info("ProcessTracksNonIdentAnal","**************************************");
1084 Info("ProcessTracksNonIdentAnal","***** NON IDENT MODE ****************");
1085 Info("ProcessTracksNonIdentAnal","**************************************");
1087 for (Int_t i = 0;i<Nev;i++)
1089 rawtrackEvent = fReader->GetTrackEvent(i);
1090 if (rawtrackEvent == 0x0) continue;//in case of any error
1092 /********************************/
1094 /********************************/
1095 if ( (fBufferSize != 0) || ( trackEvent2==0x0) )//in case fBufferSize == 0 and pointers are created do not eneter
1096 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
1097 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
1098 trackEvent2 = (AliHBTEvent*)tbuffer.Remove(tbuffer.Last());
1103 trackEvent2 = new AliHBTEvent();
1104 trackEvent2->SetOwner(kFALSE);
1106 FilterOut(trackEvent1, trackEvent2, rawtrackEvent);
1108 for (Int_t j = 0; j<trackEvent1->GetNumberOfParticles() ; j++)
1110 if ( (j%fDisplayMixingInfo) == 0)
1111 Info("ProcessTracksNonIdentAnal",
1112 "Mixing particle %d from event %d with particles from event %d",j,i,i);
1114 track1= trackEvent1->GetParticle(j);
1116 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
1117 fTrackMonitorFunctions[ii]->Process(track1);
1119 /***************************************/
1120 /****** filling numerators ********/
1121 /****** (particles from event2) ********/
1122 /***************************************/
1123 for (Int_t k = 0; k < trackEvent2->GetNumberOfParticles() ; k++)
1125 track2= trackEvent2->GetParticle(k);
1126 trackpair->SetParticles(track1,track2);
1129 if( fPairCut->PassPairProp(trackpair)) //check pair cut
1130 { //do not meets crietria of the pair cut
1134 {//meets criteria of the pair cut
1136 for(ii = 0;ii<fNTrackFunctions;ii++)
1137 fTrackFunctions[ii]->ProcessSameEventParticles(trackpair);
1140 if ( fBufferSize == 0) continue;//do not mix diff histograms
1141 /***************************************/
1142 /***** Filling denominators *********/
1143 /***************************************/
1144 TIter titer(&tbuffer);
1147 while ( (trackEvent3 = (AliHBTEvent*)titer.Next()) != 0x0)
1150 if ( (j%fDisplayMixingInfo) == 0)
1151 Info("ProcessTracksNonIdentAnal",
1152 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
1154 for (Int_t k = 0; k < trackEvent3->GetNumberOfParticles() ; k++)
1157 track2= trackEvent3->GetParticle(k);
1158 trackpair->SetParticles(track1,track2);
1161 if( fPairCut->PassPairProp(trackpair)) //check pair cut
1162 { //do not meets crietria of the pair cut
1166 {//meets criteria of the pair cut
1167 for(ii = 0;ii<fNTrackFunctions;ii++)
1168 fTrackFunctions[ii]->ProcessDiffEventParticles(trackpair);
1170 }// for particles event2
1172 }//for over particles in event1
1174 if ( fBufferSize == 0) continue;//do not mix diff histograms
1175 tbuffer.AddFirst(trackEvent2);
1179 }//end of loop over events (1)
1183 if (fBufferSize == 0) delete trackEvent2;
1186 /*************************************************************************************/
1188 void AliHBTAnalysis::ProcessParticlesNonIdentAnal()
1190 AliHBTParticle * part1 = 0x0, * part2 = 0x0;
1192 AliHBTEvent * partEvent1 = 0x0;
1193 AliHBTEvent * partEvent2 = 0x0;
1194 AliHBTEvent * partEvent3 = 0x0;
1196 AliHBTEvent * rawpartEvent = 0x0;
1198 Int_t Nev = fReader->GetNumberOfPartEvents();
1200 AliHBTPair * partpair = new AliHBTPair();
1203 Int_t ninbuffer = 0;
1205 partEvent1 = new AliHBTEvent();
1206 partEvent1->SetOwner(kFALSE);;
1208 Info("ProcessParticlesNonIdentAnal","**************************************");
1209 Info("ProcessParticlesNonIdentAnal","***** NON IDENT MODE ****************");
1210 Info("ProcessParticlesNonIdentAnal","**************************************");
1212 for (Int_t i = 0;i<Nev;i++)
1214 rawpartEvent = fReader->GetParticleEvent(i);
1215 if ( rawpartEvent == 0x0 ) continue;//in case of any error
1217 /********************************/
1219 /********************************/
1220 if ( (fBufferSize != 0) || ( partEvent2==0x0) )//in case fBufferSize == 0 and pointers are created do not eneter
1221 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
1222 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
1223 partEvent2 = (AliHBTEvent*)pbuffer.Remove(pbuffer.Last()); //remove from the end to be reset, filled and put on the beginning
1228 partEvent2 = new AliHBTEvent();
1229 partEvent2->SetOwner(kFALSE);
1231 FilterOut(partEvent1, partEvent2, rawpartEvent);
1233 for (Int_t j = 0; j<partEvent1->GetNumberOfParticles() ; j++)
1235 if ( (j%fDisplayMixingInfo) == 0)
1236 Info("ProcessParticlesNonIdentAnal",
1237 "Mixing particle %d from event %d with particles from event %d",j,i,i);
1239 part1= partEvent1->GetParticle(j);
1242 for(zz = 0; zz<fNParticleMonitorFunctions; zz++)
1243 fParticleMonitorFunctions[zz]->Process(part1);
1245 /***************************************/
1246 /****** filling numerators ********/
1247 /****** (particles from event2) ********/
1248 /***************************************/
1249 for (Int_t k = 0; k < partEvent2->GetNumberOfParticles() ; k++)
1251 part2= partEvent2->GetParticle(k);
1252 partpair->SetParticles(part1,part2);
1254 if(fPairCut->PassPairProp(partpair) ) //check pair cut
1255 { //do not meets crietria of the pair cut
1259 {//meets criteria of the pair cut
1261 for(ii = 0;ii<fNParticleFunctions;ii++)
1263 fParticleFunctions[ii]->ProcessSameEventParticles(partpair);
1267 if ( fBufferSize == 0) continue;//do not mix diff histograms
1268 /***************************************/
1269 /***** Filling denominators *********/
1270 /***************************************/
1271 TIter piter(&pbuffer);
1274 while ( (partEvent3 = (AliHBTEvent*)piter.Next()) != 0x0)
1276 if ( (j%fDisplayMixingInfo) == 0)
1277 Info("ProcessParticlesNonIdentAnal",
1278 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
1280 for (Int_t k = 0; k < partEvent3->GetNumberOfParticles() ; k++)
1282 part2= partEvent3->GetParticle(k);
1283 partpair->SetParticles(part1,part2);
1285 if(fPairCut->PassPairProp(partpair) ) //check pair cut
1286 { //do not meets crietria of the pair cut
1290 {//meets criteria of the pair cut
1292 for(ii = 0;ii<fNParticleFunctions;ii++)
1294 fParticleFunctions[ii]->ProcessDiffEventParticles(partpair);
1297 }// for particles event2
1299 }//for over particles in event1
1300 if ( fBufferSize == 0) continue;//do not mix diff histograms
1301 pbuffer.AddFirst(partEvent2);
1305 }//end of loop over events (1)
1308 if ( fBufferSize == 0) delete partEvent2;
1309 pbuffer.SetOwner();//to delete stered events.
1312 /*************************************************************************************/
1313 void AliHBTAnalysis::FilterOut(AliHBTEvent* outpart1, AliHBTEvent* outpart2, AliHBTEvent* inpart,
1314 AliHBTEvent* outtrack1, AliHBTEvent* outtrack2, AliHBTEvent* intrack)
1316 //Puts particles accepted as a first particle by global cut in out1
1317 //and as a second particle in out2
1319 AliHBTParticle* part, *track;
1326 AliHBTParticleCut *cut1 = fPairCut->GetFirstPartCut();
1327 AliHBTParticleCut *cut2 = fPairCut->GetSecondPartCut();
1331 for (Int_t i = 0; i < inpart->GetNumberOfParticles(); i++)
1334 part = inpart->GetParticle(i);
1335 track = intrack->GetParticle(i);
1337 if ( (cut1->Pass(part)) ) in1 = kFALSE; //if part is rejected by cut1, in1 is false
1338 if ( (cut2->Pass(part)) ) in2 = kFALSE; //if part is rejected by cut2, in2 is false
1340 if (gDebug)//to be removed in real analysis
1341 if ( in1 && in2 ) //both cuts accepted, should never happen, just in case
1343 //Particle accpted by both cuts
1344 Error("FilterOut","Particle accepted by both cuts");
1350 outpart1->AddParticle(part);
1351 outtrack1->AddParticle(track);
1357 outpart2->AddParticle(part);
1358 outtrack2->AddParticle(track);
1363 /*************************************************************************************/
1365 void AliHBTAnalysis::FilterOut(AliHBTEvent* out1, AliHBTEvent* out2, AliHBTEvent* in)
1367 //Puts particles accepted as a first particle by global cut in out1
1368 //and as a second particle in out2
1369 AliHBTParticle* part;
1374 AliHBTParticleCut *cut1 = fPairCut->GetFirstPartCut();
1375 AliHBTParticleCut *cut2 = fPairCut->GetSecondPartCut();
1379 for (Int_t i = 0; i < in->GetNumberOfParticles(); i++)
1382 part = in->GetParticle(i);
1384 if ( cut1->Pass(part) ) in1 = kFALSE; //if part is rejected by cut1, in1 is false
1385 if ( cut2->Pass(part) ) in2 = kFALSE; //if part is rejected by cut2, in2 is false
1387 if (gDebug)//to be removed in real analysis
1388 if ( in1 && in2 ) //both cuts accepted, should never happen, just in case
1390 //Particle accpted by both cuts
1391 Error("FilterOut","Particle accepted by both cuts");
1397 out1->AddParticle(part);
1403 out2->AddParticle(part);
1408 /*************************************************************************************/
1410 Bool_t AliHBTAnalysis::IsNonIdentAnalysis()
1412 //checks if it is possible to use special analysis for non identical particles
1413 //it means - in global pair cut first particle id is different than second one
1414 //and both are different from 0
1415 //in the future is possible to perform more sophisticated check
1416 //if cuts have excluding requirements
1418 if (fPairCut->IsEmpty())
1421 if (fPairCut->GetFirstPartCut()->IsEmpty())
1424 if (fPairCut->GetSecondPartCut()->IsEmpty())
1427 Int_t id1 = fPairCut->GetFirstPartCut()->GetPID();
1428 Int_t id2 = fPairCut->GetSecondPartCut()->GetPID();
1430 if ( (id1==0) || (id2==0) || (id1==id2) )