12 #include <AliAnalysisTaskSE.h>
18 #include <AliVVertex.h>
19 #include <AliVertex.h>
20 #include <AliAnalysisManager.h>
21 #include <AliVEventHandler.h>
22 #include <AliInputEventHandler.h>
23 #include <AliMultSelection.h>
24 #include <AliCentrality.h>
26 #include <TClonesArray.h>
30 #include <TGraphErrors.h>
35 class AliMultSelection;
147 const char* weights=0,
148 const char* sumFile=0,
149 const char* resFile=0);
414 const TAxis& etaAxis,
415 const TAxis& ipzAxis,
416 const TAxis& deltaAxis)
494 Histos(
const char* name=
"", Color_t
color=kBlack, Style_t style=1,
495 UChar_t mask=0, UChar_t veto=0)
597 const TAxis& etaAxis,
598 const TAxis& ipzAxis,
599 const TAxis& deltaAxis);
779 const TAxis& etaAxis,
780 const TAxis& ipzAxis,
781 const TAxis& deltaAxis);
931 const TAxis& deltaAxis);
958 const AliVVertex*& ip,
959 TClonesArray*& tracklets);
989 const AliVVertex*
FindRealIP(AliVEvent* event,
1001 const AliVVertex*
CheckIP(
const AliVVertex* ip,
1014 const AliVVertex*
FindIP(AliVEvent* event,
1102 const AliVVertex* ip,
1103 TClonesArray* tracklets);
1401 Info(
"SetWeightCalc",
"Use=%d",
mode);
1402 if (fWeights) fWeights->SetCalc(
mode);}
1409 Info(
"SetWeightMask",
"mask=0x%x", mask);
1410 if (fWeights) fWeights->SetMask(mask); }
1417 Info(
"SetWeightVeto",
"veto=0x%x", veto);
1418 if (fWeights) fWeights->SetVeto(veto); }
1517 fNTrackletVsGood(0),
1518 fNTrackletVsFake(0),
1519 fNGeneratedVsGood(0),
1520 fNGeneratedVsFake(0),
1526 fCentAxis(10,0,100),
1527 fIPzAxis(30,-15,+15),
1529 fPhiAxis(100,0,TMath::TwoPi()),
1534 fShiftedDPhiCut(-1),
1543 DefineOutput(1, Container::Class());
1544 DefineOutput(2, Container::Class());
1557 fNTrackletVsGood(0),
1558 fNTrackletVsFake(0),
1559 fNGeneratedVsGood(0),
1560 fNGeneratedVsFake(0),
1563 fCentMethod(o.fCentMethod),
1564 fCentIdx(o.fCentIdx),
1566 fCentAxis(o.fCentAxis),
1567 fIPzAxis(o.fIPzAxis),
1568 fEtaAxis(o.fEtaAxis),
1569 fPhiAxis(o.fPhiAxis),
1570 fMaxDelta(o.fMaxDelta),
1571 fTailDelta(o.fTailDelta),
1572 fTailMax(o.fTailMax),
1573 fDPhiShift(o.fDPhiShift),
1574 fShiftedDPhiCut(o.fShiftedDPhiCut),
1575 fDeltaCut(o.fDeltaCut),
1576 fAbsMinCent(o.fAbsMinCent)
1582 if (&o ==
this)
return *
this;
1614 if (&o ==
this)
return *
this;
1620 const char* resFile)
1624 AliError(
"No analysis manager to connect to.");
1634 if (sumFile && sumFile[0] !=
'\0') sumOut = sumFile;
1635 if (resFile && resFile[0] !=
'\0') resOut = resFile;
1636 else if (sumFile && sumFile[0] !=
'\0') resOut = sumFile;
1639 if (sumOut.IsNull() || sumOut.EqualTo(
"default", TString::kIgnoreCase))
1640 sumOut = AliAnalysisManager::GetCommonFileName();
1642 if (resOut.IsNull() || resOut.EqualTo(
"default", TString::kIgnoreCase))
1643 resOut = AliAnalysisManager::GetCommonFileName();
1646 mgr->ConnectInput(
this, 0, mgr->GetCommonInputContainer());
1649 if (!sumOut.EqualTo(
"none", TString::kIgnoreCase)) {
1650 TString sumName(Form(
"%sSums", GetName()));
1651 AliAnalysisDataContainer* sumCon =
1652 mgr->CreateContainer(sumName, TList::Class(),
1653 AliAnalysisManager::kOutputContainer, sumOut);
1654 mgr->ConnectOutput(
this, 1, sumCon);
1658 if (!resOut.EqualTo(
"none", TString::kIgnoreCase)) {
1659 TString resName(Form(
"%sResults", GetName()));
1660 AliAnalysisDataContainer* resCon =
1661 mgr->CreateContainer(resName, TList::Class(),
1662 AliAnalysisManager::kParamContainer, resOut);
1663 mgr->ConnectOutput(
this, 2, resCon);
1671 if (shiftedDPhiCut < 0) shiftedDPhiCut = TMath::Sqrt(
fDeltaCut)*0.06;
1675 Printf(
"%s: %s", ClassName(), GetName());
1676 Printf(
" %22s: 0x%08x",
"Off-line trigger mask", fOfflineTriggerMask);
1677 Printf(
" %22s: %f",
"Delta phi shift",
fDPhiShift);
1678 Printf(
" %22s: %f",
"Shifted Delta phi cut", shiftedDPhiCut);
1679 Printf(
" %22s: %f",
"Delta cut",
fDeltaCut);
1680 Printf(
" %22s: %f",
"max Delta",
fMaxDelta);
1681 Printf(
" %22s: %f",
"tail Delta",
fTailDelta);
1682 Printf(
" %22s: %f",
"tail maximum", tailMax);
1683 Printf(
" %22s: %f%%",
"Absolute least c",
fAbsMinCent);
1692 Printf(
"--- Centrality bins");
1695 while ((bin = static_cast<CentBin*>(next()))) {
1710 Printf(
" Centrality bin: %s",
fName.Data());
1711 Printf(
" Low cut: %5.1f",
fLow);
1712 Printf(
" High cut: %5.1f",
fHigh);
1715 Printf(
" --- Histogram sets");
1718 while ((h = static_cast<Histos*>(next()))) {
1729 while ((h = static_cast<Histos*>(next()))) {
1734 void Bits2String(UChar_t m,
char out[7])
1749 char cMask[7]; Bits2String(fMask, cMask);
1750 char cVeto[7]; Bits2String(fVeto, cVeto);
1751 Printf(
" Histograms: %s", fName.Data());
1752 Printf(
" Mask: 0x%02x (%s)", fMask, cMask);
1753 Printf(
" Veto: 0x%02x (%s)", fVeto, cVeto);
1754 Printf(
" Delta: %s", fEtaDeltaIPz ?
"yes" :
"no");
1755 Printf(
" Delta per PDG: %s", fEtaDeltaPdg ?
"yes" :
"no");
1764 AliWarning(
"Failed to initialize on worker");
1773 if (DebugLevel() > 1) Printf(
"Initialising on worker");
1778 fContainer->SetName(Form(
"%sSums", GetName()));
1781 Bool_t save = TH1::GetDefaultSumw2();
1782 TH1::SetDefaultSumw2();
1787 TAxis trackletAxis(1000, 0, 10000);
1788 FixAxis(trackletAxis,
"#it{N}_{tracklets}");
1790 kGreen+2, 20, trackletAxis);
1792 kRed+2, 20, trackletAxis);
1799 kGreen+2, 20, trackletAxis);
1801 kRed+2, 20, trackletAxis);
1807 TAxis generatedAxis(1000, 0, 15000);
1808 FixAxis(generatedAxis,
"#it{N}_{generated,|#eta|<2}");
1810 kGreen+2, 24, generatedAxis);
1812 kRed+2, 24, generatedAxis);
1819 "Mean number of tracklets per centrality",
1830 TH1::SetDefaultSumw2(save);
1838 params->SetName(
"parameters");
1841 params->Add(
new DP(
"DPhiShift",
fDPhiShift,
'f'));
1843 params->Add(
new DP(
"DeltaCut",
fDeltaCut,
'f'));
1844 params->Add(
new DP(
"MaxDelta",
fMaxDelta,
'f'));
1845 params->Add(
new DP(
"TailDelta",
fTailDelta,
'f'));
1846 params->Add(
new DP(
"TailMax",
fTailMax,
'f'));
1847 params->Add(
new DP(
"AbsMinCent",
fAbsMinCent,
'f'));
1850 AliWarning(
"Failed to initialize centrality bins");
1864 AliFatal(
"No weights set!");
1868 TAxis wAxis(100,0,10);
1873 kCyan+2, 24, wAxis, wAxis);
1883 const TAxis& deltaAxis)
1892 AliWarningF(
"Failed to initialize bin %s", ret->
GetName());
1904 if (DebugLevel() > 1)
1905 Printf(
"Initialising on centrality bins on %s",
1906 existing ?
"master" :
"worker");
1914 "#Delta=[(#Delta#phi-#delta#phi)/#sigma_{#phi}]^{2}+"
1915 "[#Delta#thetasin^{-2}(#theta)/#sigma_{#theta}]^{2}");
1918 if (!
InitCentBin(0,0,0,existing,deltaAxis))
return false;
1925 if (!
InitCentBin(i, c1, c2, existing, deltaAxis))
return false;
1927 if (!
InitCentBin(nCentBins+1, 0, 100, existing, deltaAxis))
return false;
1955 fSubs->SetOwner(
true);
2005 return new Histos(name, color, style, mask, veto);
2010 const TAxis& etaAxis,
2011 const TAxis& ipzAxis,
2012 const TAxis& deltaAxis)
2015 Printf(
"Initializing centrality bin %s", fName.Data());
2016 if (!
Sub::WorkerInit(parent, etaAxis, ipzAxis, deltaAxis))
return false;
2018 TAxis centAxis(20, fLow, fHigh);
2019 FixAxis(centAxis,
"Centrality [%]");
2022 kMagenta+2,20,centAxis);
2026 fCentIPz->SetYTitle(
"#LTc#GT");
2029 while ((h = static_cast<Histos*>(next()))) {
2038 const TAxis& etaAxis,
2039 const TAxis& ipzAxis,
2040 const TAxis& deltaAxis)
2042 if (!
Sub::WorkerInit(parent, etaAxis, ipzAxis, deltaAxis))
return false;
2043 TString shrt(Form(
"%c", GetName()[0]));
2045 if (
GetC(parent,
"generated",
false) != 0) shrt.Append(
"'");
2048 if (!IsPrimary() && !IsSecondary())
2050 kRed+2, 20, etaAxis, ipzAxis);
2054 Form(
"#Delta_{%s}",shrt.Data()),
2055 kBlue+2, 21, etaAxis, deltaAxis, ipzAxis);
2056 if (!IsGenerated() &&
2062 "Parent particle type",
2063 kGreen+2, 22, etaAxis,
PdgAxis(), ipzAxis);
2065 if (IsGenerated()) {
2067 "Primary particle type",
2068 kYellow+2, 30, etaAxis,
PdgAxis());
2069 TAxis ptAxis(100, 0, 5);
2070 ptAxis.SetTitle(
"#it{p}_{T}");
2073 "Primary transverse momentum",
2074 kCyan+2, 30, etaAxis, ptAxis);
2076 if (IsPrimary() || IsSecondary() || IsCombinatoric()) {
2078 "#Delta by primary particle type",
2079 kMagenta, 22, etaAxis, deltaAxis,
PdgAxis());
2089 fEtaIPz->SetMarkerStyle(m);
2090 fEtaIPz->SetMarkerColor(c);
2091 fEtaIPz->SetLineColor(c);
2092 fEtaIPz->SetFillColor(c);
2095 fEtaDeltaIPz->SetMarkerStyle(m);
2096 fEtaDeltaIPz->SetMarkerColor(c);
2097 fEtaDeltaIPz->SetLineColor(c);
2098 fEtaDeltaIPz->SetFillColor(c);
2101 fEtaDeltaPdg->SetMarkerStyle(m);
2102 fEtaDeltaPdg->SetMarkerColor(c);
2103 fEtaDeltaPdg->SetLineColor(c);
2104 fEtaDeltaPdg->SetFillColor(c);
2107 fEtaPdgIPz->SetMarkerStyle(m);
2108 fEtaPdgIPz->SetMarkerColor(c);
2109 fEtaPdgIPz->SetLineColor(c);
2110 fEtaPdgIPz->SetFillColor(c);
2113 fEtaPdg->SetMarkerStyle(m);
2114 fEtaPdg->SetMarkerColor(c);
2115 fEtaPdg->SetLineColor(c);
2116 fEtaPdg->SetFillColor(c);
2119 fEtaPt->SetMarkerStyle(m);
2120 fEtaPt->SetMarkerColor(c);
2121 fEtaPt->SetLineColor(c);
2122 fEtaPt->SetFillColor(c);
2130 if (DebugLevel() > 0) Printf(
"In user exec");
2132 const AliVVertex* ip = 0;
2133 TClonesArray* tracklets = 0;
2135 if ((status &
kOKEvent) != kOKEvent) {
2136 AliWarningF(
"Event didn't pass %f, %p, %p", cent, ip, tracklets);
2139 if (DebugLevel() > 0) Printf(
"Got centrality=%f ipZ=%f %d tracklets",
2140 cent, ip->GetZ(), tracklets->GetEntriesFast());
2150 return (1 << (bin-1));
2156 TH1* status =
new TH1F(
"status",
"Status of task",
2158 status->SetMarkerSize(2);
2159 status->SetMarkerColor(kMagenta+2);
2160 status->SetLineColor(kMagenta+2);
2161 status->SetFillColor(kMagenta+2);
2162 status->SetFillStyle(1001);
2163 status->SetBarOffset(0.1);
2164 status->SetBarWidth(0.4);
2165 status->SetDirectory(0);
2166 status->SetStats(0);
2167 status->SetXTitle(
"Event have");
2168 status->SetYTitle(
"# Events");
2169 status->GetXaxis()->SetBinLabel(
kAll,
"Been seen");
2170 status->GetXaxis()->SetBinLabel(
kEvent,
"Event data");
2171 status->GetXaxis()->SetBinLabel(
kTracklets,
"Tracklets");
2172 status->GetXaxis()->SetBinLabel(
kTrigger,
"Trigger");
2173 status->GetXaxis()->SetBinLabel(
kIP,
"IP");
2174 status->GetXaxis()->SetBinLabel(
kCentrality,
"Centrality");
2175 status->GetXaxis()->SetBinLabel(
kCompleted,
"Completed");
2176 container->Add(status);
2182 const AliVVertex*& ip,
2183 TClonesArray*& tracklets)
2190 AliVEvent*
event = InputEvent();
2192 AliWarning(
"No event");
2200 if (!tracklets)
return ret;
2206 if (!trg)
return ret;
2212 if (!ip)
return ret;
2217 Int_t nTracklets = 0;
2225 fIPz->Fill(ip->GetZ());
2242 if (!obj->IsA()->InheritsFrom(TClonesArray::Class())) {
2243 AliWarningF(
"Object %s is not a TClonesArray but a %s",
2244 obj->GetName(), obj->ClassName());
2247 return static_cast<TClonesArray*
>(obj);
2256 if (ip->GetNContributors() <= 0) {
2257 AliWarning(
"Not enough contributors for IP");
2261 if (ip->IsFromVertexerZ()) {
2264 ip->GetCovarianceMatrix(covar);
2265 Double_t sigmaZ = TMath::Sqrt(covar[5]);
2266 if (sigmaZ >= maxZError) {
2267 AliWarningF(
"IPz resolution = %f >= %f", sigmaZ, maxZError);
2272 if (ip->IsA()->InheritsFrom(AliVertex::Class())) {
2273 const AliVertex* ipv =
static_cast<const AliVertex*
>(ip);
2275 if (ipv->GetDispersion() >= maxDispersion) {
2276 AliWarningF(
"IP dispersion = %f >= %f",
2277 ipv->GetDispersion(), maxDispersion);
2286 AliWarningF(
"IPz = %fcm out of range [%f,%f]cm",
2298 const AliVVertex* ip =
event->GetPrimaryVertex();
2300 if (DebugLevel() > 1) AliWarning(
"No real IP for this event found!");
2303 return CheckIP(ip, maxDispersion, maxZError);
2311 static AliVertex* ip;
2314 ->FindListObject(
"AliAODSimpleHeader"));
2316 if (DebugLevel() > 1) AliWarning(
"No simple header");
2321 ip->SetXv(head->
fRecIP.X());
2322 ip->SetYv(head->
fRecIP.Y());
2323 ip->SetZv(head->
fRecIP.Z());
2324 ip->SetNContributors(10);
2326 return CheckIP(ip, maxDispersion, maxZError);
2334 const AliVVertex* ip =
FindRealIP(event,maxDispersion,maxZError);
2338 if (DebugLevel() > 1) AliWarning(
"No IP for this event found!");
2348 UInt_t evBits = fInputHandler->IsEventSelected();
2349 Bool_t trgOK = (evBits & fOfflineTriggerMask || fOfflineTriggerMask == 0);
2351 Printf(
"Trigger bits=0x%08x mask=0x%08x masked=0x%08x -> %s",
2352 evBits, fOfflineTriggerMask, evBits & fOfflineTriggerMask,
2353 trgOK ?
"selected" :
"rejected");
2360 if (centMeth.IsNull()) {
2363 AliCentrality* cent =
event->GetCentrality();
2364 if (!cent)
return -1;
2366 Double_t centPer = cent->GetCentralityPercentileUnchecked(centMeth);
2373 AliMultSelection* cent =
2374 static_cast<AliMultSelection*
>(
event->FindListObject(
"MultSelection"));
2376 AliWarning(
"No centrality in event");
2377 event->GetList()->Print();
2381 TString trkName(
"SPDTracklets");
2382 for (
Int_t i = 0; i < cent->GetNEstimators(); i++) {
2383 AliMultEstimator* e = cent->GetEstimator(i);
2386 if (trkName.EqualTo(e->GetName()))
fTrkIdx = i;
2390 AliWarningF(
"Centrality estimator %s not found",
fCentMethod.Data());
2395 AliMultEstimator* estCent = cent->GetEstimator(
fCentIdx);
2397 AliWarningF(
"Centrality estimator %s not available for this event",
2401 fCentEst->Fill(estCent->GetPercentile(), estCent->GetValue());
2404 if (
fTrkIdx < 0)
return estCent->GetPercentile();
2405 AliMultEstimator* estTracklets = cent->GetEstimator(
fTrkIdx);
2406 if (estTracklets) nTracklets = estTracklets->GetValue();
2408 return estCent->GetPercentile();
2415 if (
fCentMethod.EqualTo(
"MB", TString::kIgnoreCase)) {
2416 Printf(
"MB centrality - not checked");
2425 if (DebugLevel() > 1) Printf(
"Read centrality: %f%%", centPer);
2426 if (centPer < -safety)
return -2;
2427 if (centPer < +safety) centPer = safety;
2428 else if (centPer > 100-safety) centPer = 100-safety;
2431 AliWarningF(
"Centrality = %f lower than absolute minimum [%f]",
2436 AliWarningF(
"Centrality = %f out of range [%f,%f]",
2460 Double_t w = fWeights->LookupWeight(tracklet, cent, ipz, fWeightCorr);
2462 fEtaWeight->Fill(tracklet->
GetEta(), cent, w);
2487 const AliVVertex* ip,
2488 TClonesArray* tracklets)
2491 Double_t ipz = (ip ? ip->GetZ() : -1000);
2496 while ((bin = static_cast<CentBin*>(nextAcc()))) {
2498 if (!bin->
Accept(status, cent, ipz))
continue;
2503 if (nAcc <= 0)
return;
2511 TIter nextTracklet(tracklets);
2512 while ((tracklet = static_cast<AliAODTracklet*>(nextTracklet()))) {
2517 nMeasured += weight;
2520 else nGood += weight;
2524 TMath::Abs(tracklet->
GetEta()) <= 1) nGenerated ++;
2525 TIter nextBin(&toRun);
2526 while ((bin = static_cast<CentBin*>(nextBin()))) {
2530 TIter nextBin(&toRun);
2531 while ((bin = static_cast<CentBin*>(nextBin()))) {
2545 return fLow >= fHigh;
2552 Bool_t centOK = (IsAllBin() ||
2554 cent >= fLow && cent < fHigh));
2556 if (!centOK)
return false;
2573 fCentIPz->Fill(ipz, cent);
2587 if (fDebug > 3) tracklet->
Print();
2588 while ((h = static_cast<Histos*>(next())))
2599 if (!fEtaIPz && !fEtaDeltaIPz)
return true;
2603 UChar_t flags = tracklet->
GetFlags();
2609 if (fDebug > 3) Bits2String(flags, m);
2612 if (fMask != 0 && (flags & fMask) == 0) {
2613 if (fDebug > 3) Printf(
"%14s (0x%02x,----) %6s %7s (0x%02x) ",
2614 GetName(),fMask,
"reject",m,flags);
2619 if (fEtaPdgIPz || fEtaPdg || fEtaDeltaPdg) {
2627 if (fEtaPdg) fEtaPdg->Fill(eta, pdgBin, weight);
2630 if (fVeto != 0 && (flags & fVeto) != 0) {
2631 if (fDebug > 3) Printf(
"%14s (----,0x%02x) %6s %7s (0x%02x) ",
2632 GetName(), fVeto,
"veto", m, flags);
2636 if (fDebug > 3) Printf(
"%14s (0x%02x,0x%02x) %6s %7s (0x%02x) ",
2637 GetName(), fMask, fVeto,
"accept", m, flags);
2641 fEtaDeltaPdg ->Fill(eta, delta, pdgBin, weight);
2643 if (pdgBin2 >= 0) fEtaPdgIPz->Fill(eta, delta, pdgBin2, weight);
2647 if (fEtaIPz && (signal == 0x3)) fEtaIPz->Fill(eta, ipZ, weight);
2649 if (fEtaDeltaIPz && (signal & 0x2)) fEtaDeltaIPz->Fill(eta,delta,ipZ,weight);
2652 if (!fEtaPdgIPz && !fEtaPt)
return true;
2655 fEtaPdgIPz ->Fill(eta, pdgBin, ipZ, weight);
2657 if (pdgBin2 >= 0) fEtaPdgIPz->Fill(eta, pdgBin2, ipZ, weight);
2660 if (fEtaPt) fEtaPt ->Fill(eta, tracklet->
GetParentPt(), weight);
2675 TString resName; resName.Form(
"%sResults",GetName());
2676 if (GetOutputData(2)) {
2677 Warning(
"Terminate",
"Already have a result container, making a new one");
2678 resName.Append(
"New");
2681 results->SetName(resName);
2682 results->SetOwner();
2687 AliWarning(
"No sum container found!");
2692 AliWarningF(
"Failed to initialize centrality bins from %s",
2698 AliWarning(
"Failed to finalize results");
2702 PostData(2, results);
2717 while ((h = static_cast<Histos*>(next())))
2731 if (GetName()[0] ==
'm' &&
GetC(parent,
"generated")) {
2734 fEtaIPz->SetTitle(Form(
"%s'", fEtaIPz->GetTitle()));
2736 fEtaDeltaIPz->SetTitle(Form(
"#Delta_{%s}", fEtaIPz->GetTitle()));
2756 Printf(
"Event summary:");
2760 fStatus->GetXaxis()->GetBinLabel(i));
2761 for (
Int_t i = 1; i <=
fCent->GetNbinsX(); i++)
2762 Printf(
" %6.2f-%6.2f%%: %d",
2763 fCent->GetXaxis()->GetBinLowEdge(i),
2764 fCent->GetXaxis()->GetBinUpEdge(i),
2768 fIPz ->Scale(1./nEvents);
2776 while ((bin = static_cast<CentBin*>(next()))) {
2778 AliWarningF(
"Failed to finalize %s", bin->
GetName());
2790 if (o && o->IsA()->InheritsFrom(TH1::Class())) {
2791 TH1* h =
static_cast<TH1*
>(o->Clone());
2796 AliWarningF(
"Object %p (etaWeight) is not a TH1 or not found",o);
2799 if (o && o->IsA()->InheritsFrom(TH1::Class())) {
2800 TH1* h =
static_cast<TH1*
>(o->Clone());
2805 AliWarningF(
"Object %p (weightCorr) is not a TH1 or not found",o);
2807 if (!fWeights)
return true;
2809 if (!fWeights->Retrieve(
fContainer))
return false;
2810 fWeights->Store(results);
2823 result->SetName(fName);
2824 result->SetOwner(
true);
2825 parent->Add(result);
2828 status->Scale(1./status->GetBinContent(
kAll));
2831 Double_t vtxEff = status->GetBinContent(
kIP) / trigEff;
2834 result->Add(
new DP(
"triggerEfficiency", trigEff));
2835 result->Add(
new DP(
"ipEfficiency", vtxEff));
2840 ipZ->Scale(1./nEvents);
2843 cent->Scale(1./nEvents);
2852 while ((h = static_cast<Histos*>(next()))) {
2853 if (h->
GetMask() != AliAODTracklet::kInjection &&
2857 AliWarningF(
"Failed to finalize %s/%s", GetName(), h->
GetName());
2867 if (!EstimateBackground(result, measCont, genCont, h, tailDelta, tailMax)) {
2868 AliWarningF(
"Failed to estimate Bg in %s/%s", GetName(), h->
GetName());
2881 if (!fEtaPdg)
return true;
2884 TH2* etaPdg =
static_cast<TH2*
>(fEtaPdg->Clone());
2885 etaPdg->SetDirectory(0);
2886 etaPdg->Scale(1. / nEvents,
"width");
2887 result->Add(etaPdg);
2890 TAxis* yaxis = etaPdg->GetYaxis();
2891 Int_t first = yaxis->GetFirst();
2892 Int_t last = yaxis->GetLast();
2893 THStack* pdgs =
new THStack(
"all",
"");
2894 THStack* toPion =
new THStack(
"toPion",
"");
2895 THStack* toAll =
new THStack(
"toAll",
"");
2898 pdgOut->SetName(
"mix");
2899 result->Add(pdgOut);
2901 pdgOut->Add(toPion);
2904 TH1* all =
static_cast<TH1*
>(etaPdg->ProjectionX(
"total",
2905 1,etaPdg->GetNbinsY()));
2906 all->SetDirectory(0);
2907 all->SetName(
"total");
2908 all->SetTitle(
"All");
2909 all->SetYTitle(Form(
"d#it{N}_{%s}/d#eta",
"all"));
2910 all->SetFillColor(kBlack);
2911 all->SetMarkerColor(kBlack);
2912 all->SetLineColor(kBlack);
2913 all->SetMarkerStyle(20);
2914 all->SetFillStyle(0);
2915 all->SetFillColor(0);
2918 for (
Int_t i = 1; i <= etaPdg->GetNbinsY(); i++) {
2924 if (pdg < 0) pdg = 0;
2925 if (pdg == 22)
continue;
2927 TH1* h1 =
static_cast<TH1*
>(etaPdg->ProjectionX(Form(
"h%d", pdg),i,i));
2928 if (h1->GetEntries() <= 0)
continue;
2929 h1->SetDirectory(0);
2930 h1->SetName(Form(
"eta_%d", pdg));
2932 h1->SetYTitle(Form(
"d#it{N}_{%s}/d#eta", nme.Data()));
2933 h1->SetFillColor(col);
2934 h1->SetMarkerColor(col);
2935 h1->SetLineColor(col);
2936 h1->SetMarkerStyle(sty);
2937 h1->SetFillStyle(0);
2938 h1->SetFillColor(0);
2939 h1->SetBinContent(0,0);
2943 case 321: h1->SetBinContent(0, 0.15);
break;
2944 case 2212: h1->SetBinContent(0, 0.05);
break;
2945 case 310: h1->SetBinContent(0, 0.075);
break;
2946 case 3122: h1->SetBinContent(0, 0.018);
break;
2947 case 3212: h1->SetBinContent(0, 0.0055);
break;
2948 case 3322: h1->SetBinContent(0, 0.005);
break;
2949 case 211: h1->SetBinContent(0, 1);
break;
2950 default: h1->SetBinContent(0, -1);
break;
2954 if (pdg == 211) pion = h1;
2956 if (!pdgs->GetHists())
return true;
2958 TIter next(pdgs->GetHists());
2962 while ((tmp = static_cast<TH1*>(next()))) {
2963 if (tmp == all)
continue;
2965 TH1* rat =
static_cast<TH1*
>(tmp->Clone());
2967 rat->SetDirectory(0);
2968 rat->SetTitle(Form(
"%s / all", tmp->GetTitle()));
2971 if (tmp == pion)
continue;
2972 Double_t r276 = tmp->GetBinContent(0);
2973 if (r276 < 0 || r276 >= 1)
continue;
2976 rat =
static_cast<TH1*
>(tmp->Clone());
2978 rat->SetTitle(Form(
"%s / %s", tmp->GetTitle(), pion->GetTitle()));
2979 rat->SetDirectory(0);
2982 g->SetName(Form(
"%s_2760", rat->GetName()));
2983 g->SetTitle(Form(
"%s in #sqrt{s_{NN}}=2.76TeV", rat->GetTitle()));
2984 g->SetPoint(0,0,r276);
2985 g->SetPointError(0,.5,0);
2986 g->SetLineColor(rat->GetLineColor());
2987 g->SetLineStyle(rat->GetLineStyle());
2988 g->SetMarkerColor(rat->GetMarkerColor());
2989 g->SetMarkerStyle(rat->GetMarkerStyle());
2990 g->SetMarkerSize(1.5*rat->GetMarkerSize());
2991 rat->GetListOfFunctions()->Add(g,
"p");
2992 rat->SetMaximum(TMath::Max(rat->GetMaximum(),r276));
2993 rat->SetMinimum(TMath::Min(rat->GetMinimum(),r276));
2994 rmin = TMath::Min(rat->GetMinimum(),rmin);
2995 rmax = TMath::Max(rat->GetMaximum(),rmax);
3000 toPion->SetMaximum(1.1*rmax);
3015 pdgOut->SetName(pre);
3016 result->Add(pdgOut);
3017 TAxis* zaxis = fEtaDeltaPdg->GetZaxis();
3018 Int_t first = zaxis->GetFirst();
3019 Int_t last = zaxis->GetLast();
3021 Int_t nX = fEtaDeltaPdg->GetNbinsX();
3022 Int_t nY = fEtaDeltaPdg->GetNbinsY();
3023 Int_t nZ = fEtaDeltaPdg->GetNbinsZ();
3024 Int_t l1 = fEtaDeltaPdg->GetXaxis()->FindBin(-1);
3025 Int_t r1 = fEtaDeltaPdg->GetXaxis()->FindBin(+1);
3026 Int_t b1 = (isMid ? l1 : 1);
3027 Int_t b2 = (isMid ? r1 : l1-1);
3028 Int_t b3 = (isMid ? -1 : r1+1);
3029 Int_t b4 = (isMid ? -1 : nX);
3030 THStack* stack =
new THStack(
"all", tit);
3033 TH1* total = fEtaDeltaPdg->ProjectionY(
"totalMid",1, 1,1, nZ);
3034 total->SetDirectory(0);
3035 total->SetName(
"total");
3036 total->SetTitle(
"Total");
3037 total->SetYTitle(Form(
"d#it{N}_{%s}/d#Delta",
"total"));
3038 total->SetFillColor(kBlack);
3039 total->SetMarkerColor(kBlack);
3040 total->SetLineColor(kBlack);
3041 total->SetMarkerStyle(24);
3042 total->SetFillStyle(0);
3043 total->SetFillColor(0);
3047 THStack* ratios =
new THStack(
"ratios",
"");
3048 TH1* ratioSig =
Make1D(0,
"ratioSig",
"Ratio to all", kGreen+1, 24, *zaxis);
3049 TH1* ratioBg =
Make1D(0,
"ratioBg",
"Ratio to all", kRed+1, 25, *zaxis);
3050 ratioSig->GetXaxis()->LabelsOption(
"v");
3051 ratioBg ->GetXaxis()->LabelsOption(
"v");
3052 ratioSig->SetFillColor(kGreen+1);
3053 ratioBg ->SetFillColor(kRed +1);
3054 ratioSig->SetFillStyle(1001);
3055 ratioBg ->SetFillStyle(1001);
3056 ratioSig->SetBarWidth(0.4);
3057 ratioBg ->SetBarWidth(0.4);
3058 ratioSig->SetBarOffset(0.05);
3059 ratioBg ->SetBarOffset(0.55);
3060 ratios->Add(ratioSig,
"bar0 e text30");
3061 ratios->Add(ratioBg,
"bar0 e text30");
3062 pdgOut->Add(ratios);
3064 THStack* rows =
new THStack(
"rows",
"");
3065 TH1* rowSig =
new TH1D(
"rowSig",
"row",6,0,6);
3066 rowSig->SetDirectory(0);
3067 rowSig->SetYTitle(
"Fraction of signal");
3068 rowSig->GetXaxis()->SetBinLabel(1,
"K^{0}_{S}");
3069 rowSig->GetXaxis()->SetBinLabel(2,
"K^{#pm}");
3070 rowSig->GetXaxis()->SetBinLabel(3,
"#Lambda");
3071 rowSig->GetXaxis()->SetBinLabel(4,
"#Xi");
3072 rowSig->GetXaxis()->SetBinLabel(5,
"#Sigma");
3073 rowSig->GetXaxis()->SetBinLabel(6,
"Other");
3074 rowSig->GetXaxis()->LabelsOption(
"v");
3075 rowSig->SetMaximum(100);
3076 rowSig->SetMinimum(0);
3077 rowSig->SetLineColor(kGreen+1);
3078 rowSig->SetMarkerColor(kGreen+1);
3079 rowSig->SetMarkerStyle(24);
3080 TH1* rowBg =
static_cast<TH1*
>(rowSig->Clone(
"rowBg"));
3081 rowBg->SetDirectory(0);
3082 rowBg->SetYTitle(
"Fraction of background");
3083 rowBg->SetLineColor(kRed+1);
3084 rowBg->SetMarkerColor(kRed+1);
3085 rowBg->SetMarkerStyle(25);
3086 rowSig->SetFillStyle(1001);
3087 rowBg ->SetFillColor(1001);
3088 rowSig->SetFillColor(kGreen+1);
3089 rowBg ->SetFillColor(kRed +1);
3090 rowSig->SetBarWidth(0.4);
3091 rowBg ->SetBarWidth(0.4);
3092 rowSig->SetBarOffset(0.05);
3093 rowBg ->SetBarOffset(0.55);
3094 rows->Add(rowSig,
"bar0 e text30");
3095 rows->Add(rowBg,
"bar0 e text30");
3098 for (
Int_t i = 1; i <= zaxis->GetNbins(); i++) {
3105 if (pdg < 0) pdg = 0;
3106 ratioSig->GetXaxis()->SetBinLabel(i, nme);
3107 ratioBg ->GetXaxis()->SetBinLabel(i, nme);
3108 if (pdg == 22)
continue;
3111 TH1* h1 = fEtaDeltaPdg->ProjectionY(Form(
"%d", pdg), b1, b2, i,i);
3112 h1->SetDirectory(0);
3114 TH1* h2 = fEtaDeltaPdg->ProjectionY(Form(
"t%d", pdg), b3, b4, i,i);
3115 h2->SetDirectory(0);
3120 if (h1->GetEntries() <= 0)
continue;
3121 h1->SetName(Form(
"%d", pdg));
3123 h1->SetYTitle(Form(
"d#it{N}_{%s}/d#Delta", nme.Data()));
3124 h1->SetFillColor(col);
3125 h1->SetMarkerColor(col);
3126 h1->SetLineColor(col);
3127 h1->SetMarkerStyle(sty);
3128 h1->SetFillStyle(0);
3129 h1->SetFillColor(0);
3130 h1->SetBinContent(0,ipdg);
3134 total->SetBinContent(0,0);
3135 total->Scale(1./nEvents);
3141 TH1* totInt =
new TH1D(
"totalIntegrals",
"Integrals of total:", 3, 0, 3);
3142 totInt->SetDirectory(0);
3143 totInt->GetXaxis()->SetBinLabel(1,Form(
"0#minus%4.1f", tailMax));
3144 totInt->GetXaxis()->SetBinLabel(2,Form(
"0#minus%3.1f",deltaCut));
3145 totInt->GetXaxis()->SetBinLabel(3,Form(
"%3.1f#minus%4.1f",tailDelta,tailMax));
3146 totInt->SetBinContent(1,iTot); totInt->SetBinError(1, eTot);
3147 totInt->SetBinContent(2,iSig); totInt->SetBinError(2, eSig);
3148 totInt->SetBinContent(3,iBg); totInt->SetBinError(3, eBg);
3149 pdgOut->Add(totInt);
3151 if (!stack->GetHists())
return true;
3153 Double_t sigOth = 0, eSigOth = 0, bgOth = 0, eBgOth = 0;
3154 Double_t sigK0s = 0, eSigK0s = 0, bgK0s = 0, eBgK0s = 0;
3155 Double_t sigKpm = 0, eSigKpm = 0, bgKpm = 0, eBgKpm = 0;
3156 Double_t sigLam = 0, eSigLam = 0, bgLam = 0, eBgLam = 0;
3157 Double_t sigXi0 = 0, eSigXi0 = 0, bgXi0 = 0, eBgXi0 = 0;
3158 Double_t sigSig = 0, eSigSig = 0, bgSig = 0, eBgSig = 0;
3159 TIter next(stack->GetHists());
3161 while ((tmp = static_cast<TH1*>(next()))) {
3164 if (tmp == total)
continue;
3165 Int_t pdg = tmp->GetBinContent(0); tmp->SetBinContent(0,0);
3166 tmp->Scale(1./ nEvents);
3171 Int_t bin = tmp->GetUniqueID();
3173 Printf(
" %10s(%4d,%3d) "
3174 "signal=%6.1f/%6.1f=%5.3f+/-%5.3f bg=%6.1f/%6.1f=%5.3f+/-%5.3f",
3175 tmp->GetTitle(),
pdg, bin, iiSig, iSig, rS, erS, iiBg, iBg, rB, erB);
3177 ratioSig->SetBinContent(bin, rS);
3178 ratioSig->SetBinError (bin, erS);
3179 ratioBg ->SetBinContent(bin, rB);
3180 ratioBg ->SetBinError (bin, erB);
3184 sigKpm += rS; eSigKpm += erS*erS; bgKpm += rB; eBgKpm += erB*erB;
break;
3186 sigK0s += rS; eSigK0s += erS*erS; bgK0s += rB; eBgK0s += erB*erB;
break;
3196 sigSig += rS; eSigSig += erS*erS; bgSig += rB; eBgSig += erB*erB;
break;
3202 sigXi0 += rS; eSigXi0 += erS*erS; bgXi0 += rB; eBgXi0 += erB*erB;
break;
3205 sigLam += rS; eSigLam += erS*erS; bgLam += rB; eBgLam += erB*erB;
break;
3207 sigOth += rS; eSigOth += erS*erS; bgOth += rB; eBgOth += erB*erB;
break;
3210 rowSig->SetBinContent(1,100*sigK0s);
3211 rowSig->SetBinError (1,100*TMath::Sqrt(eSigK0s));
3212 rowSig->SetBinContent(2,100*sigKpm);
3213 rowSig->SetBinError (2,100*TMath::Sqrt(eSigKpm));
3214 rowSig->SetBinContent(3,100*sigLam);
3215 rowSig->SetBinError (3,100*TMath::Sqrt(eSigLam));
3216 rowSig->SetBinContent(4,100*sigXi0);
3217 rowSig->SetBinError (4,100*TMath::Sqrt(eSigXi0));
3218 rowSig->SetBinContent(5,100*sigSig);
3219 rowSig->SetBinError (5,100*TMath::Sqrt(eSigSig));
3220 rowSig->SetBinContent(6,100*sigOth);
3221 rowSig->SetBinError (6,100*TMath::Sqrt(eSigOth));
3222 rowBg ->SetBinContent(1,100* bgK0s);
3223 rowBg ->SetBinError (1,100*TMath::Sqrt( eBgK0s));
3224 rowBg ->SetBinContent(2,100* bgKpm);
3225 rowBg ->SetBinError (2,100*TMath::Sqrt( eBgKpm));
3226 rowBg ->SetBinContent(3,100* bgLam);
3227 rowBg ->SetBinError (3,100*TMath::Sqrt( eBgLam));
3228 rowBg ->SetBinContent(4,100* bgXi0);
3229 rowBg ->SetBinError (4,100*TMath::Sqrt( eBgXi0));
3230 rowBg ->SetBinContent(5,100* bgSig);
3231 rowBg ->SetBinError (5,100*TMath::Sqrt( eBgSig));
3232 rowBg ->SetBinContent(6,100* bgOth);
3233 rowBg ->SetBinError (6,100*TMath::Sqrt( eBgOth));
3246 if (!fEtaDeltaPdg)
return true;
3249 pdgOut->SetName(
"specie");
3250 result->Add(pdgOut);
3252 ProjectEtaDeltaPdgPart(pdgOut,
3258 ProjectEtaDeltaPdgPart(pdgOut,
3274 if (!fEtaPdgIPz)
return true;
3278 result->Add(etaPdgIPz);
3281 TAxis* yaxis = etaPdgIPz->GetYaxis();
3282 Int_t first = yaxis->GetFirst();
3283 Int_t last = yaxis->GetLast();
3284 THStack* pdgs =
new THStack(
"all",
"");
3285 THStack* ratios =
new THStack(
"toPion",
"");
3289 pdgOut->SetName(
"types");
3290 result->Add(pdgOut);
3292 pdgOut->Add(ratios);
3293 for (
Int_t i = 1; i <= etaPdgIPz->GetNbinsY(); i++) {
3294 yaxis->SetRange(i,i);
3301 if (pdg < 0) pdg = 0;
3303 TH2* h2 =
static_cast<TH2*
>(etaPdgIPz->Project3D(
"zx e"));
3304 if (h2->GetEntries() <= 0)
continue;
3305 h2->SetDirectory(0);
3306 h2->SetName(Form(
"etaIPz_%d", pdg));
3307 h2->SetTitle(Form(
"%s#rightarrowX_{%s}", nme.Data(), shn.Data()));
3308 h2->SetYTitle(Form(
"d#it{N}^{2}_{%s#rightarrow%s}/"
3309 "(d#etadIP_{#it{z}})",
3310 nme.Data(), shn.Data()));
3311 h2->SetFillColor(col);
3312 h2->SetMarkerColor(col);
3313 h2->SetLineColor(col);
3317 h1->SetDirectory(0);
3318 h1->SetYTitle(Form(
"d#it{N}_{%s#rightarrow%s}/d#eta",
3319 nme.Data(), shn.Data()));
3320 h1->SetMarkerStyle(sty);
3323 if (pdg == 211) pion = h1;
3352 dtfs =
static_cast<TH2*
>(tmp->Clone(
"dtfs"));
3353 dtfs->SetDirectory(0);
3354 dtfs->SetTitle(
"X_{s}#rightarrowX");
3355 dtfs->SetYTitle(
"IP_{#it{z}} [cm]");
3363 if (!pdgs->GetHists()) {
3364 yaxis->SetRange(first, last);
3368 TIter next(pdgs->GetHists());
3370 while ((tmp = static_cast<TH1*>(next()))) {
3371 if (tmp == pion)
continue;
3372 TH1* rat =
static_cast<TH1*
>(tmp->Clone());
3374 rat->SetDirectory(0);
3378 yaxis->SetRange(first, last);
3389 result->SetName(fName);
3390 result->SetOwner(
true);
3391 parent->Add(result);
3400 result->Add(etaIPz);
3404 TH2* etaPt =
static_cast<TH2*
>(fEtaPt->Clone());
3405 etaPt->SetDirectory(0);
3406 etaPt->Scale(1. / nEvents,
"width");
3410 TString shn(etaIPz ? etaIPz->GetTitle() :
"X");
3412 ProjectEtaPdg (result, nEvents);
3413 ProjectEtaDeltaPdg(result, nEvents, tailDelta, tailMax);
3414 ProjectEtaPdgIPz (result, ipz, shn);
3417 if (!fEtaDeltaIPz)
return true;
3423 result->Add(etaDeltaIPz);
3427 result->Add(etaDelta);
3434 Double_t maxDelta = etaDeltaIPz->GetYaxis()->GetXmax();
3435 Int_t lowBin = etaDeltaIPz->GetYaxis()->FindBin(tailDelta);
3436 Int_t sigBin = etaDeltaIPz->GetYaxis()->FindBin(1.5);
3437 Int_t highBin = TMath::Min(etaDeltaIPz->GetYaxis()->FindBin(tailMax),
3438 etaDeltaIPz->GetYaxis()->GetNbins());
3441 TH1* etaDeltaTail = etaDelta->ProjectionX(
"etaDeltaTail");
3442 etaDeltaTail ->SetDirectory(0);
3443 etaDeltaTail ->Reset();
3444 etaDeltaTail ->SetTitle(Form(
"#scale[.7]{#int}_{%3.1f}^{%4.1f}"
3447 etaDeltaIPz->GetTitle(),
3448 etaDeltaIPz->GetTitle()));
3449 etaDeltaTail ->SetYTitle(
"#scale[.7]{#int}_{tail}d#Delta d#it{N}/d#Delta");
3451 TH2* etaIPzDeltaTail =
static_cast<TH2*
>(etaDeltaIPz->Project3D(
"zx e"));
3452 etaIPzDeltaTail->SetName(
"etaIPzDeltaTail");
3453 etaIPzDeltaTail->SetDirectory(0);
3454 etaIPzDeltaTail->Reset();
3455 etaIPzDeltaTail->SetTitle(etaDeltaTail->GetTitle());
3456 etaIPzDeltaTail->SetZTitle(etaDelta->GetYaxis()->GetTitle());
3457 TH2* etaIPzDeltaMain =
static_cast<TH2*
>(etaDeltaIPz->Project3D(
"zx e"));
3458 etaIPzDeltaMain->SetName(
"etaIPzDeltaMain");
3459 etaIPzDeltaMain->SetDirectory(0);
3460 etaIPzDeltaMain->Reset();
3461 etaIPzDeltaMain->SetTitle(etaDeltaTail->GetTitle());
3462 etaIPzDeltaMain->SetZTitle(etaDelta->GetYaxis()->GetTitle());
3465 for (
Int_t i = 1; i <= etaDeltaTail->GetNbinsX(); i++) {
3467 intg = etaDelta->IntegralAndError(i, i, lowBin, highBin, eintg);
3468 etaDeltaTail->SetBinContent(i, intg);
3469 etaDeltaTail->SetBinError (i, eintg);
3471 for (
Int_t j = 1; j <= etaIPzDeltaTail->GetNbinsY(); j++) {
3473 intg = etaDeltaIPz->IntegralAndError(i,i,lowBin,highBin,j,j,eintg);
3474 etaIPzDeltaTail->SetBinContent(i, j, intg);
3475 etaIPzDeltaTail->SetBinError (i, j, eintg);
3477 intg = etaDeltaIPz->IntegralAndError(i,i,1,sigBin,j,j,eintg);
3478 etaIPzDeltaMain->SetBinContent(i, j, intg);
3479 etaIPzDeltaMain->SetBinError (i, j, eintg);
3482 result->Add(etaIPzDeltaTail);
3483 result->Add(etaIPzDeltaMain);
3484 result->Add(etaDeltaTail);
3487 intg = etaDeltaIPz->IntegralAndError(1,etaDeltaIPz->GetNbinsX(),
3489 1,etaDeltaIPz->GetNbinsZ(),
3496 Printf(
"%10s: Integral over eta,IPz: %9.4f +/- %9.4f",
3497 GetName(), intg, eintg);
3498 intg = etaDelta->IntegralAndError(1,etaDeltaIPz->GetNbinsX(),
3501 Printf(
"%10s: Integral over eta: %9.4f +/- %9.4f",
3502 GetName(), intg, eintg);
3503 intg = delta->IntegralAndError(lowBin, highBin, eintg);
3504 Printf(
"%10s: Integral: %9.4f +/- %9.4f",
3505 GetName(), intg, eintg);
3519 if (!h || !measCont) {
3520 AliWarningF(
"No sub-histos or measured container in %s", GetName());
3525 AliWarningF(
"Failed to finalize %s/%s", GetName(), h->
GetName());
3531 AliWarningF(
"%s/%s didn't put a container on output",
3535 const char* sub = h->
GetName();
3536 TString shrt(Form(
"%c", sub[0]));
3538 if (genCont) shrt.Append(
"'");
3540 TH2* background = 0;
3541 TH2* etaIPzScale = 0;
3547 etaIPzScale =
CopyH2(measCont,
"etaIPzDeltaTail",
3549 etaIPzScale->Divide(
GetH2(bgCont,
"etaIPzDeltaTail"));
3550 etaIPzScale->SetZTitle(
"k_{#eta,IP_{#it{z}}}");
3551 etaIPzScale->SetTitle(Form(
"k_{%s,#eta,IP_{#it{z}}}",shrt.Data()));
3552 bgCont->Add(etaIPzScale);
3558 TH1* etaScale =
CopyH1(measCont,
"etaDeltaTail",
3560 etaScale->Divide(
GetH1(bgCont,
"etaDeltaTail"));
3561 etaScale->SetYTitle(
"k_{#eta}");
3562 etaScale->SetTitle(Form(
"k_{%s,#eta}", shrt.Data()));
3563 bgCont->Add(etaScale);
3570 Double_t measIntE =
GetD(measCont,
"deltaTailError", -1);
3574 Double_t scale =
RatioE(measIntg, measIntE, bgIntg, bgIntE, scaleE);
3581 "scaleEtaDeltaIPz"),
3583 scaledEtaDeltaIPz->SetTitle(Form(
"%5.3f#times%s",
3584 scale, scaledEtaDeltaIPz->GetTitle()));
3585 scaledEtaDeltaIPz->SetDirectory(0);
3586 scaledEtaDeltaIPz->SetYTitle(
"k#timesd^{3}#it{N}/"
3587 "(d#Deltad#etadIP_{#it{z}})");
3588 bgCont->Add(scaledEtaDeltaIPz);
3592 TH2* scaledEtaDelta =
CopyH2(bgCont,
"etaDelta",
"scaledEtaDelta");
3593 scaledEtaDelta->SetTitle(scaledEtaDeltaIPz->GetTitle());
3594 scaledEtaDelta->SetZTitle(
"k#timesd^{2}#it{N}/(d#Deltad#eta)");
3595 Scale(scaledEtaDelta, etaScale);
3596 bgCont->Add(scaledEtaDelta);
3598 TH1* scaledDelta =
CopyH1(bgCont,
"delta",
"scaledDelta");
3599 scaledDelta->SetTitle(scaledEtaDeltaIPz->GetTitle());
3600 scaledDelta->SetYTitle(
"k#timesd#it{N}/d#Delta");
3601 Scale(scaledDelta,scale,scaleE);
3602 bgCont->Add(scaledDelta);
3606 scaledEtaDelta->SetName(
"scaledEtaDelta");
3607 scaledEtaDelta->SetTitle(scaledEtaDeltaIPz->GetTitle());
3608 scaledEtaDelta->SetYTitle(
"k#timesd^{2}#it{N}/(d#Deltad#eta)");
3609 bgCont->Add(scaledEtaDelta);
3613 scaledDelta->SetName(
"scaledDelta");
3614 scaledDelta->SetTitle(scaledEtaDeltaIPz->GetTitle());
3615 scaledDelta->SetYTitle(
"k#timesd#it{N}/d#Delta");
3616 bgCont->Add(scaledDelta);
3619 background =
CopyH2(bgCont,
"etaIPz",
"background");
3620 if (!background) AliWarningF(
"Didn't get background in %s", sub);
3621 else background->Multiply(etaIPzScale);
3628 background =
CopyH2(bgCont,
"etaIPz",
"background");
3629 TH2* beta =
CopyH2(bgCont,
"etaIPz",
"beta");
3630 if (!background || !beta)
3631 AliWarningF(
"Didn't get background or beta in %s", sub);
3633 beta->Divide(
GetH1(measCont,
"etaIPz"));
3634 beta->SetTitle(Form(
"#beta_{%s}", shrt.Data()));
3639 AliWarningF(
"Didn't get background in %s", sub);
3642 background->SetTitle(Form(
"#it{B}_{%s}", shrt.Data()));
3643 bgCont->Add(background);
3645 TH2* signal =
CopyH2(measCont,
"etaIPz",
"signal");
3647 AliWarningF(
"Didn't get signal in %s", sub);
3651 signal->SetTitle(Form(
"#it{S}_{%s}", shrt.Data()));
3652 signal->Add(background,-1);
3654 for (
Int_t i = 1; i <= signal->GetNbinsX(); i++) {
3655 for (
Int_t j = 1; j <= signal->GetNbinsX(); j++) {
3656 if (signal->GetBinContent(i,j)<1e-6) {
3657 signal->SetBinContent(i,j,0);
3658 signal->SetBinError (i,j,0);
3663 bgCont->Add(signal);
3668 alpha =
CopyH2(genCont,
"etaIPz",
"alpha");
3669 if (alpha && signal) {
3670 alpha->Divide(signal);
3671 alpha->SetTitle(Form(
"#alpha_{%s}", shrt.Data()));
3683 const char* weights,
3684 const char* sumFile,
3685 const char* resFile)
3689 ::Error(
"Create",
"No analysis manager to connect to.");
3694 if (weights && weights[0] !=
'\0') {
3698 TFile* wfile = TFile::Open(wurl.GetFile());
3700 ::Warning(
"Create",
"Failed to open weights file: %s",
3704 TString wnam(wurl.GetAnchor());
3705 if (wnam.IsNull()) wnam =
"weights";
3706 TObject* wobj = wfile->Get(wnam);
3708 ::Warning(
"Create",
"Failed to get weights %s from file %s",
3709 wnam.Data(), wfile->GetName());
3712 if (!wobj->IsA()->InheritsFrom(AliTrackletBaseWeights::Class())) {
3713 ::Warning(
"Create",
"Object %s from file %s not an "
3714 "AliTrackletBaseWeights but a %s",
3715 wnam.Data(), wfile->GetName(), wobj->ClassName());
3718 wret->
SetWeights(static_cast<AliTrackletBaseWeights*>(wobj));
virtual Bool_t ProcessTracklet(AliAODTracklet *tracklet, Double_t ipz, UShort_t signal, Double_t weight)=0
static TProfile * GetP1(Container *parent, const char *name, Bool_t verb=true)
virtual void SetWeights(AliTrackletBaseWeights *w)
Histos & operator=(const Histos &)
static const TAxis & PdgAxis()
static void PdgAttr(Int_t pdg, TString &nme, Color_t &c, Style_t &s)
static TH2 * Make2D(Container *c, const TString &name, const TString &title, Color_t color, Style_t style, const TAxis &xAxis, const TAxis &yAxis)
virtual void SetWeightCalc(UChar_t mode=0)
void Print(Option_t *option="") const
Bool_t Connect(const char *sumFile=0, const char *resFile=0)
const AliVVertex * CheckIP(const AliVVertex *ip, Double_t maxDispersion=0.04, Double_t maxZError=0.25)
virtual ~AliTrackletAODMCdNdeta()
virtual Bool_t FinalizeInit(Container *parent)=0
virtual void SetWeightMask(UChar_t mask=0xFF)
AliTrackletAODWeightedMCdNdeta & operator=(const AliTrackletAODWeightedMCdNdeta &o)
Bool_t MasterFinalize(Container *parent, TH1 *ipz, Double_t tailCut, Double_t tailMax)
Bool_t FinalizeInit(Container *parent)
static void PrintAxis(const TAxis &axis, Int_t nSig=2, const char *alt=0)
virtual Bool_t WorkerInit()
Double_t FindMultCentrality(AliVEvent *event, Int_t &nTracklets)
static void SetAxis(TAxis &axis, Int_t n, Double_t *borders)
virtual Double_t LookupWeight(AliAODTracklet *tracklet, Double_t cent, Double_t ipz)
Bool_t ProjectEtaDeltaPdg(Container *result, Int_t nEvents, Double_t tailCut, Double_t tailMax)
TProfile * fNGeneratedVsGood
Double_t FindCompatCentrality(AliVEvent *event)
virtual void SetWeightInverse(Bool_t inv)
static TProfile2D * Make2P(Container *c, const TString &name, const TString &title, Color_t color, Style_t style, const TAxis &xAxis, const TAxis &yAxis)
void ProcessEvent(UInt_t status, Double_t cent, const AliVVertex *ip, TClonesArray *tracklets)
static TH1 * GetH1(Container *parent, const char *name, Bool_t verb=true)
static const char * CentName(Double_t c1, Double_t c2)
void SetEtaAxis(Int_t n, Double_t max)
void Terminate(Option_t *)
Bool_t ProjectEtaDeltaPdgPart(Container *result, Int_t nEvents, Double_t tailDelta, Double_t tailMax, const TString &pre, const TString &tit)
static TH3 * ScaleDelta(TH3 *h, TH2 *scale)
Bool_t WorkerInit(Container *parent, const TAxis &etaAxis, const TAxis &ipzAxis, const TAxis &deltaAxis)
virtual void SetWeightVeto(UChar_t veto=0xFF)
TH1 * SetAttr(TH1 *h, Color_t color, Style_t marker=20, Double_t size=1., Style_t fill=0, Style_t line=1, Width_t width=1)
void SetMaxDelta(Double_t x=25)
ClassDef(AliTrackletAODdNdeta, 1)
static TH2 * ScaleToIPz(TH2 *h, TH1 *ipZ, Bool_t full=false)
static TH2 * ProjectEtaDelta(TH3 *h)
void SetCentralityAxis(const TString &spec)
static TH1 * AverageOverIPz(TH2 *h, const char *name, UShort_t mode, TH1 *ipz, TH2 *mask=0, Bool_t verb=true)
static TH1 * ProjectDelta(TH2 *h)
void SetWeightVeto(UChar_t veto=0x0)
static Double_t GetD(Container *parent, const char *name, Double_t def=-1, Bool_t verb=true)
TProfile * fNTrackletVsGood
virtual Real_t GetParentPt(Bool_t second=false) const
void SetTailDelta(Double_t x=5)
static TH3 * Make3D(Container *c, const TString &name, const TString &title, Color_t color, Style_t style, const TAxis &xAxis, const TAxis &yAxis, const TAxis &zAxis)
static TH1 * Scale(TH1 *h, Double_t x, Double_t xe)
Bool_t IsCombinatorics() const
CentBin & operator=(const CentBin &)
virtual ~AliTrackletAODWeightedMCdNdeta()
virtual Bool_t WorkerInit(Container *parent, const TAxis &etaAxis, const TAxis &ipzAxis, const TAxis &deltaAxis)
AliTrackletAODWeightedMCdNdeta()
void SetIPzAxis(Int_t n, Double_t max)
Utilities for midrapidity analysis.
void SetAbsMinCent(Double_t x=-1)
static TH1 * MakeStatus(Container *container)
CentBin & operator=(const CentBin &)
void Print(Option_t *option="") const
TClonesArray * FindTracklets(AliVEvent *event)
Bool_t MasterFinalize(Container *parent, TH1 *ipz, Double_t tailCut, Double_t tailMax)
void SetTailMaximum(Double_t x=-1)
void SetEtaAxis(Int_t n, Double_t min, Double_t max)
Bool_t IsSecondary() const
Bool_t InitCentBins(Container *existing)
virtual void SetDebug(UShort_t lvl)
Sub & operator=(const Sub &)
static Double_t Integrate(TH1 *h, Double_t min, Double_t max, Double_t &err)
void SetWeightInverse(Bool_t inv)
virtual Bool_t MasterFinalize(Container *parent, TH1 *ipz, Double_t tailCut, Double_t tailMax)=0
void SetCentralityMethod(const TString &name)
Bool_t FinalizeInit(Container *parent)
Encode simulation weights for 2nd pass.
const AliVVertex * FindIP(AliVEvent *event, Double_t maxDispersion=0.04, Double_t maxZError=0.25)
const AliVVertex * FindSimpleIP(AliVEvent *event, Double_t maxDispersion=0.04, Double_t maxZError=0.25)
void SetDPhiShift(Double_t x=0.0045)
static UInt_t Bin2Flag(UInt_t bin)
AliTrackletAODMCdNdeta(const AliTrackletAODdNdeta &o)
Double_t FindCentrality(AliVEvent *event, Int_t &nTracklets)
TProfile * fCentTracklets
virtual AliTrackletAODdNdeta::CentBin * MakeCentBin(Float_t c1, Float_t c2)
void SetShiftedDPhiCut(Double_t x=-1)
void Print(Option_t *option="") const
TProfile * fNGeneratedVsFake
void SetIPzAxis(Int_t n, Double_t min, Double_t max)
const AliVVertex * FindRealIP(AliVEvent *event, Double_t maxDispersion=0.04, Double_t maxZError=0.25)
Bool_t IsMeasured() const
static TH2 * CopyH2(Container *parent, const char *name, const char *newName=0, Bool_t verb=true)
virtual Short_t GetParentPdg(Bool_t second=false) const
AliTrackletAODWeightedMCdNdeta(const char *name)
virtual void Print(Option_t *option="") const
Bool_t EstimateBackground(Container *result, Container *measCont, Container *genCont, Histos *h, Double_t tailCut, Double_t tailMax)
void SetDeltaCut(Double_t x=1.5)
static TH1 * CopyH1(Container *parent, const char *name, const char *newName=0, Bool_t verb=true)
virtual const char * GetBranchName() const
static TH3 * GetH3(Container *parent, const char *name, Bool_t verb=true)
const char * GetName() const
static Double_t RatioE(Double_t n, Double_t en, Double_t d, Double_t ed, Double_t &er)
static TH2 * GetH2(Container *parent, const char *name, Bool_t verb=true)
Bool_t IsCombinatoric() const
static AliTrackletAODdNdeta * Create(Bool_t mc=false, const char *weights=0, const char *sumFile=0, const char *resFile=0)
Bool_t IsGenerated() const
Histos * MakeHistos(const char *name, Color_t color, Style_t style, UShort_t mask, UShort_t veto)
void UserExec(Option_t *)
void UserCreateOutputObjects()
AliTrackletAODMCdNdeta(const char *name)
Bool_t MasterFinalize(Container *results)
void SetPhiAxis(Int_t n, Double_t min, Double_t max)
Bool_t IsGenerated() const
Bool_t ProjectEtaPdgIPz(Container *result, TH1 *ipz, const TString &shn)
Bool_t IsDistinct() const
void SetAttr(Color_t c, Style_t m)
void SetEtaAxis(const TString &spec)
virtual Double_t LookupWeight(AliAODTracklet *tracklet, Double_t cent, Double_t ipz)
virtual void Print(Option_t *option="") const
static Container * GetC(Container *parent, const char *name, Bool_t verb=true)
CentBin(const CentBin &o)
static Int_t PdgBin(Int_t pdg)
AliTrackletAODWeightedMCdNdeta(const AliTrackletAODWeightedMCdNdeta &o)
Bool_t ProjectEtaPdg(Container *result, Int_t nEvents)
Bool_t ProcessTracklet(AliAODTracklet *tracklet, Double_t ipz, UShort_t signal, Double_t weight)
void Print(Option_t *option="") const
virtual UShort_t CheckTracklet(AliAODTracklet *tracklet) const
void SetIPzAxis(const TString &spec)
virtual Bool_t MasterFinalize(Container *results)
virtual ~AliTrackletAODdNdeta()
void SetWeightMask(UChar_t mask=0xFF)
AliTrackletBaseWeights * fWeights
UInt_t CheckEvent(Double_t ¢, const AliVVertex *&ip, TClonesArray *&tracklets)
static TH3 * CopyH3(Container *parent, const char *name, const char *newName=0, Bool_t verb=true)
Histos(const char *name="", Color_t color=kBlack, Style_t style=1, UChar_t mask=0, UChar_t veto=0)
static TObject * CloneAndAdd(Container *c, TObject *o)
CentBin(const CentBin &o)
virtual void SetDebug(UShort_t lvl)
void SetWeightCalc(UChar_t mode=0)
virtual const char * GetBranchName() const
Bool_t WorkerInit(Container *parent, const TAxis &etaAxis, const TAxis &ipzAxis, const TAxis &deltaAxis)
static TH1 * Make1D(Container *c, const TString &name, const TString &title, Color_t color, Style_t style, const TAxis &xAxis)
Bool_t Accept(UInt_t status, Double_t cent, Double_t ipz)
TProfile * fNTrackletVsFake
virtual CentBin * MakeCentBin(Float_t c1, Float_t c2)
static TProfile * Make1P(Container *c, const TString &name, const TString &title, Color_t color, Style_t style, const TAxis &xAxis)
Bool_t IsMeasured() const
Bool_t IsInjected() const
void SetPhiAxis(Int_t n, Double_t max)
static void FixAxis(TAxis &axis, const char *title=0)
virtual CentBin * InitCentBin(Int_t bin, Float_t c1, Float_t c2, Container *existing, const TAxis &deltaAxis)
void SetCentralityAxis(Int_t n, Double_t *bins)
void SetWeights(AliTrackletBaseWeights *w)
AliTrackletAODdNdeta & operator=(const AliTrackletAODdNdeta &o)
Bool_t ProcessTracklet(AliAODTracklet *tracklet, Double_t ipz, UShort_t signal, Double_t weight)
static TProfile * GetP(Container *parent, const char *name, Bool_t verb=true)
static void CopyAttr(const TH1 *src, TH1 *dest)