BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnPidQaReport.cxx
Go to the documentation of this file.
1/**
2 * \file BmnPidQaReport.cxx
3 * \author Semen Lebedev <s.lebedev@gsi.de> - Original author. First version of code for CBM experiment.
4 * \author Sergey Merts <Sergey.Merts@gmail.com> - Modification for BMN experiment.
5 * \date 2011-2021
6 */
7#include "BmnPidQaReport.h"
8
9#include "BmnDrawHist.h"
10#include "BmnDrawOnline.h"
11#include "BmnHistManager.h"
12#include "BmnPidQa.h"
13#include "BmnReportElement.h"
14#include "BmnUtils.h"
15#include "TCanvas.h"
16#include "TF1.h"
17#include "TGaxis.h"
18#include "TH1.h"
19#include "TLatex.h"
20#include "TLine.h"
21#include "TPaveStats.h"
22#include "TString.h"
23#include "TStyle.h"
24#include "map"
25
26#include <fstream>
27#include <set>
28#include <vector>
29
30const Float_t pMax = 5.0;
31
32using namespace std;
33using namespace lit;
34
41
42BmnPidQaReport::BmnPidQaReport(TString name, TString storageName, unordered_map<Double_t, string> massTable)
45 , fMassTable(massTable)
46 , fPrefix(name + ": ")
47 , fStorageName(storageName)
48 , effTof400(nullptr)
49 , contTof400(nullptr)
50 , effTof700(nullptr)
51 , contTof700(nullptr)
52 , effHitsTof400(nullptr)
53 , contHitsTof400(nullptr)
54 , effHitsTof700(nullptr)
55 , contHitsTof700(nullptr)
56{
57 SetReportName(name);
58}
59
61
63{
64 Out().precision(3);
65 Out() << R()->DocumentBegin();
66 Out() << R()->Title(0, GetTitle());
67 Out() << "<hr>" << endl;
69 Out() << R()->DocumentEnd();
70}
71
73{
75 drawHist = new BmnDrawOnline("RECREATE", fStorageName);
76
77 DrawTwoBananas(fPrefix + "Banana-plots", "Banana-plot TOF-400", "Banana-plot TOF-700");
78
79 drawHist->DrawMainCanvas("pid");
80
81 for (auto iter = fMassTable.begin(); iter != fMassTable.end(); ++iter) {
82
83 string nameOfParticle = (*iter).second;
84
85 DrawThreeH1(fPrefix + "Total identified particles TOF-400 for " + nameOfParticle,
86 "TOF-400 total_vs_P for " + nameOfParticle, "TOF-400 true_vs_P for " + nameOfParticle,
87 "TOF-400 false_vs_P for " + nameOfParticle);
88
89 DrawThreeH1(fPrefix + "Total identified particles TOF-700 for " + nameOfParticle,
90 "TOF-700 total_vs_P for " + nameOfParticle, "TOF-700 true_vs_P for " + nameOfParticle,
91 "TOF-700 false_vs_P for " + nameOfParticle);
92
93 DrawThreeH2(fPrefix + "Total-True-False identified particles TOF-400 in P_Beta for " + nameOfParticle,
94 "TOF-400 total rigidity-momentum for " + nameOfParticle,
95 "TOF-400 true rigidity-momentum for " + nameOfParticle,
96 "TOF-400 false rigidity-momentum for " + nameOfParticle);
97
98 /* DrawTwoH2(fPrefix + "Undivided in time TOF400 for " + nameOfParticle,
99 "Undivided TOF-400 rigidity-momentum for " + nameOfParticle,
100 "Undivided TOF-400 time from P for " + nameOfParticle);*/
101
102 DrawThreeH2(fPrefix + "Total-True-False identified particles TOF-700 in P_Beta for " + nameOfParticle,
103 "TOF-700 total rigidity-momentum for " + nameOfParticle,
104 "TOF-700 true rigidity-momentum for " + nameOfParticle,
105 "TOF-700 false rigidity-momentum for " + nameOfParticle);
106
107 /*DrawTwoH2(fPrefix + "Undivided in time TOF700 for " + nameOfParticle,
108 "Undivided TOF-700 rigidity-momentum for " + nameOfParticle,
109 "Undivided TOF-700 time from P for " + nameOfParticle);*/
110
111 // Efficiency TOF-400
112
113 effTof400 = new TEfficiency(*(HM()->H1("TOF-400 true_vs_P for " + nameOfParticle)),
114 *(HM()->H1("TOF-400 total_vs_P for " + nameOfParticle)));
115
116 // Contamination TOF-400
117 HM()->H1("TOF-400 true-false_vs_P for " + nameOfParticle)
118 ->Add(HM()->H1("TOF-400 true_vs_P for " + nameOfParticle),
119 HM()->H1("TOF-400 false_vs_P for " + nameOfParticle));
120
121 contTof400 = new TEfficiency(*(HM()->H1("TOF-400 false_vs_P for " + nameOfParticle)),
122 *(HM()->H1("TOF-400 true-false_vs_P for " + nameOfParticle)));
123
124 // Efficiency Nhits TOF-400
125
126 effHitsTof400 = new TEfficiency(*(HM()->H1("TOF-400 true_vs_NOfHits for " + nameOfParticle)),
127 *(HM()->H1("TOF-400 total_vs_NOfHits for " + nameOfParticle)));
128
129 // Contamination Nhits TOF-400
130 HM()->H1("TOF-400 true-false_vs_NOfHits for " + nameOfParticle)
131 ->Add(HM()->H1("TOF-400 true_vs_NOfHits for " + nameOfParticle),
132 HM()->H1("TOF-400 false_vs_NOfHits for " + nameOfParticle));
133
134 contHitsTof400 = new TEfficiency(*(HM()->H1("TOF-400 false_vs_NOfHits for " + nameOfParticle)),
135 *(HM()->H1("TOF-400 true-false_vs_NOfHits for " + nameOfParticle)));
136
137 // Efficiency TOF-700
138 effTof700 = new TEfficiency(*(HM()->H1("TOF-700 true_vs_P for " + nameOfParticle)),
139 *(HM()->H1("TOF-700 total_vs_P for " + nameOfParticle)));
140
141 // Contamination TOF-700
142 HM()->H1("TOF-700 true-false_vs_P for " + nameOfParticle)
143 ->Add(HM()->H1("TOF-700 true_vs_P for " + nameOfParticle),
144 HM()->H1("TOF-700 false_vs_P for " + nameOfParticle));
145
146 contTof700 = new TEfficiency(*(HM()->H1("TOF-700 false_vs_P for " + nameOfParticle)),
147 *(HM()->H1("TOF-700 true-false_vs_P for " + nameOfParticle)));
148
149 // Efficiency Nhits TOF-700
150 effHitsTof700 = new TEfficiency(*(HM()->H1("TOF-700 true_vs_NOfHits for " + nameOfParticle)),
151 *(HM()->H1("TOF-700 total_vs_NOfHits for " + nameOfParticle)));
152
153 // Contamination Nhits TOF-700
154 HM()->H1("TOF-700 true-false_vs_NOfHits for " + nameOfParticle)
155 ->Add(HM()->H1("TOF-700 true_vs_NOfHits for " + nameOfParticle),
156 HM()->H1("TOF-700 false_vs_NOfHits for " + nameOfParticle));
157
158 contHitsTof700 = new TEfficiency(*(HM()->H1("TOF-700 false_vs_NOfHits for " + nameOfParticle)),
159 *(HM()->H1("TOF-700 true-false_vs_NOfHits for " + nameOfParticle)));
160
161 DrawEffCont(fPrefix + "TOF-400 and TOF-700 Efficiency for " + nameOfParticle, effTof400, effTof700);
162 DrawEffCont(fPrefix + "TOF-400 and TOF-700 Contamination for " + nameOfParticle, contTof400, contTof700);
163 DrawEffCont(fPrefix + "TOF-400 and TOF-700 Efficiency NOfHits for " + nameOfParticle, effHitsTof400,
165 DrawEffCont(fPrefix + "TOF-400 and TOF-700 Contamination NOfHits for " + nameOfParticle, contHitsTof400,
167
168 // Velocity
169
170 DrawThreeH2(fPrefix + "Total-True-False velocity from P TOF-400 for " + nameOfParticle,
171 "Total velocity from P TOF-400 for " + nameOfParticle,
172 "True velocity from P TOF-400 for " + nameOfParticle,
173 "False velocity from P TOF-400 for " + nameOfParticle);
174
175 DrawThreeH2(fPrefix + "Total-True-False velocity from P TOF-700 for " + nameOfParticle,
176 "Total velocity from P TOF-700 for " + nameOfParticle,
177 "True velocity from P TOF-700 for " + nameOfParticle,
178 "False velocity from P TOF-700 for " + nameOfParticle);
179
180 // Time
181
182 DrawThreeH2(fPrefix + "Total-True-False time from P TOF-400 for " + nameOfParticle,
183 "Total time from P TOF-400 for " + nameOfParticle, "True time from P TOF-400 for " + nameOfParticle,
184 "False time from P TOF-400 for " + nameOfParticle);
185
186 DrawThreeH2(fPrefix + "Total-True-False time from P TOF-700 for " + nameOfParticle,
187 "Total time from P TOF-700 for " + nameOfParticle, "True time from P TOF-700 for " + nameOfParticle,
188 "False time from P TOF-700 for " + nameOfParticle);
189
190 // Mass^2
191
192 DrawThreeH2(fPrefix + "Total-True-False mass^2 from P TOF-400 for " + nameOfParticle,
193 "Total mass^2 from P TOF-400 for " + nameOfParticle,
194 "True mass^2 from P TOF-400 for " + nameOfParticle,
195 "False mass^2 from P TOF-400 for " + nameOfParticle);
196
197 DrawThreeH2(fPrefix + "Total-True-False mass^2 from P TOF-700 for " + nameOfParticle,
198 "Total mass^2 from P TOF-700 for " + nameOfParticle,
199 "True mass^2 from P TOF-700 for " + nameOfParticle,
200 "False mass^2 from P TOF-700 for " + nameOfParticle);
201
202 drawHist->DrawMainCanvas(nameOfParticle);
203 }
204}
205
206void BmnPidQaReport::DrawOneH1(const TString canvasName, const TString name1, const TString drawOpt)
207{
208 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), 500, 500);
209 canvas->SetGrid();
210 drawHist->DrawH1(canvas, HM()->H1(name1), kLinear, kLinear, drawOpt.Data(), kRed, 1, 0.75, 1.1, 20);
211}
212
213void BmnPidQaReport::DrawTwoH1(const TString canvasName,
214 const TString name1,
215 const TString name2,
216 const TString drawOpt)
217{
218 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), 1000, 500);
219 canvas->SetGrid();
220 canvas->Divide(2, 1);
221 canvas->cd(1);
222 drawHist->DrawH1(canvas, HM()->H1(name1), kLinear, kLinear, drawOpt.Data(), kRed, 1, 0.75, 1.1, 20);
223 canvas->cd(2);
224 drawHist->DrawH1(canvas, HM()->H1(name2), kLinear, kLinear, drawOpt.Data(), kRed, 1, 0.75, 1.1, 20);
225}
226
227void BmnPidQaReport::DrawOneH2(const TString canvasName, const TString name1)
228{
229 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), 500, 500);
230 canvas->SetGrid();
231 drawHist->DrawH2(canvas, HM()->H2(name1), kLinear, kLinear, kLinear, "colz");
232}
233
234void BmnPidQaReport::DrawTwoH2(const TString canvasName, const TString name1, const TString name2)
235{
236 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), 1000, 500);
237 canvas->SetGrid();
238 canvas->Divide(2, 1);
239 canvas->cd(1);
240 drawHist->DrawH2(canvas, HM()->H2(name1), kLinear, kLinear, kLinear, "colz");
241 canvas->cd(2);
242 drawHist->DrawH2(canvas, HM()->H2(name2), kLinear, kLinear, kLinear, "colz");
243}
244
246 const TString name1,
247 const TString name2,
248 const TString name3)
249{
250 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), 2100, 500);
251 canvas->SetGrid();
252 canvas->Divide(3, 1);
253 canvas->cd(1);
254 drawHist->DrawH2(canvas, HM()->H2(name1), kLinear, kLinear, kLinear, "colz");
255 canvas->cd(2);
256 drawHist->DrawH2(canvas, HM()->H2(name2), kLinear, kLinear, kLinear, "colz");
257 canvas->cd(3);
258 drawHist->DrawH2(canvas, HM()->H2(name3), kLinear, kLinear, kLinear, "colz");
259}
260
261void BmnPidQaReport::DrawTwoBananas(const TString canvasName, const TString name1, const TString name2)
262{
263 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), 1000, 500);
264 canvas->SetGrid();
265 canvas->Divide(2, 1);
266 canvas->cd(1);
267 drawHist->DrawH2(canvas, HM()->H2(name1), kLinear, kLinear, kLinear, "colz");
268 canvas->cd(2);
269 drawHist->DrawH2(canvas, HM()->H2(name2), kLinear, kLinear, kLinear, "colz");
270}
271
273 const TString name1,
274 const TString name2,
275 const TString name3)
276{
277 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), 1500, 500);
278 canvas->SetGrid();
279 canvas->Divide(3, 1);
280 canvas->cd(1);
281 drawHist->DrawH1(canvas, HM()->H1(name1), kLinear, kLinear, "", kBlue, 1, 0.75, 1.1, 20);
282 canvas->cd(2);
283 drawHist->DrawH1(canvas, HM()->H1(name2), kLinear, kLinear, "", kBlue, 1, 0.75, 1.1, 20);
284 canvas->cd(3);
285 drawHist->DrawH1(canvas, HM()->H1(name3), kLinear, kLinear, "", kBlue, 1, 0.75, 1.1, 20);
286}
287
288void BmnPidQaReport::DrawEffCont(const TString canvasName, TEfficiency* efficiency, TEfficiency* contamination)
289{
290 TCanvas* canvas = CreateCanvas(canvasName.Data(), canvasName.Data(), 1000, 500);
291 canvas->SetGrid();
292 canvas->Divide(2, 1);
293 canvas->cd(1);
294 drawHist->DrawH1(canvas, efficiency);
295 canvas->cd(2);
296 drawHist->DrawH1(canvas, contamination);
297}
const Float_t pMax
Create report for tracking QA.
FairTask for pid performance calculation.
float Float_t
kRed
kBlue
TH1 * H1(const TString &name) const
Return pointer to TH1 histogram.
virtual void Draw()
Inherited from BmnSimulationReport.
TEfficiency * contTof700
void DrawTwoH2(const TString canvasName, const TString name1, const TString name2)
void DrawTwoH1(const TString canvasName, const TString name1, const TString name2, const TString drawOpt)
void DrawOneH1(const TString canvasName, const TString name1, const TString drawOpt)
TEfficiency * contHitsTof700
TEfficiency * effHitsTof700
void DrawTwoBananas(const TString canvasName, const TString name1, const TString name2)
TEfficiency * effTof400
TEfficiency * effHitsTof400
TEfficiency * contTof400
unordered_map< Double_t, string > fMassTable
TEfficiency * contHitsTof400
void DrawOneH2(const TString canvasName, const TString name1)
BmnDrawOnline * drawHist
void DrawThreeH1(const TString canvasName, const TString name1, const TString name2, const TString name3)
void DrawThreeH2(const TString canvasName, const TString name1, const TString name2, const TString name3)
TEfficiency * effTof700
BmnPidQaReport()
Constructor.
void DrawEffCont(const TString canvasName, TEfficiency *, TEfficiency *)
virtual ~BmnPidQaReport()
Destructor.
vector< string > fGlobalTrackVariants
virtual void Create()
Pure abstract function which is called from public Create() function.
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.
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.
Definition BmnReport.cxx:75
ostream & Out() const
All text output goes to this stream.
Definition BmnReport.h:50
BmnHistManager * HM() const
Return pointer to Histogram manager.
BmnSimulationReport()
Constructor.
TVirtualPad * cd(Int_t subpadnumber=0) override
virtual Bool_t Add(const TH1 *h, const TH1 *h2, Double_t c1=1, Double_t c2=1)
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
const char * Data() const
void SetDefaultDrawStyle()
@ kLinear
Definition BmnDrawHist.h:66
Definition json.hpp:4446