Dear experts,
I am trying to optimize a fitting function and I use a TFitPointer object to access the result of a fit (the type of the fir varies with respect to the given function). At some points the fit might fail and then the TFitPointer will be empty. I try to avoid such occasions by doing the followinf checks:
TFitPointer fitResult = 0;
...... // Fitting code here //........
if (fitResult->IsEmpty() || !(fitResult->IsValid())) {return -3;}
else { ... saving the fit ...... }
Somehow though, just by doing the operation fitResult->IsEmpty() or fitResult->IsValid() root is trying to access the pointer which is i guess Null and I get an error:
Warning in : Fit data is empty
Error in : TFitResult is empty - use the fit option S
Is there any way to protect against this? I tried using using using :
if (fitResult == NULL) {…}
or
if (!fitresult) {…}
but neither seems to work. Any suggestions??
Thanks a lot!!!
_ROOT Version: 5.34 / 36
Platform: Windows
Compiler: MSVS 2013
Hi,
as the message suggests:
“Error in : TFitResult is empty - use the fit option S”
for details see:
https://root.cern/doc/master/classTH1.html#a63eb028df86bc86c8e20c989eb23fb2a
Otto
Hi Otto,
Thanks for the reply but that’s not the issue here, for four simple reasons:
- I am using option S (one would think i would already done the obvious before posting here)
- The problem seems to be related with the fit data as well and not only with the fit results (as the message indicated)
- Apparently the issue only appears when all fit data are only in the two extreme bins of the fitted TH1 histogram. By doing a simple check:
if (TH1F::Integral(firstbin+1, lastbin-1) ==0) continue;
the issue goes away.
- It will cause root 6 to crash (at least at lxplus) but not root 5
I still don’t understand what I am missing.
Hi,
att a little macro, it works (i.e. it doesnt crash with 6.18.00)
as long as at least 1 bin is filled.
if all are empty it results in:
Warning in <Fit>: Fit data is empty
Error in <TFitResultPtr>: TFitResult is empty - use the fit option S
as in your case.
As you see I tried different cases.
tfit.C (535 Bytes)
Otto
HI
I forgot:
Before using TFitResultPtr as pointer you may
check its (int) value which is 0 if ok, -1 if not.
See att example
Otto
tfit.C (660 Bytes)