def helio_correct(self, sobjs, maskslits, frame, obstime): """ Perform a heliocentric correction on a set of spectra Args: sobjs (pypeit.specobjs.SpecObjs): Spectra maskslits (ndarray): Slits that are masked frame (int): Frame to use for meta info obstime (astropy.time.Time): Returns: astropy.units.Quantity: Velocity correction in km/s """ # Helio, correct Earth's motion if (self.caliBrate.par['wavelengths']['frame'] in ['heliocentric', 'barycentric']) \ and (self.caliBrate.par['wavelengths']['reference'] != 'pixel'): # TODO change this keyword to refframe instead of frame msgs.info("Performing a {0} correction".format(self.caliBrate.par['wavelengths']['frame'])) vel, vel_corr = wave.geomotion_correct(sobjs, maskslits, self.fitstbl, frame, obstime, self.spectrograph.telescope['longitude'], self.spectrograph.telescope['latitude'], self.spectrograph.telescope['elevation'], self.caliBrate.par['wavelengths']['frame']) else: msgs.info('A wavelength reference-frame correction will not be performed.') vel_corr = None return vel_corr
def helio_correct(self, sobjs, radec, obstime): """ Perform a heliocentric correction Wrapper to wave.geomotion_correct() Input objects are modified in place Args: sobjs (:class:`pypeit.specobjs.SpecObjs`): radec (astropy.coordiantes.SkyCoord): obstime (:obj:`astropy.time.Time`): """ # Helio, correct Earth's motion if (self.par['calibrations']['wavelengths']['frame'] in ['heliocentric', 'barycentric']) \ and (self.par['calibrations']['wavelengths']['reference'] != 'pixel'): # TODO change this keyword to refframe instead of frame msgs.info("Performing a {0} correction".format( self.par['calibrations']['wavelengths']['frame'])) # Good slitord gd_slitord = self.slits.slitord_id[np.invert(self.reduce_bpm)] vel, vel_corr = wave.geomotion_correct( sobjs, radec, obstime, gd_slitord, self.spectrograph.telescope['longitude'], self.spectrograph.telescope['latitude'], self.spectrograph.telescope['elevation'], self.par['calibrations']['wavelengths']['frame']) else: msgs.info( 'A wavelength reference-frame correction will not be performed.' ) vel_corr = None return
def test_geocorrect(fitstbl): """ """ # Specobj (wrap in a list to mimic a slit) npix = 1000 sobj = specobj.SpecObj('MultiSlit', 1, SLITID=0) sobj.BOX_WAVE = np.linspace(4000., 6000., npix) sobj.BOX_COUNTS = 50. * (sobj.BOX_WAVE / 5000.)**-1. sobj.BOX_COUNTS_IVAR = 1. / sobj.BOX_COUNTS.copy() # SpecObjs specObjs = specobjs.SpecObjs() specObjs.add_sobj(sobj) scidx = 5 obstime = Time(fitstbl['mjd'][scidx], format='mjd') #'%Y-%m-%dT%H:%M:%S.%f') maskslits = np.array([False] * specObjs.nobj) radec = ltu.radec_to_coord((fitstbl["ra"][scidx], fitstbl["dec"][scidx])) helio, hel_corr = wave.geomotion_correct(specObjs, radec, obstime, maskslits, lon, lat, alt, 'heliocentric') assert np.isclose(helio, -9.17461338, rtol=1e-5) # Checked against x_keckhelio #assert np.isclose(helio, -9.3344957, rtol=1e-5) # Original assert np.isclose(specObjs[0].BOX_WAVE[0], 3999.877589008, rtol=1e-8)
def test_geocorrect(fitstbl): """ """ # Specobj (wrap in a list to mimic a slit) scidx = 5 obstime = Time(fitstbl['mjd'][scidx], format='mjd') #'%Y-%m-%dT%H:%M:%S.%f') radec = ltu.radec_to_coord((fitstbl["ra"][scidx], fitstbl["dec"][scidx])) helio, hel_corr = wave.geomotion_correct(radec, obstime, lon, lat, alt, 'heliocentric') assert np.isclose(helio, -9.17461338, rtol=1e-5) # Checked against x_keckhelio #assert np.isclose(helio, -9.3344957, rtol=1e-5) # Original assert np.isclose(1 - hel_corr, 3.060273748e-05, rtol=1e-5) # Now apply to a specobj npix = 1000 sobj = specobj.SpecObj('MultiSlit', 1, SLITID=0) sobj.BOX_WAVE = np.linspace(4000., 6000., npix) sobj.BOX_COUNTS = 50. * (sobj.BOX_WAVE / 5000.)**-1. sobj.BOX_COUNTS_IVAR = 1. / sobj.BOX_COUNTS.copy() sobj.apply_helio(hel_corr, 'heliocentric') assert np.isclose(sobj.BOX_WAVE[0], 3999.877589008, rtol=1e-8)
def helio_correct(self, sobjs, radec, obstime): """ Perform a heliocentric correction """ # Helio, correct Earth's motion if (self.wave_par['frame'] in ['heliocentric', 'barycentric']) \ and (self.wave_par['reference'] != 'pixel'): # TODO change this keyword to refframe instead of frame msgs.info("Performing a {0} correction".format(self.wave_par['frame'])) vel, vel_corr = wave.geomotion_correct(sobjs, radec, obstime, self.maskslits, self.spectrograph.telescope['longitude'], self.spectrograph.telescope['latitude'], self.spectrograph.telescope['elevation'], self.wave_par['frame']) else: msgs.info('A wavelength reference-frame correction will not be performed.') vel_corr = None return vel_corr
def refframe_correct(self, ra, dec, obstime, sobjs=None): """ Correct the calibrated wavelength to the user-supplied reference frame Args: radec (astropy.coordiantes.SkyCoord): Sky Coordinate of the observation obstime (:obj:`astropy.time.Time`): Observation time sobjs (:class:`pypeit.specobjs.Specobjs`, None): Spectrally extracted objects """ # Correct Telescope's motion refframe = self.par['calibrations']['wavelengths']['refframe'] if refframe in ['heliocentric', 'barycentric'] \ and self.par['calibrations']['wavelengths']['reference'] != 'pixel': msgs.info("Performing a {0} correction".format(self.par['calibrations']['wavelengths']['refframe'])) # Calculate correction radec = ltu.radec_to_coord((ra, dec)) vel, vel_corr = wave.geomotion_correct(radec, obstime, self.spectrograph.telescope['longitude'], self.spectrograph.telescope['latitude'], self.spectrograph.telescope['elevation'], refframe) # Apply correction to objects msgs.info('Applying {0} correction = {1:0.5f} km/s'.format(refframe, vel)) if (sobjs is not None) and (sobjs.nobj != 0): # Loop on slits to apply gd_slitord = self.slits.slitord_id[np.logical_not(self.extract_bpm)] for slitord in gd_slitord: indx = sobjs.slitorder_indices(slitord) this_specobjs = sobjs[indx] # Loop on objects for specobj in this_specobjs: if specobj is None: continue specobj.apply_helio(vel_corr, refframe) # Apply correction to wavelength image self.vel_corr = vel_corr self.waveimg *= vel_corr else: msgs.info('A wavelength reference frame correction will not be performed.')
def test_geocorrect(fitstbl): """ """ # Spectrograph # (KBW) Had to change this to keck to match the telecope parameters, # then just changed to use definitions above directly. # spectrograph = load_spectrograph('keck_lris_blue') # Specobjs (wrap in a list to mimic a slit) sobj_list = specobjs.dummy_specobj((2048,2048), extraction=True) specObjs = specobjs.SpecObjs(sobj_list) scidx = 5 obstime = Time(fitstbl['mjd'][scidx], format='mjd')#'%Y-%m-%dT%H:%M:%S.%f') maskslits = np.array([False]*specObjs.nobj) radec = ltu.radec_to_coord((fitstbl["ra"][scidx], fitstbl["dec"][scidx])) helio, hel_corr = wave.geomotion_correct(specObjs, radec, obstime, maskslits, lon, lat, alt, 'heliocentric') assert np.isclose(helio, -9.17461338, rtol=1e-5) # Checked against x_keckhelio #assert np.isclose(helio, -9.3344957, rtol=1e-5) # Original assert np.isclose(specObjs[0].boxcar['WAVE'][0].value, 3999.877589008, rtol=1e-8)