Table information for 'ppakm31.cubes'

General

Table Description: Spectral cubes of the fields. Look for these with full metadata in the ivoa.obscore table, obs_collection 'ppakm31 cubes'.

This table is available for ADQL queries and through the TAP endpoint.

Resource Description: These observations cover five star-forming regions in the Andromeda galaxy (M31) with optical integral field spectroscopy. Each has a field of view of roughly 1 kpc across, at 10pc physical resolution. In addition to the calibrated data cubes, we provide flux maps of the Hβ, [OIII]5007, Hα, [NII]6583, [SII]6716 and [SII]6730 line emission. All data products have associated error maps.

For a list of all services and tables belonging to this table's resource, see Information on resource 'PPAKM31 – Optical Integral Field Spectroscopy of Star-Forming Regions in M31'

Citing this table

This table has an associated publication. If you use data from it, it may be appropriate to reference 2017ApJ...844..155T (ADS BibTeX entry for the publication) either in addition to or instead of the service reference.

To cite the table as such, we suggest the following BibTeX entry:

@MISC{vo:ppakm31_cubes,
  year=2020,
  title={{PPAKM31} – Optical Integral Field Spectroscopy of Star-Forming Regions
in M31},
  author={Kreckel, K. and Tomičić, N. and Sandstrom, K. and Groves, B.},
  url={http://dc.zah.uni-heidelberg.de/tableinfo/ppakm31.cubes},
  howpublished={{VO} resource provided by the {GAVO} Data Center}
}

Resource Documentation

A Use Case

For a quick idea of what you can do with this data, consider Kewley et al's starburst criterion (2001ApJ...556..121K), which compares [OIII]/Hb with ([SII]6716+[SII]6730)/Ha.

We will use pyVO, TOPCAT and Aladin.

Since we need to do somewhat complex operations on the image pixels, we'll use pyVO to get the source images and compute the criterion. You could almost do it with just Aladin, but it doesn't let you do logarithms at the time of writing.

Get the image metadata: The easiest way to do that is through TAP. So, open TOPCAT's TAP window, search for ppakm31, and you should end up on GAVO's TAP service (but we can just as well assume you got there by looking for, perhaps “emission flux M31” or so in the Registry).

Since there's not many of them, just pull the metadata for all the line maps by querying:

select accref, field, imagetitle, bandpassid, cube_link
from ppakm31.maps

(in case you're wondering: you can see which columns to select in TOPCAT's column browser. Bonus feature: Control-click to select the columns, the hit the “Cols” button right above the query input to insert them into the query).

Do the image math: As said above, at this point we'll have to defer to python because the image match we'd like to do still is beyond Aladin. So, here's a python script that – using the python VO library pyVO – first loads the metadata for a given field, then builds a dict that goes from band names to numpy arrays of the corresponding flux maps, does Kewley et al's math and finally writes the result back as a FITS (we're cheating a bit with the header; that part is not a good example):

from astropy.io import fits as pyfits
import numpy
import pyvo


def stringify(s):
    """returns s utf-8-decoded if it's bytes, s otherwise.

    (that's working around old astropy votable breakage)
    """
    if isinstance(s, bytes):
        return s.decode("utf-8")
    return s


def get_image_metadata(field):
    """returns metadata rows from the ppakm31 service for field.

    Access URL and schema are taken from a TOPCAT exploration of the service.
    """
    svc = pyvo.dal.TAPService("http://dc.zah.uni-heidelberg.de/tap")

    res = []
    for row in svc.run_sync(
            "select accref, field, imagetitle, bandpassid, cube_link"
            "  from ppakm31.maps"
            "  where field={}".format(repr(field))):
        res.append({
            "bandpassid": stringify(row["bandpassid"]),
            "accref": stringify(row["accref"]),})

    return res


def get_line_maps(image_meta):
    """returns a dict band->hdus for image_meta as returned by
    get_image_maps.
    """
    res = {}
    for row in image_meta:
        if row["bandpassid"]=='[NII]6583':
             # we don't need that one later, so skip it
             continue
        res[row["bandpassid"]] = pyfits.open(row["accref"])
    return res


def get_kewley_map(line_maps):
    """does the math to compute the Kewley criterion, 2001ApJ...556..121K.

    Line_maps is a dict line label -> fits hdus.
    """
    return (numpy.log(
            line_maps["[OIII]5007"][0].data
            /line_maps["Hbeta"][0].data)
        /(0.72/(
            numpy.log((
                    line_maps["[SII]6716"][0].data
                    +line_maps["[SII]6730"][0].data)
                /line_maps["Halpha"][0].data-0.32))
            +1.30))


if __name__=="__main__":
    line_maps = get_line_maps(get_image_metadata("F2"))
    kewley_map = get_kewley_map(line_maps)

    # hack: re-use Halpha for our line map, with just a hint of
    # sanitation
    new_hdr = line_maps["Halpha"][0].header
    for outdated_card in ["CRPIX3", "CRVAL3", "CDELT3", "BUNIT",
            "CUNIT3", "DATAMIN", "DATAMAX"]:
        del new_hdr[outdated_card]
    new_hdr["HISTORY"] = "butchered by build_i_map.py"
    pyfits.HDUList([
        pyfits.PrimaryHDU(header=new_hdr, data=kewley_map)]
        ).writeto("kewley_map.fits", overwrite=True)

This will write a FITS file in kewley_map.fits, where values below one mean strong photoionisation.

Correlate that with stellar data: We'd expect strong photoionisation in the vicinity of luminous OB stars. So, let's see if we can correlate areas where our FITS has values below 1 with peculiarities in the CMD.

To do that, first use Aladin's curve tool (“pixel” in the toolbar) to clearly separate pixels that are >1 from those that are <1.

Then, get some stellar data. In Aladin's discovery tree (left side of the window), you can enter ”M31 photometry” and you'll find, for instance, Massey et al's 2006 catalog with UBVRI photometry of about 4e5 stars near M31. Since it goes a bit deeper than Gaia, let's use that: click on its entry, and in the dialog popping up, make sure “in view” is checked. Then hit load.

For further analysis, start TOPCAT. Then send over the full sample from Aladin to TOPCAT; to do that, locate the plane label of the Massey sources in the stack on the right side of Aladin's window, right click on it and say “broadcast selected tables to.../TOPCAT”. Then, in Aladin, select objects in the vicinity of the pixels indicating strong ionisation (click and drag as usual).

When you right-click on the tabular area below the image are, you can make your new selection into a new plane. Do that and again transmit this plane to TOPCAT.

Then, in TOPCAT, plot CMDs of both samples and see if you spot some systematics. Here's how this looked like for us:

/ppakm31/q/cdl/static/ppakm31-cmds.png

Fields

Sorted by DB column index. [Sort alphabetically]

NameTable Head DescriptionUnitUCD
accref Product key Access key for the data N/A N/A
owner Owner Owner of the data N/A N/A
embargo Embargo ends Date the data will become/became public a N/A
mime Type MIME type of the file served N/A meta.code.mime
accsize File size Size of the data in bytes byte VOX:Image_FileSize
obs_id Obs_id Unique identifier for an observation N/A meta.id
obs_publisher_did Obs_publisher_did Dataset identifier assigned by the publisher. N/A meta.ref.ivoid
access_estsize Access_estsize Estimated size of data product kbyte phys.size;meta.file
obs_title Obs_title Free-from title of the data set N/A meta.title;obs
s_ra S_ra RA of (center of) observation, ICRS deg pos.eq.ra
s_dec S_dec Dec of (center of) observation, ICRS deg pos.eq.dec
t_min T_min Lower bound of times represented in the data set, as MJD d time.start;obs.exposure
t_max T_max Upper bound of times represented in the data set, as MJD d time.end;obs.exposure
s_region S_region Region covered by the observation, as a polygon N/A pos.outline;obs.field
em_min Em_min Minimal wavelength represented within the data set m em.wl;stat.min
em_max Em_max Maximal wavelength represented within the data set m em.wl;stat.max
s_xel1 S_xel1 Number of elements (typically pixels) along the first spatial axis. N/A meta.number
s_xel2 S_xel2 Number of elements (typically pixels) along the second spatial axis. N/A meta.number

Columns that are parts of indices are marked like this.

Other

The following services may use the data contained in this table:

VOResource

VO nerds may sometimes need VOResource XML for this table.