def setUp(self):

        self.holeshape = "hex"

        # directory containing the test data
        data_dir = os.path.join(os.path.dirname(__file__),
                                'test_data/find_affine2d_parameters')
        self.data_dir = data_dir
        print(data_dir)
        if not os.path.exists(data_dir):
            os.makedirs(data_dir)

        pixel = 0.0656 * u.arcsec.to(u.rad)
        npix = 87
        wave = np.array([
            (1.0, 4.3e-6),
        ])  # m
        over = 3
        holeshape = 'hex'

        rotd_true = 9.25
        rotdegs = (8.0, 9.0, 10.0, 11.0, 12.0
                   )  # search in this range of rotation (degrees)

        # store the real affine to be uased to create test data
        self.affine = utils.Affine2d(
            rotradccw=np.pi * utils.avoidhexsingularity(rotd_true) / 180.0,
            name="{0:.4}".format(float(rotd_true)))
        self.affine.show(label="Creating affine2d for PSF data")

        # create image data to find its rotation, as a sample test...
        imagefn = data_dir + "/imagedata.fits"
        jw = NRM_Model(mask='jwst', holeshape="hex", affine2d=self.affine)
        jw.set_pixelscale(pixel)
        jw.simulate(fov=npix, bandpass=wave, over=over)
        fits.writeto(imagefn, jw.psf, overwrite=True)
        imagedata = jw.psf.copy()
        del jw
        fits.getdata(imagefn)
        psf_offset = (0.0, 0.0)
        print("driver:", rotdegs)
        mx, my, sx, sy, xo, yo, = (1.0, 1.0, 0.0, 0.0, 0.0, 0.0)
        aff_best_rot = FAP.find_rotation(imagedata,
                                         psf_offset,
                                         rotdegs,
                                         mx,
                                         my,
                                         sx,
                                         sy,
                                         xo,
                                         yo,
                                         pixel,
                                         npix,
                                         wave,
                                         over,
                                         holeshape,
                                         outdir=data_dir)

        print(aff_best_rot)
        self.aff_best_rot = aff_best_rot
示例#2
0
def create_data(imdir, rot, ov):
    """ imdir: directory for simulated fits image data
        rot: pupil rotation in degrees
        ov: oversample for simulation
        Writes sim data to fitsimdir
    """
    npix = 81
    wave = 4.3e-6  # SI 
    fnfmt = '/psf_nrm_{2:.1f}_{0}_{1}_rot{3:.3f}d.fits' # expects strings of  %(npix, holeshape, wave/um, rot_d)

    rot = utils.avoidhexsingularity(rot) # in utils
    affine_rot = utils.Affine2d(rotradccw=np.pi*rot/180.0, name="rot{0:.3f}d".format(rot)) # in utils

    jw = NRM_Model(mask='jwst', holeshape='hex', affine2d=affine_rot)
    jw.set_pixelscale(PIXELSCALE_r)
    jw.simulate(fov=81, bandpass=MONOF430M, over=ov)

    psffn = fnfmt.format(npix, 'hex', wave/um, rot)
    fits.writeto(imdir+psffn, jw.psf, overwrite=True)
    header = fits.getheader(imdir+psffn)
    header = utils.affinepars2header(header, affine_rot)
    fits.update(imdir+psffn, jw.psf, header=header)
    del jw

    return psffn  # filename only, not full path
示例#3
0
    def setUp(self):

        # directory containing the test data
        data_dir = os.path.join(os.path.dirname(__file__),
                                'test_data/affine2d_rot_psf')
        self.data_dir = data_dir
        print(data_dir)
        if not os.path.exists(data_dir):
            os.makedirs(data_dir)
        self.fnfmt = data_dir + '/psf_nrm_{2:.1f}_{0}_{1}_{3:.0f}.fits'  # expects strings of  %(imsize,hole)

        self.fmt = "    ({0:+.3f}, {1:+.3f}) -> ({2:+.3f}, {3:+.3f})"
        self.pixel = 0.0656 * u.arcsec.to(u.rad)
        self.npix = 87
        self.wave = 4.3e-6  # m
        self.over = 1

        mx, my = 1.0, 1.0
        sx, sy = 0.0, 0.0
        xo, yo = 0.0, 0.0
        affine_ideal = Affine2d(mx=mx,
                                my=my,
                                sx=sx,
                                sy=sy,
                                xo=xo,
                                yo=yo,
                                name="Ideal")

        for rot in (0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70,
                    75, 80, 85, 90, 95):
            """
            print("           rot degrees pre", rot, end='')
            diagnostic = rot/15.0 - int(rot/15.0)
            print("  diagnostic", diagnostic, end='')
            rot = avoidhexsingularity(rot) # in utils
            print("   rot degrees post", rot)
            """
            rot = avoidhexsingularity(rot)  # in utils
            affine_rot = Affine2d(rotradccw=np.pi * rot / 180.0,
                                  name="{0:.0f}".format(rot))  # in utils
            aff = affine_rot

            # hexonly g7s6 jwst
            self.jw = NRM_Model(mask='jwst', holeshape="hexonly", affine2d=aff)
            self.jw.set_pixelscale(self.pixel * arcsec2rad)
            self.jw.simulate(fov=self.npix, bandpass=self.wave, over=self.over)
            psffn = self.fnfmt.format(self.npix, 'hexonly', self.wave / um,
                                      rot)
            fits.writeto(psffn, self.jw.psf, overwrite=True)
            header = fits.getheader(psffn)
            header = affinepars2header(header, aff)
            fits.update(psffn, self.jw.psf, header=header)
            del self.jw

            del aff
            del affine_rot
