34 ClassImp(TPaveStatsEditor);
57 TPaveStatsEditor::TPaveStatsEditor(
const TGWindow *p, Int_t width, Int_t height,
58 UInt_t options, Pixel_t back) :
59 TGedFrame(p, width, height, options | kVerticalFrame, back)
63 MakeTitle(
"Stat Options");
65 TGCompositeFrame *f1 =
new TGCompositeFrame(
this, 80, 20, kHorizontalFrame);
66 TGCompositeFrame *f2 =
new TGCompositeFrame(f1, 40, 20, kVerticalFrame);
67 f1->AddFrame(f2,
new TGLayoutHints(kLHintsTop, 0, 1, 0, 0));
69 fHistoName =
new TGCheckButton(f2,
"Name", kSTAT_NAME);
70 fHistoName->SetToolTipText(
"Print the histogram name");
71 f2->AddFrame(fHistoName,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
72 fOverflow =
new TGCheckButton(f2,
"Overflow", kSTAT_OVER);
73 fOverflow->SetToolTipText(
"Print the number of overflows");
74 f2->AddFrame(fOverflow,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
75 fUnderflow =
new TGCheckButton(f2,
"Underflow", kSTAT_UNDER);
76 fUnderflow->SetToolTipText(
"Print the number of underflows");
77 f2->AddFrame(fUnderflow,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
78 fSkewness =
new TGCheckButton(f2,
"Skewness", kSTAT_SKEWNESS);
79 fSkewness->SetToolTipText(
"Print the skewness");
80 f2->AddFrame(fSkewness,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
81 fKurtosis =
new TGCheckButton(f2,
"Kurtosis", kSTAT_KURTOSIS);
82 fKurtosis->SetToolTipText(
"Print the kurtosis");
83 f2->AddFrame(fKurtosis,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
85 TGCompositeFrame *f3 =
new TGCompositeFrame(f1, 40, 20, kVerticalFrame);
86 fEntries =
new TGCheckButton(f3,
"Entries", kSTAT_ENTRIES);
87 fEntries->SetToolTipText(
"Print the number of entries");
88 f3->AddFrame(fEntries,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
89 fMean =
new TGCheckButton(f3,
"Mean", kSTAT_MEAN);
90 fMean->SetToolTipText(
"Print the mean value");
91 f3->AddFrame(fMean,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
92 fRMS =
new TGCheckButton(f3,
"RMS", kSTAT_RMS);
93 fRMS->SetToolTipText(
"Print root-mean-square (RMS)");
94 f3->AddFrame(fRMS,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
95 fIntegral =
new TGCheckButton(f3,
"Integral", kSTAT_INTEGRAL);
96 fIntegral->SetToolTipText(
"Print the integral of bins");
97 f3->AddFrame(fIntegral,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
98 fStatsErrors =
new TGCheckButton(f3,
"Errors", kSTAT_ERR);
99 fStatsErrors->SetToolTipText(
"Print the errors");
100 f3->AddFrame(fStatsErrors,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 5));
101 f1->AddFrame(f3,
new TGLayoutHints(kLHintsTop, 0, 1, 0, 0));
103 AddFrame(f1,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
105 MakeTitle(
"Fit Options");
107 TGCompositeFrame *f4 =
new TGCompositeFrame(
this, 80, 20, kHorizontalFrame);
108 TGCompositeFrame *f5 =
new TGCompositeFrame(f4, 40, 20, kVerticalFrame);
109 f4->AddFrame(f5,
new TGLayoutHints(kLHintsTop, 0, 1, 0, 0));
111 fNameValues =
new TGCheckButton(f5,
"Values", kFIT_NAME);
112 fNameValues->SetToolTipText(
"Print the parameter name and value");
113 f5->AddFrame(fNameValues,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
114 fProbability =
new TGCheckButton(f5,
"Probability", kFIT_PROB);
115 fProbability->SetToolTipText(
"Print probability");
116 f5->AddFrame(fProbability,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
118 TGCompositeFrame *f6 =
new TGCompositeFrame(f4, 40, 20, kVerticalFrame);
119 fErrors =
new TGCheckButton(f6,
"Errors", kFIT_ERR);
120 fErrors->SetToolTipText(
"Print the errors");
121 f6->AddFrame(fErrors,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
122 fChisquare =
new TGCheckButton(f6,
"Chi", kFIT_CHI);
123 fChisquare->SetToolTipText(
"Print Chisquare");
124 f6->AddFrame(fChisquare,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
125 f4->AddFrame(f6,
new TGLayoutHints(kLHintsTop, 0, 1, 0, 0));
127 AddFrame(f4,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
133 TPaveStatsEditor::~TPaveStatsEditor()
140 void TPaveStatsEditor::ConnectSignals2Slots()
143 fHistoName->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"DoStatOptions()");
144 fEntries->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"DoStatOptions()");
145 fOverflow->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"DoStatOptions()");
146 fMean->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"DoStatOptions()");
147 fUnderflow->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"DoStatOptions()");
148 fRMS->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"DoStatOptions()");
149 fIntegral->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"DoStatOptions()");
150 fSkewness->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"DoStatOptions()");
151 fKurtosis->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"DoStatOptions()");
152 fStatsErrors->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"DoStatOptions()");
155 fNameValues->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"DoFitOptions()");
156 fErrors->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"DoFitOptions()");
157 fErrors->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"SetValuesON(Bool_t");
158 fProbability->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"DoFitOptions()");
159 fChisquare->Connect(
"Toggled(Bool_t)",
"TPaveStatsEditor",
this,
"DoFitOptions()");
167 void TPaveStatsEditor::SetModel(TObject* obj)
169 fPaveStats = (TPaveStats *)obj;
170 fAvoidSignal = kTRUE;
172 Int_t stat = fPaveStats->GetOptStat();
174 if (stat % 10) fHistoName->SetState(kButtonDown);
175 else fHistoName->SetState(kButtonUp);
177 if (stat/10 % 10) fEntries->SetState(kButtonDown);
178 else fEntries->SetState(kButtonUp);
180 if (stat/100 % 10) fMean->SetState(kButtonDown);
181 else fMean->SetState(kButtonUp);
183 if (stat/1000 % 10) fRMS->SetState(kButtonDown);
184 else fRMS->SetState(kButtonUp);
186 if (stat/10000 % 10) fUnderflow->SetState(kButtonDown);
187 else fUnderflow->SetState(kButtonUp);
189 if (stat/100000 % 10) fOverflow->SetState(kButtonDown);
190 else fOverflow->SetState(kButtonUp);
192 if (stat/1000000 % 10) fIntegral->SetState(kButtonDown);
193 else fIntegral->SetState(kButtonUp);
195 if (stat/10000000 % 10) fSkewness->SetState(kButtonDown);
196 else fSkewness->SetState(kButtonUp);
198 if (stat/100000000 % 10) fKurtosis->SetState(kButtonDown);
199 else fKurtosis->SetState(kButtonUp);
201 Int_t fit = fPaveStats->GetOptFit();
202 if (fit % 10) fNameValues->SetState(kButtonDown);
203 else fNameValues->SetState(kButtonUp);
206 fErrors->SetState(kButtonDown);
207 fNameValues->SetState(kButtonDown);
209 fErrors->SetState(kButtonUp);
212 if (fit/100 % 10) fChisquare->SetState(kButtonDown);
213 else fChisquare->SetState(kButtonUp);
215 if (fit/1000 % 10) fProbability->SetState(kButtonDown);
216 else fProbability->SetState(kButtonUp);
218 if (fInit) ConnectSignals2Slots();
220 fAvoidSignal = kFALSE;
226 void TPaveStatsEditor::DoStatOptions()
228 if (fAvoidSignal)
return;
230 if (fHistoName->GetState() == kButtonDown) stat +=1;
231 if (fEntries->GetState() == kButtonDown) stat +=10;
232 if (fMean->GetState() == kButtonDown) stat +=100;
233 if (fRMS->GetState() == kButtonDown) stat +=1000;
234 if (fUnderflow->GetState() == kButtonDown) stat +=10000;
235 if (fOverflow->GetState() == kButtonDown) stat +=100000;
236 if (fIntegral->GetState() == kButtonDown) stat +=1000000;
237 if (fSkewness->GetState() == kButtonDown) stat +=10000000;
238 if (fKurtosis->GetState() == kButtonDown) stat +=100000000;
239 if (fStatsErrors->GetState() == kButtonDown) {
240 if (fMean->GetState() == kButtonDown) stat +=100;
241 if (fRMS->GetState() == kButtonDown) stat +=1000;
242 if (fSkewness->GetState() == kButtonDown) stat +=10000000;
243 if (fKurtosis->GetState() == kButtonDown) stat +=100000000;
248 fHistoName->SetState(kButtonDown);
250 if (stat == 1) stat = 1000000001;
251 fPaveStats->SetOptStat(stat);
258 void TPaveStatsEditor::DoFitOptions()
260 if (fAvoidSignal)
return;
262 if (fNameValues->GetState() == kButtonDown) fit +=1;
263 if (fErrors->GetState() == kButtonDown) fit +=10;
264 if (fChisquare->GetState() == kButtonDown) fit +=100;
265 if (fProbability->GetState() == kButtonDown) fit +=1000;
267 if (fit == 1) fit = 10001;
268 fPaveStats->SetOptFit(fit);
276 void TPaveStatsEditor::SetValuesON(Bool_t on)
278 if (fAvoidSignal)
return;
279 if (on == kTRUE) fNameValues->SetState(kButtonDown);