BaselineView.cc
Go to the documentation of this file.
1 #include <sevt/PMT.h>
2 #include "AddText.h"
3 #include "BaselineView.h"
4 
5 #include <TCanvas.h>
6 #include <TH1D.h>
7 #include <TGraph.h>
8 #include <TGraphErrors.h>
9 #include <TArrow.h>
10 #include <TBox.h>
11 
12 #include <boost/format.hpp>
13 
14 #include <algorithm>
15 #include <sstream>
16 
17 using namespace utl;
18 using namespace sevt;
19 using namespace std;
20 using namespace boost;
21 using namespace SdCalibPlotterOG;
22 
23 
24 void
25 BaselineView::DividePage(TCanvas& c)
26 {
27  const double xmargin = 0.003;
28  const double ymargin = 0.003;
29  const double vertDivision = 0.2;
30 
31  TPad* const savePad = (TPad*)gPad;
32  c.cd();
33  const string name = c.GetName();
34  ostringstream os;
35  int n = 1;
36  os.str(""); os << name << "_1";
37  const double x1 = xmargin;
38  const double x2 = vertDivision - 0.5*xmargin;
39  const double x3 = vertDivision + 0.5*xmargin;
40  const double x4 = 1 - xmargin;
41  const double y11 = ymargin;
42  const double y12 = 1 - ymargin;
43  TPad* const pad1 = new TPad(os.str().c_str(), os.str().c_str(), x1, y11, x2, y12, 0);
44  pad1->SetNumber(n++);
45  pad1->Draw();
46  const int nRows = 6;
47  for (int row = 0; row < nRows; ++row) {
48  const double y1 = 1 - (row+1)*(1 - ymargin)/nRows;
49  const double y2 = 1 - ymargin - row*(1 - ymargin)/nRows;
50  os.str(""); os << name << '_' << n;
51  TPad* const pad = new TPad(os.str().c_str(), os.str().c_str(), x3, y1, x4, y2, 0);
52  pad->SetNumber(n++);
53  pad->SetLeftMargin(0.5*pad->GetLeftMargin());
54  pad->SetRightMargin(0);
55  pad->Draw();
56  }
57  savePad->cd();
58 }
59 
60 
61 void
62 BaselineView::Draw(const PMT& pmt)
63 {
64  if (!pmt.HasFADCTrace()) {
65  Missing("No FADC Trace");
66  return;
67  }
68  // raw trace
69  const TraceI& trace = pmt.GetFADCTrace(fGain);
70  const int traceLength = trace.GetSize();
71  ostringstream os;
72  os << "PMT" << pmt.GetId() << '_'
73  << (fGain == sdet::PMTConstants::eLowGain ? "LowGain" : "HighGain")
74  << "_Baseline";
75  TH1D& th =
76  Add(new TH1D(os.str().c_str(), os.str().c_str(), traceLength, 0, traceLength));
77  for (int i = 0; i < traceLength; ++i)
78  th.SetBinContent(i+1, trace[i]);
79  th.SetStats(false);
80  th.SetMinimum(0);
81  th.SetLineColor(kRed);
82  th.GetYaxis()->SetTitle("[FADC]");
83  th.GetYaxis()->SetTitleOffset(0.23);
84  th.GetYaxis()->SetTickLength(0.01);
85 
86  if (!pmt.HasRecData()) {
87  Missing("No Rec Data");
88  return;
89  }
90 
91  const PMTRecData& pmtRec = pmt.GetRecData();
92 
93  // no baseline
94  if (!pmtRec.HasFADCBaseline(fGain)) {
95  // draw online baseline arrow
96  if (pmt.HasCalibData()) {
97  const double baseline = pmt.GetCalibData().GetBaseline(fGain);
98  TArrow& ba = Add(new TArrow(0.2*traceLength, baseline, 0, baseline, 0.01));
99  ba.SetAngle(20);
100  ba.SetLineColor(8);
101  ba.Draw();
102  }
103  Missing("No Baseline");
104  return;
105  }
106 
107  // baseline
108  const TraceD& baseline = pmtRec.GetFADCBaseline(fGain);
109  TH1D& bh =
110  Add(new TH1D((os.str() + "2").c_str(), "", traceLength, 0, traceLength));
111  for (int i = 0; i < traceLength; ++i)
112  bh.SetBinContent(i+1, baseline[i]);
113  bh.SetStats(false);
114  bh.SetLineColor(kBlue);
115 
116  // fix view range
117  // at least +- baseline sigma
118  const double baseError = pmtRec.GetFADCBaselineError(fGain);
119  const double baseWidth = max(baseError, 3.);
120  double baseMin = bh.GetMinimum();
121  double baseMax = bh.GetMaximum();
122  double baseMean = 0.5*(baseMin + baseMax);
123  double baseDiff = baseMax - baseMin;
124  baseMin -= 0.3*baseDiff;
125  baseMax += 0.3*baseDiff;
126  baseDiff = baseMax - baseMin;
127  if (baseDiff < 3*baseWidth) {
128  baseMin = baseMean - 1.5*baseWidth;
129  baseMax = baseMean + 1.5*baseWidth;
130  }
131 
132  // online baseline has to be in the middle
133  if (pmt.HasCalibData()) {
134  const double onlineBase = pmt.GetCalibData().GetBaseline(fGain);
135  if (onlineBase < baseMean)
136  baseMin = 2*onlineBase - baseMax;
137  else
138  baseMax = 2*onlineBase - baseMin;
139  }
140 
141  // adjust to see sigma boxes for flat pieces
142  const PMTRecData::FlatPieceCollection& flat =
143  pmtRec.GetBaselineFlatPieces(fGain);
144  const int nFlat = flat.size();
145  const int sigma = pmtRec.GetFADCBaselineWindow(fGain);
146  for (int i = 0; i < nFlat; ++i) {
147  const int start = flat[i].first;
148  const int y = trace[start];
149  const int min = y - sigma - 1;
150  if (baseMin > min)
151  baseMin = min;
152  const int max = y + sigma + 1;
153  if (baseMax < max)
154  baseMax = max;
155  }
156 
157  baseMin = floor(baseMin);
158  baseMax = ceil(baseMax);
159 
160  // final sanity check
161  if (baseMin < 0)
162  baseMin = 0;
163  if (baseMax > (1<<10))
164  baseMax = (1<<10);
165 
166  th.SetMinimum(baseMin);
167  th.SetMaximum(baseMax);
168  th.Draw();
169  bh.SetTitle("");
170  bh.Draw("same");
171 
172  // online baseline
173  {
174  const double x = 40;
175  const double y =
176  (pmt.HasCalibData() ? pmt.GetCalibData().GetBaseline(fGain) : baseline[int(x)]);
177  TGraphErrors& bg = Add(new TGraphErrors(1, &x, &y, 0, &baseError));
178  bg.SetMarkerStyle(kCircle);
179  bg.SetMarkerSize(2);
180  bg.SetLineWidth(2);
181  bg.SetLineColor(kGreen);
182  bg.Draw("same");
183  }
184 
185  // flat pieces
186  for (int i = 0; i < nFlat; ++i) {
187  const int start = flat[i].first;
188  const int stop = flat[i].second;
189  const int y = trace[start];
190  TBox& bb = Add(new TBox(start, y-sigma, stop, y+sigma));
191  bb.SetFillStyle(0);
192  bb.SetLineColor(8); // dark green
193  bb.Draw();
194  }
195 
196  // gain used
197  if (pmtRec.GetGainUsed() == fGain) {
198  TPaveText& pt = Add(new TPaveText(0.95,0.77,0.99,0.87, "ndc"));
199  pt.SetBorderSize(2);
200  pt.SetTextAlign(12);
201  pt.SetFillColor(kWhite);
202  pt.AddText("Used");
203  pt.Draw();
204  }
205 
206  // sturated bins
207  if (pmtRec.GetFADCSaturatedBins(fGain)) {
208  TPaveText& pt = Add(new TPaveText(0.94,0.62,0.99,0.74, "ndc"));
209  pt.SetBorderSize(2);
210  pt.SetTextAlign(12);
211  pt.SetFillColor(kCyan);
212  pt.AddText((format("N_{sat} = %d ") % pmtRec.GetFADCSaturatedBins(fGain)).str().c_str());
213  pt.Draw();
214  }
215 
216  if (pmt.HasCalibData()) {
217 
218  const PMTCalibData& pmtCalib = pmt.GetCalibData();
219 
220  // tube not OK
221  if (!pmtCalib.IsTubeOk()) {
222  TPaveText& pt = Add(new TPaveText(0.69,0.73,0.8,0.87, "ndc"));
223  pt.SetBorderSize(2);
224  pt.SetTextAlign(12);
225  pt.SetFillColor(kRed);
226  pt.AddText("Tube not OK");
227  pt.Draw();
228  }
229 
230  // D/A ratio
231  if (fGain == sdet::PMTConstants::eLowGain) {
232  TPaveText& pt = Add(new TPaveText(0.92,0.90,0.99,1, "ndc"));
233  pt.SetBorderSize(2);
234  pt.SetTextAlign(12);
235  pt.SetFillColor(kWhite);
236  pt.AddText((format("D/A = %.2f (%.2f)") % pmtRec.GetGainRatio() % pmtCalib.GetGainRatio()).str().c_str());
237  pt.Draw();
238  }
239 
240  }
241 }
242 
243 
244 void
245 BaselineView::Missing(const string& what)
246 {
247  TPaveText& pt = Add(new TPaveText(0.3,0.4,0.7,0.6, "ndc"));
248  pt.SetBorderSize(2);
249  pt.SetFillColor(kRed);
250  pt.SetTextAlign(12);
251  pt.AddText(what.c_str());
252  pt.Draw();
253 }
bool HasRecData() const
Check for existenc of PMT reconstructed data object.
Definition: SEvent/PMT.h:53
class to hold data at PMT level
Definition: SEvent/PMT.h:28
bool HasFADCBaseline(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain) const
Definition: PMTRecData.h:69
bool IsTubeOk() const
Definition: PMTCalibData.h:29
PMTCalibData & GetCalibData()
Get object containing PMT calibration data.
Definition: SEvent/PMT.h:56
PMTRecData & GetRecData()
Get object containing PMT reconstructed data.
Definition: SEvent/PMT.h:48
bool HasCalibData() const
Check for existence of PMT calibration data object.
Definition: SEvent/PMT.h:61
double GetFADCBaselineError(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain) const
Definition: PMTRecData.h:81
int GetFADCSaturatedBins(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain) const
Definition: PMTRecData.h:161
unsigned int GetId() const
Return Id of the PMT.
Definition: SEvent/PMT.h:32
FlatPieceCollection & GetBaselineFlatPieces(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain)
Definition: PMTRecData.h:91
#define max(a, b)
bool HasFADCTrace(const StationConstants::SignalComponent source=StationConstants::eTotal) const
Check if a FADC trace exists. Trace source may be specified.
Definition: SEvent/PMT.h:83
class to hold reconstructed data at PMT level
Definition: PMTRecData.h:38
Online Calibration data.
Definition: PMTCalibData.h:27
SizeType GetSize() const
Definition: Trace.h:156
int GetFADCBaselineWindow(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain) const
Definition: PMTRecData.h:84
utl::TraceI & GetFADCTrace(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain, const StationConstants::SignalComponent source=StationConstants::eTotal)
Definition: SEvent/PMT.h:72
double GetBaseline(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain) const
Definition: PMTCalibData.h:41
std::vector< Piece > FlatPieceCollection
Definition: PMTRecData.h:89
sdet::PMTConstants::PMTGain GetGainUsed() const
Definition: PMTRecData.h:164
utl::TraceD & GetFADCBaseline(const sdet::PMTConstants::PMTGain gain=sdet::PMTConstants::eHighGain)
Definition: PMTRecData.h:75
double GetGainRatio() const
Definition: PMTCalibData.h:47
double GetGainRatio() const
Definition: PMTRecData.h:147

, generated on Tue Sep 26 2023.