Exemplo n.º 1
0
def pointlike_dict_to_spectrum(d):
    if d['name'] == 'FileFunction':
        model = FileFunction(file=d['file'])
    elif d['name'] == 'DMFitFunction':
        model = DMFitFunction()
    else:
        model = uw.like.Models.__dict__[d['name']]()
    for k,v in d.items(): 
        if k not in ['name','method','file','covariance_matrix']:
            if len(k) > 10 and k[-10:] in ['_upper_err','_lower_err']:
                pass
            elif len(k) > 4 and k[-4:] == '_err': 
                model.set_error(k[:-4],v)
            else:
                model[k]=v
    return model
Exemplo n.º 2
0
def build_pointlike_model(spectrum):
    """ Convert a gtlike model object to a pointlike
        model object.
        
            >>> spectrum = _funcFactory.create('PowerLaw')

            >>> param=spectrum.getParam('Prefactor')
            >>> param.setScale(10)
            >>> param.setTrueValue(1e-9)
            >>> param.setBounds(1e-11,1e-9)
            >>> param.setError(3e-11)
            >>> param.setFree(True)

            >>> param=spectrum.getParam('Index')
            >>> param.setScale(2)
            >>> param.setBounds(-10,5)
            >>> param.setTrueValue(-3)
            >>> param.setError(0.125)
            >>> param.setFree(False)

        Check spectral values:

            >>> model = build_pointlike_model(spectrum)
            >>> energies = np.logspace(1, 6, 10000)
            >>> from uw.darkmatter.spectral import DMFitFunction
            >>> np.allclose(DMFitFunction.call_pylike_spectrum(spectrum, energies),
            ...     model(energies), rtol=1e-20, atol=1e-20) 
            True

        Check prefactor:

            >>> model.get_scale('norm')
            10.0
            >>> np.allclose(model.get_limits('norm'),[1e-10, 1e-08])
            True
            >>> np.allclose(model.getp('norm'),1e-9)
            True
            >>> np.allclose(model.error('norm'),1e-10)
            True
            >>> model.get_free('norm')
            True

        Check index params:

            >>> model.get_scale('index')
            -2.0
            >>> model.get_limits('index')
            [-10.0, 20.0]
            >>> model.getp('index')
            3.0
            >>> np.allclose(model.error('index'),0.25)
            True
            >>> model.get_free('index')
            False

        Example creating a FileFunction object:
        
        First, create file out of old model:

            >>> from tempfile import NamedTemporaryFile
            >>> temp = NamedTemporaryFile()
            >>> filename = temp.name
            >>> model.save_profile(filename, emin=1, emax=1e6)
        
        Now, make FileFunction:

            >>> spectrum = pyLikelihood.FileFunction()
            >>> spectrum.readFunction(filename)

        Set param values:

            >>> param=spectrum.getParam('Normalization')
            >>> param.setScale(2)
            >>> param.setTrueValue(4)
            >>> param.setBounds(.1,10)

            >>> model = build_pointlike_model(spectrum)

        Test spectral points:

            >>> np.allclose(DMFitFunction.call_pylike_spectrum(spectrum, energies),
            ...     model(energies), rtol=1e-20, atol=1e-20) 
            True

        Test param values:

            >>> model.get_scale('Normalization')
            2.0
            >>> model.getp('Normalization')
            4.0
            >>> model.get_limits('Normalization')
            [0.2, 20.0]


    """
    gtlike_name = spectrum.genericName()

    if gtlike_name == 'FileFunction':
        ff=pyLikelihood.FileFunction_cast(spectrum)
        filename=ff.filename()
        model = FileFunction(file=filename)
    else:
        model = XML_to_Model.modict[gtlike_name]()
    
    param_names = pyLikelihood.StringVector()
    spectrum.getParamNames(param_names)
    for gtlike_name in param_names:
        pointlike_name = model.get_pointlike_name(gtlike_name)
        
        param=spectrum.getParam(gtlike_name)

        if pointlike_name in model.default_extra_params.keys():
            # no mapping for extra params
            model.setp(pointlike_name,param.getTrueValue())
        else:
            model.setp_gtlike(pointlike_name,param.getTrueValue())

            if pointlike_name in model.param_names:
                model.set_mapper(pointlike_name, LinearMapper)

                if param.getBounds()[0] < -3.4e+38 and param.getBounds()[1] > 3.4e+38:
                    # No effective bound on parameters
                    pass
                else:
                    model.set_limits_gtlike(
                        pointlike_name,
                        lower=param.getBounds()[0]*param.getScale(),
                        upper=param.getBounds()[1]*param.getScale(),
                        scale=param.getScale())
                    model.set_error(
                        pointlike_name,
                        abs(param.error()*param.getScale()))
                    model.set_free(pointlike_name, param.isFree())
    return model
