I would like to set one-sided limits on a parameter of interest called lambda. The twist is that unlike signal strength mu, lowerlambda means a stronger signal, highlambda means weaker signal. What I have so far is:
calc = AsymptoticCalculator(data, bkg_modelConfig, sPlusB_modelConfig); # switched order for limits
calc.SetOneSidedDiscovery(True)
I do SetOneSidedDiscovery() instead of SetOneSided() because I want the p-value calculated from the low tail, not the high tail. Is this the correct way to do it, or is there a more straight forward way?
I would have to check the code, but if I had to bet, I would bet that this doesn’t work. What makes me bet this way is that for “discovery”, you test against lambda = 0, for “limit” you test against specific values of lambda.
There is a simple thing that could make everything much easier: RooLinearVar
Transform the lambda, which the likelihood model sees, to absLambda = -lambda, and run the limits on the high tail as usual. Like this, I’m sure that the asymptotic formulae work, and central values and errors will be correct.
Thanks very much for the reply. I tried providing a RooLinearVar as the poi for the modelConfig, but the AsymptoticCalculator complains:
[#0] ERROR:InputArguments -- AsymptoticCalculator::Initialize - ModelConfig has not POI defined.
I’m setting the POI with h0_model.SetParametersOfInterest(RooArgSet(w.obj("lambdaInv"))) since w.var("lambdaInv") returns a null. Is there another way to set the POI?
That could mean that the export/import didn’t work or that the two weren’t connected to the model in the proper way. I would do it like this (please excuse that it’s only pseudo-code, I’m typing from memory):