pisa
pisa copied to clipboard
surprising behavior from Analysis.fit_hypo
After setting a distribution maker's parameters to new Param
objects, fit_hypo
may discard these parameters before fitting. One example of how this could occur is this:
- Conduct a fit
- Set the distribution maker's parameters to
copy.deepcopy(best_fit_params)
- Evaluate the distribution at the best fit parameters
- Fix some parameters to new values
- Run another fit
Under some conditions, the fit in step 5. will discard the parameters from step 4. This occurs because of the call to hypo_maker.select_params(full_param_selections)
. I found this behavior very surprising. Whether the fit actually uses parameters fixed before the call to fit_hypo
depends on whether the user modifies parameters in place (which might work) or sets the parameters to new Param
objects (which probably won't work),
Related to #644
I am finding the same problem, and with the current Pisa functions for ParamSet, there doesn't seem to be a way to make the current analysis.py code use best fit parameter starting values and set them free at the same time. All one can do if you want to keep the best fit values is fix the parameters in place as described above. A quick and simple way to fix this without messing with select_params()
or ParamSet
would be with a simple flag in fit_hypo
that incorporates an if statement into the line hypo_maker.select_params(full_param_selections)
.
Something like:
def fit_hypo(self, data_dist, hypo_maker, metric, minimizer_settings, using_previous_params=False, ...):
if using_previous_params==False:
hypo_maker.select_params(full_param_selections)
If this is okay, I would be happy to make a PR for it.
I come across the same issue while running systematic impact tests with the high stats standard numu disappearance neutrino pipeline. Without setting recursive_minimization=True
, fit_hypo
is being called for every fit and for the null fits, where the physics parameters were fixed just before calling the fit, they are freed again by re-selecting the parameters, which is quite contrary to what is wanted. If instead i specify that i want the recursive minimization it directly calls fit_recursively
, here, and everything is fine. Is it really necessary to re-select the parameters in fit_hypo
? Not sure how other analyses are set up, but i feel for most of them the selection was already made beforehand and the hypo_maker
that is passed to the fit function is using the correct selection.
P.s.: Just for my understanding, when hypo_maker.select_params
is called, where does it access the original selection parameters? Should they not have been changed with the changes of hypo_maker.params? Sorry, if i'm being dense, but i'm just diving back into the intricacies of Pisa :sweat_smile: