1 /*************************************************************************
2 * Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 /**********************************
17 * create an event and perform *
18 * flow analysis 'on the fly' *
20 * authors: Raimond Snellings *
21 * (snelling@nikhef.nl) *
24 *********************************/
26 #include "Riostream.h"
31 #include "AliFlowEventSimpleMakerOnTheFly.h"
32 #include "AliFlowEventSimple.h"
33 #include "AliFlowTrackSimple.h"
35 ClassImp(AliFlowEventSimpleMakerOnTheFly)
38 //========================================================================
41 AliFlowEventSimpleMakerOnTheFly::AliFlowEventSimpleMakerOnTheFly(UInt_t iseed):
42 fUseGlauberModel(kFALSE),
43 fMultDistrOfRPsIsGauss(kFALSE),
45 fMultiplicitySpreadOfRP(0.),
49 fPtDependentHarmonicV1(kFALSE),
50 fEtaDependentHarmonicV1(kFALSE),
51 fPtDependentHarmonicV2(kFALSE),
52 fEtaDependentHarmonicV2(kFALSE),
53 fPtDependentHarmonicV4(kFALSE),
54 fEtaDependentHarmonicV4(kFALSE),
57 fConstantV2IsSampledFromGauss(kFALSE),
78 fPhiDistribution(NULL),
85 fNonflowSectorMin(0.),
86 fNonflowSectorMax(TMath::TwoPi()),
92 fJetProbability(0.25),
93 fJetTracksFraction(0.1),
97 fMyTRandom3 = new TRandom3(iseed);
98 gRandom->SetSeed(fMyTRandom3->Integer(65539));
102 //========================================================================
105 AliFlowEventSimpleMakerOnTheFly::~AliFlowEventSimpleMakerOnTheFly()
108 if (fPtSpectra) delete fPtSpectra;
109 if (fPhiDistribution) delete fPhiDistribution;
110 if (fMyTRandom3) delete fMyTRandom3;
114 //========================================================================
117 void AliFlowEventSimpleMakerOnTheFly::Init()
119 // define the pt spectra and phi distribution
121 // pt spectra of pions (Boltzman):
122 Double_t dPtMin = 0.; // to be improved (move this to the body of contstructor?)
123 Double_t dPtMax = 10.; // to be improved (move this to the body of contstructor?)
125 fPtSpectra = new TF1("fPtSpectra","[0]*x*TMath::Exp(-pow(0.13957*0.13957+x*x,0.5)/[1])",dPtMin,dPtMax);
126 fPtSpectra->SetParName(0,"Multiplicity of RPs");
127 fPtSpectra->SetParName(1,"Temperature of RPs");
130 Double_t dPhiMin = 0.; // to be improved (move this to the body of contstructor?)
131 Double_t dPhiMax = TMath::TwoPi(); // to be improved (move this to the body of contstructor?)
133 fPhiDistribution = new TF1("fPhiDistribution","1+2.*[0]*TMath::Cos(x-[2])+2.*[1]*TMath::Cos(2*(x-[2]))+2.*[4]*TMath::Cos(3*(x-[2]))+2.*[3]*TMath::Cos(4*(x-[2]))",dPhiMin,dPhiMax);
134 fPhiDistribution->SetParName(0,"directed flow");
135 fPhiDistribution->SetParName(1,"elliptic flow");
136 fPhiDistribution->SetParName(2,"Reaction Plane");
137 fPhiDistribution->SetParName(4,"triangular flow");
138 fPhiDistribution->SetParName(3,"harmonic 4"); // to be improved (name)
142 //========================================================================
144 Int_t AliFlowEventSimpleMakerOnTheFly::DetermineMultiplicity()
146 // Determine multiplicity for current event.
148 Int_t iNewMultiplicityOfRP = fMultiplicityOfRP;
150 if(fMultDistrOfRPsIsGauss) {
151 if (fMultiplicitySpreadOfRP>0.0) iNewMultiplicityOfRP = (Int_t)fMyTRandom3->Gaus(fMultiplicityOfRP,fMultiplicitySpreadOfRP);
152 fPtSpectra->SetParameter(0,iNewMultiplicityOfRP);
154 if (fMinMultOfRP != fMaxMultOfRP) {
155 iNewMultiplicityOfRP = (Int_t)fMyTRandom3->Uniform(fMinMultOfRP,fMaxMultOfRP);
156 fPtSpectra->SetParameter(0,iNewMultiplicityOfRP);
158 fPtSpectra->SetParameter(0,fMinMultOfRP);
162 return iNewMultiplicityOfRP;
164 } // end of AliFlowEventSimpleMakerOnTheFly::DetermineMultiplicity()
166 //========================================================================
168 void AliFlowEventSimpleMakerOnTheFly::DetermineV1()
170 // Determine flow harmonics v1 for current event (if v1 is not pt or eta dependent).
172 Double_t dNewV1RP=fV1RP;
173 if(fV1SpreadRP>0.0) {dNewV1RP = fMyTRandom3->Gaus(fV1RP,fV1SpreadRP);}
174 fPhiDistribution->SetParameter(0,dNewV1RP);
176 } // end of void AliFlowEventSimpleMakerOnTheFly::DetermineV1()
178 //========================================================================
180 void AliFlowEventSimpleMakerOnTheFly::DetermineV3()
182 // Determine flow harmonics V3 for current event (if V3 is not pt or eta dependent).
184 Double_t dNewV3RP = fV3RP;
185 if(fV3SpreadRP>0.0) dNewV3RP = fMyTRandom3->Gaus(fV3RP,fV3SpreadRP);
186 fPhiDistribution->SetParameter(4,dNewV3RP);
188 } // end of void AliFlowEventSimpleMakerOnTheFly::DetermineV3()
190 //========================================================================
192 void AliFlowEventSimpleMakerOnTheFly::DetermineV4()
194 // Determine flow harmonics v4 for current event (if v4 is not pt or eta dependent).
196 Double_t dNewV4RP = fV4RP;
197 if(fV4SpreadRP>0.0) dNewV4RP = fMyTRandom3->Gaus(fV4RP,fV4SpreadRP);
198 fPhiDistribution->SetParameter(3,dNewV4RP);
200 } // end of void AliFlowEventSimpleMakerOnTheFly::DetermineV4()
202 //========================================================================
204 void AliFlowEventSimpleMakerOnTheFly::DetermineV2()
206 // Determine flow harmonics v2 for current event (if v2 is not pt or eta dependent).
208 Double_t dNewV2RP = fV2RP;
210 if(fConstantV2IsSampledFromGauss)
214 dNewV2RP = fMyTRandom3->Gaus(fV2RP,fV2SpreadRP);}
215 fPhiDistribution->SetParameter(1,dNewV2RP);
216 } else if(fMinV2RP < fMaxV2RP)
218 dNewV2RP = fMyTRandom3->Uniform(fMinV2RP,fMaxV2RP);
219 fPhiDistribution->SetParameter(1,dNewV2RP);
220 } else if(fMinV2RP == fMaxV2RP)
223 fPhiDistribution->SetParameter(1,dNewV2RP);
226 } // end of void AliFlowEventSimpleMakerOnTheFly::DetermineV2()
228 //========================================================================
230 Int_t AliFlowEventSimpleMakerOnTheFly::GlauberModel()
232 // Determine multiplicity and flow harmonics for current event from Glauber moder
234 Int_t multiplicity = 0;
240 // Determine multiplicity, v1, v2, v3 and v4 from Glauber model:
242 // multiplicity = ...
248 // Set obtained values as parameters in relevant distributions:
249 fPtSpectra->SetParameter(0,multiplicity);
250 fPhiDistribution->SetParameter(0,v1);
251 fPhiDistribution->SetParameter(1,v2);
252 fPhiDistribution->SetParameter(4,v3);
253 fPhiDistribution->SetParameter(3,v4);
257 } // end of Int_t AliFlowEventSimpleMakerOnTheFly::GlauberModel()
259 //========================================================================
261 AliFlowEventSimple* AliFlowEventSimpleMakerOnTheFly::CreateEventOnTheFly(AliFlowTrackSimpleCuts *cutsRP, AliFlowTrackSimpleCuts *cutsPOI)
263 // Method to create event on the fly.
265 // Determine multiplicity and flow harmonics (if not pt or eta dependent) for current event:
266 Int_t multiplicityRP = 0;
267 if(!fUseGlauberModel)
269 multiplicityRP = DetermineMultiplicity();
270 if(!(fPtDependentHarmonicV1||fEtaDependentHarmonicV1)) {DetermineV1();}
271 if(!(fPtDependentHarmonicV2||fEtaDependentHarmonicV2)) {DetermineV2();}
272 DetermineV3(); // to be improved - add also pt and eta dependence for v3
273 if(!(fPtDependentHarmonicV4||fEtaDependentHarmonicV4)) {DetermineV4();}
276 // Determine multipliciy and flow harmonics from Glauber model:
277 multiplicityRP = GlauberModel();
280 AliFlowEventSimple* pEvent = new AliFlowEventSimple(multiplicityRP);
282 // decide if you will create jets or not in this event:
285 if(fMyTRandom3->Uniform(0,1) > 1 - fJetProbability)
290 fCreateJets = kFALSE;
294 // set the 'temperature' of RPs
295 fPtSpectra->SetParameter(1,fTemperatureOfRP);
297 // sampling the reaction plane
298 Double_t dMCReactionPlaneAngle = fMyTRandom3->Uniform(0.,TMath::TwoPi());
299 fPhiDistribution->SetParameter(2,dMCReactionPlaneAngle);
302 Double_t dEtaMin = -1.; // to be improved
303 Double_t dEtaMax = 1.; // to be improved
305 Int_t iGoodTracks = 0;
306 Int_t iSelParticlesRP = 0;
307 Int_t iSelParticlesPOI = 0;
308 // parameters of original tracks:
309 Double_t dPhiOriginalTrack = 0.;
310 Double_t dPtOriginalTrack = 0.;
311 Double_t dEtaOriginalTrack = 0.;
312 // parameters of splitted tracks:
313 Double_t dPhiSplittedTrack = 0.;
314 Double_t dPtSplittedTrack = 0.;
315 Double_t dEtaSplittedTrack = 0.;
317 Double_t dTmpV1 = 0.;
318 Double_t dTmpV2 = 0.;
319 //Double_t dTmpV3 = 0.;
320 Double_t dTmpV4 = 0.;
321 Bool_t bUniformAcceptance = kTRUE;
322 Double_t Pi = TMath::Pi();
324 if(!((fPhiMin1==0.) && (fPhiMax1==0.) && (fPhiMin2==0.) && (fPhiMax2==0.))) {
325 bUniformAcceptance = kFALSE;
327 // loop over original tracks:
328 for(Int_t i=0;i<multiplicityRP;i++)
330 // sample the pt and eta for original track:
331 dPtOriginalTrack = fPtSpectra->GetRandom();
332 dEtaOriginalTrack = fMyTRandom3->Uniform(dEtaMin,dEtaMax);
333 // generate flow harmonics which will determine the azimuthal distribution (to be improved - optimized):
335 if(fPtDependentHarmonicV2 || fEtaDependentHarmonicV2)
337 if(fEtaDependentHarmonicV2)
339 if(fV2vsEtaSpread>0.)
341 dTmpV2 = TMath::Exp(-pow(dEtaOriginalTrack/fV2vsEtaSpread,2.));
343 if(!fPtDependentHarmonicV2)
345 dTmpV2*=fV2vsPtEtaMax;
347 } // end of if(fEtaDependentHarmonicV2)
348 if(fPtDependentHarmonicV2)
350 if(!fEtaDependentHarmonicV2)
352 if(dPtOriginalTrack >= fV2PtCutOff) {dTmpV2 = fV2vsPtEtaMax;}
353 else {dTmpV2 = fV2vsPtEtaMax*(dPtOriginalTrack/fV2PtCutOff);}
356 if(dPtOriginalTrack >= fV2PtCutOff) {dTmpV2 *= fV2vsPtEtaMax;}
357 else {dTmpV2 *= fV2vsPtEtaMax*(dPtOriginalTrack/fV2PtCutOff);}
359 } // end of if(fPtDependentHarmonicV2)
360 // flow harmonic is determined and plugged in as a parameter in the predefined azimuthal distribution:
361 fPhiDistribution->SetParameter(1,dTmpV2);
364 if(fPtDependentHarmonicV1 || fEtaDependentHarmonicV1)
366 if(fEtaDependentHarmonicV1)
368 dTmpV1 = -1.*dEtaOriginalTrack;
369 if(!fPtDependentHarmonicV1)
371 dTmpV1*=fV1vsPtEtaMax;
373 } // end of if(fEtaDependentHarmonicV1)
374 if(fPtDependentHarmonicV1)
376 if(!fEtaDependentHarmonicV1)
378 if(dPtOriginalTrack >= fV1PtCutOff) {dTmpV1 = fV1vsPtEtaMax;}
379 else {dTmpV1 = fV1vsPtEtaMax*(dPtOriginalTrack/fV1PtCutOff);}
382 if(dPtOriginalTrack >= fV1PtCutOff) {dTmpV1 *= fV1vsPtEtaMax;}
383 else {dTmpV1 *= fV1vsPtEtaMax*(dPtOriginalTrack/fV1PtCutOff);}
385 } // end of if(fPtDependentHarmonicV1)
386 // flow harmonic is determined and plugged in as a parameter in the predefined azimuthal distribution:
387 fPhiDistribution->SetParameter(0,dTmpV1);
388 } // end of if(fPtDependentHarmonicV1 || fEtaDependentHarmonicV1)
390 if(fPtDependentHarmonicV4 || fEtaDependentHarmonicV4)
392 dTmpV4 = pow(dTmpV2,2.);
393 fPhiDistribution->SetParameter(3,dTmpV4);
395 // sample the phi angle for original track:
396 dPhiOriginalTrack = fPhiDistribution->GetRandom();
397 // from each original track make fNoOfLoops splitted tracks if the particle is ongoing in
398 // detector's sector ranging from fNonflowSectorMin to fNonflowSectorMax
399 // (simulating nonflow correlations between fNoOfLoops tracks in certain detector's sector):
400 for(Int_t d=0;d<fNoOfLoops;d++)
402 if(d>0 && (dPhiOriginalTrack>=fNonflowSectorMin && dPhiOriginalTrack<fNonflowSectorMax))
404 dPhiSplittedTrack = dPhiOriginalTrack;
405 dPtSplittedTrack = dPtOriginalTrack;
406 dEtaSplittedTrack = dEtaOriginalTrack;
410 dPhiSplittedTrack = fMyTRandom3->Uniform(dPhiOriginalTrack-fPhiRange,dPhiOriginalTrack+fPhiRange);
411 if(dPhiSplittedTrack<0)
413 dPhiSplittedTrack+=TMath::TwoPi(); // to ensure angle is in [0,2Pi>
415 if(dPhiSplittedTrack>=TMath::TwoPi())
417 dPhiSplittedTrack-=TMath::TwoPi(); // to ensure angle is in [0,2Pi>
419 } // end of if(fPhiRange>0.)
423 Double_t minPt = dPtOriginalTrack-fPtRange;
424 Double_t maxPt = dPtOriginalTrack+fPtRange;
427 minPt = 0.; // protection against pt<0 for splitted track
429 dPtSplittedTrack = fMyTRandom3->Uniform(minPt,maxPt);
430 } // end of if(fPtRange>0.)
434 dEtaSplittedTrack = fMyTRandom3->Uniform(dEtaOriginalTrack-fEtaRange,dEtaOriginalTrack+fEtaRange);
435 } // end of if(fEtaRange>0.)
436 } // end of if(d>0 && (dPhiOriginalTrack>=fNonflowSectorMin && dPhiOriginalTrack<fNonflowSectorMax))
437 Double_t dTmpPhi = -44.;
438 Double_t dTmpPt = -44.;
439 Double_t dTmpEta = -44.;
442 if(dPhiOriginalTrack>=fNonflowSectorMin && dPhiOriginalTrack<fNonflowSectorMax)
444 dTmpPhi = dPhiSplittedTrack;
445 dTmpPt = dPtSplittedTrack;
446 dTmpEta = dEtaSplittedTrack;
450 dTmpPhi = dPhiOriginalTrack;
451 dTmpPt = dPtOriginalTrack;
452 dTmpEta = dEtaOriginalTrack;
454 // make the new track:
455 AliFlowTrackSimple *pTrack = new AliFlowTrackSimple();
456 // uniform acceptance:
457 if(bUniformAcceptance)
459 if(!fCreateJets || (fCreateJets && !(i >= TMath::Nint((1.-fJetTracksFraction)*multiplicityRP))))
461 pTrack->SetPt(dTmpPt);
462 pTrack->SetEta(dTmpEta);
463 pTrack->SetPhi(dTmpPhi);
465 if(cutsRP->PassesCuts(pTrack))
467 pTrack->SetForRPSelection(kTRUE);
470 // assign particles to subevents:
471 if(pTrack->Eta()>=fEtaMinA && pTrack->Eta()<=fEtaMaxA)
473 pTrack->SetForSubevent(0);
475 if(pTrack->Eta()>=fEtaMinB && pTrack->Eta()<=fEtaMaxB)
477 pTrack->SetForSubevent(1);
479 // checking POI cuts:
480 if(cutsPOI->PassesCuts(pTrack))
482 pTrack->SetForPOISelection(kTRUE);
485 pEvent->AddTrack(pTrack);
486 } else // to if(!fCreateJets || (fCreateJets && !(i >= (Int_t)(1.-fJetTracksFraction)*multiplicityRP)))
488 for(Int_t j=0;j<TMath::Nint(fJetTracksFraction*multiplicityRP);j++) // fragmenting last sampled particle into the jet
490 AliFlowTrackSimple *pTrackInJet = new AliFlowTrackSimple();
491 Double_t dTmpPhiWithinJet = fMyTRandom3->Uniform(dTmpPhi-fJetCone*TMath::Pi()/360.,dTmpPhi+fJetCone*TMath::Pi()/360.);
492 if(dTmpPhiWithinJet<0.)
494 dTmpPhiWithinJet+=TMath::TwoPi(); // to ensure angle is in [0,2Pi>
496 if(dTmpPhiWithinJet>=TMath::TwoPi())
498 dTmpPhiWithinJet-=TMath::TwoPi(); // to ensure angle is in [0,2Pi>
500 pTrackInJet->SetPt(dTmpPt); // to be improved - smear pt a little bit for particles in jet
501 pTrackInJet->SetEta(dTmpEta); // to be improved - smear eta a little bit for particles in jet
502 pTrackInJet->SetPhi(dTmpPhiWithinJet);
504 if(cutsRP->PassesCuts(pTrackInJet))
506 pTrackInJet->SetForRPSelection(kTRUE);
509 // assign particles to subevents:
510 if(pTrackInJet->Eta()>=fEtaMinA && pTrackInJet->Eta()<=fEtaMaxA)
512 pTrackInJet->SetForSubevent(0);
514 if(pTrackInJet->Eta()>=fEtaMinB && pTrackInJet->Eta()<=fEtaMaxB)
516 pTrackInJet->SetForSubevent(1);
518 // checking POI cuts:
519 if(cutsPOI->PassesCuts(pTrackInJet))
521 pTrackInJet->SetForPOISelection(kTRUE);
524 pEvent->AddTrack(pTrackInJet);
526 //delete pTrackInJet;
527 } // end of for(Int_t j=0;j<Int_t(fJetTracksFraction*multiplicityRP);j++)
529 } // end of else // to if(!fCreateJets || (fCreateJets && !(i >= (Int_t)(1.-fJetTracksFraction)*multiplicityRP)))
530 } // end of if(bUniformAcceptance)
531 // non-uniform acceptance, 1st sector:
532 else if((dTmpPhi > fPhiMin1*Pi/180) && (dTmpPhi < fPhiMax1*Pi/180))
534 if(fMyTRandom3->Uniform(0,1) > 1 - fProbability1)
536 pTrack->SetPt(dTmpPt);
537 pTrack->SetEta(dTmpEta);
538 pTrack->SetPhi(dTmpPhi);
540 if(cutsRP->PassesCuts(pTrack))
542 pTrack->SetForRPSelection(kTRUE);
545 // assign particles to subevents
546 if(pTrack->Eta()>=fEtaMinA && pTrack->Eta()<=fEtaMaxA)
548 pTrack->SetForSubevent(0);
550 if(pTrack->Eta()>=fEtaMinB && pTrack->Eta()<=fEtaMaxB)
552 pTrack->SetForSubevent(1);
554 // checking POI cuts:
555 if(cutsPOI->PassesCuts(pTrack))
557 pTrack->SetForPOISelection(kTRUE);
560 pEvent->AddTrack(pTrack);
562 } // end of if(fMyTRandom3->Uniform(0,1) > 1 - fProbability1)
563 } // end of else if ((dTmpPhi > fPhiMin1*Pi/180) && (dTmpPhi < fPhiMax1*Pi/180))
564 // non-uniform acceptance, 2nd sector:
565 else if((dTmpPhi > fPhiMin2*Pi/180) && (dTmpPhi < fPhiMax2*Pi/180))
567 if(fMyTRandom3->Uniform(0,1) > 1 - fProbability2)
569 pTrack->SetPt(dTmpPt);
570 pTrack->SetEta(dTmpEta);
571 pTrack->SetPhi(dTmpPhi);
573 if(cutsRP->PassesCuts(pTrack))
575 pTrack->SetForRPSelection(kTRUE);
578 // assign particles to subevents
579 if(pTrack->Eta()>=fEtaMinA && pTrack->Eta()<=fEtaMaxA)
581 pTrack->SetForSubevent(0);
583 if(pTrack->Eta()>=fEtaMinB && pTrack->Eta()<=fEtaMaxB)
585 pTrack->SetForSubevent(1);
587 // checking POI cuts:
588 if(cutsPOI->PassesCuts(pTrack))
590 pTrack->SetForPOISelection(kTRUE);
593 pEvent->AddTrack(pTrack);
595 } // end of if(fMyTRandom3->Uniform(0,1) > 1 - fProbability2)
596 } // end of else if ((dTmpPhi > fPhiMin2*Pi/180) && (dTmpPhi < fPhiMax2*Pi/180))
599 pTrack->SetPt(dTmpPt);
600 pTrack->SetEta(dTmpEta);
601 pTrack->SetPhi(dTmpPhi);
603 if(cutsRP->PassesCuts(pTrack))
605 pTrack->SetForRPSelection(kTRUE);
608 // assign particles to subevents
609 if (pTrack->Eta()>=fEtaMinA && pTrack->Eta()<=fEtaMaxA)
611 pTrack->SetForSubevent(0);
613 if (pTrack->Eta()>=fEtaMinB && pTrack->Eta()<=fEtaMaxB)
615 pTrack->SetForSubevent(1);
617 // checking POI cuts:
618 if(cutsPOI->PassesCuts(pTrack))
620 pTrack->SetForPOISelection(kTRUE);
623 pEvent->AddTrack(pTrack);
627 } // end of for(Int_t d=0;d<fNoOfLoops;d++)
628 } // end of for(Int_t i=0;i<iNewMultiplicityOfRP;i++)
630 // update the event quantities
631 pEvent->SetEventNSelTracksRP(iSelParticlesRP);
632 pEvent->SetMCReactionPlaneAngle(dMCReactionPlaneAngle);
635 if(fPtDependentHarmonicV1 || fEtaDependentHarmonicV1 ||
636 fPtDependentHarmonicV2 || fEtaDependentHarmonicV2 ||
637 fPtDependentHarmonicV4 || fEtaDependentHarmonicV4)
645 if ( (++fCount % cycle) == 0) {
646 if (!dMCReactionPlaneAngle == 0) cout<<" MC Reaction Plane Angle = "<< dMCReactionPlaneAngle << endl;
647 else cout<<" MC Reaction Plane Angle = unknown "<< endl;
648 cout<<" iGoodTracks = "<< iGoodTracks << endl;
649 cout<<" # of RP selected tracks = "<<iSelParticlesRP<<endl;
650 cout<<" # of POI selected tracks = "<<iSelParticlesPOI<<endl;
651 cout << "# " << fCount << " events processed" << endl;
656 } // end of CreateEventOnTheFly()
658 //========================================================================
661 Double_t AliFlowEventSimpleMakerOnTheFly::NonflowBias()
663 // Determine multiplicity and flow harmonics for current event from Glauber moder
665 Int_t multiplicity = 0;
670 // Determine multiplicity, v1, v2 and v4 from Glauber model:
672 // multiplicity = ...
677 // Set obtained values as parameters in relevant distributions:
678 fPtSpectra->SetParameter(0,multiplicity);
679 fPhiDistribution->SetParameter(0,v1);
680 fPhiDistribution->SetParameter(1,v2);
681 fPhiDistribution->SetParameter(3,v4);
685 } // end of Double_t AliFlowEventSimpleMakerOnTheFly::NonflowBias()
687 //========================================================================