示例#4
0
def create_afflist_rot(rotdegs, mx, my, sx, sy, xo, yo):
    """ create a list of affine objects with various rotations to use 
        in order to go through and find which fits some image plane data best """
    alist = []
    for nrot, rotd in enumerate(rotdegs):
        rotd_ = utils.avoidhexsingularity(rotd)
        alist.append(
            utils.Affine2d(rotradccw=np.pi * rotd_ / 180.0,
                           name="affrot_{0:+.3f}".format(rotd_)))
    return alist
示例#5
0
    def setUp(self):

        allholes = ('b4', 'c2', 'b5', 'b2', 'c1', 'b6', 'c6')
        b4, c2, b5, b2, c1, b6, c6 = allholes
        self.hc = (b2, b6, b5)  # holechoices
        self.hstr = holes2string(self.hc)
        self.holeshape = "hex"

        # directory containing the test data
        data_dir = os.path.join(os.path.dirname(__file__),
                                'test_data/affine2d_makemodel_rot')
        self.data_dir = data_dir
        print(data_dir)
        if not os.path.exists(data_dir):
            os.makedirs(data_dir)

    # expects strings of  % (self.npix, self.holeshape, self.wave/um, rot, self.hstr)
        self.fnfmt = data_dir + '/psf_nrm_{2:.1f}_{0}_{1}_{3:.0f}_{4:s}.fits'

        self.fmt = "    ({0:+.3f}, {1:+.3f}) -> ({2:+.3f}, {3:+.3f})"
        self.pixel = 0.0656
        self.npix = 87
        self.wave = 4.3e-6  # m
        self.over = 11

        mx, my = 1.0, 1.0
        sx, sy = 0.0, 0.0
        xo, yo = 0.0, 0.0
        affine_ideal = Affine2d(mx=mx,
                                my=my,
                                sx=sx,
                                sy=sy,
                                xo=xo,
                                yo=yo,
                                name="Ideal")

        rots = (0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75,
                80, 85, 90, 95)
        rots = (
            0.000,
            10.000,
        )
        for rot in rots:

            rot = avoidhexsingularity(rot)  # in utils
            affine_rot = Affine2d(rotradccw=np.pi * rot / 180.0,
                                  name="{0:.0f}".format(rot))  # in utils
            aff = affine_rot

            # holeshape is hex or circ g7s6 jwst
            # because model_array requires
            # a primary beam for one slice of the model
            self.jw = NRM_Model(
                mask='jwst',
                holeshape=self.holeshape,
                #chooseholes=self.hc,
                affine2d=aff)
            self.jw.set_pixelscale(self.pixel * arcsec2rad)
            self.jw.simulate(fov=self.npix, bandpass=self.wave, over=self.over)
            # write psf
            psffn = self.fnfmt.format(self.npix, self.holeshape,
                                      self.wave / um, rot, self.hstr)
            fits.writeto(psffn, self.jw.psf, overwrite=True)
            header = fits.getheader(psffn)
            header = affinepars2header(header, aff)
            fits.update(psffn, self.jw.psf, header=header)
            print("test:  psf shape", self.jw.psf.shape)

            modelslices = self.jw.make_model(fov=self.npix,
                                             bandpass=self.wave,
                                             over=self.over)
            print("test:  modelslices type", type(modelslices))
            print("test:  modelslices shape", modelslices.shape)
            modelfn = psffn.replace("psf_nrm", "model")

            # write model
            model_for_fitsfile = np.zeros(
                (modelslices.shape[2], modelslices.shape[0],
                 modelslices.shape[1]))
            for sl in range(modelslices.shape[2]):
                model_for_fitsfile[sl, :, :] = modelslices[:, :, sl]
            print("test:  model_for_fitsfile type", type(model_for_fitsfile))
            print("test:  model_for_fitsfile shape", model_for_fitsfile.shape)
            fits.writeto(modelfn, model_for_fitsfile[6, :, :], overwrite=True)
            header = fits.getheader(modelfn)
            header = affinepars2header(header, aff)
            fits.update(modelfn, model_for_fitsfile[6, :, :], header=header)

            del self.jw

            del aff
            del affine_rot
    def setUp(self):

        # setup parameters for simulation
        verbose = 1
        overwrite = 1

        monochromatic_wavelength_m = np.array([
            (1.0, 4.3e-6),
        ])
        mask = 'MASK_NRM'
        filter = 'F430M'
        pixel = 0.0656  # arcsec
        filter_name = 'Monochromatic ' + np.str(monochromatic_wavelength_m)

        self.filter = filter
        self.filter_name = filter_name
        self.monochromatic_wavelength_m = monochromatic_wavelength_m

        # directory containing the test data
        datadir = os.path.join(os.path.dirname(__file__),
                               'test_data/find_pass_affine')
        if not os.path.exists(datadir):
            os.makedirs(datadir)
        self.datadir = datadir

        # file containing the test data
        imagefn = datadir + "/simulated_image.fits"
        # use millidegrees and integers
        imagefn = imagefn.replace(
            ".fits",
            "_truerotmd{0:+05d}.fits".format(int(1000.0 * float(rotd_true))))
        self.imagefn = imagefn

        # savedir for reduced quantities
        self.savedir = imagefn.replace(
            ".fits",
            "_truerotmd{0:+05d}.fits".format(int(1000.0 * float(rotd_true))))
        self.savedir = self.datadir + '/'

        print('\n')
        print('  >> >> >> >> set-up  self.imagefn %s' % self.imagefn)
        print('  >> >> >> >> set-up  self.datadir %s' % self.datadir)
        print('  >> >> >> >> set-up  self.savedir %s' % self.savedir)

        # Create test data on disk

        print("avoidhexsingularity:  ", utils.avoidhexsingularity(rotd_true))
        affine = utils.Affine2d(rotradccw=np.pi *
                                utils.avoidhexsingularity(rotd_true) / 180.0,
                                name="{0:.3}".format(float(rotd_true)))
        affine.show(label="Creating PSF data with Affine2d")
        #
        from nrm_analysis.fringefitting.LG_Model import NRM_Model
        jw = NRM_Model(mask='jwst', holeshape="hex", affine2d=affine)
        jw.set_pixelscale(pixel * arcsec2rad)
        jw.simulate(fov=n_image,
                    bandpass=monochromatic_wavelength_m,
                    over=oversample)
        # PSF without oversampling
        fits.writeto(imagefn, jw.psf, overwrite=True)
        header = fits.getheader(imagefn)
        header['PIXELSCL'] = (pixel, "arcseconds")
        header['FILTER'] = filter_name
        header['PUPIL'] = mask
        header = utils.affinepars2header(header, affine)
        fits.update(imagefn, jw.psf, header=header)
        self.simulated_image = jw.psf.copy()
        self.affine = affine  # Affine2d parameters used to create test simulated_image ("true" value)
        del jw
        del affine
