LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
ScanWindow.cxx
Go to the documentation of this file.
1 #include "TCanvas.h"
8 #include "TGFrame.h" // For TGMainFrame, TGHorizontalFrame
9 #include "TGLayout.h" // For TGLayoutHints
10 #include "TGButton.h" // For TGCheckButton
11 #include "TGDimension.h"
12 #include "TGNumberEntry.h"
13 #include "TGLabel.h"
14 #include "TGScrollBar.h"
15 #include "TGCanvas.h"
16 #include "TMath.h"
17 #include "TString.h"
18 #include "TSystem.h"
19 #include "TTimeStamp.h"
20 
27 
31 
32 static int kInputID = 0;
33 
34 namespace evdb{
35 
36  //......................................................................
37  ScanFrame::ScanFrame(TGCompositeFrame* f)
38  {
40 
41  unsigned int nCategories = opts->fCategories.size();
42 
43  fFrame = new TGGroupFrame(f, "Please complete these fields", kVerticalFrame);
44  fFrameHints = new TGLayoutHints(kLHintsExpandX|
45  kLHintsExpandY,
46  4,4,4,4);
47  f->AddFrame(fFrame, fFrameHints);
48 
49  //
50  // grab the ScanOptions service and loop over the categories to make a
51  // ScanFrame for each
52  //
53  fCatFrameLH = new TGLayoutHints(kLHintsLeft|
54  kLHintsExpandX|
55  kLHintsTop,
56  2,2,2,2);
57  unsigned int pos = 0;
58  for(unsigned int c = 0; c < nCategories; ++c){
59  std::vector<std::string> types;
60  std::vector<std::string> labels;
61 
62  for(unsigned int p = 0; p < opts->fFieldsPerCategory[c]; ++p){
63  types. push_back(opts->fFieldTypes[pos+p]);
64  labels.push_back(opts->fFieldLabels[pos+p]);
65  }
66 
67  pos += opts->fFieldsPerCategory[c];
68 
69  //
70  // Create container for the current category.
71  //
72  TGGroupFrame *catframe = 0;
73  catframe = new TGGroupFrame(fFrame,
74  opts->fCategories[c].c_str(),
75  kRaisedFrame|kVerticalFrame);
76  fCatFrames.push_back(catframe);
77  fFrame->AddFrame(catframe,fCatFrameLH);
78 
79  fFieldFrameHints = new TGLayoutHints(kLHintsExpandX,2,2,2,2);
80 
81  // loop over the fields and determine what to draw
82  for(unsigned int i = 0; i < types.size(); ++i){
83  TGHorizontalFrame* fieldframe = new TGHorizontalFrame(catframe);
84  fFieldFrames.push_back(fieldframe);
85  catframe->AddFrame(fieldframe,fFieldFrameHints);
86 
87  if(types[i] == "Text") {
88  TGLabel *l = new TGLabel(fieldframe, labels[i].c_str());
89  fieldframe->AddFrame(l);
90  fTextBoxes.push_back(new TGTextEntry(fieldframe));
91  fieldframe->AddFrame(fTextBoxes[fTextBoxes.size()-1]);
92  }
93 
94  if(types[i] == "Number"){
95  TGLabel *l = new TGLabel(fieldframe, labels[i].c_str());
96  fieldframe->AddFrame(l);
97  TGNumberEntry*
98  ne = new TGNumberEntry(fieldframe,
99  0,
100  2,
101  -1,
102  TGNumberFormat::kNESInteger);
103  fieldframe->AddFrame(ne);
104 
105  fNumberLabels.push_back(l);
106  fNumberBoxes.push_back(ne);
107  }
108 
109  if(types[i] =="CheckButton"){
110  TGCheckButton* cb = new TGCheckButton(fieldframe,
111  labels[i].c_str(),
112  kInputID);
113  fieldframe->AddFrame(cb);
114  fCheckButtons.push_back(cb);
115  }
116 
117  if(types[i] =="RadioButton"){
118  TGRadioButton* rb = new TGRadioButton(fieldframe,
119  labels[i].c_str(),
120  kInputID);
121  fieldframe->AddFrame(rb);
122  rb->Connect("Clicked()",
123  "evdb::ScanFrame",
124  this,
125  "RadioButton()");
126 
127  fRadioButtons.push_back(rb);
128  fRadioButtonIds.push_back(kInputID);
129  }
130 
131  ++kInputID;
132 
133  }// end loop over types
134  } // end loop over categories
135 
136  fFrame->Connect("ProcessedEvent(Event_t*)",
137  "evdb::ScanFrame",
138  this,
139  "HandleMouseWheel(Event_t*)");
140  }
141 
142  //......................................................................
144  {
145  unsigned int i;
146 
147  for(i=0; i<fCheckButtons.size(); ++i){
148  if( fCheckButtons[i] ) delete fCheckButtons[i];
149  }
150  for(i=0; i<fRadioButtons.size(); ++i){
151  if( fRadioButtons[i] ) delete fRadioButtons[i];
152  }
153  for (i=0; i<fNumberLabels.size(); ++i) {
154  if (fNumberLabels[i]) delete fNumberLabels[i];
155  }
156  for(i=0; i<fNumberBoxes.size(); ++i){
157  if( fNumberBoxes[i] ) delete fNumberBoxes[i];
158  }
159  for(i=0; i<fTextBoxes.size(); ++i){
160  if( fTextBoxes[i] ) delete fTextBoxes[i];
161  }
162  for(i=0; i<fFieldFrames.size(); ++i){
163  if( fFieldFrames[i] ) delete fFieldFrames[i];
164  }
165  for(i=0; i<fCatFrames.size(); ++i){
166  if( fCatFrames[i] ) delete fCatFrames[i];
167  }
168  delete fCatFrameLH;
169  delete fFieldFrameHints;
170  delete fFrameHints;
171  delete fFrame;
172  }
173 
174  //......................................................................
176  {
177  if (fFrame) return fFrame->GetHeight();
178  else return 0;
179  }
180 
181  //......................................................................
183  {
184  if (fFrame) return fFrame->GetWidth();
185  else return 0;
186  }
187 
188  //......................................................................
189 
191  {
192  // Handle mouse wheel to scroll.
193 
194  if (event->fType != kButtonPress && event->fType != kButtonRelease)
195  return;
196 
197  Int_t page = 0;
198  if (event->fCode == kButton4 || event->fCode == kButton5) {
199  if (fCanvas==0) return;
200  if (fCanvas->GetContainer()->GetHeight())
201 
202  page = Int_t(Float_t(fCanvas->GetViewPort()->GetHeight() *
203  fCanvas->GetViewPort()->GetHeight()) /
204  fCanvas->GetContainer()->GetHeight());
205  }
206 
207  if (event->fCode == kButton4) {
208  //scroll up
209  Int_t newpos = fCanvas->GetVsbPosition() - page;
210  if (newpos < 0) newpos = 0;
211  fCanvas->SetVsbPosition(newpos);
212  }
213  if (event->fCode == kButton5) {
214  // scroll down
215  Int_t newpos = fCanvas->GetVsbPosition() + page;
216  fCanvas->SetVsbPosition(newpos);
217  }
218  }
219 
220  //......................................................................
222  {
224 
225  unsigned int txtctr = 0;
226  unsigned int numctr = 0;
227  unsigned int radctr = 0;
228  unsigned int chkctr = 0;
229  for(unsigned int t = 0; t < scanopt->fFieldTypes.size(); ++t){
230 
231  if(scanopt->fFieldTypes[t] == "Text"){
232  if(txtctr < fTextBoxes.size() ){
233  fTextBoxes[txtctr]->Clear();
234  }
235  ++txtctr;
236  }
237  else if(scanopt->fFieldTypes[t] == "Number"){
238  if(numctr < fNumberBoxes.size() ){
239  fNumberBoxes[numctr]->SetNumber(0);
240  }
241  ++numctr;
242  }
243  else if(scanopt->fFieldTypes[t] == "RadioButton"){
244  if(radctr < fRadioButtons.size() ){
245  fRadioButtons[radctr]->SetState(kButtonUp);
246  }
247  ++radctr;
248  }
249  else if(scanopt->fFieldTypes[t] == "CheckButton"){
250  if(chkctr < fCheckButtons.size() ){
251  fCheckButtons[chkctr]->SetState(kButtonUp);
252  }
253  ++chkctr;
254  }
255 
256  }// end loop over input field types
257 
258  }
259 
260  //......................................................................
261  void ScanFrame::Record(std::string outfilename,
262  const char* comments)
263  {
265 
266  // get the event information
268 
269  std::ofstream outfile(outfilename.c_str(), std::ios_base::app);
270 
271  outfile << evt->run() << " " << evt->subRun() << " " << evt->id().event() << " ";
272 
273  // loop over the input fields
274  unsigned int txtctr = 0;
275  unsigned int numctr = 0;
276  unsigned int radctr = 0;
277  unsigned int chkctr = 0;
278  for(unsigned int t = 0; t < scanopt->fFieldTypes.size(); ++t){
279 
280  if(scanopt->fFieldTypes[t] == "Text"){
281  if(txtctr < fTextBoxes.size() ){
282  outfile << fTextBoxes[txtctr]->GetText() << " ";
283  fTextBoxes[txtctr]->Clear();
284  }
285  ++txtctr;
286  }
287  else if(scanopt->fFieldTypes[t] == "Number"){
288  if(numctr < fNumberBoxes.size() ){
289  outfile << fNumberBoxes[numctr]->GetNumber() << " ";
290  fNumberBoxes[numctr]->SetNumber(0);
291  }
292  ++numctr;
293  }
294  else if(scanopt->fFieldTypes[t] == "RadioButton"){
295  if(radctr < fRadioButtons.size() ){
296  outfile << (fRadioButtons[radctr]->GetState() == kButtonDown) << " ";
297  fRadioButtons[radctr]->SetState(kButtonUp);
298  }
299  ++radctr;
300  }
301  else if(scanopt->fFieldTypes[t] == "CheckButton"){
302  if(chkctr < fCheckButtons.size() ){
303  outfile << (fCheckButtons[chkctr]->GetState() == kButtonDown) << " ";
304  fCheckButtons[chkctr]->SetState(kButtonUp);
305  }
306  ++chkctr;
307  }
308 
309  }// end loop over input field types
310 
311  // do we need to get the truth information?
312  if(scanopt->fIncludeMCInfo){
313 
314  try {
315  auto const mclist = evt->getMany<std::vector<simb::MCTruth>>();
316 
317  bool listok = (mclist.size()>0);
318  bool isnu = false;
319  if (listok) {
320  isnu = (mclist[0]->at(0).Origin()==simb::kBeamNeutrino);
321  }
322 
323  if (listok==false) {
324  mf::LogWarning("ScanWindow")
325  << "MC truth information requested for output file"
326  << " but no MCTruth objects found in event - "
327  << " put garbage numbers into the file";
328  outfile
329  << -999. << " " << -999. << " " << -999. << " "
330  << -999. << " " << -999. << " " << -999. << " " << -999.;
331  }
332 
333  if ( listok && isnu==false) {
334  mf::LogWarning("ScanWindow")
335  << "Unknown particle source or truth information N/A"
336  << " put garbage numbers into the file";
337  outfile
338  << -999. << " " << -999. << " " << -999. << " "
339  << -999. << " " << -999. << " " << -999.<< " " << -999.;
340  }
341 
342  if (listok && isnu) {
343  // get the event vertex and energy information,
344  const simb::MCNeutrino& nu = mclist[0]->at(0).GetNeutrino();
345 
346  outfile << nu.Nu().PdgCode() << " "
347  << nu.Nu().Vx() << " "
348  << nu.Nu().Vy() << " "
349  << nu.Nu().Vz() << " "
350  << nu.Nu().E() << " "
351  << nu.CCNC() << " "
352  << nu.Lepton().E() << " "
353  << nu.InteractionType();
354  }
355  }
356  catch(cet::exception &e){
357  mf::LogWarning("ScanWindow")
358  << "MC truth information requested for output file"
359  << " but no MCTruth objects found in event - "
360  << " put garbage numbers into the file";
361  outfile
362  << -999. << " " << -999. << " " << -999. << " "
363  << -999. << " " << -999. << " " << -999.;
364  }
365  }//end if using MC information
366 
367  // end this line for the event
368  outfile << " " << comments << std::endl;
369  }
370 
371  //......................................................................
372 
374  {
375  TGButton *b = (TGButton *)gTQSender;
376  int id = b->WidgetId();
377 
378  if(fRadioButtonIds.size() < 2) return;
379 
380  if(id >= fRadioButtonIds[0] && id <= fRadioButtonIds[fRadioButtonIds.size()-1]){
381  for(unsigned int i = 0; i < fRadioButtonIds.size(); ++i)
382  if(fRadioButtons[i]->WidgetId() != id) fRadioButtons[i]->SetState(kButtonUp);
383  }
384 
385  return;
386  }
387 
388  //--------------------------------------------------------------------
389 
390  void ScanWindow::BuildButtonBar(TGHorizontalFrame* f)
391  {
392  fCommentLabel = new TGLabel (f, " Comments:");
393  fCommentEntry = new TGTextEntry (f);
394  fPrevButton = new TGTextButton(f, " <<Prev ");
395  fNextButton = new TGTextButton(f, " Next>> ");
396  fRcrdButton = new TGTextButton(f, " Record ");
397 
398  fPrevButton->Connect("Clicked()", "evdb::ScanWindow", this, "Prev()");
399  fNextButton->Connect("Clicked()", "evdb::ScanWindow", this, "Next()");
400  fRcrdButton->Connect("Clicked()", "evdb::ScanWindow", this, "Rec()");
401 
402  Pixel_t c;
403  gClient->GetColorByName("pink", c);
404  fRcrdButton->ChangeBackground(c);
405 
406  fButtonBarHintsL = new TGLayoutHints(kLHintsBottom|kLHintsLeft,
407  4,2,2,8);
408  fButtonBarHintsC = new TGLayoutHints(kLHintsBottom|kLHintsLeft,
409  2,2,2,8);
410  fButtonBarHintsR = new TGLayoutHints(kLHintsBottom|kLHintsLeft,
411  2,4,2,8);
412  f->AddFrame(fCommentLabel, fButtonBarHintsL);
413  f->AddFrame(fCommentEntry, fButtonBarHintsC);
414  f->AddFrame(fPrevButton, fButtonBarHintsC);
415  f->AddFrame(fNextButton, fButtonBarHintsC);
416  f->AddFrame(fRcrdButton, fButtonBarHintsR);
417  }
418 
419  //--------------------------------------------------------------------
420 
421  void ScanWindow::BuildUserFields(TGCompositeFrame* f)
422  {
423  unsigned int kCanvasWidth = 390;
424  unsigned int kCanvasHeight = 500;
425 
426  fUserFieldsCanvas = new
427  TGCanvas(f, kCanvasWidth, kCanvasHeight);
428  TGLayoutHints*
429  fUserFieldsCanvasHints = new TGLayoutHints(kLHintsExpandX|
430  kLHintsExpandY);
431  f->AddFrame(fUserFieldsCanvas, fUserFieldsCanvasHints);
432 
433  fScanFrame = new ScanFrame(fUserFieldsCanvas->GetViewPort());
434  fUserFieldsCanvas->SetContainer(fScanFrame->GetFrame());
435  fScanFrame->GetFrame()->SetCleanup(kDeepCleanup);
436  }
437 
438 
439  //--------------------------------------------------------------------
441  TGTransientFrame(gClient->GetRoot(), gClient->GetRoot(), 50, 50),
442  fUserFieldsCanvas(0),
443  fUserFieldsFrame(0),
444  fUserFieldsHints(0),
445  fButtonBar(0),
446  fButtonBarHints(0),
447  fCommentLabel(0),
448  fCommentEntry(0),
449  fPrevButton(0),
450  fNextButton(0),
451  fRcrdButton(0),
452  fButtonBarHintsL(0),
453  fButtonBarHintsC(0),
454  fButtonBarHintsR(0),
455  fScanFrame(0)
456  {
457  //
458  // Create a frame to hold the user-configurabale fields
459  //
460  unsigned int kWidth = 5*50;
461  unsigned int kHeight = 7*50;
463  new TGCompositeFrame(this, kWidth, kHeight);
465  new TGLayoutHints(kLHintsTop|kLHintsLeft|kLHintsExpandX|kLHintsExpandY);
466  this->AddFrame(fUserFieldsFrame, fUserFieldsHints);
467 
468  //
469  // Create a frame to hold the button bar at the bottom
470  //
471  unsigned int kButtonBarWidth = 388;
472  unsigned int kButtonBarHeight = 30;
473  fButtonBar =
474  new TGHorizontalFrame(this, kButtonBarHeight, kButtonBarWidth);
475  fButtonBarHints =
476  new TGLayoutHints(kLHintsBottom|kLHintsLeft);
477  this->AddFrame(fButtonBar, fButtonBarHints);
478 
479  this->BuildButtonBar (fButtonBar);
481  this->OpenOutputFile();
482 
483  //
484  // Finalize the window for display
485  //
486  this->Resize(kButtonBarWidth,kHeight+kButtonBarHeight);
487  this->MapSubwindows();
488  this->MapWindow();
489  this->SetWindowName("Scan dialog window");
490  }
491 
492  //--------------------------------------------------------------------
493 
495  {
496  // set up the file name to store the information
498  std::string user(gSystem->Getenv("USER"));
499  user.append("_");
500  TTimeStamp cur;
501  std::string time(cur.AsString("s"));
502  time.replace(time.find(" "), 1, "_");
503  fOutFileName.append(opts->fScanFileBase);
504  fOutFileName.append(user);
505  fOutFileName.append(time);
506  fOutFileName.append(".txt");
507 
508  std::ofstream outfile(fOutFileName.c_str());
509 
510  //output the labels so we know what each is
511  outfile << "Run Subrun Event ";
512 
513  //
514  // figure out how many categories and maximum number of items for
515  // a category
516  //
517  unsigned int maxFields = 1;
518  unsigned int pos = 0;
519  for(unsigned int c = 0; c < opts->fCategories.size(); ++c){
520  for(unsigned int p = 0; p < opts->fFieldsPerCategory[c]; ++p){
521  if(opts->fFieldsPerCategory[c] > maxFields) {
522  maxFields = opts->fFieldsPerCategory[c];
523  }
524  outfile << opts->fCategories[c].c_str() << ":"
525  << opts->fFieldLabels[pos+p].c_str() << " ";
526  }
527  pos += opts->fFieldsPerCategory[c];
528  } // end loop over categories
529 
530  if(opts->fIncludeMCInfo)
531  outfile << "Truth:PDG Vtx_x Vtx_y Vtx_Z "
532  << "Nu_E CCNC Lepton_E InteractionType ";
533 
534  outfile << "comments" << std::endl;
535  }
536 
537 
538 
539  //......................................................................
541  {
542  delete fScanFrame;
543  delete fButtonBarHintsR;
544  delete fButtonBarHintsC;
545  delete fButtonBarHintsL;
546  delete fRcrdButton;
547  delete fNextButton;
548  delete fPrevButton;
549  delete fCommentEntry;
550  delete fCommentLabel;
551  delete fButtonBarHints;
552  delete fButtonBar;
553  delete fUserFieldsHints;
554  delete fUserFieldsFrame;
555  delete fUserFieldsCanvas;
556  }
557 
558  //......................................................................
559  void ScanWindow::CloseWindow() { delete this; }
560 
561  //......................................................................
563  {
566  }
567 
568  //......................................................................
570  {
573  }
574 
575  //......................................................................
577  {
579  fCommentEntry->SetText("");
581  }
582 
583 }// namespace
double E(const int i=0) const
Definition: MCParticle.h:234
std::vector< unsigned int > fFieldsPerCategory
names of the various categories for the scan
Definition: ScanOptions.h:41
TGTextButton * fNextButton
Definition: ScanWindow.h:114
SubRunNumber_t subRun() const
Definition: Event.cc:35
int PdgCode() const
Definition: MCParticle.h:213
int CCNC() const
Definition: MCNeutrino.h:148
static void Set(int which)
Definition: NavState.cxx:24
const art::Event * GetEvent() const
Definition: EventHolder.cxx:45
int GetHeight() const
Definition: ScanWindow.cxx:175
TGGroupFrame * fFrame
Definition: ScanWindow.h:61
const simb::MCParticle & Nu() const
Definition: MCNeutrino.h:146
TGLayoutHints * fFieldFrameHints
Definition: ScanWindow.h:64
void Record(std::string outfilename, const char *comments)
Definition: ScanWindow.cxx:261
TGLayoutHints * fCatFrameLH
Definition: ScanWindow.h:65
std::string fScanFileBase
true if MC information is to be included in scan output
Definition: ScanOptions.h:31
std::vector< TGTextEntry * > fTextBoxes
Text box fields.
Definition: ScanWindow.h:69
std::vector< TGCheckButton * > fCheckButtons
Check button fields.
Definition: ScanWindow.h:73
std::string fOutFileName
Output file name for scan results.
Definition: ScanWindow.h:122
Manage all things related to colors for the event display.
TGTextEntry * fCommentEntry
Definition: ScanWindow.h:112
Singleton to hold the current art::Event for the event display.
std::vector< int > fRadioButtonIds
Ids for the radio buttons.
Definition: ScanWindow.h:74
TGLayoutHints * fFrameHints
Definition: ScanWindow.h:63
void BuildUserFields(TGCompositeFrame *f)
Definition: ScanWindow.cxx:421
A window containing dialog boxes for handscans.
TFile f
Definition: plotHisto.C:6
std::vector< std::string > fFieldLabels
types of the fields, ie TextEntry, Buttons, NumberEntry, etc
Definition: ScanOptions.h:43
std::vector< std::string > fFieldTypes
number of fields in each category
Definition: ScanOptions.h:42
int InteractionType() const
Definition: MCNeutrino.h:150
int GetWidth() const
Definition: ScanWindow.cxx:182
TGLayoutHints * fButtonBarHints
Definition: ScanWindow.h:110
std::vector< TGNumberEntry * > fNumberBoxes
Number box fields.
Definition: ScanWindow.h:71
TGLayoutHints * fUserFieldsHints
Definition: ScanWindow.h:106
void HandleMouseWheel(Event_t *event)
Definition: ScanWindow.cxx:190
TGLayoutHints * fButtonBarHintsL
Definition: ScanWindow.h:116
const simb::MCParticle & Lepton() const
Definition: MCNeutrino.h:147
TGCanvas * fUserFieldsCanvas
Scrollable frame for all user defined fields.
Definition: ScanWindow.h:104
static EventHolder * Instance()
Definition: EventHolder.cxx:15
virtual ~ScanFrame()
Definition: ScanWindow.cxx:143
std::vector< std::string > fCategories
base file name for scanning
Definition: ScanOptions.h:40
TGHorizontalFrame * fButtonBar
Frame to hold the buttons at the bottom of the window.
Definition: ScanWindow.h:109
double Vx(const int i=0) const
Definition: MCParticle.h:222
TGLabel * fCommentLabel
Definition: ScanWindow.h:111
ScanFrame * fScanFrame
The frame containing the scanner check boxes etc.
Definition: ScanWindow.h:121
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
void BuildButtonBar(TGHorizontalFrame *f)
Definition: ScanWindow.cxx:390
double Vz(const int i=0) const
Definition: MCParticle.h:224
TGTextButton * fPrevButton
Definition: ScanWindow.h:113
EventNumber_t event() const
Definition: EventID.h:116
std::vector< TGGroupFrame * > fCatFrames
Mother for a category.
Definition: ScanWindow.h:67
TGTextButton * fRcrdButton
Definition: ScanWindow.h:115
TGCanvas * fCanvas
Definition: ScanWindow.h:62
std::vector< TGLabel * > fNumberLabels
Label for number fields.
Definition: ScanWindow.h:70
TGCompositeFrame * fUserFieldsFrame
Definition: ScanWindow.h:105
TCEvent evt
Definition: DataStructs.cxx:8
Float_t e
Definition: plot.C:35
RunNumber_t run() const
Definition: Event.cc:29
Event generator information.
Definition: MCNeutrino.h:18
TGLayoutHints * fButtonBarHintsR
Definition: ScanWindow.h:118
std::vector< TGRadioButton * > fRadioButtons
Radio button fields.
Definition: ScanWindow.h:72
EventID id() const
Definition: Event.cc:23
double Vy(const int i=0) const
Definition: MCParticle.h:223
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
Event finding and building.
ScanFrame(TGCompositeFrame *f)
Definition: ScanWindow.cxx:37
std::vector< TGHorizontalFrame * > fFieldFrames
Mother for each field.
Definition: ScanWindow.h:68
Beam neutrinos.
Definition: MCTruth.h:23
static int kInputID
Definition: ScanWindow.cxx:32
std::vector< Handle< PROD > > getMany(SelectorBase const &selector=MatchAllSelector{}) const
TGLayoutHints * fButtonBarHintsC
Definition: ScanWindow.h:117