20 #include "AliAODHandler.h" 21 #include "AliInputEventHandler.h" 22 #include "AliAnalysisManager.h" 31 #include "AliESDEvent.h" 41 # define DEFINE(N) DefineOutput(N,AliAODForwardMult::Class()) 42 # define POST(N) PostData(N,fAODFMD) 44 # define DEFINE(N) do { } while(false) 45 # define POST(N) do { } while(false) 52 fEnableLowFlux(false),
65 DGUARD(fDebug, 3,
"Named CTOR of AliForwardMultiplicityBase %s",name);
97 DGUARD(fDebug,1,
"Create user ouput");
124 fHTiming =
new TProfile(
"timing",
"Timing of task",
133 fHTiming->SetYTitle(
"#LTt_{part}#GT [CPU]");
151 fHStatus =
new TH1I(
"status",
"Status of task",16, .5, 16.5);
185 TObject* obj = &
fAODFMD; ah->AddBranch(
"AliAODForwardMult", &obj);
186 TObject* epobj = &
fAODEP; ah->AddBranch(
"AliAODForwardEP", &epobj);
191 AliWarning(
"Per-ring histograms in AOD\n" 192 "*********************************************************\n" 193 "* For each event 5 additional 2D histogram are stored *\n" 194 "* in separate branches of the AODs. This will increase *\n" 195 "* the size of the AODs - proceed with caution *\n" 196 "*********************************************************");
200 for (
Int_t i = 0; i < 5; i++) {
201 ah->AddBranch(
"TH2D", &(hists[i]));
213 DGUARD(fDebug,1,
"Initialize sub-algorithms");
223 AliFatal(Form(
"No energy loss fits"));
228 AliFatal(
"No double hit corrections");
235 AliFatal(
"No secondary corrections");
240 AliFatal(
"No event vertex bias corrections");
246 AliFatal(
"No merging efficiencies");
251 AliFatal(
"No acceptance corrections");
295 rings->SetName(
"ringSums");
327 DGUARD(fDebug,1,
"Processing the merged results");
331 Double_t nTr = 0, nTrVtx = 0, nAcc = 0;
334 "\t# events w/trigger: %f\n" 335 "\t# events w/trigger+vertex: %f\n" 336 "\t# events accepted by cuts: %f",
345 TProfile* timing =
static_cast<TProfile*
>(list->FindObject(
"timing"));
346 Int_t nTiming = (timing ? timing->GetBinContent(timing->GetNbinsX()) : 0);
347 if (timing && nTiming > 0) {
348 TProfile* p =
static_cast<TProfile*
>(timing->Clone());
350 p->Scale(100. / nTiming);
351 p->SetYTitle(
"#LTt_{part}#GT/#LTt_{total}#GT [%]");
352 p->SetTitle(
"Relative timing of task");
376 TH1I* hEventsTrVtx = 0;
377 TH1I* hEventsAcc = 0;
379 TH1* hStatus =
dynamic_cast<TH1*
>(input->FindObject(
"status"));
385 AliError(Form(
"Didn't get histograms from event selector " 386 "(hEventsTr=%p,hEventsTrVtx=%p,hEventsAcc=%p,hTriggers=%p)",
387 hEventsTr, hEventsTrVtx, hEventsAcc, hTriggers));
391 nTr = hEventsTr->Integral();
392 nTrVtx = hEventsTrVtx->Integral();
393 nAcc = hEventsAcc->Integral();
397 Double_t nTrg = hStatus->Integral(3,15);
398 Double_t nTrgVtx = hStatus->Integral(6,15);
399 vtxEff2 = (nTrg > 0 ? nTrgVtx / nTrg : 0);
402 TH2D* hData =
static_cast<TH2D*
>(input->FindObject(
"d2Ndetadphi"));
404 AliError(Form(
"Couldn't get our summed histogram from output " 405 "list %s (d2Ndetadphi=%p)", input->GetName(), hData));
410 Int_t nY = hData->GetNbinsY();
411 TH1D*
dNdeta = hData->ProjectionX(
"dNdeta", 1, nY,
"e");
412 TH1D* dNdeta_ = hData->ProjectionX(
"dNdeta_", 1, nY,
"e");
413 TH1D* norm = hData->ProjectionX(
"norm", 0, 0,
"");
414 TH1D* phi = hData->ProjectionX(
"phi", nY+1, nY+1,
"");
415 dNdeta->SetTitle(
"dN_{ch}/d#eta in the forward regions");
416 dNdeta->SetYTitle(
"#frac{1}{N}#frac{dN_{ch}}{d#eta}");
417 dNdeta->SetMarkerColor(kRed+1);
418 dNdeta->SetMarkerStyle(20);
419 dNdeta->SetDirectory(0);
421 dNdeta_->SetTitle(
"dN_{ch}/d#eta in the forward regions");
422 dNdeta_->SetYTitle(
"#frac{1}{N}#frac{dN_{ch}}{d#eta}");
423 dNdeta_->SetMarkerColor(kMagenta+1);
424 dNdeta_->SetMarkerStyle(21);
425 dNdeta_->SetDirectory(0);
427 norm->SetTitle(
"Normalization to #eta coverage");
428 norm->SetYTitle(
"#eta coverage");
429 norm->SetLineColor(kBlue+1);
430 norm->SetMarkerColor(kBlue+1);
431 norm->SetMarkerStyle(21);
432 norm->SetFillColor(kBlue+1);
433 norm->SetFillStyle(3005);
434 norm->SetDirectory(0);
436 phi->SetTitle(
"Normalization to #phi acceptance");
437 phi->SetYTitle(
"#phi acceptance");
438 phi->SetLineColor(kGreen+1);
439 phi->SetMarkerColor(kGreen+1);
440 phi->SetMarkerStyle(20);
441 phi->SetFillColor(kGreen+1);
442 phi->SetFillStyle(3004);
444 phi->SetDirectory(0);
449 dNdeta->Scale(vtxEff,
"width");
451 dNdeta_->Divide(norm);
452 dNdeta_->SetStats(0);
453 dNdeta_->Scale(vtxEff,
"width");
456 "\tNormalization eta: %d\n" 457 "\tNormalization phi: %d\n" 458 "\tVertex efficiency: %f (%f)",
459 Int_t(norm->GetMaximum()),
Int_t(phi->GetMaximum()),
462 output->Add(dNdeta_);
484 DGUARD(fDebug,3,
"Make first-shot ring dN/deta");
487 TList* list =
static_cast<TList*
>(input->FindObject(inName));
489 AliWarning(Form(
"No list %s found in %s", inName, input->GetName()));
494 out->SetName(outName);
498 THStack* dndetaRings =
new THStack(
"all",
"dN/d#eta per ring");
499 const char* names[] = {
"FMD1I",
"FMD2I",
"FMD2O",
"FMD3I",
"FMD3O", 0 };
500 const char** ptr = names;
504 thisList->SetOwner();
505 thisList->SetName(*ptr);
508 TH2D* h =
static_cast<TH2D*
>(list->FindObject(Form(
"%s_cache", *ptr)));
510 AliWarning(Form(
"Didn't find %s_cache in %s", *ptr, list->GetName()));
514 TH2D* sumPhi =
static_cast<TH2D*
>(h->Clone(
"sum_phi"));
515 sumPhi->SetDirectory(0);
516 thisList->Add(sumPhi);
518 TH2D* sumEta =
static_cast<TH2D*
>(h->Clone(
"sum_eta"));
519 sumEta->SetDirectory(0);
520 thisList->Add(sumEta);
522 Int_t nY = sumEta->GetNbinsY();
523 TH1D* etaCov =
static_cast<TH1D*
>(h->ProjectionX(
"etaCov", 0, 0,
""));
524 TH1D* phiAcc =
static_cast<TH1D*
>(h->ProjectionX(
"phiAcc", nY+1, nY+1,
""));
526 etaCov->SetTitle(
"Normalization to #eta coverage");
527 etaCov->SetYTitle(
"#eta coverage");
528 etaCov->SetMarkerColor(kBlue+1);
529 etaCov->SetFillColor(kBlue+1);
530 etaCov->SetFillStyle(3005);
531 etaCov->SetDirectory(0);
533 phiAcc->SetTitle(
"Normalization to #phi acceptance");
534 phiAcc->SetYTitle(
"#phi acceptance");
535 phiAcc->SetMarkerColor(kGreen+1);
536 phiAcc->SetFillColor(kGreen+1);
537 phiAcc->SetFillStyle(3004);
539 phiAcc->SetDirectory(0);
542 for (
Int_t i = 1; i <= sumEta->GetNbinsX(); i++) {
543 for (
Int_t j = 1; j <= nY; j++) {
544 Double_t c = sumEta->GetBinContent(i, j);
545 Double_t e = sumEta->GetBinError(i, j);
546 Double_t a = etaCov->GetBinContent(i);
547 Double_t p = phiAcc->GetBinContent(i);
549 sumEta->SetBinContent(i, j, a <= 0 ? 0 : c / a);
550 sumEta->SetBinError( i, j, a <= 0 ? 0 : e / a);
551 sumPhi->SetBinContent(i, j, p <= 0 ? 0 : c / p);
552 sumPhi->SetBinError( i, j, p <= 0 ? 0 : e / p);
558 TH1D* resPhi =
static_cast<TH1D*
>(sumPhi->ProjectionX(
"dndeta_phi",
560 resPhi->SetMarkerStyle(style);
561 resPhi->SetDirectory(0);
562 resPhi->Scale(1,
"width");
564 TH1D* resEta =
static_cast<TH1D*
>(sumEta->ProjectionX(
"dndeta_eta",
566 resEta->SetMarkerStyle(style);
567 resEta->SetDirectory(0);
568 resEta->Scale(1,
"width");
570 thisList->Add(resEta);
571 thisList->Add(etaCov);
572 thisList->Add(resPhi);
573 thisList->Add(phiAcc);
574 dndetaRings->Add(resPhi);
576 DMSG(fDebug,1,
"%s Normalization eta=%8d phi=%8d",
577 ptr,
Int_t(etaCov->GetMaximum()),
Int_t(phiAcc->GetMaximum()));
581 out->Add(dndetaRings);
583 #define PFB(N,FLAG) \ 585 AliForwardUtil::PrintName(N); \ 586 std::cout << std::boolalpha << (FLAG) << std::noboolalpha << std::endl; \ 588 #define PFV(N,VALUE) \ 590 AliForwardUtil::PrintName(N); \ 591 std::cout << (VALUE) << std::endl; } while(false) 603 gROOT->IncreaseDirLevel();
617 gROOT->DecreaseDirLevel();
virtual void SetupForData(const TAxis &etaAxis)
virtual void CreateBranches(AliAODHandler *ah)
virtual void Terminate(const TList *dir, TList *output, Int_t nEvents)
const AliFMDCorrDoubleHit * GetDoubleHit() const
void Print(Option_t *option="") const
virtual void SetupForData(const TAxis &etaAxis)
void ReInit(const TAxis &etaAxis)
void SetDebug(Int_t dbg=1)
virtual AliFMDSharingFilter & GetSharingFilter()=0
virtual AliFMDESDFixer & GetESDFixer()=0
virtual void Print(Option_t *option="") const
void SetupForData(const TAxis &axis)
virtual void CreateOutputObjects(TList *dir)
virtual AliFMDHistCollector & GetHistCollector()=0
virtual void Print(Option_t *option="") const
#define DMSG(L, N, F,...)
virtual void Terminate(const TList *dir, TList *output, Int_t nEvents)
virtual void Terminate(const TList *dir, TList *output, Int_t nEvents)
virtual AliFMDDensityCalculator & GetDensityCalculator()=0
void Init(const TAxis &etaAxis)
AliForwardMultiplicityBase()
virtual void CreateOutputObjects(TList *dir)
Bool_t FetchHistograms(const TList *d, TH1I *&hEventsTr, TH1I *&hEventsTrVtx, TH1I *&hEventsAcc, TH1I *&hTriggers) const
virtual AliFMDEventInspector & GetEventInspector()=0
virtual AliFMDEventPlaneFinder & GetEventPlaneFinder()=0
void SetDebug(Int_t dbg=1)
static Color_t RingColor(UShort_t d, Char_t r)
void Init(const TAxis &etaAxis)
virtual Bool_t MakeSimpledNdeta(const TList *input, TList *output, Double_t &nTr, Double_t &nTrVtx, Double_t &nAcc)
virtual Bool_t PreData(const TAxis &vertex, const TAxis &eta)
void Print(Option_t *option="") const
Various utilities used in PWGLF/FORWARD.
AliForwardUtil::Histos fRingSums
virtual void SetDebug(Int_t dbg)
virtual void Print(Option_t *option="") const
const AliFMDCorrMergingEfficiency * GetMergingEfficiency() const
virtual void CreateOutputObjects(TList *dir)
void Print(Option_t *option="") const
AliAODForwardMult fAODFMD
virtual Bool_t PostEvent()
virtual void SetDebug(Int_t dbg)
virtual void CreateOutputObjects(TList *dir)
const AliFMDCorrELossFit * GetELossFit() const
static const Char_t * GetTriggerString(UInt_t mask, const char *sep="&")
#define DGUARD(L, N, F,...)
void SetDebug(Int_t dbg=1)
void CreateOutputObjects(TList *l)
virtual void SetDebug(Int_t dbg=1)
virtual void EstimatedNdeta(const TList *input, TList *output) const
virtual void CreateOutputObjects(TList *dir)
TH2D * Get(UShort_t d, Char_t r) const
virtual Bool_t Finalize()
void SetDebug(Int_t dbg=1)
AliForwardUtil::Histos fHistos
virtual void InitMembers(const TAxis &pe, const TAxis &pv)
const AliFMDCorrAcceptance * GetAcceptance() const
virtual void Print(Option_t *option="") const
void Init(const TAxis &etaAxis)
virtual void MakeRingdNdeta(const TList *input, const char *inName, TList *output, const char *outName, Int_t style=20) const
const AliFMDCorrVertexBias * GetVertexBias() const
virtual void SetupForData(const TAxis &etaAxis)
Int_t GetRunNumber(TString)
UInt_t fNeededCorrections
virtual AliFMDCorrector & GetCorrections()=0
void SetRunNumber(Int_t run)
const AliFMDCorrSecondaryMap * GetSecondaryMap() const
virtual void SetupForData(const TAxis &vtxAxis, const TAxis &etaAxis)
void Print(Option_t *option="") const
static AliForwardCorrectionManager & Instance()
const TH2D & GetHistogram() const