0

I tried to fit a three-term Gaussian function to data using the following code:

import ROOT
#from ROOT import TF1
import numpy as np

data = np.loadtxt('V_lambda_n.dat')
r = data[:, 0]
V = data[:, 1]

graph = ROOT.TGraph() 
for i in range(len(V)):
    graph.SetPoint(i, r[i], V[i])

def myfunc(x, p):
    return p[0]*np.exp(-(x/p[1])**2) + p[1]*np.exp(-(x/p[2])**2) + p[2]*np.exp(-(x/p[3])**2)


func=ROOT.TF1("func", myfunc, 0.0e-15,4e-15, 4)
func.SetParameters(-1.0, -1.0, 1.0, 1.0)

graph.Fit(func)

canvas = ROOT.TCanvas("name", "title", 1024, 768)
graph.GetXaxis().SetTitle("r") # set x-axis title
graph.GetYaxis().SetTitle("V") # set y-axis title
graph.Draw("AP")

I got the following error:

TypeError: none of the 2 overloaded methods succeeded. Full details:
  TFitResultPtr TGraph::Fit(const char* formula, const char* option = "", const char* goption = "", double xmin = 0, double xmax = 0) =>
    could not convert argument 1 (expected string or Unicode object, TF1 found)
  TFitResultPtr TGraph::Fit(TF1* f1, const char* option = "", const char* goption = "", double xmin = 0, double xmax = 0) =>
    TFN python function call failed (C++ exception of type runtime_error)

