def create_waveform_generator(variable_params,
                              data,
                              recalibration=None,
                              gates=None,
                              **static_params):
    """Creates a waveform generator for use with a model.

    Parameters
    ----------
    variable_params : list of str
        The names of the parameters varied.
    data : dict
        Dictionary mapping detector names to either a
        :py:class:`<pycbc.types.TimeSeries TimeSeries>` or
        :py:class:`<pycbc.types.FrequencySeries FrequencySeries>`.
    recalibration : dict, optional
        Dictionary mapping detector names to
        :py:class:`<pycbc.calibration.Recalibrate>` instances for
        recalibrating data.
    gates : dict of tuples, optional
        Dictionary of detectors -> tuples of specifying gate times. The
        sort of thing returned by :py:func:`pycbc.gate.gates_from_cli`.

    Returns
    -------
    pycbc.waveform.FDomainDetFrameGenerator
        A waveform generator for frequency domain generation.
    """
    # figure out what generator to use based on the approximant
    try:
        approximant = static_params['approximant']
    except KeyError:
        raise ValueError("no approximant provided in the static args")
    generator_function = generator.select_waveform_generator(approximant)
    # get data parameters; we'll just use one of the data to get the
    # values, then check that all the others are the same
    delta_f = None
    for d in data.values():
        if delta_f is None:
            delta_f = d.delta_f
            delta_t = d.delta_t
            start_time = d.start_time
        else:
            if not all([
                    d.delta_f == delta_f, d.delta_t == delta_t, d.start_time
                    == start_time
            ]):
                raise ValueError("data must all have the same delta_t, "
                                 "delta_f, and start_time")
    waveform_generator = generator.FDomainDetFrameGenerator(
        generator_function,
        epoch=start_time,
        variable_args=variable_params,
        detectors=list(data.keys()),
        delta_f=delta_f,
        delta_t=delta_t,
        recalib=recalibration,
        gates=gates,
        **static_params)
    return waveform_generator
Beispiel #2
0
    def from_config(cls, cp, data=None, delta_f=None, delta_t=None,
                    gates=None, recalibration=None,
                    **kwargs):
        """Initializes an instance of this class from the given config file.

        Parameters
        ----------
        cp : WorkflowConfigParser
            Config file parser to read.
        data : dict
            A dictionary of data, in which the keys are the detector names and
            the values are the data. This is not retrieved from the config
            file, and so must be provided.
        delta_f : float
            The frequency spacing of the data; needed for waveform generation.
        delta_t : float
            The time spacing of the data; needed for time-domain waveform
            generators.
        recalibration : dict of pycbc.calibration.Recalibrate, optional
            Dictionary of detectors -> recalibration class instances for
            recalibrating data.
        gates : dict of tuples, optional
            Dictionary of detectors -> tuples of specifying gate times. The
            sort of thing returned by `pycbc.gate.gates_from_cli`.
        \**kwargs :
            All additional keyword arguments are passed to the class. Any
            provided keyword will over ride what is in the config file.
        """
        if data is None:
            raise ValueError("must provide data")
        args = cls._init_args_from_config(cp)
        args['data'] = data
        args.update(kwargs)

        variable_params = args['variable_params']
        try:
            static_params = args['static_params']
        except KeyError:
            static_params = {}

        # set up waveform generator
        try:
            approximant = static_params['approximant']
        except KeyError:
            raise ValueError("no approximant provided in the static args")
        generator_function = generator.select_waveform_generator(approximant)
        waveform_generator = generator.FDomainDetFrameGenerator(
            generator_function, epoch=data.values()[0].start_time,
            variable_args=variable_params, detectors=data.keys(),
            delta_f=delta_f, delta_t=delta_t,
            recalib=recalibration, gates=gates,
            **static_params)
        args['waveform_generator'] = waveform_generator

        return cls(**args)
