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 ClassImp(AliHBTAnalysis)
17 const UInt_t AliHBTAnalysis::fgkFctnArraySize = 100;
18 const UInt_t AliHBTAnalysis::fgkDefaultMixingInfo = 1000;
19 const Int_t AliHBTAnalysis::fgkDefaultBufferSize = 5;
21 AliHBTAnalysis::AliHBTAnalysis():
24 fNParticleFunctions(0),
25 fNParticleAndTrackFunctions(0),
26 fNTrackMonitorFunctions(0),
27 fNParticleMonitorFunctions(0),
28 fNParticleAndTrackMonitorFunctions(0),
30 fDisplayMixingInfo(fgkDefaultMixingInfo),
33 fTrackFunctions = new AliHBTOnePairFctn* [fgkFctnArraySize];
34 fParticleFunctions = new AliHBTOnePairFctn* [fgkFctnArraySize];
35 fParticleAndTrackFunctions = new AliHBTTwoPairFctn* [fgkFctnArraySize];
37 fParticleMonitorFunctions = new AliHBTMonOneParticleFctn* [fgkFctnArraySize];
38 fTrackMonitorFunctions = new AliHBTMonOneParticleFctn* [fgkFctnArraySize];
39 fParticleAndTrackMonitorFunctions = new AliHBTMonTwoParticleFctn* [fgkFctnArraySize];
41 fPairCut = new AliHBTEmptyPairCut();//empty cut - accepts all particles
43 /*************************************************************************************/
45 AliHBTAnalysis::AliHBTAnalysis(const AliHBTAnalysis& in):
48 fNParticleFunctions(0),
49 fNParticleAndTrackFunctions(0),
50 fNTrackMonitorFunctions(0),
51 fNParticleMonitorFunctions(0),
52 fNParticleAndTrackMonitorFunctions(0),
54 fParticleFunctions(0x0),
55 fParticleAndTrackFunctions(0x0),
56 fParticleMonitorFunctions(0x0),
57 fTrackMonitorFunctions(0x0),
58 fParticleAndTrackMonitorFunctions(0x0),
60 fBufferSize(fgkDefaultBufferSize),
61 fDisplayMixingInfo(fgkDefaultMixingInfo),
64 Fatal("AliHBTAnalysis(const AliHBTAnalysis&)","Sensless");
66 /*************************************************************************************/
67 const AliHBTAnalysis& AliHBTAnalysis::operator=(const AliHBTAnalysis& right)
69 Fatal("AliHBTAnalysis(const AliHBTAnalysis&)","Sensless");
72 /*************************************************************************************/
73 AliHBTAnalysis::~AliHBTAnalysis()
76 //note that we do not delete functions itself
77 // they should be deleted by whom where created
78 //we only store pointers, and we use "new" only for pointers array
79 if (fIsOwner) DeleteFunctions();
80 delete [] fTrackFunctions;
81 delete [] fParticleFunctions;
82 delete [] fParticleAndTrackFunctions;
84 delete [] fParticleMonitorFunctions;
85 delete [] fTrackMonitorFunctions;
86 delete [] fParticleAndTrackMonitorFunctions;
88 delete fPairCut; // always have an copy of an object - we create we dstroy
91 /*************************************************************************************/
92 void AliHBTAnalysis::DeleteFunctions()
95 for(ii = 0;ii<fNParticleFunctions;ii++)
96 delete fParticleFunctions[ii];
98 for(ii = 0;ii<fNTrackFunctions;ii++)
99 delete fTrackFunctions[ii];
101 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
102 delete fParticleAndTrackFunctions[ii];
104 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
105 delete fParticleMonitorFunctions[ii];
107 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
108 delete fTrackMonitorFunctions[ii];
110 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
111 delete fParticleAndTrackMonitorFunctions[ii];
113 void AliHBTAnalysis::Process(Option_t* option)
115 //default option = "TracksAndParticles"
116 //Main method of the HBT Analysis Package
117 //It triggers reading with the global cut (default is an empty cut)
118 //Than it checks options and data which are read
119 //if everything is OK, then it calls one of the looping methods
120 //depending on tfReaderhe option
121 //These methods differs on what thay are looping on
124 //--------------------------------------------------------------------
125 //ProcessTracksAndParticles - "TracksAndParticles"
127 // it loops over both, tracks(reconstructed) and particles(simulated)
128 // all function gethered in all 3 lists are called for each (double)pair
130 //ProcessTracks - "Tracks"
131 // it loops only on tracks(reconstructed),
132 // functions ONLY from fTrackFunctions list are called
134 //ProcessParticles - "Particles"
135 // it loops only on particles(simulated),
136 // functions ONLY from fParticleAndTrackFunctions list are called
141 Error("Process","The reader is not set");
146 const char *oT = strstr(option,"Tracks");
147 const char *oP = strstr(option,"Particles");
149 Bool_t nonid = IsNonIdentAnalysis();
153 if (fReader->GetNumberOfPartEvents() <1)
155 Error("Process","There is no Particles. Maybe change the option?");
158 if (fReader->GetNumberOfTrackEvents() <1)
160 Error("Process","There is no Tracks. Maybe change the option?");
164 if ( RunCoherencyCheck() )
167 "Coherency check not passed. Maybe change the option?\n");
170 if (nonid) ProcessTracksAndParticlesNonIdentAnal();
171 else ProcessTracksAndParticles();
177 if (fReader->GetNumberOfTrackEvents() <1)
179 Error("Process","There is no data to analyze.");
182 if (nonid) ProcessTracksNonIdentAnal();
183 else ProcessTracks();
189 if (fReader->GetNumberOfPartEvents() <1)
191 Error("Process","There is no data to analyze.");
194 if (nonid) ProcessParticlesNonIdentAnal();
195 else ProcessParticles();
201 /*************************************************************************************/
203 void AliHBTAnalysis::ProcessTracksAndParticles()
206 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
207 //the loops are splited
210 AliHBTParticle * part1, * part2;
211 AliHBTParticle * track1, * track2;
213 AliHBTEvent * trackEvent, *partEvent;
214 AliHBTEvent * trackEvent2,*partEvent2;
216 // Int_t N1, N2, N=0; //number of particles in current event(we prcess two events in one time)
218 Int_t Nev = fReader->GetNumberOfTrackEvents();
220 /***************************************/
221 /****** Looping same events ********/
222 /****** filling numerators ********/
223 /***************************************/
224 AliHBTPair * trackpair = new AliHBTPair();
225 AliHBTPair * partpair = new AliHBTPair();
227 AliHBTPair * tmptrackpair;//temprary pointers to pairs
228 AliHBTPair * tmppartpair;
232 for (Int_t i = 0;i<Nev;i++)
234 partEvent= fReader->GetParticleEvent(i);
235 trackEvent = fReader->GetTrackEvent(i);
237 if (!partEvent) continue;
241 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
244 if ( (j%fDisplayMixingInfo) == 0)
245 Info("ProcessTracksAndParticles",
246 "Mixing particle %d from event %d with particles from event %d",j,i,i);
248 part1= partEvent->GetParticle(j);
249 track1= trackEvent->GetParticle(j);
251 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
253 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
254 fParticleMonitorFunctions[ii]->ProcessSameEventParticles(part1);
255 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
256 fTrackMonitorFunctions[ii]->ProcessSameEventParticles(track1);
257 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
258 fParticleAndTrackMonitorFunctions[ii]->ProcessSameEventParticles(track1,part1);
260 if ( (fNParticleFunctions == 0) && (fNTrackFunctions ==0) && (fNParticleAndTrackFunctions == 0))
263 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
265 part2= partEvent->GetParticle(k);
266 partpair->SetParticles(part1,part2);
268 track2= trackEvent->GetParticle(k);
269 trackpair->SetParticles(track1,track2);
271 if(fPairCut->Pass(partpair) ) //check pair cut
272 { //do not meets crietria of the pair cut, try with swaped pairs
273 if( fPairCut->Pass(partpair->GetSwapedPair()) )
274 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
276 { //swaped pair meets all the criteria
277 tmppartpair = partpair->GetSwapedPair();
278 tmptrackpair = trackpair->GetSwapedPair();
282 {//meets criteria of the pair cut
283 tmptrackpair = trackpair;
284 tmppartpair = partpair;
286 for(ii = 0;ii<fNParticleFunctions;ii++)
287 fParticleFunctions[ii]->ProcessSameEventParticles(tmppartpair);
289 for(ii = 0;ii<fNTrackFunctions;ii++)
290 fTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair);
292 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
293 fParticleAndTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair,tmppartpair);
298 /***** Filling denominators *********/
299 /***************************************/
300 if (fBufferSize != 0)
301 for (Int_t i = 0;i<Nev-1;i++) //In each event (but last) ....
304 if ((fNParticleFunctions == 0) && (fNTrackFunctions ==0) && (fNParticleAndTrackFunctions == 0))
307 partEvent= fReader->GetParticleEvent(i);
308 if (!partEvent) continue;
310 trackEvent = fReader->GetTrackEvent(i);
312 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
314 part1= partEvent->GetParticle(j);
315 track1= trackEvent->GetParticle(j);
317 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
321 if ( ((i+fBufferSize) >= Nev) ||( fBufferSize < 0) ) //if buffer size is negative
322 //or current event+buffersize is greater
323 //than max nuber of events
325 NNN = Nev; //set the max event number
329 NNN = i+fBufferSize; //set the current event number + fBufferSize
332 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
335 partEvent2= fReader->GetParticleEvent(k);
336 if (!partEvent2) continue;
338 trackEvent2 = fReader->GetTrackEvent(k);
340 if ( (j%fDisplayMixingInfo) == 0)
341 Info("ProcessTracksAndParticles",
342 "Mixing particle %d from event %d with particles from event %d",j,i,k);
344 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
346 part2= partEvent2->GetParticle(l);
347 partpair->SetParticles(part1,part2);
349 track2= trackEvent2->GetParticle(l);
350 trackpair->SetParticles(track1,track2);
352 if( fPairCut->Pass(partpair) ) //check pair cut
353 { //do not meets crietria of the
354 if( fPairCut->Pass(partpair->GetSwapedPair()) )
358 tmppartpair = partpair->GetSwapedPair();
359 tmptrackpair = trackpair->GetSwapedPair();
363 {//meets criteria of the pair cut
364 tmptrackpair = trackpair;
365 tmppartpair = partpair;
367 for(ii = 0;ii<fNParticleFunctions;ii++)
368 fParticleFunctions[ii]->ProcessDiffEventParticles(tmppartpair);
370 for(ii = 0;ii<fNTrackFunctions;ii++)
371 fTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair);
373 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
374 fParticleAndTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair,tmppartpair);
375 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
376 }//for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
379 /***************************************/
381 /*************************************************************************************/
383 void AliHBTAnalysis::ProcessTracks()
385 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
386 //the loops are splited
387 AliHBTParticle * track1, * track2;
388 AliHBTEvent * trackEvent;
389 AliHBTEvent * trackEvent2;
392 Int_t Nev = fReader->GetNumberOfTrackEvents();
394 AliHBTPair * trackpair = new AliHBTPair();
395 AliHBTPair * tmptrackpair; //temporary pointer
397 /***************************************/
398 /****** Looping same events ********/
399 /****** filling numerators ********/
400 /***************************************/
401 for (Int_t i = 0;i<Nev;i++)
403 trackEvent = fReader->GetTrackEvent(i);
404 if (!trackEvent) continue;
406 for (Int_t j = 0; j<trackEvent->GetNumberOfParticles() ; j++)
408 if ( (j%fDisplayMixingInfo) == 0)
409 Info("ProcessTracks",
410 "Mixing particle %d from event %d with particles from event %d",j,i,i);
412 track1= trackEvent->GetParticle(j);
413 if (fPairCut->GetFirstPartCut()->Pass(track1)) continue;
415 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
416 fTrackMonitorFunctions[ii]->ProcessSameEventParticles(track1);
418 if ( fNTrackFunctions ==0 )
421 for (Int_t k =j+1; k < trackEvent->GetNumberOfParticles() ; k++)
423 track2= trackEvent->GetParticle(k);
424 trackpair->SetParticles(track1,track2);
425 if(fPairCut->Pass(trackpair)) //check pair cut
426 { //do not meets crietria of the
427 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
428 else tmptrackpair = trackpair->GetSwapedPair();
432 tmptrackpair = trackpair;
434 for(ii = 0;ii<fNTrackFunctions;ii++)
435 fTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair);
440 /***************************************/
441 /***** Filling diff histogram *********/
442 /***************************************/
443 if (fBufferSize != 0)
444 for (Int_t i = 0;i<Nev-1;i++) //In each event (but last) ....
446 if ( fNTrackFunctions ==0 )
449 trackEvent = fReader->GetTrackEvent(i);
450 if (!trackEvent) continue;
452 for (Int_t j = 0; j< trackEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
454 track1= trackEvent->GetParticle(j);
455 if (fPairCut->GetFirstPartCut()->Pass(track1)) continue;
459 if ( ((i+fBufferSize) >= Nev) ||( fBufferSize < 0) ) //if buffer size is negative
460 //or current event+buffersize is greater
461 //than max nuber of events
463 NNN = Nev; //set the max event number
467 NNN = i+fBufferSize; //set the current event number + fBufferSize
470 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
472 trackEvent2 = fReader->GetTrackEvent(k);
473 if (!trackEvent2) continue;
475 if ( (j%fDisplayMixingInfo) == 0)
476 Info("ProcessTracksAndParticles",
477 "Mixing particle %d from event %d with particles from event %d",j,i,k);
479 for(Int_t l = 0; l<trackEvent2->GetNumberOfParticles();l++) // ... on all particles
481 track2= trackEvent2->GetParticle(l);
482 trackpair->SetParticles(track1,track2);
484 if(fPairCut->Pass(trackpair)) //check pair cut
485 { //do not meets crietria of the
486 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
487 else tmptrackpair = trackpair->GetSwapedPair();
491 tmptrackpair = trackpair;
493 for(ii = 0;ii<fNTrackFunctions;ii++)
494 fTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair);
496 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
497 }//for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
500 /***************************************/
503 /*************************************************************************************/
505 void AliHBTAnalysis::ProcessParticles()
507 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
508 //the loops are splited
509 AliHBTParticle * part1, * part2;
511 AliHBTEvent * partEvent;
512 AliHBTEvent * partEvent2;
514 AliHBTPair * partpair = new AliHBTPair();
515 AliHBTPair * tmppartpair; //temporary pointer to the pair
517 Int_t Nev = fReader->GetNumberOfPartEvents();
519 /***************************************/
520 /****** Looping same events ********/
521 /****** filling numerators ********/
522 /***************************************/
523 for (Int_t i = 0;i<Nev;i++)
525 partEvent= fReader->GetParticleEvent(i);
526 if (!partEvent) continue;
529 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
531 if ( (j%fDisplayMixingInfo) == 0)
532 Info("ProcessParticles",
533 "Mixing particle %d from event %d with particles from event %d",j,i,i);
535 part1= partEvent->GetParticle(j);
536 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
539 for(zz = 0; zz<fNParticleMonitorFunctions; zz++)
540 fParticleMonitorFunctions[zz]->ProcessSameEventParticles(part1);
542 if ( fNParticleFunctions ==0 )
545 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
547 part2= partEvent->GetParticle(k);
548 partpair->SetParticles(part1,part2);
550 if( fPairCut->Pass(partpair) ) //check pair cut
551 { //do not meets crietria of the pair cut, try with swaped pairs
552 if( fPairCut->Pass(partpair->GetSwapedPair() ) )
553 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
555 { //swaped pair meets all the criteria
556 tmppartpair = partpair->GetSwapedPair();
561 tmppartpair = partpair;
565 for(ii = 0;ii<fNParticleFunctions;ii++)
566 fParticleFunctions[ii]->ProcessSameEventParticles(tmppartpair);
571 /***************************************/
572 /***** Filling diff histogram *********/
573 /***************************************/
574 if (fBufferSize != 0) //less then 0 mix everything, == 0 do not mix denominator
575 for (Int_t i = 0;i<Nev-1;i++) //In each event (but last)....
577 if ( fNParticleFunctions ==0 )
580 partEvent= fReader->GetParticleEvent(i);
581 if (!partEvent) continue;
583 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
585 part1= partEvent->GetParticle(j);
586 if (fPairCut->GetFirstPartCut()->Pass(part1)) continue;
589 if ( ((i+fBufferSize) >= Nev) ||( fBufferSize < 0) ) //if buffer size is negative
590 //or current event+buffersize is greater
591 //than max nuber of events
593 NNN = Nev; //set the max event number
597 NNN = i+fBufferSize; //set the current event number + fBufferSize
600 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
603 partEvent2= fReader->GetParticleEvent(k);
604 if (!partEvent2) continue;
606 if ( (j%fDisplayMixingInfo) == 0)
607 Info("ProcessParticles",
608 "Mixing particle %d from event %d with particles from event %d",j,i,k);
610 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
612 part2= partEvent2->GetParticle(l);
613 partpair->SetParticles(part1,part2);
615 if(fPairCut->Pass(partpair)) //check pair cut
616 { //do not meets crietria of the
617 if( fPairCut->Pass(partpair->GetSwapedPair()) ) continue;
618 else tmppartpair = partpair->GetSwapedPair();
622 tmppartpair = partpair;
625 for(ii = 0;ii<fNParticleFunctions;ii++)
626 fParticleFunctions[ii]->ProcessDiffEventParticles(tmppartpair);
628 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
629 }//for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
632 /***************************************/
635 /*************************************************************************************/
637 void AliHBTAnalysis::WriteFunctions()
639 //Calls Write for all defined functions in analysis
640 //== writes all results
642 for(ii = 0;ii<fNParticleFunctions;ii++)
643 fParticleFunctions[ii]->Write();
645 for(ii = 0;ii<fNTrackFunctions;ii++)
646 fTrackFunctions[ii]->Write();
648 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
649 fParticleAndTrackFunctions[ii]->Write();
651 for(ii = 0;ii<fNParticleMonitorFunctions;ii++)
652 fParticleMonitorFunctions[ii]->Write();
654 for(ii = 0;ii<fNTrackMonitorFunctions;ii++)
655 fTrackMonitorFunctions[ii]->Write();
657 for(ii = 0;ii<fNParticleAndTrackMonitorFunctions;ii++)
658 fParticleAndTrackMonitorFunctions[ii]->Write();
660 /*************************************************************************************/
662 void AliHBTAnalysis::SetGlobalPairCut(AliHBTPairCut* cut)
664 //Sets the global cut
667 Error("AliHBTAnalysis::SetGlobalPairCut","Pointer is NULL. Ignoring");
670 fPairCut = (AliHBTPairCut*)cut->Clone();
673 /*************************************************************************************/
675 void AliHBTAnalysis::AddTrackFunction(AliHBTOnePairFctn* f)
677 //Adds track function
678 if (f == 0x0) return;
679 if (fNTrackFunctions == fgkFctnArraySize)
681 Error("AliHBTAnalysis::AddTrackFunction","Can not add this function, not enough place in the array.");
683 fTrackFunctions[fNTrackFunctions] = f;
686 /*************************************************************************************/
688 void AliHBTAnalysis::AddParticleFunction(AliHBTOnePairFctn* f)
690 //adds particle function
691 if (f == 0x0) return;
693 if (fNParticleFunctions == fgkFctnArraySize)
695 Error("AliHBTAnalysis::AddParticleFunction","Can not add this function, not enough place in the array.");
697 fParticleFunctions[fNParticleFunctions] = f;
698 fNParticleFunctions++;
700 /*************************************************************************************/
702 void AliHBTAnalysis::AddParticleAndTrackFunction(AliHBTTwoPairFctn* f)
704 //add resolution function
705 if (f == 0x0) return;
706 if (fNParticleAndTrackFunctions == fgkFctnArraySize)
708 Error("AliHBTAnalysis::AddParticleAndTrackFunction","Can not add this function, not enough place in the array.");
710 fParticleAndTrackFunctions[fNParticleAndTrackFunctions] = f;
711 fNParticleAndTrackFunctions++;
713 /*************************************************************************************/
715 void AliHBTAnalysis::AddParticleMonitorFunction(AliHBTMonOneParticleFctn* f)
717 //add particle monitoring function
718 if (f == 0x0) return;
720 if (fNParticleMonitorFunctions == fgkFctnArraySize)
722 Error("AliHBTAnalysis::AddParticleMonitorFunction","Can not add this function, not enough place in the array.");
724 fParticleMonitorFunctions[fNParticleMonitorFunctions] = f;
725 fNParticleMonitorFunctions++;
727 /*************************************************************************************/
729 void AliHBTAnalysis::AddTrackMonitorFunction(AliHBTMonOneParticleFctn* f)
731 //add track monitoring function
732 if (f == 0x0) return;
734 if (fNTrackMonitorFunctions == fgkFctnArraySize)
736 Error("AliHBTAnalysis::AddTrackMonitorFunction","Can not add this function, not enough place in the array.");
738 fTrackMonitorFunctions[fNTrackMonitorFunctions] = f;
739 fNTrackMonitorFunctions++;
741 /*************************************************************************************/
743 void AliHBTAnalysis::AddParticleAndTrackMonitorFunction(AliHBTMonTwoParticleFctn* f)
745 //add resolution monitoring function
746 if (f == 0x0) return;
747 if (fNParticleAndTrackMonitorFunctions == fgkFctnArraySize)
749 Error("AliHBTAnalysis::AddParticleAndTrackMonitorFunction","Can not add this function, not enough place in the array.");
751 fParticleAndTrackMonitorFunctions[fNParticleAndTrackMonitorFunctions] = f;
752 fNParticleAndTrackMonitorFunctions++;
756 /*************************************************************************************/
757 /*************************************************************************************/
759 Bool_t AliHBTAnalysis::RunCoherencyCheck()
761 //Checks if both HBTRuns are similar
762 //return true if error found
763 //if they seem to be OK return false
765 Info("RunCoherencyCheck","Checking HBT Runs Coherency");
767 Info("RunCoherencyCheck","Number of events ...");
768 if (fReader->GetNumberOfPartEvents() == fReader->GetNumberOfTrackEvents() ) //check whether there is the same number of events
770 Info("RunCoherencyCheck","OK. %d found\n",fReader->GetNumberOfTrackEvents());
773 { //if not the same - ERROR
774 Error("AliHBTAnalysis::RunCoherencyCheck()",
775 "Number of simulated events (%d) is not equal to number of reconstructed events(%d)",
776 fReader->GetNumberOfPartEvents(),fReader->GetNumberOfTrackEvents());
780 Info("RunCoherencyCheck","Checking number of Particles AND Particles Types in each event ...");
782 AliHBTEvent *partEvent;
783 AliHBTEvent *trackEvent;
784 for( i = 0; i<fReader->GetNumberOfTrackEvents();i++)
786 partEvent= fReader->GetParticleEvent(i); //gets the "ith" event
787 trackEvent = fReader->GetTrackEvent(i);
789 if ( (partEvent == 0x0) && (partEvent == 0x0) ) continue;
790 if ( (partEvent == 0x0) || (partEvent == 0x0) )
792 Error("AliHBTAnalysis::RunCoherencyCheck()",
793 "One event is NULL and the other one not. Event Number %d",i);
797 if ( partEvent->GetNumberOfParticles() != trackEvent->GetNumberOfParticles() )
799 Error("AliHBTAnalysis::RunCoherencyCheck()",
800 "Event %d: Number of simulated particles (%d) not equal to number of reconstructed tracks (%d)",
801 i,partEvent->GetNumberOfParticles() , trackEvent->GetNumberOfParticles());
805 for (Int_t j = 0; j<partEvent->GetNumberOfParticles(); j++)
807 if( partEvent->GetParticle(j)->GetPdgCode() != trackEvent->GetParticle(j)->GetPdgCode() )
809 Error("AliHBTAnalysis::RunCoherencyCheck()",
810 "Event %d: Particle %d: PID of simulated particle (%d) not the same of reconstructed track (%d)",
811 i,j, partEvent->GetParticle(j)->GetPdgCode(),trackEvent->GetParticle(j)->GetPdgCode() );
817 Info("RunCoherencyCheck"," Done");
818 Info("RunCoherencyCheck"," Everything looks OK");
822 /*************************************************************************************/
824 void AliHBTAnalysis::ProcessTracksAndParticlesNonIdentAnal()
826 //Performs analysis for both, tracks and particles
828 AliHBTParticle * part1, * part2;
829 AliHBTParticle * track1, * track2;
831 AliHBTEvent * trackEvent1,*partEvent1;
832 AliHBTEvent * trackEvent2,*partEvent2;
833 AliHBTEvent * trackEvent3,*partEvent3;
835 AliHBTEvent * rawtrackEvent, *rawpartEvent;
837 Int_t Nev = fReader->GetNumberOfTrackEvents();
839 AliHBTPair * trackpair = new AliHBTPair();
840 AliHBTPair * partpair = new AliHBTPair();
847 trackEvent1 = new AliHBTEvent();
848 partEvent1 = new AliHBTEvent();
849 trackEvent1->SetOwner(kFALSE);
850 partEvent1->SetOwner(kFALSE);;
852 Info("ProcessTracksAndParticlesNonIdentAnal","**************************************");
853 Info("ProcessTracksAndParticlesNonIdentAnal","***** NON IDENT MODE ****************");
854 Info("ProcessTracksAndParticlesNonIdentAnal","**************************************");
856 for (Int_t i = 0;i<Nev;i++)
858 rawpartEvent = fReader->GetParticleEvent(i);
859 rawtrackEvent = fReader->GetTrackEvent(i);
860 if ( (rawpartEvent == 0x0) || (rawtrackEvent == 0x0) ) continue;//in case of any error
862 /********************************/
864 /********************************/
865 if ( (fBufferSize != 0) || ( (partEvent2==0x0)||(trackEvent2==0x0)) )//in case fBufferSize == 0 and pointers are created do not eneter
866 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
867 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
868 partEvent2 = (AliHBTEvent*)pbuffer.Remove(pbuffer.Last()); //remove from the end to be reset, filled and put on the beginning
869 trackEvent2 = (AliHBTEvent*)tbuffer.Remove(tbuffer.Last());
874 partEvent2 = new AliHBTEvent();
875 trackEvent2 = new AliHBTEvent();
876 partEvent2->SetOwner(kFALSE);
877 trackEvent2->SetOwner(kFALSE);
879 FilterOut(partEvent1, partEvent2, rawpartEvent, trackEvent1, trackEvent2, rawtrackEvent);
881 for (Int_t j = 0; j<partEvent1->GetNumberOfParticles() ; j++)
883 if ( (j%fDisplayMixingInfo) == 0)
884 Info("ProcessTracksAndParticlesNonIdentAnal",
885 "Mixing particle %d from event %d with particles from event %d",j,i,i);
887 part1= partEvent1->GetParticle(j);
888 track1= trackEvent1->GetParticle(j);
890 for(ii = 0; ii<fNParticleMonitorFunctions; ii++)
891 fParticleMonitorFunctions[ii]->ProcessSameEventParticles(part1);
892 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
893 fTrackMonitorFunctions[ii]->ProcessSameEventParticles(track1);
894 for(ii = 0; ii<fNParticleAndTrackMonitorFunctions; ii++)
895 fParticleAndTrackMonitorFunctions[ii]->ProcessSameEventParticles(track1,part1);
897 /***************************************/
898 /****** filling numerators ********/
899 /****** (particles from event2) ********/
900 /***************************************/
901 for (Int_t k = 0; k < partEvent2->GetNumberOfParticles() ; k++)
903 part2= partEvent2->GetParticle(k);
904 partpair->SetParticles(part1,part2);
906 track2= trackEvent2->GetParticle(k);
907 trackpair->SetParticles(track1,track2);
909 if( (fPairCut->PassPairProp(partpair)) ) //check pair cut
910 { //do not meets crietria of the pair cut
914 {//meets criteria of the pair cut
915 for(ii = 0;ii<fNParticleFunctions;ii++)
916 fParticleFunctions[ii]->ProcessSameEventParticles(partpair);
918 for(ii = 0;ii<fNTrackFunctions;ii++)
919 fTrackFunctions[ii]->ProcessSameEventParticles(trackpair);
921 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
922 fParticleAndTrackFunctions[ii]->ProcessSameEventParticles(trackpair,partpair);
926 if ( fBufferSize == 0) continue;//do not mix diff histograms
927 /***************************************/
928 /***** Filling denominators *********/
929 /***************************************/
930 TIter piter(&pbuffer);
931 TIter titer(&tbuffer);
934 while ( (partEvent3 = (AliHBTEvent*)piter.Next()) != 0x0)
936 trackEvent3 = (AliHBTEvent*)titer.Next();
937 if ( (j%fDisplayMixingInfo) == 0)
938 Info("ProcessTracksAndParticlesNonIdentAnal",
939 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
941 for (Int_t k = 0; k < partEvent3->GetNumberOfParticles() ; k++)
943 part2= partEvent3->GetParticle(k);
944 partpair->SetParticles(part1,part2);
946 track2= trackEvent3->GetParticle(k);
947 trackpair->SetParticles(track1,track2);
949 if( (fPairCut->PassPairProp(partpair)) ) //check pair cut
950 { //do not meets crietria of the pair cut
954 {//meets criteria of the pair cut
956 for(ii = 0;ii<fNParticleFunctions;ii++)
957 fParticleFunctions[ii]->ProcessDiffEventParticles(partpair);
959 for(ii = 0;ii<fNTrackFunctions;ii++)
960 fTrackFunctions[ii]->ProcessDiffEventParticles(trackpair);
962 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
963 fParticleAndTrackFunctions[ii]->ProcessDiffEventParticles(trackpair,partpair);
965 }// for particles event2
967 }//for over particles in event1
969 pbuffer.AddFirst(partEvent2);
970 tbuffer.AddFirst(trackEvent2);
975 }//end of loop over events (1)
976 pbuffer.SetOwner(); //to clean stored events by the way of buffer destruction
982 /*************************************************************************************/
984 void AliHBTAnalysis::ProcessTracksNonIdentAnal()
986 AliHBTParticle * track1, * track2;
988 AliHBTEvent * trackEvent1;
989 AliHBTEvent * trackEvent2;
990 AliHBTEvent * trackEvent3;
992 AliHBTEvent * rawtrackEvent;
994 Int_t Nev = fReader->GetNumberOfTrackEvents();
996 AliHBTPair * trackpair = new AliHBTPair();
1002 trackEvent1 = new AliHBTEvent();
1003 trackEvent1->SetOwner(kFALSE);
1005 Info("ProcessTracksNonIdentAnal","**************************************");
1006 Info("ProcessTracksNonIdentAnal","***** NON IDENT MODE ****************");
1007 Info("ProcessTracksNonIdentAnal","**************************************");
1009 for (Int_t i = 0;i<Nev;i++)
1011 rawtrackEvent = fReader->GetTrackEvent(i);
1012 if (rawtrackEvent == 0x0) continue;//in case of any error
1014 /********************************/
1016 /********************************/
1017 if ( (fBufferSize != 0) || ( trackEvent2==0x0) )//in case fBufferSize == 0 and pointers are created do not eneter
1018 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
1019 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
1020 trackEvent2 = (AliHBTEvent*)tbuffer.Remove(tbuffer.Last());
1025 trackEvent2 = new AliHBTEvent();
1026 trackEvent2->SetOwner(kFALSE);
1028 FilterOut(trackEvent1, trackEvent2, rawtrackEvent);
1030 for (Int_t j = 0; j<trackEvent1->GetNumberOfParticles() ; j++)
1032 if ( (j%fDisplayMixingInfo) == 0)
1033 Info("ProcessTracksNonIdentAnal",
1034 "Mixing particle %d from event %d with particles from event %d",j,i,i);
1036 track1= trackEvent1->GetParticle(j);
1038 for(ii = 0; ii<fNTrackMonitorFunctions; ii++)
1039 fTrackMonitorFunctions[ii]->ProcessSameEventParticles(track1);
1041 /***************************************/
1042 /****** filling numerators ********/
1043 /****** (particles from event2) ********/
1044 /***************************************/
1045 for (Int_t k = 0; k < trackEvent2->GetNumberOfParticles() ; k++)
1047 track2= trackEvent2->GetParticle(k);
1048 trackpair->SetParticles(track1,track2);
1051 if( fPairCut->PassPairProp(trackpair)) //check pair cut
1052 { //do not meets crietria of the pair cut
1056 {//meets criteria of the pair cut
1058 for(ii = 0;ii<fNTrackFunctions;ii++)
1059 fTrackFunctions[ii]->ProcessSameEventParticles(trackpair);
1062 if ( fBufferSize == 0) continue;//do not mix diff histograms
1063 /***************************************/
1064 /***** Filling denominators *********/
1065 /***************************************/
1066 TIter titer(&tbuffer);
1069 while ( (trackEvent3 = (AliHBTEvent*)titer.Next()) != 0x0)
1072 if ( (j%fDisplayMixingInfo) == 0)
1073 Info("ProcessTracksNonIdentAnal",
1074 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
1076 for (Int_t k = 0; k < trackEvent3->GetNumberOfParticles() ; k++)
1079 track2= trackEvent3->GetParticle(k);
1080 trackpair->SetParticles(track1,track2);
1083 if( fPairCut->PassPairProp(trackpair)) //check pair cut
1084 { //do not meets crietria of the pair cut
1088 {//meets criteria of the pair cut
1089 for(ii = 0;ii<fNTrackFunctions;ii++)
1090 fTrackFunctions[ii]->ProcessDiffEventParticles(trackpair);
1092 }// for particles event2
1094 }//for over particles in event1
1096 tbuffer.AddFirst(trackEvent2);
1099 }//end of loop over events (1)
1103 /*************************************************************************************/
1105 void AliHBTAnalysis::ProcessParticlesNonIdentAnal()
1107 AliHBTParticle * part1 = 0x0, * part2 = 0x0;
1109 AliHBTEvent * partEvent1 = 0x0;
1110 AliHBTEvent * partEvent2 = 0x0;
1111 AliHBTEvent * partEvent3 = 0x0;
1113 AliHBTEvent * rawpartEvent = 0x0;
1115 Int_t Nev = fReader->GetNumberOfPartEvents();
1117 AliHBTPair * partpair = new AliHBTPair();
1120 Int_t ninbuffer = 0;
1122 partEvent1 = new AliHBTEvent();
1123 partEvent1->SetOwner(kFALSE);;
1125 Info("ProcessParticlesNonIdentAnal","**************************************");
1126 Info("ProcessParticlesNonIdentAnal","***** NON IDENT MODE ****************");
1127 Info("ProcessParticlesNonIdentAnal","**************************************");
1129 for (Int_t i = 0;i<Nev;i++)
1131 rawpartEvent = fReader->GetParticleEvent(i);
1132 if ( rawpartEvent == 0x0 ) continue;//in case of any error
1134 /********************************/
1136 /********************************/
1137 if ((ninbuffer > fBufferSize) && (fBufferSize > 0))
1138 {//if we have in buffer desired number of events, use the last. If fBufferSize<0 mix all events for background
1139 partEvent2 = (AliHBTEvent*)pbuffer.Remove(pbuffer.Last()); //remove from the end to be reset, filled and put on the beginning
1144 partEvent2 = new AliHBTEvent();
1145 partEvent2->SetOwner(kFALSE);
1147 FilterOut(partEvent1, partEvent2, rawpartEvent);
1149 for (Int_t j = 0; j<partEvent1->GetNumberOfParticles() ; j++)
1151 if ( (j%fDisplayMixingInfo) == 0)
1152 Info("ProcessParticlesNonIdentAnal",
1153 "Mixing particle %d from event %d with particles from event %d",j,i,i);
1155 part1= partEvent1->GetParticle(j);
1158 for(zz = 0; zz<fNParticleMonitorFunctions; zz++)
1159 fParticleMonitorFunctions[zz]->ProcessSameEventParticles(part1);
1161 /***************************************/
1162 /****** filling numerators ********/
1163 /****** (particles from event2) ********/
1164 /***************************************/
1165 for (Int_t k = 0; k < partEvent2->GetNumberOfParticles() ; k++)
1167 part2= partEvent2->GetParticle(k);
1168 partpair->SetParticles(part1,part2);
1170 if(fPairCut->PassPairProp(partpair) ) //check pair cut
1171 { //do not meets crietria of the pair cut
1175 {//meets criteria of the pair cut
1177 for(ii = 0;ii<fNParticleFunctions;ii++)
1179 fParticleFunctions[ii]->ProcessSameEventParticles(partpair);
1183 /***************************************/
1184 /***** Filling denominators *********/
1185 /***************************************/
1186 TIter piter(&pbuffer);
1189 while ( (partEvent3 = (AliHBTEvent*)piter.Next()) != 0x0)
1191 if ( (j%fDisplayMixingInfo) == 0)
1192 Info("ProcessParticlesNonIdentAnal",
1193 "Mixing particle %d from event %d with particles from event %d",j,i,i-(++nmonitor));
1195 for (Int_t k = 0; k < partEvent3->GetNumberOfParticles() ; k++)
1197 part2= partEvent3->GetParticle(k);
1198 partpair->SetParticles(part1,part2);
1200 if(fPairCut->PassPairProp(partpair) ) //check pair cut
1201 { //do not meets crietria of the pair cut
1205 {//meets criteria of the pair cut
1207 for(ii = 0;ii<fNParticleFunctions;ii++)
1209 fParticleFunctions[ii]->ProcessDiffEventParticles(partpair);
1212 }// for particles event2
1214 }//for over particles in event1
1216 pbuffer.AddFirst(partEvent2);
1219 }//end of loop over events (1)
1221 pbuffer.SetOwner();//to delete stered events.
1224 /*************************************************************************************/
1225 void AliHBTAnalysis::FilterOut(AliHBTEvent* outpart1, AliHBTEvent* outpart2, AliHBTEvent* inpart,
1226 AliHBTEvent* outtrack1, AliHBTEvent* outtrack2, AliHBTEvent* intrack)
1228 //Puts particles accepted as a first particle by global cut in out1
1229 //and as a second particle in out2
1231 AliHBTParticle* part, *track;
1238 AliHBTParticleCut *cut1 = fPairCut->GetFirstPartCut();
1239 AliHBTParticleCut *cut2 = fPairCut->GetSecondPartCut();
1243 for (Int_t i = 0; i < inpart->GetNumberOfParticles(); i++)
1246 part = inpart->GetParticle(i);
1247 track = intrack->GetParticle(i);
1249 if ( (cut1->Pass(part)) ) in1 = kFALSE; //if part is rejected by cut1, in1 is false
1250 if ( (cut2->Pass(part)) ) in2 = kFALSE; //if part is rejected by cut2, in2 is false
1252 if (gDebug)//to be removed in real analysis
1253 if ( in1 && in2 ) //both cuts accepted, should never happen, just in case
1255 //Particle accpted by both cuts
1256 Error("FilterOut","Particle accepted by both cuts");
1262 outpart1->AddParticle(part);
1263 outtrack1->AddParticle(track);
1269 outpart2->AddParticle(part);
1270 outtrack2->AddParticle(track);
1275 /*************************************************************************************/
1277 void AliHBTAnalysis::FilterOut(AliHBTEvent* out1, AliHBTEvent* out2, AliHBTEvent* in)
1279 //Puts particles accepted as a first particle by global cut in out1
1280 //and as a second particle in out2
1281 AliHBTParticle* part;
1286 AliHBTParticleCut *cut1 = fPairCut->GetFirstPartCut();
1287 AliHBTParticleCut *cut2 = fPairCut->GetSecondPartCut();
1291 for (Int_t i = 0; i < in->GetNumberOfParticles(); i++)
1294 part = in->GetParticle(i);
1296 if ( cut1->Pass(part) ) in1 = kFALSE; //if part is rejected by cut1, in1 is false
1297 if ( cut2->Pass(part) ) in2 = kFALSE; //if part is rejected by cut2, in2 is false
1299 if (gDebug)//to be removed in real analysis
1300 if ( in1 && in2 ) //both cuts accepted, should never happen, just in case
1302 //Particle accpted by both cuts
1303 Error("FilterOut","Particle accepted by both cuts");
1309 out1->AddParticle(part);
1315 out2->AddParticle(part);
1320 /*************************************************************************************/
1322 Bool_t AliHBTAnalysis::IsNonIdentAnalysis()
1324 //checks if it is possible to use special analysis for non identical particles
1325 //it means - in global pair cut first particle id is different than second one
1326 //and both are different from 0
1327 //in the future is possible to perform more sophisticated check
1328 //if cuts have excluding requirements
1330 if (fPairCut->IsEmpty())
1333 if (fPairCut->GetFirstPartCut()->IsEmpty())
1336 if (fPairCut->GetSecondPartCut()->IsEmpty())
1339 Int_t id1 = fPairCut->GetFirstPartCut()->GetPID();
1340 Int_t id2 = fPairCut->GetSecondPartCut()->GetPID();
1342 if ( (id1==0) || (id2==0) || (id1==id2) )