Hi, thank you very much for the clarification!
In that case, why not restrict the range of the nuisance parameter to be between zero and one? Then you don’t need the double Fermi distribution, which I find not super elegant because it requires an arbitrary decay parameter. You can then use just a uniform constraint, which is also supported by HistFactory.
So if you have a HistFactory workspace with a HistoSys called “SignalShape”, you could do something like this (the workspace is called ws
):
// The name of the constrained parameter
const std::string paramName = "alpha_SignalShape";
// As we want to restrict the variations between the nominal and the "up"
// variation, we restrict the parameter to that range
ws->var(paramName)->setRange(0.0, 1.0);
And before creating your workspace, when you have your RooStats::HistFactory::Measurement
object, you set the constraint for the systematic to uniform like this:
meas.AddUniformSyst("SignalShape");
Here is a full ROOT macro that demonstrates this procedure.
custom_constraint_example.C (2.6 KB)
If you print out the workspace, the constraint will appear like this:
RooGaussian::alpha_SignalShapeConstraint[ x=alpha_SignalShape mean=nom_alpha_SignalShape sigma=100 ] = 1
Don’t be surprised it’s still a Gaussian. RooFit encodes uniform constraints with Gaussians that have an “infinite” standard deviation.
I hope this helps you to set up your fit, don’t hesitate to follow up with more questions! In particular, if the uniform constraint is not good for you, I can also explain you how to use arbitrary constraints, although that is hacky and I rather not share the code to do that if not absolutely necessary 
Cheers,
Jonas