161#include "RConfigure.h"
193 if ( strcmp(
f->GetName(),
name ) == 0 )
201 for (
fPrevFitIter it = look.first; it != look.second; ++it ) {
203 if ( strcmp(
f->GetName(),
name ) == 0 )
225 if (
dynamic_cast<TF3 *
>(
f) != 0 ) {
226 TF3* fnew = (
TF3 *)
f->IsA()->New();
233 }
else if (
dynamic_cast<TF2 *
>(
f) != 0 ) {
234 TF2* fnew = (
TF2 *)
f->IsA()->New();
243 TF1* fnew = (
TF1 *)
f->IsA()->New();
263 if (npar != (
int) pars.size() ) pars.resize(npar);
264 for (
Int_t i = 0; i < npar; ++i )
280 if (npar > (
int) pars.size() ) pars.resize(npar);
281 for (
Int_t i = 0; i < npar; ++i )
291template<
class FitObject>
295 if (100 == special || 400 == special) {
300 }
else if ( 110 == special || 410 == special ) {
316 if (!textEntry)
return;
320 variablesStr = nameStr(nameStr.
First(
'(') + 2, nameStr.
First(
',') - nameStr.
First(
'(') - 3);
322 cutsStr = nameStr( nameStr.
First(
',') + 3, nameStr.
First(
')') - nameStr.
First(
',') - 4 );
339 gROOT->MakeDefCanvas();
418 int parts[] = { 20, 20, 20, 20, 20 };
428 gROOT->GetListOfCleanups()->Add(
this);
452 std::vector<TObject*>
v;
487 if (cw + size.
fWidth < dw) {
488 Int_t gedx = 0, gedy = 0;
490 gedy = (cy > 20) ? cy-20 : 0;
514 this,
"SetFitObject(TVirtualPad *, TObject *, Int_t)");
515 gROOT->GetListOfCleanups()->Remove(
this);
577 bgr -> SetRadioButtonExclusive();
583 fNone -> SetToolTipText(
"No operation defined");
585 fAdd -> SetToolTipText(
"Addition");
587 fNormAdd -> SetToolTipText(
"NormAddition");
589 fConv -> SetToolTipText(
"Convolution");
639 gClient->GetColorByName(
"#336666", color);
929 #ifdef R__HAS_MATHMORE
947 "minimizers to be compiled");
986 TGLabel *errlabel =
new TGLabel(hsv1,
"Error definition (default = 1): ");
989 TGLabel *tollabel =
new TGLabel(hsv1,
"Max tolerance (precision): ");
992 TGLabel *itrlabel =
new TGLabel(hsv1,
"Max number of iterations: ");
1052 fDataSet ->
Connect(
"Selected(Int_t)",
"TFitEditor",
this,
"DoDataSet(Int_t)");
1054 fTypeFit ->
Connect(
"Selected(Int_t)",
"TFitEditor",
this,
"FillFunctionList(Int_t)");
1056 fFuncList ->
Connect(
"Selected(Int_t)",
"TFitEditor",
this,
"DoFunction(Int_t)");
1060 fSetParam ->
Connect(
"Clicked()",
"TFitEditor",
this,
"DoSetParameters()");
1062 fAdd ->
Connect(
"Toggled(Bool_t)",
"TFitEditor",
this,
"DoAddition(Bool_t)");
1067 fUseRange ->
Connect(
"Toggled(Bool_t)",
"TFitEditor",
this,
"DoUseFuncRange()");
1087 fSliderX ->
Connect(
"PositionChanged()",
"TFitEditor",
this,
"DoSliderXMoved()");
1088 fSliderXMax ->
Connect(
"ValueSet(Long_t)",
"TFitEditor",
this,
"DoNumericSliderXChanged()");
1089 fSliderXMin ->
Connect(
"ValueSet(Long_t)",
"TFitEditor",
this,
"DoNumericSliderXChanged()");
1093 fSliderY ->
Connect(
"PositionChanged()",
"TFitEditor",
this,
"DoSliderYMoved()");
1094 fSliderYMax ->
Connect(
"ValueSet(Long_t)",
"TFitEditor",
this,
"DoNumericSliderYChanged()");
1095 fSliderYMin ->
Connect(
"ValueSet(Long_t)",
"TFitEditor",
this,
"DoNumericSliderYChanged()");
1098 fSliderZ ->
Connect(
"PositionChanged()",
"TFitEditor",
this,
"DoSliderZMoved()");
1104 fLibMinuit ->
Connect(
"Toggled(Bool_t)",
"TFitEditor",
this,
"DoLibrary(Bool_t)");
1106 fLibFumili ->
Connect(
"Toggled(Bool_t)",
"TFitEditor",
this,
"DoLibrary(Bool_t)");
1107 fLibGSL ->
Connect(
"Toggled(Bool_t)",
"TFitEditor",
this,
"DoLibrary(Bool_t)");
1117 fOptQuiet ->
Connect(
"Toggled(Bool_t)",
"TFitEditor",
this,
"DoPrintOpt(Bool_t)");
1204 "SetFitObject(TVirtualPad *, TObject *, Int_t)");
1205 TQObject::Connect(
"TCanvas",
"Closed()",
"TFitEditor",
this,
"DoNoSelection()");
1220 this,
"SetFitObject(TVirtualPad *, TObject *, Int_t)");
1224 gROOT->GetListOfCleanups()->Remove(
this);
1232 if (!
gROOT->GetListOfCleanups()->FindObject(
this))
1233 gROOT->GetListOfCleanups()->Add(
this);
1313 Error(
"UpdateGUI",
"No hist is present - this should not happen, please report."
1314 "The FitPanel might be in an inconsistent state");
1333 if (ixmin > 1 || ixmax < ixrange) {
1352 fSliderX->
Connect(
"PositionChanged()",
"TFitEditor",
this,
"DoSliderXMoved()");
1353 fSliderXMax->
Connect(
"ValueSet(Long_t)",
"TFitEditor",
this,
"DoNumericSliderXChanged()");
1354 fSliderXMin->
Connect(
"ValueSet(Long_t)",
"TFitEditor",
this,
"DoNumericSliderXChanged()");
1367 Int_t iymin = 0, iymax = 0, iyrange = 0;
1385 if (iymin > 1 || iymax < iyrange) {
1404 fSliderY->
Connect(
"PositionChanged()",
"TFitEditor",
this,
"DoSliderYMoved()");
1405 fSliderYMax->
Connect(
"ValueSet(Long_t)",
"TFitEditor",
this,
"DoNumericSliderYChanged()");
1406 fSliderYMin->
Connect(
"ValueSet(Long_t)",
"TFitEditor",
this,
"DoNumericSliderYChanged()");
1416 Int_t izmin = 0, izmax = 0, izrange = 0;
1434 if (izmin > 1 || izmax < izrange) {
1443 fSliderZ->
Connect(
"PositionChanged()",
"TFitEditor",
this,
"DoSliderZMoved()");
1481 if ( tmpStr.
Length() == 0 )
1553 if (
gROOT->GetListOfCanvases()->IsEmpty()) {
1590 "SetFitObject(TVirtualPad *, TObject *, Int_t)");
1684 if ( strncmp(
f->GetName(),
"PrevFit", 7) != 0 ) {
1691 if (
f->GetNdim() ==
fDim ||
fDim == 0) {
1700 else if(
fDim == 1 ) {
1703 }
else if(
fDim == 2 ) {
1715 for (
fPrevFitIter it = look.first; it != look.second; ++it ) {
1726 else if (
fDim == 2 )
1797 TIter canvasIter(canvases);
1802 if (
TPad* can =
dynamic_cast<TPad*
>(obj))
1805 else if (
dynamic_cast<TH1*
>(obj)
1806 ||
dynamic_cast<TGraph*
>(obj)
1809 ||
dynamic_cast<THStack*
>(obj)
1810 ||
dynamic_cast<TTree*
>(obj) ) {
1811 bool insertNew =
true;
1813 for ( std::vector<TObject*>::iterator i = objects.begin(); i != objects.end(); ++i )
1814 if ( (*i) == obj ) {
1820 if ( insertNew ) objects.push_back(obj);
1840 std::vector<TObject*> objects;
1848 while ( (obj = (
TObject*) next()) ) {
1850 if (
dynamic_cast<TH1*
>(obj) ||
1852 dynamic_cast<TTree*
>(obj) ) {
1853 objects.push_back(obj);
1868 for ( std::vector<TObject*>::iterator i = objects.begin(); i != objects.end(); ++i ) {
1873 if ( selEntryStr &&
name == selEntryStr )
1894 c->AddEntry(
"Unbinned Likelihood",
kFP_MUBIN);
1997 "Error...",
"2) Verify the entered function string!",
2029 static TF1 *fitFunc =
nullptr;
2036 std::cout <<
"TFitEditor::DoFit - using function " << fitFunc->
GetName() <<
" " << fitFunc << std::endl;
2039 Error(
"DoFit",
"This should have never happend, the fitfunc pointer is NULL! - Please Report" );
2065 FitObject(
gr, fitFunc, fitOpts, mopts, strDrawOpts, drange);
2072 FitObject(mg, fitFunc, fitOpts, mopts, strDrawOpts, drange);
2080 FitObject(g2d, fitFunc, fitOpts, mopts, strDrawOpts, drange);
2103 if ( !
tree )
return;
2108 tree->Draw(variables,cuts,
"goff");
2110 auto player =
tree->GetPlayer();
2112 Error(
"DoFit",
"Player reference is NULL");
2116 auto selector =
dynamic_cast<TSelectorDraw *
>(player->GetSelector());
2118 Error(
"DoFit",
"Selector reference is NULL");
2123 unsigned int ndim = player->GetDimension();
2125 Error(
"DoFit",
"NDIM == 0");
2129 std::vector<double *> vlist;
2130 for (
unsigned int i = 0; i < ndim; ++i) {
2131 double *
v = selector->GetVal(i);
2132 if (
v != 0) vlist.push_back(
v);
2134 std::cerr <<
"pointer for variable " << i <<
" is zero" << std::endl;
2136 if (vlist.size() != ndim) {
2137 Error(
"DoFit",
"Vector is not complete");
2142 Long64_t nrows = player->GetSelectedRows();
2144 Error(
"DoFit",
"NROWS == 0");
2150 for (
int i = 0; i < std::min(
int(fitdata->
Size()),10); ++i) {
2152 for (
unsigned int j = 0; j < ndim; ++j) {
2153 printf(
" x_%d [%d] = %f \n", j, i,*(fitdata->
Coords(i)+j) );
2175 fitFunc->
Draw(
"same");
2185 if (!strstr(fitFunc->
GetName(),
"PrevFit"))
2191 float xmin = 0.f,
xmax = 0.f,
ymin = 0.f,
ymax = 0.f, zmin = 0.f, zmax = 0.f;
2217 if (save)
gPad = save;
2241 TF1 form(
"tmpCheck", fname);
2243 rvalue = form.
IsValid() ? 0 : -1;
2244 }
else if (
fDim == 2 ) {
2245 TF2 form(
"tmpCheck", fname);
2247 rvalue = form.
IsValid() ? 0 : -1;
2248 }
else if (
fDim == 3 ) {
2249 TF3 form(
"tmpCheck", fname);
2251 rvalue = form.
IsValid() ? 0 : -1;
2299 if (on)
Info(
"DoNormAddition",
"Normalized addition is selected");
2323 if (on)
Info(
"DoConvolution",
"Convolution is selected");
2338 if (!textEntry)
return;
2345 if ( className ==
"TTree" ) {
2351 lookStr =
name(0,
name.First(
' '));
2368 char variables[256] = {0};
char cuts[256] = {0};
2369 strlcpy(variables,
"Sin input!", 256);
2371 if ( strcmp ( variables,
"" ) == 0 ) {
2379 TPad* currentPad = NULL;
2381 std::queue<TPad*> stPad;
2384 if (
dynamic_cast<TPad*
>(canvas) )
2385 stPad.push(
dynamic_cast<TPad*
>(canvas));
2388 while ( !stPad.empty() && !found ) {
2389 currentPad = stPad.front();
2393 if ( elem == objSelected ) {
2396 }
else if (
dynamic_cast<TPad*
>(elem) )
2397 stPad.push(
dynamic_cast<TPad*
>(elem) );
2428 bool editable =
false;
2563 "Error...",
"3) Verify the entered function string!",
2734 if (!fitFunc) {
Error(
"DoSetParameters",
"NUll function");
return; }
2810 static Int_t px1old, py1old, px2old, py2old;
2822 Int_t px1,py1,px2,py2;
2846 px1 =
gPad->XtoAbsPixel(xleft);
2848 px2 =
gPad->XtoAbsPixel(xright);
2851 if (
gPad->GetCanvas())
gPad->GetCanvas()->FeedbackMode(
kTRUE);
2852 gPad->SetLineWidth(1);
2853 gPad->SetLineColor(2);
2863 if(save)
gPad = save;
2936 "Info",
"Dialog of user method is not implemented yet",
2988 for (
int i = 0; i < variables.Length() &&
fDim <= 2; ++i )
2989 if (
':' == variables[i] )
fDim += 1;
3000 fDim = ((
TH1*)obj)->GetDimension();
3054 bool isTree =
false;
3061 isTree = strcmp(obj->
ClassName(),
"TTree") == 0;
3063 name =
"No object selected";
3070 if ( selectedEntry ) {
3073 selectedName = selectedName(0, selectedName.
First(
' '));
3074 if (
name.CompareTo(selectedName) == 0 ) {
3085 TString compareName = entry->GetText()->GetString();
3087 compareName = compareName(0, compareName.
First(
' '));
3088 if (
name.CompareTo(compareName) == 0 ) {
3115 while ((obj = next())) {
3289 while ((obj2 = next())) {
3298 if ( strcmp( func->
GetName(), it->second->GetName() ) == 0 )
3300 if ( strcmp( func->
GetName(),
"PrevFitTMP" ) == 0 )
3496 TList *listOfFunctions = 0;
3501 listOfFunctions = ((
TH1 *)
fFitObject)->GetListOfFunctions();
3522 return listOfFunctions;
3538 const unsigned int nfuncs = 16;
3539 const char* fnames[nfuncs] = {
"gaus" ,
"gausn",
"expo",
"landau",
3540 "landaun",
"pol0",
"pol1",
"pol2",
3541 "pol3",
"pol4",
"pol5",
"pol6",
3542 "pol7",
"pol8",
"pol9",
"user"
3546 TIter functionsIter(
gROOT->GetListOfFunctions());
3548 while( ( obj = (
TObject*) functionsIter() ) ) {
3550 if (
TF1* func =
dynamic_cast<TF1*
>(obj) ) {
3551 bool addFunction =
true;
3553 for (
unsigned int i = 0; i < nfuncs; ++i ) {
3554 if ( strcmp( func->GetName(), fnames[i] ) == 0 ) {
3555 addFunction =
false;
3580 std::pair<fPrevFitIter, fPrevFitIter> look =
fPrevFit.equal_range(obj);
3581 for (
fPrevFitIter it = look.first; it != look.second; ++it ) {
3582 retList->
Add(it->second);
3603 "Error...",
"1) Verify the entered function string!",
3610 fitFunc = (
TF1*)tmpF1->IsA()->New();
3611 tmpF1->
Copy(*fitFunc);
3653 if (
fConv -> IsOn())
3662 else if (
fDim == 2 ) {
3665 else if (
fDim == 3 ) {
3678 if ( tmpF1 != 0 && fitFunc != 0 &&
3683 tmpF1->
Copy(*fitFunc);
ULong_t Pixel_t
Pixel value.
const Bool_t kIterForward
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
TF1 * copyTF1(TF1 *f)
Copies f into a new TF1 to be stored in the fitpanel with it's own ownership.
void GetParameters(TFitEditor::FuncParams_t &pars, TF1 *func)
Stores the parameters of the given function into pars.
void InitParameters(TF1 *func, FitObject *fitobj)
Parameter initialization for the function.
void GetTreeVarsAndCuts(TGComboBox *dataSet, TString &variablesStr, TString &cutsStr)
Splits the entry in fDataSet to get the selected variables and cuts from the text.
void SetParameters(TFitEditor::FuncParams_t &pars, TF1 *func)
Restore the parameters from pars into the function.
void SearchCanvases(TSeqCollection *canvases, std::vector< TObject * > &objects)
std::multimap< TObject *, TF1 * > FitFuncMap_t
R__EXTERN TPluginManager * gPluginMgr
R__EXTERN void * gTQSender
char * Form(const char *fmt,...)
Class describing the binned data sets : vectors of x coordinates, y values and optionally error on y ...
class describing the range in the coordinates it supports multiple range in a coordinate.
void AddRange(unsigned int icoord, double xmin, double xmax)
add a range [xmin,xmax] for the new coordinate icoord Adding a range does not delete existing one,...
void GetRange(unsigned int irange, unsigned int icoord, double &xmin, double &xmax) const
get the i-th range for given coordinate.
unsigned int Size() const
return number of fit points
const double * Coords(unsigned int ipoint) const
return a pointer to the coordinates data for the given fit point
Class describing the unbinned data sets (just x coordinates values) of any dimensions.
void SetMaxFunctionCalls(unsigned int maxfcn)
set maximum of function calls
void SetMaxIterations(unsigned int maxiter)
set maximum iterations (one iteration can have many function calls)
void SetMinimizerType(const char *type)
set minimizer type
static double DefaultTolerance()
static const std::string & DefaultMinimizerType()
void SetErrorDef(double err)
set error def
static int DefaultMaxIterations()
static double DefaultErrorDef()
void SetMinimizerAlgorithm(const char *type)
set minimizer algorithm
void SetTolerance(double tol)
set the tolerance
virtual Int_t FindBin(Double_t x)
Find bin number corresponding to abscissa x.
virtual Double_t GetBinLowEdge(Int_t bin) const
Return low edge of bin.
Int_t GetLast() const
Return last bin on the axis i.e.
virtual Double_t GetBinUpEdge(Int_t bin) const
Return up edge of bin.
Int_t GetFirst() const
Return first bin on the axis i.e.
Int_t GetWindowTopX()
Returns current top x position of window on screen.
Int_t GetWindowTopY()
Returns current top y position of window on screen.
virtual void Selected(TVirtualPad *pad, TObject *obj, Int_t event)
Emit Selected() signal.
void SetCursor(ECursor cursor) override
Set cursor.
UInt_t GetWindowWidth() const
Class wrapping convolution of two functions.
const char * GetParName(Int_t ipar) const
Class adding two functions: c1*f1+c2*f2.
const char * GetParName(Int_t ipar) const
Int_t GetNpar() const
Return the number of (non constant) parameters including the coefficients: for 2 functions: c1,...
virtual Int_t GetNumber() const
virtual void GetParLimits(Int_t ipar, Double_t &parmin, Double_t &parmax) const
Return limits for parameter ipar.
virtual void Copy(TObject &f1) const
Copy this F1 to a new F1.
virtual void SetRange(Double_t xmin, Double_t xmax)
Initialize the upper and lower bounds to draw the function.
virtual void SetParent(TObject *p=0)
virtual Int_t GetNpar() const
virtual TString GetExpFormula(Option_t *option="") const
virtual Double_t * GetParameters() const
virtual void GetRange(Double_t *xmin, Double_t *xmax) const
Return range of a generic N-D function.
virtual void SetParLimits(Int_t ipar, Double_t parmin, Double_t parmax)
Set limits for parameter ipar.
virtual void SetParName(Int_t ipar, const char *name)
Set name of parameter number ipar.
virtual void Draw(Option_t *option="")
Draw this function with its current attributes.
virtual Bool_t IsValid() const
Return kTRUE if the function is valid.
virtual void SetParameters(const Double_t *params)
virtual void SetParameter(Int_t param, Double_t value)
virtual void Save(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax, Double_t zmin, Double_t zmax)
Save values of function in array fSave.
virtual Bool_t AddToGlobalList(Bool_t on=kTRUE)
Add to global list of functions (gROOT->GetListOfFunctions() ) return previous status (true if the fu...
virtual Double_t GetParameter(Int_t ipar) const
A 2-Dim function with parameters.
virtual void Save(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax, Double_t zmin, Double_t zmax)
Save values of function in array fSave.
virtual void Copy(TObject &f2) const
Copy this F2 to a new F2.
virtual void SetRange(Double_t xmin, Double_t xmax)
Initialize the upper and lower bounds to draw the function.
A 3-Dim function with parameters.
virtual void SetRange(Double_t xmin, Double_t xmax)
Initialize the upper and lower bounds to draw the function.
virtual void Copy(TObject &f3) const
Copy this F3 to a new F3.
TGCheckButton * fBestErrors
TF1 * FindFunction()
This method looks among the functions stored by the fitpanel, the one that is currently selected in t...
TGDoubleHSlider * fSliderX
TFitEditor(const TFitEditor &)
TGComboBox * fMinMethodList