2 #include "AliHBTAnalysis.h"
7 #include "AliHBTReader.h"
8 #include "AliHBTParticle.h"
9 #include "AliHBTParticleCut.h"
10 #include "AliHBTPair.h"
11 #include "AliHBTPairCut.h"
12 #include "AliHBTFunction.h"
18 ClassImp(AliHBTAnalysis)
20 const UInt_t AliHBTAnalysis::fgkFctnArraySize = 100;
21 const Int_t AliHBTAnalysis::fgkHbtAnalyzeAll = 0;
23 AliHBTAnalysis::AliHBTAnalysis()
27 fTrackFunctions = new AliHBTTwoPartFctn* [fgkFctnArraySize];
28 fParticleFunctions = new AliHBTTwoPartFctn* [fgkFctnArraySize];
29 fParticleAndTrackFunctions = new AliHBTFourPartFctn* [fgkFctnArraySize];
32 fNParticleFunctions = 0;
33 fNParticleAndTrackFunctions = 0;
35 fPairCut = new AliHBTEmptyPairCut();//empty cut - accepts all particles
38 /*************************************************************************************/
40 AliHBTAnalysis::~AliHBTAnalysis()
43 //note that we do not delete functions itself
44 // they should be deleted by whom where created
45 //we only store pointers, and we use "new" only for pointers array
46 delete [] fTrackFunctions;
47 delete [] fParticleFunctions;
48 delete [] fParticleAndTrackFunctions;
50 delete fPairCut; // always have an copy of an object - we create we dstroy
53 /*************************************************************************************/
55 void AliHBTAnalysis::Process(Option_t* option)
57 //default option = "TracksAndParticles"
58 //Main method of the HBT Analysis Package
59 //It triggers reading with the global cut (default is an empty cut)
60 //Than it checks options and data which are read
61 //if everything is OK, then it calls one of the looping methods
62 //depending on tfReaderhe option
63 //These methods differs on what thay are looping on
66 //--------------------------------------------------------------------
67 //ProcessTracksAndParticles - "TracksAndParticles"
69 // it loops over both, tracks(reconstructed) and particles(simulated)
70 // all function gethered in all 3 lists are called for each (double)pair
72 //ProcessTracks - "Tracks"
73 // it loops only on tracks(reconstructed),
74 // functions ONLY from fTrackFunctions list are called
76 //ProcessParticles - "Particles"
77 // it loops only on particles(simulated),
78 // functions ONLY from fParticleAndTrackFunctions list are called
83 Error("AliHBTAnalysis::Process","The reader is not set");
88 const char *oT = strstr(option,"Tracks");
89 const char *oP = strstr(option,"Particles");
93 if (fReader->GetNumberOfPartEvents() <1)
95 Error("AliHBTAnalysis::Process","There is no Particles. Maybe change the option?");
98 if (fReader->GetNumberOfTrackEvents() <1)
100 Error("AliHBTAnalysis::Process","There is no Tracks. Maybe change the option?");
104 if ( RunCoherencyCheck() )
106 Error("AliHBTAnalysis::Process",
107 "Coherency check not passed. Maybe change the option?\n");
110 ProcessTracksAndParticles();
128 /*************************************************************************************/
130 void AliHBTAnalysis::ProcessTracksAndParticles()
133 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
134 //the loops are splited
137 AliHBTParticle * part1, * part2;
138 AliHBTParticle * track1, * track2;
140 AliHBTEvent * trackEvent, *partEvent;
141 AliHBTEvent * trackEvent2,*partEvent2;
143 // Int_t N1, N2, N=0; //number of particles in current event(we prcess two events in one time)
145 Int_t Nev = fReader->GetNumberOfTrackEvents();
147 /***************************************/
148 /****** Looping same events ********/
149 /****** filling numerators ********/
150 /***************************************/
151 AliHBTPair * trackpair = new AliHBTPair();
152 AliHBTPair * partpair = new AliHBTPair();
154 AliHBTPair * tmptrackpair;//temprary pointers to pairs
155 AliHBTPair * tmppartpair;
157 for (Int_t i = 0;i<Nev;i++)
159 partEvent= fReader->GetParticleEvent(i);
160 trackEvent = fReader->GetTrackEvent(i);
162 if (!partEvent) continue;
166 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
168 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i<<endl;
170 part1= partEvent->GetParticle(j);
171 track1= trackEvent->GetParticle(j);
173 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
175 part2= partEvent->GetParticle(k);
176 partpair->SetParticles(part1,part2);
178 track2= trackEvent->GetParticle(k);
179 trackpair->SetParticles(track1,track2);
181 if(fPairCut->Pass(partpair) || (fPairCut->Pass(trackpair))) //check pair cut
182 { //do not meets crietria of the pair cut, try with swaped pairs
183 if( ( fPairCut->Pass(partpair->GetSwapedPair()) ) || ( fPairCut->Pass(trackpair->GetSwapedPair()) ) )
184 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
186 { //swaped pair meets all the criteria
187 tmppartpair = partpair->GetSwapedPair();
188 tmptrackpair = trackpair->GetSwapedPair();
193 {//meets criteria of the pair cut
194 tmptrackpair = trackpair;
195 tmppartpair = partpair;
198 for(ii = 0;ii<fNParticleFunctions;ii++)
199 fParticleFunctions[ii]->ProcessSameEventParticles(tmppartpair);
201 for(ii = 0;ii<fNTrackFunctions;ii++)
202 fTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair);
204 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
205 fParticleAndTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair,tmppartpair);
210 /***************************************/
211 /***** Filling denominators *********/
212 /***************************************/
213 for (Int_t i = 0;i<Nev;i++) //In each event ....
216 partEvent= fReader->GetParticleEvent(i);
217 if (!partEvent) continue;
219 trackEvent = fReader->GetTrackEvent(i);
223 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
225 // if (N>MAXCOMB) break;
227 part1= partEvent->GetParticle(j);
229 track1= trackEvent->GetParticle(j);
231 // for (Int_t k = i+1; k<Nev;k++) // ... Loop over all proceeding events ...
234 if ( (i+2) < Nev) NNN = i+2;
237 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
240 partEvent2= fReader->GetParticleEvent(k);
241 if (!partEvent2) continue;
243 trackEvent2 = fReader->GetTrackEvent(k);
245 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<k<<endl;
247 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
250 // if (N>MAXCOMB) break;
252 part2= partEvent2->GetParticle(l);
253 partpair->SetParticles(part1,part2);
255 track2= trackEvent2->GetParticle(l);
256 trackpair->SetParticles(track1,track2);
258 if( (fPairCut->Pass(partpair)) || (fPairCut->Pass(trackpair)) ) //check pair cut
259 { //do not meets crietria of the
260 if( ( fPairCut->Pass(partpair->GetSwapedPair()) ) || ( fPairCut->Pass(trackpair->GetSwapedPair()) ) )
264 tmppartpair = partpair->GetSwapedPair();
265 tmptrackpair = trackpair->GetSwapedPair();
269 {//meets criteria of the pair cut
270 tmptrackpair = trackpair;
271 tmppartpair = partpair;
274 for(ii = 0;ii<fNParticleFunctions;ii++)
275 fParticleFunctions[ii]->ProcessDiffEventParticles(tmppartpair);
277 for(ii = 0;ii<fNTrackFunctions;ii++)
278 fTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair);
280 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
281 fParticleAndTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair,tmppartpair);
284 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
285 }//for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
290 /***************************************/
294 /*************************************************************************************/
296 void AliHBTAnalysis::ProcessTracks()
298 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
299 //the loops are splited
300 AliHBTParticle * track1, * track2;
302 AliHBTEvent * trackEvent;
303 AliHBTEvent * trackEvent2;
305 // Int_t N1, N2, N=0; //number of particles in current event(we prcess two events in one time)
307 Int_t Nev = fReader->GetNumberOfTrackEvents();
309 /***************************************/
310 /****** Looping same events ********/
311 /****** filling numerators ********/
312 /***************************************/
313 AliHBTPair * trackpair = new AliHBTPair();
314 AliHBTPair * tmptrackpair; //temporary pointer
316 for (Int_t i = 0;i<Nev;i++)
318 trackEvent = fReader->GetTrackEvent(i);
319 if (!trackEvent) continue;
322 for (Int_t j = 0; j<trackEvent->GetNumberOfParticles() ; j++)
324 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i<<endl;
326 track1= trackEvent->GetParticle(j);
328 for (Int_t k =j+1; k < trackEvent->GetNumberOfParticles() ; k++)
330 track2= trackEvent->GetParticle(k);
331 trackpair->SetParticles(track1,track2);
332 if(fPairCut->Pass(trackpair)) //check pair cut
333 { //do not meets crietria of the
334 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
335 else tmptrackpair = trackpair->GetSwapedPair();
339 tmptrackpair = trackpair;
343 for(ii = 0;ii<fNTrackFunctions;ii++)
344 fTrackFunctions[ii]->ProcessSameEventParticles(tmptrackpair);
351 /***************************************/
352 /***** Filling diff histogram *********/
353 /***************************************/
354 for (Int_t i = 0;i<Nev;i++) //In each event ....
356 trackEvent = fReader->GetTrackEvent(i);
357 if (!trackEvent) continue;
360 for (Int_t j = 0; j< trackEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
362 // if (N>MAXCOMB) break;
364 track1= trackEvent->GetParticle(j);
366 // for (Int_t k = i+1; k<Nev;k++) // ... Loop over all proceeding events ...
369 if ( (i+2) < Nev) NNN = i+2;
372 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
375 trackEvent2 = fReader->GetTrackEvent(k);
376 if (!trackEvent2) continue;
378 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<k<<endl;
380 for(Int_t l = 0; l<trackEvent2->GetNumberOfParticles();l++) // ... on all particles
383 // if (N>MAXCOMB) break;
384 track2= trackEvent2->GetParticle(l);
385 trackpair->SetParticles(track1,track2);
387 if(fPairCut->Pass(trackpair)) //check pair cut
388 { //do not meets crietria of the
389 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
390 else tmptrackpair = trackpair->GetSwapedPair();
394 tmptrackpair = trackpair;
397 for(ii = 0;ii<fNTrackFunctions;ii++)
398 fTrackFunctions[ii]->ProcessDiffEventParticles(tmptrackpair);
400 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
401 }//for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
406 /***************************************/
411 /*************************************************************************************/
413 void AliHBTAnalysis::ProcessParticles()
415 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
416 //the loops are splited
417 AliHBTParticle * part1, * part2;
419 AliHBTEvent * partEvent;
420 AliHBTEvent * partEvent2;
422 AliHBTPair * partpair = new AliHBTPair();
423 AliHBTPair * tmppartpair; //temporary pointer to the pair
425 // Int_t N1, N2, N=0; //number of particles in current event(we prcess two events in one time)
427 Int_t Nev = fReader->GetNumberOfPartEvents();
429 /***************************************/
430 /****** Looping same events ********/
431 /****** filling numerators ********/
432 /***************************************/
433 for (Int_t i = 0;i<Nev;i++)
435 partEvent= fReader->GetParticleEvent(i);
436 if (!partEvent) continue;
439 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
441 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i<<endl;
443 part1= partEvent->GetParticle(j);
445 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
447 part2= partEvent->GetParticle(k);
448 partpair->SetParticles(part1,part2);
450 if( fPairCut->Pass(partpair) ) //check pair cut
451 { //do not meets crietria of the pair cut, try with swaped pairs
452 if( fPairCut->Pass(partpair->GetSwapedPair() ) )
453 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
455 { //swaped pair meets all the criteria
456 tmppartpair = partpair->GetSwapedPair();
461 tmppartpair = partpair;
466 for(ii = 0;ii<fNParticleFunctions;ii++)
467 fParticleFunctions[ii]->ProcessSameEventParticles(tmppartpair);
472 /***************************************/
473 /***** Filling diff histogram *********/
474 /***************************************/
475 for (Int_t i = 0;i<Nev;i++) //In each event ....
477 partEvent= fReader->GetParticleEvent(i);
478 if (!partEvent) continue;
482 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
484 // if (N>MAXCOMB) break;
486 part1= partEvent->GetParticle(j);
488 // for (Int_t k = i+1; k<Nev;k++) // ... Loop over all proceeding events ...
491 if ( (i+2) < Nev) NNN = i+2; //loop over next event
494 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
497 partEvent2= fReader->GetParticleEvent(k);
498 if (!partEvent2) continue;
500 if ( (j%100) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<k<<endl;
502 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
505 // if (N>MAXCOMB) break;
506 part2= partEvent2->GetParticle(l);
507 partpair->SetParticles(part1,part2);
509 if(fPairCut->Pass(partpair)) //check pair cut
510 { //do not meets crietria of the
511 if( fPairCut->Pass(partpair->GetSwapedPair()) ) continue;
512 else tmppartpair = partpair->GetSwapedPair();
516 tmppartpair = partpair;
519 for(ii = 0;ii<fNParticleFunctions;ii++)
520 fParticleFunctions[ii]->ProcessDiffEventParticles(tmppartpair);
522 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
523 }//for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
528 /***************************************/
533 /*************************************************************************************/
536 void AliHBTAnalysis::WriteFunctions()
539 for(ii = 0;ii<fNParticleFunctions;ii++)
540 fParticleFunctions[ii]->Write();
542 for(ii = 0;ii<fNTrackFunctions;ii++)
543 fTrackFunctions[ii]->Write();
545 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
546 fParticleAndTrackFunctions[ii]->Write();
548 /*************************************************************************************/
550 void AliHBTAnalysis::SetGlobalPairCut(AliHBTPairCut* cut)
554 Error("AliHBTAnalysis::SetGlobalPairCut","Pointer is NULL. Ignoring");
557 fPairCut = (AliHBTPairCut*)cut->Clone();
560 /*************************************************************************************/
562 void AliHBTAnalysis::AddTrackFunction(AliHBTTwoPartFctn* f)
564 if (f == 0x0) return;
565 if (fNTrackFunctions == fgkFctnArraySize)
567 Error("AliHBTAnalysis::AddTrackFunction","Can not add this function, not enough place in the array.");
569 fTrackFunctions[fNTrackFunctions] = f;
572 /*************************************************************************************/
574 void AliHBTAnalysis::AddParticleFunction(AliHBTTwoPartFctn* f)
576 if (f == 0x0) return;
578 if (fNParticleFunctions == fgkFctnArraySize)
580 Error("AliHBTAnalysis::AddParticleFunction","Can not add this function, not enough place in the array.");
582 fParticleFunctions[fNParticleFunctions] = f;
583 fNParticleFunctions++;
587 void AliHBTAnalysis::AddParticleAndTrackFunction(AliHBTFourPartFctn* f)
589 if (f == 0x0) return;
590 if (fNParticleAndTrackFunctions == fgkFctnArraySize)
592 Error("AliHBTAnalysis::AddParticleAndTrackFunction","Can not add this function, not enough place in the array.");
594 fParticleAndTrackFunctions[fNParticleAndTrackFunctions] = f;
595 fNParticleAndTrackFunctions++;
599 /*************************************************************************************/
602 /*************************************************************************************/
604 Bool_t AliHBTAnalysis::RunCoherencyCheck()
606 //Checks if both HBTRuns are similar
607 //return true if error found
608 //if they seem to be OK return false
610 cout<<"Checking HBT Runs Coherency"<<endl;
612 cout<<"Number of events ..."; fflush(stdout);
614 if (fReader->GetNumberOfPartEvents() == fReader->GetNumberOfTrackEvents() ) //check whether there is the same number of events
616 cout<<"OK. "<<fReader->GetNumberOfTrackEvents()<<" found"<<endl;
619 { //if not the same - ERROR
620 Error("AliHBTAnalysis::RunCoherencyCheck()",
621 "Number of simulated events (%d) is not equal to number of reconstructed events(%d)",
622 fReader->GetNumberOfPartEvents(),fReader->GetNumberOfTrackEvents());
626 cout<<"Checking number of Particles AND Particles Types in each event ...";fflush(stdout);
628 AliHBTEvent *partEvent;
629 AliHBTEvent *trackEvent;
630 for( i = 0; i<fReader->GetNumberOfTrackEvents();i++)
632 partEvent= fReader->GetParticleEvent(i); //gets the "ith" event
633 trackEvent = fReader->GetTrackEvent(i);
635 if ( (partEvent == 0x0) && (partEvent == 0x0) ) continue;
636 if ( (partEvent == 0x0) || (partEvent == 0x0) )
638 Error("AliHBTAnalysis::RunCoherencyCheck()",
639 "One event is NULL and the other one not. Event Number %d",i);
643 if ( partEvent->GetNumberOfParticles() != trackEvent->GetNumberOfParticles() )
645 Error("AliHBTAnalysis::RunCoherencyCheck()",
646 "Event %d: Number of simulated particles (%d) not equal to number of reconstructed tracks (%d)",
647 i,partEvent->GetNumberOfParticles() , trackEvent->GetNumberOfParticles());
651 for (Int_t j = 0; j<partEvent->GetNumberOfParticles(); j++)
653 if( partEvent->GetParticle(j)->GetPdgCode() != trackEvent->GetParticle(j)->GetPdgCode() )
655 Error("AliHBTAnalysis::RunCoherencyCheck()",
656 "Event %d: Particle %d: PID of simulated particle (%d) not the same of reconstructed track (%d)",
657 i,j, partEvent->GetParticle(j)->GetPdgCode(),trackEvent->GetParticle(j)->GetPdgCode() );
664 cout<<" Everything looks OK"<<endl;
669 /*************************************************************************************/
672 /*************************************************************************************/