Hello,
I have some old code written in python 2.7 using ROOT < 6.18 and I am working on converting it to python 3.10 with the newest ROOT 6.30.
I saw that there were some changes considering the TPyMultiGenFunction and I tried to replace it with the Math.IMultiGenFunction but I ran into a cppyy.ll.SegmentationViolation.
Here the old version:
minimizer = ROOT.Minuit2.Minuit2Minimizer(0)
errorfct = chi2fct3d_angles()
errorfct.SetVals(samplesize, points, errors)
minimizer.SetFunction(errorfct)
(...)
class chi2fct3d_angles( ROOT.TPyMultiGenFunction ):
def __init__( self ):
ROOT.TPyMultiGenFunction.__init__( self, self )
self.samplesize = 0
self.points = np.zeros(12)
self.errors = np.zeros(12)
def NDim( self ): # total number of variables
return 4.0
def SetVals(self, samplesizet, pointst, errorst):
self.samplesize = samplesizet
self.points = pointst
self.errors = errorst
def DoEval( self, pars):
chisq = []
for i in range(0,self.samplesize):
errsx = self.errors[i][0]**2
errsy = self.errors[i][1]**2
errsz = self.errors[i][2]**2
xvalue = self.points[i][0]
yvalue = self.points[i][1]
zvalue = self.points[i][2]
distx, disty, distz = dist_p_line_angles(xvalue, yvalue, zvalue, pars) # distance squared of line to point i
distx = distx**2
disty = disty**2
distz = distz**2
chisq.append((distx + disty + distz)/(errsx + errsy + errsz)) # add chisq of point i
chisq = np.sum(np.array(chisq))
return chisq
Here is what I tried looking at the example at Python interface: PyROOT - ROOT
minimizer = ROOT.Minuit2.Minuit2Minimizer(0)
errorfct = chi2fct3d_angles()
errorfct.SetVals(samplesize, points, errors)
minimizer.SetFunction(errorfct)
(...)
class chi2fct3d_angles( ROOT.Math.IMultiGenFunction ):
def __init__( self ):
#ROOT.Math.IMultiGenFunction.__init__( self, self )
self.samplesize = 0
self.points = np.zeros(12)
self.errors = np.zeros(12)
def NDim( self ): # total number of variables
return 4.0
def SetVals(self, samplesizet, pointst, errorst):
self.samplesize = samplesizet
self.points = pointst
self.errors = errorst
def DoEval( self, pars):
chisq = []
for i in range(0,self.samplesize):
errsx = self.errors[i][0]**2
errsy = self.errors[i][1]**2
errsz = self.errors[i][2]**2
xvalue = self.points[i][0]
yvalue = self.points[i][1]
zvalue = self.points[i][2]
distx, disty, distz = dist_p_line_angles(xvalue, yvalue, zvalue, pars) # distance squared of line to point i
distx = distx**2
disty = disty**2
distz = distz**2
chisq.append((distx + disty + distz)/(errsx + errsy + errsz)) # add chisq of point i
chisq = np.sum(np.array(chisq))
return chisq
def Clone( self ):
x = chi2fct3d_angles()
ROOT.SetOwnership(x, False )
return x
But I get the following error:
minimizer.SetFunction(errorfct)
cppyy.ll.SegmentationViolation: void ROOT::Minuit2::Minuit2Minimizer::SetFunction(ROOT::Math::IBaseFunctionMultiDimTempl<double>& func) =>
SegmentationViolation: segfault in C++; program state was reset
What change am I still missing?
Thank you!
Viktoria
ROOT Version: 6.30/06
Built for linuxx8664gcc on Apr 22 2024, 13:50:50
From tags/v6.30.06-0-g4f4e716372@v6.30.06-0-g4f4e716372
With c++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0