20 #include <TGButtonGroup.h>
21 #include <TGTextEntry.h>
33 static vector<DReferenceTrajectory*>
REFTRAJ;
36 static vector<pair<const DCoordinateSystem*,double> >
TRACKHITS;
37 static map<const DCoordinateSystem*,double>
S_VALS;
40 int colors[]={kBlue, kRed, kMagenta, kGreen, kCyan};
51 TGLayoutHints *lhints =
new TGLayoutHints(kLHintsNormal, 2,2,2,2);
52 TGLayoutHints *bhints =
new TGLayoutHints(kLHintsBottom|kLHintsCenterX, 2,2,2,2);
53 TGLayoutHints *bbhints =
new TGLayoutHints(kLHintsTop, 2,2, -8,-8);
54 TGLayoutHints *thints =
new TGLayoutHints(kLHintsTop|kLHintsCenterX, 2,2,2,2);
55 TGLayoutHints *ahints =
new TGLayoutHints(kLHintsLeft|kLHintsTop, 2,2,2,2);
56 TGLayoutHints *xhints =
new TGLayoutHints(kLHintsNormal|kLHintsExpandX, 2,2,2,2);
58 TGLayoutHints *dhints =
new TGLayoutHints(kLHintsExpandY|kLHintsCenterY, 2,2,2,2);
59 TGLayoutHints *ehints =
new TGLayoutHints(kLHintsCenterY, 2,2,2,2);
61 TGHorizontalFrame *mainframe =
new TGHorizontalFrame(
this);
62 AddFrame(mainframe, ahints);
65 TGHorizontalFrame *leftframe =
new TGHorizontalFrame(mainframe);
66 mainframe->AddFrame(leftframe, ahints);
69 TGVerticalFrame *canvasframe =
new TGVerticalFrame(leftframe);
70 leftframe->AddFrame(canvasframe, bhints);
73 canvas =
new TRootEmbeddedCanvas(
"Track Canvas", canvasframe, width, (UInt_t)(2.0*width), kSunkenFrame, GetWhitePixel());
74 canvasframe->AddFrame(
canvas, lhints);
75 canvas->SetScrolling(TGCanvas::kCanvasScrollBoth);
85 histocanvas =
new TRootEmbeddedCanvas(
"Histo Canvas", canvasframe, width, (UInt_t)(width/5.0), kSunkenFrame, GetWhitePixel());
87 histocanvas->SetScrolling(TGCanvas::kCanvasScrollBoth);
92 gPad->SetLeftMargin(0);
93 gPad->SetRightMargin(0);
94 gPad->SetTopMargin(0);
95 resi =
new TH1D(
"resi",
"", 30, -0.1, 0.1);
97 resi->SetFillStyle(3002);
98 resi->SetFillColor(kMagenta);
107 TGVButtonGroup *hitsbuttons =
new TGVButtonGroup(leftframe,
"Hit");
108 leftframe->AddFrame(hitsbuttons, thints);
109 for(
int i=34; i>=0; i--){
112 TGRadioButton *but =
new TGRadioButton(hitsbuttons, title);
113 hitsbuttons->AddFrame(but, bbhints);
117 TGVerticalFrame *rightframe =
new TGVerticalFrame(mainframe);
118 mainframe->AddFrame(rightframe, ahints);
121 TGGroupFrame *controlsframe =
new TGGroupFrame(rightframe,
"Controls", kHorizontalFrame);
122 rightframe->AddFrame(controlsframe, xhints);
125 TGVerticalFrame *panzoomresetframe =
new TGVerticalFrame(controlsframe);
126 controlsframe->AddFrame(panzoomresetframe, lhints);
127 TGHorizontalFrame *panzoomframe =
new TGHorizontalFrame(panzoomresetframe);
128 panzoomresetframe->AddFrame(panzoomframe, lhints);
131 TGGroupFrame *panframe =
new TGGroupFrame(panzoomframe,
"Pan", kHorizontalFrame);
132 panzoomframe->AddFrame(panframe, dhints);
133 TGTextButton *panleft =
new TGTextButton(panframe,
"<");
134 TGVerticalFrame *updownframe =
new TGVerticalFrame(panframe);
135 TGTextButton *panup =
new TGTextButton(updownframe,
"^");
136 TGTextButton *pandown =
new TGTextButton(updownframe,
"v");
137 updownframe->AddFrame(panup, dhints);
138 updownframe->AddFrame(pandown, dhints);
139 TGTextButton *panright =
new TGTextButton(panframe,
">");
140 panframe->AddFrame(panleft, ehints);
141 panframe->AddFrame(updownframe, dhints);
142 panframe->AddFrame(panright, ehints);
145 TGGroupFrame *zoomframe =
new TGGroupFrame(panzoomframe,
"Zoom", kVerticalFrame);
146 panzoomframe->AddFrame(zoomframe, lhints);
147 TGTextButton *zoomin =
new TGTextButton(zoomframe,
" + ");
148 TGTextButton *zoomout =
new TGTextButton(zoomframe,
" - ");
149 zoomframe->AddFrame(zoomin, lhints);
150 zoomframe->AddFrame(zoomout, lhints);
152 TGTextButton *reset =
new TGTextButton(panzoomresetframe,
"reset");
153 panzoomresetframe->AddFrame(reset, xhints);
155 slock =
new TGCheckButton(panzoomresetframe,
"lock s-axis");
156 panzoomresetframe->AddFrame(
slock, xhints);
157 slock->Connect(
"Clicked()",
"trk_mainframe",
this,
"DoMyRedraw()");
160 TGVerticalFrame *eventinfoframe =
new TGVerticalFrame(controlsframe);
161 controlsframe->AddFrame(eventinfoframe, thints);
164 TGGroupFrame *prevnextframe =
new TGGroupFrame(eventinfoframe,
"Event", kHorizontalFrame);
165 eventinfoframe->AddFrame(prevnextframe, thints);
166 TGTextButton *prev =
new TGTextButton(prevnextframe,
"<-- Prev");
167 TGTextButton *next =
new TGTextButton(prevnextframe,
"Next -->");
168 prevnextframe->AddFrame(prev, lhints);
169 prevnextframe->AddFrame(next, lhints);
171 next->Connect(
"Clicked()",
"hdv_mainframe", hdvmf,
"DoNext()");
172 prev->Connect(
"Clicked()",
"hdv_mainframe", hdvmf,
"DoPrev()");
173 next->Connect(
"Clicked()",
"trk_mainframe",
this,
"DoNewEvent()");
174 prev->Connect(
"Clicked()",
"trk_mainframe",
this,
"DoNewEvent()");
177 TGGroupFrame *infoframe =
new TGGroupFrame(eventinfoframe,
"Info", kVerticalFrame);
178 eventinfoframe->AddFrame(infoframe, thints);
181 for(
int i=0; i<4; i++){
183 sprintf(title,
"Track %d%s", i+1, i==0 ?
" (s-axis source)":
"");
184 TGGroupFrame *trackframe =
new TGGroupFrame(rightframe, title, kHorizontalFrame);
185 rightframe->AddFrame(trackframe, xhints);
188 TGLabel *lab =
new TGLabel(trackframe,
" ");
189 trackframe->AddFrame(lab, dhints);
190 lab->SetBackgroundColor(gROOT->GetColor(
colors[i%
ncolors])->GetPixel());
193 TGVerticalFrame *datatypeframe =
new TGVerticalFrame(trackframe);
194 trackframe->AddFrame(datatypeframe, thints);
196 TGLabel *datatypelab =
new TGLabel(datatypeframe,
"Data type:");
197 datatypeframe->AddFrame(datatypelab, lhints);
199 TGComboBox *
datatype =
new TGComboBox(datatypeframe,
"DTrackCandidate", i);
200 datatypeframe->AddFrame(datatype, lhints);
201 this->datatype.push_back(datatype);
202 datatype->Resize(120,20);
203 datatype->SetUniqueID(i);
206 datatype->Connect(
"Selected(Int_t, Int_t)",
"trk_mainframe",
this,
"DoTagMenuUpdate(Int_t, Int_t)");
207 datatype->Connect(
"Selected(Int_t)",
"trk_mainframe",
this,
"DoRequestFocus(Int_t)");
210 TGVerticalFrame *factorytagframe =
new TGVerticalFrame(trackframe);
211 trackframe->AddFrame(factorytagframe, thints);
213 TGLabel *factorytaglab =
new TGLabel(factorytagframe,
"Factory Tag:");
214 factorytagframe->AddFrame(factorytaglab, lhints);
216 TGComboBox *
factorytag =
new TGComboBox(factorytagframe,
"<default>", i);
217 factorytagframe->AddFrame(factorytag, lhints);
218 this->factorytag.push_back(factorytag);
219 factorytag->Resize(100,20);
220 factorytag->SetUniqueID(i);
223 factorytag->Connect(
"Selected(Int_t, Int_t)",
"trk_mainframe",
this,
"DoTrackNumberMenuUpdate(Int_t, Int_t)");
224 factorytag->Connect(
"Selected(Int_t)",
"trk_mainframe",
this,
"DoRequestFocus(Int_t)");
227 TGVerticalFrame *tracknoframe =
new TGVerticalFrame(trackframe);
228 trackframe->AddFrame(tracknoframe, thints);
230 TGLabel *tracknolab =
new TGLabel(tracknoframe,
"Track:");
231 tracknoframe->AddFrame(tracknolab, lhints);
233 TGComboBox *
trackno =
new TGComboBox(tracknoframe, i==0 ?
"0":
"", 0);
234 tracknoframe->AddFrame(trackno, lhints);
235 this->trackno.push_back(trackno);
236 trackno->Resize(85, 20);
237 trackno->SetUniqueID(i);
239 trackno->Connect(
"Selected(Int_t)",
"trk_mainframe",
this,
"DoRequestFocus(Int_t)");
240 trackno->Connect(
"Selected(Int_t)",
"trk_mainframe",
this,
"DoMyRedraw()");
245 TGGroupFrame *trackinfoframe =
new TGGroupFrame(rightframe,
"Track Info", kVerticalFrame);
246 rightframe->AddFrame(trackinfoframe, xhints);
249 TGGroupFrame *hitinfoframe =
new TGGroupFrame(rightframe,
"Hit Info", kVerticalFrame);
250 rightframe->AddFrame(hitinfoframe, xhints);
254 SetWindowName(
"Hall-D Event Viewer:Track Inspector");
255 SetIconName(
"HDView:TrackInspector");
257 Resize(GetDefaultSize());
295 double smargin = 0.10*(
shi-
slo);
301 canvas->GetCanvas()->cd();
306 canvas->GetCanvas()->cd(0);
308 canvas->GetCanvas()->Update();
313 static TF1 *mygaus = 0;
315 mygaus =
new TF1(
"mygaus",
"[0]*exp(-0.5*((x-[1])/[2])**2)", -1e99, 1e99);
316 mygaus->SetParameter(0,
resi->GetMaximum());
317 mygaus->SetParameter(1,
resi->GetMean());
318 mygaus->SetParameter(2,
resi->GetStdDev());
319 resi->Fit(mygaus,
"Q");
320 double sigma = mygaus->GetParameter(2);
324 sprintf(title,
"#sigma=%3.0f#mum",sigma*1.0E4);
326 resi_lab->SetText(
resi->GetXaxis()->GetXmax(),
resi->GetMaximum()*0.5, title);
327 TVirtualPad *
pad = gPad;
349 for(
unsigned int i=0; i<
factorytag.size(); i++){
359 if(widgetId>=0 && widgetId<(
int)
datatype.size()){
361 factorytag[widgetId]->EmitVA(
"Selected(Int_t, Int_t)", 2, widgetId,
id);
370 if(widgetId>=0 && widgetId<(
int)
datatype.size()){
395 vector<string> facnames;
396 if(def==
"<none>")facnames.push_back(def);
397 facnames.push_back(
"DTrackTimeBased");
398 facnames.push_back(
"DTrackWireBased");
399 facnames.push_back(
"DTrackCandidate");
400 facnames.push_back(
"DMCThrown");
403 for(
unsigned int i=0; i<facnames.size(); i++){
404 cb->AddEntry(facnames[i].c_str(), i);
405 if(def==facnames[i]){
406 cb->Select(i, kTRUE);
407 cb->GetTextEntry()->SetText(def.c_str());
422 string dataname = datanamecb->GetTextEntry()->GetText();
425 vector<JFactory_base*> factories;
431 tags.push_back(
"<default>");
432 for(
unsigned int i=0; i<factories.size(); i++){
433 if(dataname == factories[i]->GetDataClassName()){
434 string tag = factories[i]->Tag();
435 if(tag!=
"")tags.push_back(tag);
440 for(
unsigned int i=0; i<tags.size(); i++){
441 cb->AddEntry(tags[i].c_str(), i);
442 if(def==tags[i] || (def==
"" && tags[i]==
"<default>")){
443 cb->Select(i, kTRUE);
444 cb->GetTextEntry()->SetText(tags[i].c_str());
450 if(dataname==
"<none>"){
451 cb->GetTextEntry()->SetText(
"");
453 string str = cb->GetTextEntry()->GetText();
454 if(str==
"")cb->GetTextEntry()->SetText(
"<default>");
468 string dataname = datanamecb->GetTextEntry()->GetText();
469 string tag = tagcb->GetTextEntry()->GetText();
477 string deftrackno = cb->GetTextEntry()->GetText();
478 if(deftrackno==
"")deftrackno=
"0";
482 if(add_best_match_option){
483 cb->AddEntry(
"Best Match", 1001);
484 cb->Select(1001, kTRUE);
485 cb->GetTextEntry()->SetText(
"Best Match");
489 for(
int i=0; i<Nrows; i++){
492 cb->AddEntry(str, i);
494 cb->Select(i, kTRUE);
495 cb->GetTextEntry()->SetText(str);
501 if(dataname==
"<none>" || Nrows==0){
502 cb->GetTextEntry()->SetText(
"");
513 double x1 = c->GetX1();
514 double x2 = c->GetX2();
515 double y1 = c->GetY1();
516 double y2 = c->GetY2();
517 double deltax = x2-x1;
519 double deltay = y2-y1;
520 double xlo = x1+0.025*deltax;
521 double xhi = xlo + 0.06*deltax;
522 double ylo = y1+0.015*deltay;
523 double yhi = ylo + 0.03*deltay;
524 TArrow *yarrow =
new TArrow(xlo, ylo, xlo, yhi, 0.02,
">");
525 yarrow->SetLineWidth((Width_t)1.5);
526 graphics.push_back(yarrow);
528 TLatex *ylabel =
new TLatex(xlo, yhi+0.005*deltay, ylab);
529 ylabel->SetTextAlign(12);
530 ylabel->SetTextAngle(90.0);
531 ylabel->SetTextSize(0.04);
532 graphics.push_back(ylabel);
534 TArrow *xarrow =
new TArrow(xlo, ylo, xhi, ylo, 0.02,
">");
535 xarrow->SetLineWidth((Width_t)1.5);
536 graphics.push_back(xarrow);
538 TLatex *xlabel =
new TLatex(xhi+0.005*deltax, ylo, xlab);
539 xlabel->SetTextAlign(12);
540 xlabel->SetTextSize(0.04);
541 graphics.push_back(xlabel);
544 xlo = x1+0.08*deltax;
545 ylo = y1+0.05*deltay;
546 yhi = y1+0.95*deltay;
547 TGaxis *axis =
new TGaxis(xlo , ylo, xlo, yhi, ylo, yhi, 510,
"-RW");
548 graphics.push_back(axis);
551 xhi = x1+0.95*deltax;
552 axis =
new TGaxis(xhi , ylo, xhi, yhi, ylo, yhi, 510,
"+-U");
553 graphics.push_back(axis);
556 axis =
new TGaxis(xlo , yhi, xhi, yhi, xlo, xhi, 510,
"-R");
557 graphics.push_back(axis);
560 axis =
new TGaxis(xlo , ylo, xhi, ylo, xlo, xhi, 510,
"+UW");
561 graphics.push_back(axis);
562 axis =
new TGaxis(xlo+0.2*deltax, ylo, xhi, ylo, xlo+0.2*deltax, xhi, 507,
"+L");
563 graphics.push_back(axis);
566 TLine *l =
new TLine(0.0, ylo, 0.0, yhi);
567 graphics.push_back(l);
576 string dataname =
datatype[0]->GetTextEntry()->GetText();
577 string tag =
factorytag[0]->GetTextEntry()->GetText();
583 if(track==
""){
_DBG_<<
"No prime tracks!"<<endl;
return;}
584 if(tag==
"<default>")tag=
"";
585 unsigned int index = atoi(track.c_str());
593 vector<const DCDCTrackHit*> cdctrackhits;
596 _DBG_<<
"Reference trajectory unavailable for "<<dataname<<
":"<<tag<<
" #"<<index<<endl;
603 vector<pair<const DCoordinateSystem*,double> > allhits;
610 for(
unsigned int i=1; i<
datatype.size(); i++){
611 dataname =
datatype[i]->GetTextEntry()->GetText();
612 tag =
factorytag[i]->GetTextEntry()->GetText();
613 track =
trackno[i]->GetTextEntry()->GetText();
614 if(track==
"")
continue;
615 if(tag==
"<default>")tag=
"";
616 unsigned int index = atoi(track.c_str());
617 if(track==
"Best Match"){
636 vector<TObject*> &graphics,
637 vector<pair<const DCoordinateSystem*,double> > &allhits,
640 vector<const DCDCTrackHit*> &cdctrackhits)
650 bool lock_s_coordinate =
slock->GetState();
653 vector<const DTrackFitter*> fitters;
656 if (fitters.size() > 0)
657 fitter = dynamic_cast<const DTrackFitterKalmanSIMD *>(fitters[0]);
660 vector<pair<const DCoordinateSystem*,double> > &hits = index==0 ? allhits:
TRACKHITS;
663 for(
unsigned int i=0; i<hits.size(); i++){
665 double dist = hits[i].second;
668 if(wire==NULL){
_DBG_<<
"wire==NULL!!"<<endl;
continue;}
669 if(rt==NULL){
_DBG_<<
"rt==NULL!!"<<endl;
continue;}
670 double doca = rt->
DistToRT(wire, &s);
680 double mass = 0.13957;
681 double beta = 1.0/
sqrt(1.0 + pow(mass/mom_doca.Mag(), 2.0))*2.998E10;
682 double tof = s/beta/1.0E-9;
686 #if PRINT_DRIFT_DISTANCE_MAP
687 static bool print_the_map=
true;
689 print_the_map =
false;
690 for (
double t=0; t < 2.5; t += 0.001) {
692 std::cout << d <<
" " << t << std::endl;
705 DVector3 pos_diff = pos_doca-pos_wire;
706 double sdist = pos_diff.Mag();
707 if(shift.Dot(pos_diff)<0.0){
716 double resi = fabs(doca)-fabs(dist);
717 if(!isfinite(resi))
continue;
718 #if VERBOSE_PRINT_FDC_HIT_INFO
720 <<
"hit " << i <<
": "
722 <<
" (" << shift[0] <<
"," << shift[1] <<
"," << shift[2] <<
")"
723 <<
", sdist=" << sdist
724 <<
" (" << pos_diff[0] <<
"," << pos_diff[1] <<
"," << pos_diff[2] <<
")"
726 <<
" at (" << pos_doca[0] <<
"," << pos_doca[1] <<
"," << pos_doca[2] <<
")"
731 if(index==0)
TRACKHITS.push_back(hits[i]);
736 TMarker *m =
new TMarker(sdist, s, 20);
737 m->SetMarkerSize(1.6);
738 m->SetMarkerColor(kYellow);
739 graphics.push_back(m);
740 this->resi->Fill(resi);
750 int marker_style = 20;
751 double ellipse_width = 0.8;
754 if(cdcwire!=NULL && cdcwire->
stereo!=0.0){
756 ellipse_color += cdcwire->
stereo>0.0 ? 4:-2;
761 int ellipse_style = 1;
770 if(lock_s_coordinate){
775 map<const DCoordinateSystem*,double>::iterator iter =
S_VALS.find(wire);
783 TEllipse *
e =
new TEllipse(sdist, s, dist, dist);
784 e->SetLineWidth((Width_t)ellipse_width);
785 e->SetLineColor(ellipse_color);
786 e->SetLineStyle(ellipse_style);
788 graphics.push_back(e);
791 TMarker *m =
new TMarker(sdist, s, marker_style);
792 m->SetMarkerSize(1.5);
794 graphics.push_back(m);
804 for(
unsigned int i=0; i<cdctrackhits.size(); i++){
805 if(cdctrackhits[i]->wire == wire)
return true;
vector< TGComboBox * > datatype
TRootEmbeddedCanvas * histocanvas
trk_mainframe(hdv_mainframe *hdvmf, const TGWindow *p, UInt_t w, UInt_t h)
void DoTagMenuUpdate(Int_t widgetId, Int_t id)
sprintf(text,"Post KinFit Cut")
DVector3 GetLastDOCAPoint(void) const
double GetFDCDriftDistance(double time, double Bz) const
void DoTrackNumberMenuUpdate(Int_t widgetId, Int_t id)
double GetLastDistAlongWire(void) const
static char index(char c)
swim_step_t * FindClosestSwimStep(const DCoordinateSystem *wire, int *istep_ptr=NULL) const
void DrawAxes(TCanvas *c, vector< TObject * > &graphics, const char *xlab, const char *ylab)
double DistToRT(double x, double y, double z) const
static vector< pair< const DCoordinateSystem *, double > > TRACKHITS
vector< TGComboBox * > trackno
vector< TObject * > graphics
vector< TGComboBox * > factorytag
void GetDReferenceTrajectory(string dataname, string tag, unsigned int index, DReferenceTrajectory *&rt, vector< const DCDCTrackHit * > &cdchits)
void FillDataTypeComboBox(TGComboBox *cb, const string &def="DTrack")
Double_t sigma[NCHANNELS]
void GetFactories(vector< JFactory_base * > &factories)
void GetAllWireHits(vector< pair< const DCoordinateSystem *, double > > &allhits)
TRootEmbeddedCanvas * canvas
void DoClearTrackInspectorPointer(void)
void DrawHitsForOneTrack(TVector3 &pos, TVector3 &mom, vector< TObject * > &graphics)
static map< const DCoordinateSystem *, double > S_VALS
void FillTrackNumberComboBox(TGComboBox *cb, TGComboBox *datanamecb, TGComboBox *tagcb, bool add_best_match_option)
static vector< DReferenceTrajectory * > REFTRAJ
void DoRequestFocus(Int_t id)
const DTrackFitter * fitter
bool WireInList(const DCoordinateSystem *wire, vector< const DCDCTrackHit * > &cdctrackhits)
locHist_NumHighLevel Draw("COLZ")
void DrawHits(vector< TObject * > &graphics)
void FillFactoryTagComboBox(TGComboBox *cb, TGComboBox *datanamecb, const string &def)
unsigned int GetNrows(const string &factory, string tag)