dd = ROOT.RooRealVar("d/2","d/2",10,0,60000)
ff = ROOT.RooFormulaVar("ff","ROOT.TMath.Erfc((x-x)/(ROOT.TMath.Sqrt(2)*x))",ROOT.RooArgList(x,mean,sigma))
step = ROOT.RooGenericPdf("step function","dd*ff",ROOT.RooArgSet(dd,ff))
I write code like above. But it does not work.
So how can I write the right code to use Roofit to fit with my own pdf?
there are some problems with your snippet:
You give yhour variable the name
d/2. For the title this is okay, but for the title you get into trouble if you use special characters like this. Just name is
dOver2 or maybe even
dd, so it matches with the C++ variable name.
In the formula, you should use C++ code and not Python code, so
ROOT.TMath.Erfc should be
ROOT.TMath.Sqrt should be
RooGenericPdf, you use
dd in the formula, but you have no variable with the name
d/2. Remember that the formula expression matches by the TObject name, and not by the C++ variable name. So you have to use the name you gave to
dd, which is
d/2 right now. But as I said before, you’ll run into problems with the division sign in the name. so the best solution I think is to change the name from
dd = ROOT.RooRealVar("dd", "d/2", 10, 0, 60000)
ff = ROOT.RooFormulaVar(
ROOT.RooArgList(x, mean, sigma),
step = ROOT.RooGenericPdf("step function", "dd*ff", ROOT.RooArgSet(dd, ff))
I hope it works for you with these changes!
Thanks a lot for your patient reply!
After following your advice, there’s still a problem on GenericPdf. Maybe it’s not an allowed pdf. After extract the “dd” outside the pdf, it seems work!
dd = ROOT.RooRealVar("dd","dd",10.,0.,10000000.)
ff1 = ROOT.RooFormulaVar("ff1","(x-mean)",ROOT.RooArgList(x,mean))
ff2 = ROOT.RooFormulaVar("ff2","TMath::Sqrt(2)*sigma",ROOT.RooArgList(sigma))
ff = ROOT.RooGenericPdf("ff","0.5*TMath::Erfc(ff1/ff2)",ROOT.RooArgList(ff1,ff2))
Above is the code can work well.
Thanks again for your formula explanation, which shocked me for only C++ format supported.
This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.