Source code for madcubapy.operations.maps.arithmetic
from astropy.nddata import CCDData
import astropy.units as u
import matplotlib.pyplot as plt
import numpy as np
from madcubapy.io import MadcubaMap
__all__ = [
'stack_maps',
]
[docs]
def stack_maps(*fitsmaps):
"""
Adds the data of multiple map objects (`~madcubapy.io.MadcubaMap` or
`~astropy.nddata.CCDData`) together and returns the result as a new map
object with the metadata of the first input map.
Parameters
----------
*fitsmaps : `~madcubapy.io.MadcubaMap` or `~astropy.nddata.CCDData`
Any number of map objects to be added together.
Returns
-------
combined_fitsmap : `~madcubapy.io.MadcubaMap` or `~astropy.nddata.CCDData`
A new map object containing the sum of the data of the input maps.
"""
# Ensure the input is not empty
if not fitsmaps:
raise ValueError("At least one map object must be provided.")
# Check map object type
first_type = type(fitsmaps[0])
if not all(type(obj) == first_type for obj in fitsmaps):
raise TypeError("Input parameters must be of the same type.")
elif (type(fitsmaps[0]) != MadcubaMap and type(fitsmaps[0]) != CCDData):
raise TypeError(
f"Input parameters must be {MadcubaMap} or {CCDData} types."
)
# Ensure all CCDData objects have the same shape
shape = fitsmaps[0].data.shape
for fitsmap in fitsmaps[1:]:
if fitsmap.data.shape != shape:
raise ValueError("All maps must have the same shape.")
# Ensure all CCDData objects have the same unit
unit = fitsmaps[0].unit
for fitsmap in fitsmaps[1:]:
if fitsmap.unit != unit:
fitsmap = fitsmap.to(unit)
# Create and return the new map object with combined data and the metadata
# from the first map object
combined_data = sum(fitsmap.data for fitsmap in fitsmaps)
if type(fitsmaps[0]) == MadcubaMap:
# Create new CCDData if present
if fitsmaps[0].ccddata:
new_ccddata = CCDData(
data=combined_data,
unit=unit,
meta=fitsmaps[0].ccddata.meta,
wcs=fitsmaps[0].ccddata.wcs,
)
else:
new_ccddata = None
# Use history table from first object if present
if fitsmaps[0].hist:
new_hist = fitsmaps[0].hist.copy()
else:
new_hist = None
# Create new madcubaMap
new_madcubamap = MadcubaMap(
data=combined_data,
header=fitsmaps[0].header,
wcs=fitsmaps[0].wcs,
unit=unit,
hist=new_hist,
ccddata=new_ccddata,
filename=fitsmaps[0].filename,
_update_hist_on_init=False,
_bypass_ccddata_conflict_check=True,
)
# Create history action
if all(obj.filename is not None for obj in fitsmaps):
stacked_maps_names = [obj.filename for obj in fitsmaps]
update_action = ("Stack maps. Files: '" +
"', '".join(stacked_maps_names) + "'")
else:
update_action = (
"Stack maps. Manually created objects with no files"
)
# Update history if present
if new_madcubamap.hist:
new_madcubamap._update_hist(update_action)
return new_madcubamap
else:
return CCDData(combined_data, unit=unit,
meta=fitsmaps[0].meta, wcs=fitsmaps[0].wcs)
return combined_fitsmap