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
39 AliHBTAnalysis::~AliHBTAnalysis()
42 //note that we do not delete functions itself
43 // they should be deleted by whom where created
44 //we only store pointers, and we use "new" only for pointers array
45 delete [] fTrackFunctions;
46 delete [] fParticleFunctions;
47 delete [] fParticleAndTrackFunctions;
49 delete fPairCut; // always have an copy of an object - we create we dstroy
52 /*************************************************************************************/
53 void AliHBTAnalysis::Process(Option_t* option)
55 //default option = "TracksAndParticles"
56 //Main method of the HBT Analysis Package
57 //It triggers reading with the global cut (default is an empty cut)
58 //Than it checks options and data which are read
59 //if everything is OK, then it calls one of the looping methods
60 //depending on tfReaderhe option
61 //These methods differs on what thay are looping on
64 //--------------------------------------------------------------------
65 //ProcessTracksAndParticles - "TracksAndParticles"
67 // it loops over both, tracks(reconstructed) and particles(simulated)
68 // all function gethered in all 3 lists are called for each (double)pair
70 //ProcessTracks - "Tracks"
71 // it loops only on tracks(reconstructed),
72 // functions ONLY from fTrackFunctions list are called
74 //ProcessParticles - "Particles"
75 // it loops only on particles(simulated),
76 // functions ONLY from fParticleAndTrackFunctions list are called
81 Error("AliHBTAnalysis::Process","The reader is not set");
86 const char *oT = strstr(option,"Tracks");
87 const char *oP = strstr(option,"Particles");
91 if (fReader->GetNumberOfPartEvents() <1)
93 Error("AliHBTAnalysis::Process","There is no Particles. Maybe change the option?");
96 if (fReader->GetNumberOfTrackEvents() <1)
98 Error("AliHBTAnalysis::Process","There is no Tracks. Maybe change the option?");
102 if ( RunCoherencyCheck() )
104 Error("AliHBTAnalysis::Process",
105 "Coherency check not passed. Maybe change the option?\n");
108 ProcessTracksAndParticles();
126 /*************************************************************************************/
127 void AliHBTAnalysis::ProcessTracksAndParticles()
130 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
131 //the loops are splited
134 AliHBTParticle * part1, * part2;
135 AliHBTParticle * track1, * track2;
137 AliHBTEvent * trackEvent, *partEvent;
138 AliHBTEvent * trackEvent2,*partEvent2;
140 // Int_t N1, N2, N=0; //number of particles in current event(we prcess two events in one time)
142 Int_t Nev = fReader->GetNumberOfTrackEvents();
144 /***************************************/
145 /****** Looping same events ********/
146 /****** filling numerators ********/
147 /***************************************/
148 AliHBTPair * trackpair = new AliHBTPair();
149 AliHBTPair * partpair = new AliHBTPair();
151 for (Int_t i = 0;i<Nev;i++)
153 partEvent= fReader->GetParticleEvent(i);
154 trackEvent = fReader->GetTrackEvent(i);
156 if (!partEvent) continue;
160 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
162 if ( (j%10) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i<<endl;
164 part1= partEvent->GetParticle(j);
165 track1= trackEvent->GetParticle(j);
167 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
169 part2= partEvent->GetParticle(k);
170 partpair->SetParticles(part1,part2);
172 track2= trackEvent->GetParticle(k);
173 trackpair->SetParticles(track1,track2);
175 if(fPairCut->Pass(partpair) || (fPairCut->Pass(trackpair))) //check pair cut
176 { //do not meets crietria of the pair cut, try with swaped pairs
177 if( ( fPairCut->Pass(partpair->GetSwapedPair()) ) || ( fPairCut->Pass(trackpair->GetSwapedPair()) ) )
178 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
180 { //swaped pair meets all the criteria
181 partpair = partpair->GetSwapedPair();
182 trackpair = trackpair->GetSwapedPair();
186 for(ii = 0;ii<fNParticleFunctions;ii++)
187 fParticleFunctions[ii]->ProcessSameEventParticles(partpair);
189 for(ii = 0;ii<fNTrackFunctions;ii++)
190 fTrackFunctions[ii]->ProcessSameEventParticles(trackpair);
192 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
193 fParticleAndTrackFunctions[ii]->ProcessSameEventParticles(trackpair,partpair);
198 /***************************************/
199 /***** Filling denominators *********/
200 /***************************************/
201 for (Int_t i = 0;i<Nev;i++) //In each event ....
204 partEvent= fReader->GetParticleEvent(i);
205 if (!partEvent) continue;
207 trackEvent = fReader->GetTrackEvent(i);
211 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
213 // if (N>MAXCOMB) break;
215 part1= partEvent->GetParticle(j);
217 track1= trackEvent->GetParticle(j);
219 // for (Int_t k = i+1; k<Nev;k++) // ... Loop over all proceeding events ...
222 if ( (i+2) < Nev) NNN = i+2;
225 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
228 partEvent2= fReader->GetParticleEvent(k);
229 if (!partEvent2) continue;
231 trackEvent2 = fReader->GetTrackEvent(k);
233 if ( (j%10) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<k<<endl;
235 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
238 // if (N>MAXCOMB) break;
240 part2= partEvent2->GetParticle(l);
241 partpair->SetParticles(part1,part2);
243 track2= trackEvent2->GetParticle(l);
244 trackpair->SetParticles(track1,track2);
246 if( (fPairCut->Pass(partpair)) || (fPairCut->Pass(trackpair)) ) //check pair cut
247 { //do not meets crietria of the
248 if( ( fPairCut->Pass(partpair->GetSwapedPair()) ) || ( fPairCut->Pass(trackpair->GetSwapedPair()) ) )
252 partpair = partpair->GetSwapedPair();
253 trackpair = trackpair->GetSwapedPair();
257 for(ii = 0;ii<fNParticleFunctions;ii++)
258 fParticleFunctions[ii]->ProcessDiffEventParticles(partpair);
260 for(ii = 0;ii<fNTrackFunctions;ii++)
261 fTrackFunctions[ii]->ProcessDiffEventParticles(trackpair);
263 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
264 fParticleAndTrackFunctions[ii]->ProcessDiffEventParticles(trackpair,partpair);
267 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
268 }//for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
273 /***************************************/
277 /*************************************************************************************/
279 void AliHBTAnalysis::ProcessTracks()
281 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
282 //the loops are splited
283 AliHBTParticle * track1, * track2;
285 AliHBTEvent * trackEvent;
286 AliHBTEvent * trackEvent2;
288 // Int_t N1, N2, N=0; //number of particles in current event(we prcess two events in one time)
290 Int_t Nev = fReader->GetNumberOfTrackEvents();
292 /***************************************/
293 /****** Looping same events ********/
294 /****** filling numerators ********/
295 /***************************************/
296 AliHBTPair * trackpair = new AliHBTPair();
298 for (Int_t i = 0;i<Nev;i++)
300 trackEvent = fReader->GetTrackEvent(i);
301 if (!trackEvent) continue;
304 for (Int_t j = 0; j<trackEvent->GetNumberOfParticles() ; j++)
306 if ( (j%10) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i<<endl;
308 track1= trackEvent->GetParticle(j);
310 for (Int_t k =j+1; k < trackEvent->GetNumberOfParticles() ; k++)
312 track2= trackEvent->GetParticle(k);
313 trackpair->SetParticles(track1,track2);
314 if(fPairCut->Pass(trackpair)) //check pair cut
315 { //do not meets crietria of the
316 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
317 else trackpair = trackpair->GetSwapedPair();
322 for(ii = 0;ii<fNTrackFunctions;ii++)
323 fTrackFunctions[ii]->ProcessSameEventParticles(trackpair);
330 /***************************************/
331 /***** Filling diff histogram *********/
332 /***************************************/
333 for (Int_t i = 0;i<Nev;i++) //In each event ....
335 trackEvent = fReader->GetTrackEvent(i);
336 if (!trackEvent) continue;
339 for (Int_t j = 0; j< trackEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
341 // if (N>MAXCOMB) break;
343 track1= trackEvent->GetParticle(j);
345 // for (Int_t k = i+1; k<Nev;k++) // ... Loop over all proceeding events ...
348 if ( (i+2) < Nev) NNN = i+2;
351 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
354 trackEvent2 = fReader->GetTrackEvent(k);
355 if (!trackEvent2) continue;
357 if ( (j%10) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<k<<endl;
359 for(Int_t l = 0; l<trackEvent2->GetNumberOfParticles();l++) // ... on all particles
362 // if (N>MAXCOMB) break;
363 track2= trackEvent2->GetParticle(l);
364 trackpair->SetParticles(track1,track2);
366 if(fPairCut->Pass(trackpair)) //check pair cut
367 { //do not meets crietria of the
368 if( fPairCut->Pass(trackpair->GetSwapedPair()) ) continue;
369 else trackpair = trackpair->GetSwapedPair();
372 for(ii = 0;ii<fNTrackFunctions;ii++)
373 fTrackFunctions[ii]->ProcessDiffEventParticles(trackpair);
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
381 /***************************************/
386 /*************************************************************************************/
387 void AliHBTAnalysis::ProcessParticles()
389 //In order to minimize calling AliRun::GetEvent (we need at one time particles from different events),
390 //the loops are splited
391 AliHBTParticle * part1, * part2;
393 AliHBTEvent * partEvent;
394 AliHBTEvent * partEvent2;
396 // Int_t N1, N2, N=0; //number of particles in current event(we prcess two events in one time)
398 Int_t Nev = fReader->GetNumberOfPartEvents();
400 /***************************************/
401 /****** Looping same events ********/
402 /****** filling numerators ********/
403 /***************************************/
404 AliHBTPair * partpair = new AliHBTPair();
406 for (Int_t i = 0;i<Nev;i++)
408 partEvent= fReader->GetParticleEvent(i);
409 if (!partEvent) continue;
412 for (Int_t j = 0; j<partEvent->GetNumberOfParticles() ; j++)
414 if ( (j%10) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<i<<endl;
416 part1= partEvent->GetParticle(j);
418 for (Int_t k =j+1; k < partEvent->GetNumberOfParticles() ; k++)
420 part2= partEvent->GetParticle(k);
421 partpair->SetParticles(part1,part2);
423 if( fPairCut->Pass(partpair) ) //check pair cut
424 { //do not meets crietria of the pair cut, try with swaped pairs
425 if( fPairCut->Pass(partpair->GetSwapedPair() ) )
426 continue; //swaped pairs do not meet criteria of pair cut as well, take next particle
428 { //swaped pair meets all the criteria
429 partpair = partpair->GetSwapedPair();
435 for(ii = 0;ii<fNParticleFunctions;ii++)
436 fParticleFunctions[ii]->ProcessSameEventParticles(partpair);
441 /***************************************/
442 /***** Filling diff histogram *********/
443 /***************************************/
444 for (Int_t i = 0;i<Nev;i++) //In each event ....
446 partEvent= fReader->GetParticleEvent(i);
447 if (!partEvent) continue;
451 for (Int_t j = 0; j< partEvent->GetNumberOfParticles(); j++) // ... Loop over all particles ...
453 // if (N>MAXCOMB) break;
455 part1= partEvent->GetParticle(j);
457 // for (Int_t k = i+1; k<Nev;k++) // ... Loop over all proceeding events ...
460 if ( (i+2) < Nev) NNN = i+2; //loop over next event
463 for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
466 partEvent2= fReader->GetParticleEvent(k);
467 if (!partEvent2) continue;
469 if ( (j%10) == 0) cout<<"Mixing particle "<<j<<" from event "<<i<<" with particles from event "<<k<<endl;
471 for(Int_t l = 0; l<partEvent2->GetNumberOfParticles();l++) // ... on all particles
474 // if (N>MAXCOMB) break;
475 part2= partEvent2->GetParticle(l);
476 partpair->SetParticles(part1,part2);
478 if(fPairCut->Pass(partpair)) //check pair cut
479 { //do not meets crietria of the
480 if( fPairCut->Pass(partpair->GetSwapedPair()) ) continue;
481 else partpair = partpair->GetSwapedPair();
484 for(ii = 0;ii<fNParticleFunctions;ii++)
485 fParticleFunctions[ii]->ProcessDiffEventParticles(partpair);
487 }//for(Int_t l = 0; l<N2;l++) // ... on all particles
488 }//for (Int_t k = i+1; k<NNN;k++) // ... Loop over next event
493 /***************************************/
498 /*************************************************************************************/
501 void AliHBTAnalysis::Write()
504 for(ii = 0;ii<fNParticleFunctions;ii++)
505 fParticleFunctions[ii]->Write();
507 for(ii = 0;ii<fNTrackFunctions;ii++)
508 fTrackFunctions[ii]->Write();
510 for(ii = 0;ii<fNParticleAndTrackFunctions;ii++)
511 fParticleAndTrackFunctions[ii]->Write();
513 /*************************************************************************************/
514 void AliHBTAnalysis::SetGlobalPairCut(AliHBTPairCut* cut)
518 Error("AliHBTAnalysis::SetGlobalPairCut","Pointer is NULL. Ignoring");
521 fPairCut = (AliHBTPairCut*)cut->Clone();
524 /*************************************************************************************/
525 void AliHBTAnalysis::AddTrackFunction(AliHBTTwoPartFctn* f)
527 if (f == 0x0) return;
528 if (fNTrackFunctions == fgkFctnArraySize)
530 Error("AliHBTAnalysis::AddTrackFunction","Can not add this function, not enough place in the array.");
532 fTrackFunctions[fNTrackFunctions] = f;
535 void AliHBTAnalysis::AddParticleFunction(AliHBTTwoPartFctn* f)
537 if (f == 0x0) return;
539 if (fNParticleFunctions == fgkFctnArraySize)
541 Error("AliHBTAnalysis::AddParticleFunction","Can not add this function, not enough place in the array.");
543 fParticleFunctions[fNParticleFunctions] = f;
544 fNParticleFunctions++;
548 void AliHBTAnalysis::AddParticleAndTrackFunction(AliHBTFourPartFctn* f)
550 if (f == 0x0) return;
551 if (fNParticleAndTrackFunctions == fgkFctnArraySize)
553 Error("AliHBTAnalysis::AddParticleAndTrackFunction","Can not add this function, not enough place in the array.");
555 fParticleAndTrackFunctions[fNParticleAndTrackFunctions] = f;
556 fNParticleAndTrackFunctions++;
560 /*************************************************************************************/
563 /*************************************************************************************/
564 Bool_t AliHBTAnalysis::RunCoherencyCheck()
566 //Checks if both HBTRuns are similar
567 //return true if error found
568 //if they seem to be OK return false
570 cout<<"Checking HBT Runs Coherency"<<endl;
572 cout<<"Number of events ..."; fflush(stdout);
574 if (fReader->GetNumberOfPartEvents() == fReader->GetNumberOfTrackEvents() ) //check whether there is the same number of events
576 cout<<"OK. "<<fReader->GetNumberOfTrackEvents()<<" found"<<endl;
579 { //if not the same - ERROR
580 Error("AliHBTAnalysis::RunCoherencyCheck()",
581 "Number of simulated events (%d) is not equal to number of reconstructed events(%d)",
582 fReader->GetNumberOfPartEvents(),fReader->GetNumberOfTrackEvents());
586 cout<<"Checking number of Particles AND Particles Types in each event ...";fflush(stdout);
588 AliHBTEvent *partEvent;
589 AliHBTEvent *trackEvent;
590 for( i = 0; i<fReader->GetNumberOfTrackEvents();i++)
592 partEvent= fReader->GetParticleEvent(i); //gets the "ith" event
593 trackEvent = fReader->GetTrackEvent(i);
595 if ( (partEvent == 0x0) && (partEvent == 0x0) ) continue;
596 if ( (partEvent == 0x0) || (partEvent == 0x0) )
598 Error("AliHBTAnalysis::RunCoherencyCheck()",
599 "One event is NULL and the other one not. Event Number %d",i);
603 if ( partEvent->GetNumberOfParticles() != trackEvent->GetNumberOfParticles() )
605 Error("AliHBTAnalysis::RunCoherencyCheck()",
606 "Event %d: Number of simulated particles (%d) not equal to number of reconstructed tracks (%d)",
607 i,partEvent->GetNumberOfParticles() , trackEvent->GetNumberOfParticles());
611 for (Int_t j = 0; j<partEvent->GetNumberOfParticles(); j++)
613 if( partEvent->GetParticle(j)->GetPdgCode() != trackEvent->GetParticle(j)->GetPdgCode() )
615 Error("AliHBTAnalysis::RunCoherencyCheck()",
616 "Event %d: Particle %d: PID of simulated particle (%d) not the same of reconstructed track (%d)",
617 i,j, partEvent->GetParticle(j)->GetPdgCode(),trackEvent->GetParticle(j)->GetPdgCode() );
624 cout<<" Everything looks OK"<<endl;
629 /*************************************************************************************/
632 /*************************************************************************************/