Access ESASky products with astroquery.esasky

Authors: Ivan Valtchanov, Belén López Martí et al.

This notebook illustrates some example usages of the ESASky implementation in astroquery.

First you need to install astroquery and esasky.

Astroquery can be installed with pip install astroquery, the latest version should come with esasky. Alternatively, you can grab the latest astroquery with esasky from here.

The documentation for astroquery.esasky is available here.

Use Case 1: Retrieve imaging data for a single object

In this use case, imaging data are retrieved for a single object, indicated by its name (resolved by Simbad) or coordinates.

We start by importing the ESASky astroquery module and other necessary packages:

In [1]:
%matplotlib inline
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm

from astroquery.esasky import ESASky

First, let's check the available maps:

In [2]:
ESASky.list_maps()
Out[2]:
[u'INTEGRAL',
 u'XMM-EPIC',
 u'SUZAKU',
 u'XMM-OM-OPTICAL',
 u'XMM-OM-UV',
 u'HST',
 u'Herschel',
 u'ISO']

Let's do a search around the position of our object:

In [4]:
maps = ESASky.query_object_maps('M51')
print (maps)
TableList with 6 tables:
	'0:XMM-OM-OPTICAL' with 10 column(s) and 4 row(s) 
	'1:XMM-OM-UV' with 10 column(s) and 5 row(s) 
	'2:HERSCHEL' with 11 column(s) and 9 row(s) 
	'3:ISO' with 7 column(s) and 4 row(s) 
	'4:HST' with 11 column(s) and 159 row(s) 
	'5:XMM-EPIC' with 9 column(s) and 6 row(s) 

The output is a TableList with the keys corresponding to the mission (or in some cases, mission and instrument) names for which there are images available covering our target position.

We can also do a search by coordinates:

In [5]:
maps = ESASky.query_object_maps('13 29 52.7 +47 11 43')
print (maps)
TableList with 6 tables:
	'0:XMM-OM-OPTICAL' with 10 column(s) and 4 row(s) 
	'1:XMM-OM-UV' with 10 column(s) and 5 row(s) 
	'2:HERSCHEL' with 11 column(s) and 9 row(s) 
	'3:ISO' with 7 column(s) and 4 row(s) 
	'4:HST' with 11 column(s) and 159 row(s) 
	'5:XMM-EPIC' with 9 column(s) and 6 row(s) 

The list of accepted coordinate formats can be found here. The method has a tolerance of 5 arcsec to allow for positional errors.

Let's check the content of the 'XMM-OM-OPTICAL' table:

In [7]:
maps['XMM-OM-UV'].info
Out[7]:
<Table masked=True length=5>
     name       dtype  shape
-------------- ------- -----
  postcard_url  object      
   product_url  object      
observation_id  object      
    instrument  object      
        filter  object      
        ra_deg float64  (1,)
       dec_deg float64  (1,)
     start_utc  object      
      duration float64  (1,)
         stc_s  object      

As we see, it contains a table with URLs for the maps, and some additional info, like map ra, dec, bandpass ('filter'), or the exposure time ('duration').

Let's now see what bands are available:

In [8]:
maps['XMM-OM-OPTICAL']['observation_id', 'instrument', 'filter', 'duration'].pprint()
observation_id instrument filter duration [1]
-------------- ---------- ------ ------------
    0212480801         OM      V      49214.0
    0212480801         OM      U      49214.0
    0303420101         OM      U      54114.0
    0212480801         OM      B      49214.0

The result is stored in memory. To get the actual images:

