def detector_to_abl(input_model, reference_files): """ Create the transform from "detector" to "alpha_beta" frame. Transform description: forward transform RegionsSelector label_mapper is the regions array selector is {slice_number: alpha_model & beta_model & lambda_model} backward transform RegionsSelector label_mapper is LabelMapperDict {channel_wave_range (): LabelMapperDict} {beta: slice_number} selector is {slice_number: x_transform & y_transform} """ band = input_model.meta.instrument.band channel = input_model.meta.instrument.channel # used to read the wavelength range with DistortionMRSModel(reference_files['distortion']) as dist: alpha_model = dist.alpha_model beta_model = dist.beta_model x_model = dist.x_model y_model = dist.y_model bzero = dict(zip(dist.bzero.channel_band, dist.bzero.beta_zero)) bdel = dict(zip(dist.bdel.channel_band, dist.bdel.delta_beta)) slices = dist.slices with SpecwcsModel(reference_files['specwcs']) as f: lambda_model = f.model try: velosys = input_model.meta.wcsinfo.velosys except AttributeError: pass else: if velosys is not None: velocity_corr = velocity_correction( input_model.meta.wcsinfo.velosys) lambda_model = [m | velocity_corr for m in lambda_model] log.info("Applied Barycentric velocity correction : {}".format( velocity_corr[1].amplitude.value)) with RegionsModel(reference_files['regions']) as f: allregions = f.regions.copy() # Use the 50% throughput slice mask regions = allregions[4, :, :] label_mapper = selector.LabelMapperArray(regions) transforms = {} for i, sl in enumerate(slices): forward = models.Mapping([1, 0, 0, 1, 0]) | \ alpha_model[i] & beta_model[i] & lambda_model[i] inv = models.Mapping([2, 0, 2, 0]) | x_model[i] & y_model[i] forward.inverse = inv transforms[sl] = forward with WavelengthrangeModel(reference_files['wavelengthrange']) as f: wr = dict(zip(f.waverange_selector, f.wavelengthrange)) ch_dict = {} for c in channel: cb = c + band mapper = jwmodels.MIRI_AB2Slice(bzero[cb], bdel[cb], c) lm = selector.LabelMapper(inputs=('alpha', 'beta', 'lam'), mapper=mapper, inputs_mapping=models.Mapping((1, ), n_inputs=3)) ch_dict[tuple(wr[cb])] = lm alpha_beta_mapper = selector.LabelMapperRange( ('alpha', 'beta', 'lam'), ch_dict, models.Mapping((2, ))) label_mapper.inverse = alpha_beta_mapper det2alpha_beta = selector.RegionsSelector(('x', 'y'), ('alpha', 'beta', 'lam'), label_mapper=label_mapper, selector=transforms) return det2alpha_beta
def detector_to_abl(input_model, reference_files): """ Create the transform from "detector" to "alpha_beta" frame. Transform description: forward transform RegionsSelector label_mapper is the regions array selector is {slice_number: alpha_model & beta_model & lambda_model} backward transform RegionsSelector label_mapper is LabelMapperDict {channel_wave_range (): LabelMapperDict} {beta: slice_number} selector is {slice_number: x_transform & y_transform} """ band = input_model.meta.instrument.band channel = input_model.meta.instrument.channel # used to read the wavelength range with DistortionMRSModel(reference_files['distortion']) as dist: alpha_model = dist.alpha_model beta_model = dist.beta_model x_model = dist.x_model y_model = dist.y_model bzero = dict(zip(dist.bzero.channel_band, dist.bzero.beta_zero)) bdel = dict(zip(dist.bdel.channel_band, dist.bdel.delta_beta)) slices = dist.slices with SpecwcsModel(reference_files['specwcs']) as f: lambda_model = f.model with RegionsModel(reference_files['regions']) as f: regions = f.regions.copy() label_mapper = selector.LabelMapperArray(regions) transforms = {} for i, sl in enumerate(slices): forward = models.Mapping([1, 0, 0, 1, 0]) | \ alpha_model[i] & beta_model[i] & lambda_model[i] inv = models.Mapping([2, 0, 2, 0]) | x_model[i] & y_model[i] forward.inverse = inv transforms[sl] = forward with WavelengthrangeModel(reference_files['wavelengthrange']) as f: wr = dict(zip(f.waverange_selector, f.wavelengthrange)) ch_dict = {} for c in channel: cb = c + band mapper = jwmodels.MIRI_AB2Slice(bzero[cb], bdel[cb], c) lm = selector.LabelMapper(inputs=('alpha', 'beta', 'lam'), mapper=mapper, inputs_mapping=models.Mapping((1, ), n_inputs=3)) ch_dict[tuple(wr[cb])] = lm alpha_beta_mapper = selector.LabelMapperRange( ('alpha', 'beta', 'lam'), ch_dict, models.Mapping((2, ))) label_mapper.inverse = alpha_beta_mapper det2alpha_beta = selector.RegionsSelector(('x', 'y'), ('alpha', 'beta', 'lam'), label_mapper=label_mapper, selector=transforms) return det2alpha_beta