def ifu(input_model, reference_files): """ IFU pipeline """ slits = np.arange(30) # Get the corrected disperser model disperser = get_disperser(input_model, reference_files['disperser']) # Get the default spectral order and wavelength range and record them in the model. sporder, wrange = get_spectral_order_wrange(input_model, reference_files['wavelengthrange']) input_model.meta.wcsinfo.waverange_start = wrange[0] input_model.meta.wcsinfo.waverange_end = wrange[1] input_model.meta.wcsinfo.spectral_order = sporder # DMS to SCA transform dms2detector = dms_to_sca(input_model) # DETECTOR to GWA transform det2gwa = Identity(2) & detector_to_gwa(reference_files, input_model.meta.instrument.detector, disperser) # GWA to SLIT gwa2slit = gwa_to_ifuslit(slits, disperser, wrange, sporder, reference_files) # SLIT to MSA transform slit2msa = ifuslit_to_msa(slits, reference_files) det, sca, gwa, slit_frame, msa_frame, oteip, v2v3, world = create_frames() if input_model.meta.instrument.filter != 'OPAQUE': # MSA to OTEIP transform msa2oteip = ifu_msa_to_oteip(reference_files) # OTEIP to V2,V3 transform # This includes a wavelength unit conversion from meters to microns. oteip2v23 = oteip_to_v23(reference_files) # Create coordinate frames in the NIRSPEC WCS pipeline" # # The oteip2v2v3 transform converts the wavelength from meters (which is assumed # in the whole pipeline) to microns (which is the expected output) # # "detector", "gwa", "slit_frame", "msa_frame", "oteip", "v2v3", "world" pipeline = [(det, dms2detector), (sca, det2gwa.rename('detector2gwa')), (gwa, gwa2slit.rename('gwa2slit')), (slit_frame, (Mapping((0, 1, 2, 3, 4)) | slit2msa).rename('slit2msa')), (msa_frame, msa2oteip.rename('msa2oteip')), (oteip, oteip2v23.rename('oteip2v23')), (v2v3, None)] else: # convert to microns if the pipeline ends earlier #slit2msa = (Mapping((0, 1, 2, 3, 4)) | slit2msa | Identity(2) & Scale(10**6)).rename('slit2msa') slit2msa = (Mapping((0, 1, 2, 3, 4)) | slit2msa).rename('slit2msa') pipeline = [(det, dms2detector), (sca, det2gwa.rename('detector2gwa')), (gwa, gwa2slit.rename('gwa2slit')), (slit_frame, slit2msa), (msa_frame, None)] return pipeline
def ifu(input_model, reference_files): """ IFU pipeline """ slits = np.arange(30) # Get the corrected disperser model disperser = get_disperser(input_model, reference_files['disperser']) # Get the default spectral order and wavelength range and record them in the model. sporder, wrange = get_spectral_order_wrange( input_model, reference_files['wavelengthrange']) input_model.meta.wcsinfo.waverange_start = wrange[0] input_model.meta.wcsinfo.waverange_end = wrange[1] input_model.meta.wcsinfo.spectral_order = sporder # DMS to SCA transform dms2detector = dms_to_sca(input_model) # DETECTOR to GWA transform det2gwa = Identity(2) & detector_to_gwa( reference_files, input_model.meta.instrument.detector, disperser) # GWA to SLIT gwa2slit = gwa_to_ifuslit(slits, disperser, wrange, sporder, reference_files) # SLIT to MSA transform slit2msa = ifuslit_to_msa(slits, reference_files) det, sca, gwa, slit_frame, msa_frame, oteip, v2v3, world = create_frames() if input_model.meta.instrument.filter != 'OPAQUE': # MSA to OTEIP transform msa2oteip = ifu_msa_to_oteip(reference_files) # OTEIP to V2,V3 transform # This includes a wavelength unit conversion from meters to microns. oteip2v23 = oteip_to_v23(reference_files) # Create coordinate frames in the NIRSPEC WCS pipeline" # # The oteip2v2v3 transform converts the wavelength from meters (which is assumed # in the whole pipeline) to microns (which is the expected output) # # "detector", "gwa", "slit_frame", "msa_frame", "oteip", "v2v3", "world" pipeline = [(det, dms2detector), (sca, det2gwa.rename('detector2gwa')), (gwa, gwa2slit.rename('gwa2slit')), (slit_frame, (Mapping( (0, 1, 2, 3, 4)) | slit2msa).rename('slit2msa')), (msa_frame, msa2oteip.rename('msa2oteip')), (oteip, oteip2v23.rename('oteip2v23')), (v2v3, None)] else: pipeline = [(det, dms2detector), (sca, det2gwa.rename('detector2gwa')), (gwa, gwa2slit.rename('gwa2slit')), (slit_frame, (Mapping( (0, 1, 2, 3, 4)) | slit2msa).rename('slit2msa')), (msa_frame, None)] return pipeline
def ifu(input_model, reference_files): """ IFU pipeline """ slits = np.arange(30) # Get the corrected disperser model disperser = get_disperser(input_model, reference_files['disperser']) # Get the default spectral order and wavelength range and record them in the model. sporder, wrange = get_spectral_order_wrange( input_model, reference_files['wavelengthrange']) input_model.meta.wcsinfo.waverange_start = wrange[0] input_model.meta.wcsinfo.waverange_end = wrange[1] input_model.meta.wcsinfo.spectral_order = sporder # DETECTOR to GWA transform det2gwa = Identity(2) & detector_to_gwa( reference_files, input_model.meta.instrument.detector, disperser) # GWA to SLIT gwa2slit = gwa_to_ifuslit(slits, disperser, wrange, sporder, reference_files) # SLIT to MSA transform slit2msa = ifuslit_to_msa(slits, reference_files) # MSA to OTEIP transform msa2oteip = ifu_msa_to_oteip(reference_files) # OTEIP to V2,V3 transform oteip2v23 = oteip_to_v23(reference_files) # Create coordinate frames in the NIRSPEC WCS pipeline" # "detector", "gwa", "slit_frame", "msa_frame", "oteip", "v2v3", "world" det, gwa, slit_frame, msa_frame, oteip, v2v3 = create_frames() pipeline = [(det, det2gwa.rename('detector2gwa')), (gwa, gwa2slit.rename('gwa2slit')), (slit_frame, (Mapping( (0, 1, 2, 3, 4)) | slit2msa).rename('slit2msa')), (msa_frame, msa2oteip.rename('msa2oteip')), (oteip, oteip2v23.rename('oteip2v23')), (v2v3, None)] return pipeline
def ifu(input_model, reference_files): """ IFU pipeline """ slits = np.arange(30) # Get the corrected disperser model disperser = get_disperser(input_model, reference_files['disperser']) # Get the default spectral order and wavelength range and record them in the model. sporder, wrange = get_spectral_order_wrange(input_model, reference_files['wavelengthrange']) input_model.meta.wcsinfo.waverange_start = wrange[0] input_model.meta.wcsinfo.waverange_end = wrange[1] input_model.meta.wcsinfo.spectral_order = sporder # DETECTOR to GWA transform det2gwa = Identity(2) & detector_to_gwa(reference_files, input_model.meta.instrument.detector, disperser) # GWA to SLIT gwa2slit = gwa_to_ifuslit(slits, disperser, wrange, sporder, reference_files) # SLIT to MSA transform slit2msa = ifuslit_to_msa(slits, reference_files) # MSA to OTEIP transform msa2oteip = ifu_msa_to_oteip(reference_files) # OTEIP to V2,V3 transform oteip2v23 = oteip_to_v23(reference_files) # Create coordinate frames in the NIRSPEC WCS pipeline" # "detector", "gwa", "slit_frame", "msa_frame", "oteip", "v2v3", "world" det, gwa, slit_frame, msa_frame, oteip, v2v3 = create_frames() pipeline = [(det, det2gwa.rename('detector2gwa')), (gwa, gwa2slit.rename('gwa2slit')), (slit_frame, (Mapping((0, 1, 2, 3, 4)) | slit2msa).rename('slit2msa')), (msa_frame, msa2oteip.rename('msa2oteip')), (oteip, oteip2v23.rename('oteip2v23')), (v2v3, None)] return pipeline
def slits_wcs(input_model, reference_files): """ Create the WCS pipeline for observations using the MSA shutter array or fixed slits. Parameters ---------- input_model : `~jwst.datamodels.ImageModel` The input data model. reference_files : dict Dictionary with reference files supplied by CRDS. """ open_slits_id = get_open_slits(input_model, reference_files) if not open_slits_id: return None n_slits = len(open_slits_id) log.info("Computing WCS for {0} open slitlets".format(n_slits)) # Get the corrected disperser model disperser = get_disperser(input_model, reference_files['disperser']) # Get the default spectral order and wavelength range and record them in the model. sporder, wrange = get_spectral_order_wrange(input_model, reference_files['wavelengthrange']) input_model.meta.wcsinfo.waverange_start = wrange[0] input_model.meta.wcsinfo.waverange_end = wrange[1] input_model.meta.wcsinfo.spectral_order = sporder # DMS to SCA transform dms2detector = dms_to_sca(input_model).rename('dms2sca') # DETECTOR to GWA transform det2gwa = Identity(2) & detector_to_gwa(reference_files, input_model.meta.instrument.detector, disperser) # GWA to SLIT gwa2slit = gwa_to_slit(open_slits_id, input_model, disperser, reference_files) # SLIT to MSA transform slit2msa = slit_to_msa(open_slits_id, reference_files['msa']) # Create coordinate frames in the NIRSPEC WCS pipeline" # "detector", "gwa", "slit_frame", "msa_frame", "oteip", "v2v3", "world" det, sca, gwa, slit_frame, msa_frame, oteip, v2v3, world = create_frames() if input_model.meta.instrument.filter != 'OPAQUE': # MSA to OTEIP transform msa2oteip = msa_to_oteip(reference_files) # OTEIP to V2,V3 transform # This includes a wavelength unit conversion from meters to microns. oteip2v23 = oteip_to_v23(reference_files) # V2, V3 to sky tel2sky = pointing.v23tosky(input_model) & Identity(1) msa_pipeline = [(det, dms2detector), (sca, det2gwa.rename('det2gwa')), (gwa, gwa2slit.rename('gwa2slit')), (slit_frame, (Mapping((0, 1, 2, 3)) | slit2msa).rename('slit2msa')), (msa_frame, msa2oteip.rename('msa2oteip')), (oteip, oteip2v23.rename('oteip2v23')), (v2v3, tel2sky), (world, None)] else: # convert to microns if the pipeline ends earlier gwa2slit = (gwa2slit).rename('gwa2slit') msa_pipeline = [(det, dms2detector), (sca, det2gwa), (gwa, gwa2slit), (slit_frame, Mapping((0, 1, 2, 3)) | slit2msa), (msa_frame, None)] return msa_pipeline
def ifu(input_model, reference_files): """ IFU pipeline """ detector = input_model.meta.instrument.detector grating = input_model.meta.instrument.grating filter = input_model.meta.instrument.filter if detector == "NRS2" and grating.endswith('M'): log.critical("No IFU slices fall on detector {0}".format(detector)) return None if detector == "NRS2" and grating == "G140H" and filter == "F070LP": log.critical("No IFU slices fall on detector {0}".format(detector)) return None slits = np.arange(30) # Get the corrected disperser model disperser = get_disperser(input_model, reference_files['disperser']) # Get the default spectral order and wavelength range and record them in the model. sporder, wrange = get_spectral_order_wrange(input_model, reference_files['wavelengthrange']) input_model.meta.wcsinfo.waverange_start = wrange[0] input_model.meta.wcsinfo.waverange_end = wrange[1] input_model.meta.wcsinfo.spectral_order = sporder # DMS to SCA transform dms2detector = dms_to_sca(input_model) # DETECTOR to GWA transform det2gwa = Identity(2) & detector_to_gwa(reference_files, input_model.meta.instrument.detector, disperser) # GWA to SLIT gwa2slit = gwa_to_ifuslit(slits, input_model, disperser, reference_files) # SLIT to MSA transform slit2msa = ifuslit_to_msa(slits, reference_files) det, sca, gwa, slit_frame, msa_frame, oteip, v2v3, world = create_frames() if input_model.meta.instrument.filter != 'OPAQUE': # MSA to OTEIP transform msa2oteip = ifu_msa_to_oteip(reference_files) # OTEIP to V2,V3 transform # This includes a wavelength unit conversion from meters to microns. oteip2v23 = oteip_to_v23(reference_files) # V2, V3 to sky tel2sky = pointing.v23tosky(input_model) & Identity(1) # Create coordinate frames in the NIRSPEC WCS pipeline" # # The oteip2v2v3 transform converts the wavelength from meters (which is assumed # in the whole pipeline) to microns (which is the expected output) # # "detector", "gwa", "slit_frame", "msa_frame", "oteip", "v2v3", "world" pipeline = [(det, dms2detector), (sca, det2gwa.rename('detector2gwa')), (gwa, gwa2slit.rename('gwa2slit')), (slit_frame, (Mapping((0, 1, 2, 3)) | slit2msa).rename('slit2msa')), (msa_frame, msa2oteip.rename('msa2oteip')), (oteip, oteip2v23.rename('oteip2v23')), (v2v3, tel2sky), (world, None)] else: # convert to microns if the pipeline ends earlier slit2msa = (Mapping((0, 1, 2, 3)) | slit2msa).rename('slit2msa') pipeline = [(det, dms2detector), (sca, det2gwa.rename('detector2gwa')), (gwa, gwa2slit.rename('gwa2slit')), (slit_frame, slit2msa), (msa_frame, None)] return pipeline