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
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_alpha_beta(input_model, reference_files): """ Create the transform from detector to alpha, beta frame. forward transform: RegionsSelector label_mapper is the regions array selector is {slice_number: alphs_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 channels = [c + band for c in channel] f = AsdfFile.open(reference_files['distortion']) # The name of the model indicates the output coordinate alpha_model = f.tree['alpha_model'] beta_model = f.tree['beta_model'] x_model = f.tree['x_model'] y_model = f.tree['y_model'] slice_model = f.tree['slice_model'] f.close() f = AsdfFile.open(reference_files['specwcs']) lambda_model = f.tree['model'] f.close() f = AsdfFile.open(reference_files['regions']) regions = f.tree['regions'].copy() f.close() label_mapper = selector.LabelMapperArray(regions) transforms = {} for sl in alpha_model: #chan = str(sl // 100) + band forward = models.Mapping([1, 0, 0, 1, 0]) | \ alpha_model[sl] & beta_model[sl] & lambda_model[sl] inv = models.Mapping([2, 0, 2, 0]) | x_model[sl] & y_model[sl] forward.inverse = inv transforms[sl] = forward f = AsdfFile.open(reference_files['wavelengthrange']) # the following should go in the asdf reader wave_range = f.tree['wavelengthrange'].copy() wave_channels = f.tree['channels'] wr = {} for ch, r in zip(wave_channels, wave_range): wr[ch] = r f.close() ch_dict = {} for c in channels: ch_dict.update({tuple(wr[c]): selector.LabelMapperDict(('alpha', 'beta', 'lam'), slice_model[c], models.Mapping([1, ], n_inputs=3))}) 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