From 409a31a5e9ad017930b70c1a79587220bcf68dff Mon Sep 17 00:00:00 2001 From: profxj Date: Sat, 3 Jun 2023 10:22:26 -0700 Subject: [PATCH 1/7] progress --- pypeit/spectrographs/mdm_osmos.py | 124 ++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) diff --git a/pypeit/spectrographs/mdm_osmos.py b/pypeit/spectrographs/mdm_osmos.py index f3f46795bb..fee844797a 100644 --- a/pypeit/spectrographs/mdm_osmos.py +++ b/pypeit/spectrographs/mdm_osmos.py @@ -227,3 +227,127 @@ def check_frame_type(self, ftype, fitstbl, exprng=None): msgs.warn('Cannot determine if frames are of type {0}.'.format(ftype)) return np.zeros(len(fitstbl), dtype=bool) + +class MDMOSMOSR4KSpectrograph(MDMOSMOSMDM4KSpectrograph): + """ + Child to handle MDM OSMOS R4K instrument+detector + """ + ndet = 1 + name = 'mdm_osmos_r4k' + telescope = telescopes.KPNOTelescopePar() + camera = 'R4K' + url = 'https://www.astronomy.ohio-state.edu/martini.10/osmos/' + header_name = 'OSMOS' + supported = True + comment = 'MDM OSMOS spectrometer for the red' + + def get_detector_par(self, det, hdu=None): + """ + Return metadata for the selected detector. + + THIS IS FOR WINDOWED SCIENCE FRAMES + AND WE ARE HACKING THE CALIBS + + Args: + det (:obj:`int`): + 1-indexed detector number. + hdu (`astropy.io.fits.HDUList`_, optional): + The open fits file with the raw image of interest. If not + provided, frame-dependent parameters are set to a default. + + Returns: + :class:`~pypeit.images.detector_container.DetectorContainer`: + Object with the detector metadata. + """ + # Detector 1 + detector_dict = dict( + binning = '1,1' if hdu is None + else self.get_meta_value(self.get_headarr(hdu), 'binning'), + det=1, + dataext = 0, + specaxis = 1, + specflip = True, + spatflip = False, + xgap = 0., + ygap = 0., + ysize = 1., + platescale = 0.273, + mincounts = -1e10, + darkcurr = 0.0, + saturation = 65535., + nonlinear = 0.86, + numamplifiers = 4, + gain = np.atleast_1d([2.2, 2.2, 2.2, 2.2]), + ronoise = np.atleast_1d([3.0, 3.0, 3.0, 3.0]), + datasec = np.atleast_1d(['[:524,33:2064]', '[524:,33:2064]', + '[:524, 2065:4092', '[524:, 2065:4092']), + oscansec = np.atleast_1d(['[:524, 1:32]', '[524:, 1:32]', + '[:524, 4128:]', '[524:, 4128:]']), + ) + # Return + return detector_container.DetectorContainer(**detector_dict) + + def check_frame_type(self, ftype, fitstbl, exprng=None): + """ + Check for frames of the provided type. + + Args: + ftype (:obj:`str`): + Type of frame to check. Must be a valid frame type; see + frame-type :ref:`frame_type_defs`. + fitstbl (`astropy.table.Table`_): + The table with the metadata for one or more frames to check. + exprng (:obj:`list`, optional): + Range in the allowed exposure time for a frame of type + ``ftype``. See + :func:`pypeit.core.framematch.check_frame_exptime`. + + Returns: + `numpy.ndarray`_: Boolean array with the flags selecting the + exposures in ``fitstbl`` that are ``ftype`` type frames. + """ + good_exp = framematch.check_frame_exptime(fitstbl['exptime'], exprng) + if ftype in ['science', 'standard']: + return good_exp & (fitstbl['idname'] == 'OBJECT') + if ftype == 'bias': + return good_exp & (fitstbl['idname'] == 'zero') + if ftype in ['pixelflat', 'trace']: + return good_exp & (fitstbl['lampstat01'] == 'Flat') & (fitstbl['idname'] == 'FLAT') + if ftype in ['pinhole', 'dark']: + # Don't type pinhole or dark frames + return np.zeros(len(fitstbl), dtype=bool) + if ftype in ['arc','tilt']: + return good_exp & (fitstbl['idname'] == 'COMP') + msgs.warn('Cannot determine if frames are of type {0}.'.format(ftype)) + return np.zeros(len(fitstbl), dtype=bool) + + @classmethod + def default_pypeit_par(cls): + """ + Return the default parameters to use for this instrument. + + Returns: + :class:`~pypeit.par.pypeitpar.PypeItPar`: Parameters required by + all of PypeIt methods. + """ + par = super().default_pypeit_par() + + # Ignore PCA + par['calibrations']['slitedges']['sync_predict'] = 'nearest' + + # Set pixel flat combination method + par['calibrations']['pixelflatframe']['process']['combine'] = 'median' + # Wavelength calibration methods + par['calibrations']['wavelengths']['method'] = 'full_template' + par['calibrations']['wavelengths']['lamps'] = ['HgI', 'NeI'] + #par['calibrations']['wavelengths']['reid_arxiv'] = 'mdm_osmos_mdm4k.fits' + par['calibrations']['wavelengths']['sigdetect'] = 10.0 + # Set the default exposure time ranges for the frame typing + par['calibrations']['biasframe']['exprng'] = [None, 1] + par['calibrations']['darkframe']['exprng'] = [999999, None] # No dark frames + par['calibrations']['pinholeframe']['exprng'] = [999999, None] # No pinhole frames + par['calibrations']['arcframe']['exprng'] = [None, None] # Long arc exposures on this telescope + par['calibrations']['standardframe']['exprng'] = [None, 120] + par['scienceframe']['exprng'] = [90, None] + + return par \ No newline at end of file From 3a77f1f25285e1cfd8a8d475166661f757ed47ba Mon Sep 17 00:00:00 2001 From: profxj Date: Sat, 3 Jun 2023 11:13:26 -0700 Subject: [PATCH 2/7] cookin! --- pypeit/core/wavecal/autoid.py | 5 +++-- .../arc_lines/reid_arxiv/mdm_osmos_r4k.fits | Bin 0 -> 72000 bytes pypeit/spectrographs/mdm_osmos.py | 9 +++++++-- pypeit/wavecalib.py | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 pypeit/data/arc_lines/reid_arxiv/mdm_osmos_r4k.fits diff --git a/pypeit/core/wavecal/autoid.py b/pypeit/core/wavecal/autoid.py index 41d48dfd48..8503c99f11 100644 --- a/pypeit/core/wavecal/autoid.py +++ b/pypeit/core/wavecal/autoid.py @@ -663,7 +663,8 @@ def set_fwhm(par, measured_fwhm=None): return fwhm -def full_template(spec, lamps, par, ok_mask, det, binspectral, nsnippet=2, +def full_template(spec, lamps, par, ok_mask, det, binspectral, + nsnippet=2, measured_fwhms=None, debug_xcorr=False, debug_reid=False, x_percentile=50., template_dict=None, debug=False, nonlinear_counts=1e10): @@ -785,7 +786,7 @@ def full_template(spec, lamps, par, ok_mask, det, binspectral, nsnippet=2, ax = plt.gca() # ax.plot(xvals, tspec, label='template') # Template - ax.plot(xvals, np.roll(pspec, int(shift_cc)), 'k', label='input') # Input + ax.plot(xvals, np.roll(pad_spec, int(shift_cc)), 'k', label='input') # Input ax.legend() plt.show() #embed(header='909 autoid') diff --git a/pypeit/data/arc_lines/reid_arxiv/mdm_osmos_r4k.fits b/pypeit/data/arc_lines/reid_arxiv/mdm_osmos_r4k.fits new file mode 100644 index 0000000000000000000000000000000000000000..8a91a77a24e2a8846c7f354b909efb30c9d01ac4 GIT binary patch literal 72000 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 literal 0 HcmV?d00001 diff --git a/pypeit/spectrographs/mdm_osmos.py b/pypeit/spectrographs/mdm_osmos.py index fee844797a..f87773e7ec 100644 --- a/pypeit/spectrographs/mdm_osmos.py +++ b/pypeit/spectrographs/mdm_osmos.py @@ -334,14 +334,19 @@ def default_pypeit_par(cls): # Ignore PCA par['calibrations']['slitedges']['sync_predict'] = 'nearest' + # Bound the detector with slit edges if no edges are found + par['calibrations']['slitedges']['bound_detector'] = True # Set pixel flat combination method par['calibrations']['pixelflatframe']['process']['combine'] = 'median' # Wavelength calibration methods par['calibrations']['wavelengths']['method'] = 'full_template' + #par['calibrations']['wavelengths']['method'] = 'reidentify' par['calibrations']['wavelengths']['lamps'] = ['HgI', 'NeI'] - #par['calibrations']['wavelengths']['reid_arxiv'] = 'mdm_osmos_mdm4k.fits' - par['calibrations']['wavelengths']['sigdetect'] = 10.0 + par['calibrations']['wavelengths']['reid_arxiv'] = 'mdm_osmos_r4k.fits' + par['calibrations']['wavelengths']['sigdetect'] = 5.0 + par['calibrations']['wavelengths']['nsnippet'] = 1 + par['calibrations']['wavelengths']['fwhm_fromlines'] = True # Set the default exposure time ranges for the frame typing par['calibrations']['biasframe']['exprng'] = [None, 1] par['calibrations']['darkframe']['exprng'] = [999999, None] # No dark frames diff --git a/pypeit/wavecalib.py b/pypeit/wavecalib.py index 6f1ef90fab..f9dafe744f 100644 --- a/pypeit/wavecalib.py +++ b/pypeit/wavecalib.py @@ -558,7 +558,7 @@ def build_wv_calib(self, arccen, method, skip_QA=False): final_fit = autoid.full_template(arccen, self.lamps, self.par, ok_mask_idx, self.det, self.binspectral, measured_fwhms=measured_fwhms, nonlinear_counts=self.nonlinear_counts, - nsnippet=self.par['nsnippet']) + nsnippet=self.par['nsnippet'])#, #debug=True, debug_reid=True, debug_xcorr=True) elif self.par['method'] == 'echelle': # TODO -- Merge this with reidentify for fixed echelle formats From a336074c84a135aaca2082cdfd83d8bc2be9aefb Mon Sep 17 00:00:00 2001 From: profxj Date: Tue, 20 Jun 2023 11:24:56 -0700 Subject: [PATCH 3/7] odd even bias --- pypeit/core/procimg.py | 29 +++++++++++++++++++++++++---- pypeit/images/rawimage.py | 13 +++++++------ pypeit/par/pypeitpar.py | 2 +- pypeit/spectrographs/mdm_osmos.py | 10 +++++++--- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/pypeit/core/procimg.py b/pypeit/core/procimg.py index ef2c2cce29..ac154ca84e 100644 --- a/pypeit/core/procimg.py +++ b/pypeit/core/procimg.py @@ -16,7 +16,6 @@ from pypeit import msgs from pypeit import utils -from pypeit.core import parse # NOTE: This is slower than utils.rebin_evlist by a factor of ~2, but avoids an @@ -589,7 +588,14 @@ def rect_slice_with_mask(image, mask, mask_val=1): def subtract_overscan(rawframe, datasec_img, oscansec_img, method='savgol', params=[5,65], var=None): """ - Subtract overscan. + Subtract the overscan + + Possible values of ``method``: + - polynomial: Fit a polynomial to the overscan region and subtract it. + - savgol: Use a Savitzky-Golay filter to fit the overscan region and + subtract it. + - median: Use the median of the overscan region to subtract it. + - odd_even: Use the median of the odd and even rows/columns to subtract (MDM/OSMOS) Args: rawframe (`numpy.ndarray`_): @@ -622,11 +628,11 @@ def subtract_overscan(rawframe, datasec_img, oscansec_img, method='savgol', para Returns: :obj:`tuple`: The input frame with the overscan region subtracted and an estimate of the variance in the overscan subtraction; both have the same - shape as the input ``rawframe``. If ``var`` is no provided, the 2nd + shape as the input ``rawframe``. If ``var`` is not provided, the 2nd returned object is None. """ # Check input - if method.lower() not in ['polynomial', 'savgol', 'median']: + if method.lower() not in ['polynomial', 'savgol', 'median', 'odd_even']: msgs.error(f'Unrecognized overscan subtraction method: {method}') if rawframe.ndim != 2: msgs.error('Input raw frame must be 2D.') @@ -671,6 +677,7 @@ def subtract_overscan(rawframe, datasec_img, oscansec_img, method='savgol', para # to the error in the mean osvar = np.pi/2*(np.sum(osvar)/osvar.size**2 if method.lower() == 'median' else np.sum(osvar, axis=compress_axis)/osvar.shape[compress_axis]**2) + # Method time if method.lower() == 'polynomial': # TODO: Use np.polynomial.polynomial.polyfit instead? c = np.polyfit(np.arange(osfit.size), osfit, params[0]) @@ -683,12 +690,26 @@ def subtract_overscan(rawframe, datasec_img, oscansec_img, method='savgol', para if var is not None: _var[data_slice] = osvar continue + ossub = np.zeros_like(osfit) + elif method.lower() == 'odd_even': + ossub = np.zeros_like(osfit) + # Odd/even + if compress_axis == 1: + odd = np.median(overscan[:,1::2], axis=compress_axis) + even = np.median(overscan[:,0::2], axis=compress_axis) + # Do it + no_overscan[data_slice][:,1::2] -= odd[:,None] + no_overscan[data_slice][:,0::2] -= even[:,None] + else: + msgs.error('Not ready for this yet') + # Subtract along the appropriate axis no_overscan[data_slice] -= (ossub[:, None] if compress_axis == 1 else ossub[None, :]) if var is not None: _var[data_slice] = (osvar[:,None] if compress_axis == 1 else osvar[None,:]) + # Return return no_overscan, _var diff --git a/pypeit/images/rawimage.py b/pypeit/images/rawimage.py index 7b3f1d8c07..e3a05eb747 100644 --- a/pypeit/images/rawimage.py +++ b/pypeit/images/rawimage.py @@ -1012,6 +1012,8 @@ def subtract_overscan(self, force=False): """ Analyze and subtract the overscan from the image + If this is a mosaic, loop over the indvidual detectors + Args: force (:obj:`bool`, optional): Force the image to be overscan subtracted, even if the step log @@ -1031,12 +1033,11 @@ def subtract_overscan(self, force=False): for i in range(self.nimg): # Subtract the overscan. var is the variance in the overscan # subtraction. - _os_img[i], var[i] = procimg.subtract_overscan(self.image[i], self.datasec_img[i], - self.oscansec_img[i], - method=self.par['overscan_method'], - params=self.par['overscan_par'], - var=None if self.rn2img is None - else self.rn2img[i]) + _os_img[i], var[i] = procimg.subtract_overscan( + self.image[i], self.datasec_img[i], self.oscansec_img[i], + method=self.par['overscan_method'], + params=self.par['overscan_par'], + var=None if self.rn2img is None else self.rn2img[i]) self.image = np.array(_os_img) # Parse the returned value if self.rn2img is not None: diff --git a/pypeit/par/pypeitpar.py b/pypeit/par/pypeitpar.py index dc62c62b4d..17d7f5dd9c 100644 --- a/pypeit/par/pypeitpar.py +++ b/pypeit/par/pypeitpar.py @@ -454,7 +454,7 @@ def valid_overscan_methods(): """ Return the valid overscan methods. """ - return ['polynomial', 'savgol', 'median'] + return ['polynomial', 'savgol', 'median', 'odd_even'] @staticmethod def valid_combine_methods(): diff --git a/pypeit/spectrographs/mdm_osmos.py b/pypeit/spectrographs/mdm_osmos.py index ea5e1c35c0..74b39da87c 100644 --- a/pypeit/spectrographs/mdm_osmos.py +++ b/pypeit/spectrographs/mdm_osmos.py @@ -80,6 +80,7 @@ def default_pypeit_par(cls): """ par = super().default_pypeit_par() + # Ignore PCA par['calibrations']['slitedges']['sync_predict'] = 'nearest' @@ -240,12 +241,11 @@ class MDMOSMOSR4KSpectrograph(MDMOSMOSMDM4KSpectrograph): """ ndet = 1 name = 'mdm_osmos_r4k' - telescope = telescopes.KPNOTelescopePar() camera = 'R4K' url = 'https://www.astronomy.ohio-state.edu/martini.10/osmos/' header_name = 'OSMOS' supported = True - comment = 'MDM OSMOS spectrometer for the red' + comment = 'MDM OSMOS spectrometer for the red. Requires calibratoins windowed down to the science frame.' def get_detector_par(self, det, hdu=None): """ @@ -288,7 +288,7 @@ def get_detector_par(self, det, hdu=None): datasec = np.atleast_1d(['[:524,33:2064]', '[524:,33:2064]', '[:524, 2065:4092', '[524:, 2065:4092']), oscansec = np.atleast_1d(['[:524, 1:32]', '[524:, 1:32]', - '[:524, 4128:]', '[524:, 4128:]']), + '[:524, 4129:]', '[524:, 4129:]']), ) # Return return detector_container.DetectorContainer(**detector_dict) @@ -338,6 +338,10 @@ def default_pypeit_par(cls): """ par = super().default_pypeit_par() + # Do not require bias frames + turn_off = dict(use_biasimage=False, overscan_method='odd_even') + par.reset_all_processimages_par(**turn_off) + # Ignore PCA par['calibrations']['slitedges']['sync_predict'] = 'nearest' # Bound the detector with slit edges if no edges are found From 3f3ff962e9f2177d1166eceb7d8b77ec0ffda191 Mon Sep 17 00:00:00 2001 From: profxj Date: Sat, 21 Oct 2023 05:48:38 -0700 Subject: [PATCH 4/7] doc --- doc/spectrographs/mdm_osmos.rst | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 doc/spectrographs/mdm_osmos.rst diff --git a/doc/spectrographs/mdm_osmos.rst b/doc/spectrographs/mdm_osmos.rst new file mode 100644 index 0000000000..da4c20a549 --- /dev/null +++ b/doc/spectrographs/mdm_osmos.rst @@ -0,0 +1,20 @@ +********* +MDM OSMOS +********* + + +Overview +======== + +This file summarizes items related to MDM OSMOS + + +R4K +=== + +It is common for only a portion of +the data one receives to have been +winowed. You may therefore need to +window the rest. There is a Notebook +in the DevSuite that shows an example of +how to do this. \ No newline at end of file From 7e5d029dbef442a51f13aca279fc5265b6dc0f15 Mon Sep 17 00:00:00 2001 From: profxj Date: Sat, 21 Oct 2023 05:49:12 -0700 Subject: [PATCH 5/7] release --- doc/releases/1.14.1dev.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/releases/1.14.1dev.rst b/doc/releases/1.14.1dev.rst index 8c59aae6af..c990a1efe9 100644 --- a/doc/releases/1.14.1dev.rst +++ b/doc/releases/1.14.1dev.rst @@ -51,5 +51,6 @@ Bug Fixes detector for Keck/LRIS RED. - Fixed a bug with the ``pypeit_identify`` script when using echelle data. Previously, the sigdetect parameter was a list of all orders, instead of a single value. +- Add support for the R4K detector for MDM OSMOS From 064e7f83f19992021f4c9e430b584ecec2563198 Mon Sep 17 00:00:00 2001 From: Ryan Cooke Date: Sat, 21 Oct 2023 16:38:51 +0100 Subject: [PATCH 6/7] Update mdm_osmos.rst fixed typo --- doc/spectrographs/mdm_osmos.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/spectrographs/mdm_osmos.rst b/doc/spectrographs/mdm_osmos.rst index da4c20a549..342376bbbb 100644 --- a/doc/spectrographs/mdm_osmos.rst +++ b/doc/spectrographs/mdm_osmos.rst @@ -14,7 +14,7 @@ R4K It is common for only a portion of the data one receives to have been -winowed. You may therefore need to +windowed. You may therefore need to window the rest. There is a Notebook in the DevSuite that shows an example of -how to do this. \ No newline at end of file +how to do this. From 3892870ca3cfdf503e9d33be103bebc0d1ee507b Mon Sep 17 00:00:00 2001 From: "J. Xavier Prochaska" Date: Mon, 23 Oct 2023 15:34:32 -0700 Subject: [PATCH 7/7] PR edits (a few more to come) --- doc/releases/1.14.1dev.rst | 2 +- pypeit/core/procimg.py | 3 +-- pypeit/images/rawimage.py | 2 +- pypeit/spectrographs/mdm_osmos.py | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/doc/releases/1.14.1dev.rst b/doc/releases/1.14.1dev.rst index 0cea29e2e6..4d12c48d19 100644 --- a/doc/releases/1.14.1dev.rst +++ b/doc/releases/1.14.1dev.rst @@ -24,6 +24,7 @@ Functionality/Performance Improvements and Additions - Add a sensible error message to the pypeit Spectrum1D loaders in the event a user inadvertently tries to use Spectrum1D instead of SpectrumList for a ``spec1d`` file. +- Add support for the R4K detector for MDM OSMOS Instrument-specific Updates --------------------------- @@ -59,6 +60,5 @@ Bug Fixes detector for Keck/LRIS RED. - Fixed a bug with the ``pypeit_identify`` script when using echelle data. Previously, the sigdetect parameter was a list of all orders, instead of a single value. -- Add support for the R4K detector for MDM OSMOS diff --git a/pypeit/core/procimg.py b/pypeit/core/procimg.py index 0435a909a1..e3859107f7 100644 --- a/pypeit/core/procimg.py +++ b/pypeit/core/procimg.py @@ -690,7 +690,6 @@ def subtract_overscan(rawframe, datasec_img, oscansec_img, method='savgol', para if var is not None: _var[data_slice] = osvar continue - ossub = np.zeros_like(osfit) elif method.lower() == 'odd_even': ossub = np.zeros_like(osfit) # Odd/even @@ -701,7 +700,7 @@ def subtract_overscan(rawframe, datasec_img, oscansec_img, method='savgol', para no_overscan[data_slice][:,1::2] -= odd[:,None] no_overscan[data_slice][:,0::2] -= even[:,None] else: - msgs.error('Not ready for this yet') + msgs.error('Not ready for this approach, please contact the Developers') # Subtract along the appropriate axis diff --git a/pypeit/images/rawimage.py b/pypeit/images/rawimage.py index 8c5bbf845f..2fef930a52 100644 --- a/pypeit/images/rawimage.py +++ b/pypeit/images/rawimage.py @@ -1017,7 +1017,7 @@ def subtract_overscan(self, force=False): """ Analyze and subtract the overscan from the image - If this is a mosaic, loop over the indvidual detectors + If this is a mosaic, loop over the individual detectors Args: force (:obj:`bool`, optional): diff --git a/pypeit/spectrographs/mdm_osmos.py b/pypeit/spectrographs/mdm_osmos.py index 1af60b5557..14fb845f11 100644 --- a/pypeit/spectrographs/mdm_osmos.py +++ b/pypeit/spectrographs/mdm_osmos.py @@ -245,7 +245,7 @@ class MDMOSMOSR4KSpectrograph(MDMOSMOSMDM4KSpectrograph): url = 'https://www.astronomy.ohio-state.edu/martini.10/osmos/' header_name = 'OSMOS' supported = True - comment = 'MDM OSMOS spectrometer for the red. Requires calibratoins windowed down to the science frame.' + comment = 'MDM OSMOS spectrometer for the red. Requires calibrations windowed down to the science frame.' def get_detector_par(self, det, hdu=None): """