Hello.
I run fitting with minuit in python, at some stage program crashes with error:
#7 0x00007f081354d387 in raise () from /lib64/libc.so.6
#8 0x00007f081354ea78 in abort () from /lib64/libc.so.6
#9 0x00007f08048157d5 in __gnu_cxx::__verbose_terminate_handler() () from /lib64/libstdc++.so.6
#10 0x00007f0804813746 in ?? () from /lib64/libstdc++.so.6
#11 0x00007f0804813773 in std::terminate() () from /lib64/libstdc++.so.6
#12 0x00007f0804813993 in __cxa_throw () from /lib64/libstdc++.so.6
#13 0x00007f07edcdcc6f in ?? ()
#14 0x00007ffe7abea680 in ?? ()
#15 0x000000000dab4080 in ?? ()
#16 0x0000000000000000 in ?? ()
Please, advise what’s wrong.
I did not experience any problems with my code in Python 2.6 with ROOT 5.34.
ROOT Version: 6.22/02 Platform: CentOS Linux 7 (Core) Compiler: Not Provided
It’s CERN Lxplus machine.
Can you please send us a copy of your code in order to try to reproduce your error? Also, please, can you tell us the Python version that you are using.
Hello, @jalopezg
I found the reason of the crash is an attempt to save a dictionary with TF1 functions which are required for further usage. I use python 2.7.5, which is called by default with python2 at Lxplus.
The code sample is given below
import ROOT
import numpy as np
import shelve
class eff:
def __call__(self, x, par):
return par[1] * exp0(x[0], par[0])
def exp0(x, par):
return np.exp(-x * par)
def fit(x_min, x_max, n_pars):
amp, alpha = 10, 1
func_dct = {}
# workaround with creation of python callable: https://root-forum.cern.ch/t/th1-fit-method-error/40895
instance = eff()
for j in range(2):
key = 'key'+str(j)
func_dct[key] = ROOT.TF1('func name ' + key, instance,
x_min, x_max, n_pars)
func_dct[key].SetParameter(0, amp)
func_dct[key].SetParameter(1, alpha)
return func_dct
if __name__ == '__main__':
x_min, x_max = 0, 5
n_pars = 2
func_dct = fit(x_min, x_max, n_pars)
ses = shelve.open('filename','n')
# crashes here
ses['res'] = func_dct
ses.close()
Hi @kot,
it seems that pickling a PyROOT proxy to a TF1 (which is a C++ object) that uses a python functor as its expression is just too much magic, although I can’t tell what goes wrong exactly.
Best guess: instance has already gone out of scope when the TF1 is pickled/shelved.
Keeping it alive resolves the crash (not 100% sure everything is written to file as you want, but that’s easily verified):