In [9]:
maps_data = ESASky.get_maps(maps,'XMM-OM-OPTICAL', download_dir = '/Users/belen/tmp')
Starting download of XMM-OM-OPTICAL data. (4 files)
Downloading Observation ID: 0212480801 from http://nxsa.esac.esa.int/nxsa-sl/servlet/data-action-aio?level=PPS&extension=FTZ&obsno=0212480801&name=RSIMAGV [Done]
Downloading Observation ID: 0212480801 from http://nxsa.esac.esa.int/nxsa-sl/servlet/data-action-aio?level=PPS&extension=FTZ&obsno=0212480801&name=RSIMAGU [Done]
Downloading Observation ID: 0303420101 from http://nxsa.esac.esa.int/nxsa-sl/servlet/data-action-aio?level=PPS&extension=FTZ&obsno=0303420101&name=HSIMAGU [Done]
Downloading Observation ID: 0212480801 from http://nxsa.esac.esa.int/nxsa-sl/servlet/data-action-aio?level=PPS&extension=FTZ&obsno=0212480801&name=RSIMAGB [Done]
Downloading of XMM-OM-OPTICAL data complete.
INFO: Maps available at /Users/belen/tmp [astroquery.esasky.core]
In [10]:
maps_data
Out[10]:
{u'XMM-OM-OPTICAL': [[<astropy.io.fits.hdu.image.PrimaryHDU at 0x111400f90>,
   <astropy.io.fits.hdu.image.ImageHDU at 0x1114697d0>,
   <astropy.io.fits.hdu.image.ImageHDU at 0x111477e50>],
  [<astropy.io.fits.hdu.image.PrimaryHDU at 0x1112aefd0>,
   <astropy.io.fits.hdu.image.ImageHDU at 0x1112b12d0>,
   <astropy.io.fits.hdu.image.ImageHDU at 0x1112b15d0>],
  [<astropy.io.fits.hdu.image.PrimaryHDU at 0x1112bd750>,
   <astropy.io.fits.hdu.image.ImageHDU at 0x1112bda10>,
   <astropy.io.fits.hdu.image.ImageHDU at 0x1112bdd10>],
  [<astropy.io.fits.hdu.image.PrimaryHDU at 0x1112c9e90>,
   <astropy.io.fits.hdu.image.ImageHDU at 0x1112d0190>,
   <astropy.io.fits.hdu.image.ImageHDU at 0x1112d0490>]]}

The output maps_data is a product containing all the FITS files in memory, which are also downloaded to a local folder. If no folder is specified, the current working directory is used by default.

It is possible to download all the available images at once by typing 'all' as the mission name in the ESASky.get_maps() method.

We are ready to work with these maps. For example, let's inspect the header of one of them:

