def set_model(self, model=None, filename=""): """Read the model from dict or filename and attach it to datasets. Parameters ---------- model: dict or string Dictionary or string in YAML format with the serialized model. filename : string Name of the model YAML file describing the model. """ if not self._validate_set_model(): return False log.info(f"Reading model.") if isinstance(model, str): model = yaml.safe_load(model) if model: self.model = SkyModels(dict_to_models(model)) elif filename: filepath = make_path(filename) self.model = SkyModels.from_yaml(filepath) else: return False # TODO: Deal with multiple components for dataset in self.datasets.datasets: if isinstance(dataset, MapDataset): dataset.model = self.model else: if len(self.model.skymodels) > 1: raise ValueError( "Can only fit a single spectral model at one time." ) dataset.model = self.model.skymodels[0].spectral_model log.info(self.model)
def from_yaml(cls, yaml_str): """Create from YAML string.""" from gammapy.modeling.serialize import dict_to_models data = yaml.safe_load(yaml_str) models = dict_to_models(data) return cls(models)
def from_yaml(cls, filename): """Write to YAML file.""" from gammapy.modeling.serialize import dict_to_models data = read_yaml(filename) skymodels = dict_to_models(data) return cls(skymodels)
def set_models(self, models): """Set models on datasets. Parameters ---------- models : `~gammapy.modeling.models.Models` or str Models object or YAML models string """ if not self.datasets or len(self.datasets) == 0: raise RuntimeError("Missing datasets") log.info(f"Reading model.") if isinstance(models, str): # FIXME: Models should offer a method to create from YAML str models = yaml.safe_load(models) self.models = Models(dict_to_models(models)) elif isinstance(models, Models): self.models = models else: raise TypeError(f"Invalid type: {models!r}") for dataset in self.datasets: dataset.models = self.models log.info(self.models)
def test_dict_to_skymodels(): filename = get_pkg_data_filename("data/examples.yaml") models_data = read_yaml(filename) models = dict_to_models(models_data) assert len(models) == 3 model0 = models[0] assert model0.spectral_model.tag == "ExpCutoffPowerLawSpectralModel" assert model0.spatial_model.tag == "PointSpatialModel" pars0 = model0.parameters assert pars0["index"].value == 2.1 assert pars0["index"].unit == "" assert np.isnan(pars0["index"].max) assert np.isnan(pars0["index"].min) assert pars0["index"].frozen is False assert pars0["lon_0"].value == -50.0 assert pars0["lon_0"].unit == "deg" assert pars0["lon_0"].max == 180.0 assert pars0["lon_0"].min == -180.0 assert pars0["lon_0"].frozen is True assert pars0["lat_0"].value == -0.05 assert pars0["lat_0"].unit == "deg" assert pars0["lat_0"].max == 90.0 assert pars0["lat_0"].min == -90.0 assert pars0["lat_0"].frozen is True assert pars0["lambda_"].value == 0.06 assert pars0["lambda_"].unit == "TeV-1" assert np.isnan(pars0["lambda_"].min) assert np.isnan(pars0["lambda_"].max) model1 = models[1] assert model1.spectral_model.tag == "PowerLawSpectralModel" assert model1.spatial_model.tag == "DiskSpatialModel" pars1 = model1.parameters assert pars1["index"].value == 2.2 assert pars1["index"].unit == "" assert pars1["lat_0"].scale == 1.0 assert pars1["lat_0"].factor == pars1["lat_0"].value assert np.isnan(pars1["index"].max) assert np.isnan(pars1["index"].min) assert pars1["r_0"].unit == "deg" model2 = models[2] assert_allclose(model2.spectral_model.energy.data, [34.171, 44.333, 57.517]) assert model2.spectral_model.energy.unit == "MeV" assert_allclose(model2.spectral_model.values.data, [2.52894e-06, 1.2486e-06, 6.14648e-06]) assert model2.spectral_model.values.unit == "1 / (cm2 MeV s sr)" assert model2.spectral_model.tag == "TemplateSpectralModel" assert model2.spatial_model.tag == "TemplateSpatialModel" assert model2.spatial_model.parameters["norm"].value == 1.0 assert model2.spatial_model.normalize is False assert model2.spectral_model.parameters["norm"].value == 2.1