diff --git a/quickstats/components/asymptotic_cls.py b/quickstats/components/asymptotic_cls.py index d3ae8ddaa93328e7d55a72da2ad5c35a2d706a54..b508b18a64c4f95a7a42c70d814245e04baa117d 100644 --- a/quickstats/components/asymptotic_cls.py +++ b/quickstats/components/asymptotic_cls.py @@ -566,4 +566,43 @@ class AsymptoticCLs(AnalysisObject): self.print_summary() self.stdout.info(f'INFO: Finished with {self.minimizer_calls} calls to minimize(nll)') - return limits \ No newline at end of file + return limits + + def evaluate_cls(self, poi:float): + # TODO: maybe load nominal snapshot first + self.reset() + self.save_snapshot(self.nom_glob_name, variables="globs") + self.save_snapshot(self.nom_nuis_name, variables="nuis") + + asimov_data_0 = self.model.generate_asimov(self.poi.GetName(), poi_val=0, + poi_profile=0, + do_fit=not self.do_blind, + modify_globs=not self.do_blind, + dataset=self.data, + restore_states=1) + asimov_0_nll = self.create_nll(asimov_data_0) + self.set_poi_value(0) + self.save_nll_snapshot(asimov_0_nll, 0) + self.load_conditional_snapshot(0, target="globs") + self.load_conditional_snapshot(0, target="nuis") + nll_value = asimov_0_nll.getVal() + self.fill_mappings(asimov_0_nll, asimov_data_0, 0, nll_value) + + nll_name = asimov_0_nll.GetName() + self.stdout.info("----------------------------------") + self.stdout.info(f"Getting CLs for nll: {nll_name}") + + qmu = self.get_qmu(asimov_0_nll, poi) + sigma= self.LimitTool.getSigma(poi, 0, qmu) + pmu = self.LimitTool.calcPmu(qmu, sigma, poi) + pb = self.LimitTool.calcPb(qmu, sigma, poi) + CLs = self.LimitTool.calcCLs(qmu, sigma, poi) + qmu95 = self.LimitTool.getQmu95(sigma, poi) + self.stdout.info(f"POI: {poi}") + self.stdout.info(f"Sigma: {sigma}") + self.stdout.info(f"NLL(muhat): {nll_value}") + self.stdout.info(f"qmu95: {qmu95}") + self.stdout.info(f"qmu: {qmu}") + self.stdout.info(f"pmu: {pmu}") + self.stdout.info(f"1-pb: {pb}") + self.stdout.info(f"CLs: {CLs}")