36 TAdvancedGraphicsDialog::TAdvancedGraphicsDialog(
const TGWindow *p,
const TGWindow *main):
37 TGTransientFrame(p, main, 10, 10, kVerticalFrame),
38 fFitter((TBackCompFitter *) TVirtualFitter::GetFitter())
47 SetCleanup(kDeepCleanup);
49 fMainFrame =
new TGVerticalFrame(
this);
51 fTab =
new TGTab(fMainFrame, 10, 10);
52 fMainFrame->AddFrame(fTab,
new TGLayoutHints(kLHintsExpandY | kLHintsExpandX, 5,5,5,0));
53 fTab->SetCleanup(kDeepCleanup);
54 fTab->Associate(
this);
58 fTab->AddTab(
"Contour", fContourFrame);
62 fTab->AddTab(
"Scan", fScanFrame);
65 fTab->AddTab(
"Conf Intervals", fConfFrame);
67 TGCompositeFrame * frame =
new TGHorizontalFrame(fMainFrame);
69 fDraw =
new TGTextButton(frame,
"&Draw", kAGD_BDRAW);
70 fDraw->Associate(
this);
71 frame->AddFrame(fDraw,
new TGLayoutHints(kLHintsCenterY | kLHintsExpandX, 5, 5, 0, 0));
73 fClose =
new TGTextButton(frame,
"&Close", kAGD_BCLOSE);
74 fClose->Associate(
this);
75 frame->AddFrame(fClose,
new TGLayoutHints(kLHintsCenterY | kLHintsExpandX, 5, 5, 0, 0));
77 UInt_t width = 0, height = 0;
78 height = fClose->GetDefaultHeight();
79 width = TMath::Max(width, fClose->GetDefaultWidth());
80 frame->Resize((width + 20) * 2, height);
82 fMainFrame->AddFrame(frame,
new TGLayoutHints(kLHintsBottom | kLHintsRight, 0, 0, 5, 0));
84 this->AddFrame(fMainFrame,
new TGLayoutHints(kLHintsNormal | kLHintsExpandX,0,0,5,5));
88 SetWindowName(
"Advanced Drawing Tools");
93 width = GetDefaultWidth();
94 height = GetDefaultHeight();
96 Resize(width, height);
103 SetWMSize(width, height);
104 SetWMSizeHints(width, height, width, height, 0, 0);
106 SetMWMHints(kMWMDecorAll | kMWMDecorResizeH | kMWMDecorMaximize |
107 kMWMDecorMinimize | kMWMDecorMenu,
108 kMWMFuncAll | kMWMFuncResize | kMWMFuncMaximize |
113 gClient->WaitFor(
this);
120 void TAdvancedGraphicsDialog::CreateContourFrame()
122 fContourFrame =
new TGVerticalFrame(fTab);
123 TGHorizontalFrame* frame =
new TGHorizontalFrame(fContourFrame);
125 TGLabel* label =
new TGLabel(frame,
"Number of Points: ");
126 frame->AddFrame(label,
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 0));
128 fContourPoints =
new TGNumberEntry(frame, 40,
130 TGNumberFormat::kNESInteger,
131 TGNumberFormat::kNEAPositive,
132 TGNumberFormat::kNELNoLimits);
133 fContourPoints->Resize(130, 20);
134 fContourPoints->GetNumberEntry()->SetToolTipText(
"Sets the number of points used for the contour");
135 frame->AddFrame(fContourPoints,
new TGLayoutHints(kLHintsNormal, 8, 0, 5, 0));
136 fContourFrame->AddFrame(frame,
new TGLayoutHints(kLHintsExpandX, 5, 5, 0, 0));
138 frame =
new TGHorizontalFrame(fContourFrame);
139 label =
new TGLabel(frame,
"Parameter 1: ");
140 frame->AddFrame(label,
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 0));
142 fContourPar1 =
new TGComboBox(frame, kAGD_CONTPAR1);
143 AddParameters(fContourPar1);
144 fContourPar1->Resize(130, 20);
145 fContourPar1->Associate(
this);
146 TGListBox *lb = fContourPar1->GetListBox();
147 lb->Resize(lb->GetWidth(), 200);
148 frame->AddFrame(fContourPar1,
new TGLayoutHints(kLHintsNormal, 37, 0, 5, 0));
149 fContourFrame->AddFrame(frame,
new TGLayoutHints(kLHintsExpandX, 5, 5, 0, 0));
151 frame =
new TGHorizontalFrame(fContourFrame);
153 label =
new TGLabel(frame,
"Parameter 2: ");
154 frame->AddFrame(label,
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 0));
156 fContourPar2 =
new TGComboBox(frame, kAGD_CONTPAR2);
157 AddParameters(fContourPar2);
158 fContourPar2->Select(kAGD_PARCOUNTER+1, kFALSE);
159 fContourPar2->Resize(130, 20);
160 fContourPar2->Associate(
this);
161 lb = fContourPar2->GetListBox();
162 lb->Resize(lb->GetWidth(), 200);
163 frame->AddFrame(fContourPar2,
new TGLayoutHints(kLHintsNormal, 37, 0, 5, 0));
165 fContourFrame->AddFrame(frame,
new TGLayoutHints(kLHintsExpandX, 5, 5, 0, 0));
167 frame =
new TGHorizontalFrame(fContourFrame);
169 label =
new TGLabel(frame,
"Confidence Level: ");
170 frame->AddFrame(label,
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 0));
172 fContourError =
new TGNumberEntry(frame, 0.683, 5, kAGD_CONTERR,
173 TGNumberFormat::kNESRealThree,
174 TGNumberFormat::kNEANonNegative,
175 TGNumberFormat::kNELNoLimits);
176 fContourError->Resize(130, 20);
177 fContourError->GetNumberEntry()->SetToolTipText(
"Sets the contour confidence level");
178 frame->AddFrame(fContourError,
new TGLayoutHints(kLHintsNormal, 5, 0, 5, 0));
180 fContourFrame->AddFrame(frame,
new TGLayoutHints(kLHintsExpandX, 5, 5, 0, 5));
182 frame =
new TGHorizontalFrame(fContourFrame);
184 label =
new TGLabel(frame,
"Fill Colour: ");
185 frame->AddFrame(label,
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 0));
187 fContourColor =
new TGColorSelect(frame, TColor::Number2Pixel(kYellow - 10), kAGD_CONTCOLOR);
188 frame->AddFrame(fContourColor,
new TGLayoutHints(kLHintsNormal, 5, 0, 5, 0));
190 fContourOver =
new TGCheckButton(frame,
"Superimpose", kAGD_CONTOVER);
191 fContourOver->SetToolTipText(
"If checked, the new contour will overlap the previous one");
192 frame->AddFrame(fContourOver,
new TGLayoutHints(kLHintsNormal, 5, 0, 5, 0));
194 fContourFrame->AddFrame(frame,
new TGLayoutHints(kLHintsExpandX, 5, 5, 0, 5));
201 void TAdvancedGraphicsDialog::CreateScanFrame()
203 fScanFrame =
new TGVerticalFrame(fTab);
204 TGHorizontalFrame* frame =
new TGHorizontalFrame(fScanFrame);
206 TGLabel* label =
new TGLabel(frame,
"Number of Points: ");
207 frame->AddFrame(label,
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 0));
209 fScanPoints =
new TGNumberEntry(frame, 40,
211 TGNumberFormat::kNESInteger,
212 TGNumberFormat::kNEAPositive,
213 TGNumberFormat::kNELNoLimits);
214 fScanPoints->Resize(140, 20);
215 fScanPoints->GetNumberEntry()->SetToolTipText(
"Sets the number of points used in the scan");
216 frame->AddFrame(fScanPoints,
new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0));
217 fScanFrame->AddFrame(frame,
new TGLayoutHints(kLHintsExpandX, 5, 5, 0, 0));
219 frame =
new TGHorizontalFrame(fScanFrame);
221 label =
new TGLabel(frame,
"Parameter: ");
222 frame->AddFrame(label,
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 0));
224 fScanPar =
new TGComboBox(frame, kAGD_SCANPAR);
225 AddParameters(fScanPar);
226 fScanPar->Resize(140, 20);
227 fScanPar->Associate(
this);
228 TGListBox *lb = fScanPar->GetListBox();
229 lb->Resize(lb->GetWidth(), 200);
230 frame->AddFrame(fScanPar,
new TGLayoutHints(kLHintsNormal, 39, 0, 5, 0));
231 fScanFrame->AddFrame(frame,
new TGLayoutHints(kLHintsExpandX, 5, 5, 0, 0));
233 frame =
new TGHorizontalFrame(fScanFrame);
234 label =
new TGLabel(frame,
"Min: ");
235 frame->AddFrame(label,
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 0));
237 double val = fFitter->GetParameter( fScanPar->GetSelected() - kAGD_PARCOUNTER );
238 double err = fFitter->GetParError( fScanPar->GetSelected() - kAGD_PARCOUNTER );
239 fScanMin =
new TGNumberEntry(frame, val - 2.*err ,
241 TGNumberFormat::kNESRealFour,
242 TGNumberFormat::kNEAAnyNumber,
243 TGNumberFormat::kNELNoLimits);
244 fScanMin->Resize(70, 20);
245 fScanMin->GetNumberEntry()->SetToolTipText(
"Sets the minimum parameter value");
246 frame->AddFrame(fScanMin,
new TGLayoutHints(kLHintsNormal, 2, 0, 5, 0));
248 label =
new TGLabel(frame,
"Max: ");
249 frame->AddFrame(label,
new TGLayoutHints(kLHintsTop | kLHintsLeft, 35, 5, 5, 0));
250 fScanMax =
new TGNumberEntry(frame, val + 2.*err,
252 TGNumberFormat::kNESRealFour,
253 TGNumberFormat::kNEAAnyNumber,
254 TGNumberFormat::kNELNoLimits);
255 fScanMax->Resize(70, 20);
256 fScanMax->GetNumberEntry()->SetToolTipText(
"Sets the maximum parameter value");
257 frame->AddFrame(fScanMax,
new TGLayoutHints(kLHintsNormal, 2, 0, 5, 0));
258 fScanFrame->AddFrame(frame,
new TGLayoutHints(kLHintsExpandX, 5, 5, 0, 0));
266 void TAdvancedGraphicsDialog::CreateConfFrame()
268 fConfFrame =
new TGVerticalFrame(fTab);
269 TGHorizontalFrame* frame =
new TGHorizontalFrame(fConfFrame);
271 TGLabel* label =
new TGLabel(frame,
"Confidence Level: ");
272 frame->AddFrame(label,
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 0));
274 fConfLevel =
new TGNumberEntry(frame, 0.95,
276 TGNumberFormat::kNESRealTwo,
277 TGNumberFormat::kNEAPositive,
278 TGNumberFormat::kNELLimitMinMax,
280 fConfLevel->Resize(140, 20);
281 fConfLevel->GetNumberEntry()->SetToolTipText(
"Sets the value of the confidence level");
282 frame->AddFrame(fConfLevel,
new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0));
283 fConfFrame->AddFrame(frame,
new TGLayoutHints(kLHintsExpandX, 5, 5, 0, 0));
285 frame =
new TGHorizontalFrame(fConfFrame);
287 label =
new TGLabel(frame,
"Fill Colour: ");
288 frame->AddFrame(label,
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 0));
290 fConfColor =
new TGColorSelect(frame, TColor::Number2Pixel(kYellow - 10), kAGD_CONTCOLOR);
291 frame->AddFrame(fConfColor,
new TGLayoutHints(kLHintsNormal, 5, 0, 5, 0));
293 fConfFrame->AddFrame(frame,
new TGLayoutHints(kLHintsExpandX, 5, 5, 0, 5));
296 void TAdvancedGraphicsDialog::AddParameters(TGComboBox* comboBox)
301 for ( Int_t i = 0; i < fFitter->GetNumberTotalParameters(); ++i ) {
302 comboBox->AddEntry(fFitter->GetParName(i), kAGD_PARCOUNTER + i);
304 comboBox->Select(kAGD_PARCOUNTER, kFALSE);
310 void TAdvancedGraphicsDialog::ConnectSlots()
313 fClose->Connect(
"Clicked()",
"TAdvancedGraphicsDialog",
this,
"CloseWindow()");
314 fDraw->Connect(
"Clicked()",
"TAdvancedGraphicsDialog",
this,
"DoDraw()");
317 fScanPar->Connect(
"Selected(Int_t)",
"TAdvancedGraphicsDialog",
this,
"DoChangedScanPar(Int_t)");
324 void TAdvancedGraphicsDialog::DoChangedScanPar(Int_t selected)
326 double val = fFitter->GetParameter( selected - kAGD_PARCOUNTER );
327 double err = fFitter->GetParError( selected - kAGD_PARCOUNTER );
328 fScanMin->SetNumber( val -2 * err );
329 fScanMax->SetNumber( val +2 * err );
335 void TAdvancedGraphicsDialog::DoDraw()
337 if ( fTab->GetCurrent() == 0 ) {
339 }
else if ( fTab->GetCurrent() == 1 ) {
341 }
else if ( fTab->GetCurrent() == 2 ) {
342 DrawConfidenceLevels();
350 void TAdvancedGraphicsDialog::DrawContour()
352 static TGraph * graph = 0;
354 if ( ! (fContourOver->GetState() == kButtonDown) ) {
360 graph =
new TGraph( static_cast<int>(fContourPoints->GetNumber()) );
361 Int_t par1 = fContourPar1->GetSelected() - kAGD_PARCOUNTER;
362 Int_t par2 = fContourPar2->GetSelected() - kAGD_PARCOUNTER;
363 if ( par1 == par2 ) {
364 Error(
"TAdvancedGraphicsDialog::DrawContour",
"Parameters cannot be the same");
368 Double_t cl = fContourError->GetNumber();
369 fFitter->Contour( par1, par2, graph, cl);
370 graph->SetFillColor( TColor::GetColor( fContourColor->GetColor() ) );
371 graph->GetXaxis()->SetTitle( fFitter->GetParName(par1) );
372 graph->GetYaxis()->SetTitle( fFitter->GetParName(par2) );
373 graph->Draw( options.c_str() );
381 void TAdvancedGraphicsDialog::DrawScan()
383 static TGraph * graph = 0;
386 graph =
new TGraph( static_cast<int>(fScanPoints->GetNumber()) );
387 Int_t par = fScanPar->GetSelected() - kAGD_PARCOUNTER;
388 fFitter->Scan( par, graph,
389 fScanMin->GetNumber(),
390 fScanMax->GetNumber() );
391 graph->SetLineColor(kBlue);
392 graph->SetLineWidth(2);
393 graph->GetXaxis()->SetTitle(fFitter->GetParName(par) );
394 graph->GetYaxis()->SetTitle(
"FCN" );
403 void TAdvancedGraphicsDialog::DrawConfidenceLevels()
405 const ROOT::Fit::FitResult& result = fFitter->GetFitResult();
406 const ROOT::Fit::FitResult::IModelFunction*
function = result.FittedFunction();
407 const ROOT::Fit::BinData* data =
dynamic_cast<const ROOT::Fit::BinData*
>(&(fFitter->GetFitData()));
410 Error(
"DrawConfidenceLevels",
"Unbinned data set cannot draw confidence levels.");
416 Error(
"DrawConfidenceLevels",
"Fit Function does not exist!");
420 std::vector<Double_t> ci(data->Size());
421 result.GetConfidenceIntervals(*data, &ci[0], fConfLevel->GetNumber());
423 if ( data->NDim() == 1 )
425 TGraphErrors* g =
new TGraphErrors(ci.size());
426 for (
unsigned int i = 0; i < ci.size(); ++i)
428 const Double_t *x = data->Coords(i);
429 const Double_t y = (*function)(x);
430 g->SetPoint(i, *x, y);
431 g->SetPointError(i, 0, ci[i]);
433 std::ostringstream os;
434 os <<
"Confidence Intervals with " << fConfLevel->GetNumber()
436 g->SetTitle(os.str().c_str());
437 g->SetLineColor( TColor::GetColor( fConfColor->GetColor() ));
438 g->SetFillColor( TColor::GetColor( fConfColor->GetColor() ));
439 g->SetFillStyle(3001);
441 }
else if ( data->NDim() == 2 )
443 TGraph2DErrors* g =
new TGraph2DErrors(ci.size());
444 for (
unsigned int i = 0; i < ci.size(); ++i)
446 const Double_t *x = data->Coords(i);
447 const Double_t y = (*function)(x);
448 g->SetPoint(i, x[0], x[1], y);
449 g->SetPointError(i, 0, 0, ci[i]);
451 std::ostringstream os;
452 os <<
"Confidence Intervals with " << fConfLevel->GetNumber()
454 g->SetTitle(os.str().c_str());
455 g->SetLineColor( TColor::GetColor( fConfColor->GetColor() ));
456 g->SetFillColor( TColor::GetColor( fConfColor->GetColor() ));
457 g->SetFillStyle(3001);
466 TAdvancedGraphicsDialog::~TAdvancedGraphicsDialog()