Exemplo n.º 1
0
 def randomize_free_params(self, random_state=None):
     if random_state is None:
         random = np.random
     else:
         random = get_random_state(random_state)
     n = len(self.params.free)
     rand = random.rand(n)
     self._set_rescaled_free_params(rand)
Exemplo n.º 2
0
    def unfold_mc(self):
        logging.debug('Unfolding monte carlo sample')
        regularisation = int(self.params['regularisation'].m)
        unfold_bg = self.params['unfold_bg'].value
        unfold_eff = self.params['unfold_eff'].value
        unfold_unweighted = self.params['unfold_unweighted'].value

        # Split data into signal, bg and all (signal+bg)
        signal_data, bg_data, all_data = self.split_data()

        # Load generator level data for signal
        gen_data = self.load_gen_data()

        # Return true map is regularisation is set to 0
        if regularisation == 0:
            logging.info('Returning baseline MapSet')
            true = roounfold._histogram(events=gen_data,
                                        binning=self.true_binning,
                                        weights=gen_data['pisa_weight'],
                                        errors=True,
                                        name=self.output_str)
            return MapSet([true])

        # Get the inversed efficiency histogram
        if not unfold_eff:
            inv_eff = self.get_inv_eff(signal_data, gen_data)

        # Set the reco and true data based on cfg file settings
        reco_norm_data = None
        true_norm_data = None
        data = signal_data
        if unfold_bg:
            reco_norm_data = all_data
        if unfold_eff:
            true_norm_data = gen_data
        if reco_norm_data is None:
            reco_norm_data = signal_data
        if true_norm_data is None:
            true_norm_data = signal_data
        if unfold_unweighted:
            ones = np.ones(reco_norm_data['pisa_weight'].shape)
            reco_norm_data['pisa_weight'] = ones
            true_norm_data['pisa_weight'] = ones
            data['pisa_weight'] = ones

        # Create response object
        response = self.create_response(reco_norm_data, true_norm_data, data)

        # Make pseduodata
        all_hist = self._histogram(events=all_data,
                                   binning=self.reco_binning,
                                   weights=all_data['pisa_weight'],
                                   errors=False,
                                   name='all',
                                   tex=r'\rm{all}')
        seed = int(self.params['stat_fluctuations'].m)
        if seed != 0:
            if self.random_state is None or seed != self.seed:
                self.seed = seed
                self.random_state = get_random_state(seed)
            all_hist = all_hist.fluctuate('poisson', self.random_state)
        else:
            self.seed = None
            self.random_state = None
        all_hist.set_poisson_errors()

        # Background Subtraction
        if unfold_bg:
            reco = all_hist
        else:
            bg_hist = self.get_bg_hist(bg_data)
            reco = all_hist - bg_hist
        reco.name = 'reco_signal'
        reco.tex = r'\rm{reco_signal}'

        r_flat = roounfold._flatten_to_1d(reco)
        r_th1d = convert_to_th1d(r_flat, errors=True)

        # Find optimum value for regularisation parameter
        if self.params['optimize_reg'].value:
            chisq = None
            for r_idx in range(regularisation):
                unfold = RooUnfoldBayes(response, r_th1d, r_idx + 1)
                unfold.SetVerbose(0)
                idx_chisq = unfold.Chi2(self.t_th1d, 1)
                if chisq is None:
                    pass
                elif idx_chisq > chisq:
                    regularisation = r_idx
                    break
                chisq = idx_chisq

        # Unfold
        unfold = RooUnfoldBayes(response, r_th1d, regularisation)
        unfold.SetVerbose(0)

        unfolded_flat = unfold.Hreco(1)
        unfold_map = unflatten_thist(in_th1d=unfolded_flat,
                                     binning=self.true_binning,
                                     name=self.output_str,
                                     errors=True)

        # Efficiency correction
        if not unfold_eff:
            unfold_map *= inv_eff

        del r_th1d
        del unfold
        logging.info('Unfolded reco sum {0}'.format(
            np.sum(unp.nominal_values(unfold_map.hist))))
        return unfold_map