示例#7
0
    print(" simulate_data: ")
    jw = NRM_Model(mask='jwst', holeshape="hex")
    jw.simulate(fov=fov,
                bandpass=bandpass,
                over=oversample,
                psf_offset=psf_offset_det)
    fits.PrimaryHDU(data=jw.psf).writeto(fitsimdir + "all_effects_data.fits",
                                         overwrite=True)

    #**********Convert simulated data to mirage format.*******
    utils.amisim2mirage(fitsimdir, ("all_effects_data", ), mirexample, filt)


if __name__ == "__main__":

    identity = utils.Affine2d(rotradccw=utils.avoidhexsingularity(0.0),
                              name="affrot_{0:+.3f}deg".format(0.0))
    no_pistons = np.zeros((7, )) * 1.0
    _psf_offset_det = (0.48, 0.0)
    no_psf_offset = (0.0, 0.0)

    rot = 2.0
    rot = utils.avoidhexsingularity(rot)
    aff = utils.Affine2d(rotradccw=np.pi * rot / 180.0,
                         name="affrot_{0:+.3f}d".format(rot))
    _rotsearch_d = np.arange(-3, 3.1, 1)

    #std dev 1, 7 holes, diffraction-limited @ 2um we're at 4um
    _pistons_w = 0.5 * np.random.normal(0, 1.0, 7) / 14.0

    simulate_data(affine2d=aff,