]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/FORWARD/analysis2/AliFMDEventPlaneFinder.cxx
Extended documentation part of the class
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / AliFMDEventPlaneFinder.cxx
CommitLineData
2b556440 1// This task finds the eventplane
2// using the FMD
3//
4#include "AliFMDEventPlaneFinder.h"
5#include <TList.h>
6#include <TMath.h>
7#include "AliLog.h"
8#include <TH2D.h>
9#include <TH3D.h>
10#include "TROOT.h"
11#include <iostream>
12#include <iomanip>
13#include <TString.h>
14#include <TFile.h>
15#include "AliOADBContainer.h"
16#include "AliAnalysisManager.h"
17#include "AliVEvent.h"
18#include "AliEventplane.h"
19#include "AliCentrality.h"
20#include "AliAODForwardEP.h"
21#include "AliAODForwardMult.h"
22#include "AliAODEvent.h"
23
24ClassImp(AliFMDEventPlaneFinder)
25#if 0
26; // For Emacs
27#endif
28
29//____________________________________________________________________
30AliFMDEventPlaneFinder::AliFMDEventPlaneFinder()
31 : TNamed(),
32 fList(0),
33 fEvent(0),
34 fQt(),
35 fQa(),
36 fQc(),
37 fQ1(),
38 fQ2(),
39 fQeta(),
40 fHistFMDEventplane(0),
41 fHistFMDEventplaneA(0),
42 fHistFMDEventplaneC(0),
43 fHistFMDEventplane1(0),
44 fHistFMDEventplane2(0),
45 fHistPhiDist(0),
46 fHistFMDmTPCep(0),
47 fHistFMDvsTPCep(0),
48 fHistFMDmVZEROep(0),
49 fHistFMDvsVZEROep(0),
50 fDebug(0),
51 fOADBFileName(0),
52 fOADBContainer(0),
53 fPhiDist(0),
54 fRunNumber(0),
55 fUsePhiWeights(0)
56{
57 //
58 // Constructor
59 //
60
61}
62
63//____________________________________________________________________
64AliFMDEventPlaneFinder::AliFMDEventPlaneFinder(const char* title)
65 : TNamed("fmdEventPlaneFinder", title),
66 fList(0),
67 fEvent(0),
68 fQt(),
69 fQa(),
70 fQc(),
71 fQ1(),
72 fQ2(),
73 fQeta(),
74 fHistFMDEventplane(0),
75 fHistFMDEventplaneA(0),
76 fHistFMDEventplaneC(0),
77 fHistFMDEventplane1(0),
78 fHistFMDEventplane2(0),
79 fHistPhiDist(0),
80 fHistFMDmTPCep(0),
81 fHistFMDvsTPCep(0),
82 fHistFMDmVZEROep(0),
83 fHistFMDvsVZEROep(0),
84 fDebug(0),
85 fOADBFileName(0),
86 fOADBContainer(0),
87 fPhiDist(0),
88 fRunNumber(0),
89 fUsePhiWeights(1)
90{
91 //
92 // Constructor
93 //
94 // Parameters:
95 // name Name of object
96 //
97}
98
99//____________________________________________________________________
100AliFMDEventPlaneFinder::AliFMDEventPlaneFinder(const
101 AliFMDEventPlaneFinder& o)
102 : TNamed(o),
103 fList(o.fList),
104 fEvent(o.fEvent),
105 fQt(o.fQt),
106 fQa(o.fQa),
107 fQc(o.fQc),
108 fQ1(o.fQ1),
109 fQ2(o.fQ2),
110 fQeta(o.fQeta),
111 fHistFMDEventplane(o.fHistFMDEventplane),
112 fHistFMDEventplaneA(o.fHistFMDEventplaneA),
113 fHistFMDEventplaneC(o.fHistFMDEventplaneC),
114 fHistFMDEventplane1(o.fHistFMDEventplane1),
115 fHistFMDEventplane2(o.fHistFMDEventplane2),
116 fHistPhiDist(o.fHistPhiDist),
117 fHistFMDmTPCep(o.fHistFMDmTPCep),
118 fHistFMDvsTPCep(o.fHistFMDvsTPCep),
119 fHistFMDmVZEROep(o.fHistFMDmVZEROep),
120 fHistFMDvsVZEROep(o.fHistFMDvsVZEROep),
121 fDebug(o.fDebug),
122 fOADBFileName(o.fOADBFileName),
123 fOADBContainer(o.fOADBContainer),
124 fPhiDist(o.fPhiDist),
125 fRunNumber(o.fRunNumber),
126 fUsePhiWeights(o.fUsePhiWeights)
127{
128 //
129 // Copy constructor
130 //
131 // Parameters:
132 // o Object to copy from
133 //
134}
135
136//____________________________________________________________________
137AliFMDEventPlaneFinder::~AliFMDEventPlaneFinder()
138{
139 //
140 // Destructor
141 //
142}
143
144//____________________________________________________________________
145AliFMDEventPlaneFinder&
146AliFMDEventPlaneFinder::operator=(const AliFMDEventPlaneFinder& o)
147{
148 //
149 // Assignement operator
150 //
151 // Parameters:
152 // o Object to assign from
153 //
154 // Return:
155 // Reference to this object
156 //
157 if (&o == this) return *this;
158 TNamed::operator=(o);
159
160 fList = o.fList;
161 fEvent = o.fEvent;
162 fQt = o.fQt;
163 fQa = o.fQa;
164 fQc = o.fQc;
165 fQ1 = o.fQ1;
166 fQ2 = o.fQ2;
167 fQeta = o.fQeta;
168 fHistFMDEventplane = o.fHistFMDEventplane;
169 fHistFMDEventplaneA = o.fHistFMDEventplaneA;
170 fHistFMDEventplaneC = o.fHistFMDEventplaneC;
171 fHistFMDEventplane1 = o.fHistFMDEventplane1;
172 fHistFMDEventplane2 = o.fHistFMDEventplane2;
173 fHistPhiDist = o.fHistPhiDist;
174 fHistFMDmTPCep = o.fHistFMDmTPCep;
175 fHistFMDvsTPCep = o.fHistFMDvsTPCep;
176 fHistFMDmVZEROep = o.fHistFMDmVZEROep;
177 fHistFMDvsVZEROep = o.fHistFMDvsVZEROep;
178 fDebug = o.fDebug;
179 fOADBFileName = o.fOADBFileName;
180 fOADBContainer = o.fOADBContainer;
181 fPhiDist = o.fPhiDist;
182 fRunNumber = o.fRunNumber;
183 fUsePhiWeights = o.fUsePhiWeights;
184
185 return *this;
186}
187
188//____________________________________________________________________
189void
190AliFMDEventPlaneFinder::Init(const TAxis& etaAxis)
191{
192 // Intialize this sub-algorithm
193 //
194 // Parameters:
195 // etaAxis fmd eta axis binning
196 //
197 fHistFMDEventplane = new TH1D("hFMDEventplane", "FMD eventplane",
198 100, 0., TMath::Pi());
199 fHistFMDEventplane->Sumw2();
200 fHistFMDEventplane->SetDirectory(0);
201 fList->Add(fHistFMDEventplane);
202
203 //
204 fHistFMDEventplaneA = new TH1D("hFMDEventplaneA", "FMD eventplaneA",
205 100, 0., TMath::Pi());
206 fHistFMDEventplaneA->Sumw2();
207 fHistFMDEventplaneA->SetDirectory(0);
208 fList->Add(fHistFMDEventplaneA);
209
210 //
211 fHistFMDEventplaneC = new TH1D("hFMDEventplaneC", "FMD eventplaneC",
212 100, 0., TMath::Pi());
213 fHistFMDEventplaneC->Sumw2();
214 fHistFMDEventplaneC->SetDirectory(0);
215 fList->Add(fHistFMDEventplaneC);
216
217 //
218 fHistFMDEventplane1 = new TH1D("hFMDEventplane1", "FMD eventplane1",
219 100, 0., TMath::Pi());
220 fHistFMDEventplane1->Sumw2();
221 fHistFMDEventplane1->SetDirectory(0);
222 fList->Add(fHistFMDEventplane1);
223
224 //
225 fHistFMDEventplane2 = new TH1D("hFMDEventplane2", "FMD eventplane2",
226 100, 0., TMath::Pi());
227 fHistFMDEventplane2->Sumw2();
228 fHistFMDEventplane2->SetDirectory(0);
229 fList->Add(fHistFMDEventplane2);
230
231 //
232 fHistPhiDist = new TH2D("hPhiDist", "Phi distribution in FMD",
233 etaAxis.GetNbins(), etaAxis.GetXmin(), etaAxis.GetXmax(),
234 20, 0., TMath::TwoPi());
235 fHistPhiDist->Sumw2();
236 fHistPhiDist->SetDirectory(0);
237 fList->Add(fHistPhiDist);
238
239 //
240 fHistFMDmTPCep = new TH1D("hFMDmTPCep",
241 "Eventplane from FMD - TPC",
242 100, -TMath::Pi()/2., TMath::Pi()/2.);
243 fHistFMDmTPCep->Sumw2();
244 fHistFMDmTPCep->SetDirectory(0);
245 fList->Add(fHistFMDmTPCep);
246
247 //
248 fHistFMDvsTPCep = new TH2F("hFMDvsTPCep",
249 "Eventplane from FMD vs. TPC",
250 100, 0., TMath::Pi(),
251 100, 0., TMath::Pi());
252 fHistFMDvsTPCep->Sumw2();
253 fHistFMDvsTPCep->SetDirectory(0);
254 fList->Add(fHistFMDvsTPCep);
255
256 //
257 fHistFMDmVZEROep = new TH1D("hFMDmVZEROep",
258 "Eventplane from FMD - VZERO",
259 100, -TMath::Pi()/2., TMath::Pi()/2.);
260 fHistFMDmVZEROep->Sumw2();
261 fHistFMDmVZEROep->SetDirectory(0);
262 fList->Add(fHistFMDmVZEROep);
263
264 //
265 fHistFMDvsVZEROep = new TH2F("hFMDvsVZEROep",
266 "Eventplane from FMD vs. VZERO",
267 100, 0., TMath::Pi(),
268 100, 0., TMath::Pi());
269 fHistFMDvsVZEROep->Sumw2();
270 fHistFMDvsVZEROep->SetDirectory(0);
271 fList->Add(fHistFMDvsVZEROep);
272
273 if (!fUsePhiWeights) return;
274
275 if (fOADBFileName.Length()==0)
276 fOADBFileName = Form("%s/PWGLF/FORWARD/FMDEVENTPLANE/data/fmdEPoadb.root",
277 AliAnalysisManager::GetOADBPath());
278
279 TFile foadb(fOADBFileName);
280 if(!foadb.IsOpen()) {
281 AliError(Form("Cannot open OADB file %s", fOADBFileName.Data()));
282 return;
283 }
284 fOADBContainer = (AliOADBContainer*)foadb.Get("FMDphidist");
285 if (!fOADBContainer) AliError(Form("No OADB container found in %s", fOADBFileName.Data()));
286 foadb.Close();
287
288 return;
289}
290
291//_____________________________________________________________________
292void
293AliFMDEventPlaneFinder::DefineOutput(TList* dir)
294{
295 //
296 // Output diagnostic histograms to directory
297 //
298 // Parameters:
299 // dir List to write in
300 //
301 fList = new TList();
302 fList->SetOwner();
303 fList->SetName(GetName());
304 dir->Add(fList);
305
306 return;
307}
308
309//____________________________________________________________________
310Bool_t
311AliFMDEventPlaneFinder::FindEventplane(AliVEvent* ev,
312 AliAODForwardEP& aodep,
313 TH2D* h,
314 AliForwardUtil::Histos* hists)
315{
316 //
317 // Do the calculations
318 //
319 // Parameters:
320 // hists Histogram cache
321 // ep calculated eventplane
322 //
323 // Return:
324 // true on successs
325
326 fQt.Set(0., 0.);
327 fQa.Set(0., 0.);
328 fQc.Set(0., 0.);
329 fQ1.Set(0., 0.);
330 fQ2.Set(0., 0.);
331
332 TH1D epEtaHist = aodep.GetHistogram();
333
334 fEvent = ev;
335 if (hists) {
336 for (UShort_t d=1; d<=3; d++) {
337 UShort_t nr = (d == 1 ? 1 : 2);
338 for (UShort_t q=0; q<nr; q++) {
339 Char_t r = (q == 0 ? 'I' : 'O');
340 CalcQVectors(hists->Get(d,r), &epEtaHist);
341 } // for q
342 } // for d
343 }
344 else if (h) {
345 CalcQVectors(h, &epEtaHist);
346 }
347
348 aodep.SetEventplane(CalcEventplane(fQt));
349 aodep.SetEventplaneA(CalcEventplane(fQa));
350 aodep.SetEventplaneC(CalcEventplane(fQc));
351 // aodep.SetEventplane1(CalcEventplane(fQ1));
352 // aodep.SetEventplane2(CalcEventplane(fQ2));
353
354 FillHists(&aodep);
355
356 return kTRUE;
357}
358
359//_____________________________________________________________________
360void
361AliFMDEventPlaneFinder::CalcQVectors(TH2D* h, TH1D* eHist)
362{
363 //
364 // Calculate the Q vectors
365 //
366 Double_t phi = 0, eta = 0, weight = 0;
367 for (Int_t e = 1; e <= h->GetNbinsX(); e++) {
368 Double_t qx = 0, qy = 0;
369 eta = h->GetXaxis()->GetBinCenter(e);
370 for (Int_t p = 1; p <= h->GetNbinsY(); p++) {
371 phi = h->GetYaxis()->GetBinCenter(p);
372 weight = h->GetBinContent(e, p);
373 if (fUsePhiWeights) weight *= GetPhiWeight(e, p);
374 // fix for FMD1 hole
375 if (e > 168 && p == 14) {
376 h->GetBinContent(e, 4);
377 if (fUsePhiWeights) weight *= GetPhiWeight(e, 4);
378 }
379 fHistPhiDist->Fill(eta, phi, weight);
380 // for underflowbin total Nch/eta
381 fHistPhiDist->Fill(eta, -1., weight);
382
383 // increment Q vectors
384 qx += weight*TMath::Cos(2.*phi);
385 qy += weight*TMath::Sin(2.*phi);
386 }
387 TVector2 qVec = TVector2(qx, qy);
388 fQt += qVec;
389 if (eta < 0) fQa += qVec;
390 if (eta > 0) fQc += qVec;
391 // TODO: Add random ep increments
392 fQeta += qVec;
393 if (e % 10 == 0) {
394 eHist->Fill(eta, CalcEventplane(fQeta));
395 fQeta.Set(0., 0.);
396 }
397 }
398
399 return;
400}
401
402//_____________________________________________________________________
403Double_t
404AliFMDEventPlaneFinder::CalcEventplane(TVector2 v) const
405{
406 //
407 // Calculate the eventplane
408 //
409 Double_t ep = -1;
410
411 if (v.Mod() == 0.) return ep;
412
413 ep = v.Phi();
414 ep /= 2.;
415
416 if (fDebug > 0)
417 AliInfo(Form("Eventplane found to be: %f", ep));
418
419 return ep;
420}
421
422//_____________________________________________________________________
423void
424AliFMDEventPlaneFinder::FillHists(AliAODForwardEP* fmdEP)
425{
426 //
427 // Fill diagnostics histograms
428 //
429 Double_t fmdEPt = fmdEP->GetEventplane();
430 Double_t fmdEPa = fmdEP->GetEventplaneA();
431 Double_t fmdEPc = fmdEP->GetEventplaneC();
432 // Double_t fmdEP1 = fmdEP->GetEventplane1();
433 // Double_t fmdEP2 = fmdEP->GetEventplane2();
434
435 // FMD hists
436 fHistFMDEventplane->Fill(fmdEPt);
437 fHistFMDEventplaneA->Fill(fmdEPa);
438 fHistFMDEventplaneC->Fill(fmdEPc);
439// fHistFMDEventplane1->Fill(fmdEP1);
440// fHistFMDEventplane2->Fill(fmdEP2);
441
442 // TPC comparison
443 AliEventplane* ep = fEvent->GetEventplane();
444 Double_t tpcEP = -1;
445 if (ep) ep->GetEventplane("Q");
446
447 Double_t diffTPC = fmdEPt - tpcEP;
448
449 if (diffTPC < TMath::Pi()/2.) diffTPC = TMath::Pi() - diffTPC;
450 if (diffTPC >= TMath::Pi()/2.) diffTPC = TMath::Pi() - diffTPC;
451
452 fHistFMDmTPCep->Fill(diffTPC);
453
454// if (fmdEPt >= TMath::Pi()/2. && fmdEPt - tpcEP >= TMath::Pi()/2.) tpcEP = TMath::Pi()-tpcEP;
455// if (fmdEPt < TMath::Pi()/2. && tpcEP - fmdEPt >= TMath::Pi()/2.) tpcEP = TMath::Pi()-tpcEP;
456
457 fHistFMDvsTPCep->Fill(fmdEPt, tpcEP);
458
459 // VZERO comparison
460 Double_t vzeroEP = -1;
461 if (ep) ep->GetEventplane("V0");
462
463 Double_t diffVZERO = fmdEPt - vzeroEP;
464
465 if (diffVZERO < TMath::Pi()/2.) diffVZERO = TMath::Pi() - diffVZERO;
466 if (diffVZERO >= TMath::Pi()/2.) diffVZERO = TMath::Pi() - diffVZERO;
467
468 fHistFMDmVZEROep->Fill(diffVZERO);
469
470// if (fmdEPt >= TMath::Pi()/2. && fmdEPt - vzeroEP >= TMath::Pi()/2.) vzeroEP = TMath::Pi()-vzeroEP;
471// if (fmdEPt < TMath::Pi()/2. && vzeroEP - fmdEPt >= TMath::Pi()/2.) vzeroEP = TMath::Pi()-vzeroEP;
472
473 fHistFMDvsVZEROep->Fill(fmdEPt, vzeroEP);
474 return;
475}
476
477//_____________________________________________________________________
478Double_t
479AliFMDEventPlaneFinder::GetPhiWeight(Int_t etaBin, Int_t phiBin) const
480{
481 //
482 // Get phi weight for flattening
483 //
484 Double_t phiWeight = 1;
485
486 if (fPhiDist) {
487 Double_t nParticles = fPhiDist->GetBinContent(etaBin, 0);
488 Double_t nPhiBins = fPhiDist->GetNbinsY();
489 Double_t phiDistValue = fPhiDist->GetBinContent(etaBin, phiBin);
490
491 if (phiDistValue > 0) phiWeight = nParticles/nPhiBins/phiDistValue;
492 }
493
494 return phiWeight;
495}
496
497//____________________________________________________________________
498void
499AliFMDEventPlaneFinder::SetRunNumber(Int_t run)
500{
501 //
502 // Set run number
503 //
504 if (fRunNumber == run) return;
505
506 fRunNumber = run;
507 if (fUsePhiWeights) GetPhiDist();
508
509 return;
510}
511
512//____________________________________________________________________
513void
514AliFMDEventPlaneFinder::GetPhiDist()
515{
516 //
517 // Get phi dist from OADB
518 //
519 if (!fOADBContainer) return;
520
521 fPhiDist = (TH2D*)fOADBContainer->GetObject(fRunNumber, "Default")->Clone(Form("fPhiDist_%d", fRunNumber));
522 fList->Add(fPhiDist);
523
524 return;
525}
526
527//____________________________________________________________________
528void
529AliFMDEventPlaneFinder::Print(Option_t* /*option*/) const
530{
531 //
532 // Print information
533 //
534 // Parameters:
535 // option Not used
536 //
537 char ind[gROOT->GetDirLevel()+3];
538 for (Int_t i = 0; i < gROOT->GetDirLevel(); i++) ind[i] = ' ';
539 ind[gROOT->GetDirLevel()] = '\0';
540 std::cout << ind << ClassName() << ": " << GetName() << '\n'
541 << std::boolalpha
542 << ind << "Eventplane finder active!" << '\n'
543 << ind << "Loading OADB object for run number: " << fRunNumber << '\n'
544 << ind << "Using phi weights: " << (fUsePhiWeights ? "true" : "false") << '\n'
545 << std::noboolalpha
546 << std::flush;
547 std::cout << std::endl;
548}
549//____________________________________________________________________
550//
551// EOF
552//
553
554
555