How may I fix this error? It seems to be complaining about the class object "func". Here is the data

 r          V
 0.1700    192.8424
 0.1800    168.5586
 0.1900    147.4645
 0.2000    128.8915
 0.2100    112.3266
 0.2200     97.3737
 0.2300     83.7266
 0.2400     71.1502
 0.2500     59.4669
 0.2600     48.5469
 0.2700     38.3009
 0.2800     28.6740
 0.2900     19.6411
 0.3000     11.2018
 0.3100      3.3759
 0.3200     -3.8022
 0.3300    -10.2887
 0.3400    -16.0363
 0.3500    -21.0003
 0.3600    -25.1442
 0.3700    -28.4448
 0.3800    -30.8960
 0.3900    -32.5114
 0.4000    -33.3251
 0.4100    -33.3908
 0.4200    -32.7797
 0.4300    -31.5765
 0.4400    -29.8754
 0.4500    -27.7754
 0.4600    -25.3755
 0.4700    -22.7709
 0.4800    -20.0496
 0.4900    -17.2902
 0.5000    -14.5601
 0.5100    -11.9151
 0.5200     -9.3994
 0.5300     -7.0462
 0.5400     -4.8785
 0.5500     -2.9108
 0.5600     -1.1499
 0.5700      0.4033
 0.5800      1.7530
 0.5900      2.9069
 0.6000      3.8756
 0.6100      4.6715
 0.6200      5.3081
 0.6300      5.7995
 0.6400      6.1599
 0.6500      6.4034
 0.6600      6.5436
 0.6700      6.5934
 0.6800      6.5651
 0.6900      6.4700
 0.7000      6.3186
 0.7100      6.1206
 0.7200      5.8847
 0.7300      5.6189
 0.7400      5.3303
 0.7500      5.0252
 0.7600      4.7092
 0.7700      4.3874
 0.7800      4.0639
 0.7900      3.7426
 0.8000      3.4266
 0.8100      3.1185
 0.8200      2.8207
 0.8300      2.5348
 0.8400      2.2624
 0.8500      2.0046
 0.8600      1.7620
 0.8700      1.5352
 0.8800      1.3245
 0.8900      1.1298
 0.9000      0.9512
 0.9100      0.7882
 0.9200      0.6405
 0.9300      0.5076
 0.9400      0.3887
 0.9500      0.2832
 0.9600      0.1904
 0.9700      0.1094
 0.9800      0.0395
 0.9900     -0.0202
 1.0000     -0.0705
 1.0100     -0.1122
 1.0200     -0.1460
 1.0300     -0.1729
 1.0400     -0.1934
 1.0500     -0.2083
 1.0600     -0.2183
 1.0700     -0.2240
 1.0800     -0.2260
 1.0900     -0.2248
 1.1000     -0.2209
 1.1100     -0.2148
 1.1200     -0.2068
 1.1300     -0.1974
 1.1400     -0.1869
 1.1500     -0.1755
 1.1600     -0.1636
 1.1700     -0.1514
 1.1800     -0.1390
 1.1900     -0.1266
 1.2000     -0.1144
 1.2100     -0.1024
 1.2200     -0.0909
 1.2300     -0.0798
 1.2400     -0.0692
 1.2500     -0.0592
 1.2600     -0.0498
 1.2700     -0.0410
 1.2800     -0.0328
 1.2900     -0.0252
 1.3000     -0.0183
 1.3100     -0.0120
 1.3200     -0.0062
 1.3300     -0.0010
 1.3400      0.0037
 1.3500      0.0078
 1.3600      0.0115
 1.3700      0.0147
 1.3800      0.0175
 1.3900      0.0199
 1.4000      0.0219
 1.4100      0.0236
 1.4200      0.0250
 1.4300      0.0262
 1.4400      0.0270
 1.4500      0.0277
 1.4600      0.0281
 1.4700      0.0284
 1.4800      0.0285
 1.4900      0.0285
 1.5000      0.0284
 1.5100      0.0281
 1.5200      0.0278
 1.5300      0.0273
 1.5400      0.0269
 1.5500      0.0263
 1.5600      0.0258
 1.5700      0.0251
 1.5800      0.0245
 1.5900      0.0239
 1.6000      0.0232
 1.6100      0.0225
 1.6200      0.0219
 1.6300      0.0212
 1.6400      0.0205
 1.6500      0.0199
 1.6600      0.0192
 1.6700      0.0186
 1.6800      0.0180
 1.6900      0.0174
 1.7000      0.0168
 1.7100      0.0162
 1.7200      0.0157
 1.7300      0.0152
 1.7400      0.0147
 1.7500      0.0142
 1.7600      0.0137
 1.7700      0.0133
 1.7800      0.0128
 1.7900      0.0124
 1.8000      0.0120
 1.8100      0.0116
 1.8200      0.0113
 1.8300      0.0109
 1.8400      0.0106
 1.8500      0.0103
 1.8600      0.0099
 1.8700      0.0096
 1.8800      0.0094
 1.8900      0.0091
 1.9000      0.0088
 1.9100      0.0086
 1.9200      0.0083
 1.9300      0.0081
 1.9400      0.0079
 1.9500      0.0076
 1.9600      0.0074
 1.9700      0.0072
 1.9800      0.0070
 1.9900      0.0068
 2.0000      0.0066
 2.0100      0.0065
 2.0200      0.0063
 2.0300      0.0061
 2.0400      0.0060
 2.0500      0.0058
 2.0600      0.0057
 2.0700      0.0055
 2.0800      0.0054
 2.0900      0.0052
 2.1000      0.0051
 2.1100      0.0050
 2.1200      0.0048
 2.1300      0.0047
 2.1400      0.0046
 2.1500      0.0045
 2.1600      0.0043
 2.1700      0.0042
 2.1800      0.0041
 2.1900      0.0040
 2.2000      0.0039
 2.2100      0.0038
 2.2200      0.0037
 2.2300      0.0036
 2.2400      0.0035
 2.2500      0.0034
 2.2600      0.0033
 2.2700      0.0033
 2.2800      0.0032
 2.2900      0.0031
 2.3000      0.0030
 2.3100      0.0029
 2.3200      0.0029
 2.3300      0.0028
 2.3400      0.0027
 2.3500      0.0026
 2.3600      0.0026
 2.3700      0.0025
 2.3800      0.0024
 2.3900      0.0023
 2.4000      0.0023
 2.4100      0.0022
 2.4200      0.0021
 2.4300      0.0021
 2.4400      0.0020
 2.4500      0.0019
 2.4600      0.0019
 2.4700      0.0018
 2.4800      0.0017
 2.4900      0.0017
 2.5000      0.0016
 2.5100      0.0016
 2.5200      0.0015
 2.5300      0.0014
 2.5400      0.0014
 2.5500      0.0013
 2.5600      0.0013
 2.5700      0.0012
 2.5800      0.0011
 2.5900      0.0011
 2.6000      0.0010
 2.6100      0.0010
 2.6200      0.0009
 2.6300      0.0009
 2.6400      0.0008
 2.6500      0.0007
 2.6600      0.0007
 2.6700      0.0006
 2.6800      0.0006
 2.6900      0.0005
 2.7000      0.0005
 2.7100      0.0004
 2.7200      0.0004
 2.7300      0.0003
 2.7400      0.0003
 2.7500      0.0003
 2.7600      0.0002
 2.7700      0.0002
 2.7800      0.0001
 2.7900      0.0001
 2.8000      0.0001
 2.8100      0.0000
 2.8200     -0.0000
 2.8300     -0.0001
 2.8400     -0.0001
 2.8500     -0.0001
 2.8600     -0.0001
 2.8700     -0.0002
 2.8800     -0.0002
 2.8900     -0.0002
 2.9000     -0.0002
 2.9100     -0.0003
 2.9200     -0.0003
 2.9300     -0.0003
 2.9400     -0.0003
 2.9500     -0.0004
 2.9600     -0.0004
 2.9700     -0.0004
 2.9800     -0.0004
 2.9900     -0.0004
 3.0000     -0.0004
 3.0100     -0.0004
 3.0200     -0.0004
 3.0300     -0.0005
 3.0400     -0.0005
 3.0500     -0.0005
 3.0600     -0.0005
 3.0700     -0.0005
 3.0800     -0.0005
 3.0900     -0.0005
 3.1000     -0.0005
 3.1100     -0.0005
 3.1200     -0.0005
 3.1300     -0.0005
 3.1400     -0.0005
 3.1500     -0.0005
 3.1600     -0.0006
 3.1700     -0.0006
 3.1800     -0.0006
 3.1900     -0.0006
 3.2000     -0.0006
 3.2100     -0.0006
 3.2200     -0.0006
 3.2300     -0.0006
 3.2400     -0.0006
 3.2500     -0.0006
 3.2600     -0.0007
 3.2700     -0.0007
 3.2800     -0.0007
 3.2900     -0.0007
 3.3000     -0.0007
 3.3100     -0.0007
 3.3200     -0.0008
 3.3300     -0.0008
 3.3400     -0.0008
 3.3500     -0.0008
 3.3600     -0.0008
 3.3700     -0.0008
 3.3800     -0.0009
 3.3900     -0.0009
 3.4000     -0.0009
 3.4100     -0.0009
 3.4200     -0.0010
 3.4300     -0.0010
 3.4400     -0.0010
 3.4500     -0.0010
 3.4600     -0.0010
 3.4700     -0.0011
 3.4800     -0.0011
 3.4900     -0.0011
 3.5000     -0.0011
 3.5100     -0.0011
 3.5200     -0.0012
 3.5300     -0.0012
 3.5400     -0.0012
 3.5500     -0.0012
 3.5600     -0.0012
 3.5700     -0.0013
 3.5800     -0.0013
 3.5900     -0.0013
 3.6000     -0.0013
 3.6100     -0.0013
 3.6200     -0.0013
 3.6300     -0.0013
 3.6400     -0.0013
 3.6500     -0.0014
 3.6600     -0.0014
 3.6700     -0.0014
 3.6800     -0.0014
 3.6900     -0.0014
 3.7000     -0.0014
 3.7100     -0.0014
 3.7200     -0.0014
 3.7300     -0.0014
 3.7400     -0.0014
 3.7500     -0.0014
 3.7600     -0.0014
 3.7700     -0.0014
 3.7800     -0.0014
 3.7900     -0.0014
 3.8000     -0.0014
 3.8100     -0.0014
 3.8200     -0.0014
 3.8300     -0.0014
 3.8400     -0.0014
 3.8500     -0.0014
 3.8600     -0.0013
 3.8700     -0.0013
 3.8800     -0.0013
 3.8900     -0.0013
 3.9000     -0.0013
 3.9100     -0.0013
 3.9200     -0.0013
 3.9300     -0.0013
 3.9400     -0.0013
 3.9500     -0.0013
 3.9600     -0.0013
 3.9700     -0.0013
 3.9800     -0.0013
 3.9900     -0.0013
 4.0000     -0.0013
