Skip to content

Commit 56db18f

Browse files
committed
Improve plotting style of the mass canvases
1 parent 92823fc commit 56db18f

File tree

3 files changed

+78
-58
lines changed

3 files changed

+78
-58
lines changed

PWGHF/D2H/Macros/HFInvMassFitter.cxx

Lines changed: 57 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
#include <cstring>
5151
#include <stdexcept>
5252
#include <string>
53+
#include <vector>
5354

5455
using namespace RooFit;
5556

@@ -564,65 +565,80 @@ void HFInvMassFitter::fillWorkspace(RooWorkspace& workspace) const
564565
}
565566

566567
// draw fit output
567-
void HFInvMassFitter::drawFit(TVirtualPad* pad, Int_t writeFitInfo)
568+
void HFInvMassFitter::drawFit(TVirtualPad* pad, const std::vector<std::string>& plotLabels, Bool_t writeParInfo)
568569
{
569570
gStyle->SetOptStat(0);
570571
gStyle->SetCanvasColor(0);
571572
gStyle->SetFrameFillColor(0);
572573
pad->cd();
573-
if (writeFitInfo > 0) {
574-
auto* textInfoLeft = new TPaveText(0.12, 0.65, 0.47, 0.89, "NDC");
575-
auto* textInfoRight = new TPaveText(0.6, 0.7, 1., .87, "NDC");
576-
textInfoLeft->SetBorderSize(0);
577-
textInfoLeft->SetFillStyle(0);
578-
textInfoRight->SetBorderSize(0);
579-
textInfoRight->SetFillStyle(0);
580-
textInfoRight->SetTextColor(kBlue);
581-
textInfoLeft->AddText(Form("S = %.0f #pm %.0f ", mRawYield, mRawYieldErr));
582-
textInfoLeft->AddText(Form("S_{count} = %.0f #pm %.0f ", mRawYieldCounted, mRawYieldCountedErr));
583-
if (mTypeOfBkgPdf != NoBkg) {
584-
textInfoLeft->AddText(Form("B (%d#sigma) = %.0f #pm %.0f", mNSigmaForSidebands, mBkgYield, mBkgYieldErr));
585-
textInfoLeft->AddText(Form("S/B (%d#sigma) = %.4g ", mNSigmaForSidebands, mRawYield / mBkgYield));
586-
}
587-
if (mReflPdf != nullptr) {
588-
textInfoLeft->AddText(Form("Refl/Sig = %.3f #pm %.3f ", mReflOverSgn, 0.0));
589-
}
590-
if (mTypeOfBkgPdf != NoBkg) {
591-
textInfoLeft->AddText(Form("Signif (%d#sigma) = %.1f #pm %.1f ", mNSigmaForSidebands, mSignificance, mSignificanceErr));
592-
textInfoLeft->AddText(Form("#chi^{2} / ndf = %.3f", mChiSquareOverNdfTotal));
593-
}
574+
// Fit metrics
575+
TPaveText* textFitMetrics = new TPaveText(0.65, 0.7, 0.9, 0.88, "NDC");
576+
textFitMetrics->SetBorderSize(0);
577+
textFitMetrics->SetFillStyle(0);
578+
textFitMetrics->SetTextSize(0.04);
579+
textFitMetrics->SetTextAlign(33);
580+
textFitMetrics->AddText(Form("S = %.0f #pm %.0f ", mRawYield, mRawYieldErr));
581+
if (mTypeOfBkgPdf != NoBkg) {
582+
textFitMetrics->AddText(Form("B (%d#sigma) = %.0f #pm %.0f", mNSigmaForSidebands, mBkgYield, mBkgYieldErr));
583+
textFitMetrics->AddText(Form("S/B (%d#sigma) = %.4g ", mNSigmaForSidebands, mRawYield / mBkgYield));
584+
}
585+
if (mReflPdf) {
586+
textFitMetrics->AddText(Form("Refl/Sig = %.3f #pm %.3f ", mReflOverSgn, 0.0));
587+
}
588+
if (mTypeOfBkgPdf != NoBkg) {
589+
textFitMetrics->AddText(Form("Significance (%d#sigma) = %.1f #pm %.1f ", mNSigmaForSidebands, mSignificance, mSignificanceErr));
590+
textFitMetrics->AddText(Form("#chi^{2} / ndf = %.3f", mChiSquareOverNdfTotal));
591+
}
592+
mInvMassFrame->addObject(textFitMetrics);
593+
// Analysis information
594+
TPaveText* textAnalysisInfo = new TPaveText(0.18, 0.78, 0.35, 0.88, "NDC");
595+
textAnalysisInfo->SetBorderSize(0);
596+
textAnalysisInfo->SetFillStyle(0);
597+
textAnalysisInfo->SetTextSize(0.05);
598+
textAnalysisInfo->SetTextAlign(13);
599+
for (const auto& label : plotLabels) {
600+
textAnalysisInfo->AddText(label.c_str());
601+
}
602+
mInvMassFrame->addObject(textAnalysisInfo);
603+
if (writeParInfo) {
604+
// right text box
605+
TPaveText* textSignalPar = new TPaveText(0.18, 0.65, 0.4, 0.75, "NDC");
606+
textSignalPar->SetBorderSize(0);
607+
textSignalPar->SetFillStyle(0);
608+
textSignalPar->SetTextColor(kBlue);
609+
textSignalPar->SetTextAlign(13);
594610
if (mFixedMean) {
595-
textInfoRight->AddText(Form("mean(fixed) = %.3f #pm %.3f", mRooMeanSgn->getVal(), mRooMeanSgn->getError()));
611+
textSignalPar->AddText(Form("mean(fixed) = %.3f #pm %.3f", mRooMeanSgn->getVal(), mRooMeanSgn->getError()));
596612
} else {
597-
textInfoRight->AddText(Form("mean(free) = %.3f #pm %.3f", mRooMeanSgn->getVal(), mRooMeanSgn->getError()));
613+
textSignalPar->AddText(Form("mean(free) = %.3f #pm %.3f", mRooMeanSgn->getVal(), mRooMeanSgn->getError()));
598614
}
599615
if (mTypeOfSgnPdf == DoubleGaus) {
600616
if (mFixedSigma) {
601-
textInfoRight->AddText(Form("sigma(fixed) = %.3f #pm %.3f", mRooSigmaSgn->getVal(), mRooSigmaSgn->getError()));
617+
textSignalPar->AddText(Form("sigma(fixed) = %.3f #pm %.3f", mRooSigmaSgn->getVal(), mRooSigmaSgn->getError()));
602618
} else {
603-
textInfoRight->AddText(Form("sigma(free) = %.3f #pm %.3f", mRooSigmaSgn->getVal(), mRooSigmaSgn->getError()));
619+
textSignalPar->AddText(Form("sigma(free) = %.3f #pm %.3f", mRooSigmaSgn->getVal(), mRooSigmaSgn->getError()));
604620
}
605621
if (mFixedSigmaDoubleGaus) {
606-
textInfoRight->AddText(Form("sigma 2(fixed) = %.3f #pm %.3f", mRooSecSigmaSgn->getVal(), mRooSecSigmaSgn->getError()));
622+
textSignalPar->AddText(Form("sigma 2(fixed) = %.3f #pm %.3f", mRooSecSigmaSgn->getVal(), mRooSecSigmaSgn->getError()));
607623
} else {
608-
textInfoRight->AddText(Form("sigma 2(free) = %.3f #pm %.3f", mRooSecSigmaSgn->getVal(), mRooSecSigmaSgn->getError()));
624+
textSignalPar->AddText(Form("sigma 2(free) = %.3f #pm %.3f", mRooSecSigmaSgn->getVal(), mRooSecSigmaSgn->getError()));
609625
}
610626
} else if (mFixedSigma) {
611-
textInfoRight->AddText(Form("sigma(fixed) = %.3f #pm %.3f", mRooSigmaSgn->getVal(), mRooSigmaSgn->getError()));
627+
textSignalPar->AddText(Form("sigma(fixed) = %.3f #pm %.3f", mRooSigmaSgn->getVal(), mRooSigmaSgn->getError()));
612628
} else {
613-
textInfoRight->AddText(Form("sigma(free) = %.3f #pm %.3f", mRooSigmaSgn->getVal(), mRooSigmaSgn->getError()));
614-
}
615-
mInvMassFrame->addObject(textInfoLeft);
616-
mInvMassFrame->addObject(textInfoRight);
617-
mInvMassFrame->GetYaxis()->SetTitleOffset(1.8);
618-
gPad->SetLeftMargin(0.15);
619-
mInvMassFrame->GetYaxis()->SetTitle(Form("%s", mHistoInvMass->GetYaxis()->GetTitle()));
620-
mInvMassFrame->GetXaxis()->SetTitle(Form("%s", mHistoInvMass->GetXaxis()->GetTitle()));
621-
mInvMassFrame->Draw();
622-
highlightPeakRegion(mInvMassFrame);
623-
if (mHistoTemplateRefl != nullptr) {
624-
mReflFrame->Draw("same");
629+
textSignalPar->AddText(Form("sigma(free) = %.3f #pm %.3f", mRooSigmaSgn->getVal(), mRooSigmaSgn->getError()));
625630
}
631+
mInvMassFrame->addObject(textSignalPar);
632+
}
633+
mInvMassFrame->GetXaxis()->SetTitleOffset(1.2);
634+
mInvMassFrame->GetYaxis()->SetTitleOffset(1.8);
635+
gPad->SetLeftMargin(0.15);
636+
mInvMassFrame->GetYaxis()->SetTitle(Form("%s", mHistoInvMass->GetYaxis()->GetTitle()));
637+
mInvMassFrame->GetXaxis()->SetTitle(Form("%s", mHistoInvMass->GetXaxis()->GetTitle()));
638+
mInvMassFrame->Draw();
639+
highlightPeakRegion(mInvMassFrame);
640+
if (mHistoTemplateRefl) {
641+
mReflFrame->Draw("same");
626642
}
627643
}
628644

PWGHF/D2H/Macros/HFInvMassFitter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ class HFInvMassFitter : public TNamed
230230
void calculateSignificance(Double_t& significance, Double_t& significanceErr) const;
231231
void checkForSignal(Double_t& estimatedSignal);
232232
void calculateFitToDataRatio();
233-
void drawFit(TVirtualPad* c, Int_t writeFitInfo = 2);
233+
void drawFit(TVirtualPad* c, const std::vector<std::string>& plotLabels, Bool_t writeParInfo = true);
234234
void drawResidual(TVirtualPad* c);
235235
void drawRatio(TVirtualPad* c);
236236
void drawReflection(TVirtualPad* c);

PWGHF/D2H/Macros/runMassFitter.C

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,13 @@ int runMassFitter(const TString& configFileName)
8787
config.ParseStream(is);
8888
fclose(configFile);
8989

90-
Bool_t const isMc = config["IsMC"].GetBool();
91-
TString const inputFileName = config["InFileName"].GetString();
92-
TString const reflFileName = config["ReflFileName"].GetString();
90+
Bool_t isMc = config["IsMC"].GetBool();
91+
Bool_t writeSignalPar = config["WriteSignalPar"].GetBool();
92+
TString inputFileName = config["InFileName"].GetString();
93+
TString reflFileName = config["ReflFileName"].GetString();
9394
TString outputFileName = config["OutFileName"].GetString();
94-
TString const particleName = config["Particle"].GetString();
95+
TString particleName = config["Particle"].GetString();
96+
TString collisionSystem = config["CollisionSystem"].GetString();
9597

9698
std::vector<std::string> inputHistoName;
9799
std::vector<std::string> promptHistoName;
@@ -207,19 +209,21 @@ int runMassFitter(const TString& configFileName)
207209
sgnFunc[iSliceVar] = sgnFuncConfig[iSliceVar];
208210
}
209211

