]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG2/FLOW/AliFlowCommon/AliFlowEventSimple.cxx
Added charge to the tracks
[u/mrichter/AliRoot.git] / PWG2 / FLOW / AliFlowCommon / AliFlowEventSimple.cxx
CommitLineData
f1d945a1 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
929098e4 16/*****************************************************************
17 AliFlowEventSimple: A simple event
18 for flow analysis
19
20 origin: Naomi van der Kolk (kolk@nikhef.nl)
21 Ante Bilandzic (anteb@nikhef.nl)
22 Raimond Snellings (Raimond.Snellings@nikhef.nl)
23 mods: Mikolaj Krzewicki (mikolaj.krzewicki@cern.ch)
24*****************************************************************/
25
f1d945a1 26#include "Riostream.h"
27#include "TObjArray.h"
26c4cbb9 28#include "TFile.h"
03a02aca 29#include "TList.h"
929098e4 30#include "TTree.h"
31#include "TParticle.h"
f1d945a1 32#include "TMath.h"
26c4cbb9 33#include "TH1F.h"
34#include "TH1D.h"
bc231a12 35#include "TF1.h"
26c4cbb9 36#include "TProfile.h"
929098e4 37#include "TParameter.h"
c076fda8 38#include "TBrowser.h"
f1d945a1 39#include "AliFlowVector.h"
40#include "AliFlowTrackSimple.h"
929098e4 41#include "AliFlowTrackSimpleCuts.h"
701f71c1 42#include "AliFlowEventSimple.h"
7382279b 43#include "TRandom.h"
f1d945a1 44
f1d945a1 45ClassImp(AliFlowEventSimple)
46
47//-----------------------------------------------------------------------
46bec39c 48AliFlowEventSimple::AliFlowEventSimple():
49 fTrackCollection(NULL),
85d2ee8d 50 fReferenceMultiplicity(0),
46bec39c 51 fNumberOfTracks(0),
bc231a12 52 fNumberOfRPs(0),
7183fe85 53 fMCReactionPlaneAngle(0.),
929098e4 54 fMCReactionPlaneAngleIsSet(kFALSE),
bc231a12 55 fAfterBurnerPrecision(0.001),
c076fda8 56 fNumberOfTracksWrap(NULL),
bc231a12 57 fNumberOfRPsWrap(NULL),
a12990bb 58 fMCReactionPlaneAngleWrap(NULL)
46bec39c 59{
60 cout << "AliFlowEventSimple: Default constructor to be used only by root for io" << endl;
61}
62
63//-----------------------------------------------------------------------
bc231a12 64AliFlowEventSimple::AliFlowEventSimple(Int_t aLength):
65 fTrackCollection(new TObjArray(aLength)),
85d2ee8d 66 fReferenceMultiplicity(0),
46bec39c 67 fNumberOfTracks(0),
bc231a12 68 fNumberOfRPs(0),
7183fe85 69 fMCReactionPlaneAngle(0.),
929098e4 70 fMCReactionPlaneAngleIsSet(kFALSE),
bc231a12 71 fAfterBurnerPrecision(0.001),
c076fda8 72 fNumberOfTracksWrap(NULL),
bc231a12 73 fNumberOfRPsWrap(NULL),
a12990bb 74 fMCReactionPlaneAngleWrap(NULL)
f1d945a1 75{
929098e4 76 //constructor
bc231a12 77}
78
79//-----------------------------------------------------------------------
80AliFlowEventSimple::AliFlowEventSimple( Int_t nParticles,
81 TF1* ptDist,
82 Double_t phiMin,
83 Double_t phiMax,
84 Double_t etaMin,
85 Double_t etaMax):
86 fTrackCollection(new TObjArray(nParticles)),
85d2ee8d 87 fReferenceMultiplicity(nParticles),
bc231a12 88 fNumberOfTracks(0),
89 fNumberOfRPs(0),
90 fMCReactionPlaneAngle(0.),
91 fMCReactionPlaneAngleIsSet(kFALSE),
92 fAfterBurnerPrecision(0.001),
93 fNumberOfTracksWrap(NULL),
94 fNumberOfRPsWrap(NULL),
95 fMCReactionPlaneAngleWrap(NULL)
96{
97 //ctor. generates nParticles random tracks with given Pt distribution
98 //phi and eta are uniform
99 Generate(nParticles,ptDist,phiMin,phiMax,etaMin,etaMax);
f1d945a1 100}
101
102//-----------------------------------------------------------------------
e35ddff0 103AliFlowEventSimple::AliFlowEventSimple(const AliFlowEventSimple& anEvent):
bc231a12 104 TObject(anEvent),
105 fTrackCollection((TObjArray*)(anEvent.fTrackCollection)->Clone()),
85d2ee8d 106 fReferenceMultiplicity(anEvent.fReferenceMultiplicity),
e35ddff0 107 fNumberOfTracks(anEvent.fNumberOfTracks),
bc231a12 108 fNumberOfRPs(anEvent.fNumberOfRPs),
a12990bb 109 fMCReactionPlaneAngle(anEvent.fMCReactionPlaneAngle),
929098e4 110 fMCReactionPlaneAngleIsSet(anEvent.fMCReactionPlaneAngleIsSet),
bc231a12 111 fAfterBurnerPrecision(anEvent.fAfterBurnerPrecision),
c076fda8 112 fNumberOfTracksWrap(anEvent.fNumberOfTracksWrap),
bc231a12 113 fNumberOfRPsWrap(anEvent.fNumberOfRPsWrap),
a12990bb 114 fMCReactionPlaneAngleWrap(anEvent.fMCReactionPlaneAngleWrap)
f1d945a1 115{
929098e4 116 //copy constructor
f1d945a1 117}
118
119//-----------------------------------------------------------------------
e35ddff0 120AliFlowEventSimple& AliFlowEventSimple::operator=(const AliFlowEventSimple& anEvent)
f1d945a1 121{
124fb262 122 //assignment operator
701f71c1 123 if (fTrackCollection) fTrackCollection->Delete();
124fb262 124 delete fTrackCollection;
bc231a12 125 fTrackCollection = (TObjArray*)(anEvent.fTrackCollection)->Clone(); //deep copy
85d2ee8d 126 fReferenceMultiplicity = anEvent.fReferenceMultiplicity;
e35ddff0 127 fNumberOfTracks = anEvent.fNumberOfTracks;
bc231a12 128 fNumberOfRPs = anEvent.fNumberOfRPs;
a12990bb 129 fMCReactionPlaneAngle = anEvent.fMCReactionPlaneAngle;
929098e4 130 fMCReactionPlaneAngleIsSet = anEvent.fMCReactionPlaneAngleIsSet;
bc231a12 131 fAfterBurnerPrecision = anEvent.fAfterBurnerPrecision;
929098e4 132 fNumberOfTracksWrap = anEvent.fNumberOfTracksWrap;
bc231a12 133 fNumberOfRPsWrap = anEvent.fNumberOfRPsWrap;
a12990bb 134 fMCReactionPlaneAngleWrap=anEvent.fMCReactionPlaneAngleWrap;
f1d945a1 135 return *this;
f1d945a1 136}
137
929098e4 138//-----------------------------------------------------------------------
f1d945a1 139AliFlowEventSimple::~AliFlowEventSimple()
140{
141 //destructor
929098e4 142 if (fTrackCollection) fTrackCollection->Delete();
143 delete fTrackCollection;
c076fda8 144 if (fNumberOfTracksWrap) delete fNumberOfTracksWrap;
bc231a12 145 if (fNumberOfRPsWrap) delete fNumberOfRPsWrap;
a12990bb 146 if (fMCReactionPlaneAngleWrap) delete fMCReactionPlaneAngleWrap;
f1d945a1 147}
148
bc231a12 149//-----------------------------------------------------------------------
150void AliFlowEventSimple::Generate(Int_t nParticles,
151 TF1* ptDist,
152 Double_t phiMin,
153 Double_t phiMax,
154 Double_t etaMin,
155 Double_t etaMax)
156{
157 //generate nParticles random tracks uniform in phi and eta
158 //according to the specified pt distribution
159 for (Int_t i=0; i<nParticles; i++)
160 {
701f71c1 161 AliFlowTrackSimple* track = new AliFlowTrackSimple();
162 track->SetPhi( gRandom->Uniform(phiMin,phiMax) );
163 track->SetEta( gRandom->Uniform(etaMin,etaMax) );
164 track->SetPt( ptDist->GetRandom() );
165 track->SetCharge( (gRandom->Uniform()-0.5<0)?-1:1 );
166 AddTrack(track);
bc231a12 167 }
168}
169
929098e4 170//-----------------------------------------------------------------------
f1d945a1 171AliFlowTrackSimple* AliFlowEventSimple::GetTrack(Int_t i)
172{
173 //get track i from collection
7382279b 174 if (i>=fNumberOfTracks) return NULL;
124fb262 175 AliFlowTrackSimple* pTrack = static_cast<AliFlowTrackSimple*>(fTrackCollection->At(i)) ;
e35ddff0 176 return pTrack;
f1d945a1 177}
178
7382279b 179//-----------------------------------------------------------------------
180void AliFlowEventSimple::AddTrack( AliFlowTrackSimple* track )
181{
182 //add a track
7382279b 183 fTrackCollection->AddLast(track);
184 fNumberOfTracks++;
185}
186
929098e4 187//-----------------------------------------------------------------------
188AliFlowVector AliFlowEventSimple::GetQ(Int_t n, TList *weightsList, Bool_t usePhiWeights, Bool_t usePtWeights, Bool_t useEtaWeights)
f1d945a1 189{
929098e4 190 // calculate Q-vector in harmonic n without weights (default harmonic n=2)
e35ddff0 191 Double_t dQX = 0.;
192 Double_t dQY = 0.;
193 AliFlowVector vQ;
194 vQ.Set(0.,0.);
929098e4 195
9825d4a9 196 Int_t iOrder = n;
ae733b3b 197 Double_t iUsedTracks = 0;
44e060e0 198 Double_t dPhi = 0.;
199 Double_t dPt = 0.;
200 Double_t dEta = 0.;
201 Double_t dWeight = 1.;
929098e4 202
26c4cbb9 203 AliFlowTrackSimple* pTrack = NULL;
929098e4 204
44e060e0 205 Int_t nBinsPhi = 0;
206 Double_t dBinWidthPt = 0.;
207 Double_t dPtMin = 0.;
208 Double_t dBinWidthEta = 0.;
209 Double_t dEtaMin = 0.;
929098e4 210
44e060e0 211 Double_t wPhi = 1.; // weight Phi
212 Double_t wPt = 1.; // weight Pt
213 Double_t wEta = 1.; // weight Eta
929098e4 214
03a02aca 215 TH1F *phiWeights = NULL;
ae733b3b 216 TH1D *ptWeights = NULL;
03a02aca 217 TH1D *etaWeights = NULL;
929098e4 218
03a02aca 219 if(weightsList)
26c4cbb9 220 {
929098e4 221 if(usePhiWeights)
222 {
223 phiWeights = dynamic_cast<TH1F *>(weightsList->FindObject("phi_weights"));
224 if(phiWeights) nBinsPhi = phiWeights->GetNbinsX();
225 }
226 if(usePtWeights)
03a02aca 227 {
929098e4 228 ptWeights = dynamic_cast<TH1D *>(weightsList->FindObject("pt_weights"));
229 if(ptWeights)
230 {
231 dBinWidthPt = ptWeights->GetBinWidth(1); // assuming that all bins have the same width
232 dPtMin = (ptWeights->GetXaxis())->GetXmin();
233 }
234 }
235 if(useEtaWeights)
03a02aca 236 {
929098e4 237 etaWeights = dynamic_cast<TH1D *>(weightsList->FindObject("eta_weights"));
238 if(etaWeights)
239 {
240 dBinWidthEta = etaWeights->GetBinWidth(1); // assuming that all bins have the same width
241 dEtaMin = (etaWeights->GetXaxis())->GetXmin();
242 }
243 }
03a02aca 244 } // end of if(weightsList)
929098e4 245
246 // loop over tracks
247 for(Int_t i=0; i<fNumberOfTracks; i++)
26c4cbb9 248 {
124fb262 249 pTrack = (AliFlowTrackSimple*)fTrackCollection->At(i);
929098e4 250 if(pTrack)
f1d945a1 251 {
929098e4 252 if(pTrack->InRPSelection())
253 {
254 dPhi = pTrack->Phi();
255 dPt = pTrack->Pt();
256 dEta = pTrack->Eta();
701f71c1 257 dWeight = pTrack->Weight();
929098e4 258
259 // determine Phi weight: (to be improved, I should here only access it + the treatment of gaps in the if statement)
260 if(phiWeights && nBinsPhi)
261 {
262 wPhi = phiWeights->GetBinContent(1+(Int_t)(TMath::Floor(dPhi*nBinsPhi/TMath::TwoPi())));
263 }
264 // determine v'(pt) weight:
265 if(ptWeights && dBinWidthPt)
266 {
267 wPt=ptWeights->GetBinContent(1+(Int_t)(TMath::Floor((dPt-dPtMin)/dBinWidthPt)));
268 }
269 // determine v'(eta) weight:
270 if(etaWeights && dBinWidthEta)
271 {
272 wEta=etaWeights->GetBinContent(1+(Int_t)(TMath::Floor((dEta-dEtaMin)/dBinWidthEta)));
273 }
274
275 // building up the weighted Q-vector:
44e060e0 276 dQX += dWeight*wPhi*wPt*wEta*TMath::Cos(iOrder*dPhi);
277 dQY += dWeight*wPhi*wPt*wEta*TMath::Sin(iOrder*dPhi);
929098e4 278
279 // weighted multiplicity:
44e060e0 280 iUsedTracks += dWeight*wPhi*wPt*wEta;
929098e4 281
282 } // end of if (pTrack->InRPSelection())
283 } // end of if (pTrack)
284 else
285 {
286 cerr << "no particle!!!"<<endl;
287 }
ae733b3b 288 } // loop over particles
929098e4 289
e35ddff0 290 vQ.Set(dQX,dQY);
291 vQ.SetMult(iUsedTracks);
929098e4 292
e35ddff0 293 return vQ;
929098e4 294
5fef318d 295}
296
929098e4 297//-----------------------------------------------------------------------
298void AliFlowEventSimple::Get2Qsub(AliFlowVector* Qarray, Int_t n, TList *weightsList, Bool_t usePhiWeights, Bool_t usePtWeights, Bool_t useEtaWeights)
395fadba 299{
929098e4 300
301 // calculate Q-vector in harmonic n without weights (default harmonic n=2)
395fadba 302 Double_t dQX = 0.;
303 Double_t dQY = 0.;
929098e4 304
395fadba 305 Int_t iOrder = n;
306 Double_t iUsedTracks = 0;
307 Double_t dPhi = 0.;
308 Double_t dPt = 0.;
309 Double_t dEta = 0.;
44e060e0 310 Double_t dWeight = 1.;
929098e4 311
395fadba 312 AliFlowTrackSimple* pTrack = NULL;
929098e4 313
44e060e0 314 Int_t iNbinsPhiSub0 = 0;
315 Int_t iNbinsPhiSub1 = 0;
395fadba 316 Double_t dBinWidthPt = 0.;
317 Double_t dPtMin = 0.;
318 Double_t dBinWidthEta= 0.;
319 Double_t dEtaMin = 0.;
929098e4 320
321 Double_t dWphi = 1.; // weight Phi
322 Double_t dWpt = 1.; // weight Pt
323 Double_t dWeta = 1.; // weight Eta
324
44e060e0 325 TH1F* phiWeightsSub0 = NULL;
326 TH1F* phiWeightsSub1 = NULL;
29195b69 327 TH1D* ptWeights = NULL;
328 TH1D* etaWeights = NULL;
929098e4 329
330 if(weightsList)
331 {
332 if(usePhiWeights)
333 {
44e060e0 334 phiWeightsSub0 = dynamic_cast<TH1F *>(weightsList->FindObject("phi_weights_sub0"));
335 phiWeightsSub1 = dynamic_cast<TH1F *>(weightsList->FindObject("phi_weights_sub1"));
336 if(phiWeightsSub0) {
337 iNbinsPhiSub0 = phiWeightsSub0->GetNbinsX();
338 }
339 if(phiWeightsSub1) {
340 iNbinsPhiSub1 = phiWeightsSub1->GetNbinsX();
29195b69 341 }
929098e4 342 }
343 if(usePtWeights)
344 {
29195b69 345 ptWeights = dynamic_cast<TH1D *>(weightsList->FindObject("pt_weights"));
929098e4 346 if(ptWeights)
347 {
348 dBinWidthPt = ptWeights->GetBinWidth(1); // assuming that all bins have the same width
349 dPtMin = (ptWeights->GetXaxis())->GetXmin();
350 }
351 }
352 if(useEtaWeights)
353 {
354 etaWeights = dynamic_cast<TH1D *>(weightsList->FindObject("eta_weights"));
355 if(etaWeights)
356 {
357 dBinWidthEta = etaWeights->GetBinWidth(1); // assuming that all bins have the same width
358 dEtaMin = (etaWeights->GetXaxis())->GetXmin();
359 }
360 }
395fadba 361 } // end of if(weightsList)
929098e4 362
b125a454 363 //loop over the two subevents
929098e4 364 for (Int_t s=0; s<2; s++)
365 {
366 // loop over tracks
367 for(Int_t i=0; i<fNumberOfTracks; i++)
368 {
124fb262 369 pTrack = (AliFlowTrackSimple*)fTrackCollection->At(i);
929098e4 370 if(pTrack)
371 {
372 if(pTrack->InRPSelection())
373 {
374 if (pTrack->InSubevent(s))
375 {
44e060e0 376 dPhi = pTrack->Phi();
377 dPt = pTrack->Pt();
378 dEta = pTrack->Eta();
379 dWeight = pTrack->Weight();
929098e4 380
381 // determine Phi weight: (to be improved, I should here only access it + the treatment of gaps in the if statement)
44e060e0 382 if(s == 0) { //subevent 0
383 if(phiWeightsSub0 && iNbinsPhiSub0){
384 dWphi = phiWeightsSub0->GetBinContent(1+(Int_t)(TMath::Floor(dPhi*iNbinsPhiSub0/TMath::TwoPi())));
385 }
386 } else if (s == 1) {
387 if(phiWeightsSub1 && iNbinsPhiSub1){
388 dWphi = phiWeightsSub1->GetBinContent(1+(Int_t)(TMath::Floor(dPhi*iNbinsPhiSub1/TMath::TwoPi())));
389 }
390 }
391
929098e4 392 // determine v'(pt) weight:
393 if(ptWeights && dBinWidthPt)
394 {
395 dWpt=ptWeights->GetBinContent(1+(Int_t)(TMath::Floor((dPt-dPtMin)/dBinWidthPt)));
396 }
44e060e0 397
929098e4 398 // determine v'(eta) weight:
399 if(etaWeights && dBinWidthEta)
400 {
401 dWeta=etaWeights->GetBinContent(1+(Int_t)(TMath::Floor((dEta-dEtaMin)/dBinWidthEta)));
402 }
403
404 // building up the weighted Q-vector:
44e060e0 405 dQX += dWeight*dWphi*dWpt*dWeta*TMath::Cos(iOrder*dPhi);
406 dQY += dWeight*dWphi*dWpt*dWeta*TMath::Sin(iOrder*dPhi);
929098e4 407
408 // weighted multiplicity:
44e060e0 409 iUsedTracks+=dWeight*dWphi*dWpt*dWeta;
929098e4 410
411 } // end of subevent
412 } // end of if (pTrack->InRPSelection())
29195b69 413 } // end of if (pTrack)
929098e4 414 else
415 {
416 cerr << "no particle!!!"<<endl;
417 }
29195b69 418 } // loop over particles
419 Qarray[s].Set(dQX,dQY);
420 Qarray[s].SetMult(iUsedTracks);
421 //reset
422 iUsedTracks = 0;
423 dQX = 0.;
424 dQY = 0.;
425 }
929098e4 426
395fadba 427}
428
429
929098e4 430//-----------------------------------------------------------------------
c076fda8 431void AliFlowEventSimple::Print(Option_t *option) const
432{
433 // -*-*-*-*-*Print some global quantities for this histogram collection class *-*-*-*-*-*-*-*
434 // ===============================================
435 // printf( "TH1.Print Name = %s, Entries= %d, Total sum= %g\n",GetName(),Int_t(fEntries),GetSumOfWeights());
f873707d 436 printf( "Class.Print Name = %s, #tracks= %d, Number of RPs= %d, MC EventPlaneAngle= %f\n",
bc231a12 437 GetName(),fNumberOfTracks, fNumberOfRPs, fMCReactionPlaneAngle );
c076fda8 438
929098e4 439 if (fTrackCollection)
440 {
c076fda8 441 fTrackCollection->Print(option);
442 }
929098e4 443 else
444 {
c076fda8 445 printf( "Empty track collection \n");
446 }
447}
448
929098e4 449//-----------------------------------------------------------------------
450void AliFlowEventSimple::Browse(TBrowser *b)
c076fda8 451{
452 if (!b) return;
929098e4 453 if (!fNumberOfTracksWrap)
454 {
c076fda8 455 fNumberOfTracksWrap = new TParameter<int>("fNumberOfTracks", fNumberOfTracks);
456 b->Add(fNumberOfTracksWrap);
457 }
bc231a12 458 if (!fNumberOfRPsWrap)
929098e4 459 {
bc231a12 460 fNumberOfRPsWrap = new TParameter<int>("fNumberOfRPs", fNumberOfRPs);
461 b->Add(fNumberOfRPsWrap);
c076fda8 462 }
929098e4 463 if (!fMCReactionPlaneAngleWrap)
464 {
7183fe85 465 fMCReactionPlaneAngleWrap = new TParameter<double>(" fMCReactionPlaneAngle", fMCReactionPlaneAngle);
a12990bb 466 b->Add( fMCReactionPlaneAngleWrap);
467 }
c076fda8 468 if (fTrackCollection) b->Add(fTrackCollection,"AliFlowTracksSimple");
469}
470
929098e4 471//-----------------------------------------------------------------------
472AliFlowEventSimple::AliFlowEventSimple( TTree* inputTree,
473 const AliFlowTrackSimpleCuts* rpCuts,
474 const AliFlowTrackSimpleCuts* poiCuts):
475 fTrackCollection(NULL),
85d2ee8d 476 fReferenceMultiplicity(0),
929098e4 477 fNumberOfTracks(0),
bc231a12 478 fNumberOfRPs(0),
929098e4 479 fMCReactionPlaneAngle(0.),
480 fMCReactionPlaneAngleIsSet(kFALSE),
bc231a12 481 fAfterBurnerPrecision(0.001),
929098e4 482 fNumberOfTracksWrap(NULL),
bc231a12 483 fNumberOfRPsWrap(NULL),
929098e4 484 fMCReactionPlaneAngleWrap(NULL)
485{
486 //constructor, fills the event from a TTree of kinematic.root files
487 //applies RP and POI cuts, tags the tracks
488
489 Int_t numberOfInputTracks = inputTree->GetEntries() ;
490 fTrackCollection = new TObjArray(numberOfInputTracks/2);
491
492 TParticle* pParticle = new TParticle();
493 inputTree->SetBranchAddress("Particles",&pParticle);
494
495 Int_t iSelParticlesPOI = 0;
496
497 for (Int_t i=0; i<numberOfInputTracks; i++)
498 {
499 inputTree->GetEntry(i); //get input particle
500
501 if (!pParticle) continue; //no particle
502 if (!pParticle->IsPrimary()) continue;
503
7382279b 504 Bool_t rpOK = rpCuts->PassesCuts(pParticle);
505 Bool_t poiOK = poiCuts->PassesCuts(pParticle);
929098e4 506
7382279b 507 if (rpOK || poiOK)
929098e4 508 {
509 AliFlowTrackSimple* pTrack = new AliFlowTrackSimple(pParticle);
510
511 //marking the particles used for int. flow:
7382279b 512 if(rpOK)
929098e4 513 {
514 pTrack->SetForRPSelection(kTRUE);
bc231a12 515 fNumberOfRPs++;
929098e4 516 }
517 //marking the particles used for diff. flow:
7382279b 518 if(poiOK)
929098e4 519 {
520 pTrack->SetForPOISelection(kTRUE);
521 iSelParticlesPOI++;
522 }
523 //adding a particles which were used either for int. or diff. flow to the list
124fb262 524 AddTrack(pTrack);
929098e4 525 }
526 }//for i
527 delete pParticle;
528}
529
530//_____________________________________________________________________________
531void AliFlowEventSimple::CloneTracks(Int_t n)
532{
533 //clone every track n times to add non-flow
34b15925 534 if (n<=0) return; //no use to clone stuff zero or less times
bc231a12 535 Int_t ntracks = fNumberOfTracks;
536 fTrackCollection->Expand((n+1)*fNumberOfTracks);
537 for (Int_t i=0; i<n; i++)
929098e4 538 {
bc231a12 539 for (Int_t itrack=0; itrack<ntracks; itrack++)
929098e4 540 {
541 AliFlowTrackSimple* track = dynamic_cast<AliFlowTrackSimple*>(fTrackCollection->At(itrack));
542 if (!track) continue;
bc231a12 543 AddTrack(static_cast<AliFlowTrackSimple*>(track->Clone()));
929098e4 544 }
545 }
546}
7382279b 547
548//_____________________________________________________________________________
549void AliFlowEventSimple::ResolutionPt(Double_t res)
550{
551 //smear pt of all tracks by gaussian with sigma=res
552 for (Int_t i=0; i<fNumberOfTracks; i++)
553 {
554 AliFlowTrackSimple* track = static_cast<AliFlowTrackSimple*>(fTrackCollection->At(i));
124fb262 555 if (track) track->ResolutionPt(res);
7382279b 556 }
557}
124fb262 558
559//_____________________________________________________________________________
34b15925 560void AliFlowEventSimple::TagSubeventsInEta( Double_t etaMinA,
561 Double_t etaMaxA,
562 Double_t etaMinB,
563 Double_t etaMaxB )
124fb262 564{
565 //Flag two subevents in given eta ranges
566 for (Int_t i=0; i<fNumberOfTracks; i++)
567 {
568 AliFlowTrackSimple* track = static_cast<AliFlowTrackSimple*>(fTrackCollection->At(i));
569 Double_t eta=track->Eta();
570 if (eta >= etaMinA && eta <= etaMaxA) track->SetForSubevent(0);
571 if (eta >= etaMinB && eta <= etaMaxB) track->SetForSubevent(1);
572 }
573}
574
bc231a12 575//_____________________________________________________________________________
34b15925 576void AliFlowEventSimple::AddV1( Double_t v1 )
bc231a12 577{
578 //add v2 to all tracks wrt the reaction plane angle
579 for (Int_t i=0; i<fNumberOfTracks; i++)
580 {
581 AliFlowTrackSimple* track = static_cast<AliFlowTrackSimple*>(fTrackCollection->At(i));
582 if (track) track->AddV1(v1, fMCReactionPlaneAngle, fAfterBurnerPrecision);
583 }
584}
585
124fb262 586//_____________________________________________________________________________
34b15925 587void AliFlowEventSimple::AddV2( Double_t v2 )
124fb262 588{
244c607a 589 //add v2 to all tracks wrt the reaction plane angle
124fb262 590 for (Int_t i=0; i<fNumberOfTracks; i++)
591 {
592 AliFlowTrackSimple* track = static_cast<AliFlowTrackSimple*>(fTrackCollection->At(i));
bc231a12 593 if (track) track->AddV2(v2, fMCReactionPlaneAngle, fAfterBurnerPrecision);
594 }
595}
596
597//_____________________________________________________________________________
34b15925 598void AliFlowEventSimple::AddV4( Double_t v4 )
bc231a12 599{
600 //add v4 to all tracks wrt the reaction plane angle
601 for (Int_t i=0; i<fNumberOfTracks; i++)
602 {
603 AliFlowTrackSimple* track = static_cast<AliFlowTrackSimple*>(fTrackCollection->At(i));
604 if (track) track->AddV4(v4, fMCReactionPlaneAngle, fAfterBurnerPrecision);
605 }
606}
607
608//_____________________________________________________________________________
34b15925 609void AliFlowEventSimple::AddFlow( Double_t v1, Double_t v2, Double_t v4 )
bc231a12 610{
611 //add flow to all tracks wrt the reaction plane angle
612 for (Int_t i=0; i<fNumberOfTracks; i++)
613 {
614 AliFlowTrackSimple* track = static_cast<AliFlowTrackSimple*>(fTrackCollection->At(i));
615 if (track) track->AddFlow(v1,v2,v4,fMCReactionPlaneAngle, fAfterBurnerPrecision);
124fb262 616 }
617}
618
dd91b595 619//_____________________________________________________________________________
34b15925 620void AliFlowEventSimple::TagRP( AliFlowTrackSimpleCuts* cuts )
dd91b595 621{
622 //tag tracks as reference particles (RPs)
623 for (Int_t i=0; i<fNumberOfTracks; i++)
624 {
625 AliFlowTrackSimple* track = static_cast<AliFlowTrackSimple*>(fTrackCollection->At(i));
626 if (!track) continue;
701f71c1 627 Bool_t pass=cuts->PassesCuts(track);
628 track->SetForRPSelection(pass);
629 if (pass)
f873707d 630 fNumberOfRPs++;
701f71c1 631 else
632 fNumberOfRPs--;
dd91b595 633 }
634}
635
636//_____________________________________________________________________________
34b15925 637void AliFlowEventSimple::TagPOI( AliFlowTrackSimpleCuts* cuts )
dd91b595 638{
639 //tag tracks as particles of interest (POIs)
640 for (Int_t i=0; i<fNumberOfTracks; i++)
641 {
642 AliFlowTrackSimple* track = static_cast<AliFlowTrackSimple*>(fTrackCollection->At(i));
643 if (!track) continue;
701f71c1 644 Bool_t pass=cuts->PassesCuts(track);
645 track->SetForPOISelection(pass);
dd91b595 646 }
647}
648
34b15925 649//_____________________________________________________________________________
650void AliFlowEventSimple::DefineDeadZone( Double_t etaMin,
651 Double_t etaMax,
652 Double_t phiMin,
653 Double_t phiMax )
654{
655 //mark tracks in given eta-phi region as dead
656 //by resetting the flow bits
657 for (Int_t i=0; i<fNumberOfTracks; i++)
658 {
659 AliFlowTrackSimple* track = static_cast<AliFlowTrackSimple*>(fTrackCollection->At(i));
660 Double_t eta = track->Eta();
661 Double_t phi = track->Phi();
662 if (eta>etaMin && eta<etaMax && phi>phiMin && phi<phiMax)
1a43aca9 663 {
664 if (track->InRPSelection()) fNumberOfRPs--;
34b15925 665 track->ResetFlowTags();
1a43aca9 666 }
34b15925 667 }
668}
669
670//_____________________________________________________________________________
671Int_t AliFlowEventSimple::CleanUpDeadTracks()
672{
673 //remove tracks that have no flow tags set and cleanup the container
65ef7d1a 674 //returns number of cleaned tracks
675 Int_t ncleaned=0;
34b15925 676 for (Int_t i=0; i<fNumberOfTracks; i++)
677 {
678 AliFlowTrackSimple* track = static_cast<AliFlowTrackSimple*>(fTrackCollection->At(i));
65ef7d1a 679 if (track->IsDead()) {delete track;ncleaned++;}
34b15925 680 }
681 fTrackCollection->Compress(); //clean up empty slots
65ef7d1a 682 return ncleaned;
34b15925 683}