def spectral_model(self): """Best fit spectral model (`~gammapy.modeling.models.SpectralModel`).""" spec_type = self.data["SpectrumType"].strip() pars, errs = {}, {} pars["amplitude"] = self.data["Flux_Density"] errs["amplitude"] = self.data["Unc_Flux_Density"] pars["reference"] = self.data["Pivot_Energy"] if spec_type == "PowerLaw": pars["index"] = self.data["Spectral_Index"] errs["index"] = self.data["Unc_Spectral_Index"] model = PowerLawSpectralModel(**pars) elif spec_type == "PLExpCutoff": pars["index"] = self.data["Spectral_Index"] pars["ecut"] = self.data["Cutoff"] errs["index"] = self.data["Unc_Spectral_Index"] errs["ecut"] = self.data["Unc_Cutoff"] model = ExpCutoffPowerLaw3FGLSpectralModel(**pars) elif spec_type == "LogParabola": pars["alpha"] = self.data["Spectral_Index"] pars["beta"] = self.data["beta"] errs["alpha"] = self.data["Unc_Spectral_Index"] errs["beta"] = self.data["Unc_beta"] model = LogParabolaSpectralModel(**pars) elif spec_type == "PLSuperExpCutoff": # TODO: why convert to GeV here? Remove? pars["reference"] = pars["reference"].to("GeV") pars["index_1"] = self.data["Spectral_Index"] pars["index_2"] = self.data["Exp_Index"] pars["ecut"] = self.data["Cutoff"].to("GeV") errs["index_1"] = self.data["Unc_Spectral_Index"] errs["index_2"] = self.data["Unc_Exp_Index"] errs["ecut"] = self.data["Unc_Cutoff"].to("GeV") model = SuperExpCutoffPowerLaw3FGLSpectralModel(**pars) else: raise ValueError(f"Invalid spec_type: {spec_type!r}") model.parameters.set_parameter_errors(errs) return model
name="norm-ecpl", model=ExpCutoffPowerLawNormSpectralModel( index=1.6 * u.Unit(""), norm=4 * u.Unit(""), reference=1 * u.TeV, lambda_=0.1 / u.TeV, ), val_at_2TeV=u.Quantity(1.080321705479446, ""), integral_1_10TeV=u.Quantity(3.765838739678921, "TeV"), eflux_1_10TeV=u.Quantity(9.901735870666526, "TeV2"), ), dict( name="ecpl_3fgl", model=ExpCutoffPowerLaw3FGLSpectralModel( index=2.3 * u.Unit(""), amplitude=4 / u.cm ** 2 / u.s / u.TeV, reference=1 * u.TeV, ecut=10 * u.TeV, ), val_at_2TeV=u.Quantity(0.7349563611124971, "cm-2 s-1 TeV-1"), integral_1_10TeV=u.Quantity(2.6034046173089, "cm-2 s-1"), eflux_1_10TeV=u.Quantity(5.340285560055799, "TeV cm-2 s-1"), ), dict( name="plsec_4fgl", model=SuperExpCutoffPowerLaw4FGLSpectralModel( index_1=1.5, index_2=2, amplitude=1 / u.cm ** 2 / u.s / u.TeV, reference=1 * u.TeV, expfactor=1e-2, ),