Beispiel #3
0
def create_waveform_generator(variable_params, data,
                              recalibration=None, gates=None,
                              **static_params):
    """Creates a waveform generator for use with a model.

    Parameters
    ----------
    variable_params : list of str
        The names of the parameters varied.
    data : dict
        Dictionary mapping detector names to either a
        :py:class:`<pycbc.types.TimeSeries TimeSeries>` or
        :py:class:`<pycbc.types.FrequencySeries FrequencySeries>`.
    recalibration : dict, optional
        Dictionary mapping detector names to
        :py:class:`<pycbc.calibration.Recalibrate>` instances for
        recalibrating data.
    gates : dict of tuples, optional
        Dictionary of detectors -> tuples of specifying gate times. The
        sort of thing returned by :py:func:`pycbc.gate.gates_from_cli`.

    Returns
    -------
    pycbc.waveform.FDomainDetFrameGenerator
        A waveform generator for frequency domain generation.
    """
    # figure out what generator to use based on the approximant
    try:
        approximant = static_params['approximant']
    except KeyError:
        raise ValueError("no approximant provided in the static args")
    generator_function = generator.select_waveform_generator(approximant)
    # get data parameters; we'll just use one of the data to get the
    # values, then check that all the others are the same
    delta_f = None
    for d in data.values():
        if delta_f is None:
            delta_f = d.delta_f
            delta_t = d.delta_t
            start_time = d.start_time
        else:
            if not all([d.delta_f == delta_f, d.delta_t == delta_t,
                        d.start_time == start_time]):
                raise ValueError("data must all have the same delta_t, "
                                 "delta_f, and start_time")
    waveform_generator = generator.FDomainDetFrameGenerator(
        generator_function, epoch=start_time,
        variable_args=variable_params, detectors=list(data.keys()),
        delta_f=delta_f, delta_t=delta_t,
        recalib=recalibration, gates=gates,
        **static_params)
    return waveform_generator
    def from_config(cls,
                    cp,
                    data=None,
                    delta_f=None,
                    delta_t=None,
                    gates=None,
                    recalibration=None,
                    **kwargs):
        """Initializes an instance of this class from the given config file.

        Parameters
        ----------
        cp : WorkflowConfigParser
            Config file parser to read.
        data : dict
            A dictionary of data, in which the keys are the detector names and
            the values are the data. This is not retrieved from the config
            file, and so must be provided.
        delta_f : float
            The frequency spacing of the data; needed for waveform generation.
        delta_t : float
            The time spacing of the data; needed for time-domain waveform
            generators.
        recalibration : dict of pycbc.calibration.Recalibrate, optional
            Dictionary of detectors -> recalibration class instances for
            recalibrating data.
        gates : dict of tuples, optional
            Dictionary of detectors -> tuples of specifying gate times. The
            sort of thing returned by `pycbc.gate.gates_from_cli`.
        \**kwargs :
            All additional keyword arguments are passed to the class. Any
            provided keyword will over ride what is in the config file.
        """
        prior_section = "marginalized_prior"
        args = cls._init_args_from_config(cp)
        marg_prior = read_distributions_from_config(cp, prior_section)
        if len(marg_prior) == 0:
            raise AttributeError("No priors are specified for the "
                                 "marginalization. Please specify this in a "
                                 "section in the config file with heading "
                                 "{}-variable".format(prior_section))
        params = [i.params[0] for i in marg_prior]
        marg_args = [k for k, v in args.items() if "_marginalization" in k]
        if len(marg_args) != len(params):
            raise ValueError("There is not a prior for each keyword argument")
        kwargs['marg_prior'] = marg_prior
        for i in params:
            kwargs[i + "_marginalization"] = True
        args.update(kwargs)
        variable_params = args['variable_params']
        args["data"] = data
        try:
            static_params = args['static_params']
        except KeyError:
            static_params = {}
        # set up waveform generator
        try:
            approximant = static_params['approximant']
        except KeyError:
            raise ValueError("no approximant provided in the static args")
        generator_function = generator.select_waveform_generator(approximant)
        waveform_generator = generator.FDomainDetFrameGenerator(
            generator_function,
            epoch=data.values()[0].start_time,
            variable_args=variable_params,
            detectors=data.keys(),
            delta_f=delta_f,
            delta_t=delta_t,
            recalib=recalibration,
            gates=gates,
            **static_params)
        args['waveform_generator'] = waveform_generator
        args["f_lower"] = static_params["f_lower"]
        return cls(**args)
    def from_config(cls, cp, data=None, delta_f=None, delta_t=None,
                    gates=None, recalibration=None, **kwargs):
        """Initializes an instance of this class from the given config file.

        Parameters
        ----------
        cp : WorkflowConfigParser
            Config file parser to read.
        data : dict
            A dictionary of data, in which the keys are the detector names and
            the values are the data. This is not retrieved from the config
            file, and so must be provided.
        delta_f : float
            The frequency spacing of the data; needed for waveform generation.
        delta_t : float
            The time spacing of the data; needed for time-domain waveform
            generators.
        recalibration : dict of pycbc.calibration.Recalibrate, optional
            Dictionary of detectors -> recalibration class instances for
            recalibrating data.
        gates : dict of tuples, optional
            Dictionary of detectors -> tuples of specifying gate times. The
            sort of thing returned by `pycbc.gate.gates_from_cli`.
        \**kwargs :
            All additional keyword arguments are passed to the class. Any
            provided keyword will over ride what is in the config file.
        """
        prior_section = "marginalized_prior"
        args = cls._init_args_from_config(cp)
        marg_prior = read_distributions_from_config(cp, prior_section)
        if len(marg_prior) == 0:
            raise AttributeError("No priors are specified for the "
                                 "marginalization. Please specify this in a "
                                 "section in the config file with heading "
                                 "{}-variable".format(prior_section))
        params = [i.params[0] for i in marg_prior]
        marg_args = [k for k, v in args.items() if "_marginalization" in k]
        if len(marg_args) != len(params):
            raise ValueError("There is not a prior for each keyword argument")
        kwargs['marg_prior'] = marg_prior
        for i in params:
            kwargs[i+"_marginalization"] = True
        args.update(kwargs)
        variable_params = args['variable_params']
        args["data"] = data
        try:
            static_params = args['static_params']
        except KeyError:
            static_params = {}
        # set up waveform generator
        try:
            approximant = static_params['approximant']
        except KeyError:
            raise ValueError("no approximant provided in the static args")
        generator_function = generator.select_waveform_generator(approximant)
        waveform_generator = generator.FDomainDetFrameGenerator(
            generator_function, epoch=data.values()[0].start_time,
            variable_args=variable_params, detectors=data.keys(),
            delta_f=delta_f, delta_t=delta_t,
            recalib=recalibration, gates=gates,
            **static_params)
        args['waveform_generator'] = waveform_generator
        args["f_lower"] = static_params["f_lower"]
        return cls(**args)
Beispiel #6
0
                                epoch=stilde.epoch)
    wh_strain = wh_stilde.to_timeseries()

    #load map values
    llrs = fp.read_likelihood_stats(iteration=opts.iteration,
                                    thin_start=opts.thin_start,
                                    thin_end=opts.thin_end,
                                    thin_interval=opts.thin_interval)
    map_idx = (llrs.loglr + llrs.prior).argmax()
    map_values = samples[map_idx]
    varargs = fp.variable_args
    sargs = fp.static_args

    print "generating injected waveforms"

    genclass = generator.select_waveform_generator(
        fp.static_args['approximant'])
    gen = generator.FDomainDetFrameGenerator(genclass,
                                             detectors=['H1', 'L1'],
                                             epoch=stilde.epoch,
                                             variable_args=varargs,
                                             **sargs)
    fis = gen.generate(tc=injvals[0],
                       mass1=injvals[1],
                       mass2=injvals[2],
                       spin1_a=injvals[3],
                       spin1_azimuthal=injvals[4],
                       spin1_polar=injvals[5],
                       spin2_a=injvals[6],
                       spin2_azimuthal=injvals[7],
                       spin2_polar=injvals[8],
                       distance=injvals[9],