4 #include "TParticle.h"
\r
5 #include "TLorentzVector.h"
\r
6 #include "TGraphErrors.h"
\r
10 #include "TArrayF.h"
\r
12 #include "TRandom.h"
\r
15 #include "AliAnalysisManager.h"
\r
18 #include "AliEventPoolManager.h"
\r
20 #include "AliAnalysisTaskToyModel.h"
\r
21 #include "AliBalance.h"
\r
22 #include "AliBalancePsi.h"
\r
23 #include "AliAnalysisTaskTriggeredBF.h"
\r
26 // Analysis task for the toy model analysis
\r
27 // Authors: Panos.Christakoglou@nikhef.nl
\r
32 ClassImp(AliAnalysisTaskToyModel)
\r
34 //________________________________________________________________________
\r
35 AliAnalysisTaskToyModel::AliAnalysisTaskToyModel()
\r
39 fRunShuffling(kFALSE), fShuffledBalance(0),
\r
40 fRunMixing(kFALSE), fMixedBalance(0), fPoolMgr(0),
\r
41 fList(0), fListBF(0), fListBFS(0), fListBFM(0),
\r
43 fHistNumberOfAcceptedParticles(0),
\r
44 fHistReactionPlane(0),
\r
45 fHistEtaTotal(0), fHistEta(0),
\r
46 fHistEtaPhiPos(0), fHistEtaPhiNeg(0),
\r
48 fHistRapidityPions(0), fHistRapidityKaons(0), fHistRapidityProtons(0),
\r
50 fHistPhiPions(0), fHistPhiKaons(0), fHistPhiProtons(0),
\r
52 fHistPtPions(0), fHistPtKaons(0), fHistPtProtons(0),
\r
53 fTotalMultiplicityMean(100.), fTotalMultiplicitySigma(0.0),
\r
54 fNetChargeMean(0.0), fNetChargeSigma(0.0),
\r
55 fPtMin(0.0), fPtMax(100.0),
\r
56 fEtaMin(-1.0), fEtaMax(1.0),
\r
57 fUseAcceptanceParameterization(kFALSE), fAcceptanceParameterization(0),
\r
58 fSimulateDetectorEffects(kFALSE),
\r
59 fNumberOfInefficientSectors(0),
\r
60 fInefficiencyFactorInPhi(1.0),
\r
61 fNumberOfDeadSectors(0),
\r
62 fEfficiencyDropNearEtaEdges(kFALSE),
\r
63 fEfficiencyMatrix(0),
\r
64 fUseAllCharges(kFALSE), fParticleMass(0.0),
\r
65 fPtSpectraAllCharges(0), fTemperatureAllCharges(100.),
\r
66 fReactionPlane(0.0),
\r
67 fAzimuthalAngleAllCharges(0), fDirectedFlowAllCharges(0.0),
\r
68 fEllipticFlowAllCharges(0.0), fTriangularFlowAllCharges(0.0),
\r
69 fQuandrangularFlowAllCharges(0.0), fPentangularFlowAllCharges(0.0),
\r
70 fPionPercentage(0.8), fPionMass(0.0),
\r
71 fPtSpectraPions(0), fTemperaturePions(100.),
\r
72 fAzimuthalAnglePions(0), fDirectedFlowPions(0.0),
\r
73 fEllipticFlowPions(0.0), fTriangularFlowPions(0.0),
\r
74 fQuandrangularFlowPions(0.0), fPentangularFlowPions(0.0),
\r
75 fKaonPercentage(0.8), fKaonMass(0.0),
\r
76 fPtSpectraKaons(0), fTemperatureKaons(100.),
\r
77 fAzimuthalAngleKaons(0), fDirectedFlowKaons(0.0),
\r
78 fEllipticFlowKaons(0.0), fTriangularFlowKaons(0.0),
\r
79 fQuandrangularFlowKaons(0.0), fPentangularFlowKaons(0.0),
\r
80 fProtonPercentage(0.8), fProtonMass(0.0),
\r
81 fPtSpectraProtons(0), fTemperatureProtons(100.),
\r
82 fAzimuthalAngleProtons(0), fDirectedFlowProtons(0.0),
\r
83 fEllipticFlowProtons(0.0), fTriangularFlowProtons(0.0),
\r
84 fQuandrangularFlowProtons(0.0), fPentangularFlowProtons(0.0),
\r
85 fUseDynamicalCorrelations(kFALSE), fDynamicalCorrelationsPercentage(0.1),
\r
86 fUseJets(kFALSE), fPtAssoc(0) {
\r
90 //________________________________________________________________________
\r
91 AliAnalysisTaskToyModel::~AliAnalysisTaskToyModel() {
\r
93 if(fUseAllCharges) {
\r
94 delete fPtSpectraAllCharges;
\r
95 delete fAzimuthalAngleAllCharges;
\r
98 delete fPtSpectraPions;
\r
99 delete fAzimuthalAnglePions;
\r
100 delete fPtSpectraKaons;
\r
101 delete fAzimuthalAngleKaons;
\r
102 delete fPtSpectraProtons;
\r
103 delete fAzimuthalAngleProtons;
\r
105 if(fUseJets) delete fPtAssoc;
\r
108 //________________________________________________________________________
\r
109 void AliAnalysisTaskToyModel::Init() {
\r
110 //Initialize objects
\r
111 //==============gRandom Seed=======================//
\r
112 gRandom->SetSeed(0); //seed is set to a random value (depending on machine clock)
\r
113 //==============gRandom Seed=======================//
\r
115 //==============Particles and spectra==============//
\r
116 TParticle *pion = new TParticle();
\r
117 pion->SetPdgCode(211);
\r
118 fPionMass = pion->GetMass();
\r
120 TParticle *kaon = new TParticle();
\r
121 kaon->SetPdgCode(321);
\r
122 fKaonMass = kaon->GetMass();
\r
124 TParticle *proton = new TParticle();
\r
125 proton->SetPdgCode(2212);
\r
126 fProtonMass = proton->GetMass();
\r
128 if(fUseAllCharges) {
\r
129 fParticleMass = fPionMass;
\r
130 fPtSpectraAllCharges = new TF1("fPtSpectraAllCharges","x*TMath::Exp(-TMath::Power([0]*[0]+x*x,0.5)/[1])",0.,5.);
\r
131 fPtSpectraAllCharges->SetParName(0,"Mass");
\r
132 fPtSpectraAllCharges->SetParName(1,"Temperature");
\r
133 //fPtSpectraAllCharges = new TF1("fPtSpectraAllCharges","(x^2/TMath::Sqrt(TMath::Power(x,2) + TMath::Power(0.139,2)))*TMath::Power((1. + x/[0]),-[1])",0.,20.);
\r
134 //fPtSpectraAllCharges->SetParName(0,"pt0");
\r
135 //fPtSpectraAllCharges->SetParName(1,"b");
\r
138 fPtSpectraPions = new TF1("fPtSpectraPions","x*TMath::Exp(-TMath::Power([0]*[0]+x*x,0.5)/[1])",0.,5.);
\r
139 fPtSpectraPions->SetParName(0,"Mass");
\r
140 fPtSpectraPions->SetParName(1,"Temperature");
\r
142 fPtSpectraKaons = new TF1("fPtSpectraKaons","x*TMath::Exp(-TMath::Power([0]*[0]+x*x,0.5)/[1])",0.,5.);
\r
143 fPtSpectraKaons->SetParName(0,"Mass");
\r
144 fPtSpectraKaons->SetParName(1,"Temperature");
\r
146 fPtSpectraProtons = new TF1("fPtSpectraProtons","x*TMath::Exp(-TMath::Power([0]*[0]+x*x,0.5)/[1])",0.,5.);
\r
147 fPtSpectraProtons->SetParName(0,"Mass");
\r
148 fPtSpectraProtons->SetParName(1,"Temperature");
\r
150 //==============Particles and spectra==============//
\r
152 //==============Flow values==============//
\r
153 if(fUseAllCharges) {
\r
155 Printf("Directed flow: %lf",fDirectedFlowAllCharges);
\r
156 Printf("Elliptic flow: %lf",fEllipticFlowAllCharges);
\r
157 Printf("Triangular flow: %lf",fTriangularFlowAllCharges);
\r
158 Printf("Quandrangular flow: %lf",fQuandrangularFlowAllCharges);
\r
159 Printf("Pentangular flow: %lf",fPentangularFlowAllCharges);
\r
162 fAzimuthalAngleAllCharges = new TF1("fAzimuthalAngleAllCharges","1+2.*[1]*TMath::Cos(x-[0])+2.*[2]*TMath::Cos(2*(x-[0]))+2.*[3]*TMath::Cos(3*(x-[0]))+2.*[4]*TMath::Cos(4*(x-[0]))+2.*[5]*TMath::Cos(5*(x-[0]))",0.,2.*TMath::Pi());
\r
163 fAzimuthalAngleAllCharges->SetParName(0,"Reaction Plane");
\r
164 fAzimuthalAngleAllCharges->SetParName(1,"Directed flow");
\r
165 fAzimuthalAngleAllCharges->SetParName(2,"Elliptic flow");
\r
166 fAzimuthalAngleAllCharges->SetParName(3,"Triangular flow");
\r
167 fAzimuthalAngleAllCharges->SetParName(4,"Quandrangular flow");
\r
168 fAzimuthalAngleAllCharges->SetParName(5,"Pentangular flow");
\r
171 fAzimuthalAnglePions = new TF1("fAzimuthalAnglePions","1+2.*[1]*TMath::Cos(x-[0])+2.*[2]*TMath::Cos(2*(x-[0]))+2.*[3]*TMath::Cos(3*(x-[0]))+2.*[4]*TMath::Cos(4*(x-[0]))+2.*[5]*TMath::Cos(5*(x-[0]))",0.,2.*TMath::Pi());
\r
172 fAzimuthalAnglePions->SetParName(0,"Reaction Plane");
\r
173 fAzimuthalAnglePions->SetParName(1,"Directed flow");
\r
174 fAzimuthalAnglePions->SetParName(2,"Elliptic flow");
\r
175 fAzimuthalAnglePions->SetParName(3,"Triangular flow");
\r
176 fAzimuthalAnglePions->SetParName(4,"Quandrangular flow");
\r
177 fAzimuthalAnglePions->SetParName(5,"Pentangular flow");
\r
179 fAzimuthalAngleKaons = new TF1("fAzimuthalAngleKaons","1+2.*[1]*TMath::Cos(x-[0])+2.*[2]*TMath::Cos(2*(x-[0]))+2.*[3]*TMath::Cos(3*(x-[0]))+2.*[4]*TMath::Cos(4*(x-[0]))+2.*[5]*TMath::Cos(5*(x-[0]))",0.,2.*TMath::Pi());
\r
180 fAzimuthalAngleKaons->SetParName(0,"Reaction Plane");
\r
181 fAzimuthalAngleKaons->SetParName(1,"Directed flow");
\r
182 fAzimuthalAngleKaons->SetParName(2,"Elliptic flow");
\r
183 fAzimuthalAngleKaons->SetParName(3,"Triangular flow");
\r
184 fAzimuthalAngleKaons->SetParName(4,"Quandrangular flow");
\r
185 fAzimuthalAngleKaons->SetParName(5,"Pentangular flow");
\r
187 fAzimuthalAngleProtons = new TF1("fAzimuthalAngleProtons","1+2.*[1]*TMath::Cos(x-[0])+2.*[2]*TMath::Cos(2*(x-[0]))+2.*[3]*TMath::Cos(3*(x-[0]))+2.*[4]*TMath::Cos(4*(x-[0]))+2.*[5]*TMath::Cos(5*(x-[0]))",0.,2.*TMath::Pi());
\r
188 fAzimuthalAngleProtons->SetParName(0,"Reaction Plane");
\r
189 fAzimuthalAngleProtons->SetParName(1,"Directed flow");
\r
190 fAzimuthalAngleProtons->SetParName(2,"Elliptic flow");
\r
191 fAzimuthalAngleProtons->SetParName(3,"Triangular flow");
\r
192 fAzimuthalAngleProtons->SetParName(4,"Quandrangular flow");
\r
193 fAzimuthalAngleProtons->SetParName(5,"Pentangular flow");
\r
195 //==============Flow values==============//
\r
197 //===================Jets===================//
\r
199 fPtAssoc = new TF1("fPtAssoc","x*TMath::Exp(-TMath::Power([0]*[0]+x*x,0.5)/[1])",0.,20.);
\r
200 fPtAssoc->SetParName(0,"pt0");
\r
201 fPtAssoc->SetParName(1,"b");
\r
202 fPtAssoc->SetParameter(0,0.139);
\r
203 fPtAssoc->SetParameter(1,0.5);
\r
204 fPtAssoc->SetLineColor(1);
\r
207 //===================Jets===================//
\r
209 //==============Efficiency matrix==============//
\r
210 if(fSimulateDetectorEffects) SetupEfficiencyMatrix();
\r
211 //==============Efficiency matrix==============//
\r
214 //________________________________________________________________________
\r
215 void AliAnalysisTaskToyModel::SetupEfficiencyMatrix() {
\r
216 //Setup the efficiency matrix
\r
217 TH1F *hPt = new TH1F("hPt","",200,0.1,20.1);
\r
218 TH1F *hEta = new TH1F("hEta","",20,-0.95,0.95);
\r
219 TH1F *hPhi = new TH1F("hPhi","",72,0.,2.*TMath::Pi());
\r
220 fEfficiencyMatrix = new TH3F("fEfficiencyMatrix","",
\r
222 hEta->GetXaxis()->GetXmin(),
\r
223 hEta->GetXaxis()->GetXmax(),
\r
225 hPt->GetXaxis()->GetXmin(),
\r
226 hPt->GetXaxis()->GetXmax(),
\r
228 hPhi->GetXaxis()->GetXmin(),
\r
229 hPhi->GetXaxis()->GetXmax());
\r
232 Double_t epsilon[20] = {0.3,0.6,0.77,0.79,0.80,0.80,0.80,0.80,0.80,0.80,0.80,0.80,0.80,0.80,0.80,0.80,0.80,0.80,0.80,0.80};
\r
233 for(Int_t i=1;i<=20;i++) {
\r
234 hPt->SetBinContent(i,epsilon[i-1]);
\r
235 hPt->SetBinError(i,0.01);
\r
237 for(Int_t i=21;i<=200;i++) {
\r
238 hPt->SetBinContent(i,epsilon[19]);
\r
239 hPt->SetBinError(i,0.01);
\r
242 //Efficiency in eta
\r
243 for(Int_t i=1;i<=hEta->GetNbinsX();i++) {
\r
244 hEta->SetBinContent(i,1.0);
\r
245 hEta->SetBinError(i,0.01);
\r
247 if(fEfficiencyDropNearEtaEdges) {
\r
248 hEta->SetBinContent(1,0.7); hEta->SetBinContent(2,0.8);
\r
249 hEta->SetBinContent(3,0.9);
\r
250 hEta->SetBinContent(18,0.9); hEta->SetBinContent(19,0.8);
\r
251 hEta->SetBinContent(20,0.7);
\r
254 //Efficiency in phi
\r
255 for(Int_t i=1;i<=hPhi->GetNbinsX();i++) {
\r
256 hPhi->SetBinContent(i,1.0);
\r
257 hPhi->SetBinError(i,0.01);
\r
259 for(Int_t i=1;i<=fNumberOfInefficientSectors;i++)
\r
260 hPhi->SetBinContent(hPhi->FindBin(hPhi->GetRandom()),fInefficiencyFactorInPhi);
\r
261 for(Int_t i=1;i<=fNumberOfDeadSectors;i++)
\r
262 hPhi->SetBinContent(hPhi->FindBin(hPhi->GetRandom()),0.0);
\r
264 //Fill the 3D efficiency map
\r
265 for(Int_t iBinX = 1; iBinX<=fEfficiencyMatrix->GetXaxis()->GetNbins();iBinX++) {
\r
266 //cout<<"==================================="<<endl;
\r
267 for(Int_t iBinY = 1; iBinY<=fEfficiencyMatrix->GetYaxis()->GetNbins();iBinY++) {
\r
268 //cout<<"==================================="<<endl;
\r
269 for(Int_t iBinZ = 1; iBinZ<=fEfficiencyMatrix->GetZaxis()->GetNbins();iBinZ++) {
\r
270 fEfficiencyMatrix->SetBinContent(iBinX,iBinY,iBinZ,hEta->GetBinContent(iBinX)*hPt->GetBinContent(iBinY)*hPhi->GetBinContent(iBinZ));
\r
271 //cout<<"Eta: "<<hEta->GetBinCenter(iBinX)<<" - Pt: "<<hPt->GetBinCenter(iBinY)<<" - Phi: "<<hPhi->GetBinCenter(iBinZ)<<" - "<<hEta->GetBinContent(iBinX)<<" , "<<hPt->GetBinContent(iBinY)<<" , "<<hPhi->GetBinContent(iBinZ)<<" - Efficiency: "<<hEta->GetBinContent(iBinX)*hPt->GetBinContent(iBinY)*hPhi->GetBinContent(iBinZ)<<endl;
\r
277 //________________________________________________________________________
\r
278 void AliAnalysisTaskToyModel::CreateOutputObjects() {
\r
279 // Create histograms
\r
282 // global switch disabling the reference
\r
283 // (to avoid "Replacing existing TH1" if several wagons are created in train)
\r
284 Bool_t oldStatus = TH1::AddDirectoryStatus();
\r
285 TH1::AddDirectory(kFALSE);
\r
288 fBalance = new AliBalancePsi();
\r
289 fBalance->SetDeltaEtaMax(2.0);
\r
291 if(fRunShuffling) {
\r
292 if(!fShuffledBalance) {
\r
293 fShuffledBalance = new AliBalancePsi();
\r
294 fShuffledBalance->SetDeltaEtaMax(2.0);
\r
298 if(!fMixedBalance) {
\r
299 fMixedBalance = new AliBalancePsi();
\r
300 fMixedBalance->SetDeltaEtaMax(2.0);
\r
305 fList = new TList();
\r
306 fList->SetName("listQA");
\r
309 //Balance Function list
\r
310 fListBF = new TList();
\r
311 fListBF->SetName("listBF");
\r
312 fListBF->SetOwner();
\r
314 if(fRunShuffling) {
\r
315 fListBFS = new TList();
\r
316 fListBFS->SetName("listBFShuffled");
\r
317 fListBFS->SetOwner();
\r
321 fListBFM = new TList();
\r
322 fListBFM->SetName("listBFMixed");
\r
323 fListBFM->SetOwner();
\r
326 //==============QA================//
\r
328 TString gCutName[4] = {"Total","Offline trigger",
\r
329 "Vertex","Analyzed"};
\r
330 fHistEventStats = new TH1F("fHistEventStats",
\r
331 "Event statistics;;N_{events}",
\r
333 for(Int_t i = 1; i <= 4; i++)
\r
334 fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1].Data());
\r
335 fList->Add(fHistEventStats);
\r
337 fHistNumberOfAcceptedParticles = new TH1F("fHistNumberOfAcceptedParticles",";N_{acc.};Entries",10000,0,10000);
\r
338 fList->Add(fHistNumberOfAcceptedParticles);
\r
340 fHistReactionPlane = new TH1F("fHistReactionPlane","Reaction plane angle;#Psi [rad];Entries",1000,0.,2.*TMath::Pi());
\r
341 fList->Add(fHistReactionPlane);
\r
344 fHistEtaTotal = new TH1F("fHistEtaTotal","Pseudo-rapidity (full phase space);#eta;Entries",1000,-15.,15.);
\r
345 fList->Add(fHistEtaTotal);
\r
347 fHistEta = new TH1F("fHistEta","Pseudo-rapidity (acceptance);#eta;Entries",1000,-1.5,1.5);
\r
348 fList->Add(fHistEta);
\r
350 fHistEtaPhiPos = new TH2F("fHistEtaPhiPos","#eta-#phi distribution (+);#eta;#varphi (rad)",80,-2.,2.,72,-TMath::Pi()/2.,3.*TMath::Pi()/2.);
\r
351 fList->Add(fHistEtaPhiPos);
\r
352 fHistEtaPhiNeg = new TH2F("fHistEtaPhiNeg","#eta-#phi distribution (-);#eta;#varphi (rad)",80,-2.,2.,72,-TMath::Pi()/2.,3.*TMath::Pi()/2.);
\r
353 fList->Add(fHistEtaPhiNeg);
\r
356 fHistRapidity = new TH1F("fHistRapidity","Rapidity (acceptance);y;Entries",1000,-1.5,1.5);
\r
357 fList->Add(fHistRapidity);
\r
358 fHistRapidityPions = new TH1F("fHistRapidityPions","Rapidity (acceptance - pions);y;Entries",1000,-1.5,1.5);
\r
359 fList->Add(fHistRapidityPions);
\r
360 fHistRapidityKaons = new TH1F("fHistRapidityKaons","Rapidity (acceptance - kaons);y;Entries",1000,-1.5,1.5);
\r
361 fList->Add(fHistRapidityKaons);
\r
362 fHistRapidityProtons = new TH1F("fHistRapidityProtons","Rapidity (acceptance - protons);y;Entries",1000,-1.5,1.5);
\r
363 fList->Add(fHistRapidityProtons);
\r
366 fHistPhi = new TH1F("fHistPhi","Phi (acceptance);#phi (rad);Entries",1000,0.,2*TMath::Pi());
\r
367 fList->Add(fHistPhi);
\r
369 fHistPhiPions = new TH1F("fHistPhiPions","Phi (acceptance - pions);#phi (rad);Entries",1000,0.,2*TMath::Pi());
\r
370 fList->Add(fHistPhiPions);
\r
371 fHistPhiKaons = new TH1F("fHistPhiKaons","Phi (acceptance - kaons);#phi (rad);Entries",1000,0.,2*TMath::Pi());
\r
372 fList->Add(fHistPhiKaons);
\r
373 fHistPhiProtons = new TH1F("fHistPhiProtons","Phi (acceptance - protons);#phi (rad);Entries",1000,0.,2*TMath::Pi());
\r
374 fList->Add(fHistPhiProtons);
\r
377 fHistPt = new TH1F("fHistPt","Pt (acceptance);p_{t} (GeV/c);Entries",1000,0.,10.);
\r
378 fList->Add(fHistPt);
\r
380 fHistPtPions = new TH1F("fHistPtPions","Pt (acceptance - pions);p_{t} (GeV/c);Entries",1000,0.,10.);
\r
381 fList->Add(fHistPtPions);
\r
382 fHistPtKaons = new TH1F("fHistPtKaons","Pt (acceptance - kaons);p_{t} (GeV/c);Entries",1000,0.,10.);
\r
383 fList->Add(fHistPtKaons);
\r
384 fHistPtProtons = new TH1F("fHistPtProtons","Pt (acceptance - protons);p_{t} (GeV/c);Entries",1000,0.,10.);
\r
385 fList->Add(fHistPtProtons);
\r
387 if(fEfficiencyMatrix) fList->Add(fEfficiencyMatrix);
\r
389 //==============Balance function histograms================//
\r
390 // Initialize histograms if not done yet
\r
391 if(!fBalance->GetHistNp()){
\r
392 AliWarning("Histograms not yet initialized! --> Will be done now");
\r
393 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
\r
394 fBalance->InitHistograms();
\r
397 if(fRunShuffling) {
\r
398 if(!fShuffledBalance->GetHistNp()) {
\r
399 AliWarning("Histograms (shuffling) not yet initialized! --> Will be done now");
\r
400 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
\r
401 fShuffledBalance->InitHistograms();
\r
405 fListBF->Add(fBalance->GetHistNp());
\r
406 fListBF->Add(fBalance->GetHistNn());
\r
407 fListBF->Add(fBalance->GetHistNpn());
\r
408 fListBF->Add(fBalance->GetHistNnn());
\r
409 fListBF->Add(fBalance->GetHistNpp());
\r
410 fListBF->Add(fBalance->GetHistNnp());
\r
412 if(fRunShuffling) {
\r
413 fListBFS->Add(fShuffledBalance->GetHistNp());
\r
414 fListBFS->Add(fShuffledBalance->GetHistNn());
\r
415 fListBFS->Add(fShuffledBalance->GetHistNpn());
\r
416 fListBFS->Add(fShuffledBalance->GetHistNnn());
\r
417 fListBFS->Add(fShuffledBalance->GetHistNpp());
\r
418 fListBFS->Add(fShuffledBalance->GetHistNnp());
\r
422 fListBFM->Add(fMixedBalance->GetHistNp());
\r
423 fListBFM->Add(fMixedBalance->GetHistNn());
\r
424 fListBFM->Add(fMixedBalance->GetHistNpn());
\r
425 fListBFM->Add(fMixedBalance->GetHistNnn());
\r
426 fListBFM->Add(fMixedBalance->GetHistNpp());
\r
427 fListBFM->Add(fMixedBalance->GetHistNnp());
\r
432 Int_t fMixingTracks = 2000;
\r
433 Int_t trackDepth = fMixingTracks;
\r
434 Int_t poolsize = 1000; // Maximum number of events, ignored in the present implemented of AliEventPoolManager
\r
437 // Double_t centralityBins[] = {0.,1.,2.,3.,4.,5.,7.,10.,20.,30.,40.,50.,60.,70.,80.,100.}; // SHOULD BE DEDUCED FROM CREATED ALITHN!!!
\r
438 // Double_t* centbins = centralityBins;
\r
439 // Int_t nCentralityBins = sizeof(centralityBins) / sizeof(Double_t) - 1;
\r
441 // multiplicity bins
\r
442 Double_t multiplicityBins[] = {0,10,20,30,40,50,60,70,80,100,100000}; // SHOULD BE DEDUCED FROM CREATED ALITHN!!!
\r
443 Double_t* multbins = multiplicityBins;
\r
444 Int_t nMultiplicityBins = sizeof(multiplicityBins) / sizeof(Double_t) - 1;
\r
447 Double_t vertexBins[] = {-10., -7., -5., -3., -1., 1., 3., 5., 7., 10.}; // SHOULD BE DEDUCED FROM CREATED ALITHN!!!
\r
448 Double_t* vtxbins = vertexBins;
\r
449 Int_t nVertexBins = sizeof(vertexBins) / sizeof(Double_t) - 1;
\r
451 // Event plane angle (Psi) bins
\r
452 // Double_t psiBins[] = {0.,45.,135.,215.,305.,360.}; // SHOULD BE DEDUCED FROM CREATED ALITHN!!!
\r
453 // Double_t* psibins = psiBins;
\r
454 // Int_t nPsiBins = sizeof(psiBins) / sizeof(Double_t) - 1;
\r
456 // // run the event mixing also in bins of event plane (statistics!)
\r
457 // if(fRunMixingEventPlane){
\r
458 // if(fEventClass=="Multiplicity"){
\r
459 // fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nMultiplicityBins, multbins, nVertexBins, vtxbins, nPsiBins, psibins);
\r
462 // fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, centbins, nVertexBins, vtxbins, nPsiBins, psibins);
\r
466 //if(fEventClass=="Multiplicity"){
\r
467 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nMultiplicityBins, multbins, nVertexBins, vtxbins);
\r
470 //fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, centbins, nVertexBins, vtxbins);
\r
474 TH1::AddDirectory(oldStatus);
\r
477 //________________________________________________________________________
\r
478 void AliAnalysisTaskToyModel::Run(Int_t nEvents) {
\r
480 // Called for each event
\r
481 Short_t vCharge = 0;
\r
483 Float_t vEta = 0.0;
\r
484 Float_t vPhi = 0.0;
\r
485 Float_t vP[3] = {0.,0.,0.};
\r
488 Bool_t isPion = kFALSE, isKaon = kFALSE, isProton = kFALSE;
\r
490 Double_t gDecideCharge = 0.;
\r
492 if(fUseAllCharges) {
\r
493 //fPtSpectraAllCharges->SetParameter(0,fParticleMass);
\r
494 fPtSpectraAllCharges->SetParameter(0,1.05);
\r
495 fPtSpectraAllCharges->SetParameter(1,fTemperatureAllCharges);
\r
497 fAzimuthalAngleAllCharges->SetParameter(1,fDirectedFlowAllCharges);
\r
498 fAzimuthalAngleAllCharges->SetParameter(2,fEllipticFlowAllCharges);
\r
499 fAzimuthalAngleAllCharges->SetParameter(3,fTriangularFlowAllCharges);
\r
500 fAzimuthalAngleAllCharges->SetParameter(4,fQuandrangularFlowAllCharges);
\r
501 fAzimuthalAngleAllCharges->SetParameter(5,fPentangularFlowAllCharges);
\r
504 fPtSpectraPions->SetParameter(0,fPionMass);
\r
505 fPtSpectraPions->SetParameter(1,fTemperaturePions);
\r
506 fPtSpectraKaons->SetParameter(0,fKaonMass);
\r
507 fPtSpectraKaons->SetParameter(1,fTemperatureKaons);
\r
508 fPtSpectraProtons->SetParameter(0,fProtonMass);
\r
509 fPtSpectraProtons->SetParameter(1,fTemperatureProtons);
\r
511 fAzimuthalAnglePions->SetParameter(1,fDirectedFlowPions);
\r
512 fAzimuthalAnglePions->SetParameter(2,fEllipticFlowPions);
\r
513 fAzimuthalAnglePions->SetParameter(3,fTriangularFlowPions);
\r
514 fAzimuthalAnglePions->SetParameter(4,fQuandrangularFlowPions);
\r
515 fAzimuthalAnglePions->SetParameter(5,fPentangularFlowPions);
\r
517 fAzimuthalAngleKaons->SetParameter(1,fDirectedFlowKaons);
\r
518 fAzimuthalAngleKaons->SetParameter(2,fEllipticFlowKaons);
\r
519 fAzimuthalAngleKaons->SetParameter(3,fTriangularFlowKaons);
\r
520 fAzimuthalAngleKaons->SetParameter(4,fQuandrangularFlowKaons);
\r
521 fAzimuthalAngleKaons->SetParameter(5,fPentangularFlowKaons);
\r
523 fAzimuthalAngleProtons->SetParameter(1,fDirectedFlowProtons);
\r
524 fAzimuthalAngleProtons->SetParameter(2,fEllipticFlowProtons);
\r
525 fAzimuthalAngleProtons->SetParameter(3,fTriangularFlowProtons);
\r
526 fAzimuthalAngleProtons->SetParameter(4,fQuandrangularFlowProtons);
\r
527 fAzimuthalAngleProtons->SetParameter(5,fPentangularFlowProtons);
\r
531 for(Int_t iEvent = 0; iEvent < nEvents; iEvent++) {
\r
532 // vector holding the charges/kinematics of all tracks (charge,y,eta,phi,p0,p1,p2,pt,E)
\r
533 //vector<Double_t> *chargeVectorShuffle[9]; // this will be shuffled
\r
534 //vector<Double_t> *chargeVector[9]; // original charge
\r
535 //for(Int_t i = 0; i < 9; i++){
\r
536 //chargeVectorShuffle[i] = new vector<Double_t>;
\r
537 //chargeVector[i] = new vector<Double_t>;
\r
540 // TObjArray for the accepted particles
\r
541 // (has to be done here, otherwise mxing with event pool does not work, overwriting pointers!)
\r
542 TObjArray *tracksMain = new TObjArray();
\r
543 tracksMain->SetOwner(kTRUE);
\r
544 TObjArray *tracksMixing = 0x0;
\r
546 tracksMixing = new TObjArray();
\r
547 tracksMixing->SetOwner(kTRUE);
\r
550 tracksMain->Clear();
\r
551 if(fRunMixing) tracksMixing->Clear();
\r
553 fHistEventStats->Fill(1);
\r
554 fHistEventStats->Fill(2);
\r
555 fHistEventStats->Fill(3);
\r
557 if((iEvent%1000) == 0)
\r
558 cout<<"Event: "<<iEvent<<"/"<<nEvents<<endl;
\r
561 Int_t nMultiplicity = (Int_t)(gRandom->Gaus(fTotalMultiplicityMean,fTotalMultiplicitySigma));
\r
562 Int_t nNetCharge = (Int_t)(gRandom->Gaus(fNetChargeMean,fNetChargeSigma));
\r
564 Int_t nGeneratedPositive = (Int_t)((nMultiplicity/2) + nNetCharge);
\r
565 Int_t nGeneratedNegative = nMultiplicity - nGeneratedPositive;
\r
567 Printf("Total multiplicity: %d - Generated positive: %d - Generated negative: %d",nMultiplicity,nGeneratedPositive,nGeneratedNegative);
\r
569 //Randomization of the reaction plane
\r
570 fReactionPlane = 2.0*TMath::Pi()*gRandom->Rndm();
\r
571 //fReactionPlane = 0.0;
\r
572 if(fUseAllCharges)
\r
573 fAzimuthalAngleAllCharges->SetParameter(0,fReactionPlane);
\r
575 fAzimuthalAnglePions->SetParameter(0,fReactionPlane);
\r
576 fAzimuthalAngleKaons->SetParameter(0,fReactionPlane);
\r
577 fAzimuthalAngleProtons->SetParameter(0,fReactionPlane);
\r
580 Int_t gNumberOfAcceptedParticles = 0;
\r
581 Int_t gNumberOfAcceptedPositiveParticles = 0;
\r
582 Int_t gNumberOfAcceptedNegativeParticles = 0;
\r
583 Int_t nGeneratedPions = 0, nGeneratedKaons = 0, nGeneratedProtons = 0;
\r
585 //Generate particles
\r
586 for(Int_t iParticleCount = 0; iParticleCount < nMultiplicity; iParticleCount++) {
\r
587 isPion = kFALSE; isKaon = kFALSE; isProton = kFALSE;
\r
589 Printf("Generating positive: %d(%d)",iParticleCount+1,nGeneratedPositive);
\r
591 //Pseudo-rapidity sampled from a Gaussian centered @ 0
\r
592 vEta = gRandom->Gaus(0.0,4.0);
\r
594 //Fill QA histograms (full phase space)
\r
595 fHistEtaTotal->Fill(vEta);
\r
597 //Decide the charge
\r
598 gDecideCharge = gRandom->Rndm();
\r
599 if(gDecideCharge <= 1.*nGeneratedPositive/nMultiplicity)
\r
605 if((vEta < fEtaMin) || (vEta > fEtaMax)) continue;
\r
607 if(!fUseAllCharges) {
\r
608 //Decide the specie
\r
609 Double_t randomNumberSpecies = gRandom->Rndm();
\r
610 if((randomNumberSpecies >= 0.0)&&(randomNumberSpecies < fPionPercentage)) {
\r
611 nGeneratedPions += 1;
\r
612 vPt = fPtSpectraPions->GetRandom();
\r
613 vPhi = fAzimuthalAnglePions->GetRandom();
\r
614 fParticleMass = fPionMass;
\r
617 else if((randomNumberSpecies >= fPionPercentage)&&(randomNumberSpecies < fPionPercentage + fKaonPercentage)) {
\r
618 nGeneratedKaons += 1;
\r
619 vPt = fPtSpectraKaons->GetRandom();
\r
620 vPhi = fAzimuthalAngleKaons->GetRandom();
\r
621 fParticleMass = fKaonMass;
\r
624 else if((randomNumberSpecies >= fPionPercentage + fKaonPercentage)&&(randomNumberSpecies < fPionPercentage + fKaonPercentage + fProtonPercentage)) {
\r
625 nGeneratedProtons += 1;
\r
626 vPt = fPtSpectraProtons->GetRandom();
\r
627 vPhi = fAzimuthalAngleProtons->GetRandom();
\r
628 fParticleMass = fProtonMass;
\r
633 vPt = fPtSpectraAllCharges->GetRandom();
\r
634 vPhi = fAzimuthalAngleAllCharges->GetRandom();
\r
637 vP[0] = vPt*TMath::Cos(vPhi);
\r
638 vP[1] = vPt*TMath::Sin(vPhi);
\r
639 vP[2] = vPt*TMath::SinH(vEta);
\r
640 vE = TMath::Sqrt(TMath::Power(fParticleMass,2) +
\r
641 TMath::Power(vP[0],2) +
\r
642 TMath::Power(vP[1],2) +
\r
643 TMath::Power(vP[2],2));
\r
645 vY = 0.5*TMath::Log((vE + vP[2])/(vE - vP[2]));
\r
648 if((vPt < fPtMin) || (vPt > fPtMax)) continue;
\r
649 //Printf("pt: %lf - mins: %lf - max: %lf",vPt,fPtMin,fPtMax);
\r
651 //acceptance filter
\r
652 if(fUseAcceptanceParameterization) {
\r
653 Double_t gRandomNumberForAcceptance = gRandom->Rndm();
\r
654 if(gRandomNumberForAcceptance > fAcceptanceParameterization->Eval(vPt))
\r
659 if(fSimulateDetectorEffects) {
\r
660 Double_t randomNumber = gRandom->Rndm();
\r
661 if(randomNumber > fEfficiencyMatrix->GetBinContent(fEfficiencyMatrix->FindBin(vEta,vPt,vPhi)))
\r
665 //Fill QA histograms (acceptance);
\r
667 gNumberOfAcceptedPositiveParticles += 1;
\r
668 if(vPhi > 3.*TMath::Pi()/2.)
\r
669 fHistEtaPhiPos->Fill(vEta,vPhi-2.*TMath::Pi());
\r
671 fHistEtaPhiPos->Fill(vEta,vPhi);
\r
674 gNumberOfAcceptedNegativeParticles += 1;
\r
675 if(vPhi > 3.*TMath::Pi()/2.)
\r
676 fHistEtaPhiNeg->Fill(vEta,vPhi-2.*TMath::Pi());
\r
678 fHistEtaPhiNeg->Fill(vEta,vPhi);
\r
681 fHistEta->Fill(vEta);
\r
682 fHistRapidity->Fill(vY);
\r
683 fHistPhi->Fill(vPhi);
\r
684 fHistPt->Fill(vPt);
\r
686 fHistRapidityPions->Fill(vY);
\r
687 fHistPhiPions->Fill(vPhi);
\r
688 fHistPtPions->Fill(vPt);
\r
691 fHistRapidityKaons->Fill(vY);
\r
692 fHistPhiKaons->Fill(vPhi);
\r
693 fHistPtKaons->Fill(vPt);
\r
695 else if(isProton) {
\r
696 fHistRapidityProtons->Fill(vY);
\r
697 fHistPhiProtons->Fill(vPhi);
\r
698 fHistPtProtons->Fill(vPt);
\r
700 gNumberOfAcceptedParticles += 1;
\r
702 // add the track to the TObjArray
\r
703 tracksMain->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, 1.0));
\r
705 tracksMixing->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, 1.0));
\r
706 }//generated positive particle loop
\r
710 const Int_t nAssociated = 3;
\r
712 Double_t gPtTrig1 = 0., gPtTrig2 = 0., gPtAssoc = 0.;
\r
713 Double_t gPhiTrig1 = 0., gPhiTrig2 = 0., gPhiAssoc = 0.;
\r
714 Double_t gEtaTrig1 = 0., gEtaTrig2 = 0., gEtaAssoc = 0.;
\r
715 Short_t gChargeTrig1 = 0, gChargeTrig2 = 0, gChargeAssoc = 0;
\r
717 Double_t gJetCone = 0.2;
\r
719 //First leading particle
\r
720 gPtTrig1 = gRandom->Uniform(3.,5.);
\r
721 gEtaTrig1 = gRandom->Uniform(-0.8,0.8);
\r
722 gPhiTrig1 = gRandom->Uniform(0.,TMath::TwoPi());
\r
724 //Decide the charge
\r
725 gDecideCharge = gRandom->Rndm();
\r
726 if(gDecideCharge <= 0.5)
\r
732 if((gEtaTrig1 < fEtaMin) || (gEtaTrig1 > fEtaMax)) continue;
\r
734 if((gPtTrig1 < fPtMin) || (gPtTrig1 > fPtMax)) continue;
\r
735 //Printf("pt: %lf - mins: %lf - max: %lf",vPt,fPtMin,fPtMax);
\r
737 //acceptance filter
\r
738 if(fUseAcceptanceParameterization) {
\r
739 Double_t gRandomNumberForAcceptance = gRandom->Rndm();
\r
740 if(gRandomNumberForAcceptance > fAcceptanceParameterization->Eval(gPtTrig1))
\r
745 if(fSimulateDetectorEffects) {
\r
746 Double_t randomNumber = gRandom->Rndm();
\r
747 if(randomNumber > fEfficiencyMatrix->GetBinContent(fEfficiencyMatrix->FindBin(gEtaTrig1,gPtTrig1,gPhiTrig1)))
\r
751 gNumberOfAcceptedParticles += 1;
\r
753 // add the track to the TObjArray
\r
754 tracksMain->Add(new AliBFBasicParticle(gEtaTrig1, gPhiTrig1, gPtTrig1, gChargeTrig1, 1.0));
\r
756 tracksMixing->Add(new AliBFBasicParticle(gEtaTrig1, gPhiTrig1, gPtTrig1, gChargeTrig1, 1.0));
\r
758 Int_t iAssociated = 0;
\r
759 while(iAssociated < nAssociated) {
\r
760 gPtAssoc = fPtAssoc->GetRandom();
\r
761 if(gPtAssoc < gPtTrig1) {
\r
762 gEtaAssoc = gRandom->Uniform(gEtaTrig1 - gJetCone/2.,gEtaTrig1 + gJetCone/2.);
\r
763 gPhiAssoc = gRandom->Uniform(gPhiTrig1 - gJetCone/2.,gPhiTrig1 + gJetCone/2.);
\r
764 if(gPhiAssoc < 0.) gPhiAssoc += TMath::TwoPi();
\r
765 else if(gPhiAssoc > TMath::TwoPi()) gPhiAssoc -= TMath::TwoPi();
\r
769 gDecideCharge = gRandom->Rndm();
\r
770 if(gDecideCharge <= 0.5)
\r
776 if((gEtaAssoc < fEtaMin) || (gEtaAssoc > fEtaMax)) continue;
\r
778 if((gPtAssoc < fPtMin) || (gPtAssoc > fPtMax)) continue;
\r
779 //Printf("pt: %lf - mins: %lf - max: %lf",vPt,fPtMin,fPtMax);
\r
781 //acceptance filter
\r
782 if(fUseAcceptanceParameterization) {
\r
783 Double_t gRandomNumberForAcceptance = gRandom->Rndm();
\r
784 if(gRandomNumberForAcceptance > fAcceptanceParameterization->Eval(gPtAssoc))
\r
789 if(fSimulateDetectorEffects) {
\r
790 Double_t randomNumber = gRandom->Rndm();
\r
791 if(randomNumber > fEfficiencyMatrix->GetBinContent(fEfficiencyMatrix->FindBin(gEtaAssoc,gPtAssoc,gPhiAssoc)))
\r
795 gNumberOfAcceptedParticles += 1;
\r
797 // add the track to the TObjArray
\r
798 tracksMain->Add(new AliBFBasicParticle(gEtaAssoc, gPhiAssoc, gPtAssoc, gChargeAssoc, 1.0));
\r
800 tracksMixing->Add(new AliBFBasicParticle(gEtaAssoc, gPhiAssoc, gPtAssoc, gChargeAssoc, 1.0));
\r
801 }//pt,assoc < pt,trig
\r
805 gPtTrig2 = gPtTrig1;
\r
806 gEtaTrig2 = -gEtaTrig1;
\r
807 gPhiTrig2 = TMath::Pi() + gPhiTrig1;
\r
808 if(gPhiTrig2 < 0.) gPhiTrig2 += TMath::TwoPi();
\r
809 else if(gPhiTrig2 > TMath::TwoPi()) gPhiTrig2 -= TMath::TwoPi();
\r
811 //Decide the charge
\r
812 gDecideCharge = gRandom->Rndm();
\r
813 if(gDecideCharge <= 0.5)
\r
819 if((gEtaTrig2 < fEtaMin) || (gEtaTrig2 > fEtaMax)) continue;
\r
821 if((gPtTrig2 < fPtMin) || (gPtTrig2 > fPtMax)) continue;
\r
822 //Printf("pt: %lf - mins: %lf - max: %lf",vPt,fPtMin,fPtMax);
\r
824 //acceptance filter
\r
825 if(fUseAcceptanceParameterization) {
\r
826 Double_t gRandomNumberForAcceptance = gRandom->Rndm();
\r
827 if(gRandomNumberForAcceptance > fAcceptanceParameterization->Eval(gPtTrig2))
\r
832 if(fSimulateDetectorEffects) {
\r
833 Double_t randomNumber = gRandom->Rndm();
\r
834 if(randomNumber > fEfficiencyMatrix->GetBinContent(fEfficiencyMatrix->FindBin(gEtaTrig2,gPtTrig2,gPhiTrig2)))
\r
838 gNumberOfAcceptedParticles += 1;
\r
840 // add the track to the TObjArray
\r
841 tracksMain->Add(new AliBFBasicParticle(gEtaTrig2, gPhiTrig2, gPtTrig2, gChargeTrig2, 1.0));
\r
843 tracksMixing->Add(new AliBFBasicParticle(gEtaTrig2, gPhiTrig2, gPtTrig2, gChargeTrig2, 1.0));
\r
846 while(iAssociated < nAssociated) {
\r
847 gPtAssoc = fPtAssoc->GetRandom();
\r
848 if(gPtAssoc < gPtTrig2) {
\r
849 gEtaAssoc = gRandom->Uniform(gEtaTrig2 - gJetCone/2.,gEtaTrig2 + gJetCone/2.);
\r
850 gPhiAssoc = gRandom->Uniform(gPhiTrig2 - gJetCone/2.,gPhiTrig2 + gJetCone/2.);
\r
851 if(gPhiAssoc < 0.) gPhiAssoc += TMath::TwoPi();
\r
852 else if(gPhiAssoc > TMath::TwoPi()) gPhiAssoc -= TMath::TwoPi();
\r
856 gDecideCharge = gRandom->Rndm();
\r
857 if(gDecideCharge <= 0.5)
\r
863 if((gEtaAssoc < fEtaMin) || (gEtaAssoc > fEtaMax)) continue;
\r
865 if((gPtAssoc < fPtMin) || (gPtAssoc > fPtMax)) continue;
\r
866 //Printf("pt: %lf - mins: %lf - max: %lf",vPt,fPtMin,fPtMax);
\r
868 //acceptance filter
\r
869 if(fUseAcceptanceParameterization) {
\r
870 Double_t gRandomNumberForAcceptance = gRandom->Rndm();
\r
871 if(gRandomNumberForAcceptance > fAcceptanceParameterization->Eval(gPtAssoc))
\r
876 if(fSimulateDetectorEffects) {
\r
877 Double_t randomNumber = gRandom->Rndm();
\r
878 if(randomNumber > fEfficiencyMatrix->GetBinContent(fEfficiencyMatrix->FindBin(gEtaAssoc,gPtAssoc,gPhiAssoc)))
\r
882 gNumberOfAcceptedParticles += 1;
\r
884 // add the track to the TObjArray
\r
885 tracksMain->Add(new AliBFBasicParticle(gEtaAssoc, gPhiAssoc, gPtAssoc, gChargeAssoc, 1.0));
\r
887 tracksMixing->Add(new AliBFBasicParticle(gEtaAssoc, gPhiAssoc, gPtAssoc, gChargeAssoc, 1.0));
\r
888 }//pt,assoc < pt,trig
\r
900 //Dynamical correlations
\r
901 Int_t nGeneratedPositiveDynamicalCorrelations = 0;
\r
902 Int_t nGeneratedNegativeDynamicalCorrelations = 0;
\r
903 /*Double_t vChargePrime = 0;
\r
904 Double_t vYPrime = 0.0;
\r
905 Double_t vEtaPrime = 0.0;
\r
906 Double_t vPhiPrime = 0.0;
\r
907 Double_t vPPrime[3] = {0.,0.,0.};
\r
908 Double_t vPtPrime = 0.0;
\r
909 Double_t vEPrime = 0.0;
\r
910 //Generate "correlated" particles
\r
911 if(fUseDynamicalCorrelations) {
\r
912 Int_t gNumberOfDynamicalCorrelations = (Int_t)(0.5*gNumberOfAcceptedParticles*fDynamicalCorrelationsPercentage);
\r
913 for(Int_t iDynamicalCorrelations = 0; iDynamicalCorrelations < gNumberOfDynamicalCorrelations; iDynamicalCorrelations++) {
\r
914 isPion = kFALSE; isKaon = kFALSE; isProton = kFALSE;
\r
916 //Pseudo-rapidity sampled from a Gaussian centered @ 0
\r
917 vEta = gRandom->Gaus(0.0,0.1);
\r
919 nGeneratedPositiveDynamicalCorrelations += 1;
\r
922 vChargePrime = -1.0;
\r
923 nGeneratedNegativeDynamicalCorrelations += 1;
\r
926 if((vEta < fEtaMin) || (vEta > fEtaMax)) continue;
\r
927 if((vEtaPrime < fEtaMin) || (vEtaPrime > fEtaMax)) continue;
\r
929 if(!fUseAllCharges) {
\r
930 //Decide the specie
\r
931 Double_t randomNumberSpecies = gRandom->Rndm();
\r
932 if((randomNumberSpecies >= 0.0)&&(randomNumberSpecies < fPionPercentage)) {
\r
933 nGeneratedPions += 1;
\r
934 vPt = fPtSpectraPions->GetRandom();
\r
935 vPhi = fAzimuthalAnglePions->GetRandom();
\r
936 fParticleMass = fPionMass;
\r
939 else if((randomNumberSpecies >= fPionPercentage)&&(randomNumberSpecies < fPionPercentage + fKaonPercentage)) {
\r
940 nGeneratedKaons += 1;
\r
941 vPt = fPtSpectraKaons->GetRandom();
\r
942 vPhi = fAzimuthalAngleKaons->GetRandom();
\r
943 fParticleMass = fKaonMass;
\r
946 else if((randomNumberSpecies >= fPionPercentage + fKaonPercentage)&&(randomNumberSpecies < fPionPercentage + fKaonPercentage + fProtonPercentage)) {
\r
947 nGeneratedProtons += 1;
\r
948 vPt = fPtSpectraProtons->GetRandom();
\r
950 vPhi = fAzimuthalAngleProtons->GetRandom();
\r
951 fParticleMass = fProtonMass;
\r
956 vPt = fPtSpectraAllCharges->GetRandom();
\r
957 vPhi = fAzimuthalAngleAllCharges->GetRandom();
\r
962 vP[0] = vPt*TMath::Cos(vPhi);
\r
963 vP[1] = vPt*TMath::Sin(vPhi);
\r
964 vP[2] = vPt*TMath::SinH(vEta);
\r
965 vE = TMath::Sqrt(TMath::Power(fParticleMass,2) +
\r
966 TMath::Power(vP[0],2) +
\r
967 TMath::Power(vP[1],2) +
\r
968 TMath::Power(vP[2],2));
\r
970 vY = 0.5*TMath::Log((vE + vP[2])/(vE - vP[2]));
\r
972 vPPrime[0] = vPtPrime*TMath::Cos(vPhiPrime);
\r
973 vPPrime[1] = vPtPrime*TMath::Sin(vPhiPrime);
\r
974 vPPrime[2] = vPtPrime*TMath::SinH(vEtaPrime);
\r
975 vEPrime = TMath::Sqrt(TMath::Power(fParticleMass,2) +
\r
976 TMath::Power(vPPrime[0],2) +
\r
977 TMath::Power(vPPrime[1],2) +
\r
978 TMath::Power(vPPrime[2],2));
\r
980 vYPrime = 0.5*TMath::Log((vEPrime + vPPrime[2])/(vEPrime - vPPrime[2]));
\r
983 if((vPt < fPtMin) || (vPt > fPtMax)) continue;
\r
984 if((vPtPrime < fPtMin) || (vPtPrime > fPtMax)) continue;
\r
986 //acceptance filter
\r
987 if(fUseAcceptanceParameterization) {
\r
988 Double_t gRandomNumberForAcceptance = gRandom->Rndm();
\r
989 if(gRandomNumberForAcceptance > fAcceptanceParameterization->Eval(vPt))
\r
992 Double_t gRandomNumberForAcceptancePrime = gRandom->Rndm();
\r
993 if(gRandomNumberForAcceptancePrime > fAcceptanceParameterization->Eval(vPtPrime))
\r
997 // fill charge vector (positive)
\r
998 chargeVector[0]->push_back(vCharge);
\r
999 chargeVector[1]->push_back(vY);
\r
1000 chargeVector[2]->push_back(vEta);
\r
1001 chargeVector[3]->push_back(vPhi);
\r
1002 chargeVector[4]->push_back(vP[0]);
\r
1003 chargeVector[5]->push_back(vP[1]);
\r
1004 chargeVector[6]->push_back(vP[2]);
\r
1005 chargeVector[7]->push_back(vPt);
\r
1006 chargeVector[8]->push_back(vE);
\r
1008 if(fRunShuffling) {
\r
1009 chargeVectorShuffle[0]->push_back(vCharge);
\r
1010 chargeVectorShuffle[1]->push_back(vY);
\r
1011 chargeVectorShuffle[2]->push_back(vEta);
\r
1012 chargeVectorShuffle[3]->push_back(vPhi);
\r
1013 chargeVectorShuffle[4]->push_back(vP[0]);
\r
1014 chargeVectorShuffle[5]->push_back(vP[1]);
\r
1015 chargeVectorShuffle[6]->push_back(vP[2]);
\r
1016 chargeVectorShuffle[7]->push_back(vPt);
\r
1017 chargeVectorShuffle[8]->push_back(vE);
\r
1020 // fill charge vector (negative)
\r
1021 chargeVector[0]->push_back(vChargePrime);
\r
1022 chargeVector[1]->push_back(vYPrime);
\r
1023 chargeVector[2]->push_back(vEtaPrime);
\r
1024 chargeVector[3]->push_back(vPhiPrime);
\r
1025 chargeVector[4]->push_back(vPPrime[0]);
\r
1026 chargeVector[5]->push_back(vPPrime[1]);
\r
1027 chargeVector[6]->push_back(vPPrime[2]);
\r
1028 chargeVector[7]->push_back(vPtPrime);
\r
1029 chargeVector[8]->push_back(vEPrime);
\r
1031 if(fRunShuffling) {
\r
1032 chargeVectorShuffle[0]->push_back(vChargePrime);
\r
1033 chargeVectorShuffle[1]->push_back(vYPrime);
\r
1034 chargeVectorShuffle[2]->push_back(vEtaPrime);
\r
1035 chargeVectorShuffle[3]->push_back(vPhiPrime);
\r
1036 chargeVectorShuffle[4]->push_back(vPPrime[0]);
\r
1037 chargeVectorShuffle[5]->push_back(vPPrime[1]);
\r
1038 chargeVectorShuffle[6]->push_back(vPPrime[2]);
\r
1039 chargeVectorShuffle[7]->push_back(vPtPrime);
\r
1040 chargeVectorShuffle[8]->push_back(vEPrime);
\r
1043 gNumberOfAcceptedParticles += 2;
\r
1044 }//loop over the dynamical correlations
\r
1045 }*/// usage of dynamical correlations
\r
1048 Printf("=======================================================");
\r
1049 Printf("Total: %d - Total positive: %d - Total negative: %d",nMultiplicity,nGeneratedPositive,nGeneratedNegative);
\r
1050 Printf("Accepted positive: %d - Accepted negative: %d",gNumberOfAcceptedPositiveParticles,gNumberOfAcceptedNegativeParticles);
\r
1051 Printf("Correlations: %d - Correlations positive: %d - Correlations negative: %d",nGeneratedPositiveDynamicalCorrelations+nGeneratedNegativeDynamicalCorrelations,nGeneratedPositiveDynamicalCorrelations,nGeneratedNegativeDynamicalCorrelations);
\r
1052 Printf("Number of accepted particles: %d",gNumberOfAcceptedParticles);
\r
1053 if(!fUseAllCharges)
\r
1054 Printf("Pions: %lf - Kaons: %lf - Protons: %lf",1.*nGeneratedPions/nMultiplicity,1.*nGeneratedKaons/nMultiplicity,1.*nGeneratedProtons/nMultiplicity);
\r
1055 //Printf("Calculating the balance function for %d particles",chargeVector[0]->size());
\r
1058 fHistEventStats->Fill(4);
\r
1059 fHistNumberOfAcceptedParticles->Fill(gNumberOfAcceptedParticles);
\r
1060 fHistReactionPlane->Fill(fReactionPlane);
\r
1065 // 1. First get an event pool corresponding in mult (cent) and
\r
1066 // zvertex to the current event. Once initialized, the pool
\r
1067 // should contain nMix (reduced) events. This routine does not
\r
1068 // pre-scan the chain. The first several events of every chain
\r
1069 // will be skipped until the needed pools are filled to the
\r
1070 // specified depth. If the pool categories are not too rare, this
\r
1071 // should not be a problem. If they are rare, you could lose`
\r
1074 // 2. Collect the whole pool's content of tracks into one TObjArray
\r
1075 // (bgTracks), which is effectively a single background super-event.
\r
1077 // 3. The reduced and bgTracks arrays must both be passed into
\r
1078 // FillCorrelations(). Also nMix should be passed in, so a weight
\r
1079 // of 1./nMix can be applied.
\r
1081 AliEventPool* pool = fPoolMgr->GetEventPool(1., 0.,fReactionPlane);
\r
1084 AliFatal(Form("No pool found for centrality = %f, zVtx = %f, psi = %f", 1., 0.,fReactionPlane));
\r
1088 //pool->SetDebug(1);
\r
1090 if (pool->IsReady() || pool->NTracksInPool() > 50000 / 10 || pool->GetCurrentNEvents() >= 5){
\r
1093 Int_t nMix = pool->GetCurrentNEvents();
\r
1094 //cout << "nMix = " << nMix << " tracks in pool = " << pool->NTracksInPool() << ", tracks in this event = "<<gNumberOfAcceptedParticles <<", event Plane = "<<fReactionPlane<<endl;
\r
1096 //((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(2);
\r
1097 //((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool->NTracksInPool());
\r
1098 //if (pool->IsReady())
\r
1099 //((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(3);
\r
1101 // Fill mixed-event histos here
\r
1102 for (Int_t jMix=0; jMix<nMix; jMix++)
\r
1104 TObjArray* tracksMixed = pool->GetEvent(jMix);
\r
1105 fMixedBalance->CalculateBalance(fReactionPlane,tracksMain,tracksMixed,1,1.,0.);
\r
1109 // Update the Event pool
\r
1110 pool->UpdatePool(tracksMain);
\r
1111 //pool->PrintInfo();
\r
1113 }//pool NULL check
\r
1116 //Calculate the balance function
\r
1117 fBalance->CalculateBalance(fReactionPlane,tracksMain,NULL,1,1.,0.);
\r
1119 // fMixedBalance->CalculateBalance(fReactionPlane,tracksMixing,NULL,1,1.,0.);
\r
1124 //________________________________________________________________________
\r
1125 void AliAnalysisTaskToyModel::FinishOutput() {
\r
1126 //Printf("END BF");
\r
1128 TFile *gOutput = TFile::Open("outputToyModel.root","recreate");
\r
1129 TDirectoryFile *dir = new TDirectoryFile("PWGCFEbyE.outputBalanceFunctionPsiAnalysis","PWGCFEbyE.outputBalanceFunctionPsiAnalysis");
\r
1131 fList->SetName("listQA");
\r
1132 fList->SetOwner(kTRUE);
\r
1134 //fList->Write("listQA",TObject::kSingleKey);
\r
1137 AliError("ERROR: fBalance not available");
\r
1140 fListBF->SetName("listBF");
\r
1141 fListBF->SetOwner(kTRUE);
\r
1142 dir->Add(fListBF);
\r
1143 //fListBF->Write("listBF",TObject::kSingleKey);
\r
1145 if(fRunShuffling) {
\r
1146 if (!fShuffledBalance) {
\r
1147 AliError("ERROR: fShuffledBalance not available");
\r
1150 fListBFS->SetName("listBFShuffled");
\r
1151 fListBFS->SetOwner(kTRUE);
\r
1152 dir->Add(fListBFS);
\r
1153 //fListBFS->Write("listBFShuffled",TObject::kSingleKey);
\r
1157 if (!fMixedBalance) {
\r
1158 AliError("ERROR: fMixedBalance not available");
\r
1161 fListBFM->SetName("listBFMixed");
\r
1162 fListBFM->SetOwner(kTRUE);
\r
1163 dir->Add(fListBFM);
\r
1164 //fListBFM->Write("listBFMixed",TObject::kSingleKey);
\r
1167 dir->Write(dir->GetName(),TObject::kSingleKey);
\r