Otto
  • 9
  • 3
  • Could you post some data? You could try to change your initial guess for the parameters (plot your data first and play a bit manually). – Cleb Apr 07 '17 at 09:48
  • @Cleb I have included the data at the end of my post. Thanks – Otto Apr 07 '17 at 12:15
  • Ok, does it have to be `ROOT` or would also another fitting tool acceptable as scipy's `curve_fit`? – Cleb Apr 07 '17 at 13:07
  • I have have been trying unsuccessfully with scipy's curve-fit for the past three days. At this point, I would welcome a fit from any programming language. – Otto Apr 07 '17 at 14:51
  • @Cleb You can see my attempt with scipy on this page: http://stackoverflow.com/questions/43225835/three-term-gaussian-fit-to-gaussian-data-python – Otto Apr 07 '17 at 15:02
  • I played for a bit but did not succeed. I thought one could improve it by adding weights for the critical part of the curve using the `sigma` argument but it did not work. – Cleb Apr 07 '17 at 15:59
  • @Cleb Did you get the ROOT code to work? Or you used the scipy code? – Otto Apr 07 '17 at 17:30
  • I used the scipy code. I received very similar results as you (in the link you provided above). Are you sure that your data can be described by this model? Do you have any bounds for the parameters that could b incorporated? – Cleb Apr 07 '17 at 17:33
  • 1
    your model does not (and, really cannot) match your data. You might be able to use three Gaussians all centered at zero, but not with the constraints imposed that ps2 is both width of peak1 and amplitude of peak2, etc. – M Newville Apr 08 '17 at 04:03

1 Answers1

0

Here are the coefficients I get, along with a graph of the fit:

p[0] =  1.5810626020436172E+04
p[1] = -2.5558082863192549E-01
p[2] = -1.5386798252451177E+04
p[3] = -2.5799976733673363E-01

plot

James Phillips
  • 4,526
  • 3
  • 13
  • 11
  • I forgot to mention that parameters p[1] and p[3] have nearly the same value and can probably be a single parameter. p[0] and p[2] might be a single parameter with p[2] = -1 * p[0] – James Phillips Apr 08 '17 at 12:04
  • Thanks a lot. I couldn't get the pyROOT code to work. did you use it, or the scipy code? – Otto Apr 08 '17 at 12:30
  • I used a Python solver with a genetic algorithm front end to scipy's Levenberg-Marquardt solver. The genetic algorithm searched error space for initial parameter estimates for the scipy L-M solver. You might use the values I gave as initial parameter estimates, probably just one or two decimal points are all you need. – James Phillips Apr 08 '17 at 13:56