3 #include "TrackEditors.h"
4 #include <Reve/Track.h>
6 #include <Reve/RGValuators.h>
8 #include <TVirtualPad.h>
13 #include <TGNumberEntry.h>
14 #include <TGColorSelect.h>
15 #include <TGDoubleSlider.h>
16 #include <TGComboBox.h>
23 //______________________________________________________________________
27 ClassImp(TrackListEditor)
29 TrackListEditor::TrackListEditor(const TGWindow *p,
30 Int_t width, Int_t height,
31 UInt_t options, Pixel_t back) :
32 TGedFrame(p, width, height, options | kVerticalFrame, back),
55 MakeTitle("TrackList");
60 fMaxR = new RGValuator(this, "Max R:", 110, 0);
61 fMaxR->SetLabelWidth(labelW);
62 fMaxR->SetNELength(6);
64 fMaxR->SetLimits(0.1, 1000, 100, TGNumberFormat::kNESRealOne);
65 fMaxR->SetToolTip("Maximum radius to which the tracks will be drawn.");
66 fMaxR->Connect("ValueSet(Double_t)", "Reve::TrackListEditor", this, "DoMaxR()");
67 AddFrame(fMaxR, new TGLayoutHints(kLHintsTop, 1, 1, 1, 1));
69 fMaxZ = new RGValuator(this, "Max Z:", 110, 0);
70 fMaxZ->SetLabelWidth(labelW);
71 fMaxZ->SetNELength(6);
73 fMaxZ->SetLimits(0.1, 2000, 100, TGNumberFormat::kNESRealOne);
74 fMaxZ->SetToolTip("Maximum z-coordinate to which the tracks will be drawn.");
75 fMaxZ->Connect("ValueSet(Double_t)", "Reve::TrackListEditor", this, "DoMaxZ()");
76 AddFrame(fMaxZ, new TGLayoutHints(kLHintsTop, 1, 1, 1, 1));
79 TGHorizontalFrame* f = new TGHorizontalFrame(this);
80 TGLabel *l = new TGLabel(f, "Max Orbits:");
81 f->AddFrame(l, new TGLayoutHints(kLHintsTop | kLHintsCenterY, 0, 2, 1, 1));
82 fMaxOrbits = new TGNumberEntry(f, 0., 6, -1,
83 TGNumberFormat::kNESRealOne, TGNumberFormat::kNEAPositive,
84 TGNumberFormat::kNELLimitMinMax, 0.1, 100.0);
85 fMaxOrbits->GetNumberEntry()->SetToolTipText("Maximal angular path of tracks' orbits (1 ~ 2Pi).");
86 f->AddFrame(fMaxOrbits, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
87 fMaxOrbits->Associate(f);
88 fMaxOrbits->Connect("ValueSet(Long_t)", "Reve::TrackListEditor", this, "DoMaxOrbits()");
89 AddFrame(f, new TGLayoutHints(kLHintsTop, 1, 1, 1, 1));
93 TGHorizontalFrame* f = new TGHorizontalFrame(this);
94 TGLabel *l = new TGLabel(f, "Min Angle:");
95 f->AddFrame(l, new TGLayoutHints(kLHintsTop | kLHintsCenterY, 3, 2, 1, 1));
96 fMinAng = new TGNumberEntry(f, 0., 6, -1,
97 TGNumberFormat::kNESRealOne, TGNumberFormat::kNEAPositive,
98 TGNumberFormat::kNELLimitMinMax, 1, 180.0);
99 fMinAng->GetNumberEntry()->SetToolTipText("Minimal angular step between two helix points.");
100 f->AddFrame(fMinAng, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
101 fMinAng->Associate(f);
102 fMinAng->Connect("ValueSet(Long_t)", "Reve::TrackListEditor", this, "DoMinAng()");
103 AddFrame(f, new TGLayoutHints(kLHintsTop, 1, 1, 1, 1));
107 TGHorizontalFrame* f = new TGHorizontalFrame(this);
108 TGLabel *l = new TGLabel(f, "Delta:");
109 f->AddFrame(l, new TGLayoutHints(kLHintsTop | kLHintsCenterY, 32, 2, 1, 1));
110 fDelta = new TGNumberEntry(f, 0., 6, -1,
111 TGNumberFormat::kNESRealThree, TGNumberFormat::kNEAPositive,
112 TGNumberFormat::kNELLimitMinMax, 0.001, 100.0);
113 fDelta->GetNumberEntry()->SetToolTipText("Maximal error at the mid-point of the line connecting to helix points.");
114 f->AddFrame(fDelta, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
115 fDelta->Associate(f);
116 fDelta->Connect("ValueSet(Long_t)", "Reve::TrackListEditor", this, "DoDelta()");
117 AddFrame(f, new TGLayoutHints(kLHintsTop, 1, 1, 1, 1));
122 fPtRange = new RGDoubleValuator(this,"Pt Range", 200, 0);
123 fPtRange->SetNELength(6);
125 fPtRange->GetSlider()->SetWidth(224);
126 fPtRange->SetLimits(0, 10, TGNumberFormat::kNESRealTwo);
127 fPtRange->Connect("ValueSet()",
128 "Reve::TrackListEditor", this, "DoPtRange()");
129 AddFrame(fPtRange, new TGLayoutHints(kLHintsTop, 1, 1, 4, 1));
131 // --- Rendering control
133 TGHorizontalFrame* f = new TGHorizontalFrame(this);
134 fRnrTracks = new TGCheckButton(f, "Render tracks");
135 f->AddFrame(fRnrTracks, new TGLayoutHints(kLHintsLeft, 3, 1, 2, 0));
137 ("Toggled(Bool_t)", "Reve::TrackListEditor", this, "DoRnrTracks()");
138 fWidthCombo = new TGLineWidthComboBox(f);
139 fWidthCombo->Resize(80, 18);
140 f->AddFrame(fWidthCombo, new TGLayoutHints(kLHintsLeft, 8, 1, 0, 0));
143 ("Selected(Int_t)", "Reve::TrackListEditor", this, "DoLineWidth(Int_t)");
144 AddFrame(f, new TGLayoutHints(kLHintsTop, 1, 1, 3, 0));
147 // --- Kinematics fitting
149 fPMFrame = new TGHorizontalFrame(this);
151 TGGroupFrame* fitPM = new TGGroupFrame(fPMFrame, "PathMarks:", kLHintsTop | kLHintsCenterX);
152 fitPM->SetTitlePos(TGGroupFrame::kLeft);
153 fPMFrame->AddFrame( fitPM, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3));
155 TGMatrixLayout *ml = new TGMatrixLayout(fitPM, 0,1,6);
156 fitPM->SetLayoutManager(ml);
158 fFitDaughters = new TGCheckButton(fitPM, "Fit Daughters", PathMark::Daughter);
159 fFitReferences = new TGCheckButton(fitPM, "Fit Refs", PathMark::Reference);
160 fFitDecay = new TGCheckButton(fitPM, "Fit Decay", PathMark::Decay);
162 fitPM->AddFrame(fFitDaughters);
163 fitPM->AddFrame(fFitReferences);
164 fitPM->AddFrame(fFitDecay);
166 fFitDecay->Connect("Clicked()","Reve::TrackListEditor", this, "DoFitPM()");
167 fFitReferences->Connect("Clicked()","Reve::TrackListEditor", this, "DoFitPM()");
168 fFitDaughters->Connect("Clicked()","Reve::TrackListEditor", this, "DoFitPM()");
171 TGGroupFrame* rnrPM = new TGGroupFrame(fPMFrame, "PathMarks:", kLHintsTop | kLHintsCenterX);
172 rnrPM->SetTitlePos(TGGroupFrame::kLeft);
173 fPMFrame->AddFrame( rnrPM, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3));
175 TGMatrixLayout *ml = new TGMatrixLayout(rnrPM, 0,1,6);
176 rnrPM->SetLayoutManager(ml);
178 fRnrDaughters = new TGCheckButton(rnrPM, "Rnr Daughters", PathMark::Daughter);
179 fRnrReferences = new TGCheckButton(rnrPM, "Rnr Refs", PathMark::Reference);
180 fRnrDecay = new TGCheckButton(rnrPM, "Rnr Decay", PathMark::Decay);
182 rnrPM->AddFrame(fRnrDaughters);
183 rnrPM->AddFrame(fRnrReferences);
184 rnrPM->AddFrame(fRnrDecay);
186 fRnrDecay->Connect("Clicked()","Reve::TrackListEditor", this, "DoRnrPM()");
187 fRnrReferences->Connect("Clicked()","Reve::TrackListEditor", this, "DoRnrPM()");
188 fRnrDaughters->Connect("Clicked()","Reve::TrackListEditor", this, "DoRnrPM()");
190 AddFrame(fPMFrame, new TGLayoutHints(kLHintsTop, 1, 1, 1, 1));
192 fRnrMarkers = new TGCheckButton(this, "Render markers");
193 AddFrame(fRnrMarkers, new TGLayoutHints(kLHintsTop, 3, 1, 2, 0));
196 "Reve::TrackListEditor", this, "DoRnrMarkers()");
200 TrackListEditor::~TrackListEditor()
203 /**************************************************************************/
205 void TrackListEditor::SetModel(TObject* obj)
207 fTC = dynamic_cast<TrackList*>(obj);
209 fMaxR->SetValue(fTC->GetMaxR());
210 fMaxZ->SetValue(fTC->GetMaxZ());
211 fMaxOrbits->SetNumber(fTC->GetMaxOrbs());
212 fMinAng->SetNumber(fTC->GetMinAng());
213 fDelta->SetNumber(fTC->GetDelta());
215 fWidthCombo->Select(fTC->GetWidth());
217 fRnrTracks->SetState(fTC->GetRnrTracks() ? kButtonDown : kButtonUp);
219 if(fTC->GetEditPathMarks())
221 HideFrame(fRnrMarkers);
223 fRnrDaughters->SetState(fTC->GetRnrDaughters() ? kButtonDown : kButtonUp);
224 fRnrReferences->SetState(fTC->GetRnrReferences() ? kButtonDown : kButtonUp);
225 fRnrDecay->SetState(fTC->GetRnrDecay() ? kButtonDown : kButtonUp);
227 fFitDaughters->SetState(fTC->GetFitDaughters() ? kButtonDown : kButtonUp);
228 fFitReferences->SetState(fTC->GetFitReferences() ? kButtonDown : kButtonUp);
229 fFitDecay->SetState(fTC->GetFitDecay() ? kButtonDown : kButtonUp);
234 ShowFrame(fRnrMarkers);
235 fRnrMarkers->SetState(fTC->GetRnrMarkers() ? kButtonDown : kButtonUp);
237 fPtRange->SetValues(fTC->GetMinPt(), fTC->GetMaxPt());
240 /**************************************************************************/
242 void TrackListEditor::DoMaxR()
244 fTC->SetMaxR(fMaxR->GetValue());
248 void TrackListEditor::DoMaxZ()
250 fTC->SetMaxZ(fMaxZ->GetValue());
254 void TrackListEditor::DoMaxOrbits()
256 fTC->SetMaxOrbs(fMaxOrbits->GetNumber());
260 void TrackListEditor::DoMinAng()
262 fTC->SetMinAng(fMinAng->GetNumber());
266 void TrackListEditor::DoDelta()
268 fTC->SetDelta(fDelta->GetNumber());
272 /**************************************************************************/
274 void TrackListEditor::DoLineWidth(Int_t width)
276 fTC->SetWidth(width);
280 /**************************************************************************/
282 void TrackListEditor::DoRnrTracks()
284 fTC->SetRnrTracks(fRnrTracks->IsOn());
288 void TrackListEditor::DoRnrMarkers()
290 fTC->SetRnrMarkers(fRnrMarkers->IsOn());
294 /**************************************************************************/
296 void TrackListEditor::DoFitPM()
298 TGButton* b = (TGButton *) gTQSender;
299 PathMark::Type_e type = PathMark::Type_e(b->WidgetId());
300 Bool_t on = b->IsOn();
304 case PathMark::Daughter:
305 fTC->SetFitDaughters(on);
307 case PathMark::Reference:
308 fTC->SetFitReferences(on);
310 case PathMark::Decay:
311 fTC->SetFitDecay(on);
319 void TrackListEditor::DoRnrPM()
321 TGButton * b = (TGButton *) gTQSender;
322 PathMark::Type_e type = PathMark::Type_e(b->WidgetId());
323 Bool_t on = b->IsOn();
325 case PathMark::Daughter:
326 fTC->SetRnrDaughters(on);
328 case PathMark::Reference:
329 fTC->SetRnrReferences(on);
331 case PathMark::Decay:
332 fTC->SetRnrDecay(on);
341 /**************************************************************************/
343 void TrackListEditor::DoPtRange()
346 fTC->SelectByPt(fPtRange->GetMin(), fPtRange->GetMax());
352 /**************************************************************************/
353 /**************************************************************************/
354 /**************************************************************************/
357 #include <TGLViewer.h>
358 #include <Reve/RGTopFrame.h>
360 //______________________________________________________________________
361 // TrackCounterEditor
364 ClassImp(TrackCounterEditor)
366 TrackCounterEditor::TrackCounterEditor(const TGWindow *p, Int_t width, Int_t height,
367 UInt_t options, Pixel_t back) :
368 TGedFrame(p, width, height, options | kVerticalFrame, back),
374 MakeTitle("TrackCounter");
379 TGHorizontalFrame* f = new TGHorizontalFrame(this);
380 TGLabel* lab = new TGLabel(f, "Click:");
381 f->AddFrame(lab, new TGLayoutHints(kLHintsLeft|kLHintsBottom, 1, 10, 1, 2));
382 fClickAction = new TGComboBox(f);
383 fClickAction->AddEntry("Print", 0);
384 fClickAction->AddEntry("Toggle", 1);
385 TGListBox* lb = fClickAction->GetListBox();
386 lb->Resize(lb->GetWidth(), 2*16);
387 fClickAction->Resize(70, 20);
388 fClickAction->Connect("Selected(Int_t)", "Reve::TrackCounterEditor", this,
389 "DoClickAction(Int_t)");
390 f->AddFrame(fClickAction, new TGLayoutHints(kLHintsLeft, 1, 2, 1, 1));
396 TGHorizontalFrame* f = new TGHorizontalFrame(this);
397 TGLabel* lab = new TGLabel(f, "Status:");
398 f->AddFrame(lab, new TGLayoutHints(kLHintsLeft, 1, 5, 1, 2));
400 fInfoLabel = new TGLabel(f);
401 f->AddFrame(fInfoLabel, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 1, 9, 1, 2));
407 TGHorizontalFrame* f = new TGHorizontalFrame(this, 210, 20, kFixedWidth);
409 TGHorizontalFrame* g = new TGHorizontalFrame(f, labelW, 0, kFixedWidth);
410 TGLabel* l = new TGLabel(g, "View:");
411 g->AddFrame(l, new TGLayoutHints(kLHintsLeft, 0,0,4,0));
416 b = new TGTextButton(f, "Orto XY");
417 f->AddFrame(b, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 1, 1, 0, 0));
418 b->Connect("Clicked()", "Reve::TrackCounterEditor", this, "DoOrtoXY()");
420 b = new TGTextButton(f, "Orto ZY");
421 f->AddFrame(b, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 1, 1, 0, 0));
422 b->Connect("Clicked()", "Reve::TrackCounterEditor", this, "DoOrtoZY()");
424 b = new TGTextButton(f, "Persp");
425 f->AddFrame(b, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 1, 1, 0, 0));
426 b->Connect("Clicked()", "Reve::TrackCounterEditor", this, "DoPersp()");
432 TGHorizontalFrame* f = new TGHorizontalFrame(this, 210, 20, kFixedWidth);
434 TGHorizontalFrame* g = new TGHorizontalFrame(f, labelW, 0, kFixedWidth);
435 TGLabel* l = new TGLabel(g, "Event:");
436 g->AddFrame(l, new TGLayoutHints(kLHintsLeft, 0,0,4,0));
441 b = new TGTextButton(f, "Prev");
442 f->AddFrame(b, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 1, 1, 0, 0));
443 b->Connect("Clicked()", "Reve::TrackCounterEditor", this, "DoPrev()");
445 fEventId = new TGNumberEntry(f, 0, 3, -1,TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
446 TGNumberFormat::kNELLimitMinMax, 0, 1000);
447 f->AddFrame(fEventId, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 1, 1, 0, 0));
448 fEventId->Connect("ValueSet(Long_t)", "Reve::TrackCounterEditor", this, "DoSetEvent()");
450 b = new TGTextButton(f, "Next");
451 f->AddFrame(b, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 1, 1, 0, 0));
452 b->Connect("Clicked()", "Reve::TrackCounterEditor", this, "DoNext()");
458 TGHorizontalFrame* f = new TGHorizontalFrame(this, 210, 20, kFixedWidth);
460 TGHorizontalFrame* g = new TGHorizontalFrame(f, labelW, 0, kFixedWidth);
461 TGLabel* l = new TGLabel(g, "Report:");
462 g->AddFrame(l, new TGLayoutHints(kLHintsLeft, 0,0,4,0));
467 b = new TGTextButton(f, "Print");
468 f->AddFrame(b, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 1, 1, 0, 0));
469 b->Connect("Clicked()", "Reve::TrackCounterEditor", this, "DoPrintReport()");
471 b = new TGTextButton(f, "File");
472 f->AddFrame(b, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 1, 1, 0, 0));
473 b->Connect("Clicked()", "Reve::TrackCounterEditor", this, "DoFileReport()");
475 AddFrame(f, new TGLayoutHints(kLHintsLeft, 0, 0, 4, 0));
478 TGHorizontalFrame* f = new TGHorizontalFrame(this, 210, 20, kFixedWidth);
480 TGHorizontalFrame* g = new TGHorizontalFrame(f, labelW, 0, kFixedWidth);
481 TGLabel* l = new TGLabel(g, "Histos:");
482 g->AddFrame(l, new TGLayoutHints(kLHintsLeft, 0,0,4,0));
487 b = new TGTextButton(f, "Show");
488 f->AddFrame(b, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 1, 1, 0, 0));
489 b->Connect("Clicked()", "Reve::TrackCounterEditor", this, "DoShowHistos()");
491 AddFrame(f, new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
496 TrackCounterEditor::~TrackCounterEditor()
499 /**************************************************************************/
501 void TrackCounterEditor::SetModel(TObject* obj)
503 fM = dynamic_cast<TrackCounter*>(obj);
505 fClickAction->Select(fM->fClickAction, kFALSE);
506 fInfoLabel->SetText(Form("All: %3d; Primaries: %3d", fM->fAllTracks, fM->fGoodTracks));
507 fEventId->SetNumber(fM->GetEventId());
510 /**************************************************************************/
512 // glv->SetOrthoCamera(TGLViewer::kCameraOrthoXOY, 2*left, 2*right, 2*top, bottom);
514 void TrackCounterEditor::DoOrtoXY()
516 TGLViewer* glv = dynamic_cast<TGLViewer*>(gReve->GetGLCanvas()->GetViewer3D());
517 glv->SetCurrentCamera(TGLViewer::kCameraOrthoXOY) ;
520 void TrackCounterEditor::DoOrtoZY()
522 TGLViewer* glv = dynamic_cast<TGLViewer*>(gReve->GetGLCanvas()->GetViewer3D());
523 glv->SetCurrentCamera(TGLViewer::kCameraOrthoZOY) ;
526 void TrackCounterEditor::DoPersp()
528 TGLViewer* glv = dynamic_cast<TGLViewer*>(gReve->GetGLCanvas()->GetViewer3D());
529 glv->SetCurrentCamera(TGLViewer::kCameraPerspXOZ) ;
532 /**************************************************************************/
534 void TrackCounterEditor::DoPrev()
536 Reve::Macro("event_prev.C");
537 gReve->EditRenderElement(fM);
540 void TrackCounterEditor::DoNext()
542 Reve::Macro("event_next.C");
543 gReve->EditRenderElement(fM);
546 void TrackCounterEditor::DoSetEvent()
548 Reve::LoadMacro("event_goto.C");
549 gROOT->ProcessLine(Form("event_goto(%d);", (Int_t) fEventId->GetNumber()));
550 gReve->EditRenderElement(fM);
553 /**************************************************************************/
555 void TrackCounterEditor::DoPrintReport()
557 fM->OutputEventTracks();
560 void TrackCounterEditor::DoFileReport()
562 TString file(Form("ev-report-%03d.txt", fM->GetEventId()));
563 if (gSystem->AccessPathName(file) == kFALSE)
566 new TGMsgBox(fClient->GetRoot(), GetMainFrame(),
568 Form("Event record for event %d already exist.\n Replace?", fM->GetEventId()),
569 kMBIconQuestion, kMBYes | kMBNo, &ret);
573 FILE* out = fopen(file, "w");
574 fM->OutputEventTracks(out);
578 void TrackCounterEditor::DoShowHistos()
580 TH1F* hcnt = new TH1F("cnt", "Primeries per event", 41, -0.5, 40.5);
581 TH1F* hchg = new TH1F("chg", "Primary charge", 3, -1.5, 1.5);
582 TH1F* hpt = new TH1F("pt", "pT distribution", 40, 0.0, 8.0);
583 TH1F* heta = new TH1F("eta", "eta distribution", 40, -1.0, 1.0);
585 Int_t nn; // fscanf return value
587 for (Int_t i=0; i<1000; ++i)
589 TString file(Form("ev-report-%03d.txt", i));
590 if (gSystem->AccessPathName(file) == kFALSE)
593 FILE* f = fopen(file, "read");
594 nn = fscanf(f, "Event = %d Ntracks = %d", &ev, &ntr);
595 if (nn != 2) { printf("SAFR1 %d\n", nn); fclose(f); return; }
597 for (Int_t t=0; t<ntr; ++t)
601 nn = fscanf(f, "%d: chg=%d pt=%f eta=%f", &id, &chg, &pt, &eta);
602 if (nn != 4) { printf("SAFR2 %d\n", nn); fclose(f); return; }
612 if (gPad == 0 || gPad->GetCanvas()->IsEditable() == kFALSE) {
613 c = new TCanvas("Scanwas", "Scanning Results", 800, 600);
615 c = gPad->GetCanvas();
620 c->cd(1); hcnt->Draw();
621 c->cd(2); hchg->Draw();
622 c->cd(3); hpt ->Draw();
623 c->cd(4); heta->Draw();
630 /**************************************************************************/
632 void TrackCounterEditor::DoClickAction(Int_t mode)
634 fM->SetClickAction(mode);