LArSoft  v07_13_02
Liquid Argon Software toolkit - http://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  std::vector< art::Handle< std::vector<simb::MCTruth> > > mclist;
315 
316  try {
317  evt->getManyByType(mclist);
318 
319  bool listok = (mclist.size()>0);
320  bool isnu = false;
321  if (listok) {
322  isnu = (mclist[0]->at(0).Origin()==simb::kBeamNeutrino);
323  }
324 
325  if (listok==false) {
326  mf::LogWarning("ScanWindow")
327  << "MC truth information requested for output file"
328  << " but no MCTruth objects found in event - "
329  << " put garbage numbers into the file";
330  outfile
331  << -999. << " " << -999. << " " << -999. << " "
332  << -999. << " " << -999. << " " << -999. << " " << -999.;
333  }
334 
335  if ( listok && isnu==false) {
336  mf::LogWarning("ScanWindow")
337  << "Unknown particle source or truth information N/A"
338  << " put garbage numbers into the file";
339  outfile
340  << -999. << " " << -999. << " " << -999. << " "
341  << -999. << " " << -999. << " " << -999.<< " " << -999.;
342  }
343 
344  if (listok && isnu) {
345  // get the event vertex and energy information,
346  const simb::MCNeutrino& nu = mclist[0]->at(0).GetNeutrino();
347 
348  outfile << nu.Nu().PdgCode() << " "
349  << nu.Nu().Vx() << " "
350  << nu.Nu().Vy() << " "
351  << nu.Nu().Vz() << " "
352  << nu.Nu().E() << " "
353  << nu.CCNC() << " "
354  << nu.Lepton().E() << " "
355  << nu.InteractionType();
356  }
357  }
358  catch(cet::exception &e){
359  mf::LogWarning("ScanWindow")
360  << "MC truth information requested for output file"
361  << " but no MCTruth objects found in event - "
362  << " put garbage numbers into the file";
363  outfile
364  << -999. << " " << -999. << " " << -999. << " "
365  << -999. << " " << -999. << " " << -999.;
366  }
367  }//end if using MC information
368 
369  // end this line for the event
370  outfile << " " << comments << std::endl;
371  }
372 
373  //......................................................................
374 
376  {
377  TGButton *b = (TGButton *)gTQSender;
378  int id = b->WidgetId();
379 
380  if(fRadioButtonIds.size() < 2) return;
381 
382  if(id >= fRadioButtonIds[0] && id <= fRadioButtonIds[fRadioButtonIds.size()-1]){
383  for(unsigned int i = 0; i < fRadioButtonIds.size(); ++i)
384  if(fRadioButtons[i]->WidgetId() != id) fRadioButtons[i]->SetState(kButtonUp);
385  }
386 
387  return;
388  }
389 
390  //--------------------------------------------------------------------
391 
392  void ScanWindow::BuildButtonBar(TGHorizontalFrame* f)
393  {
394  fCommentLabel = new TGLabel (f, " Comments:");
395  fCommentEntry = new TGTextEntry (f);
396  fPrevButton = new TGTextButton(f, " <<Prev ");
397  fNextButton = new TGTextButton(f, " Next>> ");
398  fRcrdButton = new TGTextButton(f, " Record ");
399 
400  fPrevButton->Connect("Clicked()", "evdb::ScanWindow", this, "Prev()");
401  fNextButton->Connect("Clicked()", "evdb::ScanWindow", this, "Next()");
402  fRcrdButton->Connect("Clicked()", "evdb::ScanWindow", this, "Rec()");
403 
404  Pixel_t c;
405  gClient->GetColorByName("pink", c);
406  fRcrdButton->ChangeBackground(c);
407 
408  fButtonBarHintsL = new TGLayoutHints(kLHintsBottom|kLHintsLeft,
409  4,2,2,8);
410  fButtonBarHintsC = new TGLayoutHints(kLHintsBottom|kLHintsLeft,
411  2,2,2,8);
412  fButtonBarHintsR = new TGLayoutHints(kLHintsBottom|kLHintsLeft,
413  2,4,2,8);
414  f->AddFrame(fCommentLabel, fButtonBarHintsL);
415  f->AddFrame(fCommentEntry, fButtonBarHintsC);
416  f->AddFrame(fPrevButton, fButtonBarHintsC);
417  f->AddFrame(fNextButton, fButtonBarHintsC);
418  f->AddFrame(fRcrdButton, fButtonBarHintsR);
419  }
420 
421  //--------------------------------------------------------------------
422 
423  void ScanWindow::BuildUserFields(TGCompositeFrame* f)
424  {
425  unsigned int kCanvasWidth = 390;
426  unsigned int kCanvasHeight = 500;
427 
428  fUserFieldsCanvas = new
429  TGCanvas(f, kCanvasWidth, kCanvasHeight);
430  TGLayoutHints*
431  fUserFieldsCanvasHints = new TGLayoutHints(kLHintsExpandX|
432  kLHintsExpandY);
433  f->AddFrame(fUserFieldsCanvas, fUserFieldsCanvasHints);
434 
435  fScanFrame = new ScanFrame(fUserFieldsCanvas->GetViewPort());
436  fUserFieldsCanvas->SetContainer(fScanFrame->GetFrame());
437  fScanFrame->GetFrame()->SetCleanup(kDeepCleanup);
438  }
439 
440 
441  //--------------------------------------------------------------------
443  TGTransientFrame(gClient->GetRoot(), gClient->GetRoot(), 50, 50),
444  fUserFieldsCanvas(0),
445  fUserFieldsFrame(0),
446  fUserFieldsHints(0),
447  fButtonBar(0),
448  fButtonBarHints(0),
449  fCommentLabel(0),
450  fCommentEntry(0),
451  fPrevButton(0),
452  fNextButton(0),
453  fRcrdButton(0),
454  fButtonBarHintsL(0),
455  fButtonBarHintsC(0),
456  fButtonBarHintsR(0),
457  fScanFrame(0)
458  {
459  //
460  // Create a frame to hold the user-configurabale fields
461  //
462  unsigned int kWidth = 5*50;
463  unsigned int kHeight = 7*50;
465  new TGCompositeFrame(this, kWidth, kHeight);
467  new TGLayoutHints(kLHintsTop|kLHintsLeft|kLHintsExpandX|kLHintsExpandY);
468  this->AddFrame(fUserFieldsFrame, fUserFieldsHints);
469 
470  //
471  // Create a frame to hold the button bar at the bottom
472  //
473  unsigned int kButtonBarWidth = 388;
474  unsigned int kButtonBarHeight = 30;
475  fButtonBar =
476  new TGHorizontalFrame(this, kButtonBarHeight, kButtonBarWidth);
477  fButtonBarHints =
478  new TGLayoutHints(kLHintsBottom|kLHintsLeft);
479  this->AddFrame(fButtonBar, fButtonBarHints);
480 
481  this->BuildButtonBar (fButtonBar);
483  this->OpenOutputFile();
484 
485  //
486  // Finalize the window for display
487  //
488  this->Resize(kButtonBarWidth,kHeight+kButtonBarHeight);
489  this->MapSubwindows();
490  this->MapWindow();
491  this->SetWindowName("Scan dialog window");
492  }
493 
494  //--------------------------------------------------------------------
495 
497  {
498  // set up the file name to store the information
500  std::string user(gSystem->Getenv("USER"));
501  user.append("_");
502  TTimeStamp cur;
503  std::string time(cur.AsString("s"));
504  time.replace(time.find(" "), 1, "_");
505  fOutFileName.append(opts->fScanFileBase);
506  fOutFileName.append(user);
507  fOutFileName.append(time);
508  fOutFileName.append(".txt");
509 
510  std::ofstream outfile(fOutFileName.c_str());
511 
512  //output the labels so we know what each is
513  outfile << "Run Subrun Event ";
514 
515  //
516  // figure out how many categories and maximum number of items for
517  // a category
518  //
519  unsigned int maxFields = 1;
520  unsigned int pos = 0;
521  for(unsigned int c = 0; c < opts->fCategories.size(); ++c){
522  for(unsigned int p = 0; p < opts->fFieldsPerCategory[c]; ++p){
523  if(opts->fFieldsPerCategory[c] > maxFields) {
524  maxFields = opts->fFieldsPerCategory[c];
525  }
526  outfile << opts->fCategories[c].c_str() << ":"
527  << opts->fFieldLabels[pos+p].c_str() << " ";
528  }
529  pos += opts->fFieldsPerCategory[c];
530  } // end loop over categories
531 
532  if(opts->fIncludeMCInfo)
533  outfile << "Truth:PDG Vtx_x Vtx_y Vtx_Z "
534  << "Nu_E CCNC Lepton_E InteractionType ";
535 
536  outfile << "comments" << std::endl;
537  }
538 
539 
540 
541  //......................................................................
543  {
544  delete fScanFrame;
545  delete fButtonBarHintsR;
546  delete fButtonBarHintsC;
547  delete fButtonBarHintsL;
548  delete fRcrdButton;
549  delete fNextButton;
550  delete fPrevButton;
551  delete fCommentEntry;
552  delete fCommentLabel;
553  delete fButtonBarHints;
554  delete fButtonBar;
555  delete fUserFieldsHints;
556  delete fUserFieldsFrame;
557  delete fUserFieldsCanvas;
558  }
559 
560  //......................................................................
561  void ScanWindow::CloseWindow() { delete this; }
562 
563  //......................................................................
565  {
568  }
569 
570  //......................................................................
572  {
575  }
576 
577  //......................................................................
579  {
581  fCommentEntry->SetText("");
583  }
584 
585 }// namespace
double E(const int i=0) const
Definition: MCParticle.h:237
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.h:72
int PdgCode() const
Definition: MCParticle.h:216
int CCNC() const
Definition: MCNeutrino.h:152
static void Set(int which)
Definition: NavState.cxx:24
const art::Event * GetEvent() const
Definition: EventHolder.cxx:45
static const unsigned int kHeight
int GetHeight() const
Definition: ScanWindow.cxx:175
TGGroupFrame * fFrame
Definition: ScanWindow.h:61
const simb::MCParticle & Nu() const
Definition: MCNeutrino.h:150
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:423
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:154
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:151
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
void getManyByType(std::vector< Handle< PROD >> &results) const
Definition: DataViewImpl.h:446
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:225
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:392
double Vz(const int i=0) const
Definition: MCParticle.h:227
TGTextButton * fPrevButton
Definition: ScanWindow.h:113
EventNumber_t event() const
Definition: EventID.h:117
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:5
static const unsigned int kWidth
Float_t e
Definition: plot.C:34
RunNumber_t run() const
Definition: Event.h:77
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.h:56
double Vy(const int i=0) const
Definition: MCParticle.h:226
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:21
static int kInputID
Definition: ScanWindow.cxx:32
TGLayoutHints * fButtonBarHintsC
Definition: ScanWindow.h:117