154 kTYPE_HIST, kTYPE_LEGO, kTYPE_LEGO1, kTYPE_LEGO2,
155 kTYPE_SURF, kTYPE_SURF1, kTYPE_SURF2, kTYPE_SURF3, kTYPE_SURF4, kTYPE_SURF5,
156 kCOORDS_CAR, kCOORDS_CYL, kCOORDS_POL, kCOORDS_PSR, kCOORDS_SPH,
157 kERRORS_NO, kERRORS_SIMPLE, kERRORS_EDGES,
158 kERRORS_REC, kERRORS_FILL, kERRORS_CONTOUR,
159 kHIST_TYPE, kCOORD_TYPE, kERROR_TYPE, kMARKER_ONOFF, kB_ONOFF, kBAR_ONOFF,
160 kADD_TYPE, kADD_NONE, kADD_SIMPLE, kADD_SMOOTH, kADD_FILL,
162 kDIM_SIMPLE, kDIM_COMPLEX,
163 kPERCENT_TYPE, kPER_0, kPER_10, kPER_20, kPER_30, kPER_40,
164 kBAR_H, kBAR_WIDTH, kBAR_OFFSET,
165 kSLIDER_MAX, kSLIDER_MIN,
167 kBINSLIDER, kBINSLIDER1, kBINOFFSET
174 TH1Editor::TH1Editor(
const TGWindow *p, Int_t width,
175 Int_t height, UInt_t options, Pixel_t back)
176 : TGedFrame(p, width, height, options | kVerticalFrame, back),
185 fTitle =
new TGTextEntry(
this,
new TGTextBuffer(50), kTH1_TITLE);
186 fTitle->Resize(135, fTitle->GetDefaultHeight());
187 fTitle->SetToolTipText(
"Enter the histogram title string");
188 AddFrame(fTitle,
new TGLayoutHints(kLHintsLeft, 3, 1, 2, 5));
191 TGCompositeFrame *fHistLbl =
new TGCompositeFrame(
this, 145, 10,
196 fHistLbl->AddFrame(
new TGLabel(fHistLbl,
"Histogram"),
197 new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
198 fHistLbl->AddFrame(
new TGHorizontal3DLine(fHistLbl),
199 new TGLayoutHints(kLHintsExpandX, 5, 5, 7, 0));
200 AddFrame(fHistLbl,
new TGLayoutHints(kLHintsTop,0,0,2,0));
203 TGCompositeFrame *f2 =
new TGCompositeFrame(
this, 80, 20, kHorizontalFrame);
204 fDimGroup =
new TGHButtonGroup(f2,
"Plot");
205 fDimGroup->SetRadioButtonExclusive();
206 fDim =
new TGRadioButton(fDimGroup,
"2-D",kDIM_SIMPLE);
207 fDim->SetToolTipText(
"A 2-d plot of the histogram is dawn");
208 fDim0 =
new TGRadioButton(fDimGroup,
"3-D",kDIM_COMPLEX);
209 fDim0->SetToolTipText(
"A 3-d plot of the histogram is dawn");
210 fDimGroup->SetLayoutHints(fDimlh=
new TGLayoutHints(kLHintsLeft ,-2,3,3,-7),fDim);
211 fDimGroup->SetLayoutHints(fDim0lh=
new TGLayoutHints(kLHintsLeft ,16,-1,3,-7),fDim0);
213 fDimGroup->ChangeOptions(kFitWidth | kChildFrame | kHorizontalFrame);
214 f2->AddFrame(fDimGroup,
new TGLayoutHints(kLHintsTop, 4, 1, 0, 0));
215 AddFrame(f2,
new TGLayoutHints(kLHintsTop, 1, 1, 2, 8));
218 f3 =
new TGCompositeFrame(
this, 80, 20, kHorizontalFrame);
219 AddFrame(f3,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
221 TGCompositeFrame *f3a =
new TGCompositeFrame(f3, 40, 20);
222 f3->AddFrame(f3a,
new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
223 TGLabel *fType =
new TGLabel(f3a,
"Add: ");
224 f3a->AddFrame(fType,
new TGLayoutHints(kLHintsLeft, 6, 1, 4, 4));
225 TGLabel *fCoords =
new TGLabel(f3a,
"Coords:");
226 f3a->AddFrame(fCoords,
new TGLayoutHints(kLHintsLeft, 6, 1, 4, 1));
228 TGCompositeFrame *f3b =
new TGCompositeFrame(f3, 40, 20);
229 f3->AddFrame(f3b,
new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
230 fTypeCombo = BuildHistTypeComboBox(f3b, kHIST_TYPE);
231 f3b->AddFrame(fTypeCombo,
new TGLayoutHints(kLHintsLeft, 3, 1, 2, 1));
232 fTypeCombo->Resize(80, 20);
233 fTypeCombo->Associate(
this);
235 fCoordsCombo = BuildHistCoordsComboBox(f3b, kCOORD_TYPE);
236 f3b->AddFrame(fCoordsCombo,
new TGLayoutHints(kLHintsLeft, 3, 1, 2, 1));
237 fCoordsCombo->Resize(80, 20);
238 fCoordsCombo->Associate(
this);
241 TGCompositeFrame *f5 =
new TGCompositeFrame(
this, 80, 20, kHorizontalFrame);
242 AddFrame(f5,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
244 TGCompositeFrame *f5a =
new TGCompositeFrame(f5, 40, 20);
245 f5->AddFrame(f5a,
new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
246 TGLabel *fError =
new TGLabel(f5a,
"Error:");
247 f5a->AddFrame(fError,
new TGLayoutHints(kLHintsLeft, 6, 2, 4, 1));
249 TGCompositeFrame *f5b =
new TGCompositeFrame(f5, 40, 20);
250 f5->AddFrame(f5b,
new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
251 fErrorCombo = BuildHistErrorComboBox(f5b, kERROR_TYPE);
252 f5b->AddFrame(fErrorCombo,
new TGLayoutHints(kLHintsLeft, 15, 1, 2, 1));
253 fErrorCombo->Resize(80, 20);
254 fErrorCombo->Associate(
this);
257 f6 =
new TGCompositeFrame(
this, 80, 20, kHorizontalFrame);
258 AddFrame(f6,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 3));
260 TGCompositeFrame *f6a =
new TGCompositeFrame(f6, 40, 20);
261 f6->AddFrame(f6a,
new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
262 TGLabel *fAddLabel =
new TGLabel(f6a,
"Style:");
263 f6a->AddFrame(fAddLabel,
new TGLayoutHints(kLHintsLeft, 6, 2, 4, 1));
265 TGCompositeFrame *f6b =
new TGCompositeFrame(f6, 40, 20);
266 f6->AddFrame(f6b,
new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
267 fAddCombo = BuildHistAddComboBox(f6b, kADD_TYPE);
268 f6b->AddFrame(fAddCombo,
new TGLayoutHints(kLHintsLeft, 15, 1, 2, 1));
269 fAddCombo->Resize(80, 20);
270 fAddCombo->Associate(
this);
274 f15 =
new TGCompositeFrame(
this, 80, 20, kVerticalFrame);
275 fAddSimple =
new TGCheckButton(f15,
"Simple Drawing", kADD_LINE);
276 fAddSimple ->SetToolTipText(
"A simple histogram without errors is drawn (draw option: Hist)");
277 f15->AddFrame(fAddSimple,
new TGLayoutHints(kLHintsLeft, 6, 1, 1, 0));
278 AddFrame(f15,
new TGLayoutHints(kLHintsTop, 1, 1, 0, -1));
281 f7 =
new TGCompositeFrame(
this, 80, 20, kVerticalFrame);
282 fAddMarker =
new TGCheckButton(f7,
"Show markers", kMARKER_ONOFF);
283 fAddMarker ->SetToolTipText(
"Make marker visible/invisible");
284 f7->AddFrame(fAddMarker,
new TGLayoutHints(kLHintsLeft, 6, 1, 1, 0));
285 AddFrame(f7,
new TGLayoutHints(kLHintsTop, 1, 1, 2, 0));
288 f8 =
new TGCompositeFrame(
this, 80, 20, kVerticalFrame);
289 fAddB =
new TGCheckButton(f8,
"Draw bar chart", kB_ONOFF);
290 fAddB ->SetToolTipText(
"Draw a bar chart");
291 f8->AddFrame(fAddB,
new TGLayoutHints(kLHintsLeft, 6, 1, 1, 0));
292 AddFrame(f8,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
296 f9 =
new TGCompositeFrame(
this, 80, 20, kVerticalFrame);
297 fAddBar =
new TGCheckButton(f9,
"Bar option", kBAR_ONOFF);
298 fAddBar ->SetToolTipText(
"Draw bar chart with bar-option");
299 f9->AddFrame(fAddBar,
new TGLayoutHints(kLHintsLeft, 6, 1, 1, 0));
300 AddFrame(f9,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
303 f10 =
new TGCompositeFrame(
this, 145, 10, kHorizontalFrame |
307 f10->AddFrame(
new TGLabel(f10,
"Bar"),
308 new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
309 f10->AddFrame(
new TGHorizontal3DLine(f10),
310 new TGLayoutHints(kLHintsExpandX, 5, 5, 7, 7));
311 AddFrame(f10,
new TGLayoutHints(kLHintsTop,0,0,6,4));
314 f11 =
new TGCompositeFrame(
this, 80, 20, kHorizontalFrame);
315 TGLabel *fWidthLbl =
new TGLabel(f11,
"W:");
316 f11->AddFrame(fWidthLbl,
new TGLayoutHints(kLHintsLeft, 1, 3, 4, 1));
317 fBarWidth =
new TGNumberEntry(f11, 1.00, 6, kBAR_WIDTH,
318 TGNumberFormat::kNESRealTwo,
319 TGNumberFormat::kNEANonNegative,
320 TGNumberFormat::kNELLimitMinMax, 0.01, 1.);
321 fBarWidth->GetNumberEntry()->SetToolTipText(
"Set bin bar width");
322 fBarWidth->Resize(45,20);
323 f11->AddFrame(fBarWidth,
new TGLayoutHints(kLHintsLeft, 1, 1, 2, 1));
326 TGLabel *foffsetLbl =
new TGLabel(f11,
"O:");
327 f11->AddFrame(foffsetLbl,
new TGLayoutHints(kLHintsLeft, 6,3, 4, 1));
328 fBarOffset =
new TGNumberEntry(f11, 0.00, 5, kBAR_OFFSET,
329 TGNumberFormat::kNESRealTwo,
330 TGNumberFormat::kNEAAnyNumber,
331 TGNumberFormat::kNELLimitMinMax, -1., 1.);
332 fBarOffset->GetNumberEntry()->SetToolTipText(
"Set bin bar offset");
333 fBarOffset->Resize(50,20);
334 f11->AddFrame(fBarOffset,
new TGLayoutHints(kLHintsLeft, 1, 1, 2, 1));
335 AddFrame(f11,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 4));
339 f12 =
new TGCompositeFrame(
this, 80, 20, kVerticalFrame);
340 TGCompositeFrame *f13 =
new TGCompositeFrame(f12, 80, 20, kHorizontalFrame);
341 TGLabel *percentLabel =
new TGLabel(f13,
"Percentage:");
342 f13->AddFrame(percentLabel,
new TGLayoutHints(kLHintsLeft, 6, 1, 3, 1));
343 fPercentCombo = BuildPercentComboBox(f13, kPERCENT_TYPE);
344 fPercentCombo->Resize(51, 20);
345 fPercentCombo->Associate(f13);
346 f13->AddFrame(fPercentCombo,
new TGLayoutHints(kLHintsLeft, 14, 1, 2, 1));
347 f12->AddFrame(f13,
new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
350 fMakeHBar =
new TGCheckButton(f12,
"Horizontal Bar", kBAR_H);
351 fMakeHBar ->SetToolTipText(
"Draw a horizontal bar chart with hBar-Option");
352 f12->AddFrame(fMakeHBar,
new TGLayoutHints(kLHintsLeft, 6, 1, 3, 0));
353 AddFrame(f12,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
358 gROOT->GetListOfCleanups()->Add(
this);
364 void TH1Editor::CreateBinTab()
366 fBin = CreateEditorTabSubFrame(
"Binning");
368 TGCompositeFrame *title1 =
new TGCompositeFrame(fBin, 145, 10,
373 title1->AddFrame(
new TGLabel(title1,
"Rebin"),
374 new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
375 title1->AddFrame(
new TGHorizontal3DLine(title1),
376 new TGLayoutHints(kLHintsExpandX, 5, 5, 7, 7));
377 fBin->AddFrame(title1,
new TGLayoutHints(kLHintsTop, 0, 0, 2, 0));
380 fBinCont =
new TGCompositeFrame(fBin, 80, 20, kVerticalFrame);
381 TGCompositeFrame *f18 =
new TGCompositeFrame(fBinCont, 80, 20,
383 fBinSlider =
new TGHSlider(f18, 100, kSlider1 | kScaleBoth);
384 fBinSlider->Resize(107,20);
385 f18->AddFrame(fBinSlider,
new TGLayoutHints(kLHintsLeft, 3,0,0,3));
386 fBinCont->AddFrame(f18,
new TGLayoutHints(kLHintsTop, 15, 7, 3, 5));
388 TGCompositeFrame *f20 =
new TGCompositeFrame(fBinCont, 80, 20,
390 TGLabel *binLabel1 =
new TGLabel(f20,
"# of Bins:");
391 f20->AddFrame(binLabel1,
new TGLayoutHints(kLHintsLeft, 7, 1, 2, 1));
392 fBinNumberEntry =
new TGNumberEntryField(f20, kBINSLIDER, 0.0,
393 TGNumberFormat::kNESInteger);
394 ((TGTextEntry*)fBinNumberEntry)->SetToolTipText(
"Set the number of bins in the rebinned histogram");
395 fBinNumberEntry->Resize(57,20);
396 f20->AddFrame(fBinNumberEntry,
new TGLayoutHints(kLHintsRight, 21, 0, 0, 0));
397 fBinCont->AddFrame(f20,
new TGLayoutHints(kLHintsTop, 0, 7, 3, 4));
400 TGCompositeFrame *f23 =
new TGCompositeFrame(fBinCont, 118, 20,
403 fApply =
new TGTextButton(f23,
" &Apply ");
404 f23->AddFrame(fApply,
405 new TGLayoutHints(kLHintsExpandX | kLHintsLeft , 0, 3, 4, 4));
406 fCancel =
new TGTextButton(f23,
" &Ignore ");
407 f23->AddFrame(fCancel,
408 new TGLayoutHints(kLHintsExpandX | kLHintsLeft, 3, 0, 4, 4));
409 fBinCont->AddFrame(f23,
new TGLayoutHints(kLHintsTop, 20, 3, 3, 4));
410 fBin->AddFrame(fBinCont,
new TGLayoutHints(kLHintsTop| kLHintsExpandX));
413 fBinCont1 =
new TGCompositeFrame(fBin, 80, 20, kVerticalFrame);
414 TGCompositeFrame *f21 =
new TGCompositeFrame(fBinCont1, 80, 20,
416 fBinSlider1 =
new TGHSlider(f21, 100, kSlider1 | kScaleBoth);
417 fBinSlider1->Resize(107,20);
418 fBinSlider1->SetRange(1,9);
419 fBinSlider1->SetScale(12);
420 fBinSlider1->SetPosition(5);
421 f21->AddFrame(fBinSlider1,
new TGLayoutHints(kLHintsLeft, 3,0,0,3));
422 fBinCont1->AddFrame(f21,
new TGLayoutHints(kLHintsTop, 15, 7, 5, 0));
425 TGCompositeFrame *f24 =
new TGCompositeFrame(fBinCont1, 80, 20,
427 TGLabel *l1 =
new TGLabel(f24,
"-5");
428 f24->AddFrame(l1,
new TGLayoutHints(kLHintsLeft, 18, 1, -1, 0));
429 TGLabel *l2 =
new TGLabel(f24,
"-2");
430 f24->AddFrame(l2,
new TGLayoutHints(kLHintsLeft, 26, 2, -1, 0));
431 TGLabel *l3 =
new TGLabel(f24,
"2");
432 f24->AddFrame(l3,
new TGLayoutHints(kLHintsLeft, 17, 2, -1, 0));
433 TGLabel *l4 =
new TGLabel(f24,
"5");
434 f24->AddFrame(l4,
new TGLayoutHints(kLHintsLeft, 32, 3, -1, 0));
435 fBinCont1->AddFrame(f24,
new TGLayoutHints(kLHintsTop, 0, 0, 0, 0));
437 TGCompositeFrame *f22 =
new TGCompositeFrame(fBinCont1, 140, 20,
439 TGLabel *binLabel2 =
new TGLabel(f22,
"# of Bins:");
440 f22->AddFrame(binLabel2,
new TGLayoutHints(kLHintsLeft, 7, 1, 4, 1));
442 fBinNumberEntry1 =
new TGNumberEntryField(f22, kBINSLIDER1, 0.0,
443 TGNumberFormat::kNESInteger);
444 ((TGTextEntry*)fBinNumberEntry1)->SetToolTipText(
"Set the number of bins in the rebinned histogram");
445 fBinNumberEntry1->Resize(57,20);
446 f22->AddFrame(fBinNumberEntry1,
new TGLayoutHints(kLHintsLeft, 21, 0, 2, 0));
447 fBinCont1->AddFrame(f22,
new TGLayoutHints(kLHintsTop, 0, 7, 2, 4));
449 TGCompositeFrame *f26 =
new TGCompositeFrame(fBinCont1, 80, 20,
451 TGLabel *offsetLbl =
new TGLabel(f26,
"BinOffset:");
452 f26->AddFrame(offsetLbl,
new TGLayoutHints(kLHintsLeft, 6, 1, 2, 1));
453 fOffsetNumberEntry =
new TGNumberEntryField(f26, kBINOFFSET, 0.0,
454 TGNumberFormat::kNESRealFour,
455 TGNumberFormat::kNEAAnyNumber,
456 TGNumberFormat::kNELLimitMinMax,
458 ((TGTextEntry*)fOffsetNumberEntry)->SetToolTipText(
"Add an offset to the origin of the histogram");
459 fOffsetNumberEntry->Resize(57,20);
460 f26->AddFrame(fOffsetNumberEntry,
461 new TGLayoutHints(kLHintsRight, 21, 0, 0, 0));
462 fBinCont1->AddFrame(f26,
new TGLayoutHints(kLHintsTop, 0, 7, 3, 1));
464 TGCompositeFrame *f25 =
new TGCompositeFrame(fBinCont1, 80, 20,
466 fBinOffsetSld =
new TGHSlider(f25, 100, kSlider1 | kScaleBoth);
467 fBinOffsetSld->Resize(107,20);
468 f25->AddFrame(fBinOffsetSld,
new TGLayoutHints(kLHintsLeft, 15,0,0,2));
469 fBinCont1->AddFrame(f25,
new TGLayoutHints(kLHintsTop, 3, 7, 3, 3));
470 fBin->AddFrame(fBinCont1,
new TGLayoutHints(kLHintsTop));
473 TGCompositeFrame *sldCont =
new TGCompositeFrame(fBin, 80, 20,
475 TGCompositeFrame *title2 =
new TGCompositeFrame(sldCont, 145, 10,
480 title2->AddFrame(
new TGLabel(title2,
"Axis Range"),
481 new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
482 title2->AddFrame(
new TGHorizontal3DLine(title2),
483 new TGLayoutHints(kLHintsExpandX, 5, 5, 7, 7));
484 sldCont->AddFrame(title2,
new TGLayoutHints(kLHintsTop, 0, 0, 2, 0));
486 TGCompositeFrame *f14 =
new TGCompositeFrame(sldCont, 80, 20,
488 TGLabel *fSliderLbl =
new TGLabel(f14,
"x:");
489 f14->AddFrame(fSliderLbl,
490 new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 4,4, 4, 1));
491 fSlider =
new TGDoubleHSlider(f14, 1, 2);
492 fSlider->Resize(118,20);
493 f14->AddFrame(fSlider,
new TGLayoutHints(kLHintsLeft));
494 sldCont->AddFrame(f14,
new TGLayoutHints(kLHintsTop, 3, 7, 4, 1));
496 TGCompositeFrame *f16 =
new TGCompositeFrame(sldCont, 80, 20,
498 fSldMin =
new TGNumberEntryField(f16, kSLIDER_MIN, 0.0,
499 TGNumberFormat::kNESRealTwo,
500 TGNumberFormat::kNEAAnyNumber);
501 ((TGTextEntry*)fSldMin)->SetToolTipText(
"Set the minimum value of the x-axis");
502 fSldMin->Resize(57,20);
503 f16->AddFrame(fSldMin,
new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
504 fSldMax =
new TGNumberEntryField(f16, kSLIDER_MAX, 0.0,
505 TGNumberFormat::kNESRealTwo,
506 TGNumberFormat::kNEAAnyNumber);
507 ((TGTextEntry*)fSldMax)->SetToolTipText(
"Set the maximum value of the x-axis");
508 fSldMax->Resize(57,20);
509 f16->AddFrame(fSldMax,
new TGLayoutHints(kLHintsLeft, 4, 0, 0, 0));
510 sldCont->AddFrame(f16,
new TGLayoutHints(kLHintsTop, 20, 3, 5, 0));
512 TGCompositeFrame *f17 =
new TGCompositeFrame(sldCont, 80, 20, kVerticalFrame);
513 fDelaydraw =
new TGCheckButton(f17,
"Delayed drawing", kDELAYED_DRAWING);
514 fDelaydraw ->SetToolTipText(
"Draw the new histogram only when any Slider is released");
515 f17->AddFrame(fDelaydraw,
new TGLayoutHints(kLHintsLeft, 6, 1, 2, 0));
516 sldCont->AddFrame(f17,
new TGLayoutHints(kLHintsTop, 1, 1, 5, 0));
517 fBin->AddFrame(sldCont,
new TGLayoutHints(kLHintsTop));
527 fBinOffsetSld->SetRange(0,100);
528 fBinOffsetSld->SetPosition(0);
529 fOffsetNumberEntry->SetNumber(0.0000);
530 fCancel->SetState(kButtonDisabled);
531 fApply->SetState(kButtonDisabled);
538 TH1Editor::~TH1Editor()
541 gROOT->GetListOfCleanups()->Remove(
this);
549 if (fBinHist)
delete fBinHist;
556 void TH1Editor::ConnectSignals2Slots()
559 fAddB->Connect(
"Toggled(Bool_t)",
"TH1Editor",
this,
"DoAddB(Bool_t)");
560 fAddBar->Connect(
"Toggled(Bool_t)",
"TH1Editor",
this,
"DoAddBar(Bool_t)");
561 fTitle->Connect(
"TextChanged(const char *)",
"TH1Editor",
this,
"DoTitle(const char *)");
562 fTypeCombo->Connect(
"Selected(Int_t)",
"TH1Editor",
this,
"DoHistChanges()");
563 fCoordsCombo->Connect(
"Selected(Int_t)",
"TH1Editor",
this,
"DoHistChanges()");
564 fErrorCombo->Connect(
"Selected(Int_t)",
"TH1Editor",
this,
"DoHistChanges()");
565 fAddCombo->Connect(
"Selected(Int_t)",
"TH1Editor",
this,
"DoHistChanges()");
566 fAddMarker->Connect(
"Toggled(Bool_t)",
"TH1Editor",
this,
"DoAddMarker(Bool_t)");
567 fAddSimple->Connect(
"Toggled(Bool_t)",
"TH1Editor",
this,
"DoAddSimple(Bool_t)");
570 fDimGroup->Connect(
"Clicked(Int_t)",
"TH1Editor",
this,
"DoHistView()");
573 fBarWidth->Connect(
"ValueSet(Long_t)",
"TH1Editor",
this,
"DoBarWidth()");
574 (fBarWidth->GetNumberEntry())->Connect(
"ReturnPressed()",
"TH1Editor",
this,
"DoBarWidth()");
575 fBarOffset->Connect(
"ValueSet(Long_t)",
"TH1Editor",
this,
"DoBarOffset()");
576 (fBarOffset->GetNumberEntry())->Connect(
"ReturnPressed()",
"TH1Editor",
this,
"DoBarOffset()");
577 fPercentCombo->Connect(
"Selected(Int_t)",
"TH1Editor",
this,
"DoPercent()");
578 fMakeHBar-> Connect(
"Toggled(Bool_t)",
"TH1Editor",
this,
"DoHBar(Bool_t))");
583 fBinSlider->Connect(
"PositionChanged(Int_t)",
"TH1Editor",
this,
"DoBinMoved(Int_t)");
584 fBinSlider->Connect(
"Released()",
"TH1Editor",
this,
"DoBinReleased()");
585 fBinSlider->Connect(
"Pressed()",
"TH1Editor",
this,
"DoBinPressed()");
587 fBinNumberEntry->Connect(
"ReturnPressed()",
"TH1Editor",
this,
"DoBinLabel()");
589 fApply->Connect(
"Clicked()",
"TH1Editor",
this,
"DoApply()");
590 fCancel->Connect(
"Pressed()",
"TH1Editor",
this,
"DoCancel()");
592 fBinSlider1->Connect(
"Released()",
"TH1Editor",
this,
"DoBinReleased1()");
593 fBinSlider1->Connect(
"PositionChanged(Int_t)",
"TH1Editor",
this,
"DoBinMoved1()");
594 fBinNumberEntry1->Connect(
"ReturnPressed()",
"TH1Editor",
this,
"DoBinLabel1()");
596 fBinOffsetSld->Connect(
"PositionChanged(Int_t)",
"TH1Editor",
this,
"DoOffsetMoved(Int_t)");
597 fBinOffsetSld->Connect(
"Released()",
"TH1Editor",
this,
"DoOffsetReleased()");
598 fBinOffsetSld->Connect(
"Pressed()",
"TH1Editor",
this,
"DoOffsetPressed()");
599 fOffsetNumberEntry->Connect(
"ReturnPressed()",
"TH1Editor",
this,
"DoBinOffset()");
601 fSlider->Connect(
"PositionChanged()",
"TH1Editor",
this,
"DoSliderMoved()");
602 fSlider->Connect(
"Pressed()",
"TH1Editor",
this,
"DoSliderPressed()");
603 fSlider->Connect(
"Released()",
"TH1Editor",
this,
"DoSliderReleased()");
604 fSldMin->Connect(
"ReturnPressed()",
"TH1Editor",
this,
"DoAxisRange()");
605 fSldMax->Connect(
"ReturnPressed()",
"TH1Editor",
this,
"DoAxisRange()");
612 Bool_t TH1Editor::AcceptModel(TObject* obj)
614 if (obj == 0 || !obj->InheritsFrom(TH1::Class()) ||
615 ((TH1*)obj)->GetDimension()!=1 ||
616 ((TH1*)obj)->GetEntries() == 0
626 void TH1Editor::SetModel(TObject* obj)
629 if (fBinHist && (obj != fHist)) {
634 fHist->SetBins(fBinHist->GetXaxis()->GetNbins(),
635 fBinHist->GetXaxis()->GetXmin(),
636 fBinHist->GetXaxis()->GetXmax());
637 fHist->Add(fBinHist);
640 delete fBinHist; fBinHist = 0;
644 fAvoidSignal = kTRUE;
646 const char *text = fHist->GetTitle();
647 fTitle->SetText(text);
650 TString str = GetDrawOption();
652 if (str.Contains(
"SAME"))
656 Bool_t errorset = kFALSE;
658 if (str.IsNull() || str==
"" ) {
659 fDimGroup->SetButton(kDIM_SIMPLE, kTRUE);
660 fDimGroup->SetButton(kDIM_COMPLEX, kFALSE);
670 fCoordsCombo->Select(kCOORDS_CAR);
671 fErrorCombo->Select(kERRORS_NO);
673 fAddCombo->Select(kADD_NONE);
674 fAddMarker->SetState(kButtonUp);
675 fAddB->SetState(kButtonUp);
676 fAddBar->SetState(kButtonUp);
677 fAddSimple->SetState(kButtonDisabled);
680 }
else if (!str.Contains(
"LEGO") && !str.Contains(
"SURF")){
681 fDimGroup->SetButton(kDIM_SIMPLE,kTRUE);
682 fDimGroup->SetButton(kDIM_COMPLEX,kFALSE);
688 fCoordsCombo->Select(kCOORDS_CAR);
690 if (str.Contains(
"C")) {
691 if (str.Contains(
"CYL")) {
693 dum.Remove(strstr(dum.Data(),
"CYL")-dum.Data(),3);
694 if (dum.Contains(
"C")) fAddCombo->Select(kADD_SMOOTH);
695 }
else fAddCombo->Select(kADD_SMOOTH);
697 else if (str.Contains(
"LF2")) fAddCombo->Select(kADD_FILL);
698 else if (str.Contains(
"L")){
700 if (str.Contains(
"CYL")) {
701 dum.Remove(strstr(dum.Data(),
"CYL")-dum.Data(),3);
702 if (dum.Contains(
"L")) fAddCombo->Select(kADD_SIMPLE);
704 if (str.Contains(
"POL")) {
705 dum.Remove(strstr(dum.Data(),
"POL")-dum.Data(),3);
706 if (dum.Contains(
"L")) fAddCombo->Select(kADD_SIMPLE);
707 }
else fAddCombo->Select(kADD_SIMPLE);
708 }
else fAddCombo->Select(kADD_NONE);
710 if (fAddCombo->GetSelected()!=kADD_NONE)
711 fAddSimple->SetState(kButtonDisabled);
712 else if (str.Contains(
"HIST")) {
713 if (str==
"HIST") fAddSimple->SetState(kButtonDisabled);
714 else fAddSimple->SetState(kButtonDown);
715 }
else fAddSimple->SetState(kButtonUp);
717 if (str.Contains(
"B")) {
719 if (str.Contains(
"BAR")) {
720 fAddBar->SetState(kButtonDown);
721 fAddB->SetState(kButtonDisabled);
726 fAddB->SetState(kButtonDown);
727 fAddBar->SetState(kButtonDisabled);
728 fAddSimple->SetState(kButtonDisabled);
734 fAddB->SetState(kButtonUp);
735 fAddBar->SetState(kButtonUp);
740 if (str.Contains(
"P") ) {
741 fAddMarker->SetState(kButtonDown);
742 fAddSimple->SetState(kButtonDisabled);
743 }
else if (!str.Contains(
"BAR")) fAddMarker->SetState(kButtonUp);
747 }
else if (str.Contains(
"LEGO") || str.Contains(
"SURF")){
748 fDimGroup->SetButton(kDIM_COMPLEX,kTRUE);
749 fDimGroup->SetButton(kDIM_SIMPLE,kFALSE);
753 if (str.Contains(
"SURF")){
756 fCoordsCombo->RemoveEntry(kCOORDS_SPH);
757 fCoordsCombo->RemoveEntry(kCOORDS_CAR);
758 lb = fCoordsCombo->GetListBox();
759 lb->Resize(lb->GetWidth(), 49);
763 if (((TGLBContainer*)((TGListBox*)fCoordsCombo->GetListBox())->GetContainer())->GetPos(kCOORDS_SPH)==-1)
764 fCoordsCombo->AddEntry(
"Spheric", kCOORDS_SPH);
765 if (((TGLBContainer*)((TGListBox*)fCoordsCombo->GetListBox())->GetContainer())->GetPos(kCOORDS_CAR)==-1) {
766 fCoordsCombo->AddEntry(
"Cartesian", kCOORDS_CAR);
767 lb = fCoordsCombo->GetListBox();
768 lb->Resize(lb->GetWidth(), 83);
772 if (str.Contains(
"LEGO2")) fTypeCombo->Select(kTYPE_LEGO2);
773 else if (str.Contains(
"LEGO1")) fTypeCombo->Select(kTYPE_LEGO1);
774 else if (str.Contains(
"LEGO")) fTypeCombo->Select(kTYPE_LEGO);
775 else if (str.Contains(
"SURF5")) fTypeCombo->Select(kTYPE_SURF5);
776 else if (str.Contains(
"SURF4")) fTypeCombo->Select(kTYPE_SURF4);
777 else if (str.Contains(
"SURF3")) fTypeCombo->Select(kTYPE_SURF3);
778 else if (str.Contains(
"SURF2")) fTypeCombo->Select(kTYPE_SURF2);
779 else if (str.Contains(
"SURF1")) fTypeCombo->Select(kTYPE_SURF1);
780 else if (str.Contains(
"SURF")) fTypeCombo->Select(kTYPE_SURF);
782 if (str.Contains(
"CYL")) fCoordsCombo->Select(kCOORDS_CYL);
783 else if (str.Contains(
"POL")) fCoordsCombo->Select(kCOORDS_POL);
784 else if (str.Contains(
"SPH")) fCoordsCombo->Select(kCOORDS_SPH);
785 else if (str.Contains(
"PSR")) fCoordsCombo->Select(kCOORDS_PSR);
786 else fCoordsCombo->Select(kCOORDS_CAR);
793 if (str.Contains(
"LEGO")) {
802 fAddMarker->SetState(kButtonDisabled);
803 fAddB->SetState(kButtonDisabled);
807 if (str.Contains(
"E1")) fErrorCombo->Select(kERRORS_EDGES);
808 else if (str.Contains(
"E2")) fErrorCombo->Select(kERRORS_REC);
809 else if (str.Contains(
"E3")) fErrorCombo->Select(kERRORS_FILL);
810 else if (str.Contains(
"E4")) fErrorCombo->Select(kERRORS_CONTOUR);
811 else if (str.Contains(
"E")) {
812 if (str.Contains(
"LEGO")) {
814 dum.Remove(strstr(dum.Data(),
"LEGO")-dum.Data(),4);
815 if (dum.Contains(
"E")) fErrorCombo->Select(kERRORS_SIMPLE);
816 }
else fErrorCombo->Select(kERRORS_SIMPLE);
817 }
else fErrorCombo->Select(kERRORS_NO);
820 if (fErrorCombo->GetSelected() != kERRORS_NO){
824 if (str.Contains(
"BAR") || ((fAddBar->GetState()==kButtonDown) &&
825 (fDim->GetState()==kButtonDown))) {
829 fBarWidth->SetNumber(fHist->GetBarWidth());
830 fBarOffset->SetNumber(fHist->GetBarOffset());
831 if (str.Contains(
"HBAR")) fMakeHBar->SetState(kButtonDown);
832 else fMakeHBar->SetState(kButtonUp);
834 if (str.Contains(
"BAR4")) fPercentCombo->Select(kPER_40);
835 else if (str.Contains(
"BAR3")) fPercentCombo->Select(kPER_30);
836 else if (str.Contains(
"BAR2")) fPercentCombo->Select(kPER_20);
837 else if (str.Contains(
"BAR1")) fPercentCombo->Select(kPER_10);
838 else fPercentCombo->Select(kPER_0);
841 Int_t nx = fHist -> GetXaxis() -> GetNbins();
842 Int_t nxbinmin = fHist -> GetXaxis() -> GetFirst();
843 Int_t nxbinmax = fHist -> GetXaxis() -> GetLast();
845 if (fDelaydraw->GetState()!=kButtonDown) fDelaydraw->SetState(kButtonUp);
847 TTreePlayer *player = (TTreePlayer*)TVirtualTreePlayer::GetCurrentPlayer();
862 if (!player || player->GetHistogram()!=fHist ||
863 fHist->GetEntries() != player->GetNfill()) {
866 if (fBinHist) n = fBinHist->GetXaxis()->GetNbins();
869 fBin->HideFrame(fBinCont1);
870 fBin->ShowFrame(fBinCont);
871 Int_t* div = Dividers(n);
873 if (div[0]-1 <= 1) up = 2;
875 fBinSlider->SetRange(1,up);
877 if (fBinSlider->GetMaxPosition()==2 && fBinSlider->GetPosition()==2)
878 fBinSlider->SetPosition(2);
880 while ( div[i] != nx) i ++;
881 fBinSlider->SetPosition(div[0] - i + 1);
883 fBinNumberEntry->SetLimits(TGNumberFormat::kNELLimitMinMax , 2, n);
884 fBinNumberEntry->SetIntNumber(nx);
887 else if (player && fHist==player->GetHistogram() && fHist->GetEntries() == player->GetNfill()) {
889 fBin->HideFrame(fBinCont);
890 fBin->ShowFrame(fBinCont1);
891 fBinSlider->SetRange(0,1);
892 fBinSlider->SetPosition(0);
893 fBinSlider1->SetPosition(5);
894 fBinNumberEntry1->SetLimits(TGNumberFormat::kNELLimitMinMax , 2, 10000);
895 fBinNumberEntry1->SetIntNumber(nxbinmax-nxbinmin+1);
898 fSlider->SetRange(1,nx);
899 fSlider->SetPosition((Double_t)nxbinmin,(Double_t)nxbinmax);
901 fSldMin->SetNumber(fHist->GetXaxis()->GetBinLowEdge(nxbinmin));
902 fSldMax->SetNumber(fHist->GetXaxis()->GetBinUpEdge(nxbinmax));
904 fOffsetNumberEntry->SetLimits(TGNumberFormat::kNELLimitMinMax, 0,
905 fHist->GetXaxis()->GetBinWidth(1));
907 if (fInit) ConnectSignals2Slots();
909 fGedEditor->GetTab()->SetEnabled(1, kTRUE);
910 fAvoidSignal = kFALSE;
916 void TH1Editor::DoTitle(
const char *text)
918 if (fAvoidSignal)
return;
919 fHist->SetTitle(text);
926 void TH1Editor::DoAddMarker(Bool_t on)
928 if (fAvoidSignal)
return;
929 TString str = GetDrawOption();
931 if (str.Contains(
"SAME"))
937 if (dum.Contains(
"POL")) dum.Remove(strstr(dum.Data(),
"POL")-dum.Data(),3);
938 if (dum.Contains(
"SPH")) dum.Remove(strstr(dum.Data(),
"SPH")-dum.Data(),3);
939 if (dum.Contains(
"PSR")) dum.Remove(strstr(dum.Data(),
"PSR")-dum.Data(),3);
941 if (!dum.Contains(
"P")) str +=
"P";
942 fAddSimple->SetState(kButtonDisabled);
943 if (str.Contains(
"HIST"))
944 str.Remove(strstr(str.Data(),
"HIST")-str.Data(),4);
945 }
else if (fAddMarker->GetState()==kButtonUp) {
946 if (str.Contains(
"POL") || str.Contains(
"SPH")) {
947 while (dum.Contains(
"P"))
948 dum.Remove(strstr(dum.Data(),
"P")-dum.Data(),1);
949 if (str.Contains(
"POL")) str = dum +
"POL";
950 if (str.Contains(
"SPH")) str = dum +
"SPH";
951 if (str.Contains(
"PSR")) str = dum +
"PSR";
952 }
else if (str.Contains(
"P")) str.Remove(str.First(
"P"),1);
953 if ((str==
"HIST") || (str==
"") ||
954 (fAddB->GetState()==kButtonDown) ||
955 fAddCombo->GetSelected() != kADD_NONE)
956 fAddSimple->SetState(kButtonDisabled);
957 else if (str.Contains(
"HIST"))
958 fAddSimple->SetState(kButtonDown);
960 fAddSimple->SetState(kButtonUp);
963 if (fSameOpt) str +=
"SAME";
972 void TH1Editor::DoAddB(Bool_t on)
974 if (fAvoidSignal)
return;
975 TString str = GetDrawOption();
977 if (str.Contains(
"SAME"))
984 if (!str.Contains(
"B")) str +=
"B";
988 fAddBar->SetState(kButtonDisabled);
989 fAddSimple->SetState(kButtonDisabled);
990 fBarOffset->SetNumber(fHist->GetBarOffset());
991 fBarWidth->SetNumber(fHist->GetBarWidth());
992 }
else if (fAddB->GetState()==kButtonUp) {
993 while (str.Contains(
"B"))
994 str.Remove(str.First(
"B"),1);
998 fAddBar->SetState(kButtonUp);
999 if (fAddMarker->GetState()!=kButtonDown &&
1000 !(str==
"" || str==
"HIST" ||
1001 fAddCombo->GetSelected()!=kADD_NONE))
1002 fAddSimple->SetState(kButtonUp);
1004 if (fSameOpt) str +=
"SAME";
1005 if (fMake) SetDrawOption(str);
1015 void TH1Editor::DoAddBar(Bool_t on)
1017 if (fAvoidSignal)
return;
1018 Disconnect(fAddMarker);
1019 TString str = GetDrawOption();
1021 if (str.Contains(
"SAME"))
1028 if (str.Contains(
"HBAR")) o=1;
1029 if (str.Contains(
"BAR4"))
1030 str.Remove(strstr(str.Data(),
"BAR4")-str.Data()-o,4+o);
1031 else if (str.Contains(
"BAR3"))
1032 str.Remove(strstr(str.Data(),
"BAR3")-str.Data()-o,4+o);
1033 else if (str.Contains(
"BAR2"))
1034 str.Remove(strstr(str.Data(),
"BAR2")-str.Data()-o,4+o);
1035 else if (str.Contains(
"BAR1"))
1036 str.Remove(strstr(str.Data(),
"BAR1")-str.Data()-o,4+o);
1037 else if (str.Contains(
"BAR0"))
1038 str.Remove(strstr(str.Data(),
"BAR0")-str.Data()-o,4+o);
1039 else if (str.Contains(
"BAR"))
1040 str.Remove(strstr(str.Data(),
"BAR")-str.Data()-o,3+o);
1042 if ((fAddMarker->GetState()==kButtonDown) &&
1043 (fErrorCombo->GetSelected()==kERRORS_NO) &&
1044 (fAddSimple->GetState()!=kButtonDisabled))
1045 fAddSimple->SetState(kButtonDisabled);
1046 else if ((fAddMarker->GetState()!=kButtonDown) &&
1047 (fAddSimple->GetState()==kButtonDisabled)) {
1048 if (str.Contains(
"HIST"))
1049 fAddSimple->SetState(kButtonDown);
1050 else if (fAddCombo->GetSelected()!=kADD_NONE)
1051 fAddSimple->SetState(kButtonDisabled);
1053 fAddSimple->SetState(kButtonUp);
1055 switch (fPercentCombo->GetSelected()){
1058 fPercentCombo->Select(kPER_0);
1085 if (fMakeHBar->GetState()==kButtonDown)
1086 str.Insert(strstr(str.Data(),
"BAR")-str.Data(),
"H");
1087 fBarOffset->SetNumber(fHist->GetBarOffset());
1088 fBarWidth->SetNumber(fHist->GetBarWidth());
1089 fAddB->SetState(kButtonDisabled);
1090 }
else if (fAddBar->GetState()==kButtonUp) {
1094 fAddB->SetState(kButtonUp);
1095 if (fAddMarker->GetState()==kButtonDisabled)
1096 fAddMarker->SetState(kButtonUp);
1097 if (str==
"" || str==
"HIST" || fAddCombo->GetSelected() != kADD_NONE ||
1098 ((fAddMarker->GetState() == kButtonDown) &&
1099 fErrorCombo->GetSelected() == kERRORS_NO) )
1100 fAddSimple->SetState(kButtonDisabled);
1102 if (fSameOpt) str +=
"SAME";
1103 if (fMake) SetDrawOption(str);
1105 ((TGMainFrame*)GetMainFrame())->Layout();
1108 fAddMarker->Connect(
"Toggled(Bool_t)",
"TH1Editor",
this,
"DoAddMarker(Bool_t)");
1116 void TH1Editor::DoAddSimple(Bool_t on)
1118 if (fAvoidSignal)
return;
1119 Disconnect(fAddMarker);
1122 TString str = GetDrawOption();
1124 if (str.Contains(
"SAME"))
1129 if (!str.Contains(
"HIST")) {
1131 fAddMarker->SetState(kButtonDisabled);
1134 }
else if (fAddSimple->GetState()==kButtonUp) {
1135 if (str.Contains(
"HIST")) {
1136 str.Remove(strstr(str.Data(),
"HIST")-str.Data(),4);
1137 fAddMarker->SetState(kButtonUp);
1141 if (fSameOpt) str +=
"SAME";
1142 if (fMake) SetDrawOption(str);
1143 fAddMarker->Connect(
"Toggled(Bool_t)",
"TH1Editor",
this,
"DoAddMarker(Bool_t)");
1150 void TH1Editor::DoHistView()
1152 if (gPad && gPad->GetVirtCanvas())
1153 gPad->GetVirtCanvas()->SetCursor(kWatch);
1154 gVirtualX->SetCursor(GetId(), gVirtualX->CreateCursor(kWatch));
1156 if (fDim->GetState() == kButtonDown)
1161 if (gPad && gPad->GetVirtCanvas())
1162 gPad->GetVirtCanvas()->SetCursor(kPointer);
1163 gVirtualX->SetCursor(GetId(), gVirtualX->CreateCursor(kPointer));
1169 void TH1Editor::DoHistSimple()
1171 if (fAvoidSignal)
return;
1172 if (fDim->GetState()==kButtonDown){
1180 ChangeErrorCombo(1);
1181 if ((fAddBar->GetState() != kButtonDown ||
1182 fAddMarker->GetState()==kButtonDown ) &&
1183 (fErrorCombo->GetSelected()==kERRORS_NO))
1184 fAddSimple->SetState(kButtonDisabled);
1185 else if ((fAddSimple->GetState()==kButtonDisabled) &&
1186 (fAddMarker->GetState()!=kButtonDown))
1187 fAddSimple->SetState(kButtonUp);
1188 else if (fAddSimple->GetState()!=kButtonUp)
1189 fAddSimple->SetState(kButtonDown);
1190 if (fAddMarker->GetState()==kButtonDisabled &&
1191 fAddSimple->GetState()!=kButtonDown)
1192 fAddMarker->SetState(kButtonUp);
1194 if (fErrorCombo->GetSelected()==kERRORS_NO) {
1200 if (fAddBar->GetState()==kButtonDisabled)
1201 fAddBar->SetState(kButtonUp);
1204 if ((fAddB->GetState() == kButtonDisabled)) {
1205 if (fAddBar->GetState()==kButtonDown) {
1215 if (fAddBar->GetState() == kButtonDisabled){
1220 if ((fAddBar->GetState() == kButtonUp) &&
1221 (fAddB->GetState() == kButtonUp)) {
1226 if (fAddCombo->GetSelected()== -1 )fAddCombo->Select(kADD_NONE);
1227 if (fErrorCombo->GetSelected()!=kERRORS_NO) {
1228 fAddCombo->RemoveEntries(kADD_SIMPLE,kADD_FILL);
1229 lb = fAddCombo->GetListBox();
1230 lb->Resize(lb->GetWidth(),19);
1231 Disconnect(fAddCombo);
1232 fAddCombo->Select(kADD_NONE);
1233 fAddCombo->Connect(
"Selected(Int_t)",
"TH1Editor",
this,
"DoHistChanges()");
1235 if (((TGLBContainer*)((TGListBox*)fAddCombo->GetListBox())->GetContainer())->GetPos(kADD_SIMPLE)==-1)
1236 ((TGListBox*)fAddCombo->GetListBox())->AddEntry(
"Simple Line", kADD_SIMPLE);
1237 if (((TGLBContainer*)((TGListBox*)fAddCombo->GetListBox())->GetContainer())->GetPos(kADD_SMOOTH)==-1)
1238 ((TGListBox*)fAddCombo->GetListBox())->AddEntry(
"Smooth Line", kADD_SMOOTH);
1239 if (((TGLBContainer*)((TGListBox*)fAddCombo->GetListBox())->GetContainer())->GetPos(kADD_FILL)==-1) {
1240 ((TGListBox*)fAddCombo->GetListBox())->AddEntry(
"Fill Area",kADD_FILL);
1241 lb = fAddCombo->GetListBox();
1242 lb->Resize(lb->GetWidth(),76);
1245 if (fAddSimple->GetState()==kButtonDown) str+=
"HIST";
1246 str += GetHistErrorLabel()+GetHistAddLabel();
1247 if (fSameOpt) str +=
"SAME";
1251 ((TGMainFrame*)GetMainFrame())->Layout();
1259 void TH1Editor::DoHistComplex()
1261 if (fAvoidSignal)
return;
1262 if (fDim0->GetState()==kButtonDown) {
1271 ChangeErrorCombo(0);
1272 if (fTypeCombo->GetSelected()==-1 && fCoordsCombo->GetSelected()==-1) {
1273 str =
"LEGO"+GetHistErrorLabel();
1274 fTypeCombo->Select(kTYPE_LEGO);
1275 fCoordsCombo->Select(kCOORDS_CAR);
1276 }
else if (fTypeCombo->GetSelected()==-1){
1277 str =
"LEGO"+GetHistErrorLabel();
1278 fTypeCombo->Select(kTYPE_LEGO);
1279 }
else if (fCoordsCombo->GetSelected()==-1) {
1280 str = GetHistTypeLabel()+GetHistErrorLabel();
1281 fCoordsCombo->Select(kCOORDS_CAR);
1283 str = GetHistTypeLabel()+GetHistCoordsLabel()+GetHistErrorLabel();
1285 if (str.Contains(
"LEGO")) {
1294 if (fSameOpt) str +=
"SAME";
1297 ((TGMainFrame*)GetMainFrame())->Layout();
1298 fGedEditor->GetTab()->Layout();
1307 void TH1Editor::DoHistChanges()
1309 if (fAvoidSignal)
return;
1312 if (GetHistTypeLabel().Contains(
"SURF")) {
1313 if (fCoordsCombo->GetSelected()==kCOORDS_CAR ||
1314 fCoordsCombo->GetSelected()==kCOORDS_SPH)
1315 fCoordsCombo->Select(kCOORDS_POL);
1316 fCoordsCombo->RemoveEntry(kCOORDS_SPH);
1317 fCoordsCombo->RemoveEntry(kCOORDS_CAR);
1318 lb = fCoordsCombo->GetListBox();
1319 lb->Resize(lb->GetWidth(), 49);
1321 if (((TGLBContainer*)((TGListBox*)fCoordsCombo->GetListBox())->GetContainer())->GetPos(kCOORDS_SPH)==-1)
1322 ((TGListBox*)fCoordsCombo->GetListBox())->AddEntrySort(
"Spheric", kCOORDS_SPH);
1323 if (((TGLBContainer*)((TGListBox*)fCoordsCombo->GetListBox())->GetContainer())->GetPos(kCOORDS_CAR)==-1) {
1324 ((TGListBox*)fCoordsCombo->GetListBox())->AddEntrySort(
"Cartesian", kCOORDS_CAR);
1325 lb = fCoordsCombo->GetListBox();
1326 lb->Resize(lb->GetWidth(), 83);
1329 if (fDim->GetState()!=kButtonUp){
1330 if (fErrorCombo->GetSelected() != kERRORS_NO){
1334 fAddMarker->SetState(kButtonDisabled);
1335 fAddB->SetState(kButtonDisabled);
1336 if (fAddBar->GetState()==kButtonDisabled)
1337 fAddBar->SetState(kButtonUp);
1338 if (fAddSimple->GetState()==kButtonDisabled)
1339 fAddSimple->SetState(kButtonUp);
1340 fAddCombo->RemoveEntries(kADD_SIMPLE,kADD_FILL);
1341 lb = fAddCombo->GetListBox();
1342 lb->Resize(lb->GetWidth(),19);
1343 Disconnect(fAddCombo);
1344 fAddCombo->Select(kADD_NONE);
1345 fAddCombo->Connect(
"Selected(Int_t)",
"TH1Editor",
this,
"DoHistChanges()");
1346 if (fAddBar->GetState()==kButtonDown) {
1361 if (fAddMarker->GetState()==kButtonDisabled)
1362 fAddMarker->SetState(kButtonUp);
1363 if (fAddBar->GetState() != kButtonDown &&
1364 fAddB->GetState()==kButtonDisabled)
1365 fAddB->SetState(kButtonUp);
1366 if (((TGLBContainer*)((TGListBox*)fAddCombo->GetListBox())->GetContainer())->GetPos(kADD_SIMPLE)==-1)
1367 ((TGListBox*)fAddCombo->GetListBox())->AddEntry(
"Simple Line", kADD_SIMPLE);
1368 if (((TGLBContainer*)((TGListBox*)fAddCombo->GetListBox())->GetContainer())->GetPos(kADD_SMOOTH)==-1)
1369 ((TGListBox*)fAddCombo->GetListBox())->AddEntry(
"Smooth Line", kADD_SMOOTH);
1370 if (((TGLBContainer*)((TGListBox*)fAddCombo->GetListBox())->GetContainer())->GetPos(kADD_FILL)==-1) {
1371 ((TGListBox*)fAddCombo->GetListBox())->AddEntry(
"Fill Area",kADD_FILL);
1372 lb = fAddCombo->GetListBox();
1373 lb->Resize(lb->GetWidth(),76);
1377 if (fAddCombo->GetSelected()!=kADD_NONE) {
1378 fAddSimple->SetState(kButtonDisabled);
1380 if (fAddMarker->GetState()==kButtonDown)
1381 fAddSimple->SetState(kButtonDisabled);
1382 else if (fAddSimple->GetState()==kButtonDisabled)
1383 fAddSimple->SetState(kButtonUp);
1385 }
else if (fDim0->GetState()==kButtonDown) {
1386 if (GetHistTypeLabel().Contains(
"LEGO")) {
1398 if (fDim->GetState()==kButtonDown)
1399 str = GetHistErrorLabel()+GetHistAddLabel();
1400 else if (fDim0->GetState()==kButtonDown)
1401 str = GetHistTypeLabel()+GetHistCoordsLabel()+GetHistErrorLabel();
1402 if (fAddSimple->GetState()==kButtonDown)
1407 if (str==
"" || str==
"HIST") fAddSimple->SetState(kButtonDisabled);
1410 ((TGMainFrame*)GetMainFrame())->Layout();
1418 void TH1Editor::DoBarWidth()
1420 if (fAvoidSignal)
return;
1421 fHist->SetBarWidth(fBarWidth->GetNumber());
1428 void TH1Editor::DoBarOffset()
1430 if (fAvoidSignal)
return;
1431 Float_t f = fBarOffset->GetNumber();
1432 fHist->SetBarOffset(f);
1439 void TH1Editor::DoPercent()
1441 if (fAvoidSignal)
return;
1442 TString str = GetDrawOption();
1444 if (str.Contains(
"SAME"))
1449 if (str.Contains(
"HBAR")) o=1;
1450 if (str.Contains(
"BAR4"))
1451 str.Remove(strstr(str.Data(),
"BAR4")-str.Data()-1,4+o);
1452 else if (str.Contains(
"BAR3"))
1453 str.Remove(strstr(str.Data(),
"BAR3")-str.Data()-o,4+o);
1454 else if (str.Contains(
"BAR2"))
1455 str.Remove(strstr(str.Data(),
"BAR2")-str.Data()-o,4+o);
1456 else if (str.Contains(
"BAR1"))
1457 str.Remove(strstr(str.Data(),
"BAR1")-str.Data()-o,4+o);
1458 else if (str.Contains(
"BAR0"))
1459 str.Remove(strstr(str.Data(),
"BAR0")-str.Data()-o,4+o);
1460 else if (str.Contains(
"BAR"))
1461 str.Remove(strstr(str.Data(),
"BAR")-str.Data()-o,3+o);
1463 if (fMakeHBar->GetState()==kButtonDown) str+=
"H";
1464 switch (fPercentCombo->GetSelected()){
1465 case (kPER_0) :{ str +=
"BAR";
break;}
1466 case (kPER_10):{ str +=
"BAR1";
break;}
1467 case (kPER_20):{ str +=
"BAR2";
break;}
1468 case (kPER_30):{ str +=
"BAR3";
break;}
1469 case (kPER_40):{ str +=
"BAR4";
break;}
1471 if (fSameOpt) str +=
"SAME";
1472 if (fMake) SetDrawOption(str);
1479 void TH1Editor::DoHBar(Bool_t on)
1481 if (fAvoidSignal)
return;
1482 TString str = GetDrawOption();
1484 if (str.Contains(
"SAME"))
1489 if (!str.Contains(
"HBAR"))
1490 str.Insert(strstr(str.Data(),
"BAR")-str.Data(),
"H");
1492 else if (fMakeHBar->GetState()==kButtonUp) {
1493 if (str.Contains(
"HBAR"))
1494 str.Remove(strstr(str.Data(),
"BAR")-str.Data()-1,1);
1496 if (fSameOpt) str +=
"SAME";
1497 if (fMake) SetDrawOption(str);
1505 void TH1Editor::DoSliderMoved()
1507 if (fAvoidSignal)
return;
1508 if (fGedEditor->GetPad()->GetCanvas())
1509 fGedEditor->GetPad()->GetCanvas()->FeedbackMode(kTRUE);
1510 fGedEditor->GetPad()->cd();
1511 if (fDelaydraw->GetState()==kButtonDown && fDim->GetState()==kButtonDown) {
1512 static Int_t px1,py1,px2,py2;
1513 static Float_t ymin,ymax,xleft,xright;
1514 xleft = fHist->GetXaxis()->GetBinLowEdge((Int_t)((fSlider->GetMinPosition())+0.5));
1515 xright = fHist->GetXaxis()->GetBinUpEdge((Int_t)((fSlider->GetMaxPosition())+0.5));
1516 ymin = fGedEditor->GetPad()->GetUymin();
1517 ymax = fGedEditor->GetPad()->GetUymax();
1518 px1 = fGedEditor->GetPad()->XtoAbsPixel(xleft);
1519 py1 = fGedEditor->GetPad()->YtoAbsPixel(ymin);
1520 px2 = fGedEditor->GetPad()->XtoAbsPixel(xright);
1521 py2 = fGedEditor->GetPad()->YtoAbsPixel(ymax);
1522 if (fGedEditor->GetPad()->GetCanvas())
1523 fGedEditor->GetPad()->GetCanvas()->FeedbackMode(kTRUE);
1524 fGedEditor->GetPad()->SetLineWidth(1);
1525 fGedEditor->GetPad()->SetLineColor(2);
1526 fGedEditor->GetPad()->SetLineWidth(1);
1527 fGedEditor->GetPad()->SetLineColor(2);
1528 fGedEditor->GetPad()->cd();
1529 gVirtualX->DrawBox(fPx1old, fPy1old, fPx2old, fPy2old, TVirtualX::kHollow);
1530 gVirtualX->DrawBox(px1, py1, px2, py2, TVirtualX::kHollow);
1535 gVirtualX->Update(0);
1536 fSldMin->SetNumber(xleft);
1537 fSldMax->SetNumber(xright);
1538 }
else if (fDelaydraw->GetState() == kButtonDown &&
1539 fDim0->GetState() == kButtonDown &&
1540 fCoordsCombo->GetSelected() == kCOORDS_CAR) {
1541 static Float_t p1[3], p2[3], p3[3], p4[3], p5[3], p6[3], p7[3], p8[3];
1542 TView *fView = fGedEditor->GetPad()->GetView();
1544 Double_t *rmin = fView->GetRmin();
1546 Double_t *rmax = fView->GetRmax();
1548 p1[0] = p4[0] = p5[0] = p8[0] =
1549 fHist->GetXaxis()->GetBinLowEdge((Int_t)((fSlider->GetMinPosition())+0.5));
1550 p2[0] = p3[0] = p6[0] = p7[0] =
1551 fHist->GetXaxis()->GetBinUpEdge((Int_t)((fSlider->GetMaxPosition())+0.5));
1552 p1[1] = p2[1] = p3[1] = p4[1] = rmin[1];
1553 p5[1] = p6[1] = p7[1] = p8[1] = rmax[1];
1554 p1[2] = p2[2] = p5[2] = p6[2] = rmin[2];
1555 p3[2] = p4[2] = p7[2] = p8[2] = rmax[2];
1556 fGedEditor->GetPad()->SetLineWidth(1);
1557 fGedEditor->GetPad()->SetLineColor(2);
1558 PaintBox3D(fP2old, fP3old, fP7old, fP6old);
1559 PaintBox3D(fP1old, fP4old, fP8old, fP5old);
1560 PaintBox3D(p2, p3, p7, p6);
1561 PaintBox3D(p1, p4, p8, p5);
1562 for (Int_t i = 0; i<3; i++){
1572 fSldMin->SetNumber(p1[0]);
1573 fSldMax->SetNumber(p2[0]);
1574 }
else if (fDelaydraw->GetState() == kButtonDown &&
1575 fDim0->GetState() == kButtonDown) {
1576 fSldMin->SetNumber(fHist->GetXaxis()->GetBinLowEdge((Int_t)((fSlider->GetMinPosition())+0.5)));
1577 fSldMax->SetNumber(fHist->GetXaxis()->GetBinUpEdge((Int_t)((fSlider->GetMaxPosition())+0.5)));
1579 fHist->GetXaxis()->SetRange((Int_t)((fSlider->GetMinPosition())+0.5),
1580 (Int_t)((fSlider->GetMaxPosition())+0.5));
1581 fSldMin->SetNumber(fHist->GetXaxis()->GetBinLowEdge(fHist->GetXaxis()->GetFirst()));
1582 fSldMax->SetNumber(fHist->GetXaxis()->GetBinUpEdge(fHist->GetXaxis()->GetLast()));
1583 fClient->NeedRedraw(fSlider,kTRUE);
1586 TTreePlayer *player = (TTreePlayer*)TVirtualTreePlayer::GetCurrentPlayer();
1587 if (player && player->GetHistogram() == fHist) {
1588 Int_t last = fHist->GetXaxis()->GetLast();
1589 Int_t first = fHist->GetXaxis()->GetFirst();
1590 fBinNumberEntry1->SetIntNumber(last-first+1);
1593 fClient->NeedRedraw(fBinNumberEntry1,kTRUE);
1596 fClient->NeedRedraw(fSldMin,kTRUE);
1597 fClient->NeedRedraw(fSldMax,kTRUE);
1604 void TH1Editor::DoSliderPressed()
1606 if (fAvoidSignal)
return;
1607 if (fGedEditor->GetPad()->GetCanvas())
1608 fGedEditor->GetPad()->GetCanvas()->FeedbackMode(kTRUE);
1609 fGedEditor->GetPad()->cd();
1610 static Float_t ymin,ymax,xleft,xright;
1611 Int_t sldmin = (Int_t)((fSlider->GetMinPosition())+0.5);
1612 Int_t sldmax = (Int_t)((fSlider->GetMaxPosition())+0.5);
1613 if (fDelaydraw->GetState() == kButtonDown &&
1614 fDim->GetState()==kButtonDown) {
1615 if (fGedEditor->GetPad()->GetCanvas())
1616 fGedEditor->GetPad()->GetCanvas()->FeedbackMode(kTRUE);
1617 fGedEditor->GetPad()->SetLineWidth(1);
1618 fGedEditor->GetPad()->SetLineColor(2);
1619 xleft = fHist->GetXaxis()->GetBinLowEdge(sldmin);
1620 xright = fHist->GetXaxis()->GetBinUpEdge(sldmax);
1621 ymin = fGedEditor->GetPad()->GetUymin();
1622 ymax = fGedEditor->GetPad()->GetUymax();
1623 fPx1old = fGedEditor->GetPad()->XtoAbsPixel(xleft);
1624 fPy1old = fGedEditor->GetPad()->YtoAbsPixel(ymin);
1625 fPx2old = fGedEditor->GetPad()->XtoAbsPixel(xright);
1626 fPy2old = fGedEditor->GetPad()->YtoAbsPixel(ymax);
1627 gVirtualX->DrawBox(fPx1old, fPy1old, fPx2old, fPy2old, TVirtualX::kHollow);
1628 }
else if (fDelaydraw->GetState() == kButtonDown &&
1629 fDim0->GetState() == kButtonDown &&
1630 fCoordsCombo->GetSelected() == kCOORDS_CAR) {
1631 TView *fView = fGedEditor->GetPad()->GetView();
1633 Double_t *rmin = fView->GetRmin();
1635 Double_t *rmax = fView->GetRmax();
1637 fP1old[0] = fP4old[0] = fP5old[0] = fP8old[0] =
1638 fHist->GetXaxis()->GetBinLowEdge(sldmin);
1639 fP2old[0] = fP3old[0] = fP6old[0] = fP7old[0] =
1640 fHist->GetXaxis()->GetBinUpEdge(sldmax);
1641 fP1old[1] = fP2old[1] = fP3old[1] = fP4old[1] = rmin[1];
1642 fP5old[1] = fP6old[1] = fP7old[1] = fP8old[1] = rmax[1];
1643 fP1old[2] = fP2old[2] = fP5old[2] = fP6old[2] = rmin[2];
1644 fP3old[2] = fP4old[2] = fP7old[2] = fP8old[2] = rmax[2];
1645 if (fGedEditor->GetPad()->GetCanvas())
1646 fGedEditor->GetPad()->GetCanvas()->FeedbackMode(kTRUE);
1647 fGedEditor->GetPad()->SetLineWidth(1);
1648 fGedEditor->GetPad()->SetLineColor(2);
1649 PaintBox3D(fP2old, fP3old, fP7old, fP6old);
1650 PaintBox3D(fP1old, fP4old, fP8old, fP5old);
1659 void TH1Editor::DoSliderReleased()
1661 if (fAvoidSignal)
return;
1662 if (fDelaydraw->GetState()==kButtonDown) {
1663 fHist->GetXaxis()->SetRange((Int_t)((fSlider->GetMinPosition())+0.5),
1664 (Int_t)((fSlider->GetMaxPosition())+0.5));
1665 fSldMin->SetNumber(fHist->GetXaxis()->GetBinLowEdge(fHist->GetXaxis()->GetFirst()));
1666 fSldMax->SetNumber(fHist->GetXaxis()->GetBinUpEdge(fHist->GetXaxis()->GetLast()));
1669 TTreePlayer *player = (TTreePlayer*)TVirtualTreePlayer::GetCurrentPlayer();
1670 if (player)
if (player->GetHistogram() == fHist) {
1671 Int_t last = fHist->GetXaxis()->GetLast();
1672 Int_t first = fHist->GetXaxis()->GetFirst();
1673 fBinNumberEntry1->SetIntNumber(last-first+1);
1682 void TH1Editor::DoAxisRange()
1684 if (fAvoidSignal)
return;
1685 Int_t nx = fHist->GetXaxis()->GetNbins();
1686 Double_t width = fHist->GetXaxis()->GetBinWidth(1);
1687 Double_t lowLimit = fHist->GetXaxis()->GetBinLowEdge(1);
1688 Double_t upLimit = fHist->GetXaxis()->GetBinUpEdge(nx);
1689 if ((fSldMin->GetNumber()+width/2) < (lowLimit))
1690 fSldMin->SetNumber(lowLimit);
1691 if ((fSldMax->GetNumber()-width/2) > (upLimit))
1692 fSldMax->SetNumber(upLimit);
1694 fHist->GetXaxis()->SetRangeUser(fSldMin->GetNumber()+width/2,
1695 fSldMax->GetNumber()-width/2);
1696 Int_t nxbinmin = fHist->GetXaxis()->GetFirst();
1697 Int_t nxbinmax = fHist->GetXaxis()->GetLast();
1698 fSlider->SetPosition((Double_t)(nxbinmin),(Double_t)(nxbinmax));
1706 void TH1Editor::DoBinReleased()
1709 if (fAvoidSignal)
return;
1710 if (fDelaydraw->GetState()==kButtonDown){
1712 fBinHist = (TH1*)fHist->Clone(
"BinHist");
1714 fBinHist->SetDirectory(0);
1716 Int_t nx = fBinHist->GetXaxis()->GetNbins();
1717 Int_t numx = fBinSlider->GetPosition();
1718 Int_t* divx = Dividers(nx);
1719 if (divx[0]==2) fBinSlider->SetPosition(2);
1725 fGedEditor->GetPad()->cd();
1727 fHist->SetBins(nx,fBinHist->GetXaxis()->GetXmin(),
1728 fBinHist->GetXaxis()->GetXmax());
1729 fHist->Add(fBinHist);
1730 fHist->SetCanExtend(TH1::kNoAxis);
1731 fHist->Rebin(divx[numx]);
1734 TAxis* xaxis = fHist->GetXaxis();
1735 Double_t xBinWidth = xaxis->GetBinWidth(1);
1736 xaxis->SetRangeUser(fSldMin->GetNumber()+xBinWidth/2,
1737 fSldMax->GetNumber()-xBinWidth/2);
1738 fSlider->SetRange(1,(Int_t)nx/divx[numx]);
1739 fSlider->SetPosition(xaxis->FindBin(fSldMin->GetNumber()+xBinWidth/2),
1740 xaxis->FindBin(fSldMax->GetNumber()-xBinWidth/2));
1742 fSldMin->SetNumber(xaxis->GetBinLowEdge(xaxis->GetFirst()));
1743 fSldMax->SetNumber(xaxis->GetBinUpEdge(xaxis->GetLast()));
1745 if (fCancel->GetState()==kButtonDisabled)
1746 fCancel->SetState(kButtonUp);
1747 if (fApply->GetState()==kButtonDisabled)
1748 fApply->SetState(kButtonUp);
1761 void TH1Editor::DoBinMoved(Int_t numx)
1765 if (fAvoidSignal)
return;
1767 Int_t* divx = Dividers(fHist->GetXaxis()->GetNbins());
1772 fBinHist = (TH1*)fHist->Clone(
"BinHist");
1774 fBinHist->SetDirectory(0);
1778 Int_t nx = fBinHist->GetXaxis()->GetNbins();
1779 Int_t* divx = Dividers(nx);
1781 fBinSlider->SetPosition(2);
1786 Int_t maxx = (Int_t)nx/divx[numx];
1787 if (maxx==1) maxx=2;
1788 if (fDelaydraw->GetState() == kButtonUp) {
1789 fGedEditor->GetPad()->cd();
1791 fHist->SetBins(nx,fBinHist->GetXaxis()->GetXmin(),
1792 fBinHist->GetXaxis()->GetXmax());
1793 fHist->Add(fBinHist);
1794 fHist->SetCanExtend(TH1::kNoAxis);
1795 fHist->Rebin(divx[numx]);
1797 TAxis* xaxis = fHist->GetXaxis();
1798 Double_t xBinWidth = xaxis->GetBinWidth(1);
1799 xaxis->SetRangeUser(fSldMin->GetNumber()+xBinWidth/2,
1800 fSldMax->GetNumber()-xBinWidth/2);
1801 fSlider->SetRange(1,maxx);
1802 fSlider->SetPosition(xaxis->FindBin(fSldMin->GetNumber()+xBinWidth/2),
1803 xaxis->FindBin(fSldMax->GetNumber()-xBinWidth/2));
1805 fSldMin->SetNumber(xaxis->GetBinLowEdge(xaxis->GetFirst()));
1806 fSldMax->SetNumber(xaxis->GetBinUpEdge(xaxis->GetLast()));
1807 fClient->NeedRedraw(fBinSlider,kTRUE);
1810 if (fCancel->GetState()==kButtonDisabled)
1811 fCancel->SetState(kButtonUp);
1812 if (fApply->GetState()==kButtonDisabled)
1813 fApply->SetState(kButtonUp);
1814 if (fBinNumberEntry->GetNumber()!=maxx)
1815 fBinNumberEntry->SetNumber(maxx);
1822 void TH1Editor::DoBinPressed()
1824 if (fAvoidSignal)
return;
1825 Int_t* d = Dividers(fHist->GetXaxis()->GetNbins());
1826 if (d[0]==2 && !fBinHist) {
1827 new TGMsgBox(fClient->GetDefaultRoot(), this->GetMainFrame(),
1828 "TH1 Editor",
"It is not possible to rebin the histogram",
1829 kMBIconExclamation, kMBOk, 0, kVerticalFrame);
1830 gVirtualX->GrabPointer(fBinSlider->GetId(),0,0,0);
1840 void TH1Editor::DoBinReleased1()
1842 if (fAvoidSignal)
return;
1843 Double_t oldOffset = fOffsetNumberEntry->GetNumber();
1844 Int_t number = fBinSlider1->GetPosition();
1845 if (number==5)
return;
1847 Int_t binNumber = 0;
1848 TAxis* xaxis = fHist->GetXaxis();
1850 if (number > 5) fact = number - 4;
1851 else fact = number - 6;
1852 TTreePlayer *player = (TTreePlayer*)TVirtualTreePlayer::GetCurrentPlayer();
1853 if (!player)
return;
1854 Int_t first = xaxis->GetFirst();
1855 Int_t last = xaxis->GetLast();
1856 Int_t nx = xaxis->GetNbins();
1857 Double_t min = xaxis->GetBinLowEdge(1);
1858 Double_t max = xaxis->GetBinUpEdge(nx);
1859 Double_t rmin = xaxis->GetBinLowEdge(first);
1860 Double_t rmax = xaxis->GetBinUpEdge(last);
1862 ((TH1*)player->GetHistogram())->SetCanExtend(TH1::kNoAxis);
1863 ((TH1*)player->GetHistogram())->Reset();
1866 if (fact > 0) binNumber = fact*nx;
1867 if (fact < 0) binNumber = (Int_t) ((-1)*nx/fact+0.5);
1868 if (binNumber < 1) binNumber = 1;
1869 if (binNumber > 10000) binNumber= 10000;
1870 Double_t newOffset = 1.*fBinOffsetSld->GetPosition()/100*((max-min)/binNumber);
1872 ((TH1*)player->GetHistogram())->SetBins(binNumber,
1873 min-oldOffset+newOffset,
1874 max-oldOffset+newOffset);
1875 TSelectorDraw *sel = (TSelectorDraw*)player->GetSelector();
1880 fHist = (TH1*)((TTreePlayer*)TVirtualTreePlayer::GetCurrentPlayer())->GetHistogram();
1881 fSlider->SetRange(1,binNumber);
1882 Double_t binWidth = fHist->GetXaxis()->GetBinWidth(1);
1883 fSlider->SetPosition(xaxis->FindBin(rmin), xaxis->FindBin(rmax));
1884 Double_t offset = 1.*fBinOffsetSld->GetPosition()/100*binWidth;
1885 xaxis->SetRange(xaxis->FindBin(rmin+binWidth/2),
1886 xaxis->FindBin(rmax-binWidth/2));
1887 fSldMin->SetNumber(xaxis->GetBinLowEdge(xaxis->GetFirst()));
1888 fSldMax->SetNumber(xaxis->GetBinUpEdge(xaxis->GetLast()));
1889 fBinNumberEntry1->SetNumber(xaxis->GetLast() - xaxis->GetFirst() + 1);
1890 fBinSlider1->SetPosition(5);
1891 fOffsetNumberEntry->SetNumber(offset);
1892 fOffsetNumberEntry->SetLimits(TGNumberFormat::kNELLimitMinMax, 0,
1893 xaxis->GetBinWidth(1));
1894 fClient->NeedRedraw(fBinSlider1);
1902 void TH1Editor::DoBinMoved1()
1904 if (fAvoidSignal)
return;
1905 TAxis* xaxis = fHist->GetXaxis();
1906 Int_t first = xaxis->GetFirst();
1907 Int_t last = xaxis->GetLast();
1908 Int_t number = fBinSlider1->GetPosition();
1909 Int_t n = last -first+1;
1911 Int_t binNumber = 0;
1912 if (number >= 5) fact = number - 4;
1913 else fact = number - 6;
1914 if (fact > 0) binNumber = fact*n;
1915 if (fact < 0) binNumber = (Int_t) ((-1)*n/fact+0.5);
1916 if (binNumber < 1) binNumber = 1;
1917 if (binNumber > 10000) binNumber= 10000;
1918 fBinNumberEntry1->SetIntNumber(binNumber);
1925 void TH1Editor::DoBinLabel()
1927 if (fAvoidSignal)
return;
1928 Int_t num = (Int_t)(fBinNumberEntry->GetNumber());
1930 if (fBinHist) nx = fBinHist->GetXaxis()->GetNbins();
1931 else nx = fHist->GetXaxis()->GetNbins();
1933 Int_t *div = Dividers(nx);
1934 Int_t diff = TMath::Abs(num - div[1]);
1936 for (Int_t i = 2; i <= div[0]; i++) {
1937 if ((TMath::Abs(num - div[i])) < diff) {
1939 diff = TMath::Abs(num - div[i]);
1942 fBinNumberEntry->SetNumber(div[c]);
1943 fBinSlider->SetPosition(div[0] - c +1);
1944 if (fDelaydraw->GetState()==kButtonUp) DoBinMoved(div[0] - c +1);
1945 else DoBinReleased();
1955 void TH1Editor::DoBinLabel1()
1957 if (fAvoidSignal)
return;
1958 Double_t oldOffset = fOffsetNumberEntry->GetNumber();
1959 Int_t num = (Int_t)fBinNumberEntry1->GetNumber();
1960 TAxis* xaxis = fHist->GetXaxis();
1961 TTreePlayer *player = (TTreePlayer*)TVirtualTreePlayer::GetCurrentPlayer();
1962 if (!player)
return;
1963 Int_t first = xaxis->GetFirst();
1964 Int_t last = xaxis->GetLast();
1965 Int_t nx = xaxis->GetNbins();
1966 Double_t min = xaxis->GetBinLowEdge(1);
1967 Double_t max = xaxis->GetBinUpEdge(nx);
1968 Double_t rmin = xaxis->GetBinLowEdge(first);
1969 Double_t rmax = xaxis->GetBinUpEdge(last);
1971 ((TH1*)player->GetHistogram())->SetCanExtend(TH1::kNoAxis);
1972 ((TH1*)player->GetHistogram())->Reset();
1975 Int_t binNumber = (Int_t) ((max-min)/(rmax - rmin)*num + 0.5);
1976 if (binNumber < 1) binNumber = 1;
1977 if (binNumber > 10000) binNumber = 10000;
1978 Double_t offset = 1.*(fBinOffsetSld->GetPosition())/100*(max-min)/binNumber;
1980 ((TH1*)player->GetHistogram())->SetBins(binNumber,
1981 min-oldOffset+offset,
1982 max-oldOffset+offset);
1983 TSelectorDraw *sel = (TSelectorDraw*)player->GetSelector();
1988 fHist = (TH1*)((TTreePlayer*)TVirtualTreePlayer::GetCurrentPlayer())->GetHistogram();
1989 fSlider->SetRange(1,binNumber);
1990 Double_t binWidth = xaxis->GetBinWidth(1);
1991 fSlider->SetPosition(xaxis->FindBin(rmin), xaxis->FindBin(rmax));
1992 offset = 1.*fBinOffsetSld->GetPosition()/100*binWidth;
1993 xaxis->SetRange(xaxis->FindBin(rmin+binWidth/2),
1994 xaxis->FindBin(rmax-binWidth/2));
1995 fSldMin->SetNumber(xaxis->GetBinLowEdge(xaxis->GetFirst()));
1996 fSldMax->SetNumber(xaxis->GetBinUpEdge(xaxis->GetLast()));
1997 fOffsetNumberEntry->SetNumber(offset);
1998 fOffsetNumberEntry->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, binWidth);
2006 void TH1Editor::DoOffsetPressed()
2008 if (fAvoidSignal)
return;
2009 fOldOffset = fOffsetNumberEntry->GetNumber();
2017 void TH1Editor::DoOffsetReleased()
2022 if (fAvoidSignal)
return;
2023 if (fDelaydraw->GetState()==kButtonDown) {
2024 Int_t num = (Int_t) fBinOffsetSld->GetPosition();
2025 TAxis* xaxis = fHist->GetXaxis();
2026 Double_t binWidth = xaxis->GetBinWidth(1);
2027 Double_t offset = 1.*num/100*binWidth;
2028 Double_t oldOffset = fOldOffset;
2029 Int_t nx = xaxis->GetNbins();
2030 TTreePlayer *player = (TTreePlayer*)TVirtualTreePlayer::GetCurrentPlayer();
2031 if (!player)
return;
2032 Int_t first = xaxis->GetFirst();
2033 Int_t last = xaxis->GetLast();
2034 Double_t min = xaxis->GetBinLowEdge(1);
2035 Double_t max = xaxis->GetBinUpEdge(nx);
2036 Double_t rmin = xaxis->GetBinLowEdge(first);
2037 Double_t rmax = xaxis->GetBinUpEdge(last);
2039 ((TH1*)player->GetHistogram())->SetCanExtend(TH1::kNoAxis);
2040 ((TH1*)player->GetHistogram())->Reset();
2042 ((TH1*)player->GetHistogram())->SetBins(nx,
2043 min+offset-oldOffset,
2044 max+offset-oldOffset);
2045 TSelectorDraw *sel = (TSelectorDraw*)player->GetSelector();
2050 fHist = (TH1*)((TTreePlayer*)TVirtualTreePlayer::GetCurrentPlayer())->GetHistogram();
2051 xaxis->SetRange(xaxis->FindBin(rmin+offset-oldOffset+binWidth/2),
2052 xaxis->FindBin(rmax+offset-oldOffset-binWidth/2));
2053 fSldMin->SetNumber(xaxis->GetBinLowEdge(xaxis->GetFirst()));
2054 fSldMax->SetNumber(xaxis->GetBinUpEdge(xaxis->GetLast()));
2055 fOffsetNumberEntry->SetNumber(offset);
2065 void TH1Editor::DoOffsetMoved(Int_t num)
2070 if (fAvoidSignal)
return;
2071 TAxis* xaxis = fHist->GetXaxis();
2072 Double_t binWidth = xaxis->GetBinWidth(1);
2073 Double_t offset = 1.*num/100*binWidth;
2074 if (fDelaydraw->GetState()==kButtonUp) {
2075 Double_t oldOffset = fOffsetNumberEntry->GetNumber();
2076 Int_t nx = xaxis->GetNbins();
2077 TTreePlayer *player = (TTreePlayer*)TVirtualTreePlayer::GetCurrentPlayer();
2078 if (!player)
return;
2079 Int_t first = xaxis->GetFirst();
2080 Int_t last = xaxis->GetLast();
2081 Double_t min = xaxis->GetBinLowEdge(1);
2082 Double_t max = xaxis->GetBinUpEdge(nx);
2083 Double_t rmin = xaxis->GetBinLowEdge(first);
2084 Double_t rmax = xaxis->GetBinUpEdge(last);
2086 ((TH1*)player->GetHistogram())->SetCanExtend(TH1::kNoAxis);
2087 ((TH1*)player->GetHistogram())->Reset();
2089 ((TH1*)player->GetHistogram())->SetBins(nx,
2090 min+offset-oldOffset,
2091 max+offset-oldOffset);
2092 TSelectorDraw *sel = (TSelectorDraw*)player->GetSelector();
2097 fHist = (TH1*)((TTreePlayer*)TVirtualTreePlayer::GetCurrentPlayer())->GetHistogram();
2098 xaxis->SetRange(xaxis->FindBin(rmin+offset-oldOffset+binWidth/2),
2099 xaxis->FindBin(rmax+offset-oldOffset-binWidth/2));
2100 fSldMin->SetNumber(xaxis->GetBinLowEdge(xaxis->GetFirst()));
2101 fSldMax->SetNumber(xaxis->GetBinUpEdge(xaxis->GetLast()));
2102 fClient->NeedRedraw(fBinOffsetSld,kTRUE);
2104 fOffsetNumberEntry->SetNumber(offset);
2105 fClient->NeedRedraw(fOffsetNumberEntry,kTRUE);
2113 void TH1Editor::DoBinOffset()
2115 if (fAvoidSignal)
return;
2116 TAxis* xaxis = fHist->GetXaxis();
2117 Double_t binWidth = xaxis->GetBinWidth(1);
2118 Double_t offset = fOffsetNumberEntry->GetNumber();
2119 Double_t oldOffset = 1.*fBinOffsetSld->GetPosition()/100*binWidth;
2120 Int_t nx = xaxis->GetNbins();
2121 TTreePlayer *player = (TTreePlayer*)TVirtualTreePlayer::GetCurrentPlayer();
2122 if (!player)
return;
2123 Int_t first = xaxis->GetFirst();
2124 Int_t last = xaxis->GetLast();
2125 Double_t min = xaxis->GetBinLowEdge(1);
2126 Double_t max = xaxis->GetBinUpEdge(nx);
2127 Double_t rmin = xaxis->GetBinLowEdge(first);
2128 Double_t rmax = xaxis->GetBinUpEdge(last);
2130 ((TH1*)player->GetHistogram())->SetCanExtend(TH1::kNoAxis);
2131 ((TH1*)player->GetHistogram())->Reset();
2133 ((TH1*)player->GetHistogram())->SetBins(nx,
2134 min+offset-oldOffset,
2135 max+offset-oldOffset);
2136 TSelectorDraw *sel = (TSelectorDraw*)player->GetSelector();
2141 fHist = (TH1*)((TTreePlayer*)TVirtualTreePlayer::GetCurrentPlayer())->GetHistogram();
2142 xaxis->SetRange(xaxis->FindBin(rmin+offset-oldOffset+binWidth/2),
2143 xaxis->FindBin(rmax+offset-oldOffset-binWidth/2));
2144 fSldMin->SetNumber(xaxis->GetBinLowEdge(xaxis->GetFirst()));
2145 fSldMax->SetNumber(xaxis->GetBinUpEdge(xaxis->GetLast()));
2146 fBinOffsetSld->SetPosition((Int_t)(offset/binWidth*100));
2153 void TH1Editor::DoApply()
2156 new TGMsgBox(fClient->GetDefaultRoot(), this->GetMainFrame(),
2157 "TH1 Editor",
"Replace origin histogram with rebinned one?",
2158 kMBIconQuestion, kMBYes | kMBNo, &ret, kVerticalFrame);
2164 Int_t nx = fHist->GetXaxis()->GetNbins();
2165 Int_t *div = Dividers(nx);
2167 if (div[0]-1 <= 1) up = 2;
2169 fBinSlider->SetRange(1,up);
2170 if (fBinSlider->GetMaxPosition()==2 && div[0]==2 )
2171 fBinSlider->SetPosition(2);
2173 fBinSlider->SetPosition(1);
2174 fCancel->SetState(kButtonDisabled);
2175 fApply->SetState(kButtonDisabled);
2178 }
else if (ret==2) DoCancel();
2184 void TH1Editor::DoCancel()
2187 fGedEditor->GetPad()->cd();
2189 fHist->SetBins(fBinHist->GetXaxis()->GetNbins(),
2190 fBinHist->GetXaxis()->GetXmin(),
2191 fBinHist->GetXaxis()->GetXmax());
2192 fHist->Add(fBinHist);
2193 fHist->GetXaxis()->SetRange(fBinHist->GetXaxis()->GetFirst(),
2194 fBinHist->GetXaxis()->GetLast());
2197 fCancel->SetState(kButtonDisabled);
2198 fApply->SetState(kButtonDisabled);
2199 Int_t* divx = Dividers(fHist->GetXaxis()->GetNbins());
2200 if (divx[0]!=2) fBinSlider->SetPosition(1);
2213 TString TH1Editor::GetHistTypeLabel()
2216 switch (fTypeCombo->GetSelected()){
2217 case (-1) : {s =
"LEGO";
break;}
2218 case (kTYPE_LEGO ): {s =
"LEGO";
break;}
2219 case (kTYPE_LEGO1): {s =
"LEGO1";
break;}
2220 case (kTYPE_LEGO2): {s =
"LEGO2";
break;}
2221 case (kTYPE_SURF ): {s =
"SURF";
break;}
2222 case (kTYPE_SURF1): {s =
"SURF1";
break;}
2223 case (kTYPE_SURF2): {s =
"SURF2";
break;}
2224 case (kTYPE_SURF3): {s =
"SURF3";
break;}
2225 case (kTYPE_SURF4): {s =
"SURF4";
break;}
2226 case (kTYPE_SURF5): {s =
"SURF5";
break;}
2236 TString TH1Editor::GetHistCoordsLabel()
2239 if (fDim->GetState()!=kButtonDown) {
2240 switch (fCoordsCombo->GetSelected()){
2241 case (-1) : {s =
"POL";
break;}
2242 case (kCOORDS_CAR): {s =
"";
break;}
2243 case (kCOORDS_POL): {s =
"POL";
break;}
2244 case (kCOORDS_CYL): {s =
"CYL";
break;}
2245 case (kCOORDS_SPH): {s =
"SPH";
break;}
2246 case (kCOORDS_PSR): {s =
"PSR";
break;}
2257 TString TH1Editor::GetHistErrorLabel()
2260 switch (fErrorCombo->GetSelected()){
2261 case (-1) : {s =
"";
break;}
2262 case (kERRORS_NO) : {s =
"";
break;}
2263 case (kERRORS_SIMPLE) : {s =
"E";
break;}
2264 case (kERRORS_EDGES) : {s =
"E1";
break;}
2265 case (kERRORS_REC) : {s =
"E2";
break;}
2266 case (kERRORS_FILL) : {s =
"E3";
break;}
2267 case (kERRORS_CONTOUR): {s =
"E4";
break;}
2277 TString TH1Editor::GetHistAddLabel()
2280 switch (fAddCombo->GetSelected()){
2281 case (-1) : {s =
"" ;
break;}
2282 case (kADD_NONE) : {s =
"" ;
break;}
2283 case (kADD_SMOOTH): {s =
"C";
break;}
2284 case (kADD_SIMPLE): {s =
"L";
break;}
2285 case (kADD_FILL) : {s =
"LF2";
break;}
2288 if (fAddMarker->GetState()==kButtonDown) s +=
"P";
2289 if (fAddB->GetState()==kButtonDown) s +=
"B";
2290 if (fAddBar->GetState()==kButtonDown){
2291 if (fMakeHBar->GetState()==kButtonDown) s+=
"H";
2292 switch (fPercentCombo->GetSelected()){
2293 case (kPER_0) : { s +=
"BAR" ;
break;}
2294 case (kPER_10): { s +=
"BAR1";
break;}
2295 case (kPER_20): { s +=
"BAR2";
break;}
2296 case (kPER_30): { s +=
"BAR3";
break;}
2297 case (kPER_40): { s +=
"BAR4";
break;}
2307 TGComboBox* TH1Editor::BuildHistTypeComboBox(TGFrame* parent, Int_t
id)
2309 TGComboBox *c =
new TGComboBox(parent,
id);
2311 c->AddEntry(
"Lego" , kTYPE_LEGO);
2312 c->AddEntry(
"Lego1", kTYPE_LEGO1);
2313 c->AddEntry(
"Lego2", kTYPE_LEGO2);
2314 c->AddEntry(
"Surf" , kTYPE_SURF);
2315 c->AddEntry(
"Surf1", kTYPE_SURF1);
2316 c->AddEntry(
"Surf2", kTYPE_SURF2);
2317 c->AddEntry(
"Surf3", kTYPE_SURF3);
2318 c->AddEntry(
"Surf4", kTYPE_SURF4);
2319 c->AddEntry(
"Surf5", kTYPE_SURF5);
2327 TGComboBox* TH1Editor::BuildHistCoordsComboBox(TGFrame* parent, Int_t
id)
2329 TGComboBox *c =
new TGComboBox(parent,
id);
2331 c->AddEntry(
"Cartesian", kCOORDS_CAR);
2332 c->AddEntry(
"Cylindric", kCOORDS_CYL);
2333 c->AddEntry(
"Polar", kCOORDS_POL);
2334 c->AddEntry(
"Rapidity", kCOORDS_PSR);
2335 c->AddEntry(
"Spheric", kCOORDS_SPH);
2336 TGListBox* lb = c->GetListBox();
2337 lb->Resize(lb->GetWidth(), 83);
2345 TGComboBox* TH1Editor::BuildHistErrorComboBox(TGFrame* parent, Int_t
id)
2347 TGComboBox *c =
new TGComboBox(parent,
id);
2349 c->AddEntry(
"No Errors", kERRORS_NO);
2350 c->AddEntry(
"Simple", kERRORS_SIMPLE);
2351 c->AddEntry(
"Edges", kERRORS_EDGES);
2352 c->AddEntry(
"Rectangles",kERRORS_REC);
2353 c->AddEntry(
"Fill", kERRORS_FILL);
2354 c->AddEntry(
"Contour", kERRORS_CONTOUR);
2362 TGComboBox* TH1Editor::BuildHistAddComboBox(TGFrame* parent, Int_t
id)
2364 TGComboBox *c =
new TGComboBox(parent,
id);
2366 c->AddEntry(
"No Line", kADD_NONE);
2367 c->AddEntry(
"Simple Line", kADD_SIMPLE);
2368 c->AddEntry(
"Smooth Line", kADD_SMOOTH);
2369 c->AddEntry(
"Fill Area",kADD_FILL);
2370 TGListBox* lb = c->GetListBox();
2371 lb->Resize(lb->GetWidth(), 76);
2378 TGComboBox* TH1Editor::BuildPercentComboBox(TGFrame* parent, Int_t
id)
2380 TGComboBox *c =
new TGComboBox(parent,
id);
2382 c->AddEntry(
" 0 %", kPER_0);
2383 c->AddEntry(
"10 %", kPER_10);
2384 c->AddEntry(
"20 %", kPER_20);
2385 c->AddEntry(
"30 %", kPER_30);
2386 c->AddEntry(
"40 %", kPER_40);
2387 TGListBox* lb = c->GetListBox();
2388 lb->Resize(lb->GetWidth(), 83);
2396 void TH1Editor::ChangeErrorCombo(Int_t i)
2400 if (((TGLBContainer*)((TGListBox*)fErrorCombo->GetListBox())->GetContainer())->GetPos(kERRORS_EDGES)!=-1)
2401 fErrorCombo->RemoveEntries(kERRORS_EDGES,kERRORS_CONTOUR);
2402 if (!((fErrorCombo->GetSelected()== kERRORS_NO) || (fErrorCombo->GetSelected()== kERRORS_SIMPLE)))
2403 fErrorCombo->Select(kERRORS_NO);
2404 TGListBox* lb = fErrorCombo->GetListBox();
2405 lb->Resize(lb->GetWidth(),36);
2409 if (((TGLBContainer*)((TGListBox*)fErrorCombo->GetListBox())->GetContainer())->GetPos(kERRORS_EDGES)==-1) {
2410 fErrorCombo->AddEntry(
"Edges", kERRORS_EDGES);
2411 fErrorCombo->AddEntry(
"Rectangles",kERRORS_REC);
2412 fErrorCombo->AddEntry(
"Fill", kERRORS_FILL);
2413 fErrorCombo->AddEntry(
"Contour", kERRORS_CONTOUR);
2414 TGListBox* lb = fErrorCombo->GetListBox();
2415 lb->Resize(lb->GetWidth(),100);
2425 void TH1Editor::PaintBox3D(Float_t *p1, Float_t *p2,Float_t *p3, Float_t *p4)
2427 if (fGedEditor->GetPad()->GetCanvas())
2428 fGedEditor->GetPad()->GetCanvas()->FeedbackMode(kTRUE);
2429 fGedEditor->GetPad()->SetLineWidth(1);
2430 fGedEditor->GetPad()->SetLineColor(2);
2431 fGedEditor->GetPad()->cd();
2432 fGedEditor->GetPad()->PaintLine3D(p1, p2);
2433 fGedEditor->GetPad()->PaintLine3D(p2, p3);
2434 fGedEditor->GetPad()->PaintLine3D(p3, p4);
2435 fGedEditor->GetPad()->PaintLine3D(p4, p1);
2442 Int_t* TH1Editor::Dividers(Int_t n)
2448 }
else if (n == 1) {
2452 div =
new Int_t[(Int_t) n/2+2];
2457 for (Int_t i=2; i <= n/2; i++) {
2474 void TH1Editor::RecursiveRemove(TObject* obj)