BmnRoot
Loading...
Searching...
No Matches
BmnSimulationReport.cxx
Go to the documentation of this file.
1
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"
15#include "BmnGemStripStationSet.h"
16#include "BmnHistManager.h"
17#include "BmnReportElement.h"
18#include "BmnSiBTStationSet.h"
19#include "BmnSiliconStationSet.h"
20#include "BmnSimulationReport.h"
21#include "BmnVSPStationSet.h"
22
23using std::cout;
24using std::ofstream;
25using std::string;
26
28 : BmnReport()
29 , fHM(NULL)
30 , fPrimes(kFALSE)
31{}
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
118void BmnSimulationReport::DrawMuSigma(TVirtualPad* pad, TH1* h)
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
134void BmnSimulationReport::DrawOneH1(const TString canvasName,
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
148void BmnSimulationReport::DrawTwoH1(const TString canvasName,
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
185void BmnSimulationReport::DrawTwoH2(const TString canvasName,
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
204void BmnSimulationReport::DrawThreeH2(const TString canvasName,
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
226void BmnSimulationReport::DrawThreeH1(const TString canvasName,
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
246void BmnSimulationReport::DrawFourH2(const TString canvasName,
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:
297 return BmnGemStripStationSet::Class();
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}
Helper functions for drawing 1D and 2D histograms and graphs.
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
DetectorId
@ kSILICON
@ kGEM
@ kVSP
@ kCSC
@ kSiBT
static void GetSystemNameCaps(DetectorId det, TString &name)
Histogram manager.
TH1 * H1(const TString &name) const
Return pointer to TH1 histogram.
void ReadFromFile(TFile *file)
Read histograms from file.
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.
Base class for reports.
Definition BmnReport.h:29
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...
Definition BmnReport.h:45
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. Canvases created with this function will be automati...
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. This function has to write repo...
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)
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)
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)
HistScale
Define linear or logarithmic scale for drawing.
Definition BmnDrawHist.h:69
@ kLinear
Definition BmnDrawHist.h:71
@ kLog
Definition BmnDrawHist.h:70