def __init__(self): super(TNGDoloresSpectrograph, self).__init__() self.spectrograph = 'tng_dolores' self.telescope = telescopes.TNGTelescopePar() self.camera = 'DOLORES' self.detector = [ # Detector 1 pypeitpar.DetectorPar( dataext = 0, specaxis = 1, specflip = False, xgap = 0., ygap = 0., ysize = 1., platescale = 0.252, darkcurr = 0.0, saturation = 65535., nonlinear = 0.76, numamplifiers = 1, gain = 0.97, ronoise = 9.0, datasec = '[51:,1:2045]', oscansec = '[51:,2054:]', suffix = '_lrr' )] self.numhead = 1 # Uses default primary_hdrext self.timeunit = 'isot'
class TNGDoloresSpectrograph(spectrograph.Spectrograph): """ Child to handle Shane/Kast specific code """ ndet = 1 name = 'tng_dolores' telescope = telescopes.TNGTelescopePar() camera = 'DOLORES' comment = 'DOLORES (LRS) spectrograph; LR-R' # def __init__(self): # super().__init__() # self.timeunit = 'isot' def get_detector_par(self, hdu, det): """ Return metadata for the selected detector. Args: hdu (`astropy.io.fits.HDUList`_): The open fits file with the raw image of interest. det (:obj:`int`): 1-indexed detector number. Returns: :class:`~pypeit.images.detector_container.DetectorContainer`: Object with the detector metadata. """ # Detector 1 detector_dict = dict( binning='1,1', det=1, dataext=0, specaxis=1, specflip=False, spatflip=False, xgap=0., ygap=0., ysize=1., platescale=0.252, darkcurr=0.0, saturation=65535., nonlinear=0.76, mincounts=-1e10, numamplifiers=1, gain=np.atleast_1d(0.97), ronoise=np.atleast_1d(9.0), datasec=np.atleast_1d('[51:,1:2045]'), oscansec=np.atleast_1d('[51:,2054:]'), ) return detector_container.DetectorContainer(**detector_dict) @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() # Set the default exposure time ranges for the frame typing par['calibrations']['biasframe']['exprng'] = [None, 0.1] par['calibrations']['darkframe']['exprng'] = [999999, None] # No dark frames par['calibrations']['pinholeframe']['exprng'] = [999999, None ] # No pinhole frames par['scienceframe']['exprng'] = [1, None] return par def init_meta(self): """ Define how metadata are derived from the spectrograph files. That is, this associates the ``PypeIt``-specific metadata keywords with the instrument-specific header cards using :attr:`meta`. """ self.meta = {} # Required (core) self.meta['ra'] = dict(ext=0, card='RA') self.meta['dec'] = dict(ext=0, card='DEC') self.meta['target'] = dict(ext=0, card='OBJCAT') self.meta['decker'] = dict(ext=0, card='SLMSKNAM') self.meta['binning'] = dict(ext=0, card=None, default='1,1') self.meta['mjd'] = dict(ext=0, card=None, compound=True) self.meta['exptime'] = dict(ext=0, card='EXPTIME') self.meta['airmass'] = dict(ext=0, card='AIRMASS') # Extras for config and frametyping self.meta['dispname'] = dict(ext=0, card='GRM_ID') #self.meta['dispangle'] = dict(card=None, compound=True, rtol=1e-5) self.meta['idname'] = dict(ext=0, card='IMAGETYP') # Lamps self.meta['lampstat01'] = dict(ext=0, card='LMP_ID') def compound_meta(self, headarr, meta_key): """ Methods to generate metadata requiring interpretation of the header data, instead of simply reading the value of a header card. Args: headarr (:obj:`list`): List of `astropy.io.fits.Header`_ objects. meta_key (:obj:`str`): Metadata keyword to construct. Returns: object: Metadata value read from the header(s). """ if meta_key == 'mjd': time = headarr[0]['DATE-OBS'] ttime = Time(time, format='isot') return ttime.mjd msgs.error("Not ready for this compound meta") def configuration_keys(self): """ Return the metadata keys that define a unique instrument configuration. This list is used by :class:`~pypeit.metadata.PypeItMetaData` to identify the unique configurations among the list of frames read for a given reduction. Returns: :obj:`list`: List of keywords of data pulled from file headers and used to constuct the :class:`~pypeit.metadata.PypeItMetaData` object. """ return ['dispname', 'decker'] 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') & (fitstbl['lamps'] == 'Parking') \ & (fitstbl['dispname'] != 'OPEN') if ftype == 'bias': return good_exp & (fitstbl['dispname'] == 'OPEN') if ftype in ['pixelflat', 'trace']: return good_exp & (fitstbl['idname'] == 'CALIB') & (fitstbl['lamps'] == 'Halogen') \ & (fitstbl['dispname'] != 'OPEN') 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'] == 'arc') & (fitstbl['lamps'] == 'Ne+Hg') \ & (fitstbl['dispname'] != 'OPEN') msgs.warn('Cannot determine if frames are of type {0}.'.format(ftype)) return np.zeros(len(fitstbl), dtype=bool)
def __init__(self): super(TNGDoloresSpectrograph, self).__init__() self.spectrograph = 'tng_dolores' self.telescope = telescopes.TNGTelescopePar() self.camera = 'DOLORES' self.timeunit = 'isot'