BmnRoot 26.10.0-210-gc52d34b0
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnSimulationReport.cxx
Go to the documentation of this file.
1/**
2 * \file BmnSimulationReport.cxx
3 * \author Semen Lebedev <s.lebedev@gsi.de>
4 * \date 2011
5 */
6
7#include <fstream>
8#include <iostream>
9#include <string>
10// ROOT
11#include "TFile.h"
12// BmnRoot
13#include "BmnCSCStationSet.h"
14#include "BmnDrawHist.h"
16#include "BmnHistManager.h"
17#include "BmnReportElement.h"
18#include "BmnSiBTStationSet.h"
20#include "BmnSimulationReport.h"
21#include "BmnVSPStationSet.h"
22
23using std::cout;
24using std::ofstream;
25using std::string;
26
32
34
35void BmnSimulationReport::Create(BmnHistManager* histManager, const string& outputDir)
36{
37 fHM = histManager;
38 Create(outputDir);
39}
40
41void BmnSimulationReport::Create(const string& outputDir)
42{
43 printf("Creating report in %s", outputDir.c_str());
44 assert(fHM != NULL);
45 SetOutputDir(outputDir);
47}
48
49void BmnSimulationReport::Create(const string& fileName, const string& outputDir)
50{
51 assert(fHM == NULL);
52 fHM = new BmnHistManager();
53 TFile* file = new TFile(fileName.c_str());
54 fHM->ReadFromFile(file);
55 SetOutputDir(outputDir);
57 // delete fHM;
58 // delete file;
59}
60
62{
63 Out().precision(3);
64 Out() << R()->DocumentBegin();
65 Out() << R()->Title(0, GetTitle());
67 Out() << R()->DocumentEnd();
68}
69
70void BmnSimulationReport::DrawH1ByPattern(const string& histNamePattern)
71{
72 // vector<TH1*> histos = HM()->H1Vector(histNamePattern);
73 // Int_t nofHistos = histos.size();
74 // if (nofHistos < 1) return;
75 // for (UInt_t iHist = 0; iHist < nofHistos; iHist++) {
76 // TH1* hist = histos[iHist];
77 // string canvasName = GetReportName() + hist->GetName();
78 // TCanvas* canvas = CreateCanvas(canvasName.c_str(), canvasName.c_str(), 800, 500);
79 // DrawH1(hist, kLinear, kLinear);
80 // }
81}
82
83void BmnSimulationReport::DrawH1ByPattern(const string& histNamePattern,
84 string (*labelFormatter)(const string&, const BmnHistManager*))
85{
86 // vector<TH1*> histos = HM()->H1Vector(histNamePattern);
87 // Int_t nofHistos = histos.size();
88 // if (nofHistos < 1) return;
89 // string canvasName = GetReportName() + histos[0]->GetName();
90 // TCanvas* canvas = CreateCanvas(canvasName.c_str(), canvasName.c_str(), 600, 500);
91 //
92 // vector<string> labels(nofHistos);
93 // for (UInt_t iHist = 0; iHist < nofHistos; iHist++) {
94 // string name = histos[iHist]->GetName();
95 // labels[iHist] = labelFormatter(name, HM());
96 // }
97 //
98 // DrawH1(histos, labels, kLinear, kLinear, true, 0.3, 0.3, 0.85, 0.6, "PE1");
99}
100
101void BmnSimulationReport::DrawH2ByPattern(const string& histNamePattern,
102 HistScale logx,
103 HistScale logy,
104 HistScale logz,
105 const string& drawOpt)
106{
107 // vector<TH2*> histos = HM()->H2Vector(histNamePattern);
108 // Int_t nofHistos = histos.size();
109 // if (nofHistos < 1) return;
110 // for (UInt_t iHist = 0; iHist < nofHistos; iHist++) {
111 // TH2* hist = histos[iHist];
112 // string canvasName = GetReportName() + hist->GetName();
113 // TCanvas* canvas = CreateCanvas(canvasName.c_str(), canvasName.c_str(), 800, 500);
114 // DrawH2(hist, logx, logy, logz, drawOpt);
115 // }
116}
117
119{
120 pad->cd();
121 TF1* fit = h->GetFunction("gaus");
122 if (!fit)
123 return;
124 Float_t xMax = h->GetXaxis()->GetXmax();
125 Float_t yMax = h->GetMaximum();
126 TPaveStats* ps = new TPaveStats(xMax / 2, yMax / 2, xMax, yMax);
127 ps->SetFillColor(0);
128 ps->SetShadowColor(0);
129 ps->AddText(Form("#mu = %2.3f", fit->GetParameter(1)));
130 ps->AddText(Form("#sigma = %2.3f", fit->GetParameter(2)));
131 ps->Draw();
132}
133
135 const TString name1,
136 const TString drawOpt,
137 Int_t histW,
138 Int_t histH)
139{
140 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), histW, histH);
141 if (!fInitCanvasesDone) {
142 canvas->SetGrid();
143 }
144 canvas->cd();
145 DrawH1(/*canvas,*/ HM()->H1(name1), kLinear, kLog, drawOpt.Data(), kRed, 1, 0.75, 1.1, 20);
146}
147
149 const TString name1,
150 const TString name2,
151 const TString drawOpt,
152 Bool_t doFit,
153 Int_t histW,
154 Int_t histH)
155{
156 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), 2 * histW, histH);
157 if (!fInitCanvasesDone) {
158 canvas->SetGrid();
159 canvas->Divide(2, 1);
160 }
161 canvas->cd(1);
162 DrawH1(/*canvas,*/ HM()->H1(name1), kLinear, kLinear, drawOpt.Data(), kRed, 1, 0.75, 1.1, 20);
163 if ((doFit) && (HM()->H1(name1)->GetEntries() > MinNEntries4Fit)) {
164 HM()->H1(name1)->Fit("gaus", "WWQ");
165 DrawMuSigma(canvas->cd(1), HM()->H1(name1));
166 }
167 canvas->cd(2);
168 DrawH1(/*canvas,*/ HM()->H1(name2), kLinear, kLinear, drawOpt.Data(), kRed, 1, 0.75, 1.1, 20);
169 if ((doFit) && (HM()->H1(name2)->GetEntries() > MinNEntries4Fit)) {
170 HM()->H1(name2)->Fit("gaus", "WWQ");
171 DrawMuSigma(canvas->cd(2), HM()->H1(name2));
172 }
173}
174
175void BmnSimulationReport::DrawOneH2(const TString canvasName, const TString name1, Int_t histW, Int_t histH)
176{
177 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), histW, histH);
178 if (!fInitCanvasesDone) {
179 canvas->SetGrid();
180 }
181 canvas->cd();
182 DrawH2(/*canvas,*/ HM()->H2(name1), kLinear, kLinear, kLinear, "colz");
183}
184
186 const TString name1,
187 const TString name2,
188 Int_t w,
189 Int_t h)
190{
191 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), 2 * w, h);
192 if (!fInitCanvasesDone) {
193 canvas->SetGrid();
194 canvas->Divide(2, 1);
195 }
196 /*TVirtualPad *p = */ canvas->cd(1);
197 DrawH2(/*canvas,*/ HM()->H2(name1), kLinear, kLinear, kLinear, "colz");
198 canvas->cd(2);
199 DrawH2(/*canvas,*/ HM()->H2(name2), kLinear, kLinear, kLinear, "colz");
200 // canvas->Update();
201 // canvas->Modified();
202}
203
205 const TString name1,
206 const TString name2,
207 const TString name3,
208 Int_t histW,
209 Int_t histH)
210{
211 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), 3 * histW, histH);
212 if (!fInitCanvasesDone) {
213 canvas->SetGrid();
214 canvas->Divide(3, 1);
215 }
216 canvas->cd(1);
217 DrawH2(/*canvas,*/ HM()->H2(name1), kLinear, kLinear, kLinear, "colz");
218 canvas->cd(2);
219 DrawH2(/*canvas,*/ HM()->H2(name2), kLinear, kLinear, kLinear, "colz");
220 canvas->cd(3);
221 DrawH2(/*canvas,*/ HM()->H2(name3), kLinear, kLinear, kLinear, "colz");
222 canvas->Update();
223 canvas->Modified();
224}
225
227 const TString name1,
228 const TString name2,
229 const TString name3,
230 Int_t histW,
231 Int_t histH)
232{
233 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), 3 * histW, histH);
234 if (!fInitCanvasesDone) {
235 canvas->SetGrid();
236 canvas->Divide(3, 1);
237 }
238 canvas->cd(1);
239 DrawH1(/*canvas,*/ HM()->H1(name1), kLinear, kLinear, "", kBlue, 1, 0.75, 1.1, 20);
240 canvas->cd(2);
241 DrawH1(/*canvas,*/ HM()->H1(name2), kLinear, kLinear, "", kBlue, 1, 0.75, 1.1, 20);
242 canvas->cd(3);
243 DrawH1(/*canvas,*/ HM()->H1(name3), kLinear, kLinear, "", kBlue, 1, 0.75, 1.1, 20);
244}
245
247 const TString name1,
248 const TString name2,
249 const TString name3,
250 const TString name4,
251 Int_t histW,
252 Int_t histH)
253{
254 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), 2 * histW, 2 * histH);
255 if (!fInitCanvasesDone) {
256 canvas->SetGrid();
257 canvas->Divide(2, 2);
258 }
259 canvas->cd(1);
260 DrawH2(/*canvas,*/ HM()->H2(name1), kLinear, kLinear, kLinear, "colz");
261 canvas->cd(2);
262 DrawH2(/*canvas,*/ HM()->H2(name2), kLinear, kLinear, kLinear, "colz");
263 canvas->cd(3);
264 DrawH2(/*canvas,*/ HM()->H2(name3), kLinear, kLinear, kLinear, "colz");
265 canvas->cd(4);
266 DrawH2(/*canvas,*/ HM()->H2(name4), kLinear, kLinear, kLinear, "colz");
267 canvas->Update();
268 canvas->Modified();
269}
270
271void BmnSimulationReport::DrawNH2(const string canvasName,
272 const vector<string>& names,
273 Int_t histW,
274 Int_t histH,
275 Int_t ncols)
276{
277 Int_t n = names.size();
278 Int_t nx = ncols;
279 Int_t ny = n / nx + n % nx;
280 TCanvas* canvas = CreateCanvas(canvasName.data(), canvasName.data(), nx * histW, ny * histH);
281 if (!fInitCanvasesDone) {
282 canvas->SetGrid();
283 canvas->Divide(nx, ny, 0.01 / nx, 0.03 / ny);
284 }
285 Int_t iCan(0);
286 for (const TString s : names) {
287 canvas->cd(++iCan);
288 DrawH2(HM()->H2(s), kLinear, kLinear, kLinear, "colz");
289 // printf("Draw %s %f\n", s.Data(),(HM()->H2(s)->GetMaximum()));
290 }
291}
292
294{
295 switch (det) {
296 case kGEM:
298 case kCSC:
299 return BmnCSCStationSet::Class();
300 case kSILICON:
301 return BmnSiliconStationSet::Class();
302 case kSiBT:
303 return BmnSiBTStationSet::Class();
304 case kVSP:
305 return BmnVSPStationSet::Class();
306 default:
307 return nullptr;
308 }
309}
310
312{
313 for (auto& el : fDetStationSets) {
314 void* ss = el.second;
315 DetectorId detId = el.first;
316 TString detName;
318 TClass* station_set_class = GetStationSetClass(detId);
319 TMethodCall ns_method(station_set_class, "GetNStations", "");
320 Long_t method_result(0);
321 ns_method.Execute(ss, method_result);
322 Short_t n_stations = method_result;
323 // TMethodCall gs_method(station_set_class, "GetStation", "0");
324 string can_name = string(detName.Data()) + "_Hits_X_Y";
325 // if (detId==kCSC)
326 // printf("Draw CSC %s\n", can_name.data());
327 vector<string> st_names;
328 for (Short_t iSt = 0; iSt < n_stations; ++iSt)
329 st_names.push_back(HistNameHits(detName, iSt));
330 if (n_stations == 1)
331 DrawNH2(can_name, st_names, baseW, baseH, 1); // if it has only one station
332 else
333 DrawNH2(can_name, st_names);
334 }
335}
@ kSILICON
@ kGEM
@ kVSP
@ kCSC
@ kSiBT
void DrawH1(TH1 *hist, HistScale logx, HistScale logy, const string &drawOpt, Int_t lineColor, Int_t lineWidth, Int_t lineStyle, Float_t markerSize, Int_t markerStyle, Int_t fillColor)
void DrawH2(TH2 *hist, HistScale logx, HistScale logy, HistScale logz, const string &drawOpt)
Helper functions for drawing 1D and 2D histograms and graphs.
HistScale
Define linear or logarithmic scale for drawing.
Definition BmnDrawHist.h:64
@ kLinear
Definition BmnDrawHist.h:66
@ kLog
Definition BmnDrawHist.h:65
Histogram manager.
Abstract class for basic report elements (headers, tables, images etc.).
Base class for simulation reports.
const Int_t baseH
const Int_t baseW
bool Bool_t
int Int_t
long Long_t
float Float_t
short Short_t
constexpr Bool_t kFALSE
kRed
kBlue
char * Form(const char *fmt,...)
static void GetSystemNameCaps(DetectorId det, TString &name)
Get system name in capitals.
Histogram manager.
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 PrintCanvases() const
Print images created from canvases in the report.
const BmnReportElement * R() const
Accessor to BmnReportElement object.
Definition BmnReport.h:45
BmnReport()
Constructor.
Definition BmnReport.cxx:17
void SetOutputDir(const string &outputDir)
Definition BmnReport.h:58
TCanvas * CreateCanvas(const char *name, const char *title, Int_t ww, Int_t wh)
Create canvas and put it to vector of TCanvases.
Definition BmnReport.cxx:75
void CreateReports()
Create all available report types.
Definition BmnReport.cxx:54
ostream & Out() const
All text output goes to this stream.
Definition BmnReport.h:50
Bool_t fInitCanvasesDone
Definition BmnReport.h:123
BmnHistManager * HM() const
Return pointer to Histogram manager.
BmnSimulationReport()
Constructor.
static char * HistNameHits(string detName, Short_t iSt)
void DrawNH2(const string canvasName, const vector< string > &names, Int_t histW=baseW, Int_t histH=baseH, Int_t ncols=2)
void DrawTwoH2(const TString canvasName, const TString name1, const TString name2, Int_t histW=baseW, Int_t histH=baseH)
void DrawH1ByPattern(const string &histNamePattern)
Select by pattern TH1 histograms and draw each histogram on separate canvas.
void DrawThreeH2(const TString canvasName, const TString name1, const TString name2, const TString name3, Int_t histW=baseW, Int_t histH=baseH)
virtual ~BmnSimulationReport()
Destructor.
void DrawH2ByPattern(const string &histNamePattern, HistScale logx=kLinear, HistScale logy=kLinear, HistScale logz=kLinear, const string &drawOpt="")
Select by pattern TH2 histograms and draw each histogram on separate canvas.
static TClass * GetStationSetClass(DetectorId det)
void DrawTwoH1(const TString canvasName, const TString name1, const TString name2, const TString drawOpt, Bool_t doFit=kFALSE, Int_t histW=baseW, Int_t histH=baseH)
void Create()
Pure abstract function which is called from public Create() function.
void DrawFourH2(const TString canvasName, const TString name1, const TString name2, const TString name3, const TString name4, Int_t histW=baseW, Int_t histH=baseH)
map< DetectorId, void * > fDetStationSets
void DrawOneH2(const TString canvasName, const TString name1, Int_t histW=baseW, Int_t histH=baseH)
void DrawMuSigma(TVirtualPad *pad, TH1 *h)
void DrawThreeH1(const TString canvasName, const TString name1, const TString name2, const TString name3, Int_t histW=baseW, Int_t histH=baseH)
void DrawOneH1(const TString canvasName, const TString name1, const TString drawOpt, Int_t histW=baseW, Int_t histH=baseH)
virtual void SetFillColor(Color_t fcolor)
Double_t GetXmax() const
TVirtualPad * cd(Int_t subpadnumber=0) override
void Update() override
virtual Double_t GetParameter(const TString &name) const
TAxis * GetXaxis()
virtual TFitResultPtr Fit(const char *formula, Option_t *option="", Option_t *goption="", Double_t xmin=0, Double_t xmax=0)
virtual Double_t GetMaximum(Double_t maxval=FLT_MAX) const
virtual TF1 * GetFunction(const char *name) const
void Execute()
static TClass * Class()
virtual const char * GetTitle() const
void SetGrid(Int_t valuex=1, Int_t valuey=1) override
void Divide(Int_t nx=1, Int_t ny=1, Float_t xmargin=0.01, Float_t ymargin=0.01, Int_t color=0) override
void Modified(Bool_t flag=true) override
virtual TText * AddText(const char *label)
void Draw(Option_t *option="") override
virtual void SetShadowColor(Int_t color)
const char * Data() const
virtual TVirtualPad * cd(Int_t subpadnumber=0)=0