From 363b01040f71f6cd901a3cd1e386f9c6b855ebbf Mon Sep 17 00:00:00 2001 From: davidwalter2 Date: Mon, 26 Jan 2026 13:47:59 -0500 Subject: [PATCH] Fix freezing parameter functionality for constrained nuisances --- bin/rabbit_limit.py | 4 ++-- rabbit/fitter.py | 30 ++++++++++++++++-------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/bin/rabbit_limit.py b/bin/rabbit_limit.py index 5ae71e0..3bb7843 100755 --- a/bin/rabbit_limit.py +++ b/bin/rabbit_limit.py @@ -138,8 +138,8 @@ def do_asymptotic_limits(args, fitter, ws, data_values, mapping=None, fit_data=F idx = np.where(fitter.parms.astype(str) == key)[0][0] if key in fitter.poi_model.pois.astype(str): is_poi = True - xbest = fitter_asimov.get_blinded_poi()[idx] - xobs = fitter.get_blinded_poi()[idx] + xbest = fitter_asimov.get_poi()[idx] + xobs = fitter.get_poi()[idx] elif key in fitter.parms.astype(str): is_poi = False xbest = fitter_asimov.get_blinded_theta()[ diff --git a/rabbit/fitter.py b/rabbit/fitter.py index faba62a..08f2194 100644 --- a/rabbit/fitter.py +++ b/rabbit/fitter.py @@ -403,19 +403,30 @@ def set_blinding_offsets(self, blind=True): np.zeros(self.indata.nsyst, dtype=np.float64) ) - def get_blinded_theta(self): + def get_theta(self): + theta = self.x[self.poi_model.npoi : self.poi_model.npoi + self.indata.nsyst] + theta = tf.where( + self.frozen_params_mask[ + self.poi_model.npoi : self.poi_model.npoi + self.indata.nsyst + ], + tf.stop_gradient(theta), + theta, + ) theta = self.x[self.poi_model.npoi :] if self.do_blinding: return theta + self._blinding_offsets_theta else: return theta - def get_blinded_poi(self): + def get_poi(self): xpoi = self.x[: self.poi_model.npoi] if self.poi_model.allowNegativePOI: poi = xpoi else: poi = tf.square(xpoi) + poi = tf.where( + self.frozen_params_mask[: self.poi_model.npoi], tf.stop_gradient(poi), poi + ) if self.do_blinding: return poi * self._blinding_offsets_poi else: @@ -1298,17 +1309,8 @@ def _expected_variations( def _compute_yields_noBBB(self, full=True): # full: compute yields inclduing masked channels - poi = self.get_blinded_poi() - theta = self.get_blinded_theta() - - poi = tf.where( - self.frozen_params_mask[: self.poi_model.npoi], tf.stop_gradient(poi), poi - ) - theta = tf.where( - self.frozen_params_mask[self.poi_model.npoi :], - tf.stop_gradient(theta), - theta, - ) + poi = self.get_poi() + theta = self.get_theta() rnorm = self.poi_model.compute(poi) @@ -1877,7 +1879,7 @@ def reduced_nll(self): def _compute_lc(self, full_nll=False): # constraints - theta = self.get_blinded_theta() + theta = self.get_theta() lc = self.indata.constraintweights * 0.5 * tf.square(theta - self.theta0) if full_nll: # normalization factor for normal distribution: log(1/sqrt(2*pi)) = -0.9189385332046727