210-
std::map<std::string, std::pair<std::string, std::string>> particles{
211-
{"Dplus", {"K#pi#pi", "D+"}},
212-
{"D0", {"K#pi", "D0"}},
213-
{"Ds", {"KK#pi", "D_s+"}},
214-
{"LcToPKPi", {"pK#pi", "Lambda_c+"}},
215-
{"LcToPK0s", {"pK^{0}_{s}", "Lambda_c+"}},
216-
{"Dstar", {"D^{0}pi^{+}", "D*+"}},
217-
{"XicToXiPiPi", {"#Xi#pi#pi", "Xi_c+"}}};
212+
std::map<std::string, std::tuple<std::string, std::string, std::string>> particles{
213+
{"Dplus", {"K#pi#pi", "D+", "D^{+} #rightarrow K^{-}#pi^{+}#pi^{+} + c.c."}},
214+
{"D0", {"K#pi", "D0", "D^{0} #rightarrow K^{-}#pi^{+} + c.c."}},
215+
{"Ds", {"KK#pi", "D_s+", "D_{s}^{+} #rightarrow K^{-}K^{+}#pi^{+} + c.c."}},
216+
{"LcToPKPi", {"pK#pi", "Lambda_c+", "#Lambda_{c}^{+} #rightarrow pK^{-}#pi^{+} + c.c."}},
217+
{"LcToPK0s", {"pK^{0}_{s}", "Lambda_c+", "#Lambda_{c}^{+} #rightarrow pK^{0}_{s} + c.c."}},
218+
{"Dstar", {"D^{0}pi^{+}", "D*+", "D^{*+} #rightarrow D^{0}#pi^{+} + c.c."}},
219+
{"XicToXiPiPi", {"#Xi#pi#pi", "Xi_c+", "#Xi_{c}^{+} #rightarrow #Xi^{-}#pi^{+}#pi^{+} + c.c."}}};
218220
if (particles.find(particleName.Data()) == particles.end()) {
219221
throw std::runtime_error("ERROR: only Dplus, D0, Ds, LcToPKPi, LcToPK0s, Dstar and XicToXiPiPi particles supported! Exit");
220222
}
221-
const TString massAxisTitle = "#it{M}(" + particles[particleName.Data()].first + ") (GeV/#it{c}^{2})";
222-
const double massPDG = TDatabasePDG::Instance()->GetParticle(particles[particleName.Data()].second.c_str())->Mass();
223+
const auto& particleTuple = particles[particleName.Data()];
224+
const TString massAxisTitle = "#it{M}(" + std::get<0>(particleTuple) + ") (GeV/#it{c}^{2})";
225+
const double massPDG = TDatabasePDG::Instance()->GetParticle(std::get<1>(particleTuple).c_str())->Mass();
226+
const std::vector<std::string> plotLabels = {std::get<2>(particleTuple), collisionSystem.Data()};
223227

224228
// load inv-mass histograms
225229
auto* inputFile = TFile::Open(inputFileName.Data());
@@ -426,7 +430,7 @@ int runMassFitter(const TString& configFileName)
426430
canvasMass[iCanvas]->cd();
427431
}
428432

429-
massFitter->drawFit(gPad);
433+
massFitter->drawFit(gPad, plotLabels, writeSignalPar);
430434

431435
const Double_t rawYield = massFitter->getRawYield();
432436
const Double_t rawYieldErr = massFitter->getRawYieldError();
@@ -571,7 +575,7 @@ int runMassFitter(const TString& configFileName)
571575
} else {
572576
canvasMass[iCanvas]->cd();
573577
}
574-
massFitter->drawFit(gPad);
578+
massFitter->drawFit(gPad, plotLabels, writeSignalPar);
575579
canvasMass[iCanvas]->Modified();
576580
canvasMass[iCanvas]->Update();
577581

0 commit comments

Comments
 (0)