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
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
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