def plot_points(self, axes, **kwargs): """ Plot the SED using matpotlib. """ data_kwargs = dict(color='black') data_kwargs.update(kwargs) edict = self.results['Energy'] fdict = self.results['dNdE'] file_energy_units = units.fromstring(edict['Units']) file_flux_units = units.fromstring(fdict['Units']) ce = lambda x: units.convert(np.asarray(x), file_energy_units, axes. energy_units_obj) # get energy part energy = ce(edict['Value']) if 'Lower' in edict and 'Upper' in edict: lower_energy = ce(edict['Lower']) upper_energy = ce(edict['Upper']) has_energy_errors = True else: has_energy_errors = False # get spectral part cf = lambda y: units.convert( energy**2 * np.asarray(y), axes.energy_units_obj**2 * file_flux_units, axes.flux_units_obj / units.cm**2 / units.s) dnde = cf(fdict['Value']) if 'Lower_Error' in fdict and 'Upper_Error' in fdict: # assymetric errors dnde_lower_err = cf(fdict['Lower_Error']) dnde_upper_err = cf(fdict['Upper_Error']) has_assymetric_errors = True else: has_assymetric_errors = False dnde_err = cf(fdict['Average_Error']) # get limits, otherwise assume all significant if 'Upper_Limit' in fdict and 'Significant' in self.results: dnde_ul = cf(fdict['Upper_Limit']) significant = np.asarray(self.results['Significant']) has_upper_limits = True else: has_upper_limits = False plot_points( x=energy, xlo=lower_energy if has_energy_errors else None, xhi=upper_energy if has_energy_errors else None, y=dnde, y_lower_err=dnde_lower_err if has_assymetric_errors else dnde_err, y_upper_err=dnde_upper_err if has_assymetric_errors else dnde_err, y_ul=dnde_ul if has_upper_limits else None, significant=significant if has_upper_limits else np.ones(len(energy), dtype=bool), axes=axes, **data_kwargs)
def plot_points(self, axes, **kwargs): """ Plot the SED using matpotlib. """ data_kwargs=dict(color='black') data_kwargs.update(kwargs) edict = self.results['Energy'] fdict = self.results['dNdE'] file_energy_units = units.fromstring(edict['Units']) file_flux_units = units.fromstring(fdict['Units']) ce = lambda x: units.convert(np.asarray(x),file_energy_units, axes.energy_units_obj) # get energy part energy = ce(edict['Value']) if 'Lower' in edict and 'Upper' in edict: lower_energy = ce(edict['Lower']) upper_energy = ce(edict['Upper']) has_energy_errors = True else: has_energy_errors = False # get spectral part cf = lambda y: units.convert(energy**2*np.asarray(y), axes.energy_units_obj**2*file_flux_units, axes.flux_units_obj/units.cm**2/units.s) dnde = cf(fdict['Value']) if 'Lower_Error' in fdict and 'Upper_Error' in fdict: # assymetric errors dnde_lower_err = cf(fdict['Lower_Error']) dnde_upper_err = cf(fdict['Upper_Error']) has_assymetric_errors = True else: has_assymetric_errors = False dnde_err = cf(fdict['Average_Error']) # get limits, otherwise assume all significant if 'Upper_Limit' in fdict and 'Significant' in self.results: dnde_ul = cf(fdict['Upper_Limit']) significant = np.asarray(self.results['Significant']) has_upper_limits=True else: has_upper_limits=False plot_points( x=energy, xlo=lower_energy if has_energy_errors else None, xhi=upper_energy if has_energy_errors else None, y=dnde, y_lower_err=dnde_lower_err if has_assymetric_errors else dnde_err, y_upper_err=dnde_upper_err if has_assymetric_errors else dnde_err, y_ul=dnde_ul if has_upper_limits else None, significant=significant if has_upper_limits else np.ones(len(energy),dtype=bool), axes=axes, **data_kwargs)
def __init__(self, sed_file, energy_units_str='MeV', flux_units_str='erg'): self.sed_file = sed_file self.energy_units_str = energy_units_str self.flux_units_str = flux_units_str self.energy_units = units.fromstring(self.energy_units_str) self.flux_units = units.fromstring(self.flux_units_str) self.__load__(sed_file)
def plot(self, filename=None, axes=None, title=None, sed_results=None, fignum=None, figsize=(4,4), model_0_kwargs=dict(color='red', zorder=0), model_1_kwargs=dict(color='blue', zorder=0), sed_kwargs=dict(), plot_kwargs=dict(),): """ Plots the cutoff test performed of a spectrum using the function gtlike_test_cutoff. Input: cutoff_dict: created by gtlike_test_cutoff sed_dict: created by GtlikeSED.todict(). Can also be a yaml file created by GtlikeSED.save(). model_0_kwargs: kwargs for model_0's plot model_1_kwargs: kwargs for model_0's plot sed_kwargs: kwargs to pass into SED E.G. flux_units, flux_units, figsize, ... """ if axes is None: fig = P.figure(fignum,figsize) axes = SpectralAxes(fig=fig, rect=(0.22,0.15,0.75,0.8), flux_units=self.flux_units, energy_units=self.energy_units) fig.add_axes(axes) energy = self.results['energy'] axes.set_xlim_units(energy['emin']*units.fromstring(energy['energy_units']), energy['emax']*units.fromstring(energy['energy_units'])) if sed_results is not None: sed = SED(sed_results) sed.plot_points(axes=axes, **sed_kwargs) sp = SpectrumPlotter(axes=axes) sp.plot(self.results['hypothesis_0']['spectrum'], autoscale=False, **model_0_kwargs) sp.plot_error(self.results['hypothesis_0']['spectrum'], self.results['hypothesis_0']['spectrum']['covariance_matrix'], alpha=0.5, autoscale=False, **model_0_kwargs) sp.plot(self.results['hypothesis_1']['spectrum'], autoscale=False, **model_1_kwargs) sp.plot_error(self.results['hypothesis_1']['spectrum'], self.results['hypothesis_1']['spectrum']['covariance_matrix'], alpha=0.5, autoscale=False, **model_1_kwargs) if title is not None: axes.set_title(title) if filename is not None: P.savefig(expandvars(filename)) return axes
def __init__(self, *args, **kwargs): self.energy_units = kwargs.pop('energy_units', 'MeV') self.flux_units = kwargs.pop('flux_units', 'erg') self.energy_units_obj = units.fromstring(self.energy_units) self.flux_units_obj = units.fromstring(self.flux_units) super(SpectralAxes,self).__init__(*args, **kwargs) self.set_xscale('log') self.set_yscale('log') self.set_xlabel('Energy (%s)' % self.energy_units) self.set_ylabel('E$^2$ dN/dE (%s cm$^{-2}$ s$^{-1}$)' % self.flux_units)
def __init__(self, *args, **kwargs): self.energy_units = kwargs.pop('energy_units', 'MeV') self.flux_units = kwargs.pop('flux_units', 'erg') self.energy_units_obj = units.fromstring(self.energy_units) self.flux_units_obj = units.fromstring(self.flux_units) super(SpectralAxes, self).__init__(*args, **kwargs) self.set_xscale('log') self.set_yscale('log') self.set_xlabel('Energy (%s)' % self.energy_units) self.set_ylabel('E$^2$ dN/dE (%s cm$^{-2}$ s$^{-1}$)' % self.flux_units)
def plot(self, filename=None, axes=None, title=None, fignum=None, figsize=(4,4), spectral_kwargs=dict(), spectral_error_kwargs=dict(), ): pass_spectral_kwargs=dict(color='red',zorder=1.9) pass_spectral_kwargs.update(spectral_kwargs) pass_spectral_error_kwargs=dict(color='red',alpha=0.5,zorder=1.8) pass_spectral_error_kwargs.update(spectral_error_kwargs) if axes is None: fig = P.figure(fignum,figsize) axes = SpectralAxes(fig=fig, rect=(0.22,0.15,0.75,0.8), flux_units=self.flux_units, energy_units=self.energy_units) fig.add_axes(axes) axes.set_xlim_units( self.results['bands'][0]['energy']['emin']*units.fromstring(self.results['bands'][0]['energy']['energy_units']), self.results['bands'][-1]['energy']['emax']*units.fromstring(self.results['bands'][-1]['energy']['energy_units']) ) for i,r in enumerate(self.results['bands']): emin=r['energy']['emin']*units.fromstring(r['energy']['energy_units']) emax=r['energy']['emax']*units.fromstring(r['energy']['energy_units']) spectrum = r['spectrum'] if i > 0 and 'label' in spectral_kwargs: # only one label spectral_kwargs.pop('label') if r['significant']: sp = SpectrumPlotter(axes=axes) sp.plot(spectrum, emin=emin, emax=emax, **pass_spectral_kwargs) sp.plot_error(spectrum, emin=emin, emax=emax, **pass_spectral_error_kwargs) else: ul = UpperLimit(r['upper_limit']) ul.plot(axes=axes, **pass_spectral_kwargs) if title is not None: axes.set_title(title) if filename is not None: P.savefig(expandvars(filename)) return axes
def plot( self, filename=None, axes=None, title=None, fignum=None, figsize=(4, 4), rect=(0.22, 0.15, 0.75, 0.8), plot_spectral_fit=True, plot_spectral_error=True, data_kwargs=dict(), spectral_kwargs=dict(), spectral_error_kwargs=dict(), ): if axes is None: fig = P.figure(fignum, figsize) axes = SpectralAxes(fig=fig, rect=rect, flux_units=self.flux_units, energy_units=self.energy_units) fig.add_axes(axes) edict = self.results['Energy'] file_energy_units = units.fromstring(edict['Units']) if 'Lower' in edict and 'Upper' in edict: axes.set_xlim_units(edict['Lower'][0] * file_energy_units, edict['Upper'][-1] * file_energy_units) else: axes.set_xlim_units(edict['Energy'][0] * file_energy_units, edict['Energy'][-1] * file_energy_units) self.plot_points(axes=axes, **data_kwargs) if plot_spectral_fit: self.plot_spectral_fit(axes=axes, **spectral_kwargs) if plot_spectral_error: self.plot_spectral_error(axes=axes, **spectral_error_kwargs) if title is not None: axes.set_title(title) if filename is not None: P.savefig(expandvars(filename)) return axes
def plot(self, filename=None, axes=None, title=None, fignum=None, figsize=(4,4), **kwargs): """ Plot the upper limit. """ spectral_kwargs=dict(color='red',zorder=1.9) spectral_kwargs.update(kwargs) file_energy_units = units.fromstring(self.results['energy_units']) emin = self.results['emin']*file_energy_units emax = self.results['emax']*file_energy_units if axes is None: fig = P.figure(fignum,figsize) axes = SpectralAxes(fig=fig, rect=(0.22,0.15,0.75,0.8), flux_units=self.flux_units, energy_units=self.energy_units) fig.add_axes(axes) axes.set_xlim_units(emin,emax) # plot the spectral model spectrum = self.results['spectrum'] sp=SpectrumPlotter(axes=axes) sp.plot(spectrum, emin=emin, emax=emax, **spectral_kwargs) # plot in the middle an arrow pointing down e_middle = units.tosympy([np.sqrt(self.results['emin']*self.results['emax'])],file_energy_units) dnde = sp.get_dnde(spectrum, e_middle) energies, e2_dnde = axes.convert_points(e_middle, dnde) if 'autoscale' in spectral_kwargs: spectral_kwargs.pop('autoscale') if 'label' in spectral_kwargs: spectral_kwargs.pop('label') plot_points(x=energies, y=e2_dnde, xlo=None, xhi=None, y_lower_err=None, y_upper_err=None, y_ul=e2_dnde, significant=False, axes=axes, **spectral_kwargs) if title is not None: axes.set_title(title) if filename is not None: P.savefig(expandvars(filename)) return axes
def plot(self, filename=None, axes=None, title=None, fignum=None, figsize=(4,4), rect=(0.22,0.15,0.75,0.8), plot_spectral_fit=True, plot_spectral_error=True, data_kwargs=dict(), spectral_kwargs=dict(), spectral_error_kwargs=dict(), ): if axes is None: fig = P.figure(fignum,figsize) axes = SpectralAxes(fig=fig, rect=rect, flux_units=self.flux_units, energy_units=self.energy_units) fig.add_axes(axes) edict = self.results['Energy'] file_energy_units = units.fromstring(edict['Units']) if 'Lower' in edict and 'Upper' in edict: axes.set_xlim_units(edict['Lower'][0]*file_energy_units, edict['Upper'][-1]*file_energy_units) else: axes.set_xlim_units(edict['Energy'][0]*file_energy_units, edict['Energy'][-1]*file_energy_units) self.plot_points(axes=axes, **data_kwargs) if plot_spectral_fit: self.plot_spectral_fit(axes=axes, **spectral_kwargs) if plot_spectral_error: self.plot_spectral_error(axes=axes, **spectral_error_kwargs) if title is not None: axes.set_title(title) if filename is not None: P.savefig(expandvars(filename)) return axes
def plot( self, filename=None, axes=None, title=None, sed_results=None, fignum=None, figsize=(4, 4), model_0_kwargs=dict(color='red', zorder=0), model_1_kwargs=dict(color='blue', zorder=0), sed_kwargs=dict(), plot_kwargs=dict(), ): """ Plots the cutoff test performed of a spectrum using the function gtlike_test_cutoff. Input: cutoff_dict: created by gtlike_test_cutoff sed_dict: created by GtlikeSED.todict(). Can also be a yaml file created by GtlikeSED.save(). model_0_kwargs: kwargs for model_0's plot model_1_kwargs: kwargs for model_0's plot sed_kwargs: kwargs to pass into SED E.G. flux_units, flux_units, figsize, ... """ if axes is None: fig = P.figure(fignum, figsize) axes = SpectralAxes(fig=fig, rect=(0.22, 0.15, 0.75, 0.8), flux_units=self.flux_units, energy_units=self.energy_units) fig.add_axes(axes) energy = self.results['energy'] axes.set_xlim_units( energy['emin'] * units.fromstring(energy['energy_units']), energy['emax'] * units.fromstring(energy['energy_units'])) if sed_results is not None: sed = SED(sed_results) sed.plot_points(axes=axes, **sed_kwargs) sp = SpectrumPlotter(axes=axes) sp.plot(self.results['hypothesis_0']['spectrum'], autoscale=False, **model_0_kwargs) sp.plot_error( self.results['hypothesis_0']['spectrum'], self.results['hypothesis_0']['spectrum']['covariance_matrix'], alpha=0.5, autoscale=False, **model_0_kwargs) sp.plot(self.results['hypothesis_1']['spectrum'], autoscale=False, **model_1_kwargs) sp.plot_error( self.results['hypothesis_1']['spectrum'], self.results['hypothesis_1']['spectrum']['covariance_matrix'], alpha=0.5, autoscale=False, **model_1_kwargs) if title is not None: axes.set_title(title) if filename is not None: P.savefig(expandvars(filename)) return axes