In [11]:
hdu = maps_data["XMM-OM-OPTICAL"][3]
hdu[0].header
Out[11]:
SIMPLE  =                    T / file does conform to FITS standard             
BITPIX  =                  -32 / number of bits per data pixel                  
NAXIS   =                    2 / number of data axes                            
NAXIS1  =                 1340 / length of data axis 1                          
NAXIS2  =                 1373 / length of data axis 2                          
EXTEND  =                    T / FITS dataset may contain extensions            
BUNIT   = 'Primary Array'      / Units of the image                             
XPROC0  = 'ommosaic imagesets=''product/P0212480801OMS008SIMAGE2000.FIT produc&'
CONTINUE  't/P0212480801OMS409SIMAGE2000.FIT product/P0212480801OMS410SIMAGE20&'
CONTINUE  '00.FIT product/P0212480801OMS411SIMAGE2000.FIT product/P0212480801O&'
CONTINUE  'MS412SIMAGE2000.FIT'' mosaicedset=product/P0212480801OMX000RSIMAGB0&'
CONTINUE  '00.FIT correlset='''' nsigma=2 mincorr=0 minfraction=0.5 maxdx=5 bi&'
CONTINUE  'naxis=0 numintervals=2 di=10 minnumpixels=100 # (ommosaic-2.5.17) [&'
CONTINUE  'xmmsas_20121219_1645-12.0.1]'                                        
XPROC1  = 'addattribute set=product/P0212480801OMX000RSIMAGB000.FIT attributen&'
CONTINUE  'ame=''SEQ_ID REVOLUT PROCDATE PROCREV PPSVERS SASVERS ODSVER ORIGIN&'
CONTINUE  ' ODFVER CONTENT'' attributetype=''string string string string strin&'
CONTINUE  'g string string string string string'' attributecomment=''"Pipeline&'
CONTINUE  ' sequence" "Satellite Revolution Number" "Processing date" "Process&'
CONTINUE  'ing revision" "PPS configuration" "SAS version used in pipeline pro&'
CONTINUE  'cessing" "ODS version" "Origin of FITS file" ODF_VERSION "Contents &'
CONTINUE  'of file"'' attributeunit='''' realvalue='''' stringvalue=''123160 1&'
CONTINUE  '018 2012-12-23T02:00:45 1 00000004_04_cat9.0_20121220.153800 xmmsas&'
CONTINUE  '_20121219_1645-12.0.1 15.0.0 Leicester/SSC 003 "OM RUDI-5 SKY IMAGE&'
CONTINUE  ' MOSAIC"'' integervalue='''' booleanvalue='''' # (addattribute-2.2.&'
CONTINUE  '6) [xmmsas_20121219_1645-12.0.1]'                                    
XPROC2  = 'addattribute set=product/P0212480801OMX000RSIMAGB000.FIT attributen&'
CONTINUE  'ame=''SEQ_ID REVOLUT PROCDATE PROCREV PPSVERS SASVERS ODSVER ORIGIN&'
CONTINUE  ' ODFVER CONTENT'' attributetype=''string string string string strin&'
CONTINUE  'g string string string string string'' attributecomment=''"Pipeline&'
CONTINUE  ' sequence" "Satellite Revolution Number" "Processing date" "Process&'
CONTINUE  'ing revision" "PPS configuration" "SAS version used in pipeline pro&'
CONTINUE  'cessing" "ODS version" "Origin of FITS file" ODF_VERSION "Contents &'
CONTINUE  'of file"'' attributeunit='''' realvalue='''' stringvalue=''123160 1&'
CONTINUE  '018 2012-12-23T02:00:45 1 00000004_04_cat9.0_20121220.153800 xmmsas&'
CONTINUE  '_20121219_1645-12.0.1 15.0.0 Leicester/SSC 003 "OM RUDI-5 SKY IMAGE&'
CONTINUE  ' MOSAIC"'' integervalue='''' booleanvalue='''' # (addattribute-2.2.&'
CONTINUE  '6) [xmmsas_20121219_1645-12.0.1]'                                    
XDAL0   = 'product/P0212480801OMX000RSIMAGB000.FIT 2012-12-23T15:30:18.000 Mod&'
CONTINUE  'ify addattribute (addattribute-2.2.6) [xmmsas_20121219_1645-12.0.1]&'
CONTINUE  ' High SAS_MEMORY_MODEL=high SAS_ROWS= SAS_ZERO_ROWS= SAS_COLUMN_WIS&'
CONTINUE  'E=      '                                                            
XDAL1   = 'product/P0212480801OMX000RSIMAGB000.FIT 2012-12-23T15:30:17.000 Mod&'
CONTINUE  'ify addattribute (addattribute-2.2.6) [xmmsas_20121219_1645-12.0.1]&'
CONTINUE  ' High SAS_MEMORY_MODEL=high SAS_ROWS= SAS_ZERO_ROWS= SAS_COLUMN_WIS&'
CONTINUE  'E=      '                                                            
XDAL2   = 'product/P0212480801OMX000RSIMAGB000.FIT 2012-12-23T04:28:06.000 Cre&'
CONTINUE  'ate ommosaic (ommosaic-2.5.17) [xmmsas_20121219_1645-12.0.1] High S&'
CONTINUE  'AS_MEMORY_MODEL=high SAS_ROWS= SAS_ZERO_ROWS= SAS_COLUMN_WISE='      
CREATOR = 'ommosaic (ommosaic-2.5.17) [xmmsas_20121219_1645-12.0.1]' / name of c
DATE    = '2012-12-23T04:28:10.000' / creation date                             
LONGSTRN= 'OGIP 1.0'                                                            
INSTRUME= 'OM      '                                                            
DATAMODE= 'IMAGING '                                                            
FILTER  = 'B       '                                                            
OBS_ID  = '        '                                                            
OBJECT  = 'UNKNOWN '                                                            
DATE-OBS= '2005-07-01T11:30:47.000'                                             
DATE-END= '2005-07-01T13:32:15.000'                                             
BINAX1  =                    1                                                  
BINAX2  =                    1                                                  
BINBPE  =                    F                                                  
EXPOSURE=                    1                                                  
DEADFRAC= 0.00000000000000E+00                                                  
FRAMTIME= 0.00000000000000E+00                                                  
WINDOWX0=                    0                                                  
WINDOWDX=                 1340                                                  
WINDOWY0=                    0                                                  
WINDOWDY=                 1373                                                  
EQUINOX =                 2000 / Equinox of celestial coordinate system         
CDELT1  = -2.64729431364685E-04 / Plate-scale in x direction                    
CDELT2  = 2.64729431364685E-04 / Plate-scale in y direction                     
CTYPE1  = 'RA---TAN'                                                            
CTYPE2  = 'DEC--TAN'                                                            
CRPIX1  = 5.00000000000000E-01 / Reference x pixel                              
CRPIX2  = 5.00000000000000E-01 / Reference y pixel                              
CRVAL1  = 2.02745853764497E+02 / RA at reference  x pixel                       
CRVAL2  = 4.69994707057903E+01 / DEC at reference  y pixel                      
PA      = 0.00000000000000E+00 / Mean RA pointing direction                     
RA_PNT  = 2.02745853764497E+02 / Mean RA pointing direction                     
DEC_PNT = 4.69994707057903E+01 / Mean Dec pointingDirection                     
POSCOROK=                    T / Images were astrometry corrected               
RAOFFSET= 2.72761797904968E+00 / Mean RA offset applied to images               
DEOFFSET= -1.40854432582855E+00 / Mean DEC offset applied to images             
NSTACKED=                    5 / Number of images stacked                       
SEQ_ID  = '123160  '           / Pipeline sequence                              
REVOLUT = '1018    '           / Satellite Revolution Number                    
PROCDATE= '2012-12-23T02:00:45' / Processing date                               
PROCREV = '1       '           / Processing revision                            
PPSVERS = '00000004_04_cat9.0_20121220.153800' / PPS configuration              
SASVERS = 'xmmsas_20121219_1645-12.0.1' / SAS version used in pipeline processin
ODSVER  = '15.0.0  '           / ODS version                                    
ORIGIN  = 'Leicester/SSC'      / Origin of FITS file                            
ODFVER  = '003     '           / ODF_VERSION                                    
CONTENT = 'OM RUDI-5 SKY IMAGE MOSAIC' / Contents of file                       
HISTORY Created by ommosaic (ommosaic-2.5.17) [xmmsas_20121219_1645-12.0.1] at 2
HISTORY 012-12-23T04:28:06                                                      
HISTORY Modified by addattribute (addattribute-2.2.6) [xmmsas_20121219_1645-12.0
HISTORY .1] at 2012-12-23T15:30:18                                              
HISTORY Modified by addattribute (addattribute-2.2.6) [xmmsas_20121219_1645-12.0
HISTORY .1] at 2012-12-23T15:30:18                                              

Let's now display it:

In [13]:
image = hdu[0].data
plt.imshow(image, cmap='gray', norm=LogNorm())
plt.colorbar()
Out[13]:
<matplotlib.colorbar.Colorbar at 0x11720f350>

Use Case 2: Retrieve catalogue data for a single object

We will now inspect and retrieve the catalogue data available for a given object, using either a name (resolved by Simbad) or coordinates.

As we did in Use Case 1 with the images, let's first get a list of the available catalogues:

In [14]:
ESASky.list_catalogs()
Out[14]:
[u'INTEGRAL',
 u'XMM-EPIC',
 u'XMM-OM',
 u'XMM-SLEW',
 u'Tycho-2',
 u'Gaia DR1 TGAS',
 u'Hipparcos-2',
 u'HSC',
 u'Planck-PGCC2',
 u'Planck-PCCS2E',
 u'Planck-PCCS2-HFI',
 u'Planck-PCCS2-LFI',
 u'Planck-PSZ']

We can look for an object in these catalogues by name or coordinates:

In [16]:
cats = ESASky.query_object_catalogs('M51')
print (cats)
TableList with 3 tables:
	'0:XMM-OM' with 12 column(s) and 3 row(s) 
	'1:XMM-EPIC' with 4 column(s) and 2 row(s) 
	'2:HSC' with 8 column(s) and 135 row(s) 
In [17]:
cats = ESASky.query_object_catalogs('13 29 52.7 +47 11 43')
print (cats)
TableList with 3 tables:
	'0:XMM-OM' with 12 column(s) and 3 row(s) 
	'1:XMM-EPIC' with 4 column(s) and 2 row(s) 
	'2:HSC' with 8 column(s) and 138 row(s) 

As in the previous use case, the query results are stored in a TableList with the keys corresponding to the catalog name.

It is also possible to specify the catalogues to search:

In [18]:
cats = ESASky.query_object_catalogs('M51',["XMM-EPIC","XMM-SLEW", "HSC"])
print (cats)
TableList with 2 tables:
	'0:HSC' with 8 column(s) and 135 row(s) 
	'1:XMM-EPIC' with 4 column(s) and 2 row(s) 

In this example, we only get two tables, because there are no available sources in the XMM-SLEW catalogue.

Let's now visualise the XMM-EPIC results table:

In [20]:
hsc_table = cats["HSC"]
hsc_table.info()
<Table masked=True length=135>
   name    dtype  shape n_bad
--------- ------- ----- -----
     name  object           0
numimages   int32  (1,)     0
       ra float64  (1,)     0
      dec float64  (1,)     0
 w2_f450w float64  (1,)   133
 w2_f606w float64  (1,)   135
 w2_f702w float64  (1,)   135
 w2_f814w float64  (1,)   134
In [21]:
print (hsc_table)
  name   numimages [1]   ra [1]  ... w2_f606w [1] w2_f702w [1] w2_f814w [1]
-------- ------------- --------- ... ------------ ------------ ------------
SN2005CS             8 202.47113 ...           --           --           --
 NGC5194             6 202.46959 ...           --           --           --
   M51-3             4 202.47131 ...           --           --           --
 SN1994I             4 202.46808 ...           --           --           --
   M51-3             4 202.47069 ...           --           --           --
   M51-4             4  202.4708 ...           --           --           --
   M51-3             3 202.47032 ...           --           --           --
   M51-3             3 202.47032 ...           --           --           --
   M51-3             3 202.46777 ...           --           --           --
SN2005CS             3 202.46965 ...           --           --      16.3499
     ...           ...       ... ...          ...          ...          ...
M-51-V05             1 202.47023 ...           --           --           --
M-51-V05             1 202.46983 ...           --           --           --
M-51-V05             1 202.46823 ...           --           --           --
M-51-V05             1 202.46883 ...           --           --           --
   M51-3             1 202.46878 ...           --           --           --
M-51-V05             1 202.46999 ...           --           --           --
M-51-V05             1  202.4685 ...           --           --           --
M-51-V05             1 202.46878 ...           --           --           --
M-51-V05             1 202.46922 ...           --           --           --
M-51-V05             1 202.46815 ...           --           --           --
M-51-V05             1 202.46794 ...           --           --           --
Length = 135 rows

We can also choose the columns to display:

In [22]:
print (hsc_table['name', 'ra', 'dec'])
  name     ra [1]   dec [1] 
-------- --------- ---------
SN2005CS 202.47113  47.19465
 NGC5194 202.46959 47.195267
   M51-3 202.47131 47.195972
 SN1994I 202.46808 47.195984
   M51-3 202.47069  47.19426
   M51-4  202.4708   47.1942
   M51-3 202.47032 47.195934
   M51-3 202.47032 47.196136
   M51-3 202.46777 47.195877
SN2005CS 202.46965  47.19512
     ...       ...       ...
M-51-V05 202.47023 47.194176
M-51-V05 202.46983  47.19406
M-51-V05 202.46823 47.194687
M-51-V05 202.46883  47.19443
   M51-3 202.46878  47.19448
M-51-V05 202.46999 47.194237
M-51-V05  202.4685  47.19459
M-51-V05 202.46878  47.19459
M-51-V05 202.46922 47.194447
M-51-V05 202.46815  47.19491
M-51-V05 202.46794  47.19497
Length = 135 rows

Let's plot these sources:

In [23]:
plt.xlabel('RA (deg)')
plt.ylabel('DEC (deg)')
plt.xlim(reversed(plt.xlim(202.467,202.472)))
plt.ylim(47.193,47.197)
plt.scatter(hsc_table['ra'], hsc_table['dec'])
plt.grid(True)

Use Case 3: Retrieve data in a sky region

It is also possible retrieve imaging and catalogue data in a circular sky region. The procedure is very similar to the case of a single object discussed above, but using the query_region_maps() and query_region_catalogs() methods instead of query_object_maps() and query_object_catalogs().

Let's first see the case where imaging data are retrieved. To query the region, we have to enter the central coordinates and the radius:

In [24]:
maps = ESASky.query_region_maps('13 29 52.7 +47 11 43', '25 arcmin')
print (maps)
TableList with 7 tables:
	'0:XMM-OM-OPTICAL' with 10 column(s) and 4 row(s) 
	'1:XMM-OM-UV' with 10 column(s) and 5 row(s) 
	'2:INTEGRAL' with 8 column(s) and 1 row(s) 
	'3:HERSCHEL' with 11 column(s) and 25 row(s) 
	'4:ISO' with 7 column(s) and 10 row(s) 
	'5:HST' with 11 column(s) and 848 row(s) 
	'6:XMM-EPIC' with 9 column(s) and 6 row(s) 

The difference with the query_object_maps() module is that now we have to explicitly indicate the search radius; if not, an error message is returned.

To search in a region around a given object, we can also enter the object's name instead of its coordinates:

In [25]:
maps = ESASky.query_region_maps('M51', '25 arcmin')
print (maps)
TableList with 7 tables:
	'0:XMM-OM-OPTICAL' with 10 column(s) and 4 row(s) 
	'1:XMM-OM-UV' with 10 column(s) and 5 row(s) 
	'2:INTEGRAL' with 8 column(s) and 1 row(s) 
	'3:HERSCHEL' with 11 column(s) and 25 row(s) 
	'4:ISO' with 7 column(s) and 10 row(s) 
	'5:HST' with 11 column(s) and 848 row(s) 
	'6:XMM-EPIC' with 9 column(s) and 6 row(s) 

If we compare the result of this query with that of Use Case 1, we will see that now we get more data, because we are using a larger search radius (recall that the search by object uses a radius of only 5 arcsec). In particular, we now have INTEGRAL data, and the number of observations from the other missions has increased.

The query for catalogues works similarly:

In [26]:
cats = ESASky.query_region_catalogs('M51',"25 arcmin",["XMM-EPIC", "HSC"])
print (cats)
TableList with 2 tables:
	'0:HSC' with 8 column(s) and 10000 row(s) 
	'1:XMM-EPIC' with 4 column(s) and 565 row(s) 

We also note here how the number of rows in each table is larger than before, because of the larger search radius.

By default, the query returns a maximum of 10,000 rows per table. Note that this limit has been reached for the HSC. If we want to make sure that all the rows are retrieved, we can set the row_limit parameter to -1:

In [27]:
cats = ESASky.query_region_catalogs('M51',"25 arcmin",["XMM-EPIC", "HSC"], row_limit=-1)
print (cats)
TableList with 2 tables:
	'0:HSC' with 8 column(s) and 100000 row(s) 
	'1:XMM-EPIC' with 4 column(s) and 565 row(s) 

Now the number of rows in the HSC table is 100,000, which is the absolute maximum that can be queried.

Let's now see how the XMM-EPIC table looks like:

In [28]:
xmm_epic_table = cats["XMM-EPIC"]
print (xmm_epic_table)
         name             ra [1]       dec [1]    ep_8_flux [1]
--------------------- ------------- ------------- -------------
3XMM J132952.5+471144 202.469270575 47.1953338821   1.87829e-12
3XMM J132952.5+471144 202.469208278   47.19553947   1.81731e-12
3XMM J133007.5+471106 202.531227952 47.1849910425    8.4207e-13
3XMM J133103.6+465943 202.765246959 46.9952423236    7.7624e-13
3XMM J133103.6+465943 202.765235048 46.9954209009   7.22042e-13
3XMM J132959.2+471557 202.496538442 47.2666182141   6.09664e-13
3XMM J132959.2+471557 202.496973557 47.2663138427   6.07323e-13
3XMM J133000.9+471343 202.504189456 47.2287212848   6.02286e-13
3XMM J132941.9+471133 202.424490848 47.1924243284   5.80697e-13
3XMM J133007.5+471106 202.531264535 47.1849258116   3.86376e-13
                  ...           ...           ...           ...
3XMM J133125.0+470727 202.854356589 47.1244072378   4.42211e-15
3XMM J132934.8+470933 202.395316913  47.159209181   4.30545e-15
3XMM J132907.2+471124 202.279891851 47.1900287289    4.2341e-15
3XMM J133017.4+471704 202.572739215 47.2845248329   3.94051e-15
3XMM J132935.8+470701 202.398798134 47.1169616061   3.87192e-15
3XMM J133005.4+470435 202.522534336 47.0766228681   3.85635e-15
3XMM J133020.3+470647 202.584434522 47.1129338774   3.77868e-15
3XMM J132900.4+471456 202.252348473 47.2491448228    3.3817e-15
3XMM J132930.0+470446 202.374399105 47.0804517744   3.13264e-15
3XMM J133015.5+470831 202.564740449 47.1420120168   3.12706e-15
3XMM J132927.0+470813  202.36289082 47.1371489478   2.27849e-15
Length = 565 rows

We are ready to work with the data. For example, let's plot a histogram of the EPIC fluxes:

In [29]:
NBINS = 100
plt.xlim(0, 3e-13)
plt.ylim(0,300)
flux = plt.hist(xmm_epic_table['ep_8_flux'], NBINS)