]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/FLOW/Tasks/AliAnalysisTaskJetFlowMC.cxx
PWGPP-3, PWGPP-4, ATO-20, ATO-71 - Extended test to check integrity AliAnalysistask...
[u/mrichter/AliRoot.git] / PWG / FLOW / Tasks / AliAnalysisTaskJetFlowMC.cxx
CommitLineData
5a6bcfc6 1// Simple class to generate toy events which can be fed into the jet finder
2//
3// Author: Redmer Alexander Bertens, Utrecht University, 2013
4// rbertens@cern.ch, rbertens@nikhef.nl, r.a.bertens@uu.nl
5
6// root includes
7#include "TChain.h"
8#include "TList.h"
9#include "TClonesArray.h"
10#include "TArrayI.h"
20bd6574 11#include "TRandom3.h"
5a6bcfc6 12// aliroot includes
13#include "AliAODEvent.h"
14#include "AliAnalysisManager.h"
15#include "AliAnalysisTaskJetFlowMC.h"
16#include "AliLog.h"
17#include "AliPicoTrack.h"
18
19class AliAnalysisTaskJetFlowMC;
20using namespace std;
21
22ClassImp(AliAnalysisTaskJetFlowMC)
23
24//_____________________________________________________________________________
db02017e 25AliAnalysisTaskJetFlowMC::AliAnalysisTaskJetFlowMC() : AliAnalysisTaskSE("AliAnalysisTaskJetFlowMC"), fTracksOutName("JetFlowMC"), fTracksInName("PicoTrack"), fTracksIn(0), fTracksOut(0), fReuseTracks(kFALSE), fMult(2200), fCenBin(-1), fCentralityClasses(0), fFuncVn(0), fOutputList(0), fTrackSpectrum(0), fRandomizeEta(kTRUE), fJetSpectrumSF(0), fNoOfSFJets(0), fHistIntV2(0), fHistIntV3(0), fFlowFluctuations(-10), fMaxNumberOfIterations(100), fPsi2(-10), fPsi3(-10), fPrecisionPhi(1e-10), fDetectorType(kVZEROC), fHistSFJetSpectrum(0), fHistSFJetEtaPhi(0) {
5a6bcfc6 26 // default constructor for root IO
27 for(Int_t i(0); i < 10; i++) {
28 fFuncDiffV2[i] = 0x0;
29 fFuncDiffV3[i] = 0x0;
30 fHistDiffV2[i] = 0x0;
31 fHistDiffV3[i] = 0x0;
32 fHistOriginalSpectrum[i] = 0x0;
33 fHistOriginalEtaPhi[i] = 0x0;
34 fHistToySpectrum[i] = 0x0;
35 fHistToyEtaPhi[i] = 0x0;
36 fHistOriginalDeltaPhi[i] = 0x0;
37 fHistToyDeltaPhi[i] = 0x0;
38 fHistToyVn[i] = 0x0;
39 }
40}
41//_____________________________________________________________________________
5a35c43f 42AliAnalysisTaskJetFlowMC::AliAnalysisTaskJetFlowMC(const char *name, Int_t seed) : AliAnalysisTaskSE(name), fTracksOutName("JetFlowMC"), fTracksInName("PicoTrack"), fTracksIn(0), fTracksOut(0), fReuseTracks(kFALSE), fMult(2200), fCenBin(-1), fCentralityClasses(0), fFuncVn(0), fOutputList(0), fTrackSpectrum(0), fRandomizeEta(kTRUE), fJetSpectrumSF(0), fNoOfSFJets(0), fHistIntV2(0), fHistIntV3(0), fFlowFluctuations(-10), fMaxNumberOfIterations(100), fPsi2(-10), fPsi3(-10), fPrecisionPhi(1e-10), fDetectorType(kVZEROC), fHistSFJetSpectrum(0), fHistSFJetEtaPhi(0) {
5a6bcfc6 43 // constructor
44 DefineInput(0, TChain::Class());
45 DefineOutput(1, TList::Class());
46 for(Int_t i(0); i < 10; i++) {
47 fFuncDiffV2[i] = 0x0;
48 fFuncDiffV3[i] = 0x0;
49 fHistDiffV2[i] = 0x0;
50 fHistDiffV3[i] = 0x0;
51 fHistOriginalSpectrum[i] = 0x0;
52 fHistOriginalEtaPhi[i] = 0x0;
53 fHistToySpectrum[i] = 0x0;
54 fHistToyEtaPhi[i] = 0x0;
55 fHistOriginalDeltaPhi[i] = 0x0;
56 fHistToyDeltaPhi[i] = 0x0;
57 fHistToyVn[i] = 0x0;
58 }
5a35c43f 59 // by default construction replace gRandom
60 if(seed > -1) {
61 if(gRandom) delete gRandom;
62 gRandom = new TRandom3(seed);
63 }
5a6bcfc6 64}
65//_____________________________________________________________________________
66AliAnalysisTaskJetFlowMC::~AliAnalysisTaskJetFlowMC()
67{
68 // desctructor, claim ownership of deleted objects by setting member pointers to NULL
69 if(fOutputList) {
70 delete fOutputList;
71 fOutputList= NULL;
72 }
73}
74//_____________________________________________________________________________
75void AliAnalysisTaskJetFlowMC::UserCreateOutputObjects()
76{
77 // Create my user objects.
78 if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
79 fTracksOut = new TClonesArray("AliPicoTrack");
80 fTracksOut->SetName(fTracksOutName);
81 fOutputList = new TList();
82 fOutputList->SetOwner(kTRUE);
83 if(!fCentralityClasses) { // classes must be defined at this point
84 Int_t c[] = {0, 90};
85 fCentralityClasses = new TArrayI(sizeof(c)/sizeof(c[0]), c);
86 }
87 if(fHistIntV2 && !fHistIntV3) { // define function
88 fFuncVn = new TF1("kV2", "[0]*([1]+[2]*[3]*TMath::Cos([2]*(x-[4])))", 0, TMath::TwoPi());
89 fFuncVn->SetParameter(0, 1.); // normalization
90 fFuncVn->SetParameter(3, 0.2); // v2
91 fFuncVn->FixParameter(1, 1.); // constant
92 fFuncVn->FixParameter(2, 2.); // constant
93 } else if (!fHistIntV2 && fHistIntV3) {
94 fFuncVn = new TF1("kV3", "[0]*([1]+[2]*[3]*TMath::Cos([2]*(x-[4])))", 0, TMath::TwoPi());
95 fFuncVn->SetParameter(0, 1.); // normalization
96 fFuncVn->SetParameter(3, 0.2); // v3
97 fFuncVn->FixParameter(1, 1.); // constant
98 fFuncVn->FixParameter(2, 3.); // constant
99 } else if (fHistIntV2 && fHistIntV3) {
100 fFuncVn = new TF1("kCombined", "[0]*([1]+[2]*([3]*TMath::Cos([2]*(x-[4]))+[7]*TMath::Cos([5]*(x-[6]))))", 0, TMath::TwoPi());
101 fFuncVn->SetParameter(0, 1.); // normalization
102 fFuncVn->SetParameter(3, 0.2); // v2
103 fFuncVn->FixParameter(1, 1.); // constant
104 fFuncVn->FixParameter(2, 2.); // constant
105 fFuncVn->FixParameter(5, 3.); // constant
106 fFuncVn->SetParameter(7, 0.2); // v3
107 }
108 // add the generator objects that have been added to the task
109 if(fTrackSpectrum) fOutputList->Add(fTrackSpectrum);
110 if(fJetSpectrumSF) fOutputList->Add(fJetSpectrumSF);
111 if(fHistIntV2) fOutputList->Add(fHistIntV2);
112 if(fHistIntV3) fOutputList->Add(fHistIntV3);
113 // create the QA histos
114 for(Int_t i(0); i < fCentralityClasses->GetSize()-1; i++) {
d0ef8ed2 115 fHistOriginalSpectrum[i] = BookTH1F("fHistOriginalSpectrum", "p_{t} [GeV/c]", 200, 0, 200, i);
5a6bcfc6 116 fHistOriginalEtaPhi[i] = BookTH2F("fHistOriginalEtaPhi", "#eta", "#varphi", 100, -1., 1., 100, 0, TMath::TwoPi(), i);
d0ef8ed2 117 fHistToySpectrum[i] = BookTH1F("fHistToySpectrum", "p_{t} [GeV/c]", 200, 0, 200, i);
5a6bcfc6 118 fHistToyEtaPhi[i] = BookTH2F("fHistToyEtaPhi", "#eta", "#varphi", 100, -1., 1., 100, 0, TMath::TwoPi(), i);
119 fHistOriginalDeltaPhi[i] = BookTH1F("fHistOriginalDeltaPhi", "#varphi - #Psi", 100, 0., TMath::Pi(), i);
120 fHistToyDeltaPhi[i] = BookTH1F("fHistToyDeltaPhi", "#varphi - #Psi", 100, 0., TMath::Pi(), i);
3880af5d 121 fHistToyVn[i] = BookTH2F("fHistToyVn", "p_{t} [GeV/c]", "v_{n}", 1000, 0, 200, 200, 0, .2, i);
5a6bcfc6 122 // add to outputlist
123 if(fFuncDiffV2[i]) fOutputList->Add(fFuncDiffV2[i]);
124 if(fFuncDiffV3[i]) fOutputList->Add(fFuncDiffV3[i]);
125 if(fHistDiffV2[i]) fOutputList->Add(fHistDiffV2[i]);
126 if(fHistDiffV3[i]) fOutputList->Add(fHistDiffV3[i]);
127 }
128 if(fJetSpectrumSF) {
129 fHistSFJetSpectrum = BookTH1F("fHistSFJetSpectrum", "p_{t} SF jets [GeV/c]", 100, 0, 200);
130 fHistSFJetEtaPhi = BookTH2F("fHistSFJetEtaPhi", "#eta", "#varphi", 100, -1., 1., 100, 0, TMath::TwoPi());
131 }
20bd6574 132 // reset the random seed
133 if(gRandom) {
134 delete gRandom;
135 gRandom = new TRandom3(0);
136 }
137
5a6bcfc6 138 fOutputList->Sort();
139 PostData(1, fOutputList);
140}
141//_____________________________________________________________________________
142TH1F* AliAnalysisTaskJetFlowMC::BookTH1F(const char* name, const char* x, Int_t bins, Double_t min, Double_t max, Int_t c, Bool_t append)
143{
144 // book a TH1F and connect it to the output container
145 if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
146 if(!fOutputList) return 0x0;
147 TString title(name);
148 if(c!=-1) { // format centrality dependent histograms accordingly
149 name = Form("%s_%i", name, c);
150 title += Form("_%i-%i", fCentralityClasses->At(c), fCentralityClasses->At(1+c));
151 }
152 title += Form(";%s;[counts]", x);
153 TH1F* histogram = new TH1F(name, title.Data(), bins, min, max);
154 histogram->Sumw2();
155 if(append) fOutputList->Add(histogram);
156 return histogram;
157}
158//_____________________________________________________________________________
159TH2F* AliAnalysisTaskJetFlowMC::BookTH2F(const char* name, const char* x, const char*y, Int_t binsx, Double_t minx, Double_t maxx, Int_t binsy, Double_t miny, Double_t maxy, Int_t c, Bool_t append)
160{
161 // book a TH2F and connect it to the output container
162 if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
163 if(!fOutputList) return 0x0;
164 TString title(name);
165 if(c!=-1) { // format centrality dependent histograms accordingly
166 name = Form("%s_%i", name, c);
167 title += Form("_%i-%i", fCentralityClasses->At(c), fCentralityClasses->At(1+c));
168 }
169 title += Form(";%s;%s", x, y);
170 TH2F* histogram = new TH2F(name, title.Data(), binsx, minx, maxx, binsy, miny, maxy);
171 histogram->Sumw2();
172 if(append) fOutputList->Add(histogram);
173 return histogram;
174}
175//_____________________________________________________________________________
176void AliAnalysisTaskJetFlowMC::UserExec(Option_t *)
177{
178 // user exec, called for each event.
179 if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
180 if(!AliAnalysisManager::GetAnalysisManager()) return;
181 // retrieve tracks from input.
182 if (!fTracksIn) {
183 fTracksIn = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksInName));
184 if (!fTracksIn) {
185 AliError(Form("Could not retrieve tracks %s!", fTracksInName.Data()));
186 return;
187 }
188 }
189 // get the centrality bin for qa plots
190 Double_t cent(InputEvent()->GetCentrality()->GetCentralityPercentile("V0M"));
191 fCenBin = -1;
192 for(Int_t i(0); i < fCentralityClasses->GetSize()-1; i++) {
193 if(cent >= fCentralityClasses->At(i) && cent <= fCentralityClasses->At(1+i)) {
194 fCenBin = i;
195 break; }
196 }
197 if(fCenBin < 0) return;
198 // add tracks to event if not yet there
199 fTracksOut->Delete();
200 if (!(InputEvent()->FindListObject(fTracksOutName))) InputEvent()->AddObject(fTracksOut);
201 fTracksOut->Clear();
202 // get the event plane
203 CalculateEventPlane();
5a6bcfc6 204 Int_t nacc(0);
db02017e 205 if(fReuseTracks) {
206 const Int_t Ntracks = fTracksIn->GetEntriesFast();
207 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
208 AliPicoTrack* track = static_cast<AliPicoTrack*>(fTracksIn->At(iTracks));
209 if(!track) continue;
210 Double_t phi(track->Phi()), pt((fTrackSpectrum) ? GetTrackPt() : track->Pt()), eta(fRandomizeEta ? GetTrackEta() : track->Eta());
211 // fill qa histo's before applying any (possible) afterburner
212 FillHistogramsOriginalData(pt, eta, phi);
213 if(fHistDiffV2[fCenBin] || fFuncDiffV2[fCenBin]) V2AfterBurner(phi, eta, pt);
214 else if(fHistDiffV3[fCenBin] || fFuncDiffV3[fCenBin]) V3AfterBurner(phi, eta, pt);
215 else if(fHistIntV2 || fHistIntV3) SampleVnFromTF1(phi);
216 /*AliPicoTrack *picotrack =*/ new ((*fTracksOut)[nacc]) AliPicoTrack(pt, eta, phi, track->Charge(), track->GetLabel(), 4, track->GetTrackEtaOnEMCal(), track->GetTrackPhiOnEMCal(), track->GetTrackPtOnEMCal(), 1);
217 nacc++;
218 }
219 } else {
220 Double_t pt(0), eta(0), phi(0);
221 for (Int_t iTracks = 0; iTracks < fMult; ++iTracks) {
222 pt = GetTrackPt();
223 eta = gRandom->Uniform(-.9, .9);
224 phi = gRandom->Uniform(0., TMath::TwoPi());
225 // fill qa histo's before applying any (possible) afterburner
226 FillHistogramsOriginalData(pt, eta, phi);
227 if(fHistDiffV2[fCenBin] || fFuncDiffV2[fCenBin]) V2AfterBurner(phi, eta, pt);
228 else if(fHistDiffV3[fCenBin] || fFuncDiffV3[fCenBin]) V3AfterBurner(phi, eta, pt);
229 else if(fHistIntV2 || fHistIntV3) SampleVnFromTF1(phi);
230 /*AliPicoTrack *picotrack =*/ new ((*fTracksOut)[nacc]) AliPicoTrack(pt, eta, phi, 1, 0, 4, eta, phi, pt, 1);
231 nacc++;
232 }
5a6bcfc6 233 }
234 if(fJetSpectrumSF && fNoOfSFJets > 0) InjectSingleFragmentationJetSpectrum(nacc);
235 PostData(1, fOutputList);
236 if(fDebug > 0) PrintInfo();
237}
238//_____________________________________________________________________________
239void AliAnalysisTaskJetFlowMC::V2AfterBurner(Double_t &phi, Double_t &eta, Double_t &pt) const
240{
241 // similar to AliFlowTrackSimple::AddV2, except for the flow fluctuations
242 if(fDebug > 1) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
243 phi = gRandom->Uniform(0, TMath::TwoPi());
244 Double_t phi0(phi), v2(GetV2(pt)), f(0.), fp(0.), phiprev(0.);
245 if(TMath::AreEqualAbs(v2, 0, 1e-5)) {
246 FillHistogramsToyData(pt, eta, phi, v2);
247 return;
248 }
249 // introduce flow fluctuations (gaussian)
250 if(fFlowFluctuations > -10) GetFlowFluctuation(v2);
251 for (Int_t i=0; i!=fMaxNumberOfIterations; ++i) {
252 phiprev=phi; //store last value for comparison
253 f = phi-phi0+v2*TMath::Sin(2.*(phi-fPsi2));
254 fp = 1.0+2.0*v2*TMath::Cos(2.*(phi-fPsi2)); //first derivative
255 phi -= f/fp;
256 if (TMath::AreEqualAbs(phiprev,phi,fPrecisionPhi)) break;
257 }
258 FillHistogramsToyData(pt, eta, phi, v2);
259}
260//_____________________________________________________________________________
261void AliAnalysisTaskJetFlowMC::V3AfterBurner(Double_t &phi, Double_t &eta, Double_t &pt) const
262{
263 // similar to AliFlowTrackSimple::AddV3, except for the flow fluctuations
264 if(fDebug > 1) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
265 phi = gRandom->Uniform(0, TMath::TwoPi());
266 Double_t phi0(phi), v3(GetV3(pt)), f(0.), fp(0.), phiprev(0.);
267 if(TMath::AreEqualAbs(v3, 0, 1e-5)) {
268 FillHistogramsToyData(pt, eta, phi, v3);
269 return;
270 }
271 // introduce flow fluctuations (gaussian)
272 if(fFlowFluctuations > -10) GetFlowFluctuation(v3);
273 for (Int_t i=0; i<fMaxNumberOfIterations; i++) {
274 phiprev=phi; //store last value for comparison
275 f = phi-phi0+2./3.*v3*TMath::Sin(3.*(phi-fPsi3));
276 fp = 1.0+2.0*v3*TMath::Cos(3.*(phi-fPsi3)); //first derivative
277 phi -= f/fp;
278 if (TMath::AreEqualAbs(phiprev,phi,fPrecisionPhi)) break;
279 }
280 FillHistogramsToyData(pt, eta, phi, v3);
281}
282//_____________________________________________________________________________
283void AliAnalysisTaskJetFlowMC::InjectSingleFragmentationJetSpectrum(Int_t nacc)
284{
285 // inject single fragmentation jet spectrum to the tclones array, note that emcal params
286 // equal the barrel kinematics to pass the track and jet cuts later on
287 if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
288 for(Int_t i(nacc); i < (nacc + fNoOfSFJets); i++) {
289 Double_t eta(gRandom->Uniform(-.5, .5)), phi(gRandom->Uniform(0, TMath::TwoPi())), pt(fJetSpectrumSF->GetRandom());
290 /*AliPicoTrack *picotrack =*/ new ((*fTracksOut)[i]) AliPicoTrack(pt, eta, phi, +1, 0, 0, eta, phi, pt, 0);
291 fHistSFJetSpectrum->Fill(pt);
292 fHistSFJetEtaPhi->Fill(eta, phi);
293 ++i;
294 }
295 nacc = 0;
296}
297//_____________________________________________________________________________
298void AliAnalysisTaskJetFlowMC::CalculateEventPlane() {
299 // grab the event plane orientation from the AliVEvent header
300 if(fDebug > 0) printf("__FILE__ = %s \n __LINE __ %i , __FUNC__ %s \n ", __FILE__, __LINE__, __func__);
301 Double_t a(0), b(0), e(0), f(0);
302 switch (fDetectorType) {
303 case kVZEROA : {
304 fPsi2 = InputEvent()->GetEventplane()->CalculateVZEROEventPlane(InputEvent(), 8, 2, e, f);
305 fPsi3 = InputEvent()->GetEventplane()->CalculateVZEROEventPlane(InputEvent(), 8, 3, a, b);
306 break;
307 }
308 case kVZEROC : {
309 fPsi2 = InputEvent()->GetEventplane()->CalculateVZEROEventPlane(InputEvent(), 9, 2, e, f);
310 fPsi3 = InputEvent()->GetEventplane()->CalculateVZEROEventPlane(InputEvent(), 9, 3, a, b);
311 break;
312 }
313 case kVZEROComb : {
314 fPsi2 = InputEvent()->GetEventplane()->CalculateVZEROEventPlane(InputEvent(), 10, 2, e, f) ;
315 fPsi3 = InputEvent()->GetEventplane()->CalculateVZEROEventPlane(InputEvent(), 10, 3, a, b);
316 break;
317 }
318 default : break;
319 }
320 // if requested, pass the event plane to the phi distribution
321 if(fHistIntV2 && fHistIntV3) {
322 fFuncVn->SetParameter(4, fPsi2); fFuncVn->SetParameter(6, fPsi3);
323 Double_t v2(fHistIntV2->GetBinContent(fHistIntV2->GetXaxis()->FindBin(InputEvent()->GetCentrality()->GetCentralityPercentile("V0M"))));
324 Double_t v3(fHistIntV2->GetBinContent(fHistIntV3->GetXaxis()->FindBin(InputEvent()->GetCentrality()->GetCentralityPercentile("V0M"))));
325 if(fFlowFluctuations > -10) {
326 GetFlowFluctuation(v2); GetFlowFluctuation(v3);
327 }
328 fFuncVn->SetParameter(3, v2); fFuncVn->SetParameter(7, v3);
329 } else if (fHistIntV2) {
330 fFuncVn->SetParameter(4, fPsi2);
331 Double_t v2(fHistIntV2->GetBinContent(fHistIntV2->GetXaxis()->FindBin(InputEvent()->GetCentrality()->GetCentralityPercentile("V0M"))));
332 if(fFlowFluctuations > -10) GetFlowFluctuation(v2);
333 fFuncVn->SetParameter(3, v2);
334 } else if (fHistIntV3) {
335 fFuncVn->SetParameter(4, fPsi3);
336 Double_t v3(fHistIntV3->GetBinContent(fHistIntV2->GetXaxis()->FindBin(InputEvent()->GetCentrality()->GetCentralityPercentile("V0M"))));
337 if(fFlowFluctuations > -10) GetFlowFluctuation(v3);
338 fFuncVn->SetParameter(3, v3);
339 }
340}
341//_____________________________________________________________________________
342void AliAnalysisTaskJetFlowMC::Terminate(Option_t *)
343{
344 // terminate
345}
346//_____________________________________________________________________________
347void AliAnalysisTaskJetFlowMC::PrintInfo() const
348{
349 // print info
350 printf(" > No of retrieved tracks from %s \n \t %i \n", fTracksInName.Data(), fTracksIn->GetEntriesFast());
351 printf(" > No of created tracks in %s \n \t %i \n", fTracksOutName.Data(), fTracksOut->GetEntriesFast());
352
353}
354//_____________________________________________________________________________