Model Cube is a class to interact with a DAP model data cube for a galaxy.
ModelCube
behaves in much the same way as a Cube
. To initialize a ModelCube
, you can specify either a mangaid, plateifu, or filename as input. Marvin will attempt to open the file locally from a file, a database, or remotely over the API.
from marvin.tools.modelcube import ModelCube
modelcube = ModelCube(mangaid='1-209232')
print(modelcube)
<Marvin ModelCube (plateifu='8485-1901', mode='local', data_origin='db', bintype='SPX', template='GAU-MILESHC')>
By default, it will grab the unbinned modelcube. You can specify a different binning with the bintype
keyword.
modelcube = ModelCube(mangaid='1-209232', bintype='HYB10')
print(modelcube)
<Marvin ModelCube (plateifu='8485-1901', mode='local', data_origin='db', bintype='HYB10', template='GAU-MILESHC')>
You can quickly grab a spaxel/bin by slicing the ModelCube
like an array.
# grab the bin of the central spaxel
bin_cen = modelcube[17, 17]
print(bin_cen)
<Marvin Bin (plateifu=8485-1901, x=17, y=17; x_cen=0, y_cen=0, n_spaxels=1)>
n_spaxels
tells us there is only one spaxel in this bin. See Bin for more details on the Bin
class. The binned`flux` in this bin is available as an attribute. It is represented as a Marvin Spectrum, which is a Quantity. To quickly plot the flux, use the plot
method on the flux
.
# look at the binned flux
bin_cen.flux
<Spectrum [ 0.54676276, 0.46566465, 0.4622981 ,..., 0. ,
0. , 0. ] 1e-17 erg / (Angstrom cm2 s spaxel)>
# plot the binned flux
bin_cen.flux.plot()
The full model fit is available as the full_fit
attribute.
bin_cen.full_fit
<Spectrum [ 0., 0., 0.,..., 0., 0., 0.] 1e-17 erg / (cm2 s spaxel)>
# plot the model flux
bin_cen.full_fit.plot()
The ModelCube
data quality and targeting flags are available as the quality_flag
, target_flags
, and pixmask
attributes, respectively. These are represented as a Maskbit objects. A good quality ModelCube
has an empty (0) bit list.
# check the quality and bits
modelcube.quality_flag
<Maskbit 'MANGA_DAPQUAL' []>
modelcube.quality_flag.bits
[]
# check the targeting flags
modelcube.target_flags
[<Maskbit 'MANGA_TARGET1' ['SECONDARY_v1_1_0', 'SECONDARY_COM2', 'SECONDARY_v1_2_0']>,
<Maskbit 'MANGA_TARGET2' []>,
<Maskbit 'MANGA_TARGET3' []>]
# retrieve the modelcube pixel mask
modelcube.pixmask
<Maskbit 'MANGA_DAPSPECMASK' shape=(4563, 34, 34)>
The DAPall information is accessible via the dapall
attribute. It is a dictionary of the all the parameters from the DAPall file available for this target. Use dapall.keys()
to see all of the available parameters.
# grab the star-formation rate within the IFU field-of-view
modelcube.dapall['sfr_tot']
0.132697
# and the mean surface brightness within 1 effective radius
modelcube.dapall['sb_1re']
0.738855
A ModelCube
can be initialized in several ways, by filename, in which case it will always be in local
mode.
modelcube = ModelCube(filename='/Users/Brian/Work/Manga/analysis/v2_3_1/2.1.3/SPX-GAU-MILESHC/8485/1901/manga-8485-1901-LOGCUBE-SPX-GAU-MILESHC.fits.gz')
<Marvin ModelCube (plateifu='8485-1901', mode='local', data_origin='file', bintype='SPX', template='GAU-MILESHC')>
by plateifu or mangaid, in which case it attempts to find a local database, otherwise will open it in remote
mode.
modelcube = ModelCube(plateifu='8485-1901', bintype='HYB10')
<Marvin ModelCube (plateifu='8485-1901', mode='local', data_origin='db', bintype='HYB10', template='GAU-MILESHC')>
modelcube = ModelCube(mangaid='1-209232', bintype='HYB10')
<Marvin ModelCube (plateifu='8485-1901', mode='local', data_origin='db', bintype='HYB10', template='GAU-MILESHC')>
However you can also initialize a ModelCube
without the keyword argument and Marvin will attempt to figure out what input you mean.
modelcube = ModelCube('8485-1901', bintype='HYB10')
<Marvin ModelCube (plateifu='8485-1901', mode='local', data_origin='db', bintype='HYB10', template='GAU-MILESHC')>
Like ‘Cubes’, ModelCubes
come with some basic attributes attached, e.g. the full header, the WCS info, the bintype and template, and the NSA and DAPall catalog parameters.
# access the header
modelcube.header
# access the wcs
modelcube.wcs
# the NSA catalog information
modelcube.nsa['z']
0.0407447
# the DAPall catalog info
modelcube.dapall['sfr_tot']
0.132697
ModelCube
also has the DAP data quality, targeting, and pixel masks available as the quality_flag
, target_flags
, and pixmask
attributes, respectively. These are represented as a Maskbit objects.
The DAP datamodel is attached to ModelCube
as the datamodel
attribute. The datamodel describes the contents of the MaNGA DAP ModelCube, for a given release. This is a subset of the full DAP datamodel only pertaining to ModelCubes.
# display the datamodel for DAP ModelCubes
modelcube.datamodel
[<Model 'binned_flux', release='2.1.3', unit=u'1e-17 erg / (cm2 s spaxel)'>,
<Model 'full_fit', release='2.1.3', unit=u'1e-17 erg / (cm2 s spaxel)'>,
<Model 'emline_fit', release='2.1.3', unit=u'1e-17 erg / (cm2 s spaxel)'>,
<Model 'emline_base_fit', release='2.1.3', unit=u'1e-17 erg / (cm2 s spaxel)'>]
Each Model
describes its contents, units, and a description of what it is.
# look at the binned flux
modelcube.datamodel['binned_flux'].description
'Flux of the binned spectra'
# or the full_fit
modelcube.datamodel['full_fit'].description
'The best fitting model spectra (sum of the fitted continuum and emission-line models)'
Each Model
also contains (and uses) the specific binid channel appropriate for that model. binned_flux
and full_fit
use the binned_spectra
binids, while the emline
models use the em_line_models
binids.
modelcube.datamodel['binned_flux'].binid
<Property 'binid', channel='binned_spectra', release='2.1.3', unit=u''>
modelcube.datamodel['emline_fit'].binid
<Property 'binid', channel='em_line_models', release='2.1.3', unit=u''>
These are the available models used by DAP. Each Model is 3-d DataCube representation of the data within a DAP Cube. These models are available as attributes on your ModelCube
object.
All Models
are DataCubes
, which behave as Quantities.
# access the binned modelcube flux
modelcube.binned_flux
<DataCube [[[ 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.]]] 1e-17 erg / (cm2 s spaxel)>
The underlying numpy array data is always available as using the value
attribute. They also may have available wavelength
, ivar
and mask
attached.
# get the wavelength
modelcube.binned_flux.wavelength
<Quantity [ 3621.6 , 3622.43, 3623.26,..., 10349. , 10351.4 , 10353.8 ] Angstrom>
# get the ivar and mask as well
modelcube.binned_flux.ivar
modelcube.binned_flux.mask
If you slice the DataCube
you get a Spectrum
or another DataCube
subset back.
# extract a single spectrum
modelcube.binned_flux[:,17,17]
<Spectrum [ 0.546763, 0.465665, 0.462298,..., 0. , 0. , 0. ] 1e-17 erg / (cm2 s spaxel)>
# extract a small cube around the center
subset_cen = modelcube.binned_flux[:,15:19,15:19]
print(subset_cen)
<DataCube [[[ 0.219631, 0.318331, 0.399484, 0.403951],
[ 0.288857, 0.419139, 0.517818, 0.552242],
[ 0.324734, 0.432396, 0.546763, 0.585823],
[ 0.310136, 0.395239, 0.486763, 0.48839 ]],
...,
[[ 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ]]] 1e-17 erg / (cm2 s spaxel)>
For binned ModelCubes
, you can retrieve a 2-d array of the binids using the get_binid
method. For MPL-5, get_binid
returns the binids from the BINID extension in the DAP files, while for MPL-6, by default, get_binid
will return the binids for the binned_spectra
channel of BINID.
# get the default binids
modelcube.get_binid()
array([[-1, -1, -1, ..., -1, -1, -1],
[-1, -1, -1, ..., -1, -1, -1],
[-1, -1, -1, ..., -1, -1, -1],
...,
[-1, -1, -1, ..., -1, -1, -1],
[-1, -1, -1, ..., -1, -1, -1],
[-1, -1, -1, ..., -1, -1, -1]])
MPL-6 has new cubes using hybrid binning, **HYB10**, with alternate binning schemes. These are already built into the `Models`. `get_binid` can retrieve those with the `model` keyword.
::
# grab the binids for the emline_fit model
emline_binids = modelcube.get_binid(model=modelcube.datamodel['emline_fit'])
print(emline_binids)
array([[-1, -1, -1, ..., -1, -1, -1],
[-1, -1, -1, ..., -1, -1, -1],
[-1, -1, -1, ..., -1, -1, -1],
...,
[-1, -1, -1, ..., -1, -1, -1],
[-1, -1, -1, ..., -1, -1, -1],
[-1, -1, -1, ..., -1, -1, -1]])
If working with a unbinned ModelCube
, slicing and getSpaxel
will retrieve and return a Spaxel object, and behaves exactly the same as a Marvin Cube. For binned objects, slicing and extracting returns a Bin object instead. It behaves exactly the same as Spaxel
except it now contains a list of spaxels belonging to that bin.
You can slice like an array
# slice a modelcube by i, j
bin_cen = modelcube[17, 17]
<Marvin Bin (plateifu=8485-1901, x=17, y=17; x_cen=0, y_cen=0, n_spaxels=1)>
# central bin id
bin_cen.binid
0.0
The central bin only contains on spaxel. Let’s go off-center.
# grab the bin for the array element 10, 10
newbin = modelcube[10,10]
print(newbin)
<Marvin Bin (plateifu=8485-1901, x=10, y=10; x_cen=-7, y_cen=-7, n_spaxels=20)>
# binid and bin SN
newbin.binid, newbin.bin_snr
(35.0, <AnalysisProperty 3.77872>)
This new bin has id 35, a signal-to-noise of ~4 and contains 20 spaxels. The spaxels
attribute contains a list of all spaxels within this binid.
newbin.spaxels
[<Marvin Spaxel (x=9, y=10, loaded=False),
<Marvin Spaxel (x=9, y=11, loaded=False),
<Marvin Spaxel (x=10, y=8, loaded=False),
<Marvin Spaxel (x=10, y=9, loaded=False),
<Marvin Spaxel (x=10, y=10, loaded=False),
<Marvin Spaxel (x=10, y=11, loaded=False),
<Marvin Spaxel (x=10, y=12, loaded=False),
<Marvin Spaxel (x=11, y=9, loaded=False),
<Marvin Spaxel (x=11, y=10, loaded=False),
<Marvin Spaxel (x=11, y=11, loaded=False),
<Marvin Spaxel (x=11, y=12, loaded=False),
<Marvin Spaxel (x=12, y=8, loaded=False),
<Marvin Spaxel (x=12, y=9, loaded=False),
<Marvin Spaxel (x=12, y=10, loaded=False),
<Marvin Spaxel (x=12, y=11, loaded=False),
<Marvin Spaxel (x=12, y=12, loaded=False),
<Marvin Spaxel (x=13, y=9, loaded=False),
<Marvin Spaxel (x=13, y=10, loaded=False),
<Marvin Spaxel (x=13, y=11, loaded=False),
<Marvin Spaxel (x=13, y=12, loaded=False)]
You can save a ModelCube
locally as a Python pickle object, using the save
method.
modelcube.save('mymodelcube.mpf')
as well as restore a ModelCube pickle object using the restore
class method
from marvin.tools.modelcube import ModelCube
modelcube = ModelCube.restore('mymodelcube.mpf')
Class Inheritance Diagram
Class
marvin.tools.modelcube.ModelCube ([input, …]) |
A class to interface with MaNGA DAP model cubes. |
Methods
marvin.tools.modelcube.ModelCube.get_binid ([model]) |
Returns the 2D array for the binid map associated with model . |
marvin.tools.modelcube.ModelCube.get_unbinned () |
Returns a version of self corresponding to the unbinned ModelCube. |
marvin.tools.modelcube.ModelCube.getCube () |
Returns the associated Cube . |
marvin.tools.modelcube.ModelCube.getMaps () |
Returns the associated`~marvin.tools.maps.Maps`. |
marvin.tools.modelcube.ModelCube.getSpaxel ([…]) |
Returns the Spaxel matching certain coordinates. |
marvin.tools.modelcube.ModelCube.download () |
Downloads the cube using sdss_access - Rsync |
marvin.tools.modelcube.ModelCube.save ([…]) |
Pickles the object. |
marvin.tools.modelcube.ModelCube.restore (path) |
Restores a MarvinToolsClass object from a pickled file. |