Skip to content

Commit

Permalink
move to a function
Browse files Browse the repository at this point in the history
  • Loading branch information
debora-pe committed Aug 26, 2024
1 parent 6a0367e commit 2388003
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 56 deletions.
77 changes: 76 additions & 1 deletion pypeit/core/flexure.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
from astropy import stats
from astropy import units
from astropy.io import ascii
from astropy.table import Table
import scipy.signal
import scipy.optimize as opt
from scipy import interpolate
Expand All @@ -36,7 +37,7 @@
from pypeit.datamodel import DataContainer
from pypeit.images.detector_container import DetectorContainer
from pypeit.images.mosaic import Mosaic
from pypeit import specobj, specobjs
from pypeit import specobj, specobjs, spec2dobj
from pypeit import wavemodel

from IPython import embed
Expand Down Expand Up @@ -1394,6 +1395,80 @@ def sky_em_residuals(wave:np.ndarray, flux:np.ndarray,
return dwave[m], diff[m], diff_err[m], los[m], los_err[m]


def flexure_diagnostic(file, file_type='spec2d', flexure_type='spec', chk_version=False):
"""
Print the spectral or spatial flexure of a spec2d or spec1d file
Args:
file (:obj:`str`, `Path`_):
Filename of the spec2d or spec1d file to check
file_type (:obj:`str`, optional):
Type of the file to check. Options are 'spec2d' or 'spec1d'. Default is 'spec2d'.
flexure_type (:obj:`str`, optional):
Type of flexure to check. Options are 'spec' or 'spat'. Default is 'spec'.
chk_version (:obj:`bool`, optional):
If True, raise an error if the datamodel version or type check failed.
If False, throw a warning only. Default is False.
Returns:
:obj:`astropy.table.Table` or :obj:`float`:
- If file_type is 'spec2d' and flexure_type is 'spec', return a table with the spectral flexure
- If file_type is 'spec2d' and flexure_type is 'spat', return the spatial flexure
- If file_type is 'spec1d', return a table with the spectral flexure
"""

# value to return
return_flex = None

if file_type == 'spec2d':
# load the spec2d file
allspec2D = spec2dobj.AllSpec2DObj.from_fits(file, chk_version=chk_version)
# Loop on Detectors
for det in allspec2D.detectors:
print('')
print('=' * 50 + f'{det:^7}' + '=' * 51)
# get and print the spectral flexure
if flexure_type == 'spec':
spec_flex = allspec2D[det].sci_spec_flexure
spec_flex.rename_column('sci_spec_flexure', 'global_spec_shift')
if np.all(spec_flex['global_spec_shift'] != None):
spec_flex['global_spec_shift'].format = '0.3f'
# print the table
spec_flex.pprint_all()
# return the table
return_flex = spec_flex
# get and print the spatial flexure
if flexure_type == 'spat':
spat_flex = allspec2D[det].sci_spat_flexure
# print the value
print(f'Spat shift: {spat_flex}')
# return the value
return_flex = spat_flex
elif file_type == 'spec1d':
# no spat flexure in spec1d file
if flexure_type == 'spat':
msgs.error("Spat flexure not available in the spec1d file, try with a spec2d file")
# load the spec1d file
sobjs = specobjs.SpecObjs.from_fitsfile(file, chk_version=chk_version)
spec_flex = Table()
spec_flex['NAME'] = sobjs.NAME
spec_flex['global_spec_shift'] = sobjs.FLEX_SHIFT_GLOBAL
if np.all(spec_flex['global_spec_shift'] != None):
spec_flex['global_spec_shift'].format = '0.3f'
spec_flex['local_spec_shift'] = sobjs.FLEX_SHIFT_LOCAL
if np.all(spec_flex['local_spec_shift'] != None):
spec_flex['local_spec_shift'].format = '0.3f'
spec_flex['total_spec_shift'] = sobjs.FLEX_SHIFT_TOTAL
if np.all(spec_flex['total_spec_shift'] != None):
spec_flex['total_spec_shift'].format = '0.3f'
# print the table
spec_flex.pprint_all()
# return the table
return_flex = spec_flex

return return_flex


# TODO -- Consider separating the methods from the DataContainer as per calibrations
class MultiSlitFlexure(DataContainer):
"""
Expand Down
63 changes: 8 additions & 55 deletions pypeit/scripts/chk_flexure.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,12 @@ def get_parser(cls, width=None):
def main(args):

from IPython import embed
import numpy as np
from astropy.io import fits
from astropy.table import Table
from pypeit import spec2dobj, specobjs, msgs
from pypeit import msgs
from pypeit.core import flexure

chk_version = not args.try_old

# tables to return
return_tables = []

# Loop over the input files
for in_file in args.input_file:

Expand All @@ -47,61 +43,18 @@ def main(args):
head0 = hdul[0].header
file_type = None
if 'PYP_CLS' in head0.keys() and head0['PYP_CLS'].strip() == 'AllSpec2DObj':
file_type = 'AllSpec2D'
file_type = 'spec2d'
elif 'DMODCLS' in head0.keys() and head0['DMODCLS'].strip() == 'SpecObjs':
file_type = 'SpecObjs'
file_type = 'spec1d'
else:
msgs.error("Bad file type input!")

if file_type == 'AllSpec2D':
# load the spec2d file
allspec2D = spec2dobj.AllSpec2DObj.from_fits(in_file, chk_version=chk_version)
# Loop on Detectors
for det in allspec2D.detectors:
print('')
print('='*50 + f'{det:^7}' + '='*51)
# get and print the spectral flexure
if args.spec:
spec_flex = allspec2D[det].sci_spec_flexure
spec_flex.rename_column('sci_spec_flexure', 'global_spec_shift')
if np.all(spec_flex['global_spec_shift'] != None):
spec_flex['global_spec_shift'].format = '0.3f'
# print the table
spec_flex.pprint_all()
# return the table
return_tables.append(spec_flex)
# get and print the spatial flexure
if args.spat:
spat_flex = allspec2D[det].sci_spat_flexure
# print the value
print(f'Spat shift: {spat_flex}')
# return the value
return_tables.append(spat_flex)
elif file_type == 'SpecObjs':
# no spat flexure in spec1d file
if args.spat:
msgs.error("Spat flexure not available in the spec1d file, try with a spec2d file")
# load the spec1d file
sobjs = specobjs.SpecObjs.from_fitsfile(in_file, chk_version=chk_version)
spec_flex = Table()
spec_flex['NAME'] = sobjs.NAME
spec_flex['global_spec_shift'] = sobjs.FLEX_SHIFT_GLOBAL
if np.all(spec_flex['global_spec_shift'] != None):
spec_flex['global_spec_shift'].format = '0.3f'
spec_flex['local_spec_shift'] = sobjs.FLEX_SHIFT_LOCAL
if np.all(spec_flex['local_spec_shift'] != None):
spec_flex['local_spec_shift'].format = '0.3f'
spec_flex['total_spec_shift'] = sobjs.FLEX_SHIFT_TOTAL
if np.all(spec_flex['total_spec_shift'] != None):
spec_flex['total_spec_shift'].format = '0.3f'
# print the table
spec_flex.pprint_all()
# return the table
return_tables.append(spec_flex)

# Check the flexure
flexure.flexure_diagnostic(in_file, file_type=file_type, flexure_type='spat' if args.spat else 'spec',
chk_version=chk_version)

# space between files for clarity
print('')
return return_tables



Expand Down

0 comments on commit 2388003

Please sign in to comment.