2 #include "AliHBTAnalysis.h"
7 #include "AliHBTEvent.h"
8 #include "AliHBTReader.h"
9 #include "AliHBTParticle.h"
10 #include "AliHBTParticleCut.h"
11 #include "AliHBTPair.h"
12 #include "AliHBTPairCut.h"
13 #include "AliHBTFunction.h"
15 #include <TBenchmark.h>
20 ClassImp(AliHBTAnalysis)
22 const UInt_t AliHBTAnalysis::fgkFctnArraySize = 100;
23 const Int_t AliHBTAnalysis::fgkHbtAnalyzeAll = 0;
25 AliHBTAnalysis::AliHBTAnalysis()
29 fTrackFunctions = new AliHBTOnePairFctn* [fgkFctnArraySize];
30 fParticleFunctions = new AliHBTOnePairFctn* [fgkFctnArraySize];
31 fParticleAndTrackFunctions = new AliHBTTwoPairFctn* [fgkFctnArraySize];
34 fNParticleFunctions = 0;
35 fNParticleAndTrackFunctions = 0;
37 fPairCut = new AliHBTEmptyPairCut();//empty cut - accepts all particles
41 /*************************************************************************************/
43 AliHBTAnalysis::~AliHBTAnalysis()
46 //note that we do not delete functions itself
47 // they should be deleted by whom where created
48 //we only store pointers, and we use "new" only for pointers array
49 delete [] fTrackFunctions;
50 delete [] fParticleFunctions;
51 delete [] fParticleAndTrackFunctions;
53 delete fPairCut; // always have an copy of an object - we create we dstroy
56 /*************************************************************************************/
58 void AliHBTAnalysis::Process(Option_t* option)
60 //default option = "TracksAndParticles"
61 //Main method of the HBT Analysis Package
62 //It triggers reading with the global cut (default is an empty cut)
63 //Than it checks options and data which are read
64 //if everything is OK, then it calls one of the looping methods
65 //depending on tfReaderhe option
66 //These methods differs on what thay are looping on
69 //--------------------------------------------------------------------
70 //ProcessTracksAndParticles - "TracksAndParticles"
72 // it loops over both, tracks(reconstructed) and particles(simulated)
73 // all function gethered in all 3 lists are called for each (double)pair
75 //ProcessTracks - "Tracks"
76 // it loops only on tracks(reconstructed),
77 // functions ONLY from fTrackFunctions list are called
79 //ProcessParticles - "Particles"
80 // it loops only on particles(simulated),
81 // functions ONLY from fParticleAndTrackFunctions list are called
86 Error("Process","The reader is not set");
91 const char *oT = strstr(option,"Tracks");
92 const char *oP = strstr(option,"Particles");
94 Bool_t nonid = IsNonIdentAnalysis();
98 if (fReader->GetNumberOfPartEvents() <1)
100 Error("Process","There is no Particles. Maybe change the option?");
103 if (fReader->GetNumberOfTrackEvents() <1)
105 Error("Process","There is no Tracks. Maybe change the option?");
109 if ( RunCoherencyCheck() )
112 "Coherency check not passed. Maybe change the option?\n");
115 if (nonid) ProcessTracksAndParticlesNonIdentAnal();
116 else ProcessTracksAndParticles();
122 if (fReader->GetNumberOfTrackEvents() <1)
124 Error("Process","There is no data to analyze.");
127 if (nonid) ProcessTracksNonIdentAnal();
128 else ProcessTracks();
134 if (fReader->GetNumberOfPartEvents() <1)
136 Error("Process","There is no data to analyze.");
139 if (nonid) ProcessParticlesNonIdentAnal();
140 else ProcessParticles();
142 // cout<<"NON ID"<<endl;
143 // ProcessParticlesNonIdentAnal();
144 // cout<<"\n\n\n NORMAL"<<endl;
145 // ProcessParticles();
152 /*************************************************************************************/
154 void AliHBTAnalysis::ProcessTracksAndParticles()
157 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
158 //the loops are splited
161 AliHBTParticle * part1, * part2;
162 AliHBTParticle * track1, * track2;
164 AliHBTEvent * trackEvent, *partEvent;
165 AliHBTEvent * trackEvent2,*partEvent2;
167 // Int_t N1, N2, N=0; //number of particles in current event(we prcess two events in one time)
169 Int_t Nev = fReader->GetNumberOfTrackEvents();
171 /***************************************/
172 /****** Looping same events ********/
173 /****** filling numerators ********/
174 /***************************************/
175 AliHBTPair * trackpair = new AliHBTPair();
176 AliHBTPair * partpair = new AliHBTPair();
178 AliHBTPair * tmptrackpair;//temprary pointers to pairs
179 AliHBTPair * tmppartpair;
183 for (Int_t i = 0;i<Nev;i++)
185 partEvent= fReader->GetParticleEvent(i);
186 trackEvent = fReader->GetTrackEvent(i);
188 if (!partEvent) continue;
192 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
194 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i<<endl;
196 part1= partEvent->GetParticle(j);
197 track1= trackEvent->GetParticle(j);
199 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
201 part2= partEvent->GetParticle(k);
202 partpair->SetParticles(part1,part2);
204 track2= trackEvent->GetParticle(k);
205 trackpair->SetParticles(track1,track2);
207 if(fPairCut->Pass(partpair) || (fPairCut->Pass(trackpair))) //check pair cut
208 { //do not meets crietria of the pair cut, try with swaped pairs
209 if( ( fPairCut->Pass(partpair->GetSwapedPair()) ) || ( fPairCut->Pass(trackpair->GetSwapedPair()) ) )
210 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
212 { //swaped pair meets all the criteria
213 tmppartpair = partpair->GetSwapedPair();
214 tmptrackpair = trackpair->GetSwapedPair();
219 {//meets criteria of the pair cut
220 tmptrackpair = trackpair;
221 tmppartpair = partpair;
224 for(ii = 0;ii<fNParticleFunctions;ii++)
225 fParticleFunctions[ii]->ProcessSameEventParticles(tmppartpair);
227 for(ii = 0;ii<fNTrackFunctions;ii++)
228 fTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair);
230 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
231 fParticleAndTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair,tmppartpair);
237 /***** Filling denominators *********/
238 /***************************************/
239 for (Int_t i = 0;i<Nev-1;i++) //In each event (but last) ....
242 partEvent= fReader->GetParticleEvent(i);
243 if (!partEvent) continue;
245 trackEvent = fReader->GetTrackEvent(i);
249 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
252 part1= partEvent->GetParticle(j);
254 track1= trackEvent->GetParticle(j);
258 if ( ((i+fBufferSize) >= Nev) ||( fBufferSize < 0) ) //if buffer size is negative
259 //or current event+buffersize is greater
260 //than max nuber of events
262 NNN = Nev; //set the max event number
266 NNN = i+fBufferSize; //set the current event number + fBufferSize
269 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
272 partEvent2= fReader->GetParticleEvent(k);
273 if (!partEvent2) continue;
275 trackEvent2 = fReader->GetTrackEvent(k);
277 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<k<<endl;
279 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
282 // if (N>MAXCOMB) break;
284 part2= partEvent2->GetParticle(l);
285 partpair->SetParticles(part1,part2);
287 track2= trackEvent2->GetParticle(l);
288 trackpair->SetParticles(track1,track2);
290 if( (fPairCut->Pass(partpair)) || (fPairCut->Pass(trackpair)) ) //check pair cut
291 { //do not meets crietria of the
292 if( ( fPairCut->Pass(partpair->GetSwapedPair()) ) || ( fPairCut->Pass(trackpair->GetSwapedPair()) ) )
296 tmppartpair = partpair->GetSwapedPair();
297 tmptrackpair = trackpair->GetSwapedPair();
301 {//meets criteria of the pair cut
302 tmptrackpair = trackpair;
303 tmppartpair = partpair;
306 for(ii = 0;ii<fNParticleFunctions;ii++)
307 fParticleFunctions[ii]->ProcessDiffEventParticles(tmppartpair);
309 for(ii = 0;ii<fNTrackFunctions;ii++)
310 fTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair);
312 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
313 fParticleAndTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair,tmppartpair);
316 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
317 }//for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
322 /***************************************/
326 /*************************************************************************************/
328 void AliHBTAnalysis::ProcessTracks()
330 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
331 //the loops are splited
332 AliHBTParticle * track1, * track2;
334 AliHBTEvent * trackEvent;
335 AliHBTEvent * trackEvent2;
337 // Int_t N1, N2, N=0; //number of particles in current event(we prcess two events in one time)
339 Int_t Nev = fReader->GetNumberOfTrackEvents();
341 /***************************************/
342 /****** Looping same events ********/
343 /****** filling numerators ********/
344 /***************************************/
345 AliHBTPair * trackpair = new AliHBTPair();
346 AliHBTPair * tmptrackpair; //temporary pointer
348 for (Int_t i = 0;i<Nev;i++)
350 trackEvent = fReader->GetTrackEvent(i);
351 if (!trackEvent) continue;
354 for (Int_t j = 0; j<trackEvent->GetNumberOfParticles() ; j++)
356 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i<<endl;
358 track1= trackEvent->GetParticle(j);
360 for (Int_t k =j+1; k < trackEvent->GetNumberOfParticles() ; k++)
362 track2= trackEvent->GetParticle(k);
363 trackpair->SetParticles(track1,track2);
364 if(fPairCut->Pass(trackpair)) //check pair cut
365 { //do not meets crietria of the
366 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
367 else tmptrackpair = trackpair->GetSwapedPair();
371 tmptrackpair = trackpair;
375 for(ii = 0;ii<fNTrackFunctions;ii++)
376 fTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair);
383 /***************************************/
384 /***** Filling diff histogram *********/
385 /***************************************/
386 for (Int_t i = 0;i<Nev-1;i++) //In each event (but last) ....
388 trackEvent = fReader->GetTrackEvent(i);
389 if (!trackEvent) continue;
392 for (Int_t j = 0; j< trackEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
394 // if (N>MAXCOMB) break;
396 track1= trackEvent->GetParticle(j);
400 if ( ((i+fBufferSize) >= Nev) ||( fBufferSize < 0) ) //if buffer size is negative
401 //or current event+buffersize is greater
402 //than max nuber of events
404 NNN = Nev; //set the max event number
408 NNN = i+fBufferSize; //set the current event number + fBufferSize
411 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
414 trackEvent2 = fReader->GetTrackEvent(k);
415 if (!trackEvent2) continue;
417 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<k<<endl;
419 for(Int_t l = 0; l<trackEvent2->GetNumberOfParticles();l++) // ... on all particles
422 // if (N>MAXCOMB) break;
423 track2= trackEvent2->GetParticle(l);
424 trackpair->SetParticles(track1,track2);
426 if(fPairCut->Pass(trackpair)) //check pair cut
427 { //do not meets crietria of the
428 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
429 else tmptrackpair = trackpair->GetSwapedPair();
433 tmptrackpair = trackpair;
436 for(ii = 0;ii<fNTrackFunctions;ii++)
437 fTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair);
439 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
440 }//for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
445 /***************************************/
450 /*************************************************************************************/
452 void AliHBTAnalysis::ProcessParticles()
454 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
455 //the loops are splited
456 AliHBTParticle * part1, * part2;
458 AliHBTEvent * partEvent;
459 AliHBTEvent * partEvent2;
461 AliHBTPair * partpair = new AliHBTPair();
462 AliHBTPair * tmppartpair; //temporary pointer to the pair
464 // Int_t N1, N2, N=0; //number of particles in current event(we prcess two events in one time)
466 Int_t Nev = fReader->GetNumberOfPartEvents();
469 /***************************************/
470 /****** Looping same events ********/
471 /****** filling numerators ********/
472 /***************************************/
473 // gBenchmark->Start("id");
475 for (Int_t i = 0;i<Nev;i++)
477 partEvent= fReader->GetParticleEvent(i);
478 if (!partEvent) continue;
481 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
483 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i<<endl;
485 part1= partEvent->GetParticle(j);
487 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
489 part2= partEvent->GetParticle(k);
490 partpair->SetParticles(part1,part2);
492 if( fPairCut->Pass(partpair) ) //check pair cut
493 { //do not meets crietria of the pair cut, try with swaped pairs
494 if( fPairCut->Pass(partpair->GetSwapedPair() ) )
495 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
497 { //swaped pair meets all the criteria
498 tmppartpair = partpair->GetSwapedPair();
503 tmppartpair = partpair;
508 for(ii = 0;ii<fNParticleFunctions;ii++)
509 fParticleFunctions[ii]->ProcessSameEventParticles(tmppartpair);
514 /***************************************/
515 /***** Filling diff histogram *********/
516 /***************************************/
517 for (Int_t i = 0;i<Nev-1;i++) //In each event (but last)....
519 partEvent= fReader->GetParticleEvent(i);
520 if (!partEvent) continue;
524 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
526 // if (N>MAXCOMB) break;
528 part1= partEvent->GetParticle(j);
532 if ( ((i+fBufferSize) >= Nev) ||( fBufferSize < 0) ) //if buffer size is negative
533 //or current event+buffersize is greater
534 //than max nuber of events
536 NNN = Nev; //set the max event number
540 NNN = i+fBufferSize; //set the current event number + fBufferSize
543 // cout<<"NNN = "<<NNN<<endl;
544 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
547 partEvent2= fReader->GetParticleEvent(k);
548 if (!partEvent2) continue;
550 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<k<<endl;
552 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
555 // if (N>MAXCOMB) break;
556 part2= partEvent2->GetParticle(l);
557 partpair->SetParticles(part1,part2);
559 if(fPairCut->Pass(partpair)) //check pair cut
560 { //do not meets crietria of the
561 if( fPairCut->Pass(partpair->GetSwapedPair()) ) continue;
562 else tmppartpair = partpair->GetSwapedPair();
566 tmppartpair = partpair;
569 for(ii = 0;ii<fNParticleFunctions;ii++)
570 fParticleFunctions[ii]->ProcessDiffEventParticles(tmppartpair);
572 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
573 }//for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
578 /***************************************/
580 // gBenchmark->Stop("id");
581 // gBenchmark->Show("id");
585 /*************************************************************************************/
588 void AliHBTAnalysis::WriteFunctions()
591 for(ii = 0;ii<fNParticleFunctions;ii++)
592 fParticleFunctions[ii]->Write();
594 for(ii = 0;ii<fNTrackFunctions;ii++)
595 fTrackFunctions[ii]->Write();
597 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
598 fParticleAndTrackFunctions[ii]->Write();
600 /*************************************************************************************/
602 void AliHBTAnalysis::SetGlobalPairCut(AliHBTPairCut* cut)
606 Error("AliHBTAnalysis::SetGlobalPairCut","Pointer is NULL. Ignoring");
609 fPairCut = (AliHBTPairCut*)cut->Clone();
612 /*************************************************************************************/
614 void AliHBTAnalysis::AddTrackFunction(AliHBTOnePairFctn* f)
616 if (f == 0x0) return;
617 if (fNTrackFunctions == fgkFctnArraySize)
619 Error("AliHBTAnalysis::AddTrackFunction","Can not add this function, not enough place in the array.");
621 fTrackFunctions[fNTrackFunctions] = f;
624 /*************************************************************************************/
626 void AliHBTAnalysis::AddParticleFunction(AliHBTOnePairFctn* f)
628 if (f == 0x0) return;
630 if (fNParticleFunctions == fgkFctnArraySize)
632 Error("AliHBTAnalysis::AddParticleFunction","Can not add this function, not enough place in the array.");
634 fParticleFunctions[fNParticleFunctions] = f;
635 fNParticleFunctions++;
639 void AliHBTAnalysis::AddParticleAndTrackFunction(AliHBTTwoPairFctn* f)
641 if (f == 0x0) return;
642 if (fNParticleAndTrackFunctions == fgkFctnArraySize)
644 Error("AliHBTAnalysis::AddParticleAndTrackFunction","Can not add this function, not enough place in the array.");
646 fParticleAndTrackFunctions[fNParticleAndTrackFunctions] = f;
647 fNParticleAndTrackFunctions++;
651 /*************************************************************************************/
654 /*************************************************************************************/
656 Bool_t AliHBTAnalysis::RunCoherencyCheck()
658 //Checks if both HBTRuns are similar
659 //return true if error found
660 //if they seem to be OK return false
662 cout<<"Checking HBT Runs Coherency"<<endl;
664 cout<<"Number of events ..."; fflush(stdout);
666 if (fReader->GetNumberOfPartEvents() == fReader->GetNumberOfTrackEvents() ) //check whether there is the same number of events
668 cout<<"OK. "<<fReader->GetNumberOfTrackEvents()<<" found"<<endl;
671 { //if not the same - ERROR
672 Error("AliHBTAnalysis::RunCoherencyCheck()",
673 "Number of simulated events (%d) is not equal to number of reconstructed events(%d)",
674 fReader->GetNumberOfPartEvents(),fReader->GetNumberOfTrackEvents());
678 cout<<"Checking number of Particles AND Particles Types in each event ...";fflush(stdout);
680 AliHBTEvent *partEvent;
681 AliHBTEvent *trackEvent;
682 for( i = 0; i<fReader->GetNumberOfTrackEvents();i++)
684 partEvent= fReader->GetParticleEvent(i); //gets the "ith" event
685 trackEvent = fReader->GetTrackEvent(i);
687 if ( (partEvent == 0x0) && (partEvent == 0x0) ) continue;
688 if ( (partEvent == 0x0) || (partEvent == 0x0) )
690 Error("AliHBTAnalysis::RunCoherencyCheck()",
691 "One event is NULL and the other one not. Event Number %d",i);
695 if ( partEvent->GetNumberOfParticles() != trackEvent->GetNumberOfParticles() )
697 Error("AliHBTAnalysis::RunCoherencyCheck()",
698 "Event %d: Number of simulated particles (%d) not equal to number of reconstructed tracks (%d)",
699 i,partEvent->GetNumberOfParticles() , trackEvent->GetNumberOfParticles());
703 for (Int_t j = 0; j<partEvent->GetNumberOfParticles(); j++)
705 if( partEvent->GetParticle(j)->GetPdgCode() != trackEvent->GetParticle(j)->GetPdgCode() )
707 Error("AliHBTAnalysis::RunCoherencyCheck()",
708 "Event %d: Particle %d: PID of simulated particle (%d) not the same of reconstructed track (%d)",
709 i,j, partEvent->GetParticle(j)->GetPdgCode(),trackEvent->GetParticle(j)->GetPdgCode() );
716 cout<<" Everything looks OK"<<endl;
720 /*************************************************************************************/
722 void AliHBTAnalysis::ProcessTracksAndParticlesNonIdentAnal()
724 AliHBTParticle * part1, * part2;
725 AliHBTParticle * track1, * track2;
727 AliHBTEvent * trackEvent1,*partEvent1;
728 AliHBTEvent * trackEvent2,*partEvent2;
729 AliHBTEvent * trackEvent3,*partEvent3;
731 AliHBTEvent * rawtrackEvent, *rawpartEvent;
732 // AliHBTEvent * rawtrackEvent2,*rawpartEvent2;
735 Int_t Nev = fReader->GetNumberOfTrackEvents();
737 AliHBTPair * trackpair = new AliHBTPair();
738 AliHBTPair * partpair = new AliHBTPair();
744 trackEvent1 = new AliHBTEvent();
745 partEvent1 = new AliHBTEvent();
746 trackEvent1->SetOwner(kFALSE);
747 partEvent1->SetOwner(kFALSE);;
749 cout<<"**************************************"<<endl;
750 cout<<"***** NON IDENT MODE ****************"<<endl;
751 cout<<"**************************************"<<endl;
752 for (Int_t i = 0;i<Nev;i++)
754 rawpartEvent = fReader->GetParticleEvent(i);
755 rawtrackEvent = fReader->GetTrackEvent(i);
756 if ( (rawpartEvent == 0x0) || (rawtrackEvent == 0x0) ) continue;//in case of any error
758 /********************************/
760 /********************************/
761 if (ninbuffer > fBufferSize)
763 partEvent2 = (AliHBTEvent*)pbuffer.Remove(pbuffer.Last()); //remove from the end to be reset, filled and put on the beginning
764 trackEvent2 = (AliHBTEvent*)tbuffer.Remove(tbuffer.Last());
769 partEvent2 = new AliHBTEvent();
770 trackEvent2 = new AliHBTEvent();
771 partEvent2->SetOwner(kFALSE);
772 trackEvent2->SetOwner(kFALSE);
774 FilterOut(partEvent1, partEvent2, rawpartEvent, trackEvent1, trackEvent2, rawtrackEvent);
776 for (Int_t j = 0; j<partEvent1->GetNumberOfParticles() ; j++)
778 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i<<endl;
780 part1= partEvent1->GetParticle(j);
781 track1= trackEvent1->GetParticle(j);
784 /***************************************/
785 /****** filling numerators ********/
786 /****** (particles from event2) ********/
787 /***************************************/
788 for (Int_t k = 0; k < partEvent2->GetNumberOfParticles() ; k++)
790 part2= partEvent2->GetParticle(k);
791 partpair->SetParticles(part1,part2);
793 track2= trackEvent2->GetParticle(k);
794 trackpair->SetParticles(track1,track2);
797 if( (fPairCut->PassPairProp(partpair)) || (fPairCut->PassPairProp(trackpair))) //check pair cut
798 { //do not meets crietria of the pair cut
802 {//meets criteria of the pair cut
804 for(ii = 0;ii<fNParticleFunctions;ii++)
805 fParticleFunctions[ii]->ProcessSameEventParticles(partpair);
807 for(ii = 0;ii<fNTrackFunctions;ii++)
808 fTrackFunctions[ii]->ProcessSameEventParticles(trackpair);
810 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
811 fParticleAndTrackFunctions[ii]->ProcessSameEventParticles(trackpair,partpair);
814 /***************************************/
815 /***** Filling denominators *********/
816 /***************************************/
817 TIter piter(&pbuffer);
818 TIter titer(&tbuffer);
821 while ( (partEvent3 = (AliHBTEvent*)piter.Next()) != 0x0)
823 trackEvent3 = (AliHBTEvent*)titer.Next();
824 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i - (++nmonitor)<<endl;
826 for (Int_t k = 0; k < partEvent3->GetNumberOfParticles() ; k++)
828 part2= partEvent3->GetParticle(k);
829 partpair->SetParticles(part1,part2);
831 track2= trackEvent3->GetParticle(k);
832 trackpair->SetParticles(track1,track2);
835 if( (fPairCut->PassPairProp(partpair)) || (fPairCut->PassPairProp(trackpair))) //check pair cut
836 { //do not meets crietria of the pair cut
840 {//meets criteria of the pair cut
842 for(ii = 0;ii<fNParticleFunctions;ii++)
843 fParticleFunctions[ii]->ProcessDiffEventParticles(partpair);
845 for(ii = 0;ii<fNTrackFunctions;ii++)
846 fTrackFunctions[ii]->ProcessDiffEventParticles(trackpair);
848 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
849 fParticleAndTrackFunctions[ii]->ProcessDiffEventParticles(trackpair,partpair);
851 }// for particles event2
853 }//for over particles in event1
855 pbuffer.AddFirst(partEvent2);
856 tbuffer.AddFirst(trackEvent2);
859 }//end of loop over events (1)
861 pbuffer.SetOwner(); //to clean stored events by the way of buffer destruction
864 /*************************************************************************************/
866 void AliHBTAnalysis::ProcessTracksNonIdentAnal()
868 AliHBTParticle * track1, * track2;
870 AliHBTEvent * trackEvent1;
871 AliHBTEvent * trackEvent2;
872 AliHBTEvent * trackEvent3;
874 AliHBTEvent * rawtrackEvent;
875 // AliHBTEvent * rawtrackEvent2,*rawpartEvent2;
878 Int_t Nev = fReader->GetNumberOfTrackEvents();
880 AliHBTPair * trackpair = new AliHBTPair();
885 trackEvent1 = new AliHBTEvent();
886 trackEvent1->SetOwner(kFALSE);
888 cout<<"**************************************"<<endl;
889 cout<<"***** NON IDENT MODE ****************"<<endl;
890 cout<<"**************************************"<<endl;
891 for (Int_t i = 0;i<Nev;i++)
893 rawtrackEvent = fReader->GetTrackEvent(i);
894 if (rawtrackEvent == 0x0) continue;//in case of any error
896 /********************************/
898 /********************************/
899 if (ninbuffer > fBufferSize)
901 trackEvent2 = (AliHBTEvent*)tbuffer.Remove(tbuffer.Last());
906 trackEvent2 = new AliHBTEvent();
907 trackEvent2->SetOwner(kFALSE);
909 FilterOut(trackEvent1, trackEvent2, rawtrackEvent);
911 for (Int_t j = 0; j<trackEvent1->GetNumberOfParticles() ; j++)
913 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i<<endl;
915 track1= trackEvent1->GetParticle(j);
918 /***************************************/
919 /****** filling numerators ********/
920 /****** (particles from event2) ********/
921 /***************************************/
922 for (Int_t k = 0; k < trackEvent2->GetNumberOfParticles() ; k++)
924 track2= trackEvent2->GetParticle(k);
925 trackpair->SetParticles(track1,track2);
928 if( fPairCut->PassPairProp(trackpair)) //check pair cut
929 { //do not meets crietria of the pair cut
933 {//meets criteria of the pair cut
935 for(ii = 0;ii<fNTrackFunctions;ii++)
936 fTrackFunctions[ii]->ProcessSameEventParticles(trackpair);
939 /***************************************/
940 /***** Filling denominators *********/
941 /***************************************/
942 TIter titer(&tbuffer);
945 while ( (trackEvent3 = (AliHBTEvent*)titer.Next()) != 0x0)
948 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i - (++nmonitor)<<endl;
950 for (Int_t k = 0; k < trackEvent3->GetNumberOfParticles() ; k++)
953 track2= trackEvent3->GetParticle(k);
954 trackpair->SetParticles(track1,track2);
957 if( fPairCut->PassPairProp(trackpair)) //check pair cut
958 { //do not meets crietria of the pair cut
962 {//meets criteria of the pair cut
964 for(ii = 0;ii<fNTrackFunctions;ii++)
965 fTrackFunctions[ii]->ProcessDiffEventParticles(trackpair);
968 }// for particles event2
970 }//for over particles in event1
972 tbuffer.AddFirst(trackEvent2);
975 }//end of loop over events (1)
979 /*************************************************************************************/
981 void AliHBTAnalysis::ProcessParticlesNonIdentAnal()
983 AliHBTParticle * part1 = 0x0, * part2 = 0x0;
985 AliHBTEvent * partEvent1 = 0x0;
986 AliHBTEvent * partEvent2 = 0x0;
987 AliHBTEvent * partEvent3 = 0x0;
989 AliHBTEvent * rawpartEvent = 0x0;
991 Int_t Nev = fReader->GetNumberOfPartEvents();
993 AliHBTPair * partpair = new AliHBTPair();
998 partEvent1 = new AliHBTEvent();
999 partEvent1->SetOwner(kFALSE);;
1001 cout<<"**************************************"<<endl;
1002 cout<<"***** PART NON IDENT MODE ******"<<endl;
1003 cout<<"**************************************"<<endl;
1005 // gBenchmark->Start("non_id");
1006 for (Int_t i = 0;i<Nev;i++)
1008 rawpartEvent = fReader->GetParticleEvent(i);
1009 if ( rawpartEvent == 0x0 ) continue;//in case of any error
1011 /********************************/
1013 /********************************/
1014 if (ninbuffer > fBufferSize)
1016 partEvent2 = (AliHBTEvent*)pbuffer.Remove(pbuffer.Last()); //remove from the end to be reset, filled and put on the beginning
1021 partEvent2 = new AliHBTEvent();
1022 partEvent2->SetOwner(kFALSE);
1024 FilterOut(partEvent1, partEvent2, rawpartEvent);
1026 for (Int_t j = 0; j<partEvent1->GetNumberOfParticles() ; j++)
1028 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i<<endl;
1030 part1= partEvent1->GetParticle(j);
1033 /***************************************/
1034 /****** filling numerators ********/
1035 /****** (particles from event2) ********/
1036 /***************************************/
1037 for (Int_t k = 0; k < partEvent2->GetNumberOfParticles() ; k++)
1039 part2= partEvent2->GetParticle(k);
1040 partpair->SetParticles(part1,part2);
1042 if(fPairCut->PassPairProp(partpair) ) //check pair cut
1043 { //do not meets crietria of the pair cut
1047 {//meets criteria of the pair cut
1049 for(ii = 0;ii<fNParticleFunctions;ii++)
1050 fParticleFunctions[ii]->ProcessSameEventParticles(partpair);
1054 /***************************************/
1055 /***** Filling denominators *********/
1056 /***************************************/
1057 TIter piter(&pbuffer);
1060 while ( (partEvent3 = (AliHBTEvent*)piter.Next()) != 0x0)
1062 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i - (++nmonitor)<<endl;
1064 for (Int_t k = 0; k < partEvent3->GetNumberOfParticles() ; k++)
1066 part2= partEvent3->GetParticle(k);
1067 partpair->SetParticles(part1,part2);
1070 if(fPairCut->PassPairProp(partpair) ) //check pair cut
1071 { //do not meets crietria of the pair cut
1075 {//meets criteria of the pair cut
1077 for(ii = 0;ii<fNParticleFunctions;ii++)
1078 fParticleFunctions[ii]->ProcessDiffEventParticles(partpair);
1081 }// for particles event2
1083 }//for over particles in event1
1085 pbuffer.AddFirst(partEvent2);
1088 }//end of loop over events (1)
1090 // gBenchmark->Stop("non_id");
1091 // gBenchmark->Show("non_id");
1092 pbuffer.SetOwner();//to delete stered events.
1095 /*************************************************************************************/
1096 void AliHBTAnalysis::FilterOut(AliHBTEvent* outpart1, AliHBTEvent* outpart2, AliHBTEvent* inpart,
1097 AliHBTEvent* outtrack1, AliHBTEvent* outtrack2, AliHBTEvent* intrack)
1099 //Puts particles accepted as a first particle by global cut in out1
1100 //and as a second particle in out2
1102 AliHBTParticle* part, *track;
1109 AliHBTParticleCut *cut1 = fPairCut->GetFirstPartCut();
1110 AliHBTParticleCut *cut2 = fPairCut->GetSecondPartCut();
1114 for (Int_t i = 0; i < inpart->GetNumberOfParticles(); i++)
1117 part = inpart->GetParticle(i);
1118 track = intrack->GetParticle(i);
1120 if ( (cut1->Pass(part)) || ( cut1->Pass(track) ) ) in1 = kFALSE; //if any, part or track, is rejected by cut1, in1 is false
1121 if ( (cut2->Pass(part)) || ( cut2->Pass(track) ) ) in2 = kFALSE; //if any, part or track, is rejected by cut2, in2 is false
1123 if (gDebug)//to be removed in real analysis
1124 if ( in1 && in2 ) //both cuts accepted, should never happen, just in case
1126 //Particle accpted by both cuts
1127 Error("FilterOut","Particle accepted by both cuts");
1133 outpart1->AddParticle(part);
1134 outtrack1->AddParticle(track);
1140 outpart2->AddParticle(part);
1141 outtrack2->AddParticle(track);
1149 /*************************************************************************************/
1150 void AliHBTAnalysis::FilterOut(AliHBTEvent* out1, AliHBTEvent* out2, AliHBTEvent* in)
1152 //Puts particles accepted as a first particle by global cut in out1
1153 //and as a second particle in out2
1154 AliHBTParticle* part;
1159 AliHBTParticleCut *cut1 = fPairCut->GetFirstPartCut();
1160 AliHBTParticleCut *cut2 = fPairCut->GetSecondPartCut();
1164 for (Int_t i = 0; i < in->GetNumberOfParticles(); i++)
1167 part = in->GetParticle(i);
1169 if ( cut1->Pass(part) ) in1 = kFALSE; //if part is rejected by cut1, in1 is false
1170 if ( cut2->Pass(part) ) in2 = kFALSE; //if part is rejected by cut2, in2 is false
1172 if (gDebug)//to be removed in real analysis
1173 if ( in1 && in2 ) //both cuts accepted, should never happen, just in case
1175 //Particle accpted by both cuts
1176 Error("FilterOut","Particle accepted by both cuts");
1182 out1->AddParticle(part);
1188 out2->AddParticle(part);
1193 /*************************************************************************************/
1195 Bool_t AliHBTAnalysis::IsNonIdentAnalysis()
1197 //checks if it is possible to use special analysis for non identical particles
1198 //it means - in global pair cut first particle id is different than second one
1199 //and both are different from 0
1200 //in the future is possible to perform more sophisticated check
1201 //if cuts have excluding requirements
1203 if (fPairCut->IsEmpty()) return kFALSE;
1204 if (fPairCut->GetFirstPartCut()->IsEmpty()) return kFALSE;
1205 if (fPairCut->GetSecondPartCut()->IsEmpty()) return kFALSE;
1207 Int_t id1 = fPairCut->GetFirstPartCut()->GetPID();
1208 Int_t id2 = fPairCut->GetSecondPartCut()->GetPID();
1210 if ( (id1==0) || (id2==0) || (id1==id2) ) return kFALSE;