From 36c4f715cae3d5fa1352b475997027dd9b48ac7d Mon Sep 17 00:00:00 2001 From: Milan Roberson Date: Tue, 18 Jun 2024 12:38:32 -0700 Subject: [PATCH 1/9] use LDTDeVeny basic get_rawimage The control system for P200/DBSP automatically adjusts the FITS headers for datasec/oscansec based on the binning, so `get_rawimage` doesn't need to adjust the data sections based on binning. further info in commit 5f567d3 --- pypeit/spectrographs/p200_dbsp.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pypeit/spectrographs/p200_dbsp.py b/pypeit/spectrographs/p200_dbsp.py index 0ea3032236..5e84e52598 100644 --- a/pypeit/spectrographs/p200_dbsp.py +++ b/pypeit/spectrographs/p200_dbsp.py @@ -19,6 +19,7 @@ from pypeit.spectrographs import spectrograph from pypeit.core import parse from pypeit.images import detector_container +from pypeit.spectrographs.ldt_deveny import LDTDeVenySpectrograph def flip_fits_slice(s: str) -> str: @@ -168,6 +169,9 @@ def check_frame_type(self, ftype, fitstbl, exprng=None): return good_exp & (fitstbl['lampstat01'] != '0000000') & (fitstbl['idname'] == 'cal') msgs.warn('Cannot determine if frames are of type {0}.'.format(ftype)) return np.zeros(len(fitstbl), dtype=bool) + + def get_rawimage(self, raw_file, det): + return LDTDeVenySpectrograph.get_rawimage(self, raw_file, det) class P200DBSPBlueSpectrograph(P200DBSPSpectrograph): From cd87c4e46d293e080d3978f5bc050967aafa8a88 Mon Sep 17 00:00:00 2001 From: Milan Roberson Date: Mon, 2 Sep 2024 17:37:23 -0700 Subject: [PATCH 2/9] add 1200/7100 D55 arxived solution --- .../wavecal/spectrographs/templ_p200_dbsp.py | 19 +++++++++++++++++- .../p200_dbsp_red_1200_7100_d55_6680.fits | Bin 0 -> 72000 bytes pypeit/spectrographs/p200_dbsp.py | 3 +++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 pypeit/data/arc_lines/reid_arxiv/p200_dbsp_red_1200_7100_d55_6680.fits diff --git a/pypeit/core/wavecal/spectrographs/templ_p200_dbsp.py b/pypeit/core/wavecal/spectrographs/templ_p200_dbsp.py index 21902aee15..90b842f216 100644 --- a/pypeit/core/wavecal/spectrographs/templ_p200_dbsp.py +++ b/pypeit/core/wavecal/spectrographs/templ_p200_dbsp.py @@ -41,6 +41,22 @@ def p200_dbsp_red_1200_9400_d55(overwrite=False): # DBSPr 1200/9400 D55 templates.build_template([wfile0], slits, lcut, binspec, outroot, lowredux=False, ifiles=ifiles, normalize=True, overwrite=overwrite) +# ############################## +def p200_dbsp_red_1200_7100_d55(overwrite=False): # DBSPr 1200/7100 D55 + + binspec = 1 + outroot = 'p200_dbsp_red_1200_7100_d55_6680.fits' + # + ifiles = [0] + slits = [55] # Be careful with the order.. + lcut = None + wfile0 = os.path.join(templates.template_path, 'P200_DBSP', + 'R1200_7100_D55', 'wvcalib_6680.fits') + + # + templates.build_template([wfile0], slits, lcut, binspec, outroot, + lowredux=False, ifiles=ifiles, normalize=True, overwrite=overwrite) + # ############################## def p200_dbsp_red_600_10000_d55(overwrite=False): # DBSPr 600/10000 D55 @@ -144,4 +160,5 @@ def p200_dbsp_blue_1200_5000_d68(overwrite=False): # DBSPb 1200/5000 D68 if __name__ == '__main__': # p200_dbsp_red_316_7500_d55(overwrite=True) # p200_dbsp_red_600_10000_d55(overwrite=True) - p200_dbsp_red_1200_7100_d68(overwrite=True) + # p200_dbsp_red_1200_7100_d68(overwrite=True) + p200_dbsp_red_1200_7100_d55(overwrite=True) diff --git a/pypeit/data/arc_lines/reid_arxiv/p200_dbsp_red_1200_7100_d55_6680.fits b/pypeit/data/arc_lines/reid_arxiv/p200_dbsp_red_1200_7100_d55_6680.fits new file mode 100644 index 0000000000000000000000000000000000000000..475918859ae337f779c78448b16a71fb22675e3e GIT binary patch literal 72000 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 ZGIIi_+?|2y=b8Su?!*88`+su;{s%owO49%U literal 0 HcmV?d00001 diff --git a/pypeit/spectrographs/p200_dbsp.py b/pypeit/spectrographs/p200_dbsp.py index 5e84e52598..26987649f9 100644 --- a/pypeit/spectrographs/p200_dbsp.py +++ b/pypeit/spectrographs/p200_dbsp.py @@ -579,6 +579,9 @@ def config_specific_par(self, scifile, inp_par=None): 'D68': { 7600: 'p200_dbsp_red_1200_7100_d68.fits', 8200: 'p200_dbsp_red_1200_7100_d68.fits' + }, + 'D55': { + 6680: 'p200_dbsp_red_1200_7100_d55_6680.fits' } }, '1200/9400': { From 95b23bfe37c148e6d42c5e88b481e9560c8a7cd1 Mon Sep 17 00:00:00 2001 From: Kyle Westfall Date: Tue, 3 Sep 2024 10:33:57 -0700 Subject: [PATCH 3/9] consolidate read function --- pypeit/spectrographs/ldt_deveny.py | 74 +++------------------------- pypeit/spectrographs/p200_dbsp.py | 15 +++++- pypeit/spectrographs/spectrograph.py | 51 +++++++++++-------- 3 files changed, 49 insertions(+), 91 deletions(-) diff --git a/pypeit/spectrographs/ldt_deveny.py b/pypeit/spectrographs/ldt_deveny.py index 6405862874..5954ecd561 100644 --- a/pypeit/spectrographs/ldt_deveny.py +++ b/pypeit/spectrographs/ldt_deveny.py @@ -570,75 +570,13 @@ def get_rawimage(self, raw_file, det): that are key for image processing. For LDT/DeVeny, the LOIS control system automatically adjusts the - ``DATASEC`` and ``OSCANSEC`` regions if the CCD is used in a binning other - than 1x1. The :meth:`~pypeit.spectrographs.spectrograph.Spectrograph.get_rawimage` - method in the base class assumes these sections are fixed and adjusts - them based on the binning -- an incorrect assumption for this instrument. - - This method is a stripped-down version of the base class method and - additionally does *NOT* send the binning to :func:`~pypeit.core.parse.sec2slice`. - - Parameters - ---------- - raw_file : :obj:`str` - File to read - det : :obj:`int` - 1-indexed detector to read - - Returns - ------- - detector_par : :class:`~pypeit.images.detector_container.DetectorContainer` - Detector metadata parameters. - raw_img : `numpy.ndarray`_ - Raw image for this detector. - hdu : `astropy.io.fits.HDUList`_ - Opened fits file - exptime : :obj:`float` - Exposure time *in seconds*. - rawdatasec_img : `numpy.ndarray`_ - Data (Science) section of the detector as provided by setting the - (1-indexed) number of the amplifier used to read each detector - pixel. Pixels unassociated with any amplifier are set to 0. - oscansec_img : `numpy.ndarray`_ - Overscan section of the detector as provided by setting the - (1-indexed) number of the amplifier used to read each detector - pixel. Pixels unassociated with any amplifier are set to 0. + ``DATASEC`` and ``OSCANSEC`` regions if the CCD is used in a binning + other than 1x1. This is a simple wrapper for + :func:`pypeit.spectrographs.spectrograph.Spectrograph.get_rawimage` that + sets ``sec_includes_binning`` to True. See the base-class function for + the detailed descriptions of the input parameters and returned objects. """ - # Open - hdu = io.fits_open(raw_file) - - # Grab the DetectorContainer and extract the raw image - detector = self.get_detector_par(det, hdu=hdu) - raw_img = hdu[detector['dataext']].data.astype(float) - - # Exposure time (used by RawImage) from the header - headarr = self.get_headarr(hdu) - exptime = self.get_meta_value(headarr, 'exptime') - - for section in ['datasec', 'oscansec']: - # Get the data section from Detector - image_sections = detector[section] - - # Initialize the image (0 means no amplifier) - pix_img = np.zeros(raw_img.shape, dtype=int) - for i in range(detector['numamplifiers']): - - if image_sections is not None: - # Convert the (FITS) data section from a string to a slice - # DO NOT send the binning (default: None) - datasec = parse.sec2slice(image_sections[i], one_indexed=True, - include_end=True, require_dim=2) - # Assign the amplifier - pix_img[datasec] = i+1 - - # Finish - if section == 'datasec': - rawdatasec_img = pix_img.copy() - else: - oscansec_img = pix_img.copy() - - # Return - return detector, raw_img, hdu, exptime, rawdatasec_img, oscansec_img + return super().get_rawimage(raw_file, det, sec_includes_binning=True) def calc_pattern_freq(self, frame, rawdatasec_img, oscansec_img, hdu): """ diff --git a/pypeit/spectrographs/p200_dbsp.py b/pypeit/spectrographs/p200_dbsp.py index 26987649f9..ec36212249 100644 --- a/pypeit/spectrographs/p200_dbsp.py +++ b/pypeit/spectrographs/p200_dbsp.py @@ -169,9 +169,20 @@ def check_frame_type(self, ftype, fitstbl, exprng=None): return good_exp & (fitstbl['lampstat01'] != '0000000') & (fitstbl['idname'] == 'cal') msgs.warn('Cannot determine if frames are of type {0}.'.format(ftype)) return np.zeros(len(fitstbl), dtype=bool) - + def get_rawimage(self, raw_file, det): - return LDTDeVenySpectrograph.get_rawimage(self, raw_file, det) + """ + Read raw images and generate a few other bits and pieces + that are key for image processing. + + For P200/DBSP, the the ``DATASEC`` and ``OSCANSEC`` regions are read + directly from the file header and are automatically adjusted to account + for the on-chip binning. This is a simple wrapper for + :func:`pypeit.spectrographs.spectrograph.Spectrograph.get_rawimage` that + sets ``sec_includes_binning`` to True. See the base-class function for + the detailed descriptions of the input parameters and returned objects. + """ + return super().get_rawimage(raw_file, det, sec_includes_binning=True) class P200DBSPBlueSpectrograph(P200DBSPSpectrograph): diff --git a/pypeit/spectrographs/spectrograph.py b/pypeit/spectrographs/spectrograph.py index 46779d8f8d..b9c83054c9 100644 --- a/pypeit/spectrographs/spectrograph.py +++ b/pypeit/spectrographs/spectrograph.py @@ -1163,10 +1163,10 @@ def validate_det(self, det): msgs.error(f'Provided det must have type tuple or integer, not {type(det)}.') return 1, (det,) - def get_rawimage(self, raw_file, det): + def get_rawimage(self, raw_file, det, sec_includes_binning=False): """ - Read raw images and generate a few other bits and pieces that are key - for image processing. + Read raw spectrograph image files and return data and relevant metadata + needed for image processing. .. warning:: @@ -1181,6 +1181,14 @@ def get_rawimage(self, raw_file, det): 1-indexed detector(s) to read. An image mosaic is selected using a :obj:`tuple` with the detectors in the mosaic, which must be one of the allowed mosaics returned by :func:`allowed_mosaics`. + sec_includes_binning : :obj:`bool`, optional + Some instruments use hard-coded image-section strings to define the + data and overscan regions, which are then automatically adjusted by + the on-chip binning read from the header. Others read the data and + overscan sections directly from the header. If these sections + *include* the on-chip binning automatically when the image is + written, this flag should be set to true so that this reader returns + the correct image sections. Returns ------- @@ -1207,7 +1215,8 @@ def get_rawimage(self, raw_file, det): """ # Check extension and then open self._check_extensions(raw_file) - hdu = io.fits_open(raw_file, ignore_missing_end=True, output_verify = 'ignore', ignore_blank=True) + hdu = io.fits_open(raw_file, ignore_missing_end=True, output_verify='ignore', + ignore_blank=True) # Validate the entered (list of) detector(s) nimg, _det = self.validate_det(det) @@ -1225,15 +1234,21 @@ def get_rawimage(self, raw_file, det): # NOTE: This *must* be (converted to) seconds. exptime = self.get_meta_value(headarr, 'exptime') - # Rawdatasec, oscansec images - binning = self.get_meta_value(headarr, 'binning') - # NOTE: This means that `specaxis` must be the same for all detectors in - # a mosaic - if detectors[0]['specaxis'] == 1: - binning_raw = (',').join(binning.split(',')[::-1]) + # Binning + if sec_includes_binning: + # The section in the header includes the binning, so set it to None + # here. + binning_raw = None else: - binning_raw = binning + binning = self.get_meta_value(headarr, 'binning') + # NOTE: This means that `specaxis` must be the same for all detectors in + # a mosaic + if detectors[0]['specaxis'] == 1: + binning_raw = (',').join(binning.split(',')[::-1]) + else: + binning_raw = binning + # Read the image(s) raw_img = [None]*nimg rawdatasec_img = [None]*nimg oscansec_img = [None]*nimg @@ -1254,26 +1269,20 @@ def get_rawimage(self, raw_file, det): for section in ['datasec', 'oscansec']: - # Get the data section - # Try using the image sections as header keywords - # TODO -- Deal with user windowing of the CCD (e.g. Kast red) - # Code like the following maybe useful - #hdr = hdu[detector[det - 1]['dataext']].header - #image_sections = [hdr[key] for key in detector[det - 1][section]] - # Grab from Detector + # Get the data sections from the detector object (see get_detector_par above) + # TODO: Add ability to incude user windowing (e.g., Kast Red) image_sections = detectors[i][section] - #if not isinstance(image_sections, list): - # image_sections = [image_sections] # Always assume normal FITS header formatting one_indexed = True include_last = True + required_dim = 2 # Initialize the image (0 means no amplifier) pix_img = np.zeros(raw_img[i].shape, dtype=int) for j in range(detectors[i]['numamplifiers']): if image_sections is not None: # and image_sections[i] is not None: - # Convert the data section from a string to a slice + # Convert the (FITS) data section from a string to a slice datasec = parse.sec2slice(image_sections[j], one_indexed=one_indexed, include_end=include_last, require_dim=2, binning=binning_raw) From 59152aa86720b178386965408c2d482c000ad5e7 Mon Sep 17 00:00:00 2001 From: Kyle Westfall Date: Tue, 3 Sep 2024 10:38:02 -0700 Subject: [PATCH 4/9] rm import --- pypeit/spectrographs/p200_dbsp.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pypeit/spectrographs/p200_dbsp.py b/pypeit/spectrographs/p200_dbsp.py index ec36212249..a848d3422d 100644 --- a/pypeit/spectrographs/p200_dbsp.py +++ b/pypeit/spectrographs/p200_dbsp.py @@ -19,7 +19,6 @@ from pypeit.spectrographs import spectrograph from pypeit.core import parse from pypeit.images import detector_container -from pypeit.spectrographs.ldt_deveny import LDTDeVenySpectrograph def flip_fits_slice(s: str) -> str: From d290842f68901db6628ee41a767e5a7c2c083b5d Mon Sep 17 00:00:00 2001 From: Kyle Westfall Date: Tue, 3 Sep 2024 12:07:24 -0700 Subject: [PATCH 5/9] minor edits --- pypeit/spectrographs/ldt_deveny.py | 4 ++-- pypeit/spectrographs/p200_dbsp.py | 6 +++--- pypeit/spectrographs/spectrograph.py | 12 +++++++----- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/pypeit/spectrographs/ldt_deveny.py b/pypeit/spectrographs/ldt_deveny.py index 5954ecd561..dae7d1d0ed 100644 --- a/pypeit/spectrographs/ldt_deveny.py +++ b/pypeit/spectrographs/ldt_deveny.py @@ -566,8 +566,8 @@ def config_specific_par(self, scifile, inp_par=None): def get_rawimage(self, raw_file, det): """ - Read raw images and generate a few other bits and pieces - that are key for image processing. + Read raw spectrograph image files and return data and relevant metadata + needed for image processing. For LDT/DeVeny, the LOIS control system automatically adjusts the ``DATASEC`` and ``OSCANSEC`` regions if the CCD is used in a binning diff --git a/pypeit/spectrographs/p200_dbsp.py b/pypeit/spectrographs/p200_dbsp.py index a848d3422d..19cd3b8e3f 100644 --- a/pypeit/spectrographs/p200_dbsp.py +++ b/pypeit/spectrographs/p200_dbsp.py @@ -171,10 +171,10 @@ def check_frame_type(self, ftype, fitstbl, exprng=None): def get_rawimage(self, raw_file, det): """ - Read raw images and generate a few other bits and pieces - that are key for image processing. + Read raw spectrograph image files and return data and relevant metadata + needed for image processing. - For P200/DBSP, the the ``DATASEC`` and ``OSCANSEC`` regions are read + For P200/DBSP, the ``DATASEC`` and ``OSCANSEC`` regions are read directly from the file header and are automatically adjusted to account for the on-chip binning. This is a simple wrapper for :func:`pypeit.spectrographs.spectrograph.Spectrograph.get_rawimage` that diff --git a/pypeit/spectrographs/spectrograph.py b/pypeit/spectrographs/spectrograph.py index b9c83054c9..d72d529ff0 100644 --- a/pypeit/spectrographs/spectrograph.py +++ b/pypeit/spectrographs/spectrograph.py @@ -1248,6 +1248,11 @@ def get_rawimage(self, raw_file, det, sec_includes_binning=False): else: binning_raw = binning + # Always assume normal FITS header formatting + one_indexed = True + include_last = True + required_dim = 2 + # Read the image(s) raw_img = [None]*nimg rawdatasec_img = [None]*nimg @@ -1272,10 +1277,6 @@ def get_rawimage(self, raw_file, det, sec_includes_binning=False): # Get the data sections from the detector object (see get_detector_par above) # TODO: Add ability to incude user windowing (e.g., Kast Red) image_sections = detectors[i][section] - # Always assume normal FITS header formatting - one_indexed = True - include_last = True - required_dim = 2 # Initialize the image (0 means no amplifier) pix_img = np.zeros(raw_img[i].shape, dtype=int) @@ -1284,7 +1285,8 @@ def get_rawimage(self, raw_file, det, sec_includes_binning=False): if image_sections is not None: # and image_sections[i] is not None: # Convert the (FITS) data section from a string to a slice datasec = parse.sec2slice(image_sections[j], one_indexed=one_indexed, - include_end=include_last, require_dim=2, + include_end=include_last, + require_dim=required_dim, binning=binning_raw) # Assign the amplifier pix_img[datasec] = j+1 From 52b7f21ecc86015a5d725202245dc36bc1080548 Mon Sep 17 00:00:00 2001 From: Kyle Westfall Date: Tue, 3 Sep 2024 13:27:01 -0700 Subject: [PATCH 6/9] require_dim --- pypeit/spectrographs/spectrograph.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pypeit/spectrographs/spectrograph.py b/pypeit/spectrographs/spectrograph.py index d72d529ff0..3a0bd17e67 100644 --- a/pypeit/spectrographs/spectrograph.py +++ b/pypeit/spectrographs/spectrograph.py @@ -1251,7 +1251,7 @@ def get_rawimage(self, raw_file, det, sec_includes_binning=False): # Always assume normal FITS header formatting one_indexed = True include_last = True - required_dim = 2 + require_dim = 2 # Read the image(s) raw_img = [None]*nimg @@ -1285,8 +1285,7 @@ def get_rawimage(self, raw_file, det, sec_includes_binning=False): if image_sections is not None: # and image_sections[i] is not None: # Convert the (FITS) data section from a string to a slice datasec = parse.sec2slice(image_sections[j], one_indexed=one_indexed, - include_end=include_last, - require_dim=required_dim, + include_end=include_last, require_dim=require_dim, binning=binning_raw) # Assign the amplifier pix_img[datasec] = j+1 From b4212a8f2d5d00b57dcfad9f184cfd61a497fccb Mon Sep 17 00:00:00 2001 From: "Timothy P. Ellsworth Bowers" Date: Wed, 4 Sep 2024 14:34:03 -0700 Subject: [PATCH 7/9] Specify `remote_host` in call to PypeItDataPath When caching from GitHub using the script `pypeit_cache_github_data`, an error was kicked complaining about "Remote host type None is not supported for package data caching." This commit corrects the issue by specifying the `remote_host` in the instantiation of PypeItDataPath. modified: pypeit/scripts/cache_github_data.py --- pypeit/scripts/cache_github_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pypeit/scripts/cache_github_data.py b/pypeit/scripts/cache_github_data.py index 6e49169949..b7ec524722 100644 --- a/pypeit/scripts/cache_github_data.py +++ b/pypeit/scripts/cache_github_data.py @@ -130,7 +130,7 @@ def main(args): files = np.array(contents[path])[to_download[path]] if len(files) == 0: continue - data_path = PypeItDataPath(path) + data_path = PypeItDataPath(path, remote_host="github") # NOTE: I'm using POSIX path here because I'm unsure what will # happen on Windows if the file is in a subdirectory. root = pathlib.PurePosixPath(f'pypeit/data/{path}') From c9627a9d41369cf78199290aebbc3d3ce6071c73 Mon Sep 17 00:00:00 2001 From: Kyle Westfall Date: Fri, 6 Sep 2024 10:33:54 -0700 Subject: [PATCH 8/9] changes --- doc/releases/1.16.1dev.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/releases/1.16.1dev.rst b/doc/releases/1.16.1dev.rst index 372081dbeb..b2e7a28b5a 100644 --- a/doc/releases/1.16.1dev.rst +++ b/doc/releases/1.16.1dev.rst @@ -53,7 +53,7 @@ Instrument-specific Updates - UVB arm: - Platescale updated from an order-dependent value, to being 0.164 arcsec/pixel for all orders - +- Add new P200/DBSP reid_arxiv template for 1200/7100 with D55 dichroic Script Changes -------------- @@ -89,6 +89,9 @@ Under-the-hood Improvements - Introduced :class:`~pypeit.pypeitdata.PypeItDataPaths` to handle all interactions with the ``pypeit/data`` directory, which provides a unified interface for accessing on-disk and cached files. +- Updated general raw image reader so that it correctly accounts for + spectrographs that read the data and overscan sections directly from the file + headers. Bug Fixes --------- From 4d59340059229cbba26b64b7a1cba54c280f2fe3 Mon Sep 17 00:00:00 2001 From: Kyle Westfall Date: Fri, 6 Sep 2024 14:19:46 -0700 Subject: [PATCH 9/9] doc update --- doc/help/run_pypeit.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/help/run_pypeit.rst b/doc/help/run_pypeit.rst index 4cb290e4fa..77d8e84bbc 100644 --- a/doc/help/run_pypeit.rst +++ b/doc/help/run_pypeit.rst @@ -4,7 +4,7 @@ usage: run_pypeit [-h] [-v VERBOSITY] [-r REDUX_PATH] [-m] [-s] [-o] [-c] pypeit_file - ## PypeIt : The Python Spectroscopic Data Reduction Pipeline v1.16.1.dev336+gdf3013372.d20240827 + ## PypeIt : The Python Spectroscopic Data Reduction Pipeline v1.16.1.dev468+g832ee84e4 ## ## Available spectrographs include: ## aat_uhrf, bok_bc, gemini_flamingos1, gemini_flamingos2,