8#include "BmnReportElement.h"
9#include "BmnHistManager.h"
10#include "BmnDrawHist.h"
16#include "BmnGemStripStationSet_RunSpring2017.h"
17#include "BmnGemStripStation.h"
18#include "TPaveStats.h"
43 nStationsGEM(nOfStationsGEM),
44 nStationsSil(nOfStationsSil)
52void BmnClusteringQaReport::Create() {
56 Out() << PrintEventInfo();
61string BmnClusteringQaReport::PrintEventInfo() {
62 Out() <<
"<h2>Event generator: QGSM</h2>" << endl;
63 Out() <<
"<h2>Energy: 4 GeV/n</h2>" << endl;
64 if (
GetOnlyPrimes())
Out() <<
"<h2>Results only for primaries presented</h2>" << endl;
65 Out() <<
"<h2>Number of events: " <<
HM()->
H1(
"hen_EventNo_ClusteringQa")->GetEntries() <<
"</h2>" << endl;
66 Out() <<
"<h2>Mean multiplicity: " <<
HM()->
H1(
"Multiplicity")->GetMean() <<
"</h2>" << endl;
70void BmnClusteringQaReport::DrawEventsInfo(
const string& canvasName) {
71 TCanvas* canvas =
CreateCanvas(canvasName.c_str(), canvasName.c_str(), 1500, 500);
82void BmnClusteringQaReport::DrawResXbyStation(
const string& canvasName) {
83 TCanvas* canvas =
CreateCanvas(canvasName.c_str(), canvasName.c_str(), 1600, 300*((nStationsGEM+nStationsSil)/4+1));
84 canvas->Divide(4, ((nStationsGEM+nStationsSil)/4+1));
86 for (Int_t
i = 0;
i < nStationsGEM; ++
i) {
88 TString resXname = Form(
"ResX_%dst_gem",
i);
91 for (Int_t
i = 0;
i < nStationsSil; ++
i) {
92 canvas->cd(
i + 1+nStationsGEM);
93 TString resXname = Form(
"ResX_%dst_sil",
i);
98void BmnClusteringQaReport::DrawResYbyStation(
const string& canvasName) {
99 TCanvas* canvas =
CreateCanvas(canvasName.c_str(), canvasName.c_str(), 1600, 300*((nStationsGEM+nStationsSil)/4+1));
100 canvas->Divide(4, ((nStationsGEM+nStationsSil)/4)+1);
102 for (Int_t
i = 0;
i < nStationsGEM; ++
i) {
104 TString resYname = Form(
"ResY_%dst_gem",
i);
107 for (Int_t
i = 0;
i < nStationsSil; ++
i) {
108 canvas->cd(
i + 1+nStationsGEM);
109 TString resYname = Form(
"ResY_%dst_sil",
i);
115void BmnClusteringQaReport::DrawSimXRecXbyStation(
const string& canvasName) {
116 TCanvas* canvas =
CreateCanvas(canvasName.c_str(), canvasName.c_str(), 1600, 300*((nStationsGEM+nStationsSil)/4+1));
117 canvas->Divide(4, (nStationsGEM/4+1+nStationsSil/4));
119 for (Int_t
i = 0;
i < nStationsGEM; ++
i) {
121 TString pntXhitXname = Form(
"PntX_vs_HitX_%dst_gem",
i);
124 for (Int_t
i = 0;
i < nStationsSil; ++
i) {
125 canvas->cd(
i + 1+nStationsGEM);
126 TString pntXhitXname = Form(
"PntX_vs_HitX_%dst_sil",
i);
131void BmnClusteringQaReport::DrawSimYRecYbyStation(
const string& canvasName) {
132 TCanvas* canvas =
CreateCanvas(canvasName.c_str(), canvasName.c_str(), 1600, 300*((nStationsGEM+nStationsSil)/4+1));
133 canvas->Divide(4, ((nStationsGEM+nStationsSil)/4+1));
135 for (Int_t
i = 0;
i < nStationsGEM; ++
i) {
137 TString pntYhitYname = Form(
"PntY_vs_HitY_%dst_gem",
i);
140 for (Int_t
i = 0;
i < nStationsSil; ++
i) {
141 canvas->cd(
i + 1+nStationsGEM);
142 TString pntYhitYname = Form(
"PntY_vs_HitY_%dst_sil",
i);
147void BmnClusteringQaReport::DrawOccupancyByStation(
const string& canvasName) {
148 TCanvas* canvas =
CreateCanvas(canvasName.c_str(), canvasName.c_str(), 1600, 300*((nStationsGEM+nStationsSil)/4+1));
149 canvas->Divide(4, ((nStationsGEM+nStationsSil)/4+1));
151 const Int_t nofEvents =
HM()->
H1(
"hen_EventNo_ClusteringQa")->GetEntries();
152 const Float_t xWidth =
HM()->
H2(
"Occupancy_0st_gem")->GetXaxis()->GetBinWidth(1);
153 const Float_t yWidth =
HM()->
H2(
"Occupancy_0st_gem")->GetYaxis()->GetBinWidth(1);
154 const Float_t square = xWidth * yWidth;
156 for (Int_t
i = 0;
i < nStationsGEM; ++
i) {
158 TString occupname = Form(
"Occupancy_%dst_gem",
i);
159 HM()->
H2(occupname.Data())->Sumw2();
160 HM()->
H2(occupname.Data())->Scale(1. / nofEvents / square);
164 for (Int_t
i = 0;
i < nStationsSil; ++
i) {
165 canvas->cd(
i + 1 + nStationsGEM);
166 TString occupname = Form(
"Occupancy_%dst_sil",
i);
167 HM()->
H2(occupname.Data())->Sumw2();
168 HM()->
H2(occupname.Data())->Scale(1. / nofEvents / square);
173void BmnClusteringQaReport::DrawPullXbyStation(
const string& canvasName) {
174 TCanvas* canvas =
CreateCanvas(canvasName.c_str(), canvasName.c_str(), 1600, 300*((nStationsGEM+nStationsSil)/4+1));
175 canvas->Divide(4, ((nStationsGEM+nStationsSil)/4+1));
177 for (Int_t
i = 0;
i < nStationsGEM; ++
i) {
179 TString pullXname = Form(
"PullX_%dst_gem",
i);
182 HM()->
H1(pullXname)->Fit(
"gaus",
"RRQW",
"", -5, 5);
183 TF1 *fit =
HM()->
H1(pullXname)->GetFunction(
"gaus");
185 Float_t xMax =
HM()->
H1(pullXname)->GetXaxis()->GetXmax();
186 Float_t yMax =
HM()->
H1(pullXname)->GetMaximum();
187 TPaveStats* ps =
new TPaveStats(xMax / 1.5, yMax / 5, xMax, yMax);
189 ps->SetShadowColor(0);
190 ps->AddText(Form(
"#mu = %2.2f", fit->GetParameter(1)));
191 ps->AddText(Form(
"#sigma = %2.2f", fit->GetParameter(2)));
195 for (Int_t
i = 0;
i < nStationsSil; ++
i) {
196 canvas->cd(
i + 1 + nStationsGEM);
197 TString pullXname = Form(
"PullX_%dst_sil",
i);
200 HM()->
H1(pullXname)->Fit(
"gaus",
"RRQW",
"", -5, 5);
201 TF1 *fit =
HM()->
H1(pullXname)->GetFunction(
"gaus");
203 Float_t xMax =
HM()->
H1(pullXname)->GetXaxis()->GetXmax();
204 Float_t yMax =
HM()->
H1(pullXname)->GetMaximum();
205 TPaveStats* ps =
new TPaveStats(xMax / 1.5, yMax / 5, xMax, yMax);
207 ps->SetShadowColor(0);
208 ps->AddText(Form(
"#mu = %2.2f", fit->GetParameter(1)));
209 ps->AddText(Form(
"#sigma = %2.2f", fit->GetParameter(2)));
215void BmnClusteringQaReport::DrawPullYbyStation(
const string& canvasName) {
216 TCanvas* canvas =
CreateCanvas(canvasName.c_str(), canvasName.c_str(), 1600, 300*((nStationsGEM+nStationsSil)/4+1));
217 canvas->Divide(4, ((nStationsGEM+nStationsSil)/4+1));
219 for (Int_t
i = 0;
i < nStationsGEM; ++
i) {
221 TString pullYname = Form(
"PullY_%dst_gem",
i);
224 HM()->
H1(pullYname)->Fit(
"gaus",
"RRQW",
"", -5, 5);
225 TF1 *fit =
HM()->
H1(pullYname)->GetFunction(
"gaus");
227 Float_t xMax =
HM()->
H1(pullYname)->GetXaxis()->GetXmax();
228 Float_t yMax =
HM()->
H1(pullYname)->GetMaximum();
229 TPaveStats* ps =
new TPaveStats(xMax / 1.5, yMax / 5, xMax, yMax);
231 ps->SetShadowColor(0);
232 ps->AddText(Form(
"#mu = %2.2f", fit->GetParameter(1)));
233 ps->AddText(Form(
"#sigma = %2.2f", fit->GetParameter(2)));
237 for (Int_t
i = 0;
i < nStationsSil; ++
i) {
238 canvas->cd(
i + 1 + nStationsGEM);
239 TString pullYname = Form(
"PullY_%dst_sil",
i);
242 HM()->
H1(pullYname)->Fit(
"gaus",
"RRQW",
"", -5, 5);
243 TF1 *fit =
HM()->
H1(pullYname)->GetFunction(
"gaus");
245 Float_t xMax =
HM()->
H1(pullYname)->GetXaxis()->GetXmax();
246 Float_t yMax =
HM()->
H1(pullYname)->GetMaximum();
247 TPaveStats* ps =
new TPaveStats(xMax / 1.5, yMax / 5, xMax, yMax);
249 ps->SetShadowColor(0);
250 ps->AddText(Form(
"#mu = %2.2f", fit->GetParameter(1)));
251 ps->AddText(Form(
"#sigma = %2.2f", fit->GetParameter(2)));
257string BmnClusteringQaReport::PrintNofObjects()
const {
267 return "NOT IMPLEMENTED!";
270void BmnClusteringQaReport::Draw() {
272 DrawEventsInfo(
"Distribution of impact parameter and multiplicity");
273 CalculateEfficiencyHistos(
"Acc",
"Rec",
"Eff");
274 CalculateEfficiencyHistos(
"Acc",
"Clone",
"CloneProb");
276 DrawOccupancyByStation(
"Occupancy for each station");
277 DrawResXbyStation(
"X-residuals for each station");
278 DrawResYbyStation(
"Y-residuals for each station");
279 DrawPullXbyStation(
"X-pulls for each station");
280 DrawPullYbyStation(
"Y-pulls for each station");
281 DrawSimXRecXbyStation(
"Reconstructed X vs. Simulated X for each station");
282 DrawSimYRecYbyStation(
"Reconstructed Y vs. Simulated Y for each station");
285 DrawNofObjectsHistograms(
"Gem",
"Event");
291 DrawNofObjectsHistograms(
"Gem",
"Station");
302 DrawResidualsAndPulls(
"Gem");
315void BmnClusteringQaReport::DrawNofObjectsHistograms(
const string& detName,
const string& parameter) {
329void BmnClusteringQaReport::DrawResidualsAndPulls(
const string& detName) {
365 if (histAcc->Integral() == 0 || histRec->Integral() == 0) {
368 return scale * Double_t(histRec->Integral()) / Double_t(histAcc->Integral());
372void BmnClusteringQaReport::ScaleAndShrinkHistograms() {}
374void BmnClusteringQaReport::DivideHistos(TH1* histo1, TH1* histo2, TH1* histo3, Double_t scale) {
378 histo3->Divide(histo1, histo2, 1., 1.,
"B");
379 histo3->Scale(scale);
382void BmnClusteringQaReport::CalculateEfficiencyHistos(
const string& acc,
const string& rec,
const string& eff) {}
Simulation report for clustering QA.
static Double_t CalcEfficiency(const TH1 *histRec, const TH1 *histAcc, Double_t scale)
BmnClusteringQaReport(Int_t nOfStationsGEM, Int_t nOfStationsSil)
Constructor.
virtual ~BmnClusteringQaReport()
Destructor.
TH2 * H2(const TString &name) const
Return pointer to TH2 histogram.
TH1 * H1(const TString &name) const
Return pointer to TH1 histogram.
virtual string Title(int size, const string &title) const =0
Return string with title.
virtual string DocumentBegin() const =0
Return string with open tags for document.
virtual string DocumentEnd() const =0
Return string with close tags of the document.
void SetReportName(TString name)
void PrintCanvases() const
Print images created from canvases in the report.
const BmnReportElement * R() const
Accessor to BmnReportElement object. User has to write the report using available tags from BmnReport...
TCanvas * CreateCanvas(const char *name, const char *title, Int_t ww, Int_t wh)
Create canvas and put it to vector of TCanvases. Canvases created with this function will be automati...
ostream & Out() const
All text output goes to this stream.
Base class for simulation reports.
BmnHistManager * HM() const
Return pointer to Histogram manager.
Bool_t GetOnlyPrimes() const
void DrawH2(TH2 *hist, HistScale logx=kLinear, HistScale logy=kLinear, HistScale logz=kLinear, const string &drawOpt="COLZ")
void DrawH1(TH1 *hist, HistScale logx=kLinear, HistScale logy=kLinear, const string &drawOpt="", Int_t color=BmnDrawingOptions::Color(0), Int_t lineWidth=BmnDrawingOptions::LineWidth(), Int_t lineStyle=BmnDrawingOptions::LineStyle(0), Float_t markerSize=BmnDrawingOptions::MarkerSize(), Int_t markerStyle=BmnDrawingOptions::MarkerStyle(0), Int_t fillColor=-1)
string FindAndReplace(const string &name, const string &oldSubstr, const string &newSubstr)
vector< string > Split(const string &name, char delimiter)
string NumberToString(const T &value, int precision=1)