In pyROOT how do you add two TF1s together?
I have a user defined function:
def TopHatFn(x, par):
if x[0] < par[0] or x[0] > par[1]:
return 0
elif x[0] >= par[0] and x[0] <= par[1]:
return 1
I make two TF1s, both in the same way, but with different names:
tophata = TF1('tophata',TopHatFn, xmin, xmax, 2);
tophata.SetParameter(0, 3);
tophata.SetParameter(1, 7);
Then I add them:
tophat = TF1('tophat','tophata + tophatb', xmin, xmax)
gives the error message
Error in <TFormula::Compile>: Bad numerical expression : "tophata"
Error in <TF1::TF1>: function: tophat/tophata + tophatb has 0 parameters instead of 1
What’s the correct way to do this?
Danilo
June 15, 2016, 4:46am
2
Hi,
adding the TF1s by name when they are defined with a functor is not possible.
The correct way would be to act at python function level directly and then define a TF1 based on the “sum function”.
Cheers,
D
Hi,
Ok. I originally made the following function to make N top hats:
def AcceptanceIntervals(x, par):
for tpl, tph in zip( par[::2], par[1::2] ):
if x[0] <= tph and x[0] >= tpl:
return 1
else:
return 0
But this function didn’t work. Running it gave the error:
File "makeTopHats.py", line 23, in AcceptanceIntervals
for tpl, tph in zip( par[::2], par[1::2] ):
SystemError: error return without exception set
So the zip and :: operations dont seem to work in these functions. I tried the following code and it worked
def AcceptanceIntervals(x, par):
for i in range(0, len(par), 2):
if x[0] > par[i] and x[0] < par[i+1]:
return 1
elif x[0] == par[i] or x[0] == par[i+1]:
return 1/2
else:
return 0
The problem is now solved.