Conditions on parameters in TF1 fit

So I would like to fit a normalized histogram corresponding to a superposition of two probability distributions, let’s call them f_1 and f_2. As a TF1 object, let’s write this as

TF1 probFit("probFit", "[0] * f_1([1] + [2] * x) + [3] * f_2([3] + [4] * x)")

When using TH1::Fit, is there a way to impose the conditions

[0] >= 0,
[3] >= 0,
[0] + [3] = 1

If there is, should this conditions be imposed when declaring probFit, or when using TH1::Fit?

Also, is there a notation short cut to write [1] + [2] * x and [3] + [4] * x in terms of pol 1? Perhaps something like pol(1) 1 and pol(3) 1, respectively?


First of all when doing a standard TH1::Fit it is assumed the normalization is not fixed but also floating. The distribution in each bin is assumed to be Poisson when doing a likelihood fit (“option L”)

For doing a multinomial fit (i.e. fixed normalization) you can use the fit option MULTI.

For applying the conditions you the redefine the parameter [3] as 1. - [0] and then you set for the parameter [0] a constraints to be 0 <= [0] <= 1, by doing
probFit->SetParLimits(0,0., 1.)

You should also make sure if doing a multinomial fit that the f_1 and f_2 functions are normalized (i.e. their integral is equal =1 for every values of their parameters)

You can apply the short notation and for example re-write your function as

TF1 probFit("probFit", "[0] * f_1(pol1(1)) + [3] * f_2(pol1(4))")

where f_1 and f_2 are functions defined before


Thank you for clarifying. I hadn’t thought of using SetParLimits() in the way that you described.

So then if I wanted to do an unbinned multinomial fit, I would set as options "WL MULTI"? If not, under what argument do I set "MULTI"?

I hadn’t considered pol1(1) and pol1(4) in the short notation because in my experience without setting variable indices I found pol 1 works but not pol1? Is that a bug?

So as a test to recreate the problem between using pol1 vs. pol 1, I tried both

TF1 logistic("logistic", "1 / (1 + exp(pol1))");
TF1 logistic1("logistic1", "1 / (1 + exp(pol 1))");

Both seemed to work this time when in printed them. So maybe the problem I was having with having to use pol N instead of polN has been resolved?

the option “MULTI” will do a multinomial binned likelihood fit. From an histogram you cannot do un unbinned likelihood fit. You would need to do from a TTree or directly using the data using the Fitter class.

Using pol1 or pol 1 should be equivalent because whitespaces are removed when parsing the formula expressions. However I would use pol1 for better clarity


If possible, could I please get some further clarification on usage of the “MULTI”. Do you mean it would be entered as the option or goption argument in TTree::Fit()?

It looks like when I said “unbinned fit”, I meant to say “fit with non-integer bins”. Sorry about that. Because I have been able to use TH1D::Fit() with option = "WL".

So with TH1D::Fit(), could I have option = "WL MULTI"? Looking under the class documentation for TTree and TH1, I’m having difficulty finding a description of the MULTI option and how it is used.


The option MULTI works only for histograms (binned data). It should work also in case of weighted data (adding “WL” option).
It is true, I realised now it is not in the documentation of TH1::Fit. .I will add then add it


1 Like