|
| 1 | +import numpy as np |
| 2 | +import h5py |
| 3 | +import time |
| 4 | +import os |
| 5 | +import imp |
| 6 | +imp_dir = '/home/aharness/repos/starshade-xy/quadrature_code' |
| 7 | +diffraq = imp.load_source("diffraq", os.path.join(imp_dir, 'diffraq', "__init__.py")) |
| 8 | +new_noise_maker = imp.load_source("new_noise_maker", os.path.join(imp_dir, "new_noise_maker.py")) |
| 9 | +from new_noise_maker import Noise_Maker |
| 10 | + |
| 11 | +#Save directory |
| 12 | +session = 'n10k_sigd25' |
| 13 | + |
| 14 | +#Number of samples |
| 15 | +num_imgs = 10000 |
| 16 | + |
| 17 | +#Gaussian distribution |
| 18 | +sig_width = 0.25 |
| 19 | + |
| 20 | +#SNR range |
| 21 | +snr_range = [5, 25] |
| 22 | + |
| 23 | +#User options |
| 24 | +apod_name = 'm12p8' |
| 25 | +with_spiders = True |
| 26 | +wave = 403e-9 |
| 27 | +num_tel_pts = 96 |
| 28 | +#Telescope sizes in Lab and Space coordinates [m] (sets scaling factor) |
| 29 | +Dtel_lab = 2.201472e-3 |
| 30 | +Dtel_space = 2.4 |
| 31 | +#Random number generator seed |
| 32 | +seed = 88 |
| 33 | + |
| 34 | +############################ |
| 35 | + |
| 36 | +#Get random number generatore |
| 37 | +rng = np.random.default_rng(seed) |
| 38 | + |
| 39 | +#Lab to space scaling |
| 40 | +lab2space = Dtel_space / Dtel_lab |
| 41 | +space2lab = 1/lab2space |
| 42 | + |
| 43 | +############################ |
| 44 | + |
| 45 | +#Create directory |
| 46 | +save_dir = './Sim_Data' |
| 47 | + |
| 48 | +#Load instance of noise maker |
| 49 | +noise_params = {'count_rate': 7, 'rng': rng, 'snr_range': snr_range, |
| 50 | + 'num_tel_pts': num_tel_pts} |
| 51 | +noiser = Noise_Maker(noise_params) |
| 52 | + |
| 53 | +#Specify simulation parameters |
| 54 | +params = { |
| 55 | + ### Lab ### |
| 56 | + 'wave': wave, #Wavelength of light [m] |
| 57 | + |
| 58 | + ### Telescope ### |
| 59 | + 'tel_diameter': Dtel_lab, #Telescope aperture diameter [m] |
| 60 | + 'num_tel_pts': num_tel_pts, #Size of grid to calculate over pupil |
| 61 | + |
| 62 | + ### Starshade ### |
| 63 | + #will specify apod_name after circle is run |
| 64 | + 'num_petals': 12, #Number of starshade petals |
| 65 | + |
| 66 | + ### Saving ### |
| 67 | + 'do_save': False, #Don't save data |
| 68 | + 'verbose': False, #Silence output |
| 69 | + 'xtras_dir': f'{imp_dir}/xtras', |
| 70 | +} |
| 71 | + |
| 72 | +#Run unblocked image first (lab calibration) |
| 73 | +params['apod_name'] = 'circle' |
| 74 | +params['circle_rad'] = 25.086e-3 |
| 75 | +sim = diffraq.Simulator(params) |
| 76 | +sim.setup_sim() |
| 77 | +cal_img = np.abs(sim.calculate_diffraction())**2 |
| 78 | + |
| 79 | +#Set to noise maker |
| 80 | +noiser.set_suppression_norm(cal_img) |
| 81 | + |
| 82 | +#Save image |
| 83 | +cal_file = os.path.join(save_dir, 'calibration') |
| 84 | + |
| 85 | +#New simulator for starshade images |
| 86 | +params['with_spiders'] = with_spiders |
| 87 | +params['apod_name'] = apod_name |
| 88 | +sim = diffraq.Simulator(params) |
| 89 | +sim.setup_sim() |
| 90 | + |
| 91 | +#Initiate containers |
| 92 | +images = np.empty((num_imgs, sim.num_pts, sim.num_pts)) |
| 93 | +positions = np.empty((num_imgs, 2)) |
| 94 | + |
| 95 | +tik = time.perf_counter() |
| 96 | + |
| 97 | +#Loop and calculate image |
| 98 | +for i in range(num_imgs): |
| 99 | + |
| 100 | + if i % (num_imgs // 10) == 0: |
| 101 | + print(f'Running step # {i} / {num_imgs} ({time.perf_counter()-tik:.0f} s)') |
| 102 | + |
| 103 | + #Get random position from gaussian |
| 104 | + nx, ny = rng.multivariate_normal([0,0], np.eye(2)*(sig_width*space2lab)**2) |
| 105 | + |
| 106 | + #Set shift of telescope |
| 107 | + sim.tel_shift = [nx, ny] |
| 108 | + |
| 109 | + #Get random snr |
| 110 | + snr = rng.uniform(snr_range[0], snr_range[1]) |
| 111 | + |
| 112 | + #Get diffraction and convert to intensity |
| 113 | + img = np.abs(sim.calculate_diffraction())**2 |
| 114 | + |
| 115 | + #Add noise |
| 116 | + img = noiser.add_noise(img, snr) |
| 117 | + |
| 118 | + #Store |
| 119 | + images[i] = img |
| 120 | + positions[i] = [nx,ny] |
| 121 | + |
| 122 | +tok = time.perf_counter() |
| 123 | + |
| 124 | +#Save |
| 125 | +with h5py.File(f'{save_dir}/{session}_data.h5', 'w') as f: |
| 126 | + f.create_dataset('num_tel_pts', data=num_tel_pts) |
| 127 | + f.create_dataset('sig_width', data=sig_width) |
| 128 | + f.create_dataset('lab2space', data=lab2space) |
| 129 | + f.create_dataset('seed', data=seed) |
| 130 | + f.create_dataset('snr', data=snr) |
| 131 | + f.create_dataset('images', data=images) |
| 132 | + f.create_dataset('positions', data=positions) |
| 133 | + |
| 134 | +print(f'\nRan {num_imgs} images in {tok-tik:.0f} s\n') |
0 commit comments