Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
hdv_debugerframe.cc
Go to the documentation of this file.
1 
2 #include <iostream>
3 #include <iomanip>
4 #include <sstream>
5 #include <cmath>
6 #include <fstream>
7 using namespace std;
8 
9 #include <pthread.h>
10 
11 #include <TRACKING/DMCThrown.h>
14 #include "hdview2.h"
15 #include "MyProcessor.h"
16 #include "hdv_debugerframe.h"
17 #include "FDC/DFDCGeometry.h"
18 #include "FCAL/DFCALGeometry.h"
19 #include "DVector2.h"
20 #include "HDGEOMETRY/DGeometry.h"
21 #include "PID/DNeutralParticle.h"
22 #include <PID/DKinematicData.h>
23 
24 #include <TPolyMarker.h>
25 #include <TLine.h>
26 #include <TMarker.h>
27 #include <TBox.h>
28 #include <TVector3.h>
29 #include <TGeoVolume.h>
30 #include <TGeoManager.h>
31 #include <TGLabel.h>
32 #include <TGComboBox.h>
33 #include <TGButton.h>
34 #include <TGButtonGroup.h>
35 #include <TGTextEntry.h>
36 #include <TArrow.h>
37 #include <TLatex.h>
38 #include <TColor.h>
39 #include <TG3DLine.h>
40 #include <TMath.h>
41 
42 extern JApplication *japp;
43 //TGeoVolume *MOTHER = NULL;
44 //TGeoCombiTrans *MotherRotTrans = NULL;
45 
46 extern int GO;
47 
48 //-------------------
49 // Constructor
50 //-------------------
51 hdv_debugerframe::hdv_debugerframe(hdv_mainframe *hdvmf, const TGWindow *p, UInt_t w, UInt_t h):TGMainFrame(p,w,h)
52 {
53  this->hdvmf = hdvmf;
54  NTrCand = 0;
55  NTrWireBased = 0;
56  NTrTimeBased = 0;
57  InitMid1Frame = 0;
58  InitMid2Frame = 0;
59 
60  // First, define all of the of the graphics objects. Below that, make all
61  // of the connections to the methods so these things will work!
62 
63  // The main GUI window is divided into three sections, top, middle, and bottom.
64  // Create those frames here.
65  TGLayoutHints *hints = new TGLayoutHints(kLHintsNormal|kLHintsExpandX|kLHintsExpandY|kLHintsLeft, 5,5,5,5);
66  TGLayoutHints *lhints = new TGLayoutHints(kLHintsNormal, 2,2,2,2);
67  TGLayoutHints *chints = new TGLayoutHints(kLHintsCenterY|kLHintsCenterX, 2,2,2,2);
68  TGLayoutHints *xhints = new TGLayoutHints(kLHintsNormal|kLHintsExpandX, 2,2,2,2);
69 
70  topframe = new TGHorizontalFrame(this, 800, 500);
71  mid1frame = new TGHorizontalFrame(this, 800, 500);
72  mid2frame = new TGHorizontalFrame(this, 800, 500);
73  botframe = new TGHorizontalFrame(this, 400, 50);
74 
75  AddFrame(topframe, lhints);
76  AddFrame(mid1frame, lhints);
77  AddFrame(mid2frame, lhints);
78  AddFrame(botframe, chints);
79 
80 
81  // top frame for track Candidates
82  hitdrawopts = new TGGroupFrame(topframe, "Track Candidate Hits", kVerticalFrame);
83  topframe->AddFrame(hitdrawopts, lhints);
84 
85  for (int k=0;k<10;k++){
86  char str1[128];
87  sprintf(str1,"Candidate%d",k+1);
88  char str2[128];
89  if (k<NTrCand){
90  sprintf(str2,"Hits Track Candidate %d",k+1);
91  if (k>9)
92  sprintf(str2,"Hits Track Candidate %d",k+1);
93  } else {
94  sprintf(str2,".......................");
95  }
96  checkbuttons[str1] = new TGCheckButton(hitdrawopts, str2);
97  hitdrawopts->AddFrame(checkbuttons[str1],lhints);
98  }
99 
100  // Track Candidate Info
101  TGGroupFrame *trackinfo = new TGGroupFrame(topframe, " trk: type: p: theta: phi: z: ", kHorizontalFrame);
102  topframe->AddFrame(trackinfo, hints);
103  // Column names
104  vector<string> colnames;
105  colnames.push_back("trk");
106  colnames.push_back("type");
107  colnames.push_back("p");
108  colnames.push_back("theta");
109  colnames.push_back("phi");
110  colnames.push_back("z");
111 
112  for(unsigned int i=0; i<colnames.size(); i++){
113  // create frames
114  tf[colnames[i]] = new TGVerticalFrame(trackinfo);
115  trackinfo->AddFrame( tf[colnames[i]], xhints);
116  //string lab = colnames[i]+":";
117  //TGLabel *tl = new TGLabel(tf[colnames[i]], lab.c_str());
118  //tf[colnames[i]]->AddFrame(tl, chints);
119 
120  vector<TGLabel*> tv;
121  //tv.push_back(tl);
122  for (int k=0;k<10;k++){
123  TGLabel *lab = new TGLabel(tf[colnames[i]],"-----");
124  tf[colnames[i]]->AddFrame(lab, chints);
125  tv.push_back(lab);
126  }
127  candlabs[colnames[i]] = tv;
128  }
129 
130  for (int k=0;k<10;k++){
131  if (k<(int)TrackCandidates.size()){
132  const DKinematicData *trk = TrackCandidates[k];
133  stringstream trkno, type, p, theta, phi, z;
134  trkno<<setprecision(4)<<k+1;
135  candlabs["trk"][k]->SetText(trkno.str().c_str());
136 
137  double mass = trk->mass();
138  if(fabs(mass-0.13957)<1.0E-4)type<<"pi";
139  else if(fabs(mass-0.93827)<1.0E-4)type<<"proton";
140  else if(fabs(mass-0.493677)<1.0E-4)type<<"K";
141  else if(fabs(mass-0.000511)<1.0E-4)type<<"e";
142  else if (fabs(mass)<1.e-4 && fabs(trk->charge())<1.e-4) type << "gamma";
143  else type<<"q=";
144  if (fabs(trk->charge())>1.e-4){
145  type<<(trk->charge()>0 ? "+":"-");
146  }
147  int row = k;
148  candlabs["type"][row]->SetText(type.str().c_str());
149 
150  p<<setprecision(3)<<fixed<<trk->momentum().Mag();
151  candlabs["p"][row]->SetText(p.str().c_str());
152 
153  theta<<setprecision(2)<<fixed<<trk->momentum().Theta()*TMath::RadToDeg();
154  candlabs["theta"][row]->SetText(theta.str().c_str());
155 
156  double myphi = trk->momentum().Phi();
157  if(myphi<0.0)myphi+=2.0*M_PI;
158  phi<<setprecision(2)<<fixed<<myphi;
159  candlabs["phi"][row]->SetText(phi.str().c_str());
160 
161  z<<setprecision(2)<<fixed<<trk->position().Z();
162  candlabs["z"][row]->SetText(z.str().c_str());
163  } else {
164  int row = k;
165  candlabs["trk"][row]->SetText("------");
166  candlabs["type"][row]->SetText("------");
167  candlabs["p"][row]->SetText("------");
168  candlabs["theta"][row]->SetText("------");
169  candlabs["phi"][row]->SetText("------");
170  candlabs["z"][row]->SetText("------");
171  }
172 
173  }
174 
175  // mid1 frame for Wire based Tracking
176  hitdrawoptsWB = new TGGroupFrame(mid1frame, "Wire Based Hits", kVerticalFrame);
177  mid1frame->AddFrame(hitdrawoptsWB, lhints);
178  trackinfoWB = new TGGroupFrame(mid1frame, " trk: type: p: theta: phi: z: chisq/Ndof: Ndof: cand:",
179  kHorizontalFrame);
180  mid1frame->AddFrame(trackinfoWB, hints);
181  SetUpMid1Frame();
182 
183 
184 
185  hitdrawoptsTB = new TGGroupFrame(mid2frame, "Time Based Hits", kVerticalFrame);
186  mid2frame->AddFrame(hitdrawoptsTB, lhints);
187  trackinfoTB = new TGGroupFrame(mid2frame, " trk: type: p: theta: phi: z: chisq/Ndof: Ndof: cand:",
188  kHorizontalFrame);
189  mid2frame->AddFrame(trackinfoTB, hints);
190  SetUpMid2Frame();
191 
192 
193  //========== Done Button ===========
194  done = new TGTextButton(botframe,"Done");
195  botframe->AddFrame(done, chints);
196 
197  //&&&&&&&&&&&&&&&& Connections
198  map<string, TGCheckButton*>::iterator iter = checkbuttons.begin();
199  for(; iter!=checkbuttons.end(); iter++){
200  iter->second->Connect("Clicked()","hdv_mainframe", hdvmf, "DoMyRedraw()");
201  }
202 
203  // Add out checkbuttons to the list kept in hdv_mainframe
205 
206  // Finish up and map the window
207  SetWindowName("Hall-D Event Viewer Debugger");
208  SetIconName("HDView");
209 
210  done->Connect("Clicked()","hdv_debugerframe", this, "DoDone()");
211  this->Connect("CloseWindow()", "hdv_debuggerframe", this, "DoDone()");
212  this->DontCallClose();
213 
214  SetWindowName("Hall-D Event View Debugger");
215  SetIconName("HDDebugView");
216 
217  MapSubwindows();
218  Resize(GetDefaultSize());
219 
220 }
221 
222 //-------------------
223 // DoDone
224 //-------------------
226 {
227  //LowerWindow();
228  UnmapWindow();
229 }
230 
231 //-------------------
232 // UpdateTrackLables
233 //-------------------
234 
236 {
237 
238  int size = NTrCand;
239  for (int k=0;k<10;k++){
240  char str1[128];
241  sprintf(str1,"Candidate%d",k+1);
242  char str2[128];
243  if (k<size){
244  sprintf(str2,"Hits Track Candidate %d",k+1);
245  if (k>9)
246  sprintf(str2,"Hits Track Candidate %d",k+1);
247  } else {
248  sprintf(str2,".......................");
249  }
250  checkbuttons[str1]->SetText(str2);
251 
252  }
253  for (int k=0;k<10;k++){
254 
255  if (k<(int)TrackCandidates.size()){
256  const DKinematicData *trk = TrackCandidates[k];
257  stringstream trkno, type, p, theta, phi, z;
258  trkno<<setprecision(4)<<k+1;
259  int row = k;
260  candlabs["trk"][row]->SetText(trkno.str().c_str());
261 
262  double mass = trk->mass();
263  if(fabs(mass-0.13957)<1.0E-4)type<<"pi";
264  else if(fabs(mass-0.93827)<1.0E-4)type<<"proton";
265  else if(fabs(mass-0.493677)<1.0E-4)type<<"K";
266  else if(fabs(mass-0.000511)<1.0E-4)type<<"e";
267  else if (fabs(mass)<1.e-4 && fabs(trk->charge())<1.e-4) type << "gamma";
268  else type<<"q=";
269  if (fabs(trk->charge())>1.e-4){
270  type<<(trk->charge()>0 ? "+":"-");
271  }
272  candlabs["type"][row]->SetText(type.str().c_str());
273 
274  p<<setprecision(3)<<fixed<<trk->momentum().Mag();
275  candlabs["p"][row]->SetText(p.str().c_str());
276 
277  theta<<setprecision(2)<<fixed<<trk->momentum().Theta()*TMath::RadToDeg();
278  candlabs["theta"][row]->SetText(theta.str().c_str());
279 
280  double myphi = trk->momentum().Phi();
281  if(myphi<0.0)myphi+=2.0*M_PI;
282  phi<<setprecision(2)<<fixed<<myphi;
283  candlabs["phi"][row]->SetText(phi.str().c_str());
284 
285  z<<setprecision(2)<<fixed<<trk->position().Z();
286  candlabs["z"][row]->SetText(z.str().c_str());
287  } else {
288  int row = k;
289  candlabs["trk"][row]->SetText("------");
290  candlabs["type"][row]->SetText("------");
291  candlabs["p"][row]->SetText("------");
292  candlabs["theta"][row]->SetText("------");
293  candlabs["phi"][row]->SetText("------");
294  candlabs["z"][row]->SetText("------");
295  }
296  }
297 
298  SetUpMid1Frame();
299  SetUpMid2Frame();
300 
301  map<string, TGCheckButton*>::iterator iter = checkbuttons.begin();
302  for(; iter!=checkbuttons.end(); iter++){
303  iter->second->Connect("Clicked()","hdv_mainframe", hdvmf, "DoMyRedraw()");
304  }
305 
306  MapSubwindows();
307  Resize(GetDefaultSize());
308 
309 }
310 
311 //************************
312 //*
313 //* SetUpMid1Frame
314 //*
315 //************************
317 
318  TGLayoutHints *lhints = new TGLayoutHints(kLHintsNormal, 2,2,2,2);
319  TGLayoutHints *xhints = new TGLayoutHints(kLHintsNormal|kLHintsExpandX, 2,2,2,2);
320  TGLayoutHints *chints = new TGLayoutHints(kLHintsCenterY|kLHintsCenterX, 2,2,2,2);
321 
322 
323  for (int k=0;k<MaxWireTracks;k++){
324  char str1[128];
325  sprintf(str1,"WireBased%d",k+1);
326  char str2[128];
327  if (k<NTrWireBased){
328  if (k<10){
329  sprintf(str2,"Hits Wire Based Track %d",k+1);
330  } else {
331  sprintf(str2,"Hits Wire Based Track %d",k+1);
332  }
333  } else{
334  sprintf(str2,".......................");
335  }
336  if (!InitMid1Frame) {
337  checkbuttons[str1] = new TGCheckButton(hitdrawoptsWB, str2);
338  hitdrawoptsWB->AddFrame(checkbuttons[str1], lhints);
339  } else {
340  checkbuttons[str1]->SetText(str2);
341  }
342  }
343 
344  if (!InitMid1Frame) {
345  vector<string> colnamesw;
346  colnamesw.push_back("trk");
347  colnamesw.push_back("type");
348  colnamesw.push_back("p");
349  colnamesw.push_back("theta");
350  colnamesw.push_back("phi");
351  colnamesw.push_back("z");
352  colnamesw.push_back("chisq/Ndof");
353  colnamesw.push_back("Ndof");
354  colnamesw.push_back("cand");
355 
356  for(unsigned int i=0; i<colnamesw.size(); i++){
357  // create frames
358  tfWB[colnamesw[i]] = new TGVerticalFrame(trackinfoWB);
359  trackinfoWB->AddFrame( tfWB[colnamesw[i]], xhints);
360  //string lab = colnamesw[i]+":";
361  //TGLabel *tl = new TGLabel(tfWB[colnamesw[i]], lab.c_str());
362  //tfWB[colnamesw[i]]->AddFrame(tl, chints);
363 
364  vector<TGLabel*> tv;
365  //tv.push_back(tl);
366  for (int k=0;k<MaxWireTracks;k++){
367  TGLabel *lab = new TGLabel(tfWB[colnamesw[i]],"-----");
368  tfWB[colnamesw[i]]->AddFrame(lab, chints);
369  tv.push_back(lab);
370  }
371  wblabs[colnamesw[i]] = tv;
372  }
373 
374  InitMid1Frame = 1;
375  }
376 
377  for (int k=0;k<MaxWireTracks;k++){
378 
379  if (k<NTrWireBased) {
380 
381  const DTrackWireBased *trk = subTrackWireBased[k];
382  stringstream trkno, type, p, theta, phi, z, chisq_per_dof, Ndof, cand;
383  trkno<<setprecision(4)<<k+1;
384 
385  int row = k;
386  wblabs["trk"][row]->SetText(trkno.str().c_str());
387 
388  double mass = trk->mass();
389  if(fabs(mass-0.13957)<1.0E-4)type<<"pi";
390  else if(fabs(mass-0.93827)<1.0E-4)type<<"proton";
391  else if(fabs(mass-0.493677)<1.0E-4)type<<"K";
392  else if(fabs(mass-0.000511)<1.0E-4)type<<"e";
393  else if (fabs(mass)<1.e-4 && fabs(trk->charge())<1.e-4) type << "gamma";
394  else type<<"q=";
395  if (fabs(trk->charge())>1.e-4){
396  type<<(trk->charge()>0 ? "+":"-");
397  }
398 
399  wblabs["type"][row]->SetText(type.str().c_str());
400 
401  p<<setprecision(3)<<fixed<<trk->momentum().Mag();
402  wblabs["p"][row]->SetText(p.str().c_str());
403 
404  theta<<setprecision(2)<<fixed<<trk->momentum().Theta()*TMath::RadToDeg();
405  wblabs["theta"][row]->SetText(theta.str().c_str());
406 
407  double myphi = trk->momentum().Phi();
408  if(myphi<0.0)myphi+=2.0*M_PI;
409  phi<<setprecision(2)<<fixed<<myphi;
410  wblabs["phi"][row]->SetText(phi.str().c_str());
411 
412  z<<setprecision(2)<<fixed<<trk->position().Z();
413  wblabs["z"][row]->SetText(z.str().c_str());
414 
415  chisq_per_dof<<setprecision(1)<<fixed<<trk->chisq/trk->Ndof;
416  Ndof<<trk->Ndof;
417  cand << trk->candidateid;
418 
419  wblabs["chisq/Ndof"][row]->SetText(chisq_per_dof.str().c_str());
420  wblabs["Ndof"][row]->SetText(Ndof.str().c_str());
421  wblabs["cand"][row]->SetText(cand.str().c_str());
422 
423  } else {
424  wblabs["trk"][k]->SetText("-----");
425  wblabs["type"][k]->SetText("-----");
426  wblabs["p"][k]->SetText("-----");
427  wblabs["theta"][k]->SetText("-----");
428  wblabs["phi"][k]->SetText("-----");
429  wblabs["z"][k]->SetText("-----");
430  wblabs["chisq/Ndof"][k]->SetText("-----");
431  wblabs["Ndof"][k]->SetText("-----");
432  wblabs["cand"][k]->SetText("-----");
433 
434  }
435 
436  }
437 
438 }
439 //************************
440 //*
441 //* SetUpMid2Frame
442 //*
443 //************************
445 
446  TGLayoutHints *lhints = new TGLayoutHints(kLHintsNormal, 2,2,2,2);
447  TGLayoutHints *xhints = new TGLayoutHints(kLHintsNormal|kLHintsExpandX, 2,2,2,2);
448  TGLayoutHints *chints = new TGLayoutHints(kLHintsCenterY|kLHintsCenterX, 2,2,2,2);
449 
450 
451  for (int k=0;k<MaxTimeTracks;k++){
452  char str1[128];
453  sprintf(str1,"TimeBased%d",k+1);
454  char str2[128];
455  if (k<NTrTimeBased){
456  if (k<10){
457  sprintf(str2,"Hits Time Based Track %d",k+1);
458  } else {
459  sprintf(str2,"Hits Time Based Track %d",k+1);
460  }
461  } else{
462  sprintf(str2,".......................");
463  }
464  if (!InitMid2Frame) {
465  checkbuttons[str1] = new TGCheckButton(hitdrawoptsTB, str2);
466  hitdrawoptsTB->AddFrame(checkbuttons[str1], lhints);
467  } else {
468  checkbuttons[str1]->SetText(str2);
469  }
470  }
471 
472  if (!InitMid2Frame) {
473  vector<string> colnamesw;
474  colnamesw.push_back("trk");
475  colnamesw.push_back("type");
476  colnamesw.push_back("p");
477  colnamesw.push_back("theta");
478  colnamesw.push_back("phi");
479  colnamesw.push_back("z");
480  colnamesw.push_back("chisq/Ndof");
481  colnamesw.push_back("Ndof");
482  colnamesw.push_back("cand");
483 
484  for(unsigned int i=0; i<colnamesw.size(); i++){
485  // create frames
486  tfTB[colnamesw[i]] = new TGVerticalFrame(trackinfoTB);
487  trackinfoTB->AddFrame( tfTB[colnamesw[i]], xhints);
488  //string lab = colnamesw[i]+":";
489  //TGLabel *tl = new TGLabel(tfWB[colnamesw[i]], lab.c_str());
490  //tfWB[colnamesw[i]]->AddFrame(tl, chints);
491 
492  vector<TGLabel*> tv;
493  //tv.push_back(tl);
494  for (int k=0;k<MaxTimeTracks;k++){
495  TGLabel *lab = new TGLabel(tfTB[colnamesw[i]],"-----");
496  tfTB[colnamesw[i]]->AddFrame(lab, chints);
497  tv.push_back(lab);
498  }
499  tblabs[colnamesw[i]] = tv;
500  }
501 
502  InitMid2Frame = 1;
503  }
504 
505  for (int k=0;k<MaxTimeTracks;k++){
506 
507  if (k<NTrTimeBased) {
508 
509  const DTrackTimeBased *trk = subTrackTimeBased[k];
510  stringstream trkno, type, p, theta, phi, z, chisq_per_dof, Ndof, cand;
511  trkno<<setprecision(4)<<k+1;
512 
513  int row = k;
514  tblabs["trk"][row]->SetText(trkno.str().c_str());
515 
516  double mass = trk->mass();
517  if(fabs(mass-0.13957)<1.0E-4)type<<"pi";
518  else if(fabs(mass-0.93827)<1.0E-4)type<<"proton";
519  else if(fabs(mass-0.493677)<1.0E-4)type<<"K";
520  else if(fabs(mass-0.000511)<1.0E-4)type<<"e";
521  else if (fabs(mass)<1.e-4 && fabs(trk->charge())<1.e-4) type << "gamma";
522  else type<<"q=";
523  if (fabs(trk->charge())>1.e-4){
524  type<<(trk->charge()>0 ? "+":"-");
525  }
526 
527  tblabs["type"][row]->SetText(type.str().c_str());
528 
529  p<<setprecision(3)<<fixed<<trk->momentum().Mag();
530  tblabs["p"][row]->SetText(p.str().c_str());
531 
532  theta<<setprecision(2)<<fixed<<trk->momentum().Theta()*TMath::RadToDeg();
533  tblabs["theta"][row]->SetText(theta.str().c_str());
534 
535  double myphi = trk->momentum().Phi();
536  if(myphi<0.0)myphi+=2.0*M_PI;
537  phi<<setprecision(2)<<fixed<<myphi;
538  tblabs["phi"][row]->SetText(phi.str().c_str());
539 
540  z<<setprecision(2)<<fixed<<trk->position().Z();
541  tblabs["z"][row]->SetText(z.str().c_str());
542 
543  chisq_per_dof<<setprecision(1)<<fixed<<trk->chisq/trk->Ndof;
544  Ndof<<trk->Ndof;
545  cand << trk->candidateid;
546 
547  tblabs["chisq/Ndof"][row]->SetText(chisq_per_dof.str().c_str());
548  tblabs["Ndof"][row]->SetText(Ndof.str().c_str());
549  tblabs["cand"][row]->SetText(cand.str().c_str());
550 
551  } else {
552  tblabs["trk"][k]->SetText("-----");
553  tblabs["type"][k]->SetText("-----");
554  tblabs["p"][k]->SetText("-----");
555  tblabs["theta"][k]->SetText("-----");
556  tblabs["phi"][k]->SetText("-----");
557  tblabs["z"][k]->SetText("-----");
558  tblabs["chisq/Ndof"][k]->SetText("-----");
559  tblabs["Ndof"][k]->SetText("-----");
560  tblabs["cand"][k]->SetText("-----");
561 
562  }
563 
564  }
565 
566 }
map< string, vector< TGLabel * > > tblabs
float chisq
Chi-squared for the track (not chisq/dof!)
map< string, TGCheckButton * > checkbuttons
float chisq
Chi-squared for the track (not chisq/dof!)
vector< const DTrackTimeBased * > subTrackTimeBased
sprintf(text,"Post KinFit Cut")
hdv_debugerframe(hdv_mainframe *hdvmf, const TGWindow *p, UInt_t w, UInt_t h)
const DVector3 & position(void) const
TGGroupFrame * hitdrawoptsTB
map< string, TGVerticalFrame * > tf
oid_t candidateid
id of DTrackCandidate corresponding to this track
TGGroupFrame * trackinfoTB
JApplication * japp
TEllipse * e
TGGroupFrame * hitdrawopts
TGGroupFrame * hitdrawoptsWB
map< string, vector< TGLabel * > > candlabs
vector< const DKinematicData * > TrackCandidates
map< string, TGVerticalFrame * > tfTB
TGHorizontalFrame * mid2frame
TGHorizontalFrame * mid1frame
TGGroupFrame * trackinfoWB
#define MaxWireTracks
int Ndof
Number of degrees of freedom in the fit.
double charge(void) const
vector< const DTrackWireBased * > subTrackWireBased
TGHorizontalFrame * topframe
int Ndof
Number of degrees of freedom in the fit.
const DVector3 & momentum(void) const
TGHorizontalFrame * botframe
map< string, TGVerticalFrame * > tfWB
int GO
Definition: hdview2.cc:10
oid_t candidateid
which DTrackCandidate this came from
TGGroupFrame * trackinfo
hdv_mainframe * hdvmf
map< string, vector< TGLabel * > > wblabs
#define MaxTimeTracks
TGTextButton * done
void AddCheckButtons(map< string, TGCheckButton * > &checkbuttons)
hdv_mainframe * hdvmf
double mass(void) const