BmnRoot
Loading...
Searching...
No Matches
BmnClusteringQaReport.cxx
Go to the documentation of this file.
1
8#include "BmnReportElement.h"
9#include "BmnHistManager.h"
10#include "BmnDrawHist.h"
11#include "BmnUtils.h"
12#include "TH1.h"
13#include "TF1.h"
14#include "TProfile.h"
15#include "TCanvas.h"
16#include "BmnGemStripStationSet_RunSpring2017.h"
17#include "BmnGemStripStation.h"
18#include "TPaveStats.h"
19
20#include <vector>
21using namespace std;
23using lit::Split;
25
26//string DefaultHitEfficiencyLabelFormatter(const string& histName, const BmnHistManager* hm) {
27// Double_t efficiency = (histName.find("_Eff_") != string::npos) ?
28// BmnClusteringQaReport::CalcEfficiency(hm->H1(FindAndReplace(histName, "_Eff_", "_Rec_")), hm->H1(FindAndReplace(histName, "_Eff_", "_Acc_")), 100.) :
29// BmnClusteringQaReport::CalcEfficiency(hm->H1(FindAndReplace(histName, "_CloneProb_", "_Clone_")), hm->H1(FindAndReplace(histName, "_CloneProb_", "_Acc_")), 100.);
30// vector<string> split = Split(histName, '_');
31// return split[1] + ":" + split[3] + "(" + NumberToString<Double_t > (efficiency, 1) + ")";
32//}
33//
34//string DefaultAccAndRecLabelFormatter(const string& histName, const BmnHistManager* hm) {
35// Int_t nofEvents = hm->H1("_hen_EventNo_ClusteringQa")->GetEntries();
36// vector<string> split = Split(histName, '_');
37// return split[3] + " (" + NumberToString<Double_t > (hm->H1(histName)->GetEntries() / nofEvents, 1) + ")";
38//}
39
40BmnClusteringQaReport::BmnClusteringQaReport(Int_t nOfStationsGEM, Int_t nOfStationsSil)
42 fGemDetector(NULL),
43 nStationsGEM(nOfStationsGEM),
44 nStationsSil(nOfStationsSil)
45{
46 SetReportName("clustering_qa");
47}
48
51
52void BmnClusteringQaReport::Create() {
53 Out().precision(3);
54 Out() << R()->DocumentBegin();
55 Out() << R()->Title(0, GetTitle());
56 Out() << PrintEventInfo();
58 Out() << R()->DocumentEnd();
59}
60
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;
67 return "<hr>";
68}
69
70void BmnClusteringQaReport::DrawEventsInfo(const string& canvasName) {
71 TCanvas* canvas = CreateCanvas(canvasName.c_str(), canvasName.c_str(), 1500, 500);
72 canvas->SetGrid();
73 canvas->Divide(3, 1);
74 canvas->cd(1);
75 DrawH1(HM()->H1("Impact parameter"), kLinear, kLinear, "", kRed, 2, 1, 1.1, 20, 33);
76 canvas->cd(2);
77 DrawH1(HM()->H1("Multiplicity"), kLinear, kLinear, "", kRed, 2, 1, 1.1, 20, 33);
78 canvas->cd(3);
79 DrawH2(HM()->H2("Impact_Mult"), kLinear, kLinear, kLinear, "colz");
80}
81
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));
85 canvas->SetGrid();
86 for (Int_t i = 0; i < nStationsGEM; ++i) {
87 canvas->cd(i + 1);
88 TString resXname = Form("ResX_%dst_gem", i);
89 DrawH1(HM()->H1(resXname.Data()), kLinear, kLog);
90 }
91 for (Int_t i = 0; i < nStationsSil; ++i) {
92 canvas->cd(i + 1+nStationsGEM);
93 TString resXname = Form("ResX_%dst_sil", i);
94 DrawH1(HM()->H1(resXname.Data()), kLinear, kLog);
95 }
96}
97
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);
101 canvas->SetGrid();
102 for (Int_t i = 0; i < nStationsGEM; ++i) {
103 canvas->cd(i + 1);
104 TString resYname = Form("ResY_%dst_gem", i);
105 DrawH1(HM()->H1(resYname.Data()), kLinear, kLog);
106 }
107 for (Int_t i = 0; i < nStationsSil; ++i) {
108 canvas->cd(i + 1+nStationsGEM);
109 TString resYname = Form("ResY_%dst_sil", i);
110 DrawH1(HM()->H1(resYname.Data()), kLinear, kLog);
111 }
112
113}
114
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));
118 canvas->SetGrid();
119 for (Int_t i = 0; i < nStationsGEM; ++i) {
120 canvas->cd(i + 1);
121 TString pntXhitXname = Form("PntX_vs_HitX_%dst_gem", i);
122 DrawH2(HM()->H2(pntXhitXname.Data()), kLinear, kLinear, kLinear, "colz");
123 }
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);
127 DrawH2(HM()->H2(pntXhitXname.Data()), kLinear, kLinear, kLinear, "colz");
128 }
129}
130
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));
134 canvas->SetGrid();
135 for (Int_t i = 0; i < nStationsGEM; ++i) {
136 canvas->cd(i + 1);
137 TString pntYhitYname = Form("PntY_vs_HitY_%dst_gem", i);
138 DrawH2(HM()->H2(pntYhitYname.Data()), kLinear, kLinear, kLinear, "colz");
139 }
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);
143 DrawH2(HM()->H2(pntYhitYname.Data()), kLinear, kLinear, kLinear, "colz");
144 }
145}
146
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));
150 canvas->SetGrid();
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; //cm^2
155
156 for (Int_t i = 0; i < nStationsGEM; ++i) {
157 canvas->cd(i + 1);
158 TString occupname = Form("Occupancy_%dst_gem", i);
159 HM()->H2(occupname.Data())->Sumw2();
160 HM()->H2(occupname.Data())->Scale(1. / nofEvents / square);
161 DrawH2(HM()->H2(occupname.Data()), kLinear, kLinear, kLinear, "colz");
162 }
163
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);
169 DrawH2(HM()->H2(occupname.Data()), kLinear, kLinear, kLinear, "colz");
170 }
171}
172
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));
176 canvas->SetGrid();
177 for (Int_t i = 0; i < nStationsGEM; ++i) {
178 canvas->cd(i + 1);
179 TString pullXname = Form("PullX_%dst_gem", i);
180 DrawH1(HM()->H1(pullXname.Data()), kLinear, kLinear,"", kBlue);
181
182 HM()->H1(pullXname)->Fit("gaus", "RRQW", "", -5, 5);
183 TF1 *fit = HM()->H1(pullXname)->GetFunction("gaus");
184
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);
188 ps->SetFillColor(0);
189 ps->SetShadowColor(0);
190 ps->AddText(Form("#mu = %2.2f", fit->GetParameter(1)));
191 ps->AddText(Form("#sigma = %2.2f", fit->GetParameter(2)));
192 ps->Draw();
193 }
194
195 for (Int_t i = 0; i < nStationsSil; ++i) {
196 canvas->cd(i + 1 + nStationsGEM);
197 TString pullXname = Form("PullX_%dst_sil", i);
198 DrawH1(HM()->H1(pullXname.Data()), kLinear, kLinear,"", kBlue);
199
200 HM()->H1(pullXname)->Fit("gaus", "RRQW", "", -5, 5);
201 TF1 *fit = HM()->H1(pullXname)->GetFunction("gaus");
202
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);
206 ps->SetFillColor(0);
207 ps->SetShadowColor(0);
208 ps->AddText(Form("#mu = %2.2f", fit->GetParameter(1)));
209 ps->AddText(Form("#sigma = %2.2f", fit->GetParameter(2)));
210 ps->Draw();
211
212 }
213}
214
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));
218 canvas->SetGrid();
219 for (Int_t i = 0; i < nStationsGEM; ++i) {
220 canvas->cd(i + 1);
221 TString pullYname = Form("PullY_%dst_gem", i);
222 DrawH1(HM()->H1(pullYname.Data()), kLinear, kLinear,"", kBlue);
223
224 HM()->H1(pullYname)->Fit("gaus", "RRQW", "", -5, 5);
225 TF1 *fit = HM()->H1(pullYname)->GetFunction("gaus");
226
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);
230 ps->SetFillColor(0);
231 ps->SetShadowColor(0);
232 ps->AddText(Form("#mu = %2.2f", fit->GetParameter(1)));
233 ps->AddText(Form("#sigma = %2.2f", fit->GetParameter(2)));
234 ps->Draw();
235 }
236
237 for (Int_t i = 0; i < nStationsSil; ++i) {
238 canvas->cd(i + 1 + nStationsGEM);
239 TString pullYname = Form("PullY_%dst_sil", i);
240 DrawH1(HM()->H1(pullYname.Data()), kLinear, kLinear,"", kBlue);
241
242 HM()->H1(pullYname)->Fit("gaus", "RRQW", "", -5, 5);
243 TF1 *fit = HM()->H1(pullYname)->GetFunction("gaus");
244
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);
248 ps->SetFillColor(0);
249 ps->SetShadowColor(0);
250 ps->AddText(Form("#mu = %2.2f", fit->GetParameter(1)));
251 ps->AddText(Form("#sigma = %2.2f", fit->GetParameter(2)));
252 ps->Draw();
253 }
254}
255
256
257string BmnClusteringQaReport::PrintNofObjects() const {
258// vector<TH1*> histos = HM()->H1Vector("_hno_NofObjects_.+_Event");
259// Int_t nofHistos = histos.size();
260// string str = R()->TableBegin("Average number of objects per event", list_of("Name")("Value"));
261// for (Int_t iHist = 0; iHist < nofHistos; iHist++) {
262// string cellName = Split(histos[iHist]->GetName(), '_')[3];
263// str += R()->TableRow(list_of(cellName)(NumberToString<Int_t > (histos[iHist]->GetMean())));
264// }
265// str += R()->TableEnd();
266// return str;
267 return "NOT IMPLEMENTED!";
268}
269
270void BmnClusteringQaReport::Draw() {
271
272 DrawEventsInfo("Distribution of impact parameter and multiplicity");
273 CalculateEfficiencyHistos("Acc", "Rec", "Eff");
274 CalculateEfficiencyHistos("Acc", "Clone", "CloneProb");
275
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");
283
284
285 DrawNofObjectsHistograms("Gem", "Event");
286 // DrawNofObjectsHistograms("Tof1", "Event");
287 // DrawNofObjectsHistograms("Dch1", "Event");
288 // DrawNofObjectsHistograms("Dch2", "Event");
289 // DrawNofObjectsHistograms("Tof2", "Event");
290
291 DrawNofObjectsHistograms("Gem", "Station");
292
293 // DrawH1ByPattern("hpa_.*Cluster_NofDigisInCluster_H1");
294 // DrawH2ByPattern("hpa_.*Cluster_NofDigisInCluster_H2", kLinear, kLinear, kLinear, "colz");
295
296 // DrawH1ByPattern("hpa_.*(Digi|Cluster|Hit)_NofPointsIn(Digi|Cluster|Hit)_H1");
297 // DrawH2ByPattern("hpa_.*(Digi|Cluster|Hit)_NofPointsIn(Digi|Cluster|Hit)_H2", kLinear, kLinear, kLinear, "colz");
298
299// DrawH1ByPattern("_hpa_.*Hit_Sigma.*_H1");
300// DrawH2ByPattern("_hpa_.*Hit_Sigma.*_H2", kLinear, kLinear, kLinear, "colz");
301
302 DrawResidualsAndPulls("Gem");
303 // DrawResidualsAndPulls("Tof1");
304 // DrawResidualsAndPulls("Dch1");
305 // DrawResidualsAndPulls("Dch2");
306 // DrawResidualsAndPulls("Tof2");
307
308// DrawH1ByPattern("_hhe_Gem_All_(Eff|CloneProb)_Station", DefaultHitEfficiencyLabelFormatter);
309 // DrawH1ByPattern("_hhe_Tof1_All_(Eff|CloneProb)_Station", DefaultHitEfficiencyLabelFormatter);
310 // DrawH1ByPattern("_hhe_Dch1_All_(Eff|CloneProb)_Station", DefaultHitEfficiencyLabelFormatter);
311 // DrawH1ByPattern("_hhe_Dch2_All_(Eff|CloneProb)_Station", DefaultHitEfficiencyLabelFormatter);
312 // DrawH1ByPattern("_hhe_Tof2_All_(Eff|CloneProb)_Station", DefaultHitEfficiencyLabelFormatter);
313}
314
315void BmnClusteringQaReport::DrawNofObjectsHistograms(const string& detName, const string& parameter) {
316// if (!HM()->Exists("_hno_NofObjects_" + detName + "Points_" + parameter)) return;
317// string canvasName = GetReportName() + "_NofObjects_" + detName + "_" + parameter;
318// TCanvas* canvas = CreateCanvas(canvasName.c_str(), canvasName.c_str(), 800, 500);
319// canvas->SetGrid();
320// canvas->cd();
321// vector<string> labels = list_of("Points")/*("Digis")("Clusters")*/("Hits");
322// vector<TH1*> histos = list_of(HM()->H1("_hno_NofObjects_" + detName + "Points_" + parameter))(HM()->H1("_hno_NofObjects_" + detName + "Hits_" + parameter)); //(HM()->H1("hno_NofObjects_" + detName + "Digis_" + parameter))(HM()->H1("hno_NofObjects_" + detName + "Clusters_" + parameter));
323// // if (HM()->Exists("hno_NofObjects_" + detName + "PixelHits_" + parameter)) histos.push_back(HM()->H1("hno_NofObjects_" + detName + "PixelHits_" + parameter));
324// // else if (HM()->Exists("hno_NofObjects_" + detName + "StrawHits_" + parameter)) histos.push_back(HM()->H1("hno_NofObjects_" + detName + "StrawHits_" + parameter));
325// // else if (HM()->Exists("hno_NofObjects_" + detName + "Hits_" + parameter)) histos.push_back(HM()->H1("hno_NofObjects_" + detName + "Hits_" + parameter));
326// DrawH1(histos, labels, kLinear, kLinear, true, 0.65, 0.75, 0.95, 0.99, "PE1X0", kFALSE);
327}
328
329void BmnClusteringQaReport::DrawResidualsAndPulls(const string& detName) {
330// if (!(HM()->Exists("_hrp_" + detName + "_ResidualX_H2") && HM()->Exists("_hrp_" + detName + "_ResidualY_H2")
331// && HM()->Exists("_hrp_" + detName + "_PullX_H2") && HM()->Exists("_hrp_" + detName + "_ResidualX_H2"))) return;
332// vector<string> par = list_of("ResidualX")("ResidualY")("PullX")("PullY");
333// Int_t nofCanvases = par.size();
334// for (Int_t iCanvas = 0; iCanvas < nofCanvases; iCanvas++) {
335// string histName = "_hrp_" + detName + "_" + par[iCanvas] + "_H2";
336// TH2* hist = HM()->H2(histName);
337// string canvasName = GetReportName() + "_" + histName + "_station";
338// TCanvas* canvas = CreateCanvas(canvasName.c_str(), canvasName.c_str(), 1600, 900);
339//
340// Int_t nofBins, nofColumns, nofRows;
341// if (detName == "Gem") {
342// nofBins = 12;
343// nofColumns = 4;
344// nofRows = (nofBins / nofColumns) + ((nofBins % 4 == 0) ? 0 : 1);
345// canvas->Divide(nofColumns, nofRows);
346// } else {
347// nofBins = 1;
348// }
349// for (Int_t iBin = 1; iBin <= nofBins; iBin++) {
350// stringstream ss;
351// ss << histName << "_" << iBin << "_py";
352// TH1* projY = hist->ProjectionY(ss.str().c_str(), iBin, iBin);
353// projY->SetNameTitle(ss.str().c_str(), ss.str().c_str());
354// projY->SetXTitle(par[iCanvas].c_str());
355// projY->SetYTitle("Yield");
356// canvas->cd(iBin);
357// DrawH1(projY, kLinear, kLinear);
358// projY->Fit("gaus", "SQ");
359// }
360// }
361// DrawH2ByPattern("_hrp_" + detName + "_.*_H2", kLinear, kLinear, kLinear, "colz");
362}
363
364Double_t BmnClusteringQaReport::CalcEfficiency(const TH1* histRec, const TH1* histAcc, Double_t scale) {
365 if (histAcc->Integral() == 0 || histRec->Integral() == 0) {
366 return 0.;
367 } else {
368 return scale * Double_t(histRec->Integral()) / Double_t(histAcc->Integral());
369 }
370}
371
372void BmnClusteringQaReport::ScaleAndShrinkHistograms() {}
373
374void BmnClusteringQaReport::DivideHistos(TH1* histo1, TH1* histo2, TH1* histo3, Double_t scale) {
375 histo1->Sumw2();
376 histo2->Sumw2();
377 histo3->Sumw2();
378 histo3->Divide(histo1, histo2, 1., 1., "B");
379 histo3->Scale(scale);
380}
381
382void BmnClusteringQaReport::CalculateEfficiencyHistos(const string& acc, const string& rec, const string& eff) {}
int i
Definition P4_F32vec4.h:22
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)
Definition BmnReport.h:56
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
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
ostream & Out() const
All text output goes to this stream.
Definition BmnReport.h:50
Base class for simulation reports.
BmnHistManager * HM() const
Return pointer to Histogram manager.
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)
@ kLinear
Definition BmnDrawHist.h:71
@ kLog
Definition BmnDrawHist.h:70
string FindAndReplace(const string &name, const string &oldSubstr, const string &newSubstr)
Definition BmnUtils.cxx:20
vector< string > Split(const string &name, char delimiter)
Definition BmnUtils.cxx:27
string NumberToString(const T &value, int precision=1)
Definition BmnUtils.h:27
STL namespace.