class TEST_CONFIGS(object): """Default configurations for stages in a minimal test pipeline.""" pipe_cfg = OrderedDict( pipeline={ "name": "muons", "output_binning": TEST_BINNING, "output_key": ("weights"), "detector_name": None, } ) event_generator_cfg = { "calc_mode": "events", "apply_mode": "events", "output_names": ["muon"], "params": ParamSet( [ Param(name="n_events", value=1e3, **PARAM_DEFAULTS), Param(name="seed", value=0, **PARAM_DEFAULTS), Param(name="random", value=False, **PARAM_DEFAULTS), ] ), } aeff_cfg = { "calc_mode": "events", "apply_mode": "events", "params": ParamSet( [ Param(name="livetime", value=12345 * ureg["seconds"], **PARAM_DEFAULTS), Param(name="weight_scale", value=1.0, **PARAM_DEFAULTS), ] ), } set_variance_cfg = { "calc_mode": TEST_BINNING, "apply_mode": TEST_BINNING, "divide_total_mc": True, # expected number of unweighted MC events including events that fall outside of # the analysis binning "expected_total_mc": 1000, "variance_scale": 0.1, } fix_error_cfg = { "calc_mode": TEST_BINNING, "apply_mode": TEST_BINNING, } kde_cfg = { "calc_mode": "events", "apply_mode": TEST_BINNING, "bootstrap": False, "bootstrap_seed": 0, "bootstrap_niter": 6, "linearize_log_dims": True, "stash_hists": False, "coszen_name": "true_coszen", "stack_pid": False, "oversample": 1, }
def create_mc_template(toymc_params, config_file=None, seed=None): ''' Create MC template out of a pisa pipeline ''' if seed is not None: np.random.seed(seed) Config = parse_pipeline_config(config_file) new_n_events_data = Param(name='n_events_data', value=toymc_params.n_data, prior=None, range=None, is_fixed=True) new_sig_frac = Param(name='signal_fraction', value=toymc_params.signal_fraction, prior=None, range=None, is_fixed=True) new_stats_factor = Param(name='stats_factor', value=toymc_params.stats_factor, prior=None, range=None, is_fixed=True) # These should match the values of the config file, but we override them just in case we need to change these later new_mu = Param(name='mu', value=toymc_params.mu, prior=None, range=[0, 100], is_fixed=False) new_sigma = Param(name='sigma', value=toymc_params.sigma, prior=None, range=None, is_fixed=True) Config[('data', 'pi_simple_signal')]['params'].update(p=ParamSet([ new_n_events_data, new_sig_frac, new_stats_factor, new_mu, new_sigma ])) MCtemplate = DistributionMaker(Config) return MCtemplate
mean_perpe = [] mean_perbin = [] for idx, lt in enumerate(livetimes): print '===========' print 'livetime = {0}'.format(lt) print '===========' mean_perpe.append([]) lt_param.value = lt pipeline.update_params(lt_param) gen_pipe.update_params(lt_param) u_pipe = Param(name='unfold_pipeline_cfg', value=gen_pipe, is_fixed=True, prior=None, range=None) unfold_pipeline_cfg = u_pipe pipeline.update_params(unfold_pipeline_cfg) # Get nominal re_param.value = 0 * ureg.dimensionless pipeline.update_params(re_param) nom_out = pipeline.get_outputs().pop() re_param.value = 2 * ureg.dimensionless sf_param.value = 1234 * ureg.dimensionless pipeline.update_params(re_param) pipeline.update_params(sf_param)
def parse_param(config, section, selector, fullname, pname, value): """Parse a param specification from a PISA config file. Note that if the param sepcification does not include ``fixed``, ``prior``, and/or ``range``, the defaults for these are: ``fixed = True``, ``prior = None``, and ``range = None``. If a prior is specified explicitly via ``.prior``, this takes precendence, but if no ``.prior`` is specified and the param's value is parsed to be a :class:`uncertainties.AffineScalarFunc` (i.e. have `std_dev` attribute), a Gaussian prior is constructed from that and then the AffineScalarFunc is stripped out of the param's value (such that it is just a :class:`~pint.quantity.Quantity`). Parameters ---------- config : pisa.utils.config_parser.PISAConfigParser section : string selector : string or None fullname : string pname : string value : string Returns ------- param : pisa.core.param.Param """ # Note: imports placed here to avoid circular imports from pisa.core.param import Param from pisa.core.prior import Prior kwargs = dict(name=pname, is_fixed=True, prior=None, range=None) try: value = parse_quantity(value) kwargs['value'] = value.nominal_value * value.units except ValueError: value = parse_string_literal(value) kwargs['value'] = value # Search for explicit attr specifications if config.has_option(section, fullname + '.fixed'): kwargs['is_fixed'] = config.getboolean(section, fullname + '.fixed') if config.has_option(section, fullname + '.unique_id'): kwargs['unique_id'] = config.get(section, fullname + '.unique_id') if config.has_option(section, fullname + '.range'): range_ = config.get(section, fullname + '.range') # Note: `nominal` and `sigma` are called out in the `range_` string if 'nominal' in range_: nominal = value.n * value.units # pylint: disable=unused-variable if 'sigma' in range_: sigma = value.s * value.units # pylint: disable=unused-variable range_ = range_.replace('[', 'np.array([') range_ = range_.replace(']', '])') # Strip out uncertainties from value itself (as we will rely on the # prior from here on out) kwargs['range'] = eval(range_).to(value.units) # pylint: disable=eval-used if config.has_option(section, fullname + '.prior'): prior = str(config.get(section, fullname + '.prior')).strip().lower() if prior == 'uniform': kwargs['prior'] = Prior(kind='uniform') elif prior == 'jeffreys': kwargs['prior'] = Prior(kind='jeffreys', A=kwargs['range'][0], B=kwargs['range'][1]) elif prior == 'spline': priorname = pname if selector is not None: priorname += '_' + selector data = config.get(section, fullname + '.prior.data') data = from_file(data) data = data[priorname] knots = ureg.Quantity(np.asarray(data['knots']), data['units']) knots = knots.to(value.units) coeffs = np.asarray(data['coeffs']) deg = data['deg'] kwargs['prior'] = Prior(kind='spline', knots=knots, coeffs=coeffs, deg=deg) elif prior == 'none': kwargs['prior'] = None elif 'gauss' in prior: raise Exception('Please use new style +/- notation for gaussian' ' priors in config') else: raise Exception('Prior type unknown') elif hasattr(value, 'std_dev') and value.std_dev != 0: kwargs['prior'] = Prior(kind='gaussian', mean=value.nominal_value * value.units, stddev=value.std_dev * value.units) # Strip out any uncertainties from value itself (an explicit ``.prior`` # specification takes precedence over this) if hasattr(value, 'std_dev'): value = value.nominal_value * value.units try: param = Param(**kwargs) except: logging.error('Failed to instantiate new Param object with kwargs %s', kwargs) raise return param
def create_mc_template(toymc_params, config_file=None, seed=None, keep_same_weight=True): ''' Create MC template out of a pisa pipeline ''' if seed is not None: np.random.seed(seed) Config = parse_pipeline_config(config_file) # Change binning Config[('data', 'pi_simple_signal')]['output_specs'] = toymc_params.binning Config[( 'likelihood', 'pi_generalized_llh_params')]['output_specs'] = toymc_params.binning # If keep_same_weight is True, turn off the mean adjust and pseudo weight of pi_generalized_llh if keep_same_weight: Config[('likelihood', 'pi_generalized_llh_params')]['with_mean_adjust'] = False Config[('likelihood', 'pi_generalized_llh_params')]['with_pseudo_weight'] = False else: Config[('likelihood', 'pi_generalized_llh_params')]['with_mean_adjust'] = True Config[('likelihood', 'pi_generalized_llh_params')]['with_pseudo_weight'] = True new_n_events_data = Param(name='n_events_data', value=toymc_params.n_data, prior=None, range=None, is_fixed=True) new_sig_frac = Param(name='signal_fraction', value=toymc_params.signal_fraction, prior=None, range=None, is_fixed=True) new_stats_factor = Param(name='stats_factor', value=toymc_params.stats_factor, prior=None, range=None, is_fixed=True) # These should match the values of the config file, but we override them just in case we need to change these later new_mu = Param(name='mu', value=toymc_params.mu, prior=None, range=[0, 100], is_fixed=False) new_sigma = Param(name='sigma', value=toymc_params.sigma, prior=None, range=None, is_fixed=True) Config[('data', 'pi_simple_signal')]['params'].update(p=ParamSet([ new_n_events_data, new_sig_frac, new_stats_factor, new_mu, new_sigma ])) MCtemplate = DistributionMaker(Config) return MCtemplate