Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
    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
Ejemplo n.º 9
0
    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
Ejemplo n.º 10
0
    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
Ejemplo n.º 11
0
    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
Ejemplo n.º 12
0
    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