marvin.tools.quantities.Map
)¶Map
is a single map for a single galaxy. The main data that it contains are the value
, ivar
, and mask
arrays of the map. It also has some meta data and convenience functions, such as plot()
, which wraps the marvin.utils.plot.map.plot()
method.
To get a map, we first need to create a marvin.tools.maps.Maps
object, which contains all of the maps for a galaxy.
from marvin.tools.maps import Maps
maps = Maps(plateifu='8485-1901')
By default, Maps
returns the unbinned maps SPX
, but we can also choose from additional bintypes (see the Technical Reference Manual for a more complete description of each bintype and the associated usage warnings):
SPX
- spaxels are unbinned,VOR10
- spaxels are Voronoi binned to a minimum continuum SNR of 10,NRE
- spaxels are binned into two radial bins, binning all spectra from 0-1 and 1-2 (elliptical Petrosian) effective radii, andALL
- all spectra binned together.maps = Maps(mangaid='1-209232', bintype='VOR10')
Once we have a Maps
object, we can “slice” it to get the H\(\alpha\) (Gaussian-fitted) flux map.
ha = maps['emline_gflux_ha_6564']
ha.plot()
Here maps['emline_gflux_ha_6564']
is shorthand for maps.getMap('emline_gflux', channel='ha_6564')
, where the property and channel are joined by an underscore (“_”). For properties without channels, such as stellar velocity, just use the property name like maps['stellar_vel']
.
ha = maps.getMap('emline_gflux', channel='ha_6564') # == maps['emline_gflux_ha_6564']
stvel = maps.getMap('stellar_vel') # == maps['stellar_vel']
New in 2.2.0: You can guess at the map property name (and channel), and Marvin will return the map if there is a unique (and valid) property and channel.
maps['gflux ha'] # == maps['emline_gflux_ha_6564']
maps['gvel oiii 5008'] # == maps[emline_gvel_oiii_5008]
maps['stellar sig'] # == maps['stellar_sigma']
# There are several properties of the Halpha line (velocity, sigma, etc.).
maps['ha'] # ValueError
# There are two [O III] lines.
maps['gflux oiii'] # ValueError
The values, inverse variances, and bitmasks of the map can be accessed via the value
, ivar
, and mask
attributes, respectively.
Important: These arrays are ordered as [row, column]
with the origin in the lower left, which corresponds to [y, x]
.
ha.value # (34, 34) array
ha.ivar # (34, 34) array
ha.mask # (34, 34) array --- same as ha.pixmask.mask
ha.value[17] # get the middle row (i.e., "y")
# array([ 0. , 0. , 0. , 0. ,
# 0. , 0. , 0.03650022, 0.03789879,
# 0.0838113 , 0.16109767, 0.57484451, 1.42108019,
# 2.98873795, 7.47787753, 14.08300415, 21.61707138,
# 28.37593542, 31.47541953, 28.29092958, 20.82737156,
# 13.33138178, 6.90730005, 3.70062335, 1.54131387,
# 0.55510055, 0.34234428, 0.21906664, 0.18621548,
# 0.1745672 , 0. , 0. , 0. ,
# 0. , 0. ])
The masked
attribute is a numpy masked array. The data
attribute is the value
array and the mask
attribute is a boolean array. mask
is True
for a given spaxel if any of the recommended bad data flags (NOCOV, UNRELIABLE, and DONOTUSE) are set (New in 2.2.0; previously, spaxels with any flags set were masked—i.e., where ha.mask > 0
).
ha.masked[17]
# masked_array(data = [-- -- -- -- -- -- -- 0.03789878599602308 0.08381129696903318
# 0.1610976667261473 0.5748445110902572 1.421080190438372 2.988737954927168
# 7.477877525388817 14.083004151791611 21.61707138246288 28.37593542372677
# 31.475419531155 28.290929579722462 20.827371557790272 13.331381776434451
# 6.907300050577721 3.7006233506234203 1.5413138678320422 0.5551005467482618
# 0.3423442819444342 0.2190666373241594 0.18621548081774594
# 0.17456719770757587 -- -- -- -- --],
# mask = [ True True True True True True True False False False False False
# False False False False False False False False False False False False
# False False False False False True True True True True],
# fill_value = 1e+20)
New in 2.2.0: For more fine-grained data quality control, you can select spaxels using pixmask
, which contains the mask
values, knows the MANGA_DAPPIXMASK
schema, and has convenience methods for converting between mask values, bit values, and labels.
See Maskbit (marvin.utils.general.maskbit.Maskbit) for details.
ha.pixmask
# <Maskbit 'MANGA_DAPPIXMASK'
#
# bit label description
# 0 0 NOCOV No coverage in this spaxel
# 1 1 LOWCOV Low coverage in this spaxel
# 2 2 DEADFIBER Major contributing fiber is dead
# 3 3 FORESTAR Foreground star
# 4 4 NOVALUE Spaxel was not fit because it did not meet sel...
# 5 5 UNRELIABLE Value is deemed unreliable; see TRM for defini...
# 6 6 MATHERROR Mathematical error in computing value
# 7 7 FITFAILED Attempted fit for property failed
# 8 8 NEARBOUND Fitted value is too near an imposed boundary; ...
# 9 9 NOCORRECTION Appropriate correction not available
# 10 10 MULTICOMP Multi-component velocity features present
# 11 30 DONOTUSE Do not use this spaxel for science>
ha.pixmask.mask # == ha.mask
ha.pixmask.bits # bits corresponding to mask array
ha.pixmask.labels # labels corresponding to mask array
Note: For MPL-5+, DONOTUSE is a consolidation of the flags NOCOV, LOWCOV, DEADFIBER, FORESTAR, NOVALUE, MATHERROR, FITFAILED, and NEARBOUND. For MPL-4, the MANGA_DAPPIXMASK
flag is simply 0 = good and 1 = bad (which roughly corresponds to DONOTUSE).
Map
¶For more in-depth discussion of using Map
, please see the following sections:
New in 2.2.0 Map
objects can be added, subtracted, multiplied, divided, or raised to a power.
ha = maps['emline_gflux_ha_6564']
nii = maps['emline_gflux_nii_6585']
sum_ = nii + ha
diff = nii - ha
prod = nii * ha
quot = nii / ha
pow_ = ha**0.5
prod
# <Marvin EnhancedMap>
# array([[ 0., 0., 0., ..., 0., 0., 0.],
# [ 0., 0., 0., ..., 0., 0., 0.],
# [ 0., 0., 0., ..., 0., 0., 0.],
# ...,
# [ 0., 0., 0., ..., 0., 0., 0.],
# [ 0., 0., 0., ..., 0., 0., 0.],
# [ 0., 0., 0., ..., 0., 0., 0.]]) 'erg2 / (cm4 s2 spaxel2)'
In addition to performing the arithmetic operation on the value
, the resulting EnhancedMap
has correctly propagated ivar
, mask
, pixmask
, unit
, and scale
.
One of the most useful features of Marvin is the tight integration of the Tools. From a Map
object we can access its parent Maps
object via the maps
attribute and meta data about the Property
via the property
attribute.
ha.maps == maps # True
ha.property
# <Property 'emline_gflux', release='2.0.2', channel='ha_6564', unit='erg / (cm2 s spaxel)'>
Finally, we can save()
our Map
object as a MaNGA pickle file (*.mpf
) and then restore()
it.
from marvin.tools.quantities import Map
ha.save(path='/path/to/save/directory/ha_8485-1901.mpf')
zombie_ha = Map.restore(path='/path/to/save/directory/ha_8485-1901.mpf')
# Spaxels not covered by the IFU
nocov = ha.pixmask.get_mask('NOCOV')
# Spaxels flagged as bad data
bad_data = ha.pixmask.get_mask(['UNRELIABLE', 'DONOTUSE'])
# Custom mask (flag data as DONOTUSE to hide in plotting)
custom_mask = (ha.value < 1e-17) * ha.pixmask.labels_to_value('DONOTUSE')
# Combine masks
my_mask = nocov | custom_mask
Class Inheritance Diagram
Class
marvin.tools.quantities.Map |
Describes 2D array object with addtional features. |
Methods
marvin.tools.quantities.Map.error |
Computes the standard deviation of the measurement. |
marvin.tools.quantities.Map.inst_sigma_correction () |
Correct for instrumental broadening. |
marvin.tools.quantities.Map.masked |
Return a masked array using the recommended masks. |
marvin.tools.quantities.Map.pixmask |
Maskbit instance for the MANGA_DAPPIXMASK flag. |
marvin.tools.quantities.Map.plot (*args, **kwargs) |
Make single panel map or one panel of multi-panel map plot. |
marvin.tools.quantities.Map.restore (path[, …]) |
Restore a Map object from a pickled file. |
marvin.tools.quantities.Map.save (path[, …]) |
Pickle the map to a file. |
marvin.tools.quantities.Map.snr |
Return the signal-to-noise ratio for each spaxel in the map. |