LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
TQPad.cxx
Go to the documentation of this file.
7 #include "TH1F.h"
8 #include "TPad.h"
9 
12 #include "cetlib_except/exception.h"
13 
23 
24 // C/C++ standard libraries
25 #include <algorithm> // std::min(), std::max()
26 
27 namespace evd {
28 
29  static const int kRAW = 0;
30  static const int kCALIB = 1;
31  //static const int kRAWCALIB = 2;
32  static const int kQ = 0;
33  static const int kTQ = 1;
34 
35  //......................................................................
36 
37  TQPad::TQPad(const char* nm,
38  const char* ti,
39  double x1,
40  double y1,
41  double x2,
42  double y2,
43  const char* opt,
44  unsigned int plane,
45  unsigned int wire)
46  : DrawingPad(nm, ti, x1, y1, x2, y2), fWire(wire), fPlane(plane), fFrameHist(0)
47  {
49  unsigned int planes = geo->Nplanes();
50 
51  this->Pad()->cd();
52 
53  this->Pad()->SetLeftMargin(0.050);
54  this->Pad()->SetRightMargin(0.050);
55 
56  this->Pad()->SetTopMargin(0.005);
57  this->Pad()->SetBottomMargin(0.110);
58 
59  // there has to be a better way of doing this that does
60  // not have a case for each number of planes in a detector
61  if (planes == 2 && fPlane > 0) {
62  this->Pad()->SetTopMargin(0.110);
63  this->Pad()->SetBottomMargin(0.010);
64  }
65  else if (planes > 2) {
66  if (fPlane == 1) {
67  this->Pad()->SetTopMargin(0.005);
68  this->Pad()->SetBottomMargin(0.010);
69  }
70  else if (fPlane == 2) {
71  this->Pad()->SetTopMargin(0.110);
72  this->Pad()->SetBottomMargin(0.010);
73  }
74  }
75 
76  std::string opts(opt);
77  if (opts == "TQ") {
78  fTQ = kTQ;
79  // BB adjust the vertical spacing
80  this->Pad()->SetTopMargin(0);
81  this->Pad()->SetBottomMargin(0.2);
82  }
83  if (opts == "Q") { fTQ = kQ; }
84 
85  this->BookHistogram();
86  fView = new evdb::View2D();
87 
90 
91  fHitDrawerTool = art::make_tool<evdb_tool::IWFHitDrawer>(recoOptions->fHitDrawerParams);
93  art::make_tool<evdb_tool::IWaveformDrawer>(rawOptions->fRawDigitDrawerParams);
94  fWireDrawerTool = art::make_tool<evdb_tool::IWaveformDrawer>(recoOptions->fWireDrawerParams);
95  }
96 
97  //......................................................................
98 
100  {
101  if (fView) {
102  delete fView;
103  fView = 0;
104  }
105  if (fFrameHist) {
106  delete fFrameHist;
107  fFrameHist = 0;
108  }
109  }
110 
111  //......................................................................
112  void TQPad::Draw()
113  {
115 
116  //grab the singleton with the event
118  if (!evt) return;
119 
121 
122  fPad->Clear();
123  fPad->cd();
124 
125  // Note this handles drawing waveforms for both SP and DP where the difference is handled by the tools
126  if (fTQ == kTQ) {
127  // Recover a channel number from current information
128  geo::WireID const wireid{drawopt->fCryostat, drawopt->fTPC, fPlane, fWire};
129  raw::ChannelID_t channel = geoSvc->PlaneWireToChannel(wireid);
130 
131  // Call the tools to fill the histograms for RawDigits and Wire data
132  fRawDigitDrawerTool->Fill(
133  *fView, channel, this->RawDataDraw()->StartTick(), this->RawDataDraw()->TotalClockTicks());
134  fWireDrawerTool->Fill(
135  *fView, channel, this->RawDataDraw()->StartTick(), this->RawDataDraw()->TotalClockTicks());
136 
137  // Vertical limits set for the enclosing histogram, then draw it with axes only
138  float maxLowVal = std::min(fRawDigitDrawerTool->getMinimum(), fWireDrawerTool->getMinimum());
139  float maxHiVal = std::max(fRawDigitDrawerTool->getMaximum(), fWireDrawerTool->getMaximum());
140 
141  if (drawopt->fDrawRawDataOrCalibWires == kCALIB) {
142  maxLowVal = fWireDrawerTool->getMinimum();
143  maxHiVal = fWireDrawerTool->getMaximum();
144  }
145 
146  if (maxLowVal < std::numeric_limits<float>::max())
147  maxLowVal -= 5.;
148  else
149  maxLowVal = -10.;
150  if (maxHiVal > std::numeric_limits<float>::lowest())
151  maxHiVal += 5.;
152  else
153  maxHiVal = 10.;
154 
155  fFrameHist->SetMaximum(maxHiVal);
156  fFrameHist->SetMinimum(maxLowVal);
157  fFrameHist->Draw("AXIS");
158 
159  // draw with histogram style, only (square) lines, no errors
160  static const std::string defaultDrawOptions = "HIST same";
161 
162  // Draw the desired histograms
163  // If its not just the raw hists then we output the wire histograms
164  if (drawopt->fDrawRawDataOrCalibWires != kRAW) {
165  fWireDrawerTool->Draw(defaultDrawOptions.c_str(), maxLowVal, maxHiVal);
166 
167  fHitDrawerTool->Draw(*fView, channel);
168  }
169 
170  // Likewise, if it is not just the calib hists then we output the raw histogram
171  if (drawopt->fDrawRawDataOrCalibWires != kCALIB)
172  fRawDigitDrawerTool->Draw(defaultDrawOptions.c_str(), maxLowVal, maxHiVal);
173 
174  // This is a remnant from a time long past...
175  fFrameHist->SetTitleOffset(0.2, "Y");
176  } // end if fTQ == kTQ
177 
178  // I am not sure what the block below is trying to do... I don't see where the hists are actually filled.
179  // ** remove this for now until someone can explain what it is **
180  // else if(fTQ == kQ && fTQ == -1)
181  // {
182  // // figure out the signal type for this plane, assume that
183  // // plane n in each TPC/cryostat has the same type
184  // geo::PlaneID planeid(drawopt->CurrentTPC(), fPlane);
185  // geo::SigType_t sigType = geoSvc->SignalType(planeid);
186  //
187  // art::ServiceHandle<evd::ColorDrawingOptions const> cst;
188  //
189  // TH1F *hist;
190  //
191  // int ndiv = 0;
192  // if(drawopt->fDrawRawDataOrCalibWires != kCALIB){
193  // hist = fRawHisto;
194  // hist->SetMinimum(cst->fRawQLow [(size_t)sigType]);
195  // hist->SetMaximum(cst->fRawQHigh[(size_t)sigType]);
196  // ndiv = cst->fRawDiv[(size_t)sigType];
197  // }
198  // if(drawopt->fDrawRawDataOrCalibWires == kCALIB){
199  // hist = fRecoHisto;
200  // hist->SetMinimum(cst->fRecoQLow [(size_t)sigType]);
201  // hist->SetMaximum(cst->fRecoQHigh[(size_t)sigType]);
202  // ndiv = cst->fRecoDiv[(size_t)sigType];
203  // }
204  //
205  // hist->SetLabelSize(0, "X");
206  // hist->SetLabelSize(0, "Y");
207  // hist->SetTickLength(0, "X");
208  // hist->SetTickLength(0, "Y");
209  // hist->Draw("pY+");
210  //
211  // //
212  // // Use this to fill the histogram with colors from the color scale
213  // //
214  // double x1, x2, y1, y2;
215  // x1 = 0.;
216  // x2 = 1.;
217  //
218  // for(int i = 0; i < ndiv; ++i){
219  // y1 = hist->GetMinimum() + i*(hist->GetMaximum()-hist->GetMinimum())/(1.*ndiv);
220  // y2 = hist->GetMinimum() + (i + 1)*(hist->GetMaximum()-hist->GetMinimum())/(1.*ndiv);
221  //
222  // int c = 1;
223  // if (drawopt->fDrawRawDataOrCalibWires==kRAW) {
224  // c = cst->RawQ(sigType).GetColor(0.5*(y1+y2));
225  // }
226  // if (drawopt->fDrawRawDataOrCalibWires!=kRAW) {
227  // c= cst->CalQ(sigType).GetColor(0.5*(y1+y2));
228  // }
229  //
230  // TBox& b = fView->AddBox(x1,y1,x2,y2);
231  // b.SetFillStyle(1001);
232  // b.SetFillColor(c);
233  // b.Draw();
234  // } // end loop over Q histogram bins
235  //
236  // hist->Draw("same");
237  // } // end if fTQ == kQ
238 
239  return;
240  }
241 
242  //......................................................................
244  {
245  if (fFrameHist) {
246  delete fFrameHist;
247  fFrameHist = 0;
248  }
249 
252 
253  // figure out the signal type for this plane, assume that
254  // plane n in each TPC/cryostat has the same type
255  geo::PlaneID planeid(drawopt->CurrentTPC(), fPlane);
257  geo::SigType_t sigType = geo->SignalType(planeid);
258 
260  double qxloraw = cst->fRawQLow[(size_t)sigType];
261  double qxhiraw = cst->fRawQHigh[(size_t)sigType];
262  double tqxlo = 1. * this->RawDataDraw()->StartTick();
263  double tqxhi = 1. * this->RawDataDraw()->TotalClockTicks();
264 
265  switch (fTQ) {
266  case kQ:
267  fFrameHist = new TH1F("fFrameHist", ";t [ticks];[ADC]", 2, 0., 1.);
268  fFrameHist->SetMaximum(qxhiraw);
269  fFrameHist->SetMinimum(qxloraw);
270  break; // kQ
271  case kTQ:
272  fFrameHist = new TH1F("fFrameHist", ";t [ticks];q [ADC]", (int)tqxhi, tqxlo, tqxhi + tqxlo);
273  break;
274  default: throw cet::exception("TQPad") << __func__ << ": unexpected quantity #" << fTQ << "\n";
275  } //end if fTQ == kTQ
276 
277  // Set the label, title size and offsets
278  // Note this is the base histogram so this control these for both the raw and wire histograms
279  fFrameHist->GetXaxis()->SetLabelSize(0.10);
280  fFrameHist->GetXaxis()->SetLabelOffset(0.00);
281  fFrameHist->GetXaxis()->SetTitleSize(0.10);
282  fFrameHist->GetXaxis()->SetTitleOffset(0.80);
283 
284  fFrameHist->GetYaxis()->SetLabelSize(0.10);
285  fFrameHist->GetYaxis()->SetLabelOffset(0.01);
286  fFrameHist->GetYaxis()->SetTitleSize(0.10);
287  fFrameHist->GetYaxis()->SetTitleOffset(0.80);
288  }
289 
290 }
const art::Event * GetEvent() const
Definition: EventHolder.cxx:45
IWFHitDrawerPtr fHitDrawerTool
An instance of the tool to draw hits.
Definition: TQPad.h:57
std::vector< double > fRawQLow
low edge of ADC values for drawing raw digits
unsigned int fTPC
TPC number to draw, typically set by TWQProjectionView.
unsigned int fPlane
Which plane in the detector.
Definition: TQPad.h:53
TH1F * fFrameHist
A dummy histogram to define the axes.
Definition: TQPad.h:55
Float_t y1[n_points_granero]
Definition: compare.C:5
void BookHistogram()
Definition: TQPad.cxx:243
int fDrawRawDataOrCalibWires
0 for raw
Float_t x1[n_points_granero]
Definition: compare.C:5
IWaveformDrawerPtr fWireDrawerTool
An instance of the tool to draw hits.
Definition: TQPad.h:59
The data type to uniquely identify a Plane.
Definition: geo_types.h:463
fhicl::ParameterSet fRawDigitDrawerParams
FHICL parameters for the RawDigit waveform display.
Drawing pad for time or charge histograms.
static const int kRAW
Definition: TQPad.cxx:29
A collection of drawable 2-D objects.
static const int kCALIB
Definition: TQPad.cxx:30
void Draw()
Definition: TQPad.cxx:112
Singleton to hold the current art::Event for the event display.
Float_t y2[n_points_geant4]
Definition: compare.C:26
unsigned int fWire
Definition: TQPad.h:52
The color scales used by the event display.
evdb::View2D * fView
Superimpose scale on 1D histo.
Definition: TQPad.h:56
LArSoft includes.
RawDataDrawer * RawDataDraw()
Definition: DrawingPad.cxx:121
unsigned int fCryostat
Cryostat number to draw, typically set by TWQProjectionView.
enum geo::_plane_sigtype SigType_t
Enumerate the possible plane projections.
static EventHolder * Instance()
Definition: EventHolder.cxx:15
fhicl::ParameterSet fWireDrawerParams
FHICL parameters for the wire drawing.
Base class for event display drawing pads.
Definition: DrawingPad.h:27
This provides an interface for tools which are tasked with drawing the "wire" data (deconvolved wavef...
TPad * Pad()
Definition: DrawingPad.h:31
geo::TPCID CurrentTPC() const
Returns the current TPC as a TPCID.
double TotalClockTicks() const
Definition: RawDataDrawer.h:84
static const int kQ
Definition: TQPad.cxx:32
Class to aid in the rendering of RawData objects.
static const int kTQ
Definition: TQPad.cxx:33
std::vector< double > fRawQHigh
high edge of ADC values for drawing raw digits
IWaveformDrawerPtr fRawDigitDrawerTool
An instance of the tool to draw hits.
Definition: TQPad.h:58
int fTQ
0 = plot shows charge only, 1 = plot shows charge vs time for a wire
Definition: TQPad.h:54
double StartTick() const
Definition: RawDataDrawer.h:83
raw::ChannelID_t PlaneWireToChannel(WireID const &wireid) const
Returns the ID of the TPC channel connected to the specified wire.
~TQPad()
Definition: TQPad.cxx:99
unsigned int Nplanes(TPCID const &tpcid=tpc_zero) const
Returns the total number of planes in the specified TPC.
Definition: GeometryCore.h:977
TPad * fPad
The ROOT graphics pad.
Definition: DrawingPad.h:45
fhicl::ParameterSet fHitDrawerParams
FHICL parameters for the hit drawing.
TCEvent evt
Definition: DataStructs.cxx:8
unsigned int ChannelID_t
Type representing the ID of a readout channel.
Definition: RawTypes.h:28
Float_t x2[n_points_geant4]
Definition: compare.C:26
Namespace collecting geometry-related classes utilities.
TQPad(const char *nm, const char *ti, double x1, double y1, double x2, double y2, const char *opt, unsigned int plane, unsigned int wire)
Definition: TQPad.cxx:37
art framework interface to geometry description
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33