Exemplo n.º 3
0
def build_pointlike_model(spectrum):
    """ Convert a gtlike model object to a pointlike
        model object.
        
            >>> spectrum = _funcFactory.create('PowerLaw')

            >>> param=spectrum.getParam('Prefactor')
            >>> param.setScale(10)
            >>> param.setTrueValue(1e-9)
            >>> param.setBounds(1e-11,1e-9)
            >>> param.setError(3e-11)
            >>> param.setFree(True)

            >>> param=spectrum.getParam('Index')
            >>> param.setScale(2)
            >>> param.setBounds(-10,5)
            >>> param.setTrueValue(-3)
            >>> param.setError(0.125)
            >>> param.setFree(False)

        Check spectral values:

            >>> model = build_pointlike_model(spectrum)
            >>> energies = np.logspace(1, 6, 10000)
            >>> from uw.darkmatter.spectral import DMFitFunction
            >>> np.allclose(DMFitFunction.call_pylike_spectrum(spectrum, energies),
            ...     model(energies), rtol=1e-20, atol=1e-20) 
            True

        Check prefactor:

            >>> model.get_scale('norm')
            10.0
            >>> np.allclose(model.get_limits('norm'),[1e-10, 1e-08])
            True
            >>> np.allclose(model.getp('norm'),1e-9)
            True
            >>> np.allclose(model.error('norm'),1e-10)
            True
            >>> model.get_free('norm')
            True

        Check index params:

            >>> model.get_scale('index')
            -2.0
            >>> model.get_limits('index')
            [-10.0, 20.0]
            >>> model.getp('index')
            3.0
            >>> np.allclose(model.error('index'),0.25)
            True
            >>> model.get_free('index')
            False

        Example creating a FileFunction object:
        
        First, create file out of old model:

            >>> from tempfile import NamedTemporaryFile
            >>> temp = NamedTemporaryFile()
            >>> filename = temp.name
            >>> model.save_profile(filename, emin=1, emax=1e6)
        
        Now, make FileFunction:

            >>> spectrum = pyLikelihood.FileFunction()
            >>> spectrum.readFunction(filename)

        Set param values:

            >>> param=spectrum.getParam('Normalization')
            >>> param.setScale(2)
            >>> param.setTrueValue(4)
            >>> param.setBounds(.1,10)

            >>> model = build_pointlike_model(spectrum)

        Test spectral points:

            >>> np.allclose(DMFitFunction.call_pylike_spectrum(spectrum, energies),
            ...     model(energies), rtol=1e-20, atol=1e-20) 
            True

        Test param values:

            >>> model.get_scale('Normalization')
            2.0
            >>> model.getp('Normalization')
            4.0
            >>> model.get_limits('Normalization')
            [0.2, 20.0]


    """
    gtlike_name = spectrum.genericName()

    if gtlike_name == 'FileFunction':
        ff = pyLikelihood.FileFunction_cast(spectrum)
        filename = ff.filename()
        model = FileFunction(file=filename)
    else:
        model = XML_to_Model.modict[gtlike_name]()

    param_names = pyLikelihood.StringVector()
    spectrum.getParamNames(param_names)
    for gtlike_name in param_names:
        pointlike_name = model.get_pointlike_name(gtlike_name)

        param = spectrum.getParam(gtlike_name)

        if pointlike_name in model.default_extra_params.keys():
            # no mapping for extra params
            model.setp(pointlike_name, param.getTrueValue())
        else:
            model.setp_gtlike(pointlike_name, param.getTrueValue())

            if pointlike_name in model.param_names:
                model.set_mapper(pointlike_name, LinearMapper)

                if param.getBounds()[0] < -3.4e+38 and param.getBounds(
                )[1] > 3.4e+38:
                    # No effective bound on parameters
                    pass
                else:
                    model.set_limits_gtlike(
                        pointlike_name,
                        lower=param.getBounds()[0] * param.getScale(),
                        upper=param.getBounds()[1] * param.getScale(),
                        scale=param.getScale())
                    model.set_error(pointlike_name,
                                    abs(param.error() * param.getScale()))
                    model.set_free(pointlike_name, param.isFree())
    return model