From c85d82f38ea4741c1377b39c05dcf4869ccd6f26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Sat, 23 Dec 2023 15:03:16 +0100 Subject: [PATCH 001/161] typo --- spectractor/extractor/extractor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index bce64c9e6..d22d38907 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1037,7 +1037,7 @@ def SpectractorRun(image, output_directory, guess=None): spectrum: Spectrum The extracted spectrum object. w: FullForwardModelFitWorkspace - The FFM wrokspace. + The FFM workspace. Examples -------- From 89e01c621c3675a6bb35741547160a5517b148d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 23 Jan 2024 10:15:18 +0100 Subject: [PATCH 002/161] add flat and star_field attributes --- spectractor/extractor/images.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index dd1396f02..683b3f298 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -154,6 +154,11 @@ def __init__(self, file_name, *, target_label="", disperser_label="", self.pressure = 0 self.humidity = 0 + self.flat = None + self.star_field = None + + self.imgs = [self.data, self.stat_errors, self.flat, self.star_field] + if parameters.CALLING_CODE != 'LSST_DM' and file_name != "": self.load_image(file_name) else: From 0974e3d27d749daab6d5ffce3d45fd5bdcaca921 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 23 Jan 2024 10:25:15 +0100 Subject: [PATCH 003/161] rename stat_errors and stat_errors_rotated attributes in err and err_rotated --- spectractor/extractor/extractor.py | 4 +-- spectractor/extractor/images.py | 54 ++++++++++++++++-------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 50e54d86d..cb8817315 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1244,7 +1244,7 @@ def extract_spectrum_from_image(image, spectrum, signal_width=10, ws=(20, 30), r # Make a data copy data = np.copy(image.data_rotated)#[:, 0:right_edge] - err = np.copy(image.stat_errors_rotated)#[:, 0:right_edge] + err = np.copy(image.err_rotated)#[:, 0:right_edge] # Lateral bands to remove sky background Ny, Nx = data.shape @@ -1355,7 +1355,7 @@ def bgd_model_func(x, y): # Extract the spectrogram edges data = np.copy(image.data)[:, 0:right_edge] - err = np.copy(image.stat_errors)[:, 0:right_edge] + err = np.copy(image.err)[:, 0:right_edge] Ny, Nx = data.shape x0 = int(image.target_pixcoords[0]) y0 = int(image.target_pixcoords[1]) diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index 683b3f298..7b477e52c 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -34,14 +34,18 @@ class Image(object): Units of the image. data: array Image 2D array in self.units units. - stat_errors: array + err: array Image 2D uncertainty array in self.units units. target_pixcoords: array Target position [x,y] in the image in pixels. data_rotated: array Rotated image 2D array in self.units units. - stat_errors_rotated: array + err_rotated: array Rotated image 2D uncertainty array in self.units units. + flat: array + Flat 2D array without units and median of 1. + star_field: array + Star field simulation, no units needed but better in ADU/s. target_pixcoords_rotated: array Target position [x,y] in the rotated image in pixels. date_obs: str @@ -116,7 +120,7 @@ def __init__(self, file_name, *, target_label="", disperser_label="", :hide: >>> assert im.data is not None and np.mean(im.data) > 0 - >>> assert im.stat_errors is not None and np.mean(im.stat_errors) > 0 + >>> assert im.err is not None and np.mean(im.err) > 0 >>> assert im.header is not None >>> assert im.gain is not None and np.mean(im.gain) > 0 @@ -140,8 +144,8 @@ def __init__(self, file_name, *, target_label="", disperser_label="", self.data_rotated = None self.gain = None # in e-/ADU self.read_out_noise = None - self.stat_errors = None - self.stat_errors_rotated = None + self.err = None + self.err_rotated = None self.rotation_angle = 0 self.parallactic_angle = None self.saturation = None @@ -157,7 +161,7 @@ def __init__(self, file_name, *, target_label="", disperser_label="", self.flat = None self.star_field = None - self.imgs = [self.data, self.stat_errors, self.flat, self.star_field] + self.imgs = [self.data, self.err, self.flat, self.star_field] if parameters.CALLING_CODE != 'LSST_DM' and file_name != "": self.load_image(file_name) @@ -204,14 +208,14 @@ def rebin(self): >>> im.rebin() >>> im.data.shape (1024, 1024) - >>> im.stat_errors.shape + >>> im.err.shape (1024, 1024) >>> im.target_guess array([405., 295.]) """ new_shape = np.asarray(self.data.shape) // parameters.CCD_REBIN self.data = rebin(self.data, new_shape) - self.stat_errors = np.sqrt(rebin(self.stat_errors ** 2, new_shape)) + self.err = np.sqrt(rebin(self.err ** 2, new_shape)) if self.target_guess is not None: self.target_guess = np.asarray(self.target_guess) / parameters.CCD_REBIN @@ -287,9 +291,9 @@ def convert_to_ADU_rate_units(self): >>> assert np.all(np.isclose(data_before, im.data * im.expo)) """ self.data = self.data.astype(np.float64) / self.expo - self.stat_errors /= self.expo - if self.stat_errors_rotated is not None: - self.stat_errors_rotated /= self.expo + self.err /= self.expo + if self.err_rotated is not None: + self.err_rotated /= self.expo self.units = 'ADU/s' def convert_to_ADU_units(self): @@ -311,9 +315,9 @@ def convert_to_ADU_units(self): >>> assert np.all(np.isclose(data_before, im.data)) """ self.data *= self.expo - self.stat_errors *= self.expo - if self.stat_errors_rotated is not None: - self.stat_errors_rotated *= self.expo + self.err *= self.expo + if self.err_rotated is not None: + self.err_rotated *= self.expo self.units = 'ADU' def compute_statistical_error(self): @@ -353,9 +357,9 @@ def compute_statistical_error(self): # remove negative values (due to dead columns for instance min_noz = np.min(err2[err2 > 0]) err2[err2 <= 0] = min_noz - self.stat_errors = np.sqrt(err2) + self.err = np.sqrt(err2) # convert in ADU - self.stat_errors /= self.gain + self.err /= self.gain # check uncertainty model self.check_statistical_error() @@ -401,7 +405,7 @@ def check_statistical_error(self): data = np.copy(self.data) min_noz = np.min(data[data > 0]) data[data <= 0] = min_noz - y = self.stat_errors.flatten() ** 2 + y = self.err.flatten() ** 2 x = data.flatten() fit, cov, model = fit_poly1d(x, y, order=1) gain = 1 / fit[0] @@ -449,7 +453,7 @@ def plot_statistical_error(self): ax[0].grid() ax[0].set_ylabel(r"$\sigma_{\mathrm{ADU}}^2$ [ADU$^2$]") ax[0].set_xlabel(r"Data pixel values [ADU]") - plot_image_simple(ax[1], data=self.stat_errors, scale="log10", title="Statistical uncertainty map", + plot_image_simple(ax[1], data=self.err, scale="log10", title="Statistical uncertainty map", units=self.units, target_pixcoords=None, aspect="auto", cmap=None) fig.tight_layout() if parameters.LSST_SAVEFIGPATH: # pragma: no cover @@ -515,7 +519,7 @@ def plot_image(self, ax=None, scale="lin", title="", units="", plot_stats=False, ax = plt.gca() data = np.copy(self.data) if plot_stats: - data = np.copy(self.stat_errors) + data = np.copy(self.err) if units == "": units = self.units plot_image_simple(ax, data=data, scale=scale, title=title, units=units, cax=cax, @@ -986,10 +990,10 @@ def find_target_init(image, guess, rotated=False, widths=[parameters.XWINDOW, pa Dx, Dy = widths if rotated: sub_image = np.copy(image.data_rotated[y0 - Dy:y0 + Dy, x0 - Dx:x0 + Dx]) - sub_errors = np.copy(image.stat_errors[y0 - Dy:y0 + Dy, x0 - Dx:x0 + Dx]) + sub_errors = np.copy(image.err[y0 - Dy:y0 + Dy, x0 - Dx:x0 + Dx]) else: sub_image = np.copy(image.data[y0 - Dy:y0 + Dy, x0 - Dx:x0 + Dx]) - sub_errors = np.copy(image.stat_errors[y0 - Dy:y0 + Dy, x0 - Dx:x0 + Dx]) + sub_errors = np.copy(image.err[y0 - Dy:y0 + Dy, x0 - Dx:x0 + Dx]) # usually one rebin by adding pixel contents image.saturation = parameters.CCD_MAXADU / image.expo *parameters.CCD_REBIN**2 @@ -1413,11 +1417,11 @@ def turn_image(image): if not np.isnan(image.rotation_angle): image.data_rotated = ndimage.rotate(image.data, image.rotation_angle, prefilter=parameters.ROT_PREFILTER, order=parameters.ROT_ORDER) - image.stat_errors_rotated = np.sqrt( - np.abs(ndimage.rotate(image.stat_errors ** 2, image.rotation_angle, + image.err_rotated = np.sqrt( + np.abs(ndimage.rotate(image.err ** 2, image.rotation_angle, prefilter=parameters.ROT_PREFILTER, order=parameters.ROT_ORDER))) - min_noz = np.min(image.stat_errors_rotated[image.stat_errors_rotated > 0]) - image.stat_errors_rotated[image.stat_errors_rotated <= 0] = min_noz + min_noz = np.min(image.err_rotated[image.err_rotated > 0]) + image.err_rotated[image.err_rotated <= 0] = min_noz if parameters.DEBUG: margin = 100 // parameters.CCD_REBIN y0 = int(image.target_pixcoords[1]) From e107961a89d3902799264ba1c98e2a72ac7856b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 23 Jan 2024 10:29:34 +0100 Subject: [PATCH 004/161] rename spectrogram in spectrogram_data --- spectractor/extractor/extractor.py | 10 +++++----- spectractor/extractor/spectrum.py | 18 +++++++++--------- spectractor/fit/fit_spectrogram.py | 8 ++++---- spectractor/simulation/image_simulation.py | 4 ++-- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index cb8817315..fd10c98e5 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -120,7 +120,7 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p # crop data to fit faster self.lambdas = self.spectrum.lambdas self.bgd_width = parameters.PIXWIDTH_BACKGROUND + parameters.PIXDIST_BACKGROUND - parameters.PIXWIDTH_SIGNAL - self.data = spectrum.spectrogram[self.bgd_width:-self.bgd_width, :] + self.data = spectrum.spectrogram_data[self.bgd_width:-self.bgd_width, :] self.err = spectrum.spectrogram_err[self.bgd_width:-self.bgd_width, :] self.bgd = spectrum.spectrogram_bgd[self.bgd_width:-self.bgd_width, :] self.bgd_flat = self.bgd.flatten() @@ -643,7 +643,7 @@ def plot_spectrogram_comparison_simple(self, ax, title='', extent=None, dispersi lambdas = self.spectrum.lambdas sub = np.where((lambdas > parameters.LAMBDA_MIN) & (lambdas < parameters.LAMBDA_MAX))[0] - sub = np.where(sub < self.spectrum.spectrogram.shape[1])[0] + sub = np.where(sub < self.spectrum.spectrogram_data.shape[1])[0] data = (data + self.bgd_flat).reshape((self.Ny, self.Nx)) err = self.err.reshape((self.Ny, self.Nx)) model = (self.model + self.params["B"] * self.bgd_flat).reshape((self.Ny, self.Nx)) @@ -1411,7 +1411,7 @@ def bgd_model_func(x, y): f'\n\tNew target position in spectrogram frame: {target_pixcoords_spectrogram}') # Save results - spectrum.spectrogram = data + spectrum.spectrogram_data = data spectrum.spectrogram_err = err spectrum.spectrogram_x0 = target_pixcoords_spectrogram[0] spectrum.spectrogram_y0 = target_pixcoords_spectrogram[1] @@ -1491,7 +1491,7 @@ def run_spectrogram_deconvolution_psf2d(spectrum, bgd_model_func): """ my_logger = set_logger(__name__) s = spectrum.chromatic_psf - Ny, Nx = spectrum.spectrogram.shape + Ny, Nx = spectrum.spectrogram_data.shape # build 1D priors Dx_rot = np.copy(s.table['Dx']) @@ -1525,7 +1525,7 @@ def run_spectrogram_deconvolution_psf2d(spectrum, bgd_model_func): f"\n{s.table[['amplitude', 'x_c', 'y_c', 'Dx', 'Dy', 'Dy_disp_axis']]}") my_logger.info(f'\n\tStart ChromaticPSF polynomial fit with ' f'mode={mode} and amplitude_priors_method={method}...') - data = spectrum.spectrogram + data = spectrum.spectrogram_data err = spectrum.spectrogram_err my_logger.info('\n\t ======================= ChromaticPSF2D polynomial fit =============================') diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index bb3d33c6c..fb755e31a 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -133,7 +133,7 @@ class Spectrum: Outside relative humidity in fraction of one. throughput: callable Instrumental throughput of the telescope. - spectrogram: array + spectrogram_data: array Spectrogram 2D image in image units. spectrogram_bgd: array Estimated 2D background fitted below the spectrogram in image units. @@ -237,7 +237,7 @@ def __init__(self, file_name="", image=None, order=1, target=None, config="", fa self.rotation_angle = 0 self.parallactic_angle = None self.camera_angle = 0 - self.spectrogram = None + self.spectrogram_data = None self.spectrogram_bgd = None self.spectrogram_bgd_rms = None self.spectrogram_err = None @@ -504,7 +504,7 @@ def plot_spectrogram(self, ax=None, scale="lin", title="", units="Image units", if ax is None: plt.figure(figsize=figsize) ax = plt.gca() - data = np.copy(self.spectrogram) + data = np.copy(self.spectrogram_data) if plot_stats: data = np.copy(self.spectrogram_err) plot_image_simple(ax, data=data, scale=scale, title=title, units=units, cax=cax, @@ -587,7 +587,7 @@ def generate_axes(fig): widthPlot.set_xlabel(r'$\lambda$ [nm]') widthPlot.grid() - spectrogram = np.copy(self.spectrogram) + spectrogram = np.copy(self.spectrogram_data) res = self.spectrogram_residuals.reshape((-1, self.spectrogram_Nx)) std = np.std(res) if spectrogram.shape[0] != res.shape[0]: @@ -688,7 +688,7 @@ def save_spectrum(self, output_file_name, overwrite=False): hdus[extname].header["IM_X0"] = self.target.image_x0 hdus[extname].header["IM_Y0"] = self.target.image_y0 elif extname == "S_DATA": - hdus[extname].data = self.spectrogram + hdus[extname].data = self.spectrogram_data hdus[extname].header['UNIT1'] = self.units elif extname == "S_ERR": hdus[extname].data = self.spectrogram_err @@ -784,7 +784,7 @@ def save_spectrogram(self, output_file_name, overwrite=False): # pragma: no cov hdu6 = fits.ImageHDU() hdu6.header["EXTNAME"] = "S_RES" hdu1.header = self.header - hdu1.data = self.spectrogram + hdu1.data = self.spectrogram_data hdu2.data = self.spectrogram_err hdu3.data = self.spectrogram_bgd hdu4.data = self.spectrogram_bgd_rms @@ -961,7 +961,7 @@ def load_spectrum_older_24(self, input_file_name, spectrogram_file_name_override self.target.image_y0 = float(hdu_list["ORDER0"].header["IM_Y0"]) # load spectrogram info if len(hdu_list) > 4: - self.spectrogram = hdu_list["S_DATA"].data + self.spectrogram_data = hdu_list["S_DATA"].data self.spectrogram_err = hdu_list["S_ERR"].data self.spectrogram_bgd = hdu_list["S_BGD"].data if len(hdu_list) > 7: @@ -1074,7 +1074,7 @@ def load_spectrum_latest(self, input_file_name): self.target.image_x0 = float(hdu_list["ORDER0"].header["IM_X0"]) self.target.image_y0 = float(hdu_list["ORDER0"].header["IM_Y0"]) # load spectrogram info - self.spectrogram = hdu_list["S_DATA"].data + self.spectrogram_data = hdu_list["S_DATA"].data self.spectrogram_err = hdu_list["S_ERR"].data self.spectrogram_bgd = hdu_list["S_BGD"].data self.spectrogram_bgd_rms = hdu_list["S_BGD_ER"].data @@ -1100,7 +1100,7 @@ def load_spectrogram(self, input_file_name): # pragma: no cover if os.path.isfile(input_file_name): with fits.open(input_file_name) as hdu_list: header = hdu_list[0].header - self.spectrogram = hdu_list[0].data + self.spectrogram_data = hdu_list[0].data self.spectrogram_err = hdu_list[1].data self.spectrogram_bgd = hdu_list[2].data if len(hdu_list) > 3: diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index be0f030c7..343f0791f 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -125,8 +125,8 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, if self.spectrum.spectrogram_Ny > 2 * parameters.PIXDIST_BACKGROUND: self.crop_spectrogram() self.lambdas = self.spectrum.lambdas - self.Ny, self.Nx = self.spectrum.spectrogram.shape - self.data = self.spectrum.spectrogram.flatten() + self.Ny, self.Nx = self.spectrum.spectrogram_data.shape + self.data = self.spectrum.spectrogram_data.flatten() self.err = self.spectrum.spectrogram_err.flatten() self.fit_angstrom_exponent = fit_angstrom_exponent @@ -164,11 +164,11 @@ def crop_spectrogram(self): self.spectrum.spectrogram_ymax = self.spectrum.spectrogram_ymax - bgd_width self.spectrum.spectrogram_ymin += bgd_width self.spectrum.spectrogram_bgd = self.spectrum.spectrogram_bgd[bgd_width:-bgd_width, :] - self.spectrum.spectrogram = self.spectrum.spectrogram[bgd_width:-bgd_width, :] + self.spectrum.spectrogram_data = self.spectrum.spectrogram_data[bgd_width:-bgd_width, :] self.spectrum.spectrogram_err = self.spectrum.spectrogram_err[bgd_width:-bgd_width, :] self.spectrum.spectrogram_y0 -= bgd_width self.spectrum.chromatic_psf.y0 -= bgd_width - self.spectrum.spectrogram_Ny, self.spectrum.spectrogram_Nx = self.spectrum.spectrogram.shape + self.spectrum.spectrogram_Ny, self.spectrum.spectrogram_Nx = self.spectrum.spectrogram_data.shape self.spectrum.chromatic_psf.table["y_c"] -= bgd_width self.my_logger.debug(f'\n\tSize of the spectrogram region after cropping: ' f'({self.spectrum.spectrogram_Nx},{self.spectrum.spectrogram_Ny})') diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index 8db114bfe..0fd7ba9bc 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -325,10 +325,10 @@ def compute(self, star, background, spectrogram, starfield=None): yy, xx = np.mgrid[0:parameters.CCD_IMSIZE:1, 0:parameters.CCD_IMSIZE:1] self.data = star.psf.evaluate(np.array([xx, yy])) + background.model() if spectrogram.full_image: - self.data[spectrogram.spectrogram_ymin:spectrogram.spectrogram_ymax, :] += spectrogram.spectrogram + self.data[spectrogram.spectrogram_ymin:spectrogram.spectrogram_ymax, :] += spectrogram.spectrogram_data else: self.data[spectrogram.spectrogram_ymin:spectrogram.spectrogram_ymax, - spectrogram.spectrogram_xmin:spectrogram.spectrogram_xmax] += spectrogram.spectrogram + spectrogram.spectrogram_xmin:spectrogram.spectrogram_xmax] += spectrogram.spectrogram_data # - spectrogram.spectrogram_bgd) if starfield is not None: self.data += starfield.model(xx, yy) From 54bccd8d8c7773b8b2e9e25e7adf28046ec87407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 23 Jan 2024 10:39:50 +0100 Subject: [PATCH 005/161] rename spectrogram in spectrogram_data --- spectractor/simulation/image_simulation.py | 4 ++-- spectractor/simulation/simulator.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index 0fd7ba9bc..d5c8d392e 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -470,11 +470,11 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer true_spectrum = np.copy(spectrogram.true_spectrum) # Saturation effects - saturated_pixels = np.where(spectrogram.spectrogram > image.saturation)[0] + saturated_pixels = np.where(spectrogram.spectrogram_data > image.saturation)[0] if len(saturated_pixels) > 0: my_logger.warning(f"\n\t{len(saturated_pixels)} saturated pixels detected above saturation " f"level at {image.saturation} ADU/s in the spectrogram." - f"\n\tSpectrogram maximum is at {np.max(spectrogram.spectrogram)} ADU/s.") + f"\n\tSpectrogram maximum is at {np.max(spectrogram.spectrogram_data)} ADU/s.") image.data[image.data > image.saturation] = image.saturation # Convert data from ADU/s in ADU diff --git a/spectractor/simulation/simulator.py b/spectractor/simulation/simulator.py index 07d38e264..931b2521c 100644 --- a/spectractor/simulation/simulator.py +++ b/spectractor/simulation/simulator.py @@ -521,11 +521,11 @@ def simulate(self, A1=1.0, A2=0., A3=0., aerosols=0.05, angstrom_exponent=None, self.profile_params[order][:, 0] = spec # self.spectrogram is in ADU/s units here - self.spectrogram = A1 * ima + self.spectrogram_data = A1 * ima self.spectrogram_err = A1 * np.sqrt(ima_err2) if self.with_background: - self.spectrogram += B * self.spectrogram_bgd + self.spectrogram_data += B * self.spectrogram_bgd # Save the simulation parameters self.psf_poly_params = np.copy(poly_params[0]) self.header['OZONE_T'] = ozone @@ -539,7 +539,7 @@ def simulate(self, A1=1.0, A2=0., A3=0., aerosols=0.05, angstrom_exponent=None, self.header['Y0_T'] = shift_y self.header['ROTANGLE'] = angle - return self.lambdas, self.spectrogram, self.spectrogram_err + return self.lambdas, self.spectrogram_data, self.spectrogram_err if __name__ == "__main__": From 7fd23013634bbd26d912edd70aace2ce1d2f415a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 23 Jan 2024 10:45:06 +0100 Subject: [PATCH 006/161] remove right_edge option --- spectractor/extractor/extractor.py | 33 +++++++++++++++--------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index fd10c98e5..71f63b094 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1111,8 +1111,7 @@ def SpectractorRun(image, output_directory, guess=None): w_psf1d, bgd_model_func = extract_spectrum_from_image(image, spectrum, signal_width=parameters.PIXWIDTH_SIGNAL, ws=(parameters.PIXDIST_BACKGROUND, parameters.PIXDIST_BACKGROUND - + parameters.PIXWIDTH_BACKGROUND), - right_edge=image.data.shape[1]) + + parameters.PIXWIDTH_BACKGROUND)) # PSF2D deconvolution if parameters.SPECTRACTOR_DECONVOLUTION_PSF2D: @@ -1203,7 +1202,7 @@ def Spectractor(file_name, output_directory, target_label='', guess=None, disper return spectrum -def extract_spectrum_from_image(image, spectrum, signal_width=10, ws=(20, 30), right_edge=parameters.CCD_IMSIZE): +def extract_spectrum_from_image(image, spectrum, signal_width=10, ws=(20, 30)): """Extract the 1D spectrum from the image. Method : remove a uniform background estimated from the rectangular lateral bands @@ -1229,8 +1228,6 @@ def extract_spectrum_from_image(image, spectrum, signal_width=10, ws=(20, 30), r Half width of central region where the spectrum is extracted and summed (default: 10) ws: list up/down region extension where the sky background is estimated with format [int, int] (default: [20,30]) - right_edge: int - Right-hand pixel position above which no pixel should be used (default: parameters.CCD_IMSIZE) """ my_logger = set_logger(__name__) @@ -1243,12 +1240,13 @@ def extract_spectrum_from_image(image, spectrum, signal_width=10, ws=(20, 30), r f'and background from {ws[0]:.0f} to {ws[1]:.0f} pixels') # Make a data copy - data = np.copy(image.data_rotated)#[:, 0:right_edge] - err = np.copy(image.err_rotated)#[:, 0:right_edge] + data = np.copy(image.data_rotated) + err = np.copy(image.err_rotated) # Lateral bands to remove sky background Ny, Nx = data.shape y0 = int(image.target_pixcoords_rotated[1]) + right_edge = image.data_rotated.shape[1] ymax = min(Ny, y0 + ws[1]) ymin = max(0, y0 - ws[1]) @@ -1354,8 +1352,9 @@ def bgd_model_func(x, y): spectrum.chromatic_psf = s # Extract the spectrogram edges - data = np.copy(image.data)[:, 0:right_edge] - err = np.copy(image.err)[:, 0:right_edge] + right_edge = image.data.shape[1] + data = np.copy(image.data) + err = np.copy(image.err) Ny, Nx = data.shape x0 = int(image.target_pixcoords[0]) y0 = int(image.target_pixcoords[1]) @@ -1381,26 +1380,30 @@ def bgd_model_func(x, y): # Create spectrogram data = data[ymin:ymax, xmin:xmax] err = err[ymin:ymax, xmin:xmax] + + spectrum.spectrogram_data = data + spectrum.spectrogram_err = err + Ny, Nx = data.shape my_logger.info(f'\n\tExtract spectrogram: crop raw image [{xmin}:{xmax},{ymin}:{ymax}] (size ({Nx}, {Ny}))') - # Extract the non rotated background + # Extract the non-rotated background my_logger.info('\n\t ======================= Extract the non rotated background =============================') if parameters.SPECTRACTOR_BACKGROUND_SUBTRACTION: - bgd_model_func, bgd_res, bgd_rms = extract_spectrogram_background_sextractor(data, err, ws=ws, Dy_disp_axis=s.table['y_c']) + bgd_model_func, bgd_res, bgd_rms = extract_spectrogram_background_sextractor(spectrum.spectrogram_data, + spectrum.spectrogram_err, + ws=ws, Dy_disp_axis=s.table['y_c']) bgd = bgd_model_func(np.arange(Nx), np.arange(Ny)) my_logger.info(f"\n\tBackground statistics: mean={np.nanmean(bgd):.3f} {image.units}, " f"RMS={np.nanmean(bgd_rms):.3f} {image.units}.") # Propagate background uncertainties - err = np.sqrt(err * err + bgd_rms * bgd_rms) + spectrum.spectrogram_err = np.sqrt(spectrum.spectrogram_err * spectrum.spectrogram_err + bgd_rms * bgd_rms) spectrum.spectrogram_bgd = bgd spectrum.spectrogram_bgd_rms = bgd_rms # First guess for lambdas - my_logger.info('\n\t ======================= first guess for lambdas =============================') - first_guess_lambdas = image.disperser.grating_pixel_to_lambda(s.get_algebraic_distance_along_dispersion_axis(), x0=image.target_pixcoords, order=spectrum.order) s.table['lambdas'] = first_guess_lambdas @@ -1411,8 +1414,6 @@ def bgd_model_func(x, y): f'\n\tNew target position in spectrogram frame: {target_pixcoords_spectrogram}') # Save results - spectrum.spectrogram_data = data - spectrum.spectrogram_err = err spectrum.spectrogram_x0 = target_pixcoords_spectrogram[0] spectrum.spectrogram_y0 = target_pixcoords_spectrogram[1] spectrum.spectrogram_xmin = xmin From de7b91351febeb89dbde95f225e10b274d4a2e67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 23 Jan 2024 11:00:17 +0100 Subject: [PATCH 007/161] initialize spectrogram starfield and flat --- spectractor/extractor/extractor.py | 27 +++++++++++++++------------ spectractor/extractor/images.py | 6 ++---- spectractor/extractor/spectrum.py | 10 ++++++++++ 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 71f63b094..deb2524e3 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1352,10 +1352,7 @@ def bgd_model_func(x, y): spectrum.chromatic_psf = s # Extract the spectrogram edges - right_edge = image.data.shape[1] - data = np.copy(image.data) - err = np.copy(image.err) - Ny, Nx = data.shape + Ny, Nx = image.data.shape x0 = int(image.target_pixcoords[0]) y0 = int(image.target_pixcoords[1]) ymax = min(Ny, y0 + int(s.table['Dy_disp_axis'].max()) + ws[1] + 1) # +1 to include edges @@ -1365,7 +1362,7 @@ def bgd_model_func(x, y): lambda_min_index = int(np.argmin(np.abs(lambdas[::np.sign(spectrum.order)] - parameters.LAMBDA_MIN))) lambda_max_index = int(np.argmin(np.abs(lambdas[::np.sign(spectrum.order)] - parameters.LAMBDA_MAX))) xmin = max(0, int(s.table['Dx'][lambda_min_index] + x0)) - xmax = min(right_edge, int(s.table['Dx'][lambda_max_index] + x0) + 1) # +1 to include edges + xmax = min(Nx, int(s.table['Dx'][lambda_max_index] + x0) + 1) # +1 to include edges # Position of the order 0 in the spectrogram coordinates target_pixcoords_spectrogram = [image.target_pixcoords[0] - xmin, image.target_pixcoords[1] - ymin] s.y0 = target_pixcoords_spectrogram[1] @@ -1378,13 +1375,18 @@ def bgd_model_func(x, y): f"\n{s.table[['amplitude', 'x_c', 'y_c', 'Dx', 'Dy', 'Dy_disp_axis']]}") # Create spectrogram - data = data[ymin:ymax, xmin:xmax] - err = err[ymin:ymax, xmin:xmax] - - spectrum.spectrogram_data = data - spectrum.spectrogram_err = err + spectrum.spectrogram_data = np.copy(image.data[ymin:ymax, xmin:xmax]) + spectrum.spectrogram_err = np.copy(image.err[ymin:ymax, xmin:xmax]) + if image.starfield is not None: + spectrum.spectrogram_starfield = np.copy(image.starfield[ymin:ymax, xmin:xmax]) + else: + spectrum.spectrogram_starfield = None # np.zeros_like(spectrum.spectrogram_data) + if image.flat is not None: + spectrum.spectrogram_flat = np.copy(image.flat[ymin:ymax, xmin:xmax]) + else: + spectrum.spectrogram_flat = None # np.ones_like(spectrum.spectrogram_data) - Ny, Nx = data.shape + Ny, Nx = spectrum.spectrogram_data.shape my_logger.info(f'\n\tExtract spectrogram: crop raw image [{xmin}:{xmax},{ymin}:{ymax}] (size ({Nx}, {Ny}))') # Extract the non-rotated background @@ -1448,7 +1450,8 @@ def bgd_model_func(x, y): gs_kw = dict(width_ratios=[3, 0.08], height_ratios=[1, 1]) fig, ax = plt.subplots(2, 2, sharex='none', figsize=(16, 6), gridspec_kw=gs_kw) xx = np.arange(s.table['Dx'].size) - plot_image_simple(ax[1, 0], data=data, scale="symlog", title='', units=image.units, aspect='auto', cax=ax[1, 1]) + plot_image_simple(ax[1, 0], data=spectrum.spectrogram_data, scale="symlog", title='', + units=image.units, aspect='auto', cax=ax[1, 1]) ax[1, 0].plot(xx, target_pixcoords_spectrogram[1] + s.table['Dy_disp_axis'], label='Dispersion axis', color="r") ax[1, 0].scatter(xx, target_pixcoords_spectrogram[1] + s.table['Dy'], c=s.table['lambdas'], edgecolors='None', cmap=from_lambda_to_colormap(s.table['lambdas']), diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index 7b477e52c..ea3567b92 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -44,7 +44,7 @@ class Image(object): Rotated image 2D uncertainty array in self.units units. flat: array Flat 2D array without units and median of 1. - star_field: array + starfield: array Star field simulation, no units needed but better in ADU/s. target_pixcoords_rotated: array Target position [x,y] in the rotated image in pixels. @@ -159,9 +159,7 @@ def __init__(self, file_name, *, target_label="", disperser_label="", self.humidity = 0 self.flat = None - self.star_field = None - - self.imgs = [self.data, self.err, self.flat, self.star_field] + self.starfield = None if parameters.CALLING_CODE != 'LSST_DM' and file_name != "": self.load_image(file_name) diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index fb755e31a..764b2173f 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -243,6 +243,8 @@ def __init__(self, file_name="", image=None, order=1, target=None, config="", fa self.spectrogram_err = None self.spectrogram_residuals = None self.spectrogram_fit = None + self.spectrogram_flat = None + self.spectrogram_starfield = None self.spectrogram_x0 = None self.spectrogram_y0 = None self.spectrogram_xmin = None @@ -700,6 +702,10 @@ def save_spectrum(self, output_file_name, overwrite=False): hdus[extname].data = self.spectrogram_fit elif extname == "S_RES": hdus[extname].data = self.spectrogram_residuals + elif extname == "S_FLAT" and self.spectrogram_flat is not None: + hdus[extname].data = self.spectrogram_flat + elif extname == "S_STAR" and self.spectrogram_starfield is not None: + hdus[extname].data = self.spectrogram_starfield elif extname == "PSF_TAB": hdus[extname] = fits.table_to_hdu(self.chromatic_psf.table) elif extname == "LINES": @@ -1080,6 +1086,10 @@ def load_spectrum_latest(self, input_file_name): self.spectrogram_bgd_rms = hdu_list["S_BGD_ER"].data self.spectrogram_fit = hdu_list["S_FIT"].data self.spectrogram_residuals = hdu_list["S_RES"].data + if "S_FLAT" in hdu_list.keys(): + self.spectrogram_flat = hdu_list["S_FLAT"].data + if "S_STAR" in hdu_list.keys(): + self.spectrogram_starfield = hdu_list["S_STAR"].data self.chromatic_psf.init_from_table(Table.read(hdu_list["PSF_TAB"]), saturation=self.spectrogram_saturation) self.lines.table = Table.read(hdu_list["LINES"], unit_parse_strict="silent") From 815781504cae237050001937ddcb76b9ca1bd9a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 23 Jan 2024 11:14:38 +0100 Subject: [PATCH 008/161] initialize spectrogram starfield and flat --- spectractor/extractor/spectrum.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index 764b2173f..62e5c2b58 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -1086,9 +1086,9 @@ def load_spectrum_latest(self, input_file_name): self.spectrogram_bgd_rms = hdu_list["S_BGD_ER"].data self.spectrogram_fit = hdu_list["S_FIT"].data self.spectrogram_residuals = hdu_list["S_RES"].data - if "S_FLAT" in hdu_list.keys(): + if "S_FLAT" in hdu_list.__dict__.keys(): self.spectrogram_flat = hdu_list["S_FLAT"].data - if "S_STAR" in hdu_list.keys(): + if "S_STAR" in hdu_list.__dict__.keys(): self.spectrogram_starfield = hdu_list["S_STAR"].data self.chromatic_psf.init_from_table(Table.read(hdu_list["PSF_TAB"]), saturation=self.spectrogram_saturation) From 2837c607c7aa2c92ff9a731dc7f11f0c34ea0d44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 23 Jan 2024 13:50:54 +0100 Subject: [PATCH 009/161] cleaning --- spectractor/extractor/extractor.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index deb2524e3..edf97a32d 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -431,14 +431,6 @@ def simulate(self, *params): self.psf_profile_params[order][:, 2] += dispersion_law.imag - self.bgd_width # Matrix filling - # Older piece of code, using full matrices (non sparse). Keep here for temporary archive. - # psf_cube_order = self.spectrum.chromatic_psf.build_psf_cube(self.pixels, profile_params[-1], fwhmx_clip=3 * parameters.PSF_FWHM_CLIP, fwhmy_clip=parameters.PSF_FWHM_CLIP, dtype="float32", mask=self.psf_cubes_masked[order], boundaries=self.boundaries[order]) - # if self.sparse_indices is None: - # self.sparse_indices = np.concatenate([np.where(self.psf_cube_masked[k].ravel() > 0)[0] for k in range(len(profile_params))]) - # if psf_cube is None: - # psf_cube = psf_cube_order - # else: - # psf_cube += psf_cube_order M_order = self.spectrum.chromatic_psf.build_sparse_M(self.pixels, self.psf_profile_params[order], dtype="float32", M_sparse_indices=self.M_sparse_indices[order], boundaries=self.boundaries[order]) if M is None: @@ -446,10 +438,6 @@ def simulate(self, *params): else: M += M_order - # M = psf_cube.reshape(len(profile_params[0]), self.pixels[0].size).T # flattening - # if self.sparse_indices is None: - # self.sparse_indices = np.where(M > 0) - # M = sparse.csc_matrix((M[self.sparse_indices].ravel(), self.sparse_indices), shape=M.shape, dtype="float32") # Algebra to compute amplitude parameters if self.amplitude_priors_method != "fixed": M_dot_W = M.T @ self.sqrtW From c297b34b5fe999ea9b6d5a548581c7f305004e37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 23 Jan 2024 14:01:29 +0100 Subject: [PATCH 010/161] cleaning --- spectractor/extractor/extractor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index edf97a32d..a409c8511 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1093,6 +1093,7 @@ def SpectractorRun(image, output_directory, guess=None): parameters.YWINDOW_ROT)) # Create Spectrum object spectrum = Spectrum(image=image, order=parameters.SPEC_ORDER) + # First 1D spectrum extraction and background extraction my_logger.info('\n\t ======================== PSF1D Extraction ====================================') From a41a3a5a4b8648b1cef261f7c81d6251d5387a78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 24 Jan 2024 12:13:24 +0100 Subject: [PATCH 011/161] robust ndof optimal estimate --- spectractor/extractor/chromaticpsf.py | 2 +- spectractor/extractor/extractor.py | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index 6c3e3ce80..0e047c230 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -1927,7 +1927,7 @@ def __init__(self, chromatic_psf, data, data_errors, mode, bgd_model_func=None, self.amplitude_priors_method = amplitude_priors_method self.fwhm_priors = np.copy(self.chromatic_psf.table['fwhm']) self.reg = parameters.PSF_FIT_REG_PARAM - self.trace_r = self.Nx / np.min(self.fwhm_priors) # spectrophotometric uncertainty principle + self.trace_r = self.Nx / np.median(self.fwhm_priors) # spectrophotometric uncertainty principle self.Q = np.zeros((self.Nx, self.Nx)) self.Q_dot_A0 = np.zeros(self.Nx) if amplitude_priors_method not in self.amplitude_priors_list: diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index a409c8511..4c1ee9309 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -200,7 +200,7 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p self.reg = float(spectrum.header['PSF_REG']) if self.reg < 0: self.reg = parameters.PSF_FIT_REG_PARAM - self.trace_r = self.Nx / np.min(self.fwhm_priors) # spectrophotometric uncertainty principle + self.trace_r = self.Nx / np.median(self.fwhm_priors) # spectrophotometric uncertainty principle self.my_logger.info(f"\n\tFull forward model fitting with regularisation parameter r={self.reg}.") self.Q = np.zeros((self.Nx, self.Nx), dtype="float32") self.Q_dot_A0 = np.zeros(self.Nx, dtype="float32") @@ -1095,7 +1095,6 @@ def SpectractorRun(image, output_directory, guess=None): spectrum = Spectrum(image=image, order=parameters.SPEC_ORDER) # First 1D spectrum extraction and background extraction - my_logger.info('\n\t ======================== PSF1D Extraction ====================================') w_psf1d, bgd_model_func = extract_spectrum_from_image(image, spectrum, signal_width=parameters.PIXWIDTH_SIGNAL, ws=(parameters.PIXDIST_BACKGROUND, @@ -1285,7 +1284,6 @@ def bgd_model_func(x, y): # Fit the transverse profile my_logger.info('\n\t ======================= Fit the transverse profile =============================') - my_logger.info(f'\n\tStart PSF1D transverse fit...') psf = load_PSF(psf_type=parameters.PSF_TYPE, target=image.target, clip=False) s = ChromaticPSF(psf, Nx=Nx, Ny=Ny, x0=target_pixcoords_spectrogram[0], y0=target_pixcoords_spectrogram[1], From cda87ededc587b4578a6a4455b96c159d24ca3c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 24 Jan 2024 12:14:06 +0100 Subject: [PATCH 012/161] add Astar --- spectractor/extractor/extractor.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 4c1ee9309..846fc0f03 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -64,23 +64,23 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p spectrum.chromatic_psf.psf.apply_max_width_to_bounds(max_half_width=spectrum.spectrogram_Ny) psf_poly_params_bounds = spectrum.chromatic_psf.set_bounds() D2CCD = np.copy(spectrum.header['D2CCD']) - p = np.array([1, 1, 1, D2CCD, np.copy(spectrum.header['PIXSHIFT']), 0, + p = np.array([1, 1, 1, 1, D2CCD, np.copy(spectrum.header['PIXSHIFT']), 0, np.copy(spectrum.rotation_angle), 1, parameters.OBS_CAMERA_ROTATION, np.copy(spectrum.pressure), np.copy(spectrum.temperature), np.copy(spectrum.airmass)]) - self.psf_params_start_index = np.array([12 + len(self.psf_poly_params) * k for k in range(len(self.diffraction_orders))]) + self.psf_params_start_index = np.array([13 + len(self.psf_poly_params) * k for k in range(len(self.diffraction_orders))]) self.saturation = spectrum.spectrogram_saturation p = np.concatenate([p] + [self.psf_poly_params] * len(self.diffraction_orders)) input_labels = [f"A{order}" for order in self.diffraction_orders] - input_labels += [r"D_CCD [mm]", r"shift_x [pix]", r"shift_y [pix]", r"angle [deg]", "B", "R", "P [hPa]", "T [Celsius]", "z"] + input_labels += ["A_star", r"D_CCD [mm]", r"shift_x [pix]", r"shift_y [pix]", r"angle [deg]", "B", "R", "P [hPa]", "T [Celsius]", "z"] for order in self.diffraction_orders: input_labels += [label+f"_{order}" for label in psf_poly_params_labels] axis_names = [f"$A_{order}$" for order in self.diffraction_orders] - axis_names += [r"$D_{CCD}$ [mm]", r"$\delta_{\mathrm{x}}^{(\mathrm{fit})}$ [pix]", + axis_names += [r"$A_{star}$", r"$D_{CCD}$ [mm]", r"$\delta_{\mathrm{x}}^{(\mathrm{fit})}$ [pix]", r"$\delta_{\mathrm{y}}^{(\mathrm{fit})}$ [pix]", r"$\alpha$ [deg]", "$B$", "R", r"$P_{\mathrm{atm}}$ [hPa]", r"$T_{\mathrm{atm}}$ [Celcius]", "$z$"] for order in self.diffraction_orders: axis_names += [label+rf"$\!_{order}$" for label in psf_poly_params_names] - bounds = [[0, 2], [0, 2], [0, 2], + bounds = [[0, 2], [0, 2], [0, 2], [0, np.inf], [D2CCD - 3 * parameters.DISTANCE2CCD_ERR, D2CCD + 3 * parameters.DISTANCE2CCD_ERR], [-parameters.PIXSHIFT_PRIOR, parameters.PIXSHIFT_PRIOR], [-10 * parameters.PIXSHIFT_PRIOR, 10 * parameters.PIXSHIFT_PRIOR], @@ -104,6 +104,8 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p params.fixed[params.get_index(f"A{order}")] = True if "A2" in params.labels: params.fixed[params.get_index("A2")] = (not spectrum.disperser.flat_ratio_order_2over1) and (not ("A2_T" in spectrum.header)) + if spectrum.spectrogram_starfield is None: + params.fixed[params.get_index("A_star")] = True # Astar params.fixed[params.get_index("D_CCD [mm]")] = True # D2CCD: spectrogram can not tell something on this parameter: rely on calibrate_spectrum params.fixed[params.get_index("shift_x [pix]")] = True # delta x: if False, extracted spectrum is biased compared with truth params.fixed[params.get_index("shift_y [pix]")] = True # delta y @@ -261,7 +263,7 @@ def set_mask(self, params=None, fwhmx_clip=3*parameters.PSF_FWHM_CLIP, fwhmy_cli self.my_logger.info("\n\tReset spectrogram mask with current parameters.") if params is None: params = self.params.values - A1, A2, A3, D2CCD, dx0, dy0, angle, B, rot, pressure, temperature, airmass, *psf_poly_params_all = params + A1, A2, A3, Astar, D2CCD, dx0, dy0, angle, B, rot, pressure, temperature, airmass, *psf_poly_params_all = params poly_params = np.array(psf_poly_params_all).reshape((len(self.diffraction_orders), -1)) lambdas = self.spectrum.compute_lambdas_in_spectrogram(D2CCD, dx0, dy0, angle, niter=5, with_adr=True, @@ -397,7 +399,7 @@ def simulate(self, *params): # linear regression for the amplitude parameters # prepare the vectors self.params.values = np.asarray(params) - A1, A2, A3, D2CCD, dx0, dy0, angle, B, rot, pressure, temperature, airmass, *poly_params_all = params + A1, A2, A3, Astar, D2CCD, dx0, dy0, angle, B, rot, pressure, temperature, airmass, *poly_params_all = params poly_params = np.array(poly_params_all).reshape((len(self.diffraction_orders), -1)) self.spectrum.adr_params[2] = temperature self.spectrum.adr_params[3] = pressure @@ -501,6 +503,10 @@ def simulate(self, *params): # Compute the model self.model = M @ amplitude_params + if self.spectrum.spectrogram_starfield is not None: + self.model += Astar * self.spectrum.spectrogram_starfield + if self.spectrum.spectrogram_flat is not None: + self.model *= self.spectrum.spectrogram_flat self.model_err = np.zeros_like(self.model) return self.pixels, self.model, self.model_err From 871783c9b419f4f9221502ea21b2df8aae1230a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 24 Jan 2024 12:14:31 +0100 Subject: [PATCH 013/161] deflat before estimate background and before fit chromatic psf --- spectractor/extractor/extractor.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 846fc0f03..23ab1957a 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1263,6 +1263,8 @@ def extract_spectrum_from_image(image, spectrum, signal_width=10, ws=(20, 30)): # Create spectrogram data = data[ymin:ymax, xmin:xmax] err = err[ymin:ymax, xmin:xmax] + if image.flat is not None: + data /= image.flat[ymin:ymax, xmin:xmax] Ny, Nx = data.shape my_logger.info(f'\n\tExtract spectrogram: crop rotated image [{xmin}:{xmax},{ymin}:{ymax}] (size ({Nx}, {Ny}))') @@ -1385,8 +1387,10 @@ def bgd_model_func(x, y): # Extract the non-rotated background my_logger.info('\n\t ======================= Extract the non rotated background =============================') if parameters.SPECTRACTOR_BACKGROUND_SUBTRACTION: - bgd_model_func, bgd_res, bgd_rms = extract_spectrogram_background_sextractor(spectrum.spectrogram_data, - spectrum.spectrogram_err, + data = np.copy(spectrum.spectrogram_data) + if spectrum.spectrogram_flat is not None: + data /= spectrum.spectrogram_flat + bgd_model_func, bgd_res, bgd_rms = extract_spectrogram_background_sextractor(data, spectrum.spectrogram_err, ws=ws, Dy_disp_axis=s.table['y_c']) bgd = bgd_model_func(np.arange(Nx), np.arange(Ny)) my_logger.info(f"\n\tBackground statistics: mean={np.nanmean(bgd):.3f} {image.units}, " @@ -1522,8 +1526,10 @@ def run_spectrogram_deconvolution_psf2d(spectrum, bgd_model_func): f"\n{s.table[['amplitude', 'x_c', 'y_c', 'Dx', 'Dy', 'Dy_disp_axis']]}") my_logger.info(f'\n\tStart ChromaticPSF polynomial fit with ' f'mode={mode} and amplitude_priors_method={method}...') - data = spectrum.spectrogram_data - err = spectrum.spectrogram_err + data = np.copy(spectrum.spectrogram_data) + err = np.copy(spectrum.spectrogram_err) + if spectrum.spectrogram_flat is not None: + data /= spectrum.spectrogram_flat my_logger.info('\n\t ======================= ChromaticPSF2D polynomial fit =============================') w = s.fit_chromatic_psf(data, bgd_model_func=bgd_model_func, data_errors=err, live_fit=False, From 6cf4eb666c5ec6f5cfeb7b7481d5882028c49725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 24 Jan 2024 14:02:41 +0100 Subject: [PATCH 014/161] increase min bounds for Moffat gamma parameter from 0.1 to 0.5 pixel --- spectractor/extractor/psf.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spectractor/extractor/psf.py b/spectractor/extractor/psf.py index 020f03ee7..162d88dc3 100644 --- a/spectractor/extractor/psf.py +++ b/spectractor/extractor/psf.py @@ -1189,7 +1189,7 @@ def __init__(self, values=None, clip=False): values = np.copy(self.values_default) labels = ["amplitude", "x_c", "y_c", "gamma", "alpha", "saturation"] axis_names = ["$A$", r"$x_c$", r"$y_c$", r"$\gamma$", r"$\alpha$", "saturation"] - bounds = [(0, np.inf), (-np.inf, np.inf), (-np.inf, np.inf), (0.1, np.inf), + bounds = [(0, np.inf), (-np.inf, np.inf), (-np.inf, np.inf), (0.5, np.inf), (1.1, 100), (0, np.inf)] self.params = FitParameters(values=values, labels=labels, axis_names=axis_names, bounds=bounds) @@ -1197,7 +1197,7 @@ def apply_max_width_to_bounds(self, max_half_width=None): if max_half_width is not None: self.max_half_width = max_half_width self.params.bounds[2] = (0, 2 * self.max_half_width) - self.params.bounds[3] = (0.1, self.max_half_width) + self.params.bounds[3] = (0.5, self.max_half_width) def evaluate(self, pixels, values=None): r"""Evaluate the Moffat function. @@ -1558,7 +1558,7 @@ def __init__(self, values=None, clip=False): values = np.copy(self.values_default) labels = ["amplitude", "x_c", "y_c", "gamma", "alpha", "eta_gauss", "stddev", "saturation"] axis_names = ["$A$", r"$x_c$", r"$y_c$", r"$\gamma$", r"$\alpha$", r"$\eta$", r"$\sigma$", "saturation"] - bounds = [(0, np.inf), (-np.inf, np.inf), (-np.inf, np.inf), (0.1, np.inf), (1.1, 100), + bounds = [(0, np.inf), (-np.inf, np.inf), (-np.inf, np.inf), (0.5, np.inf), (1.1, 100), (-1, -5e-3), (0.5, np.inf), (0, np.inf)] self.params = FitParameters(values=values, labels=labels, axis_names=axis_names, bounds=bounds) @@ -1566,7 +1566,7 @@ def apply_max_width_to_bounds(self, max_half_width=None): if max_half_width is not None: self.max_half_width = max_half_width self.params.bounds[2] = (0, 2 * self.max_half_width) - self.params.bounds[3] = (0.1, self.max_half_width) + self.params.bounds[3] = (0.5, self.max_half_width) self.params.bounds[6] = (0.5, self.max_half_width) def evaluate(self, pixels, values=None): From 7189b32d4700cd0b319811a3ac464c796657ab4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 24 Jan 2024 14:10:46 +0100 Subject: [PATCH 015/161] debug saving of parameters after FFM --- spectractor/extractor/extractor.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 23ab1957a..056d3c4a4 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -933,14 +933,13 @@ def run_ffm_minimisation(w, method="newton", niter=2): parameters.SAVE = False # Propagate parameters - A1, A2, A3, D2CCD, dx0, dy0, angle, B, rot, pressure, temperature, airmass, *poly_params_all = w.params.values - w.spectrum.rotation_angle = angle - w.spectrum.spectrogram_bgd *= B - w.spectrum.spectrogram_bgd_rms *= B - w.spectrum.spectrogram_x0 += dx0 - w.spectrum.spectrogram_y0 += dy0 - w.spectrum.x0[0] += dx0 - w.spectrum.x0[1] += dy0 + w.spectrum.rotation_angle = w.params.values[get_index("angle [deg]")] + w.spectrum.spectrogram_bgd *= w.params.values[get_index("B")] + w.spectrum.spectrogram_bgd_rms *= w.params.values[get_index("B")] + w.spectrum.spectrogram_x0 += w.params.values[get_index("shift_x [pix]")] + w.spectrum.spectrogram_y0 += w.params.values[get_index("shift_y [pix]")] + w.spectrum.x0[0] += w.params.values[get_index("shift_x [pix]")] + w.spectrum.x0[1] += w.params.values[get_index("shift_y [pix]")] w.spectrum.header["TARGETX"] = w.spectrum.x0[0] w.spectrum.header["TARGETY"] = w.spectrum.x0[1] w.spectrum.header['MEANFWHM'] = np.mean(np.array(w.spectrum.chromatic_psf.table['fwhm'])) From cb4042fe00c19494725035c74e15e4bb2df68f11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 24 Jan 2024 14:16:33 +0100 Subject: [PATCH 016/161] debug saving of parameters after FFM --- spectractor/extractor/extractor.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 056d3c4a4..2d53d03f4 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -933,13 +933,13 @@ def run_ffm_minimisation(w, method="newton", niter=2): parameters.SAVE = False # Propagate parameters - w.spectrum.rotation_angle = w.params.values[get_index("angle [deg]")] - w.spectrum.spectrogram_bgd *= w.params.values[get_index("B")] - w.spectrum.spectrogram_bgd_rms *= w.params.values[get_index("B")] - w.spectrum.spectrogram_x0 += w.params.values[get_index("shift_x [pix]")] - w.spectrum.spectrogram_y0 += w.params.values[get_index("shift_y [pix]")] - w.spectrum.x0[0] += w.params.values[get_index("shift_x [pix]")] - w.spectrum.x0[1] += w.params.values[get_index("shift_y [pix]")] + w.spectrum.rotation_angle = w.params.values[w.params.get_index("angle [deg]")] + w.spectrum.spectrogram_bgd *= w.params.values[w.params.get_index("B")] + w.spectrum.spectrogram_bgd_rms *= w.params.values[w.params.get_index("B")] + w.spectrum.spectrogram_x0 += w.params.values[w.params.get_index("shift_x [pix]")] + w.spectrum.spectrogram_y0 += w.params.values[w.params.get_index("shift_y [pix]")] + w.spectrum.x0[0] += w.params.values[w.params.get_index("shift_x [pix]")] + w.spectrum.x0[1] += w.params.values[w.params.get_index("shift_y [pix]")] w.spectrum.header["TARGETX"] = w.spectrum.x0[0] w.spectrum.header["TARGETY"] = w.spectrum.x0[1] w.spectrum.header['MEANFWHM'] = np.mean(np.array(w.spectrum.chromatic_psf.table['fwhm'])) From b24458fc014997781fba278223ca54d437dc6277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 24 Jan 2024 18:50:33 +0100 Subject: [PATCH 017/161] implement flat and star field in ffm simulate --- spectractor/extractor/extractor.py | 105 +++++++++++++++++------------ 1 file changed, 62 insertions(+), 43 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 2d53d03f4..ac04b637b 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -122,13 +122,23 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p # crop data to fit faster self.lambdas = self.spectrum.lambdas self.bgd_width = parameters.PIXWIDTH_BACKGROUND + parameters.PIXDIST_BACKGROUND - parameters.PIXWIDTH_SIGNAL - self.data = spectrum.spectrogram_data[self.bgd_width:-self.bgd_width, :] - self.err = spectrum.spectrogram_err[self.bgd_width:-self.bgd_width, :] - self.bgd = spectrum.spectrogram_bgd[self.bgd_width:-self.bgd_width, :] - self.bgd_flat = self.bgd.flatten() - self.Ny, self.Nx = self.data.shape + self.Ny, self.Nx = spectrum.spectrogram_data[self.bgd_width:-self.bgd_width, :].shape yy, xx = np.mgrid[:self.Ny, :self.Nx] self.pixels = np.asarray([xx, yy], dtype=int) + self.data = spectrum.spectrogram_data[self.bgd_width:-self.bgd_width, :].flatten() + self.err = spectrum.spectrogram_err[self.bgd_width:-self.bgd_width, :].flatten() + self.bgd = spectrum.spectrogram_bgd[self.bgd_width:-self.bgd_width, :].flatten() + if spectrum.spectrogram_flat is not None: + self.flat = spectrum.spectrogram_flat[self.bgd_width:-self.bgd_width, :].flatten() + self.bgd *= self.flat + else: + self.flat = None + if spectrum.spectrogram_starfield is not None: + self.starfield = spectrum.spectrogram_starfield[self.bgd_width:-self.bgd_width, :].flatten() + if self.flat is not None: + self.starfield *= self.flat + else: + self.starfield = None # adapt the ChromaticPSF table shape if self.Nx != self.spectrum.chromatic_psf.Nx: @@ -160,18 +170,10 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p self.psf_profile_params[order] = None self.fix_psf_cube = False - # prepare the background, data and errors - self.bgd_std = float(np.std(np.random.poisson(np.abs(self.bgd)))) - # error matrix # here image uncertainties are assumed to be uncorrelated # (which is not exactly true in rotated images) self.W = 1. / (self.err * self.err) - self.W = self.W.flatten() - - # flat data for fitworkspace - self.data = self.data.flatten() - self.bgd_flat - self.err = self.err.flatten() self.data_before_mask = np.copy(self.data) self.W_before_mask = np.copy(self.W) @@ -301,17 +303,24 @@ def simulate(self, *params): Compute a ChromaticPSF2D model given PSF shape parameters and minimizing amplitude parameters using a spectrogram data array. - The ChromaticPSF2D model :math:`\vec{m}(\vec{x},\vec{p})` can be written as + The full forward model of the spectrogram image :math:`\vec{I}(\vec{x},\vec{p})` can be written as .. math :: - :label: chromaticpsf2d + :label: ffm + + \vec{I}(\vec{x},\vec{p}) = \sum_{i=0}^{N_x} A_i F_i \phi\left(\vec{x},\vec{p}_i\right) + + \bar F B b\left(\vec{x}\right) + \bar F S s\left(\vec{x}\right) - \vec{m}(\vec{x},\vec{p}) = \sum_{i=0}^{N_x} A_i \phi\left(\vec{x},\vec{p}_i\right) + with + - :math:`\vec{x}` the 2D array of the pixel coordinates, + - :math:`\vec{A}` the amplitude parameter array along the x axis of the spectrogram, + - :math:`\phi\left(\vec{x},\vec{p}_i\right)` the 2D PSF kernel whose integral is normalised to one parametrized + with the :math:`\vec{p}_i` non-linear parameter array, + - math:`B b\left(\vec{x}\right)` the background function weighted by a scalar math:`B`, + - math:`S s\left(\vec{x}\right)` the star field function weighted by a scalar math:`S`, + - :math:`F_i` a flat cube (wavelengths indexed by :math:`i`) and \bar F the mean flat. - with :math:`\vec{x}` the 2D array of the pixel coordinates, :math:`\vec{A}` the amplitude parameter array - along the x axis of the spectrogram, :math:`\phi\left(\vec{x},\vec{p}_i\right)` the 2D PSF kernel whose integral - is normalised to one parametrized with the :math:`\vec{p}_i` non-linear parameter array. If the :math:`\vec{x}` - 2D array is flatten in 1D, equation :eq:`chromaticpsf2d` is + If the :math:`\vec{x}` 2D array is flatten in 1D, equation :eq:`ffm` is .. math :: :label: chromaticpsf2d_matrix @@ -321,11 +330,11 @@ def simulate(self, *params): \vec{m}(\vec{x},\vec{p}) & = \mathbf{M}\left(\vec{x},\vec{p}\right) \mathbf{A} \\ \mathbf{M}\left(\vec{x},\vec{p}\right) & = \left(\begin{array}{cccc} - \phi\left(\vec{x}_1,\vec{p}_1\right) & \phi\left(\vec{x}_2,\vec{p}_1\right) & ... - & \phi\left(\vec{x}_{N_x},\vec{p}_1\right) \\ + F_1\phi\left(\vec{x}_1,\vec{p}_1\right) & F_2\phi\left(\vec{x}_2,\vec{p}_1\right) & ... + & F_{N_x}\phi\left(\vec{x}_{N_x},\vec{p}_1\right) \\ ... & ... & ... & ...\\ - \phi\left(\vec{x}_1,\vec{p}_{N_x}\right) & \phi\left(\vec{x}_2,\vec{p}_{N_x}\right) & ... - & \phi\left(\vec{x}_{N_x},\vec{p}_{N_x}\right) \\ + F_1\phi\left(\vec{x}_1,\vec{p}_{N_x}\right) & F_2\phi\left(\vec{x}_2,\vec{p}_{N_x}\right) & ... + & F_{N_x}\phi\left(\vec{x}_{N_x},\vec{p}_{N_x}\right) \\ \end{array}\right) \end{align} @@ -333,26 +342,26 @@ def simulate(self, *params): with :math:`\mathbf{M}` the design matrix. The goal of this function is to perform a minimisation of the amplitude vector :math:`\mathbf{A}` given - a set of non-linear parameters :math:`\mathbf{p}` and a spectrogram data array :math:`mathbf{y}` modelise as + a set of non-linear parameters :math:`\mathbf{p}` and a spectrogram data array :math:`\mathbf{D}` modelised as - .. math:: \mathbf{y} = \mathbf{m}(\vec{x},\vec{p}) + \vec{\epsilon} + .. math:: \mathbf{D} = \mathbf{m}(\vec{x},\vec{p}) + \bar F B b\left(\vec{x}\right) + \bar F S s\left(\vec{x}\right) + \vec{\epsilon} with :math:`\vec{\epsilon}` a random noise vector. The :math:`\chi^2` function to minimise is .. math:: - :label: chromaticspsf2d_chi2 + :label: ffm_chi2 - \chi^2(\mathbf{A})= \left(\mathbf{y} - \mathbf{M}\left(\vec{x},\vec{p}\right) \mathbf{A}\right)^T \mathbf{W} - \left(\mathbf{y} - \mathbf{M}\left(\vec{x},\vec{p}\right) \mathbf{A} \right) + \chi^2(\mathbf{A})= \left(\mathbf{D} - \bar F B b\left(\vec{x}\right) - \bar F S s\left(\vec{x}\right) - \mathbf{M}\left(\vec{x},\vec{p}\right) \mathbf{A}\right)^T \mathbf{W} + \left(\mathbf{D} - \bar F B b\left(\vec{x}\right) - \bar F S s\left(\vec{x}\right) -\mathbf{M}\left(\vec{x},\vec{p}\right) \mathbf{A} \right) with :math:`\mathbf{W}` the weight matrix, inverse of the covariance matrix. In our case this matrix is diagonal - as the pixels are considered all independent. The minimum of equation :eq:`chromaticspsf2d_chi2` is reached for + as the pixels are considered all independent. The minimum of equation :eq:`ffm_chi2` is reached for a set of amplitude parameters :math:`\hat{\mathbf{A}}` given by .. math:: - \hat{\mathbf{A}} = (\mathbf{M}^T \mathbf{W} \mathbf{M})^{-1} \mathbf{M}^T \mathbf{W} \mathbf{y} + \hat{\mathbf{A}} = (\mathbf{M}^T \mathbf{W} \mathbf{M})^{-1} \mathbf{M}^T \mathbf{W}\left( \mathbf{D} - \bar F B b\left(\vec{x}\right) - \bar F S s\left(\vec{x}\right) \right) The error matrix on the :math:`\hat{\mathbf{A}}` coefficient is simply :math:`(\mathbf{M}^T \mathbf{W} \mathbf{M})^{-1}`. @@ -406,7 +415,10 @@ def simulate(self, *params): self.spectrum.adr_params[-1] = airmass parameters.OBS_CAMERA_ROTATION = rot - W_dot_data = (self.W * (self.data + (1 - B) * self.bgd_flat)).astype("float32") + R = self.data - B * self.bgd + if self.starfield is not None: + R -= self.starfield + W_dot_data = (self.W * R).astype("float32") # Evaluate ADR and compute wavelength arrays self.lambdas = self.spectrum.compute_lambdas_in_spectrogram(D2CCD, dx0, dy0, angle, niter=5, with_adr=True, @@ -434,12 +446,20 @@ def simulate(self, *params): # Matrix filling M_order = self.spectrum.chromatic_psf.build_sparse_M(self.pixels, self.psf_profile_params[order], - dtype="float32", M_sparse_indices=self.M_sparse_indices[order], boundaries=self.boundaries[order]) + dtype="float32", M_sparse_indices=self.M_sparse_indices[order], + boundaries=self.boundaries[order]) if M is None: M = M_order else: M += M_order + if self.flat is not None: + # multiply each M matrix columns by the flat array + # TODO: if flat array is a cube flat, needs to multiply directly in build_sparse_M + dia = sparse.dia_matrix(([self.flat], [0]), shape=(self.flat.size, self.flat.size)) + M = (dia @ M).tocsc() + + # Algebra to compute amplitude parameters if self.amplitude_priors_method != "fixed": M_dot_W = M.T @ self.sqrtW @@ -447,7 +467,8 @@ def simulate(self, *params): M_dot_W_dot_M = M_dot_W @ M_dot_W.T else: tri = sparse_dot_mkl.gram_matrix_mkl(M_dot_W, transpose=True) - dia = sparse.csr_matrix((tri.diagonal(), (np.arange(tri.shape[0]), np.arange(tri.shape[0]))), shape=tri.shape, dtype="float32") + dia = sparse.csr_matrix((tri.diagonal(), (np.arange(tri.shape[0]), np.arange(tri.shape[0]))), + shape=tri.shape, dtype="float32") M_dot_W_dot_M = (tri + tri.T - dia).toarray() if self.amplitude_priors_method != "spectrum": if self.amplitude_priors_method == "keep": @@ -503,10 +524,9 @@ def simulate(self, *params): # Compute the model self.model = M @ amplitude_params - if self.spectrum.spectrogram_starfield is not None: - self.model += Astar * self.spectrum.spectrogram_starfield - if self.spectrum.spectrogram_flat is not None: - self.model *= self.spectrum.spectrogram_flat + self.model += B * self.bgd + if self.starfield is not None: + self.model += Astar * self.starfield self.model_err = np.zeros_like(self.model) return self.pixels, self.model, self.model_err @@ -516,7 +536,6 @@ def jacobian(self, params, epsilon, model_input=None): lambdas, model, model_err = model_input else: lambdas, model, model_err = self.simulate(*params) - model = model.flatten() J = np.zeros((params.size, model.size)) method = copy.copy(self.amplitude_priors_method) self.amplitude_priors_method = "keep" @@ -530,7 +549,7 @@ def jacobian(self, params, epsilon, model_input=None): epsilon[ip] = - epsilon[ip] tmp_p[ip] += epsilon[ip] tmp_lambdas, tmp_model, tmp_model_err = self.simulate(*tmp_p) - J[ip] = (tmp_model.flatten() - model) / epsilon[ip] + J[ip] = (tmp_model - model) / epsilon[ip] self.amplitude_priors_method = method for k, order in enumerate(self.diffraction_orders): if self.psf_profile_params[order] is None: @@ -586,7 +605,7 @@ def amplitude_derivatives(self): """ # compute matrices without derivatives WM = sparse.dia_matrix((self.W, 0), shape=(self.W.size, self.W.size), dtype="float32") @ self.M - WD = (self.W * (self.data + (1 - self.params.values[self.params.get_index("B")]) * self.bgd_flat)).astype("float32") + WD = (self.W * (self.data + (1 - self.params.values[self.params.get_index("B")]) * self.bgd)).astype("float32") MWD = self.M.T @ WD if self.amplitude_priors_method == "spectrum": MWD += np.float32(self.reg) * self.Q_dot_A0 @@ -638,9 +657,9 @@ def plot_spectrogram_comparison_simple(self, ax, title='', extent=None, dispersi lambdas = self.spectrum.lambdas sub = np.where((lambdas > parameters.LAMBDA_MIN) & (lambdas < parameters.LAMBDA_MAX))[0] sub = np.where(sub < self.spectrum.spectrogram_data.shape[1])[0] - data = (data + self.bgd_flat).reshape((self.Ny, self.Nx)) + data = data.reshape((self.Ny, self.Nx)) err = self.err.reshape((self.Ny, self.Nx)) - model = (self.model + self.params["B"] * self.bgd_flat).reshape((self.Ny, self.Nx)) + model = self.model.reshape((self.Ny, self.Nx)) if extent is not None: sub = np.where((lambdas > extent[0]) & (lambdas < extent[1]))[0] if len(sub) > 0: From 3bef6605b18b288db6ef3ad472aff9b46c4410bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 24 Jan 2024 18:50:54 +0100 Subject: [PATCH 018/161] add mock flat full of ones for CTIO --- spectractor/extractor/images.py | 1 + 1 file changed, 1 insertion(+) diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index ea3567b92..997a55b9c 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -571,6 +571,7 @@ def load_CTIO_image(image): # compute CCD gain map build_CTIO_gain_map(image) build_CTIO_read_out_noise_map(image) + image.flat = image.gain / np.mean(image.gain) image.compute_parallactic_angle() # WCS wcs_file_name = set_wcs_file_name(image.file_name) From 9456f10751acb7198aa9d8e24bd1d121bc7b17d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 25 Jan 2024 11:31:50 +0100 Subject: [PATCH 019/161] add flat to image simulation --- spectractor/simulation/image_simulation.py | 113 ++++++++++++++++++++- 1 file changed, 110 insertions(+), 3 deletions(-) diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index d5c8d392e..e25ea8fd6 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -312,6 +312,101 @@ def plot_model(self): if parameters.PdfPages: parameters.PdfPages.savefig() +class FlatModel: + """Class to model the pixel flat of the simulated image. Flat is dimensionless and its average must be one. + + The flat model size is set with the parameters.CCD_IMSIZE global keyword. + + Attributes + ---------- + gains: array_like + The list of gains to apply. The average must be one. + with_noise: bool + If True, a random quantum efficiency is applied to pixels (default: False). + """ + + def __init__(self, gains, with_noise=False): + """Create a FlatModel instance. Flat is dimensionless and its average must be one. + + The flat model size is set with the parameters.CCD_IMSIZE global keyword. + + Parameters + ---------- + gains: array_like + The list of gains to apply. The average must be one. + with_noise: bool + If True, a random quantum efficiency is applied to pixels (default: False). + + Examples + -------- + >>> from spectractor import parameters + >>> parameters.CCD_IMSIZE = 200 + >>> flat = FlatModel(gains=[[1, 2, 3, 4], [4, 3, 2, 1]], with_noise=True) + >>> model = flat.model() + >>> print(f"{np.mean(model):.4f}") + 1.0000 + >>> model.shape + (200, 200) + >>> flat.plot_model() + """ + self.my_logger = set_logger(self.__class__.__name__) + self.gains = np.atleast_2d(gains).astype(float) + if len(self.gains) <= 0: + raise ValueError(f"Gains list is empty") + if np.any(self.gains <= 0): + raise ValueError(f"One the gain values is negative. Got {self.gains}.") + if np.mean(self.gains) != 1.: + self.my_logger.warning(f"\n\tGains list average is not one but {np.mean(self.gains)}. " + "I scaled them to have an average of one.") + self.gains /= np.mean(self.gains) + self.my_logger.warning(f'\n\tRelative gains are set to {self.gains}.') + self.with_noise = with_noise + + def model(self): + """Compute the flat model for the image simulation (no units). + + Returns + ------- + flat: array_like + The array of the flat model. + """ + yy, xx = np.mgrid[0:parameters.CCD_IMSIZE:1, 0:parameters.CCD_IMSIZE:1] + flat = np.ones_like(xx, dtype=float) + hflats = np.array_split(flat, self.gains.shape[0]) + for h in range(self.gains.shape[0]): + vflats = np.array_split(hflats[h].T, self.gains.shape[1]) + for v in range(self.gains.shape[1]): + vflats[v] *= self.gains[h,v] + hflats[h] = np.concatenate(vflats).T + flat = np.concatenate(hflats).T + if self.with_noise: + flat += np.random.uniform(-1e-2, 1e-2, size=flat.shape) + + return flat + + def plot_model(self): + """Plot the flat model. + + """ + flat = self.model() + fig, ax = plt.subplots(1, 1) + im = plt.imshow(flat, origin='lower', cmap='jet') + ax.grid(color='white', ls='solid') + ax.grid(True) + ax.set_xlabel('X [pixels]') + ax.set_ylabel('Y [pixels]') + ax.set_title('Flat model') + cb = plt.colorbar(im, ax=ax) + cb.formatter.set_powerlimits((0, 0)) + cb.locator = MaxNLocator(7, prune=None) + cb.update_ticks() + cb.set_label('Dimensionless') # ,fontsize=16) + if parameters.DISPLAY: + plt.show() + if parameters.PdfPages: + parameters.PdfPages.savefig() + + class ImageModel(Image): @@ -321,7 +416,7 @@ def __init__(self, filename, target_label=None): self.true_lambdas = None self.true_spectrum = None - def compute(self, star, background, spectrogram, starfield=None): + def compute(self, star, background, spectrogram, starfield=None, flat=None): yy, xx = np.mgrid[0:parameters.CCD_IMSIZE:1, 0:parameters.CCD_IMSIZE:1] self.data = star.psf.evaluate(np.array([xx, yy])) + background.model() if spectrogram.full_image: @@ -332,6 +427,8 @@ def compute(self, star, background, spectrogram, starfield=None): # - spectrogram.spectrogram_bgd) if starfield is not None: self.data += starfield.model(xx, yy) + if flat is not None: + self.data += flat.model() def add_poisson_and_read_out_noise(self): # pragma: no cover if self.units != 'ADU': @@ -367,7 +464,7 @@ def load_image(self, filename): def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aerosols=0.03, A1=1, A2=1, A3=1, angstrom_exponent=None, - psf_poly_params=None, psf_type=None, diffraction_orders=None, with_rotation=True, with_stars=True, with_adr=True, with_noise=True): + psf_poly_params=None, psf_type=None, diffraction_orders=None, with_rotation=True, with_stars=True, with_adr=True, with_noise=True, with_flat=True): """ The basic use of the extractor consists first to define: - the path to the fits image from which to extract the image, - the path of the output directory to save the extracted spectrum (created automatically if does not exist yet), @@ -382,6 +479,7 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer - with_rotation: rotate the spectrum according to the disperser characteristics (True by default) - with_stars: include stars in the image field (True by default) - with_adr: include ADR effect (True by default) + - with_flat: include flat (True by default) """ my_logger = set_logger(__name__) my_logger.info(f'\n\tStart IMAGE SIMULATOR') @@ -412,6 +510,7 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer # reso = star.fwhm if parameters.DEBUG: star.plot_model() + # Star field model starfield = None if with_stars: @@ -421,6 +520,14 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer image.plot_image(scale='symlog', target_pixcoords=starfield.pixcoords) starfield.plot_model() + # flat model + flat = None + if with_flat: + my_logger.info('\n\tStar field model...') + flat = FlatModel(image) + if parameters.DEBUG: + flat.plot_model() + # Spectrum model my_logger.info('\n\tSpectrum model...') airmass = image.header['AIRMASS'] @@ -462,7 +569,7 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer # Image model my_logger.info('\n\tImage model...') - image.compute(star, background, spectrogram, starfield=starfield) + image.compute(star, background, spectrogram, starfield=starfield, flat=flat) # Recover true spectrum spectrogram.set_true_spectrum(spectrogram.lambdas, aerosols, ozone, pwv, shift_t=0) From 185afc0aabc1cb14973a3e53f88d9d9969c3c335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 25 Jan 2024 13:19:08 +0100 Subject: [PATCH 020/161] add flat to full chain --- spectractor/simulation/image_simulation.py | 18 +++++++++++------- tests/test_fullchain.py | 8 +++++--- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index e25ea8fd6..f5b6ec08b 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -325,7 +325,7 @@ class FlatModel: If True, a random quantum efficiency is applied to pixels (default: False). """ - def __init__(self, gains, with_noise=False): + def __init__(self, gains, with_randomness=False): """Create a FlatModel instance. Flat is dimensionless and its average must be one. The flat model size is set with the parameters.CCD_IMSIZE global keyword. @@ -334,14 +334,14 @@ def __init__(self, gains, with_noise=False): ---------- gains: array_like The list of gains to apply. The average must be one. - with_noise: bool + with_randomness: bool If True, a random quantum efficiency is applied to pixels (default: False). Examples -------- >>> from spectractor import parameters >>> parameters.CCD_IMSIZE = 200 - >>> flat = FlatModel(gains=[[1, 2, 3, 4], [4, 3, 2, 1]], with_noise=True) + >>> flat = FlatModel(gains=[[1, 2, 3, 4], [4, 3, 2, 1]], with_randomness=True) >>> model = flat.model() >>> print(f"{np.mean(model):.4f}") 1.0000 @@ -360,7 +360,7 @@ def __init__(self, gains, with_noise=False): "I scaled them to have an average of one.") self.gains /= np.mean(self.gains) self.my_logger.warning(f'\n\tRelative gains are set to {self.gains}.') - self.with_noise = with_noise + self.with_noise = with_randomness def model(self): """Compute the flat model for the image simulation (no units). @@ -426,9 +426,13 @@ def compute(self, star, background, spectrogram, starfield=None, flat=None): spectrogram.spectrogram_xmin:spectrogram.spectrogram_xmax] += spectrogram.spectrogram_data # - spectrogram.spectrogram_bgd) if starfield is not None: - self.data += starfield.model(xx, yy) + starfield_mod = starfield.model(xx, yy) + self.data += starfield_mod + self.starfield = starfield_mod if flat is not None: - self.data += flat.model() + flat_mod = flat.model() + self.data *= flat_mod + self.flat = flat_mod def add_poisson_and_read_out_noise(self): # pragma: no cover if self.units != 'ADU': @@ -524,7 +528,7 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer flat = None if with_flat: my_logger.info('\n\tStar field model...') - flat = FlatModel(image) + flat = FlatModel(gains=[[1, 2, 3, 4], [4, 3, 2, 1]], with_randomness=True) if parameters.DEBUG: flat.plot_model() diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index ebb38112b..25421ce3b 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -7,7 +7,7 @@ from spectractor import parameters # noqa: E402 from spectractor.extractor.images import Image # noqa: E402 from spectractor.extractor.spectrum import Spectrum # noqa: E402 -from spectractor.extractor.extractor import Spectractor # noqa: E402 +from spectractor.extractor.extractor import Spectractor, SpectractorRun, SpectractorInit # noqa: E402 from spectractor.logbook import LogBook # noqa: E402 from spectractor.config import load_config, apply_rebinning_to_parameters # noqa: E402 from spectractor.simulation.image_simulation import ImageSim # noqa: E402 @@ -95,8 +95,10 @@ def plot_residuals(spectrum, lambdas_truth, amplitude_truth): def make_image(): spectrum_filename = "./tests/data/reduc_20170530_134_spectrum.fits" image_filename = "./tests/data/reduc_20170530_134.fits" - ImageSim(image_filename, spectrum_filename, "./tests/data/", A1=A1_T, A2=A2_T, A3=A3_T, - psf_poly_params=PSF_POLY_PARAMS_TRUTH, with_stars=False, with_rotation=True, with_noise=False) + sim = ImageSim(image_filename, spectrum_filename, "./tests/data/", A1=A1_T, A2=A2_T, A3=A3_T, + psf_poly_params=PSF_POLY_PARAMS_TRUTH, with_stars=False, with_rotation=True, with_noise=False, + with_flat=True) + return sim @unittest.skipIf(uvspec_available() is False, 'Skipping to avoid libradtran dependency') From ef1b2a77e9606075e1e4fc403b3a78a375174348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 25 Jan 2024 14:50:54 +0100 Subject: [PATCH 021/161] cleaning --- spectractor/extractor/background.py | 2 +- spectractor/tools.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/background.py b/spectractor/extractor/background.py index 0db046d67..93f574280 100644 --- a/spectractor/extractor/background.py +++ b/spectractor/extractor/background.py @@ -54,7 +54,7 @@ def make_source_mask(data, nsigma, npixels, mask=None, sigclip_sigma=3.0, Parameters ---------- - data : 2D `~numpy.ndarray` + data : np.ndarray The 2D array of the image. nsigma : float The number of standard deviations per pixel above the ``background`` diff --git a/spectractor/tools.py b/spectractor/tools.py index 69a440a0f..7c06f6bea 100644 --- a/spectractor/tools.py +++ b/spectractor/tools.py @@ -269,7 +269,7 @@ def rescale_x_from_legendre(x_norm, Xmin, Xmax): Parameters ---------- - x: np.ndarray + x_norm: np.ndarray Xmin: float Xmax: float From 827fa4d22b5ec1c9ebd7dc62d7e86f93e0cea61d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 25 Jan 2024 14:51:36 +0100 Subject: [PATCH 022/161] move Astar parameter position after B --- spectractor/extractor/extractor.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index ac04b637b..1c9a76cb5 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -64,27 +64,27 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p spectrum.chromatic_psf.psf.apply_max_width_to_bounds(max_half_width=spectrum.spectrogram_Ny) psf_poly_params_bounds = spectrum.chromatic_psf.set_bounds() D2CCD = np.copy(spectrum.header['D2CCD']) - p = np.array([1, 1, 1, 1, D2CCD, np.copy(spectrum.header['PIXSHIFT']), 0, - np.copy(spectrum.rotation_angle), 1, parameters.OBS_CAMERA_ROTATION, + p = np.array([1, 1, 1, D2CCD, np.copy(spectrum.header['PIXSHIFT']), 0, + np.copy(spectrum.rotation_angle), 1, 1, parameters.OBS_CAMERA_ROTATION, np.copy(spectrum.pressure), np.copy(spectrum.temperature), np.copy(spectrum.airmass)]) - self.psf_params_start_index = np.array([13 + len(self.psf_poly_params) * k for k in range(len(self.diffraction_orders))]) + self.psf_params_start_index = np.array([p.size + len(self.psf_poly_params) * k for k in range(len(self.diffraction_orders))]) self.saturation = spectrum.spectrogram_saturation p = np.concatenate([p] + [self.psf_poly_params] * len(self.diffraction_orders)) input_labels = [f"A{order}" for order in self.diffraction_orders] - input_labels += ["A_star", r"D_CCD [mm]", r"shift_x [pix]", r"shift_y [pix]", r"angle [deg]", "B", "R", "P [hPa]", "T [Celsius]", "z"] + input_labels += [r"D_CCD [mm]", r"shift_x [pix]", r"shift_y [pix]", r"angle [deg]", "B", "A_star", "R", "P [hPa]", "T [Celsius]", "z"] for order in self.diffraction_orders: input_labels += [label+f"_{order}" for label in psf_poly_params_labels] axis_names = [f"$A_{order}$" for order in self.diffraction_orders] - axis_names += [r"$A_{star}$", r"$D_{CCD}$ [mm]", r"$\delta_{\mathrm{x}}^{(\mathrm{fit})}$ [pix]", - r"$\delta_{\mathrm{y}}^{(\mathrm{fit})}$ [pix]", r"$\alpha$ [deg]", "$B$", "R", + axis_names += [r"$D_{CCD}$ [mm]", r"$\delta_{\mathrm{x}}^{(\mathrm{fit})}$ [pix]", + r"$\delta_{\mathrm{y}}^{(\mathrm{fit})}$ [pix]", r"$\alpha$ [deg]", "$B$", r"$A_{star}$", "R", r"$P_{\mathrm{atm}}$ [hPa]", r"$T_{\mathrm{atm}}$ [Celcius]", "$z$"] for order in self.diffraction_orders: axis_names += [label+rf"$\!_{order}$" for label in psf_poly_params_names] - bounds = [[0, 2], [0, 2], [0, 2], [0, np.inf], + bounds = [[0, 2], [0, 2], [0, 2], [D2CCD - 3 * parameters.DISTANCE2CCD_ERR, D2CCD + 3 * parameters.DISTANCE2CCD_ERR], [-parameters.PIXSHIFT_PRIOR, parameters.PIXSHIFT_PRIOR], [-10 * parameters.PIXSHIFT_PRIOR, 10 * parameters.PIXSHIFT_PRIOR], - [-90, 90], [0.2, 5], [-360, 360], [300, 1100], [-100, 100], [1.001, 3]] + [-90, 90], [0.2, 5], [0, np.inf], [-360, 360], [300, 1100], [-100, 100], [1.001, 3]] bounds += list(psf_poly_params_bounds) * len(self.diffraction_orders) fixed = [False] * p.size for k, par in enumerate(input_labels): @@ -265,7 +265,7 @@ def set_mask(self, params=None, fwhmx_clip=3*parameters.PSF_FWHM_CLIP, fwhmy_cli self.my_logger.info("\n\tReset spectrogram mask with current parameters.") if params is None: params = self.params.values - A1, A2, A3, Astar, D2CCD, dx0, dy0, angle, B, rot, pressure, temperature, airmass, *psf_poly_params_all = params + A1, A2, A3, D2CCD, dx0, dy0, angle, B, Astar, rot, pressure, temperature, airmass, *psf_poly_params_all = params poly_params = np.array(psf_poly_params_all).reshape((len(self.diffraction_orders), -1)) lambdas = self.spectrum.compute_lambdas_in_spectrogram(D2CCD, dx0, dy0, angle, niter=5, with_adr=True, @@ -408,7 +408,7 @@ def simulate(self, *params): # linear regression for the amplitude parameters # prepare the vectors self.params.values = np.asarray(params) - A1, A2, A3, Astar, D2CCD, dx0, dy0, angle, B, rot, pressure, temperature, airmass, *poly_params_all = params + A1, A2, A3, D2CCD, dx0, dy0, angle, B, Astar, rot, pressure, temperature, airmass, *poly_params_all = params poly_params = np.array(poly_params_all).reshape((len(self.diffraction_orders), -1)) self.spectrum.adr_params[2] = temperature self.spectrum.adr_params[3] = pressure @@ -454,7 +454,7 @@ def simulate(self, *params): M += M_order if self.flat is not None: - # multiply each M matrix columns by the flat array + # multiply each M matrix columns by the flat array (see the docstring) # TODO: if flat array is a cube flat, needs to multiply directly in build_sparse_M dia = sparse.dia_matrix(([self.flat], [0]), shape=(self.flat.size, self.flat.size)) M = (dia @ M).tocsc() From 7dc719194b860110320e7e1067ab3648776c889b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 25 Jan 2024 14:54:34 +0100 Subject: [PATCH 023/161] remove B from SpectrogramModel and SpectrumModel: these classes computes pure spectrogram and spectrum models, no additional features --- spectractor/fit/fit_multispectra.py | 4 ++-- spectractor/fit/fit_spectrogram.py | 6 +++--- spectractor/fit/fit_spectrum.py | 4 +++- spectractor/simulation/image_simulation.py | 6 +++--- spectractor/simulation/simulator.py | 23 ++++++---------------- tests/test_simulator.py | 2 +- 6 files changed, 18 insertions(+), 27 deletions(-) diff --git a/spectractor/fit/fit_multispectra.py b/spectractor/fit/fit_multispectra.py index aad6f1be0..557fc778b 100644 --- a/spectractor/fit/fit_multispectra.py +++ b/spectractor/fit/fit_multispectra.py @@ -50,7 +50,7 @@ def _build_sim_sample(spectra, aerosols=0.05, ozone=300, pwv=5, angstrom_exponen # fast_sim must be True to avoid biases (the rebinning is done after in _prepare_data()) s = SpectrumSimulation(spec, atmosphere=atm, fast_sim=True, with_adr=True) s.simulate(A1=1, A2=0, aerosols=aerosols, angstrom_exponent=angstrom_exponent, ozone=ozone, pwv=pwv, - reso=-1, D=parameters.DISTANCE2CCD, shift_x=0, B=0) + reso=-1, D=parameters.DISTANCE2CCD, shift_x=0) sim_spectra.append(s) return sim_spectra @@ -94,7 +94,7 @@ def _build_test_sample(nspectra=3, aerosols=0.05, ozone=300, pwv=5, angstrom_exp s.temperature = temperature s.adr_params = [s.dec, s.hour_angle, temperature, pressure, s.humidity, airmass] s.simulate(A1=1, A2=0, aerosols=aerosols, angstrom_exponent=angstrom_exponent, ozone=ozone, pwv=pwv, - reso=-1, D=parameters.DISTANCE2CCD, shift_x=0, B=0) + reso=-1, D=parameters.DISTANCE2CCD, shift_x=0) spectra.append(s) return spectra diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index 343f0791f..dde91994a 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -136,9 +136,9 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, self.params.bounds[self.params.get_index("PWV [mm]")] = (min(self.atmosphere.PWV_Points), max(self.atmosphere.PWV_Points)) self.params.fixed[self.params.get_index("angstrom_exp_log10")] = True # angstrom exponent - self.simulation = SpectrogramModel(self.spectrum, atmosphere=self.atmosphere, - diffraction_orders=self.diffraction_orders, - with_background=True, fast_sim=False, with_adr=True) + self.spectrogram_simulation = SpectrogramModel(self.spectrum, atmosphere=self.atmosphere, + diffraction_orders=self.diffraction_orders, + fast_sim=False, with_adr=True) self.lambdas_truth = None self.amplitude_truth = None self.get_spectrogram_truth() diff --git a/spectractor/fit/fit_spectrum.py b/spectractor/fit/fit_spectrum.py index 4225951e8..4e32983b1 100644 --- a/spectractor/fit/fit_spectrum.py +++ b/spectractor/fit/fit_spectrum.py @@ -227,7 +227,9 @@ def simulate(self, A1, A2, aerosols, angstrom_exponent_log10, ozone, pwv, reso, angstrom_exponent = 10 ** angstrom_exponent_log10 else: angstrom_exponent = None - lambdas, model, model_err = self.simulation.simulate(A1, A2, aerosols, angstrom_exponent, ozone, pwv, reso, D, shift_x, B) + lambdas, model, model_err = self.simulation.simulate(A1, A2, aerosols, angstrom_exponent, ozone, pwv, reso, D, shift_x) + if B != 0: + model += B / (lambdas * np.gradient(lambdas)) self.model = model self.model_err = model_err return lambdas, model, model_err diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index f5b6ec08b..6e7dadb0e 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -566,10 +566,10 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer # Simulate spectrogram atmosphere = Atmosphere(airmass, pressure, temperature) - spectrogram = SpectrogramModel(spectrum, atmosphere=atmosphere, with_background=False, fast_sim=False, - full_image=True, with_adr=with_adr, diffraction_orders=diffraction_orders) + spectrogram = SpectrogramModel(spectrum, atmosphere=atmosphere, fast_sim=False, full_image=True, + with_adr=with_adr, diffraction_orders=diffraction_orders) spectrogram.simulate(A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, - spectrum.disperser.D, 0, 0, rotation_angle, 1, psf_poly_params) + spectrum.disperser.D, 0, 0, rotation_angle, psf_poly_params) # Image model my_logger.info('\n\tImage model...') diff --git a/spectractor/simulation/simulator.py b/spectractor/simulation/simulator.py index 931b2521c..a90e45bd9 100644 --- a/spectractor/simulation/simulator.py +++ b/spectractor/simulation/simulator.py @@ -100,7 +100,7 @@ def simulate_without_atmosphere(self, lambdas): return self.data, self.err def simulate(self, A1=1.0, A2=0., aerosols=0.05, angstrom_exponent=None, ozone=300, pwv=5, reso=0., - D=parameters.DISTANCE2CCD, shift_x=0., B=0.): + D=parameters.DISTANCE2CCD, shift_x=0.): """Simulate the cross spectrum of an object and its uncertainties after its transmission throught the instrument and the atmosphere. @@ -125,8 +125,6 @@ def simulate(self, A1=1.0, A2=0., aerosols=0.05, angstrom_exponent=None, ozone=3 Distance between the CCD and the disperser in mm (default: parameters.DISTANCE2CCD) shift_x: float Shift in pixels of the order 0 position estimate (default: 0). - B: float - Amplitude level for the background (default: 0). Returns ------- @@ -143,7 +141,7 @@ def simulate(self, A1=1.0, A2=0., aerosols=0.05, angstrom_exponent=None, ozone=3 >>> atmosphere = AtmosphereGrid(atmgrid_filename="./tests/data/reduc_20170530_134_atmsim.fits") >>> sim = SpectrumSimulation(spectrum, atmosphere=atmosphere, fast_sim=True) >>> lambdas, model, model_err = sim.simulate(A1=1, A2=1, ozone=300, pwv=5, aerosols=0.05, reso=0., - ... D=parameters.DISTANCE2CCD, shift_x=0., B=0.) + ... D=parameters.DISTANCE2CCD, shift_x=0.) >>> sim.plot_spectrum() .. doctest:: @@ -205,8 +203,6 @@ def integrand(lbda): self.data = (sim_conv(lambdas) + A2 * spectrum_order2) / lambdas self.data_order2 = A2 * spectrum_order2 / lambdas self.err = (err_conv(lambdas) + A2 * err_order2) / lambdas - if B != 0: - self.data += B / (lambdas * np.gradient(lambdas)) if np.any(self.err <= 0) and not np.all(self.err<=0): min_positive = np.min(self.err[self.err > 0]) self.err[np.isclose(self.err, 0., atol=0.01 * min_positive)] = min_positive @@ -226,7 +222,7 @@ def integrand(lbda): class SpectrogramModel(Spectrum): def __init__(self, spectrum, target=None, disperser=None, throughput=None, atmosphere=None, diffraction_orders=None, - with_background=True, fast_sim=True, full_image=False, with_adr=True): + fast_sim=True, full_image=False, with_adr=True): """Class to simulate a spectrogram. Parameters @@ -243,8 +239,6 @@ def __init__(self, spectrum, target=None, disperser=None, throughput=None, atmos Atmosphere or AtmosphereGrid instance to make the atmospheric simulation (default: None). diffraction_orders: array_like, optional List of diffraction orders to simulate. If None, takes first three (default: None). - with_background: bool, optional - If True, add the background model to the simulated spectrogram (default: True). fast_sim: bool, optional If True, perform a fast simulation of the spectrum without integrated the spectrum in pixel bins (default: True). @@ -258,7 +252,7 @@ def __init__(self, spectrum, target=None, disperser=None, throughput=None, atmos -------- >>> spectrum = Spectrum("./tests/data/reduc_20170530_134_spectrum.fits") >>> atmosphere = Atmosphere(airmass=1.2, pressure=800, temperature=10) - >>> sim = SpectrogramModel(spectrum, atmosphere=atmosphere, with_background=True, fast_sim=True) + >>> sim = SpectrogramModel(spectrum, atmosphere=atmosphere, fast_sim=True) """ Spectrum.__init__(self) if diffraction_orders is None: @@ -321,7 +315,6 @@ def __init__(self, spectrum, target=None, disperser=None, throughput=None, atmos self.fix_atm_sim = False self.atmosphere_sim = None self.fast_sim = fast_sim - self.with_background = with_background self.full_image = full_image self.with_adr = with_adr if self.full_image: @@ -395,7 +388,7 @@ def integrand(lbda): return spectrum, spectrum_err def simulate(self, A1=1.0, A2=0., A3=0., aerosols=0.05, angstrom_exponent=None, ozone=300, pwv=5, - D=parameters.DISTANCE2CCD, shift_x=0., shift_y=0., angle=0., B=1., psf_poly_params=None): + D=parameters.DISTANCE2CCD, shift_x=0., shift_y=0., angle=0., psf_poly_params=None): """ Parameters @@ -423,8 +416,6 @@ def simulate(self, A1=1.0, A2=0., A3=0., aerosols=0.05, angstrom_exponent=None, Shift in pixels along y axis of the order 0 position estimate (default: 0). angle: float Angle of the dispersion axis in degree (default: 0). - B: float - Amplitude level for the background (default: 0). psf_poly_params: array_like Polynomial parameters describing the PSF dependence in wavelength (default: None). @@ -443,7 +434,7 @@ def simulate(self, A1=1.0, A2=0., A3=0., aerosols=0.05, angstrom_exponent=None, >>> spec.disperser.ratio_ratio_order_3over2 = lambda lbda: 0.1 >>> psf_poly_params = spec.chromatic_psf.from_table_to_poly_params() >>> atmosphere = Atmosphere(airmass=1.2, pressure=800, temperature=10) - >>> sim = SpectrogramModel(spec, atmosphere=atmosphere, with_background=True, fast_sim=True) + >>> sim = SpectrogramModel(spec, atmosphere=atmosphere, fast_sim=True) >>> lambdas, model, model_err = sim.simulate(A2=1, angle=-1.5, psf_poly_params=psf_poly_params) >>> sim.plot_spectrogram() @@ -524,8 +515,6 @@ def simulate(self, A1=1.0, A2=0., A3=0., aerosols=0.05, angstrom_exponent=None, self.spectrogram_data = A1 * ima self.spectrogram_err = A1 * np.sqrt(ima_err2) - if self.with_background: - self.spectrogram_data += B * self.spectrogram_bgd # Save the simulation parameters self.psf_poly_params = np.copy(poly_params[0]) self.header['OZONE_T'] = ozone diff --git a/tests/test_simulator.py b/tests/test_simulator.py index 4fe1825b1..85a133a74 100644 --- a/tests/test_simulator.py +++ b/tests/test_simulator.py @@ -62,7 +62,7 @@ def test_simulator(): atmosphere = AtmosphereGrid(atmgrid_filename="./tests/data/reduc_20170530_134_atmsim.fits") spectrum_simulation = SpectrumSimulation(spectrum, atmosphere=atmosphere, fast_sim=True) spectrum_simulation.simulate(A1=1, A2=1, ozone=300, pwv=5, aerosols=0.05, angstrom_exponent=None, - reso=0., D=56, shift_x=0., B=0.) + reso=0., D=56, shift_x=0.) assert np.sum(spectrum_simulation.data) > 0 assert np.sum(spectrum_simulation.data) < 1e-10 From 161792fac5051d9f32ee59e118430f1d824fd59f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 25 Jan 2024 14:55:27 +0100 Subject: [PATCH 024/161] add flat and starfield fits in fit_spectrogram --- spectractor/fit/fit_spectrogram.py | 96 ++++++++++++++++++------------ 1 file changed, 59 insertions(+), 37 deletions(-) diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index dde91994a..0c5e798d8 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -69,25 +69,28 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, self.saturation = self.spectrum.spectrogram_saturation D2CCD = np.copy(spectrum.header['D2CCD']) p = np.array([1, 1, 1, 0.05, np.log10(angstrom_exponent_default), 400, 5, D2CCD, self.spectrum.header['PIXSHIFT'], - 0, self.spectrum.rotation_angle, 1]) - self.psf_params_start_index = np.array([12 + len(self.psf_poly_params) * k for k in range(len(self.diffraction_orders))]) + 0, self.spectrum.rotation_angle, 1, 1]) + # parameter indices for which we don't need to recompute the PSF cube for model evaluation + self.fixed_psf_params = np.array([0, 1, 2, 3, 4, 5, 6, 9, 10]) + self.psf_params_start_index = np.array([p.size + len(self.psf_poly_params) * k for k in range(len(self.diffraction_orders))]) psf_poly_params_labels = np.copy(self.spectrum.chromatic_psf.params.labels[length:]) psf_poly_params_names = np.copy(self.spectrum.chromatic_psf.params.axis_names[length:]) psf_poly_params_bounds = self.spectrum.chromatic_psf.set_bounds() p = np.concatenate([p] + [self.psf_poly_params] * len(self.diffraction_orders)) input_labels = [f"A{order}" for order in self.diffraction_orders] input_labels += ["VAOD", "angstrom_exp_log10", "ozone [db]", "PWV [mm]", r"D_CCD [mm]", - r"shift_x [pix]", r"shift_y [pix]", r"angle [deg]", "B"] + r"shift_x [pix]", r"shift_y [pix]", r"angle [deg]", "B", "A_star"] for order in self.diffraction_orders: input_labels += [label + f"_{order}" for label in psf_poly_params_labels] axis_names = [f"$A_{order}$" for order in self.diffraction_orders] axis_names += ["VAOD", r'$\log_{10}\"a$', "ozone [db]", "PWV [mm]", r"$D_{CCD}$ [mm]", - r"$\Delta_{\mathrm{x}}$ [pix]", r"$\Delta_{\mathrm{y}}$ [pix]", r"$\theta$ [deg]", "$B$"] + r"$\Delta_{\mathrm{x}}$ [pix]", r"$\Delta_{\mathrm{y}}$ [pix]", r"$\theta$ [deg]", + "$B$", r"$A_{star}$"] for order in self.diffraction_orders: axis_names += [label+rf"$\!_{order}$" for label in psf_poly_params_names] bounds = [[0, 2], [0, 2], [0, 2], [0, 0.1], [-5, 2], [100, 700], [0, 10], [D2CCD - 5 * parameters.DISTANCE2CCD_ERR, D2CCD + 5 * parameters.DISTANCE2CCD_ERR], [-2, 2], - [-10, 10], [-90, 90], [0.8, 1.2]] + [-10, 10], [-90, 90], [0.8, 1.2], [0, np.inf]] bounds += list(psf_poly_params_bounds) * len(self.diffraction_orders) fixed = [False] * p.size for k, par in enumerate(input_labels): @@ -100,7 +103,6 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, params = FitParameters(p, labels=input_labels, axis_names=axis_names, bounds=bounds, fixed=fixed, truth=truth, filename=self.filename) - self.fixed_psf_params = np.array([0, 1, 2, 3, 4, 5, 6, 9]) self.atm_params_indices = np.array([params.get_index(label) for label in ["VAOD", "angstrom_exp_log10", "ozone [db]", "PWV [mm]"]]) # A2 is free only if spectrogram is a simulation or if the order 2/1 ratio is not known and flat if "A2" in params.labels: @@ -128,6 +130,15 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, self.Ny, self.Nx = self.spectrum.spectrogram_data.shape self.data = self.spectrum.spectrogram_data.flatten() self.err = self.spectrum.spectrogram_err.flatten() + self.bgd = self.spectrum.spectrogram_bgd.flatten() + if self.spectrum.spectrogram_flat is not None: + self.flat = self.spectrum.spectrogram_flat.flatten() + else: + self.flat = None + if self.spectrum.spectrogram_starfield is not None: + self.starfield = self.spectrum.spectrogram_starfield.flatten() + else: + self.starfield = None self.fit_angstrom_exponent = fit_angstrom_exponent if atmgrid_file_name != "": @@ -166,6 +177,10 @@ def crop_spectrogram(self): self.spectrum.spectrogram_bgd = self.spectrum.spectrogram_bgd[bgd_width:-bgd_width, :] self.spectrum.spectrogram_data = self.spectrum.spectrogram_data[bgd_width:-bgd_width, :] self.spectrum.spectrogram_err = self.spectrum.spectrogram_err[bgd_width:-bgd_width, :] + if self.spectrum.spectrogram_flat is not None: + self.spectrum.spectrogram_flat = self.spectrum.spectrogram_flat[bgd_width:-bgd_width, :] + if self.spectrum.spectrogram_starfield is not None: + self.spectrum.spectrogram_starfield = self.spectrum.spectrogram_starfield[bgd_width:-bgd_width, :] self.spectrum.spectrogram_y0 -= bgd_width self.spectrum.chromatic_psf.y0 -= bgd_width self.spectrum.spectrogram_Ny, self.spectrum.spectrogram_Nx = self.spectrum.spectrogram_data.shape @@ -194,11 +209,11 @@ def set_mask(self, params=None): self.my_logger.info("\n\tReset spectrogram mask with current parameters.") if params is None: params = self.params.values - A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, D, shift_x, shift_y, angle, B, *psf_poly_params_all = params + A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, D, shift_x, shift_y, angle, B, Astar, *psf_poly_params_all = params poly_params = np.array(psf_poly_params_all).reshape((len(self.diffraction_orders), -1)) - self.simulation.psf_cubes_masked = {} - self.simulation.M_sparse_indices = {} - self.simulation.psf_cube_sparse_indices = {} + self.spectrogram_simulation.psf_cubes_masked = {} + self.spectrogram_simulation.M_sparse_indices = {} + self.spectrogram_simulation.psf_cube_sparse_indices = {} for k, order in enumerate(self.diffraction_orders): profile_params = self.spectrum.chromatic_psf.from_poly_params_to_profile_params(poly_params[k], apply_bounds=True) @@ -208,16 +223,16 @@ def set_mask(self, params=None): niter=5, with_adr=True, order=order) profile_params[:, 0] = 1 - profile_params[:, 1] = dispersion_law.real + self.simulation.r0.real + profile_params[:, 1] = dispersion_law.real + self.spectrogram_simulation.r0.real profile_params[:, 2] += dispersion_law.imag # - self.bgd_width - psf_cube_masked = self.spectrum.chromatic_psf.build_psf_cube_masked(self.simulation.pixels, profile_params, + psf_cube_masked = self.spectrum.chromatic_psf.build_psf_cube_masked(self.spectrogram_simulation.pixels, profile_params, fwhmx_clip=3 * parameters.PSF_FWHM_CLIP, fwhmy_clip=parameters.PSF_FWHM_CLIP) psf_cube_masked = self.spectrum.chromatic_psf.convolve_psf_cube_masked(psf_cube_masked) # make rectangular mask per wavelength - self.simulation.boundaries[order], self.simulation.psf_cubes_masked[order] = self.spectrum.chromatic_psf.get_boundaries(psf_cube_masked) - self.simulation.psf_cube_sparse_indices[order], self.simulation.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(psf_cube_masked) - mask = np.sum(self.simulation.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], self.simulation.pixels[0].size), axis=0) == 0 + self.spectrogram_simulation.boundaries[order], self.spectrogram_simulation.psf_cubes_masked[order] = self.spectrum.chromatic_psf.get_boundaries(psf_cube_masked) + self.spectrogram_simulation.psf_cube_sparse_indices[order], self.spectrogram_simulation.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(psf_cube_masked) + mask = np.sum(self.spectrogram_simulation.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], self.spectrogram_simulation.pixels[0].size), axis=0) == 0 self.W = np.copy(self.W_before_mask) self.W[mask] = 0 self.mask = list(np.where(mask)[0]) @@ -241,9 +256,10 @@ def get_spectrogram_truth(self): shifty_truth = 0 rotation_angle = self.spectrum.header['ROT_T'] B = 1 + Astar = 1 poly_truth = np.fromstring(self.spectrum.header['PSF_P_T'][1:-1], sep=' ', dtype=float) self.truth = (A1_truth, A2_truth, A3_truth, aerosols_truth, ozone_truth, pwv_truth, - D_truth, shiftx_truth, shifty_truth, rotation_angle, B, *poly_truth) + D_truth, shiftx_truth, shifty_truth, rotation_angle, B, Astar, *poly_truth) self.lambdas_truth = np.fromstring(self.spectrum.header['LBDAS_T'][1:-1], sep=' ', dtype=float) self.amplitude_truth = np.fromstring(self.spectrum.header['AMPLIS_T'][1:-1], sep=' ', dtype=float) else: @@ -349,16 +365,22 @@ def simulate(self, *params): >>> w.plot_fit() """ - A1, A2, A3, aerosols, angstrom_exponent_log10, ozone, pwv, D, shift_x, shift_y, angle, B, *psf_poly_params = params + A1, A2, A3, aerosols, angstrom_exponent_log10, ozone, pwv, D, shift_x, shift_y, angle, B, Astar, *psf_poly_params = params self.params.values = np.asarray(params) if self.fit_angstrom_exponent: angstrom_exponent = 10 ** angstrom_exponent_log10 else: angstrom_exponent = None - lambdas, model, model_err = self.simulation.simulate(A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, D, shift_x, shift_y, angle, B, psf_poly_params) + lambdas, model, model_err = self.spectrogram_simulation.simulate(A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, D, shift_x, shift_y, angle, psf_poly_params) self.lambdas = lambdas self.model = model.flatten() self.model_err = model_err.flatten() + self.model += B * self.bgd + if self.starfield is not None: + self.model += Astar * self.starfield + if self.flat is not None: + # TODO: if flat array is a cube flat, needs to multiply directly in build_psf_cube + self.model *= self.flat return self.lambdas, self.model, self.model_err def jacobian(self, params, epsilon, model_input=None): @@ -369,19 +391,19 @@ def jacobian(self, params, epsilon, model_input=None): lambdas, model, model_err = self.simulate(*params) model = model.flatten() J = np.zeros((params.size, model.size)) - strategy = copy.copy(self.simulation.fix_psf_cube) - atmosphere = copy.copy(self.simulation.atmosphere_sim) + strategy = copy.copy(self.spectrogram_simulation.fix_psf_cube) + atmosphere = copy.copy(self.spectrogram_simulation.atmosphere_sim) for ip, p in enumerate(params): if self.params.fixed[ip]: continue if ip in self.fixed_psf_params: - self.simulation.fix_psf_cube = True + self.spectrogram_simulation.fix_psf_cube = True else: - self.simulation.fix_psf_cube = False + self.spectrogram_simulation.fix_psf_cube = False if ip in self.atm_params_indices: - self.simulation.fix_atm_sim = False + self.spectrogram_simulation.fix_atm_sim = False else: - self.simulation.fix_atm_sim = True + self.spectrogram_simulation.fix_atm_sim = True if ip >= self.psf_params_start_index[0]: continue tmp_p = np.copy(params) @@ -389,21 +411,21 @@ def jacobian(self, params, epsilon, model_input=None): epsilon[ip] = - epsilon[ip] tmp_p[ip] += epsilon[ip] tmp_lambdas, tmp_model, tmp_model_err = self.simulate(*tmp_p) - if self.simulation.fix_atm_sim is False: - self.simulation.atmosphere_sim = atmosphere + if self.spectrogram_simulation.fix_atm_sim is False: + self.spectrogram_simulation.atmosphere_sim = atmosphere J[ip] = (tmp_model.flatten() - model) / epsilon[ip] - self.simulation.fix_atm_sim = True - self.simulation.fix_psf_cube = False + self.spectrogram_simulation.fix_atm_sim = True + self.spectrogram_simulation.fix_psf_cube = False for k, order in enumerate(self.diffraction_orders): - if self.simulation.profile_params[order] is None: + if self.spectrogram_simulation.profile_params[order] is None: continue start = self.psf_params_start_index[k] - profile_params = np.copy(self.simulation.profile_params[order]) - J[start:start+len(self.psf_poly_params)] = self.simulation.chromatic_psf.build_psf_jacobian(self.simulation.pixels, profile_params=profile_params, - psf_cube_sparse_indices=self.simulation.psf_cube_sparse_indices[order], - boundaries=self.simulation.boundaries[order], dtype="float32") - self.simulation.fix_psf_cube = strategy - self.simulation.fix_atm_sim = False + profile_params = np.copy(self.spectrogram_simulation.profile_params[order]) + J[start:start+len(self.psf_poly_params)] = self.spectrogram_simulation.chromatic_psf.build_psf_jacobian(self.spectrogram_simulation.pixels, profile_params=profile_params, + psf_cube_sparse_indices=self.spectrogram_simulation.psf_cube_sparse_indices[order], + boundaries=self.spectrogram_simulation.boundaries[order], dtype="float32") + self.spectrogram_simulation.fix_psf_cube = strategy + self.spectrogram_simulation.fix_atm_sim = False self.my_logger.debug(f"\n\tJacobian time computation = {time.time() - start:.1f}s") return J @@ -542,8 +564,8 @@ def run_spectrogram_minimisation(fit_workspace, method="newton", verbose=False): # run_minimisation(fit_workspace, method="newton", epsilon=epsilon, fix=fit_workspace.fixed, # xtol=1e-2, ftol=10 / fit_workspace.data.size, verbose=False) - fit_workspace.simulation.fast_sim = False - fit_workspace.simulation.fix_psf_cube = False + fit_workspace.spectrogram_simulation.fast_sim = False + fit_workspace.spectrogram_simulation.fix_psf_cube = False fit_workspace.params.fixed = np.copy(fixed) # guess = fit_workspace.p # params_table, costs = run_gradient_descent(fit_workspace, guess, epsilon, params_table, costs, From eba223457f1464521e1f4912e4a5c4616569d2dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 25 Jan 2024 14:55:48 +0100 Subject: [PATCH 025/161] debug save and load of flats and star fields --- spectractor/extractor/spectrum.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index 62e5c2b58..92028a1d3 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -671,7 +671,7 @@ def save_spectrum(self, output_file_name, overwrite=False): # print(f"Set header key {header_key} to {value} from attr {attribute}") extnames = ["SPECTRUM", "SPEC_COV", "ORDER2", "ORDER0"] # spectrum data - extnames += ["S_DATA", "S_ERR", "S_BGD", "S_BGD_ER", "S_FIT", "S_RES"] # spectrogram data + extnames += ["S_DATA", "S_ERR", "S_BGD", "S_BGD_ER", "S_FIT", "S_RES", "S_FLAT", "S_STAR"] # spectrogram data extnames += ["PSF_TAB"] # PSF parameter table extnames += ["LINES"] # spectroscopic line table extnames += ["CONFIG"] # config parameters @@ -702,9 +702,9 @@ def save_spectrum(self, output_file_name, overwrite=False): hdus[extname].data = self.spectrogram_fit elif extname == "S_RES": hdus[extname].data = self.spectrogram_residuals - elif extname == "S_FLAT" and self.spectrogram_flat is not None: + elif extname == "S_FLAT": hdus[extname].data = self.spectrogram_flat - elif extname == "S_STAR" and self.spectrogram_starfield is not None: + elif extname == "S_STAR": hdus[extname].data = self.spectrogram_starfield elif extname == "PSF_TAB": hdus[extname] = fits.table_to_hdu(self.chromatic_psf.table) @@ -1086,9 +1086,9 @@ def load_spectrum_latest(self, input_file_name): self.spectrogram_bgd_rms = hdu_list["S_BGD_ER"].data self.spectrogram_fit = hdu_list["S_FIT"].data self.spectrogram_residuals = hdu_list["S_RES"].data - if "S_FLAT" in hdu_list.__dict__.keys(): + if "S_FLAT" in [hdu.name for hdu in hdu_list]: self.spectrogram_flat = hdu_list["S_FLAT"].data - if "S_STAR" in hdu_list.__dict__.keys(): + if "S_STAR" in [hdu.name for hdu in hdu_list]: self.spectrogram_starfield = hdu_list["S_STAR"].data self.chromatic_psf.init_from_table(Table.read(hdu_list["PSF_TAB"]), saturation=self.spectrogram_saturation) From 5676a68691a01f06857fc3149635ba60dea88a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 26 Jan 2024 18:30:22 +0100 Subject: [PATCH 026/161] cleaning and comments --- spectractor/extractor/extractor.py | 17 +++++++---- spectractor/simulation/image_simulation.py | 33 +++++++++------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 1c9a76cb5..65ccb659d 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1247,9 +1247,8 @@ def extract_spectrum_from_image(image, spectrum, signal_width=10, ws=(20, 30)): ws = [signal_width + 20, signal_width + 30] my_logger.info('\n\t ======================= extract_spectrum_from_image =============================') - my_logger.info( - f'\n\tExtracting spectrum from image: spectrum with width 2*{signal_width:.0f} pixels ' - f'and background from {ws[0]:.0f} to {ws[1]:.0f} pixels') + my_logger.info(f'\n\tExtracting spectrum from image: spectrum with width 2*{signal_width:.0f} pixels ' + f'and background from {ws[0]:.0f} to {ws[1]:.0f} pixels') # Make a data copy data = np.copy(image.data_rotated) @@ -1281,8 +1280,12 @@ def extract_spectrum_from_image(image, spectrum, signal_width=10, ws=(20, 30)): # Create spectrogram data = data[ymin:ymax, xmin:xmax] err = err[ymin:ymax, xmin:xmax] - if image.flat is not None: - data /= image.flat[ymin:ymax, xmin:xmax] + + # clean the data: this is truly a backward spectrum extraction to feed correctly the forward model + # if available, apply flats + if image.flat_rotated is not None: + data /= image.flat_rotated[ymin:ymax, xmin:xmax] + Ny, Nx = data.shape my_logger.info(f'\n\tExtract spectrogram: crop rotated image [{xmin}:{xmax},{ymin}:{ymax}] (size ({Nx}, {Ny}))') @@ -1295,7 +1298,6 @@ def bgd_model_func(x, y): return np.zeros((y.size, x.size)) if parameters.SPECTRACTOR_BACKGROUND_SUBTRACTION: bgd_model_func, bgd_res, bgd_rms = extract_spectrogram_background_sextractor(data, err, ws=ws, mask_signal_region=True) - # while np.nanmean(bgd_res)/np.nanstd(bgd_res) < -0.2 and parameters.PIXWIDTH_BOXSIZE >= 5: while (np.abs(np.nanmean(bgd_res)) > 0.5 or np.nanstd(bgd_res) > 1.3) and parameters.PIXWIDTH_BOXSIZE > 5: parameters.PIXWIDTH_BOXSIZE = max(5, parameters.PIXWIDTH_BOXSIZE // 2) my_logger.debug(f"\n\tPull distribution of background residuals differs too much from mean=0 and std=1. " @@ -1546,6 +1548,9 @@ def run_spectrogram_deconvolution_psf2d(spectrum, bgd_model_func): f'mode={mode} and amplitude_priors_method={method}...') data = np.copy(spectrum.spectrogram_data) err = np.copy(spectrum.spectrogram_err) + + # clean the data: this is truly a backward spectrum extraction to feed correctly the forward model + # if available, apply flats if spectrum.spectrogram_flat is not None: data /= spectrum.spectrogram_flat diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index 6e7dadb0e..2e14fefd2 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -69,11 +69,10 @@ def __init__(self, centroid_coords, psf, amplitude): self.x0 = centroid_coords[0] self.y0 = centroid_coords[1] self.amplitude = amplitude - # self.target = target self.psf = copy.deepcopy(psf) self.psf.params.values[1] = self.x0 self.psf.params.values[2] = self.y0 - self.psf.params.values[0] = amplitude + self.psf.params.values[0] = self.amplitude # to be realistic, usually fitted fwhm is too big, divide gamma by 2 self.fwhm = self.psf.params.values[3] # self.sigma = self.model.stddev / 2 @@ -157,11 +156,6 @@ def set_star_list(self): else: # mask background, faint stars, and saturated pixels data = np.copy(self.image.data) - # self.saturation = 0.99 * parameters.CCD_MAXADU / base_image.expo - # self.saturated_pixels = np.where(image_thresholded > self.saturation) - # image_thresholded[self.saturated_pixels] = 0. - # image_thresholded -= threshold - # image_thresholded[np.where(image_thresholded < 0)] = 0. # mask order0 and spectrum margin = 30 mask = np.zeros(data.shape, dtype=bool) @@ -312,6 +306,7 @@ def plot_model(self): if parameters.PdfPages: parameters.PdfPages.savefig() + class FlatModel: """Class to model the pixel flat of the simulated image. Flat is dimensionless and its average must be one. @@ -321,11 +316,11 @@ class FlatModel: ---------- gains: array_like The list of gains to apply. The average must be one. - with_noise: bool - If True, a random quantum efficiency is applied to pixels (default: False). + randomness_level: float + Level of random quantum efficiency to apply to pixels (default: 0.). """ - def __init__(self, gains, with_randomness=False): + def __init__(self, gains, randomness_level=0.): """Create a FlatModel instance. Flat is dimensionless and its average must be one. The flat model size is set with the parameters.CCD_IMSIZE global keyword. @@ -334,8 +329,8 @@ def __init__(self, gains, with_randomness=False): ---------- gains: array_like The list of gains to apply. The average must be one. - with_randomness: bool - If True, a random quantum efficiency is applied to pixels (default: False). + randomness_level: float + Level of random quantum efficiency to apply to pixels (default: 0.). Examples -------- @@ -360,7 +355,7 @@ def __init__(self, gains, with_randomness=False): "I scaled them to have an average of one.") self.gains /= np.mean(self.gains) self.my_logger.warning(f'\n\tRelative gains are set to {self.gains}.') - self.with_noise = with_randomness + self.randomness_level = randomness_level def model(self): """Compute the flat model for the image simulation (no units). @@ -379,8 +374,8 @@ def model(self): vflats[v] *= self.gains[h,v] hflats[h] = np.concatenate(vflats).T flat = np.concatenate(hflats).T - if self.with_noise: - flat += np.random.uniform(-1e-2, 1e-2, size=flat.shape) + if self.randomness_level != 0: + flat += np.random.uniform(-self.randomness_level, self.randomness_level, size=flat.shape) return flat @@ -509,7 +504,7 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer # Target model my_logger.info('\n\tStar model...') - # Spectrogram is simulated with spectrum.x0 target position: must be this position to simualte the target. + # Spectrogram is simulated with spectrum.x0 target position: must be this position to simulate the target. star = StarModel(image.target_pixcoords, image.target_star2D, image.target_star2D.params.values[0]) # reso = star.fwhm if parameters.DEBUG: @@ -519,16 +514,16 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer starfield = None if with_stars: my_logger.info('\n\tStar field model...') - starfield = StarFieldModel(image) + starfield = StarFieldModel(image, flux_factor=1) if parameters.DEBUG: image.plot_image(scale='symlog', target_pixcoords=starfield.pixcoords) starfield.plot_model() - # flat model + # Flat model flat = None if with_flat: my_logger.info('\n\tStar field model...') - flat = FlatModel(gains=[[1, 2, 3, 4], [4, 3, 2, 1]], with_randomness=True) + flat = FlatModel(gains=[[1, 2, 3, 4], [4, 3, 2, 1]], randomness_level=1e-2) if parameters.DEBUG: flat.plot_model() From 90ef963ad2c8e2447cb64ff4a9aa6c66b0880a26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 26 Jan 2024 18:31:35 +0100 Subject: [PATCH 027/161] remove starfield before 1D and 2D extractions --- spectractor/extractor/extractor.py | 13 +++++++++++++ spectractor/extractor/images.py | 15 +++++++++++++++ spectractor/extractor/targets.py | 1 + 3 files changed, 29 insertions(+) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 65ccb659d..eb11f4897 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1320,6 +1320,14 @@ def bgd_model_func(x, y): debug = copy.copy(parameters.DEBUG) parameters.VERBOSE = False parameters.DEBUG = False + + # clean the data: this is truly a backward spectrum extraction to feed correctly the forward model + # if available, subtract starfield before 1D spectrum estimate + # (important as it is used as a prior for regularisation) + if image.starfield_rotated is not None: + scaling = np.max(image.target.image) / np.max(image.target.starfield) + data -= scaling * image.starfield_rotated[ymin:ymax, xmin:xmax] + s.fit_transverse_PSF1D_profile(data, err, signal_width, ws, pixel_step=parameters.PSF_PIXEL_STEP_TRANSVERSE_FIT, sigma_clip=5, bgd_model_func=bgd_model_func, saturation=image.saturation, live_fit=False) @@ -1553,6 +1561,11 @@ def run_spectrogram_deconvolution_psf2d(spectrum, bgd_model_func): # if available, apply flats if spectrum.spectrogram_flat is not None: data /= spectrum.spectrogram_flat + # if available, subtract starfield before 1D spectrum estimate + # (important as it is used as a prior for regularisation) + if spectrum.spectrogram_starfield is not None: + scaling = np.max(spectrum.target.image) / np.max(spectrum.target.starfield) + data -= scaling * spectrum.spectrogram_starfield my_logger.info('\n\t ======================= ChromaticPSF2D polynomial fit =============================') w = s.fit_chromatic_psf(data, bgd_model_func=bgd_model_func, data_errors=err, live_fit=False, diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index 997a55b9c..f7d9a1a95 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -46,6 +46,10 @@ class Image(object): Flat 2D array without units and median of 1. starfield: array Star field simulation, no units needed but better in ADU/s. + flat_rotated: array + Rotated flat 2D array without units and median of 1. + starfield_rotated: array + Rotated star field simulation, no units needed but better in ADU/s. target_pixcoords_rotated: array Target position [x,y] in the rotated image in pixels. date_obs: str @@ -159,7 +163,9 @@ def __init__(self, file_name, *, target_label="", disperser_label="", self.humidity = 0 self.flat = None + self.flat_rotated = None self.starfield = None + self.starfield_rotated = None if parameters.CALLING_CODE != 'LSST_DM' and file_name != "": self.load_image(file_name) @@ -939,6 +945,8 @@ def find_target(image, guess=None, rotated=False, widths=[parameters.XWINDOW, pa image.target.image_x0 = sub_image_x0 image.target.image_y0 = sub_image_y0 image.target_pixcoords = [theX, theY] + if image.starfield is not None: + image.target.starfield = np.copy(image.starfield[int(theY) - Dy:int(theY) + Dy, int(theX) - Dx:int(theX) + Dx]) image.header['TARGETX'] = theX image.header.comments['TARGETX'] = 'target position on X axis' image.header['TARGETY'] = theY @@ -1421,6 +1429,13 @@ def turn_image(image): prefilter=parameters.ROT_PREFILTER, order=parameters.ROT_ORDER))) min_noz = np.min(image.err_rotated[image.err_rotated > 0]) image.err_rotated[image.err_rotated <= 0] = min_noz + if image.flat is not None: + image.flat_rotated = ndimage.rotate(image.flat, image.rotation_angle, + prefilter=parameters.ROT_PREFILTER, order=parameters.ROT_ORDER) + if image.starfield is not None: + image.starfield_rotated = ndimage.rotate(image.starfield, image.rotation_angle, + prefilter=parameters.ROT_PREFILTER, order=parameters.ROT_ORDER) + if parameters.DEBUG: margin = 100 // parameters.CCD_REBIN y0 = int(image.target_pixcoords[1]) diff --git a/spectractor/extractor/targets.py b/spectractor/extractor/targets.py index 8d5b5ea4c..cc7fcc978 100644 --- a/spectractor/extractor/targets.py +++ b/spectractor/extractor/targets.py @@ -86,6 +86,7 @@ def __init__(self, label, verbose=False): self.image = None self.image_x0 = None self.image_y0 = None + self.starfield = None class ArcLamp(Target): From 67d261dd74e9940928635205c0a98b3ec7fd8a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 26 Jan 2024 18:32:12 +0100 Subject: [PATCH 028/161] better starfield simulation: amplitude and ref position is set by main target --- spectractor/simulation/image_simulation.py | 45 +++++++++++++++++----- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index 2e14fefd2..1792eaba3 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -139,14 +139,40 @@ def set_star_list(self): wcs = load_wcs_from_file(wcs_file_name) # catalog matching to set star positions using Gaia sources_coord = wcs.all_pix2world(sources['xcentroid'], sources['ycentroid'], 0) + target_coord = wcs.all_pix2world([x0], [y0], 0) sources_coord = SkyCoord(ra=sources_coord[0] * units.deg, dec=sources_coord[1] * units.deg, frame="icrs", obstime=self.image.date_obs, equinox="J2000") + target_coord = SkyCoord(ra=target_coord[0] * units.deg, dec=target_coord[1] * units.deg, + frame="icrs", obstime=self.image.date_obs, equinox="J2000") gaia_index, dist_2d, dist_3d = sources_coord.match_to_catalog_sky(gaia_coord_after_motion) - for k, gaia_i in enumerate(gaia_index): - x, y = wcs.all_world2pix(gaia_coord_after_motion[gaia_i].ra, gaia_coord_after_motion[gaia_i].dec, 0) - A = sources['flux'][k] * self.flux_factor + gaia_target_index, dist_2d, dist_3d = target_coord.match_to_catalog_sky(gaia_coord_after_motion) + #for k, gaia_i in enumerate(gaia_index): + # x, y = wcs.all_world2pix(gaia_coord_after_motion[gaia_i].ra, gaia_coord_after_motion[gaia_i].dec, 0) + # A = sources['flux'][k] * self.flux_factor + # self.stars.append(StarModel([x, y], self.image.target_star2D, A)) + # self.pixcoords.append([x, y]) + dx, dy = 0, 0 + for gaia_i in range(len(gaia_catalog)): + x, y = wcs.all_world2pix(gaia_coord_after_motion[gaia_i].ra, + gaia_coord_after_motion[gaia_i].dec, 0) + if gaia_i == gaia_target_index[0]: + dx = x0 - x + dy = y0 - y + A = 10**(-gaia_catalog['phot_g_mean_mag'][gaia_i]/2.5) self.stars.append(StarModel([x, y], self.image.target_star2D, A)) self.pixcoords.append([x, y]) + # rescale using target fitted amplitude + amplitudes = np.array([star.amplitude for star in self.stars]) + target_flux = self.image.target_star2D.params.values[0] + amplitudes *= target_flux / self.stars[gaia_target_index[0]].amplitude * self.flux_factor + for k, star in enumerate(self.stars): + star.amplitude = amplitudes[k] + star.x0 += dx + star.y0 += dy + star.psf.params.values[1] += dx + star.psf.params.values[2] += dy + star.psf.params.values[0] = amplitudes[k] + else: for k, source in enumerate(sources): x, y = sources['xcentroid'][k], sources['ycentroid'][k] @@ -413,17 +439,18 @@ def __init__(self, filename, target_label=None): def compute(self, star, background, spectrogram, starfield=None, flat=None): yy, xx = np.mgrid[0:parameters.CCD_IMSIZE:1, 0:parameters.CCD_IMSIZE:1] - self.data = star.psf.evaluate(np.array([xx, yy])) + background.model() + if starfield is not None: + starfield_mod = starfield.model(xx, yy) + self.data = starfield_mod + self.starfield = np.copy(starfield_mod) + else: + self.data = star.psf.evaluate(np.array([xx, yy])) + self.data += background.model() if spectrogram.full_image: self.data[spectrogram.spectrogram_ymin:spectrogram.spectrogram_ymax, :] += spectrogram.spectrogram_data else: self.data[spectrogram.spectrogram_ymin:spectrogram.spectrogram_ymax, spectrogram.spectrogram_xmin:spectrogram.spectrogram_xmax] += spectrogram.spectrogram_data - # - spectrogram.spectrogram_bgd) - if starfield is not None: - starfield_mod = starfield.model(xx, yy) - self.data += starfield_mod - self.starfield = starfield_mod if flat is not None: flat_mod = flat.model() self.data *= flat_mod From f543de2009b14db4fa62ab0abcdcc4e0784ea8dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Sun, 28 Jan 2024 09:35:38 +0100 Subject: [PATCH 029/161] include flat and starfield in test_fullchain --- runImageSim.py | 2 +- runSimulator.py | 2 +- spectractor/simulation/image_simulation.py | 6 ++--- tests/test_fullchain.py | 30 +++++++++++++--------- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/runImageSim.py b/runImageSim.py index 141211765..b69d65e96 100644 --- a/runImageSim.py +++ b/runImageSim.py @@ -49,4 +49,4 @@ continue image = ImageSim(file_name, spectrum_file_name, args.output_directory, A2=1, - psf_poly_params=psf_poly_params, with_stars=False) + psf_poly_params=psf_poly_params, with_starfield=False) diff --git a/runSimulator.py b/runSimulator.py index e5e7e9ca4..7fc4f204f 100644 --- a/runSimulator.py +++ b/runSimulator.py @@ -43,6 +43,6 @@ atmgrid = AtmosphereGrid(file_name) image = ImageSim(file_name, spectrum_file_name, args.output_directory, A1=1, A2=1, pwv=5, ozone=300, aerosols=0.03, - psf_poly_params=None, with_stars=True) + psf_poly_params=None, with_starfield=True) sim_file_name = args.output_directory + tag.replace('reduc_', 'sim_') Spectractor(sim_file_name, args.output_directory, target, [xpos, ypos], disperser_label, args.config) diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index 1792eaba3..6f39d5fe6 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -490,7 +490,7 @@ def load_image(self, filename): def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aerosols=0.03, A1=1, A2=1, A3=1, angstrom_exponent=None, - psf_poly_params=None, psf_type=None, diffraction_orders=None, with_rotation=True, with_stars=True, with_adr=True, with_noise=True, with_flat=True): + psf_poly_params=None, psf_type=None, diffraction_orders=None, with_rotation=True, with_starfield=True, with_adr=True, with_noise=True, with_flat=True): """ The basic use of the extractor consists first to define: - the path to the fits image from which to extract the image, - the path of the output directory to save the extracted spectrum (created automatically if does not exist yet), @@ -539,7 +539,7 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer # Star field model starfield = None - if with_stars: + if with_starfield: my_logger.info('\n\tStar field model...') starfield = StarFieldModel(image, flux_factor=1) if parameters.DEBUG: @@ -644,7 +644,7 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer image.header['VAOD_T'] = aerosols image.header['ROT_T'] = rotation_angle image.header['ROTATION'] = int(with_rotation) - image.header['STARS'] = int(with_stars) + image.header['STARS'] = int(with_starfield) image.header['BKGD_LEV'] = background.level image.header['PSF_DEG'] = spectrogram.chromatic_psf.deg image.header['PSF_TYPE'] = parameters.PSF_TYPE diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index 25421ce3b..34fd98d0c 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -7,7 +7,7 @@ from spectractor import parameters # noqa: E402 from spectractor.extractor.images import Image # noqa: E402 from spectractor.extractor.spectrum import Spectrum # noqa: E402 -from spectractor.extractor.extractor import Spectractor, SpectractorRun, SpectractorInit # noqa: E402 +from spectractor.extractor.extractor import SpectractorRun, SpectractorInit # noqa: E402 from spectractor.logbook import LogBook # noqa: E402 from spectractor.config import load_config, apply_rebinning_to_parameters # noqa: E402 from spectractor.simulation.image_simulation import ImageSim # noqa: E402 @@ -96,7 +96,7 @@ def make_image(): spectrum_filename = "./tests/data/reduc_20170530_134_spectrum.fits" image_filename = "./tests/data/reduc_20170530_134.fits" sim = ImageSim(image_filename, spectrum_filename, "./tests/data/", A1=A1_T, A2=A2_T, A3=A3_T, - psf_poly_params=PSF_POLY_PARAMS_TRUTH, with_stars=False, with_rotation=True, with_noise=False, + psf_poly_params=PSF_POLY_PARAMS_TRUTH, with_starfield=True, with_rotation=True, with_noise=False, with_flat=True) return sim @@ -106,22 +106,22 @@ def make_image(): def test_ctio_fullchain(): parameters.VERBOSE = True parameters.DEBUG = False - sim_image = "./tests/data/sim_20170530_134.fits" + sim_image_filename = "./tests/data/sim_20170530_134.fits" # load test and make image simulation - if not os.path.isfile(sim_image): - make_image() - image = Image(sim_image, config="./config/ctio.ini") + # if not os.path.isfile(sim_image_filename): + sim = make_image() + image = Image(sim_image_filename, config="./config/ctio.ini") lambdas_truth = np.fromstring(image.header['LBDAS_T'][1:-1], sep=' ') amplitude_truth = np.fromstring(image.header['AMPLIS_T'][1:-1], sep=' ', dtype=float) parameters.AMPLITUDE_TRUTH = np.copy(amplitude_truth) parameters.LAMBDA_TRUTH = np.copy(lambdas_truth) # extractor - tag = os.path.basename(sim_image) + tag = os.path.basename(sim_image_filename) tag = tag.replace('sim_', 'reduc_') logbook = LogBook(logbook="./tests/data/ctiofulllogbook_jun2017_v5.csv") - disperser_label, target, xpos, ypos = logbook.search_for_image(tag) + disperser_label, target_label, xpos, ypos = logbook.search_for_image(tag) load_config("./config/ctio.ini") parameters.PSF_POLY_ORDER = PSF_POLY_ORDER parameters.CCD_REBIN = 1 @@ -131,8 +131,13 @@ def test_ctio_fullchain(): if parameters.CCD_REBIN > 1: for k in range(2 * (PSF_POLY_ORDER + 1), 3 * (PSF_POLY_ORDER +1)): PSF_POLY_PARAMS_TRUTH[k] /= parameters.CCD_REBIN - spectrum = Spectractor(sim_image, "./tests/data", guess=[xpos, ypos], target_label=target, - disperser_label=disperser_label, config="") # config already loaded, do not overwrite PSF_POLY_ORDER + + image = SpectractorInit(sim_image_filename, target_label=target_label, + disperser_label=disperser_label, config="") # config already loaded, do not overwrite PSF_POLY_ORDER + image.flat = sim.flat + image.starfield = sim.starfield + spectrum = SpectractorRun(image, guess=[xpos, ypos], output_directory="./tests/data") + # tests residuals = plot_residuals(spectrum, lambdas_truth, amplitude_truth) @@ -169,7 +174,7 @@ def test_ctio_fullchain(): spectrum_file_name = "./tests/data/sim_20170530_134_spectrum.fits" assert os.path.isfile(spectrum_file_name) - atmgrid_filename = sim_image.replace('sim', 'reduc').replace('.fits', '_atmsim.fits') + atmgrid_filename = sim_image_filename.replace('sim', 'reduc').replace('.fits', '_atmsim.fits') assert os.path.isfile(atmgrid_filename) spectrum = Spectrum(spectrum_file_name) w = SpectrumFitWorkspace(spectrum, atmgrid_file_name=atmgrid_filename, fit_angstrom_exponent=False, @@ -200,7 +205,7 @@ def test_ctio_fullchain(): nsigma = 2 labels = ["A1_T", "A2_T", "VAOD_T", "OZONE_T", "PWV_T"] indices = [0, 1, 3, 5, 6] - A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, D, shift_x, shift_y, shift_t, B, *psf_poly_params = w.params.values + A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, D, shift_x, shift_y, shift_t, B, Astar, *psf_poly_params = w.params.values ipar = w.params.get_free_parameters() # non fixed param indices cov_indices = [list(ipar).index(k) for k in indices] # non fixed param indices in cov matrix assert w.costs[-1] / w.data.size < 1e-3 @@ -215,6 +220,7 @@ def test_ctio_fullchain(): assert np.isclose(shift_y, 0, atol=parameters.PIXSHIFT_PRIOR) # shift_y assert np.isclose(D, spectrum.header["D2CCD_T"], atol=0.1) # D2CCD assert np.isclose(B, 1, atol=1e-3) # B + assert np.isclose(Astar, 1, atol=1e-3) # Astar assert np.all(np.isclose(psf_poly_params[(PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1], np.array(PSF_POLY_PARAMS_TRUTH)[(PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1], rtol=0.01, atol=0.01)) From e9bf965b2ea35f34d790e9ad32787f4a53a7d0a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Sun, 28 Jan 2024 12:14:35 +0100 Subject: [PATCH 030/161] repair make starfield --- spectractor/simulation/image_simulation.py | 94 ++++----- .../reduc_20170530_134_gaia.ecsv | 180 ++++++++++++++++++ 2 files changed, 222 insertions(+), 52 deletions(-) create mode 100644 tests/data/reduc_20170530_134_wcs/reduc_20170530_134_gaia.ecsv diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index 6f39d5fe6..9d971a02a 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -122,64 +122,54 @@ def __init__(self, base_image, flux_factor=1): def set_star_list(self): x0, y0 = self.image.target_pixcoords sources_file_name = set_sources_file_name(self.image.file_name) - if os.path.isfile(sources_file_name): + wcs_file_name = set_wcs_file_name(self.image.file_name) + gaia_catalog_file_name = set_gaia_catalog_file_name(self.image.file_name) + if os.path.isfile(wcs_file_name) and os.path.isfile(gaia_catalog_file_name): + # load gaia catalog + gaia_catalog = ascii.read(gaia_catalog_file_name, format="ecsv") + gaia_coord_after_motion = get_gaia_coords_after_proper_motion(gaia_catalog, self.image.date_obs) + # load WCS + wcs = load_wcs_from_file(wcs_file_name) + # catalog matching to set star positions using Gaia + target_coord = wcs.all_pix2world([x0], [y0], 0) + target_coord = SkyCoord(ra=target_coord[0] * units.deg, dec=target_coord[1] * units.deg, + frame="icrs", obstime=self.image.date_obs, equinox="J2000") + gaia_target_index, dist_2d, dist_3d = target_coord.match_to_catalog_sky(gaia_coord_after_motion) + dx, dy = 0, 0 + for gaia_i in range(len(gaia_catalog)): + x, y = wcs.all_world2pix(gaia_coord_after_motion[gaia_i].ra, + gaia_coord_after_motion[gaia_i].dec, 0) + if gaia_i == gaia_target_index[0]: + dx = x0 - x + dy = y0 - y + A = 10 ** (-gaia_catalog['phot_g_mean_mag'][gaia_i] / 2.5) + self.stars.append(StarModel([x, y], self.image.target_star2D, A)) + self.pixcoords.append([x, y]) + # rescale using target fitted amplitude + amplitudes = np.array([star.amplitude for star in self.stars]) + target_flux = self.image.target_star2D.params.values[0] + amplitudes *= target_flux / self.stars[gaia_target_index[0]].amplitude * self.flux_factor + for k, star in enumerate(self.stars): + star.amplitude = amplitudes[k] + # shift x,y star positions according to target position + star.x0 += dx + star.y0 += dy + star.psf.params.values[1] += dx + star.psf.params.values[2] += dy + star.psf.params.values[0] = amplitudes[k] + elif os.path.isfile(sources_file_name): # load sources positions and flux sources = Table.read(sources_file_name) sources['X'].name = "xcentroid" sources['Y'].name = "ycentroid" sources['FLUX'].name = "flux" - # test presence of WCS and gaia catalog files - wcs_file_name = set_wcs_file_name(self.image.file_name) - gaia_catalog_file_name = set_gaia_catalog_file_name(self.image.file_name) - if os.path.isfile(wcs_file_name) and os.path.isfile(gaia_catalog_file_name): - # load gaia catalog - gaia_catalog = ascii.read(gaia_catalog_file_name, format="ecsv") - gaia_coord_after_motion = get_gaia_coords_after_proper_motion(gaia_catalog, self.image.date_obs) - # load WCS - wcs = load_wcs_from_file(wcs_file_name) - # catalog matching to set star positions using Gaia - sources_coord = wcs.all_pix2world(sources['xcentroid'], sources['ycentroid'], 0) - target_coord = wcs.all_pix2world([x0], [y0], 0) - sources_coord = SkyCoord(ra=sources_coord[0] * units.deg, dec=sources_coord[1] * units.deg, - frame="icrs", obstime=self.image.date_obs, equinox="J2000") - target_coord = SkyCoord(ra=target_coord[0] * units.deg, dec=target_coord[1] * units.deg, - frame="icrs", obstime=self.image.date_obs, equinox="J2000") - gaia_index, dist_2d, dist_3d = sources_coord.match_to_catalog_sky(gaia_coord_after_motion) - gaia_target_index, dist_2d, dist_3d = target_coord.match_to_catalog_sky(gaia_coord_after_motion) - #for k, gaia_i in enumerate(gaia_index): - # x, y = wcs.all_world2pix(gaia_coord_after_motion[gaia_i].ra, gaia_coord_after_motion[gaia_i].dec, 0) - # A = sources['flux'][k] * self.flux_factor - # self.stars.append(StarModel([x, y], self.image.target_star2D, A)) - # self.pixcoords.append([x, y]) - dx, dy = 0, 0 - for gaia_i in range(len(gaia_catalog)): - x, y = wcs.all_world2pix(gaia_coord_after_motion[gaia_i].ra, - gaia_coord_after_motion[gaia_i].dec, 0) - if gaia_i == gaia_target_index[0]: - dx = x0 - x - dy = y0 - y - A = 10**(-gaia_catalog['phot_g_mean_mag'][gaia_i]/2.5) - self.stars.append(StarModel([x, y], self.image.target_star2D, A)) - self.pixcoords.append([x, y]) - # rescale using target fitted amplitude - amplitudes = np.array([star.amplitude for star in self.stars]) - target_flux = self.image.target_star2D.params.values[0] - amplitudes *= target_flux / self.stars[gaia_target_index[0]].amplitude * self.flux_factor - for k, star in enumerate(self.stars): - star.amplitude = amplitudes[k] - star.x0 += dx - star.y0 += dy - star.psf.params.values[1] += dx - star.psf.params.values[2] += dy - star.psf.params.values[0] = amplitudes[k] - - else: - for k, source in enumerate(sources): - x, y = sources['xcentroid'][k], sources['ycentroid'][k] - A = sources['flux'][k] * self.flux_factor - self.stars.append(StarModel([x, y], self.image.target_star2D, A)) - self.pixcoords.append([x, y]) + for k, source in enumerate(sources): + x, y = sources['xcentroid'][k], sources['ycentroid'][k] + A = sources['flux'][k] * self.flux_factor + self.stars.append(StarModel([x, y], self.image.target_star2D, A)) + self.pixcoords.append([x, y]) else: + # try extraction using iraf source detection # mask background, faint stars, and saturated pixels data = np.copy(self.image.data) # mask order0 and spectrum diff --git a/tests/data/reduc_20170530_134_wcs/reduc_20170530_134_gaia.ecsv b/tests/data/reduc_20170530_134_wcs/reduc_20170530_134_gaia.ecsv new file mode 100644 index 000000000..d3848e1ac --- /dev/null +++ b/tests/data/reduc_20170530_134_wcs/reduc_20170530_134_gaia.ecsv @@ -0,0 +1,180 @@ +# %ECSV 1.0 +# --- +# datatype: +# - name: ra +# unit: deg +# datatype: float64 +# description: Right ascension +# meta: !!omap +# - {ucd: pos.eq.ra;meta.main} +# - {utype: Char.SpatialAxis.Coverage.Location.Coord.Position2D.Value2.C1} +# - name: dec +# unit: deg +# datatype: float64 +# description: Declination +# meta: !!omap +# - {ucd: pos.eq.dec;meta.main} +# - {utype: Char.SpatialAxis.Coverage.Location.Coord.Position2D.Value2.C2} +# - name: pmra +# unit: mas / yr +# datatype: float64 +# description: Proper motion in right ascension direction +# meta: !!omap +# - {ucd: pos.pm;pos.eq.ra} +# - name: pmdec +# unit: mas / yr +# datatype: float64 +# description: Proper motion in declination direction +# meta: !!omap +# - {ucd: pos.pm;pos.eq.dec} +# - name: ref_epoch +# unit: yr +# datatype: float64 +# description: Reference epoch +# meta: !!omap +# - {ucd: meta.ref;time.epoch} +# - name: parallax +# unit: mas +# datatype: float64 +# description: Parallax +# meta: !!omap +# - {ucd: pos.parallax} +# - name: phot_g_mean_mag +# unit: mag +# datatype: float32 +# description: G-band mean magnitude +# meta: !!omap +# - {ucd: phot.mag;stat.mean;em.opt} +# - {name: dist, datatype: float64} +# schema: astropy-2.0 +ra dec pmra pmdec ref_epoch parallax phot_g_mean_mag dist +193.31387874127503 -18.52522966943086 314.6217104148161 -802.7940081262793 2015.5 10.952603073572996 11.850179 0.003194503077334316 +193.31408002656195 -18.525652464350433 299.48903077653887 -796.0918271978387 2015.5 12.925448038432572 8.209325 0.0036572194992613833 +193.3277945272934 -18.51814688394671 -5.160688804105089 -1.14750264511897 2015.5 1.0688747619611119 19.440645 0.014856773289668808 +193.3204468220089 -18.50884073371206 -10.682364603936644 3.2097113709856444 2015.5 -0.0694777743150532 17.879246 0.015256268583383152 +193.3040125259853 -18.50927392586909 -11.427188237352146 0.5699115873427919 2015.5 0.10802389415888732 20.819374 0.01536534889835026 +193.3157394183568 -18.537629646356873 5.8144923359535134 -11.052391369410625 2015.5 1.7119929585735418 19.119549 0.015664910778359787 +193.29617831112887 -18.528615059374513 -31.696126246519107 -4.70913052839484 2015.5 1.720546752840018 19.287481 0.016943230165895606 +193.32737740917463 -18.532134915027743 -12.082740620346542 -0.7558372784127914 2015.5 0.43928834587071036 19.431416 0.017061152151825246 +193.3097396900157 -18.501509382686073 -19.168150326342403 9.221302373174847 2015.5 1.431036176223781 20.081364 0.020910630442809715 +193.31539418930976 -18.497549321035812 -2.6199018306752353 -2.3145552734671337 2015.5 0.41014208072796726 18.762243 0.024806798409123216 +193.3032847361622 -18.499023939385406 24.649227785555613 -20.481895967993694 2015.5 3.8916123975959076 18.201487 0.02487132967479237 +193.30858653779057 -18.54797389015663 -6.595876065039609 0.28142358292914493 2015.5 0.9895469503815828 20.598286 0.026044684383603103 +193.30970726860335 -18.496122689087873 -9.515909114958472 -18.071671618565425 2015.5 0.6321948998346161 17.669962 0.026261103390160648 +193.28932201859828 -18.536556572024647 -2.0109487629633476 -1.5103820905474827 2015.5 1.2768604475432879 20.57137 0.026417449258433354 +193.34019980738998 -18.517446113856916 -9.872288371001845 -0.7764269730320621 2015.5 0.2978591332523562 16.403965 0.026483518523732052 +193.30515802414263 -18.547835692288228 0.051216598504189026 -3.762493890154479 2015.5 -0.45839166775664525 19.045279 0.026595648310797384 +193.3223765417061 -18.547747801687624 "" "" 2015.5 "" 20.08203 0.027110588433522372 +193.2912522639206 -18.540765296724448 -7.201886333740895 -8.337250629410883 2015.5 1.301048795195839 15.39927 0.027537552190521387 +193.2968959184522 -18.49684165208324 -8.903935163024627 -6.3889874365702015 2015.5 -0.1447436783319508 19.167841 0.029492917659330115 +193.3422578627708 -18.532670090311566 -14.12998057808509 -6.5866462780425055 2015.5 0.5629848034343903 20.495178 0.029882797357607346 +193.34150680485675 -18.538590395559364 -19.655325533213052 -13.655913900666137 2015.5 2.6064756538197633 20.438272 0.031816470871387406 +193.34850074415692 -18.523685148937787 -1.6949458762500034 -10.70348640867291 2015.5 0.10321164991768625 19.081028 0.03395018114998625 +193.2760239774249 -18.51841354894035 -4.804930918057392 -3.9781042330896703 2015.5 -0.2904115355408065 19.073843 0.03501219315746438 +193.28158431842976 -18.50255387370315 -18.366004582612995 7.671362827510471 2015.5 -0.6267297869547805 19.606089 0.03548554782449654 +193.30042865592898 -18.48844424919503 -0.9840456976868367 -6.21908767222436 2015.5 0.544974839605643 18.035854 0.03573971959352718 +193.29610740357413 -18.555687172577745 -24.425084211028608 -3.303634021118067 2015.5 -1.7476770541361897 20.20495 0.03698544489856827 +193.30526231006476 -18.485628188903462 "" "" 2015.5 "" 21.384804 0.0372774383993838 +193.3125778926402 -18.48249728710623 -8.694595847243399 1.385804527181762 2015.5 1.0301235642606748 19.302637 0.039729990869435364 +193.34675284640363 -18.496980313980707 -3.0900555825713782 2.2850099710650755 2015.5 0.45613185443777127 16.694885 0.040967831959646935 +193.2717375844366 -18.50445002084672 -19.57249524325576 -0.3548836171101366 2015.5 0.7950063399211105 17.203684 0.04274213112411268 +193.3569047764256 -18.532881104634455 -6.422258536058061 -1.453111133839209 2015.5 -0.2663779384228213 18.698923 0.04322013548249458 +193.2833157042159 -18.48858836641649 0.3060973626544119 -3.1044536189374132 2015.5 0.4378343134876523 20.287819 0.04369823208866542 +193.3341752926928 -18.48251119808841 0.5918590632584885 -21.190231203705697 2015.5 2.392970657314053 19.490725 0.04462038857446248 +193.34258452145735 -18.48729218239866 6.877210302811914 -14.55832976577129 2015.5 1.7490732964229587 17.355742 0.04496686788671832 +193.2686399734325 -18.505424390305336 -9.623707637718237 -1.8451185081669865 2015.5 0.9372076642842796 19.048332 0.04505729677837554 +193.32298678488038 -18.567674671255205 -22.85430541406342 -8.832210093309333 2015.5 0.10000654073020168 20.750092 0.04647656973362755 +193.34304543584827 -18.4851732399555 -19.806709408565446 3.546394341822805 2015.5 3.211855506995056 16.59929 0.04689893131240749 +193.34279583580093 -18.484793595387043 -23.583022954090946 4.959201549954996 2015.5 4.077412845117796 18.917725 0.047055674370844146 +193.2618691150194 -18.52473016475954 -9.754860055965692 -8.42317301181425 2015.5 0.15646640968258646 15.913697 0.04828972149714924 +193.35271768338865 -18.552229702512157 -0.49539382554123734 -3.314737796846325 2015.5 1.1260708933804089 20.068752 0.04834920446629307 +193.35321594820257 -18.492654701003378 -3.8319273114758325 -4.9038525825038874 2015.5 0.31598306328150066 17.041807 0.04846200178059192 +193.27163849353528 -18.49312532299253 -8.193279947653968 -7.961657658560421 2015.5 0.37332829768651604 19.686077 0.048633227076299336 +193.29477631334734 -18.568161983256594 -15.817072760619082 2.3055226084191625 2015.5 1.4175494765638903 20.0301 0.048986830411314575 +193.3514851556911 -18.555136634884562 -12.306382207978471 -5.520114916197348 2015.5 0.5872520384019237 19.990967 0.04932806922476461 +193.3591631639113 -18.545189257151016 -5.140904622415734 0.37990909082765933 2015.5 0.5620991680378893 19.772348 0.04965447088505243 +193.2637826053216 -18.54075935897978 0.5860331940430004 -0.16723092858737693 2015.5 -0.9974952174488456 19.595648 0.04997173967846638 +193.26209749749935 -18.538260978549157 2.6294058676578427 -5.446665774274372 2015.5 1.567546532121662 20.90238 0.050613214960639946 +193.31306860517319 -18.57677594250233 -9.150754811865975 -5.447445203427211 2015.5 -0.8637274969543044 20.36047 0.05454987358261117 +193.29481509868873 -18.469547038814103 "" "" 2015.5 "" 20.613518 0.05535146946955866 +193.2980674560779 -18.575823399508252 -13.412138363360619 -11.6064805381313 2015.5 1.39023120984776 17.04831 0.055369424961944476 +193.28609113393253 -18.571914706728922 "" "" 2015.5 "" 20.445902 0.05573722593642022 +193.283774679821 -18.570995167416843 -7.529259203061585 5.8047784692052815 2015.5 1.092669503312204 20.265375 0.05596297825987852 +193.30205850701685 -18.577646395683804 -7.907447889070238 -9.50318616332535 2015.5 0.7354816189217039 16.601625 0.05633505876680276 +193.25436458859113 -18.53369384027024 -11.416100478607238 -5.150776118074804 2015.5 -1.9241383998470587 20.572058 0.05651462913087596 +193.25371212996365 -18.51386611119541 4.528639709865158 -4.1788382545531135 2015.5 -0.18362838495214068 19.69459 0.05658211724128889 +193.34065319027115 -18.57262420284615 "" "" 2015.5 "" 20.581701 0.056927592225123363 +193.30276134556442 -18.466070484379408 -9.44321532264481 -1.9418241550984645 2015.5 0.30382808228549923 17.73599 0.056946549748764404 +193.33873018898043 -18.47060145504552 -6.374149326725131 -0.7835088899204141 2015.5 0.1004016261450385 20.182205 0.057212143163595866 +193.25467147893045 -18.50560184137736 -15.702984745165136 1.279477693828889 2015.5 1.3371201105743395 20.17862 0.05750816277500755 +193.3342384784335 -18.46836257170362 -15.32865745479114 -0.8710087778766653 2015.5 0.29256838655871165 19.4277 0.05759762671783454 +193.34222817236105 -18.573074187545593 2.8452049082725384 6.676492075064564 2015.5 1.5769169219410797 18.820784 0.05803100566646977 +193.27126246628632 -18.47946128757159 "" "" 2015.5 "" 21.113806 0.058096718840600275 +193.25261284519547 -18.50900318480033 -5.155072036948111 -4.542833831673805 2015.5 0.8886920949483617 20.344685 0.058517892575201014 +193.33544940357737 -18.57706659483904 -0.6860107178277368 -3.2704890395934614 2015.5 0.9253762319834703 17.72585 0.058918260765823675 +193.24973844760063 -18.529800194628383 -30.34130309536305 -3.1075262633766885 2015.5 6.294050243038902 20.516384 0.06020435477223766 +193.29785518540132 -18.46264197881629 -0.34828176087469 -4.673549189975991 2015.5 0.8477690569142541 20.485212 0.06123189606235932 +193.375111034307 -18.505483410845102 -8.667074894504264 -2.694940586990444 2015.5 0.7332990091094694 16.846233 0.06147778895105242 +193.28621533637823 -18.46591655374091 17.443905989507584 -16.505656189372605 2015.5 -0.5736526229568147 20.450089 0.06166927058633878 +193.24960760345002 -18.507243771917214 "" "" 2015.5 "" 20.104843 0.06170102590328457 +193.28988151047383 -18.46382527402963 -1.9073374332883801 -1.5827137390309807 2015.5 -0.8043879192178933 20.12438 0.062291602655783214 +193.2469988845399 -18.51515447029254 -6.161133802988571 0.7878531458191129 2015.5 0.2651593008351387 17.734467 0.06272640130412929 +193.35493042703303 -18.570998906783192 "" "" 2015.5 "" 20.8295 0.06308320125724055 +193.29368547688426 -18.461015438748337 -13.947906479028818 5.4653806166192 2015.5 0.915546282384468 19.056154 0.06382025269891257 +193.37937014908488 -18.513228305237387 -3.831219046440603 -0.5032772748107259 2015.5 0.8688091376652296 16.348978 0.06382856019230403 +193.2512016656803 -18.495980555655017 -21.805006594952072 -12.225023056278541 2015.5 2.115739429912935 16.847715 0.06397623537806946 +193.37658568389594 -18.501420198791124 -5.226799142241804 -11.236494624169072 2015.5 0.6953628927772167 15.534013 0.06402788079422662 +193.30849509913517 -18.587381767844917 -28.799370957427232 -0.8154468233607778 2015.5 3.4178796268780407 20.111591 0.06527825191023817 +193.37499837687892 -18.494010798154143 -14.159337535984113 2.6009045873191265 2015.5 0.31274536409548503 18.89604 0.06544411294049797 +193.32809408938647 -18.45835016260978 -34.08463716026513 -24.167733022930076 2015.5 0.77142691664275 20.232376 0.06551793284735445 +193.3096284156054 -18.5880834015776 -25.891579504080926 -4.196176757475371 2015.5 1.7894205118036695 20.0816 0.06592193733570205 +193.34522515843062 -18.580784661518887 3.594764212604222 -9.878614270933955 2015.5 1.3197229921128455 20.332003 0.06616735016257408 +193.26991463672894 -18.469899492300957 -20.08120431870621 5.635056742369507 2015.5 0.5926951076747647 17.821411 0.06623247405205199 +193.28101694260533 -18.462630973288196 -3.1888703432485626 2.1081366218847117 2015.5 0.040028465766947026 17.129591 0.06675446694159952 +193.30138393500658 -18.456253814724647 -11.284005821463047 -5.461925195340669 2015.5 -1.1918735472069983 15.436011 0.06684478609385924 +193.30162429555799 -18.45616285515967 "" "" 2015.5 "" 17.693565 0.06689829805953086 +193.36981780814375 -18.482107926832665 -26.276296993679672 -6.300519282382787 2015.5 -0.020274356980310444 18.006039 0.06738312599631312 +193.26114429157016 -18.56863216007125 -9.73605309971682 -3.5491817322255126 2015.5 0.12007337022076488 18.691391 0.06741819731841249 +193.344042613359 -18.582770727950066 -0.5175584180357036 -4.101695889465862 2015.5 -0.16573890237061104 20.267782 0.06743019281457185 +193.2472418271921 -18.54901489098607 -4.513881481753824 -3.7662245531134024 2015.5 0.54740893136138 18.91358 0.06762207079097611 +193.36626131364773 -18.476173935961125 -8.333138871412189 8.171234216263926 2015.5 1.1527188296928303 18.383675 0.06854279492863287 +193.34440237896092 -18.58387975850099 -4.142844410482176 -2.989704585005237 2015.5 0.1048097386670374 20.59729 0.06857631736133162 +193.35549745512537 -18.579451774202692 -3.4190461629226556 -13.781916544970036 2015.5 -0.20369669806691604 17.47182 0.07013337588095457 +193.38776703543675 -18.528123059158876 -8.82377931273977 -0.809102492977574 2015.5 0.7490962409236632 19.99619 0.0713939656181207 +193.30158617011193 -18.593426343253103 -21.65528734437662 12.92639251127718 2015.5 1.9846991821343603 15.727292 0.07197864423362826 +193.23822281914894 -18.507754254579254 -6.750761179795323 -2.5928290844030495 2015.5 -1.7908303649137223 20.859224 0.07211673140170481 +193.25785512751654 -18.470879182106952 "" "" 2015.5 "" 21.156693 0.07310718420607737 +193.36738415662515 -18.47060502096567 -10.761214240600998 1.600032433416448 2015.5 0.6134282356903833 16.520748 0.07315322725846632 +193.23590076531767 -18.514110048704758 -3.0417370645502713 -34.31821410738064 2015.5 2.4249011649068946 18.112406 0.07330088693070919 +193.38743253613785 -18.502823510580765 "" "" 2015.5 "" 21.234129 0.07344753918765257 +193.3352327092996 -18.451930356556993 -9.664531425290205 0.7920909938626207 2015.5 -0.017911985632117426 18.785091 0.0734651510525724 +193.30239416609896 -18.59543665934755 -8.803103293228064 -2.8686956325166038 2015.5 -0.16924535671699395 19.039885 0.07386227723775582 +193.293191532436 -18.59383137163806 -9.23463458031917 3.4400547139186957 2015.5 0.437154672477869 17.129267 0.07396095689270266 +193.37856063775897 -18.561946558783088 -9.772939207489415 -5.034248292150143 2015.5 0.0435123192778215 19.555023 0.07398119886520084 +193.37433302035652 -18.4765080403008 -19.939487789276754 -6.716930766952941 2015.5 1.07471699208673 19.420132 0.07418379633694194 +193.38375695586316 -18.490830480505036 -5.961246545338723 1.6414756005751654 2015.5 0.7654989078390342 20.352316 0.0743132342895139 +193.26335137259463 -18.46452325209116 -0.1908388761602607 -0.7869383222076025 2015.5 4.248256677931948 18.283983 0.07431383395696717 +193.2446818940562 -18.55960935467553 -1.8259120118508299 -5.415296855498066 2015.5 2.327088350577277 18.95821 0.07456291200536323 +193.3834332660322 -18.555491497270783 -10.725587657106095 1.6936358838037404 2015.5 0.49652811092113025 19.699902 0.07483505076451395 +193.26585457635323 -18.583356768952168 2.3072808314013526 -6.732274562401316 2015.5 1.3190399740554706 19.950048 0.07557511813718185 +193.36582353406882 -18.57921214466769 -18.58758787589614 -7.615454882707199 2015.5 1.6924212280780095 20.661837 0.07603305415529674 +193.3688835706723 -18.46746006472781 -5.7111505651657195 -3.0246890029142306 2015.5 0.495592301311842 19.389353 0.07639020547448523 +193.30665558276095 -18.598516562998206 "" "" 2015.5 "" 20.945768 0.07650647702477237 +193.23225740726016 -18.516043751429343 -26.374100025071275 6.555866792701145 2015.5 0.7243670794431314 18.013857 0.07655448733016727 +193.37653698342294 -18.569318926718957 0.6923834115575546 -1.586481566637147 2015.5 0.700506934145352 18.444387 0.0766632162322302 +193.2756085635824 -18.590631100664567 28.947070945170385 0.8876871442011489 2015.5 3.130041880077366 14.860598 0.07692515354578484 +193.30665417587446 -18.59912680263045 "" "" 2015.5 "" 21.056816 0.0771150988093329 +193.3055767219674 -18.59920574421312 0.07439785230487614 -0.19018106873930551 2015.5 -0.07072094853772486 18.32928 0.07727673021266655 +193.37196190904143 -18.57591454001483 "" "" 2015.5 "" 20.857197 0.07769075260536432 +193.3946295038761 -18.5192269563226 -1.924764446585279 -1.4540518250901335 2015.5 0.19506612065574874 18.271738 0.07771691826647817 +193.36901330067244 -18.579279301406782 -17.272164245842397 -14.827587841290185 2015.5 0.7161140420299488 16.9933 0.07811698518989549 +193.25637401253093 -18.465081904173267 -32.907144790357684 -21.470481648218463 2015.5 2.3864712321203156 17.34522 0.07824245788216501 +193.3181928064275 -18.44404585181748 -7.783309717287271 -4.47623780579611 2015.5 0.8962538646133067 19.137789 0.07835272871334766 +193.24058884395225 -18.483362203481086 -1.9070370655365945 -8.08575324871106 2015.5 0.590797755483222 17.736132 0.07867987721903368 +193.27476446297698 -18.592240440320758 -3.2565233792382755 -13.297345090038661 2015.5 0.43123534773967526 17.336054 0.07872222008736775 +193.23001246193613 -18.529178742640546 -3.002400192394866 2.255418217988204 2015.5 -0.1033811580843624 20.16529 0.07873753711760782 +193.33743246447423 -18.44505620618127 -55.706141698607 -6.191137634338219 2015.5 2.496840558748934 19.590519 0.08064904187481035 +193.31322158138576 -18.44091880091281 0.18174750032041165 -3.26959977306105 2015.5 2.3060617984903686 20.844696 0.08130956276854712 +193.23710737382063 -18.560939973450257 -1.5646251500176827 -8.511980955639956 2015.5 0.24152735423363764 17.793322 0.08148022725943328 +193.39145532275825 -18.559288538955506 "" "" 2015.5 "" 20.340668 0.08333519002760909 +193.39229056976905 -18.486686577393655 -12.554875369825231 6.313919829469455 2015.5 0.46760227460443793 20.865679 0.08340011389002859 From 1e691346694e5dbb4934fd1ac27212a7ebb77f07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Sun, 28 Jan 2024 12:16:18 +0100 Subject: [PATCH 031/161] repair make starfield --- spectractor/simulation/image_simulation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index 9d971a02a..8e1434abe 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -177,7 +177,7 @@ def set_star_list(self): mask = np.zeros(data.shape, dtype=bool) for y in range(int(y0) - 100, int(y0) + 100): for x in range(parameters.CCD_IMSIZE): - u, v = pixel_rotation(x, y, self.image.disperser.theta(x0, y0) * np.pi / 180., x0, y0) + u, v = pixel_rotation(x, y, self.image.disperser.theta([x0, y0]) * np.pi / 180., x0, y0) if margin > v > -margin: mask[y, x] = True # remove background and detect sources From ea5019b8a49ae1e9364f5d130d01d04bc570ea04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Sun, 28 Jan 2024 12:22:37 +0100 Subject: [PATCH 032/161] repiar test --- spectractor/simulation/image_simulation.py | 2 +- tests/test_fullchain.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index 8e1434abe..db083a540 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -539,7 +539,7 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer # Flat model flat = None if with_flat: - my_logger.info('\n\tStar field model...') + my_logger.info('\n\tFlat model...') flat = FlatModel(gains=[[1, 2, 3, 4], [4, 3, 2, 1]], randomness_level=1e-2) if parameters.DEBUG: flat.plot_model() diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index 2dfdc0834..b93dd1069 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -222,7 +222,7 @@ def test_ctio_fullchain(): assert np.isclose(shift_y, 0, atol=parameters.PIXSHIFT_PRIOR) # shift_y assert np.isclose(D, spectrum.header["D2CCD_T"], atol=0.1) # D2CCD assert np.isclose(B, 1, atol=1e-3) # B - assert np.isclose(Astar, 1, atol=1e-3) # Astar + assert np.isclose(Astar, 1, atol=1e-2) # Astar assert np.all(np.isclose(psf_poly_params[(PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1], np.array(PSF_POLY_PARAMS_TRUTH)[(PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1], rtol=0.01, atol=0.01)) From 71f25cbc7d4f3b8f1fa46bac0ff3547c4529b694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 29 Jan 2024 17:41:08 +0100 Subject: [PATCH 033/161] introduce SPECTRACTOR_SIMULATE_STARFIELD parameter; introduce Image.simulate_starfield_with_gaia; simulation complies with rebinning --- config/ctio.ini | 2 ++ config/default.ini | 2 ++ spectractor/extractor/extractor.py | 3 +++ spectractor/extractor/images.py | 14 +++++++++++ spectractor/parameters.py | 1 + spectractor/simulation/image_simulation.py | 27 ++++++---------------- 6 files changed, 29 insertions(+), 20 deletions(-) diff --git a/config/ctio.ini b/config/ctio.ini index 46aa69201..e9c0579e9 100644 --- a/config/ctio.ini +++ b/config/ctio.ini @@ -17,6 +17,8 @@ SPECTRACTOR_DECONVOLUTION_PSF2D = True SPECTRACTOR_DECONVOLUTION_FFM = True # library to compute atmospheric transmission: none, libradtran, getobsatmo SPECTRACTOR_ATMOSPHERE_SIM = none +# simulate star field with Gaia catalog: False, True +SPECTRACTOR_SIMULATE_STARFIELD = True [instrument] # instrument name diff --git a/config/default.ini b/config/default.ini index b79e9bb23..f45ac947b 100644 --- a/config/default.ini +++ b/config/default.ini @@ -21,6 +21,8 @@ SPECTRACTOR_FIT_TIMEOUT_PER_ITER = 600 SPECTRACTOR_FIT_TIMEOUT = 3600 # library to compute atmospheric transmission: none, libradtran, getobsatmo SPECTRACTOR_ATMOSPHERE_SIM = none +# simulate star field with Gaia catalog: False, True +SPECTRACTOR_SIMULATE_STARFIELD = False [instrument] # instrument name diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index b3b5275fa..24497330f 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1108,6 +1108,9 @@ def SpectractorRun(image, output_directory, guess=None): # Find the exact target position in the raw cut image: several methods my_logger.info(f'\n\tSearch for the target in the image with guess={image.target_guess}...') find_target(image, image.target_guess, widths=(parameters.XWINDOW, parameters.YWINDOW)) + # Simulate star field + if parameters.SPECTRACTOR_SIMULATE_STARFIELD: + image.starfield = image.simulate_starfield_with_gaia() # Rotate the image turn_image(image) # Find the exact target position in the rotated image: several methods diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index f7d9a1a95..759d904e9 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -220,6 +220,10 @@ def rebin(self): new_shape = np.asarray(self.data.shape) // parameters.CCD_REBIN self.data = rebin(self.data, new_shape) self.err = np.sqrt(rebin(self.err ** 2, new_shape)) + if self.flat is not None: + self.flat = rebin(self.flat, new_shape) + if self.starfield is not None: + self.starfield = rebin(self.starfield, new_shape) if self.target_guess is not None: self.target_guess = np.asarray(self.target_guess) / parameters.CCD_REBIN @@ -539,6 +543,16 @@ def plot_image(self, ax=None, scale="lin", title="", units="", plot_stats=False, if parameters.PdfPages: parameters.PdfPages.savefig() + def simulate_starfield_with_gaia(self): + from spectractor.simulation.image_simulation import StarFieldModel + starfield = StarFieldModel(self, flux_factor=1) + yy, xx = np.mgrid[0:self.data.shape[1]:1, 0:self.data.shape[0]:1] + starfield.model(xx, yy) + if parameters.DEBUG: + self.plot_image(scale='symlog', target_pixcoords=starfield.pixcoords) + starfield.plot_model() + return starfield.field + def load_CTIO_image(image): """Specific routine to load CTIO fits files and load their data and properties for Spectractor. diff --git a/spectractor/parameters.py b/spectractor/parameters.py index 6469ea505..c4375dbdb 100644 --- a/spectractor/parameters.py +++ b/spectractor/parameters.py @@ -40,6 +40,7 @@ def __getattr__(name): SPECTRACTOR_FIT_TIMEOUT_PER_ITER = 600 # maximum time per gradient descent iteration before TimeoutError in seconds SPECTRACTOR_FIT_TIMEOUT = 3600 # maximum time per gradient descent before TimeoutError in seconds SPECTRACTOR_ATMOSPHERE_SIM = "none" # library to compute atmospheric transmission: none, libradtran, getobsatmo +SPECTRACTOR_SIMULATE_STARFIELD = False # simulate star field with Gaia catalog: False, True # Paths DISPERSER_DIR = "./extractor/dispersers/" diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index db083a540..d540c8e8d 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -131,14 +131,14 @@ def set_star_list(self): # load WCS wcs = load_wcs_from_file(wcs_file_name) # catalog matching to set star positions using Gaia - target_coord = wcs.all_pix2world([x0], [y0], 0) + target_coord = wcs.all_pix2world([x0 * parameters.CCD_REBIN], [y0 * parameters.CCD_REBIN], 0) target_coord = SkyCoord(ra=target_coord[0] * units.deg, dec=target_coord[1] * units.deg, frame="icrs", obstime=self.image.date_obs, equinox="J2000") gaia_target_index, dist_2d, dist_3d = target_coord.match_to_catalog_sky(gaia_coord_after_motion) dx, dy = 0, 0 for gaia_i in range(len(gaia_catalog)): - x, y = wcs.all_world2pix(gaia_coord_after_motion[gaia_i].ra, - gaia_coord_after_motion[gaia_i].dec, 0) + x, y = np.array(wcs.all_world2pix(gaia_coord_after_motion[gaia_i].ra, + gaia_coord_after_motion[gaia_i].dec, 0)) / parameters.CCD_REBIN if gaia_i == gaia_target_index[0]: dx = x0 - x dy = y0 - y @@ -164,7 +164,7 @@ def set_star_list(self): sources['Y'].name = "ycentroid" sources['FLUX'].name = "flux" for k, source in enumerate(sources): - x, y = sources['xcentroid'][k], sources['ycentroid'][k] + x, y = np.array([sources['xcentroid'][k], sources['ycentroid'][k]]) / parameters.CCD_REBIN A = sources['flux'][k] * self.flux_factor self.stars.append(StarModel([x, y], self.image.target_star2D, A)) self.pixcoords.append([x, y]) @@ -196,9 +196,9 @@ def model(self, x, y): self.field = self.stars[0].psf.evaluate(np.array([x, y])) for k in range(1, len(self.stars)): left = max(0, int(self.pixcoords[0][k]) - window) - right = min(parameters.CCD_IMSIZE, int(self.pixcoords[0][k]) + window) + right = min(np.max(x), int(self.pixcoords[0][k]) + window) low = max(0, int(self.pixcoords[1][k]) - window) - up = min(parameters.CCD_IMSIZE, int(self.pixcoords[1][k]) + window) + up = min(np.max(y), int(self.pixcoords[1][k]) + window) if up < low or left > right: continue yy, xx = np.mgrid[low:up, left:right] @@ -206,21 +206,8 @@ def model(self, x, y): return self.field def plot_model(self): - xx, yy = np.mgrid[0:parameters.CCD_IMSIZE:1, 0:parameters.CCD_IMSIZE:1] - starfield = self.model(xx, yy) fig, ax = plt.subplots(1, 1) - plot_image_simple(ax, starfield, scale="log10", target_pixcoords=self.pixcoords) - # im = plt.imshow(starfield, origin='lower', cmap='jet') - # ax.grid(color='white', ls='solid') - # ax.grid(True) - # ax.set_xlabel('X [pixels]') - # ax.set_ylabel('Y [pixels]') - # ax.set_title(f'Star field model: fwhm={self.fwhm.value:.2f}') - # cb = plt.colorbar(im, ax=ax) - # cb.formatter.set_powerlimits((0, 0)) - # cb.locator = MaxNLocator(7, prune=None) - # cb.update_ticks() - # cb.set_label('Arbitrary units') # ,fontsize=16) + plot_image_simple(ax, self.field, scale="log10", target_pixcoords=self.pixcoords) if parameters.DISPLAY: plt.show() if parameters.PdfPages: From 2817a1d620af7518d9a1f6807fd06ddc6a011d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 29 Jan 2024 17:41:43 +0100 Subject: [PATCH 034/161] cleaning --- spectractor/extractor/extractor.py | 17 ++++++++--------- spectractor/extractor/images.py | 1 + 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 24497330f..7afa153c3 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1094,7 +1094,7 @@ def SpectractorRun(image, output_directory, guess=None): # Use fast mode if parameters.CCD_REBIN > 1: - my_logger.info('\n\t ======================= REBIN =============================') + my_logger.info('\n\t ======================= REBIN =============================') image.rebin() if parameters.DEBUG: image.plot_image(scale='symlog', title="after rebinning ", target_pixcoords=image.target_guess) @@ -1105,6 +1105,7 @@ def SpectractorRun(image, output_directory, guess=None): output_filename = output_filename.replace('.fits', '_spectrum.fits') output_filename = output_filename.replace('.fz', '_spectrum.fits') output_filename = os.path.join(output_directory, output_filename) + # Find the exact target position in the raw cut image: several methods my_logger.info(f'\n\tSearch for the target in the image with guess={image.target_guess}...') find_target(image, image.target_guess, widths=(parameters.XWINDOW, parameters.YWINDOW)) @@ -1113,9 +1114,9 @@ def SpectractorRun(image, output_directory, guess=None): image.starfield = image.simulate_starfield_with_gaia() # Rotate the image turn_image(image) + # Find the exact target position in the rotated image: several methods my_logger.info('\n\tSearch for the target in the rotated image...') - find_target(image, image.target_guess, rotated=True, widths=(parameters.XWINDOW_ROT, parameters.YWINDOW_ROT)) # Create Spectrum object @@ -1144,13 +1145,13 @@ def SpectractorRun(image, output_directory, guess=None): # Full forward model extraction: add transverse ADR and order 2 subtraction if parameters.SPECTRACTOR_DECONVOLUTION_FFM: - my_logger.info('\n\t ======================= FFM DECONVOLUTION =============================') + my_logger.info('\n\t ======================= FFM DECONVOLUTION =============================') w = FullForwardModelFitWorkspace(spectrum, verbose=parameters.VERBOSE, plot=True, live_fit=False, amplitude_priors_method="spectrum") spectrum = run_ffm_minimisation(w, method="newton", niter=2) # Save the spectrum - my_logger.info('\n\t ======================= SAVE SPECTRUM =============================') + my_logger.info('\n\t ======================= SAVE SPECTRUM =============================') spectrum.save_spectrum(output_filename, overwrite=True) spectrum.lines.table = spectrum.lines.build_detected_line_table(amplitude_units=spectrum.units) @@ -1326,10 +1327,9 @@ def bgd_model_func(x, y): # clean the data: this is truly a backward spectrum extraction to feed correctly the forward model # if available, subtract starfield before 1D spectrum estimate - # (important as it is used as a prior for regularisation) + # it is important to have a clean 1D spectrum as it is used as a prior for regularisation if image.starfield_rotated is not None: - scaling = np.max(image.target.image) / np.max(image.target.starfield) - data -= scaling * image.starfield_rotated[ymin:ymax, xmin:xmax] + data -= image.starfield_rotated[ymin:ymax, xmin:xmax] s.fit_transverse_PSF1D_profile(data, err, signal_width, ws, pixel_step=parameters.PSF_PIXEL_STEP_TRANSVERSE_FIT, sigma_clip=5, bgd_model_func=bgd_model_func, saturation=image.saturation, @@ -1567,8 +1567,7 @@ def run_spectrogram_deconvolution_psf2d(spectrum, bgd_model_func): # if available, subtract starfield before 1D spectrum estimate # (important as it is used as a prior for regularisation) if spectrum.spectrogram_starfield is not None: - scaling = np.max(spectrum.target.image) / np.max(spectrum.target.starfield) - data -= scaling * spectrum.spectrogram_starfield + data -= spectrum.spectrogram_starfield my_logger.info('\n\t ======================= ChromaticPSF2D polynomial fit =============================') w = s.fit_chromatic_psf(data, bgd_model_func=bgd_model_func, data_errors=err, live_fit=False, diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index 759d904e9..ce314c04a 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -592,6 +592,7 @@ def load_CTIO_image(image): build_CTIO_gain_map(image) build_CTIO_read_out_noise_map(image) image.flat = image.gain / np.mean(image.gain) + # parallactic angle image.compute_parallactic_angle() # WCS wcs_file_name = set_wcs_file_name(image.file_name) From e5a7b99cf5fa3e2495bd073d41ef5a82b38c2046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 29 Jan 2024 18:31:42 +0100 Subject: [PATCH 035/161] repair full chain test --- spectractor/simulation/image_simulation.py | 6 +++--- tests/test_fullchain.py | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index d540c8e8d..4a85e6e00 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -420,6 +420,9 @@ def compute(self, star, background, spectrogram, starfield=None, flat=None): starfield_mod = starfield.model(xx, yy) self.data = starfield_mod self.starfield = np.copy(starfield_mod) + if parameters.DEBUG: + self.plot_image(scale='symlog', target_pixcoords=starfield.pixcoords) + starfield.plot_model() else: self.data = star.psf.evaluate(np.array([xx, yy])) self.data += background.model() @@ -519,9 +522,6 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer if with_starfield: my_logger.info('\n\tStar field model...') starfield = StarFieldModel(image, flux_factor=1) - if parameters.DEBUG: - image.plot_image(scale='symlog', target_pixcoords=starfield.pixcoords) - starfield.plot_model() # Flat model flat = None diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index b93dd1069..0c07d2711 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -137,6 +137,7 @@ def test_ctio_fullchain(): disperser_label=disperser_label, config="") # config already loaded, do not overwrite PSF_POLY_ORDER image.flat = sim.flat image.starfield = sim.starfield + parameters.SPECTRACTOR_SIMULATE_STARFIELD = False # here we want to test fit with an exact starfield simulation spectrum = SpectractorRun(image, guess=[xpos, ypos], output_directory="./tests/data") # tests From f6dde98a73351fefef835ae6aef642b7e10e5be3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 14 Feb 2024 10:18:50 +0000 Subject: [PATCH 036/161] if flat exists, flatten the image for the plot --- spectractor/extractor/images.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index ce314c04a..a49a28381 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -486,7 +486,7 @@ def compute_parallactic_angle(self): def plot_image(self, ax=None, scale="lin", title="", units="", plot_stats=False, target_pixcoords=None, figsize=(7.3, 6), aspect=None, vmin=None, vmax=None, - cmap=None, cax=None): + cmap=None, cax=None, use_flat=True): """Plot image. Parameters @@ -515,6 +515,8 @@ def plot_image(self, ax=None, scale="lin", title="", units="", plot_stats=False, Figure size (default: [9.3, 8]). plot_stats: bool If True, plot the uncertainty map instead of the image (default: False). + use_flat: bool + If True and self.flat exists, divide the image by the flat (default: True). Examples -------- @@ -530,6 +532,8 @@ def plot_image(self, ax=None, scale="lin", title="", units="", plot_stats=False, data = np.copy(self.err) if units == "": units = self.units + if self.flat is not None and use_flat: + data /= self.flat plot_image_simple(ax, data=data, scale=scale, title=title, units=units, cax=cax, target_pixcoords=target_pixcoords, aspect=aspect, vmin=vmin, vmax=vmax, cmap=cmap) if parameters.OBS_OBJECT_TYPE == "STAR": From 9f46399f7883e095b0ba94bf3fbaf7f1111150bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 14 Feb 2024 10:25:42 +0000 Subject: [PATCH 037/161] correct log message --- spectractor/fit/fitter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/fit/fitter.py b/spectractor/fit/fitter.py index b0d116012..34c1cedb2 100644 --- a/spectractor/fit/fitter.py +++ b/spectractor/fit/fitter.py @@ -1287,7 +1287,7 @@ def gradient_descent(fit_workspace, epsilon, niter=10, xtol=1e-3, ftol=1e-3, wit ipar = np.delete(ipar, list(ipar).index(jp)) fit_workspace.params.fixed[jp] = True my_logger.warning( - f"\n\tStep {i}: {fit_workspace.params.labels[ip]} is degenerated with {fit_workspace.params.labels[jp]}; " + f"\n\tStep {i}: {fit_workspace.params.labels[jp]} is degenerated with {fit_workspace.params.labels[ip]}; " f"parameter {fit_workspace.params.labels[jp]} is fixed at its last known current value ({tmp_params[jp]}).") continue # remove fixed and degenerated parameters; then transpose From ef4485b50276e6b10fcc93ca687661919134bc2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 14 Feb 2024 11:49:03 +0100 Subject: [PATCH 038/161] typo in SPECTRACTOR_ATMOSPHERE_SIM --- config/auxtel.ini | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config/auxtel.ini b/config/auxtel.ini index ea488c2f4..7a0ab0979 100644 --- a/config/auxtel.ini +++ b/config/auxtel.ini @@ -20,7 +20,9 @@ SPECTRACTOR_FIT_TIMEOUT_PER_ITER = 1200 # maximum time per gradient descent before TimeoutError in seconds SPECTRACTOR_FIT_TIMEOUT = 7200 # library to compute atmospheric transmission: none, libradtran, getobsatmo -SPECTRACTOR_ATMOSPHERE_SIM = getobstamo +SPECTRACTOR_ATMOSPHERE_SIM = getobsatmo +# simulate star field with Gaia catalog: False, True +SPECTRACTOR_SIMULATE_STARFIELD = False [instrument] # instrument name From 81fa1890b5c90b251ec1df66d2e650b8dd4f5357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 16 Feb 2024 15:04:44 +0100 Subject: [PATCH 039/161] auxtel gain is 1.3 --- config/auxtel.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/auxtel.ini b/config/auxtel.ini index 7a0ab0979..f504aa97a 100644 --- a/config/auxtel.ini +++ b/config/auxtel.ini @@ -57,7 +57,7 @@ CCD_PIXEL2ARCSEC = 0.0952 # approximate maximum ADU output of the CCD CCD_MAXADU = 170000 # electronic gain : elec/ADU -CCD_GAIN = 1.1 +CCD_GAIN = 1.3 # rebinning of the image in pixel CCD_REBIN = 2 From 9a21aff6595ddc382ef65f3feef2370a261e4bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 16 Feb 2024 15:04:58 +0100 Subject: [PATCH 040/161] new __repr__ for FitParameters --- spectractor/fit/fitter.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/spectractor/fit/fitter.py b/spectractor/fit/fitter.py index b0d116012..f20ae184e 100644 --- a/spectractor/fit/fitter.py +++ b/spectractor/fit/fitter.py @@ -219,6 +219,24 @@ def __eq__(self, other): out *= getattr(self, key) == getattr(other, key) return out + def __repr__(self): + """Print the best fitting parameters on screen. + Labels are from self.labels. + + Examples + -------- + >>> parameters.VERBOSE = True + >>> params = FitParameters(values=[1, 2, 3, 4], labels=["x", "y", "z", "t"], fixed=[True, False, True, False]) + >>> params.cov = np.array([[1, -0.5], [-0.5, 4]]) + >>> params + x: 1.0 (fixed) + y: 2 +1 -1 bounds=[-inf, inf] + z: 3.0 (fixed) + t: 4 +2 -2 bounds=[-inf, inf] + + """ + return self.print_parameters_summary() + def get_index(self, label): """Get parameter index given its label. @@ -401,7 +419,7 @@ def get_fixed_parameters(self): return np.array(np.where(np.array(self.fixed).astype(int) == 1)[0]) def print_parameters_summary(self): - """Print the best fitting parameters on screen. + """Build a string with the best fitting parameters to display on screen. Labels are from self.labels. Returns @@ -424,12 +442,15 @@ def print_parameters_summary(self): txt += "%s: %s +%s -%s" % formatting_numbers(self.values[ip], np.sqrt(np.abs(self.cov[icov, icov])), np.sqrt(np.abs(self.cov[icov, icov])), label=self.labels[ip]) - txt += f" bounds={self.bounds[ip]}\n\t" + txt += f" bounds={self.bounds[ip]}" icov += 1 else: - txt += f"{self.labels[ip]}: {self.values[ip]} (fixed)\n\t" + txt += f"{self.labels[ip]}: {self.values[ip]} (fixed)" + if ip != self.ndim-1: + txt += "\n" return txt + def get_parameter(self, key): """Return a FitParameter instance. key argument can be the parameter label or its index value. From 2fe685c2c51fa6431a0d8a468d6e802e3e7a79e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 19 Feb 2024 11:03:28 +0000 Subject: [PATCH 041/161] debug rebinning of flat flield --- spectractor/extractor/images.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index a49a28381..27db24237 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -221,7 +221,7 @@ def rebin(self): self.data = rebin(self.data, new_shape) self.err = np.sqrt(rebin(self.err ** 2, new_shape)) if self.flat is not None: - self.flat = rebin(self.flat, new_shape) + self.flat = rebin(self.flat, new_shape, FLAG_MAKESUM=False) if self.starfield is not None: self.starfield = rebin(self.starfield, new_shape) if self.target_guess is not None: From 5d800621efc83efc475535db4bbe651c3332d989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 19 Feb 2024 21:03:00 +0100 Subject: [PATCH 042/161] add mask in Image class and spectractor extraction --- spectractor/extractor/chromaticpsf.py | 26 +++++++++++++++++--------- spectractor/extractor/extractor.py | 23 +++++++++++++++++------ spectractor/extractor/images.py | 13 ++++++++++++- spectractor/extractor/spectrum.py | 13 ++++++++++++- spectractor/fit/fit_spectrogram.py | 7 ++++++- spectractor/tools.py | 18 +++++++++++++++++- tests/test_fullchain.py | 2 ++ 7 files changed, 83 insertions(+), 19 deletions(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index 500e79d19..758edbea3 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -1651,15 +1651,17 @@ def fit_transverse_PSF1D_profile(self, data, err, w, ws, pixel_step=1, bgd_model self.cov_matrix = np.diag(1 / np.array(self.table['flux_err']) ** 2) psf.params.bounds = initial_bounds - def fit_chromatic_psf(self, data, bgd_model_func=None, data_errors=None, mode="1D", analytical=True, + def fit_chromatic_psf(self, data, mask=None, bgd_model_func=None, data_errors=None, mode="1D", analytical=True, amplitude_priors_method="noprior", verbose=False, live_fit=False): """ Fit a chromatic PSF model on 2D data. Parameters ---------- - data: array_like + data: np.array 2D array containing the image data. + mask: np.array, optional + 2D array containing the masked pixels. bgd_model_func: callable, optional A 2D function to model the extracted background (default: None -> null background) data_errors: np.array @@ -1699,6 +1701,8 @@ def fit_chromatic_psf(self, data, bgd_model_func=None, data_errors=None, mode="1 >>> data += bgd >>> data = np.random.poisson(data) >>> data_errors = np.sqrt(np.abs(data+1)) + >>> mask = np.zeros_like(data).astype(bool) + >>> mask[10:30,20:22] = True Extract the background: @@ -1720,7 +1724,7 @@ def fit_chromatic_psf(self, data, bgd_model_func=None, data_errors=None, mode="1 Fit the data using the transverse 1D PSF model only: >>> w = s.fit_chromatic_psf(data, mode="1D", data_errors=data_errors, bgd_model_func=bgd_model_func, - ... amplitude_priors_method="noprior", verbose=True) + ... amplitude_priors_method="noprior", verbose=True, mask=mask) >>> s.plot_summary(truth=s0) >>> amplitude_residuals.append([s0.params.values[:s0.Nx], w.amplitude_params-s0.params.values[:s0.Nx], ... w.amplitude_params_err]) @@ -1737,7 +1741,7 @@ def fit_chromatic_psf(self, data, bgd_model_func=None, data_errors=None, mode="1 >>> parameters.PSF_FIT_REG_PARAM = 0.002 >>> w = s.fit_chromatic_psf(data, mode="2D", data_errors=data_errors, bgd_model_func=bgd_model_func, - ... amplitude_priors_method="psf1d", verbose=True, analytical=True) + ... amplitude_priors_method="psf1d", verbose=True, analytical=True, mask=mask) >>> s.plot_summary(truth=s0) >>> amplitude_residuals.append([s0.params.values[:s0.Nx], w.amplitude_params-s0.params.values[:s0.Nx], ... w.amplitude_params_err]) @@ -1762,13 +1766,13 @@ def fit_chromatic_psf(self, data, bgd_model_func=None, data_errors=None, mode="1 """ if mode == "1D": - w = ChromaticPSFFitWorkspace(self, data, data_errors=data_errors, mode=mode, bgd_model_func=bgd_model_func, + w = ChromaticPSFFitWorkspace(self, data, mask=mask, data_errors=data_errors, mode=mode, bgd_model_func=bgd_model_func, amplitude_priors_method=amplitude_priors_method, verbose=verbose, live_fit=live_fit, analytical=analytical) run_minimisation(w, method="newton", ftol=1 / (w.Nx * w.Ny), xtol=1e-6, niter=50, with_line_search=True) elif mode == "2D": # first shot to set the mask - w = ChromaticPSFFitWorkspace(self, data, data_errors=data_errors, mode=mode, bgd_model_func=bgd_model_func, + w = ChromaticPSFFitWorkspace(self, data, mask=mask, data_errors=data_errors, mode=mode, bgd_model_func=bgd_model_func, amplitude_priors_method=amplitude_priors_method, verbose=verbose, live_fit=live_fit, analytical=analytical) # first, fit the transverse position @@ -1834,7 +1838,7 @@ def fit_chromatic_psf(self, data, bgd_model_func=None, data_errors=None, mode="1 class ChromaticPSFFitWorkspace(FitWorkspace): - def __init__(self, chromatic_psf, data, data_errors, mode, bgd_model_func=None, file_name="", analytical=True, + def __init__(self, chromatic_psf, data, data_errors, mode, bgd_model_func=None, mask=None, file_name="", analytical=True, amplitude_priors_method="noprior", verbose=False, plot=False, live_fit=False, truth=None): if mode not in ["1D", "2D"]: raise ValueError(f"mode argument must be '1D' or '2D'. Got {mode=}.") @@ -1884,6 +1888,10 @@ def __init__(self, chromatic_psf, data, data_errors, mode, bgd_model_func=None, self.data = self.data.astype("float32").ravel() self.err = self.err.astype("float32").ravel() self.pixels = np.arange(self.data.shape[0]) + if mask is not None: + self.mask = list(np.where(mask[self.bgd_width:-self.bgd_width, :].astype(bool).ravel())[0]) + else: + self.mask = [] if mode == "1D": self.pixels = np.arange(self.Ny) @@ -1910,7 +1918,6 @@ def __init__(self, chromatic_psf, data, data_errors, mode, bgd_model_func=None, self.data_cov = sparse.diags(self.err * self.err, dtype="float32", format="dia") self.W = sparse.diags(1 / (self.err * self.err), dtype="float32", format="dia") self.sqrtW = self.W.sqrt() - # create a mask self.W_before_mask = self.W.copy() # design matrix @@ -2036,7 +2043,8 @@ def set_mask(self, poly_params=None): W[mask] = 0 self.W = sparse.diags(W, dtype="float32", format="dia") self.sqrtW = self.W.sqrt() - self.mask = list(np.where(mask)[0]) + self.mask += list(np.where(mask)[0]) + self.mask = list(set(self.mask)) def simulate(self, *shape_params): r""" diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 7afa153c3..6b6c70ecd 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -139,6 +139,10 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p self.starfield *= self.flat else: self.starfield = None + if spectrum.spectrogram_mask is not None: + self.mask = list(np.where(spectrum.spectrogram_mask[self.bgd_width:-self.bgd_width, :].astype(bool).ravel())[0]) + else: + self.mask = [] # adapt the ChromaticPSF table shape if self.Nx != self.spectrum.chromatic_psf.Nx: @@ -176,8 +180,6 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p self.W = 1. / (self.err * self.err) self.data_before_mask = np.copy(self.data) self.W_before_mask = np.copy(self.W) - - # create mask self.sqrtW = sparse.diags(np.sqrt(self.W), format="dia", dtype="float32") # design matrix @@ -296,7 +298,8 @@ def set_mask(self, params=None, fwhmx_clip=3*parameters.PSF_FWHM_CLIP, fwhmy_cli self.W = np.copy(self.W_before_mask) self.W[mask] = 0 self.sqrtW = sparse.diags(np.sqrt(self.W), format="dia", dtype="float32") - self.mask = list(np.where(mask)[0]) + self.mask += list(np.where(mask)[0]) + self.mask = list(set(self.mask)) def simulate(self, *params): r""" @@ -1090,7 +1093,7 @@ def SpectractorRun(image, output_directory, guess=None): my_logger.info(f"\n\tNo guess position of order 0 has been given. Assuming the spectrum to extract comes " f"from the brightest object, guess position is set as {image.target_guess}.") if parameters.DEBUG: - image.plot_image(scale='symlog', title="before rebinning", target_pixcoords=image.target_guess, cmap='gray', vmax=1e3) + image.plot_image(scale='symlog', title="before rebinning", target_pixcoords=image.target_guess, vmax=1e3) # Use fast mode if parameters.CCD_REBIN > 1: @@ -1289,6 +1292,10 @@ def extract_spectrum_from_image(image, spectrum, signal_width=10, ws=(20, 30)): # if available, apply flats if image.flat_rotated is not None: data /= image.flat_rotated[ymin:ymax, xmin:xmax] + if image.mask_rotated is not None: + mask = image.mask_rotated[ymin:ymax, xmin:xmax] + else: + mask = None Ny, Nx = data.shape my_logger.info(f'\n\tExtract spectrogram: crop rotated image [{xmin}:{xmax},{ymin}:{ymax}] (size ({Nx}, {Ny}))') @@ -1352,7 +1359,7 @@ def bgd_model_func(x, y): my_logger.info('\n\t ======================= ChromaticPSF1D polynomial fit =============================') my_logger.info(f'\n\tStart ChromaticPSF polynomial fit with ' f'mode={mode} and amplitude_priors_method={method}...') - w = s.fit_chromatic_psf(data, bgd_model_func=bgd_model_func, data_errors=err, + w = s.fit_chromatic_psf(data, bgd_model_func=bgd_model_func, data_errors=err, mask=mask, amplitude_priors_method=method, mode=mode, verbose=parameters.VERBOSE, analytical=True) Dx_rot = spectrum.pixels.astype(float) - image.target_pixcoords_rotated[0] @@ -1411,6 +1418,10 @@ def bgd_model_func(x, y): spectrum.spectrogram_flat = np.copy(image.flat[ymin:ymax, xmin:xmax]) else: spectrum.spectrogram_flat = None # np.ones_like(spectrum.spectrogram_data) + if image.mask is not None: + spectrum.spectrogram_mask = np.copy(image.mask[ymin:ymax, xmin:xmax]) + else: + spectrum.spectrogram_mask = None # np.ones_like(spectrum.spectrogram_data) Ny, Nx = spectrum.spectrogram_data.shape my_logger.info(f'\n\tExtract spectrogram: crop raw image [{xmin}:{xmax},{ymin}:{ymax}] (size ({Nx}, {Ny}))') @@ -1570,7 +1581,7 @@ def run_spectrogram_deconvolution_psf2d(spectrum, bgd_model_func): data -= spectrum.spectrogram_starfield my_logger.info('\n\t ======================= ChromaticPSF2D polynomial fit =============================') - w = s.fit_chromatic_psf(data, bgd_model_func=bgd_model_func, data_errors=err, live_fit=False, + w = s.fit_chromatic_psf(data, bgd_model_func=bgd_model_func, data_errors=err, live_fit=False, mask=spectrum.spectrogram_mask, amplitude_priors_method=method, mode=mode, verbose=parameters.VERBOSE, analytical=True) # save results diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index 27db24237..0580de1b8 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -46,10 +46,14 @@ class Image(object): Flat 2D array without units and median of 1. starfield: array Star field simulation, no units needed but better in ADU/s. + mask: array + Boolean array to mask defects. flat_rotated: array Rotated flat 2D array without units and median of 1. starfield_rotated: array Rotated star field simulation, no units needed but better in ADU/s. + mask_rotated: array + Rotated boolean array to mask defects. target_pixcoords_rotated: array Target position [x,y] in the rotated image in pixels. date_obs: str @@ -166,6 +170,8 @@ def __init__(self, file_name, *, target_label="", disperser_label="", self.flat_rotated = None self.starfield = None self.starfield_rotated = None + self.mask = None + self.mask_rotated = None if parameters.CALLING_CODE != 'LSST_DM' and file_name != "": self.load_image(file_name) @@ -521,6 +527,8 @@ def plot_image(self, ax=None, scale="lin", title="", units="", plot_stats=False, Examples -------- >>> im = Image('tests/data/reduc_20170605_028.fits', config="./config/ctio.ini") + >>> im.mask = np.zeros_like(im.data).astype(bool) + >>> im.mask[700:705, 1250:1260] = True # test masking of some pixels like cosmic rays >>> im.plot_image(target_pixcoords=[820, 580], scale="symlog") >>> if parameters.DISPLAY: plt.show() """ @@ -534,7 +542,7 @@ def plot_image(self, ax=None, scale="lin", title="", units="", plot_stats=False, units = self.units if self.flat is not None and use_flat: data /= self.flat - plot_image_simple(ax, data=data, scale=scale, title=title, units=units, cax=cax, + plot_image_simple(ax, data=data, scale=scale, title=title, units=units, cax=cax, mask=self.mask, target_pixcoords=target_pixcoords, aspect=aspect, vmin=vmin, vmax=vmax, cmap=cmap) if parameters.OBS_OBJECT_TYPE == "STAR": plot_compass_simple(ax, self.parallactic_angle, arrow_size=0.1, origin=[0.15, 0.15]) @@ -1454,6 +1462,9 @@ def turn_image(image): if image.starfield is not None: image.starfield_rotated = ndimage.rotate(image.starfield, image.rotation_angle, prefilter=parameters.ROT_PREFILTER, order=parameters.ROT_ORDER) + if image.mask is not None: + image.mask_rotated = ndimage.rotate(image.mask, image.rotation_angle, + prefilter=parameters.ROT_PREFILTER, order=parameters.ROT_ORDER) if parameters.DEBUG: margin = 100 // parameters.CCD_REBIN diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index c70c7828f..c5ff71f47 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -145,6 +145,12 @@ class Spectrum: Best fitting model of the spectrogram in image units. spectrogram_residuals: array Residuals between the spectrogram data and the best fitting model of the spectrogram in image units. + spectrogram_flat: array + Flat array for the spectrogram with average=1. + spectrogram_starfield: array + Star field simulation array for the spectrogram in ADU/s. + spectrogram_mask: array + Boolean mask array to flag the defects. spectrogram_x0: float Relative position of the target in the spectrogram array along the x axis. spectrogram_y0: float @@ -245,6 +251,7 @@ def __init__(self, file_name="", image=None, order=1, target=None, config="", fa self.spectrogram_fit = None self.spectrogram_flat = None self.spectrogram_starfield = None + self.spectrogram_mask = None self.spectrogram_x0 = None self.spectrogram_y0 = None self.spectrogram_xmin = None @@ -671,7 +678,7 @@ def save_spectrum(self, output_file_name, overwrite=False): # print(f"Set header key {header_key} to {value} from attr {attribute}") extnames = ["SPECTRUM", "SPEC_COV", "ORDER2", "ORDER0"] # spectrum data - extnames += ["S_DATA", "S_ERR", "S_BGD", "S_BGD_ER", "S_FIT", "S_RES", "S_FLAT", "S_STAR"] # spectrogram data + extnames += ["S_DATA", "S_ERR", "S_BGD", "S_BGD_ER", "S_FIT", "S_RES", "S_FLAT", "S_STAR", "S_MASK"] extnames += ["PSF_TAB"] # PSF parameter table extnames += ["LINES"] # spectroscopic line table extnames += ["CONFIG"] # config parameters @@ -706,6 +713,8 @@ def save_spectrum(self, output_file_name, overwrite=False): hdus[extname].data = self.spectrogram_flat elif extname == "S_STAR": hdus[extname].data = self.spectrogram_starfield + elif extname == "S_MASK": + hdus[extname].data = self.spectrogram_mask.astype(int) elif extname == "PSF_TAB": hdus[extname] = fits.table_to_hdu(self.chromatic_psf.table) elif extname == "LINES": @@ -1096,6 +1105,8 @@ def load_spectrum_latest(self, input_file_name): self.spectrogram_flat = hdu_list["S_FLAT"].data if "S_STAR" in [hdu.name for hdu in hdu_list]: self.spectrogram_starfield = hdu_list["S_STAR"].data + if "S_MASK" in [hdu.name for hdu in hdu_list]: + self.spectrogram_mask = hdu_list["S_MASK"].data.astype(bool) self.chromatic_psf.init_from_table(Table.read(hdu_list["PSF_TAB"]), saturation=self.spectrogram_saturation) self.lines.table = Table.read(hdu_list["LINES"], unit_parse_strict="silent") diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index c7bde5657..f6bd7aed8 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -144,6 +144,10 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, self.starfield = self.spectrum.spectrogram_starfield.flatten() else: self.starfield = None + if self.spectrum.spectrogram_mask is not None: + self.mask = list(np.where(spectrum.spectrogram_mask.astype(bool).ravel())[0]) + else: + self.mask = [] self.fit_angstrom_exponent = fit_angstrom_exponent if not fit_angstrom_exponent: self.params.fixed[self.params.get_index("angstrom_exp")] = True # angstrom exponent @@ -236,7 +240,8 @@ def set_mask(self, params=None): mask = np.sum(self.spectrogram_simulation.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], self.spectrogram_simulation.pixels[0].size), axis=0) == 0 self.W = np.copy(self.W_before_mask) self.W[mask] = 0 - self.mask = list(np.where(mask)[0]) + self.mask += list(np.where(mask)[0]) + self.mask = list(set(self.mask)) def get_spectrogram_truth(self): """Load the truth parameters (if provided) from the file header. diff --git a/spectractor/tools.py b/spectractor/tools.py index 5209cdd38..e69a82e7e 100644 --- a/spectractor/tools.py +++ b/spectractor/tools.py @@ -1,4 +1,5 @@ import os +import copy import shutil from photutils.detection import IRAFStarFinder from scipy.optimize import curve_fit @@ -8,6 +9,7 @@ from astropy.io import fits from astropy import wcs as WCS +from matplotlib import cm import matplotlib.pyplot as plt import matplotlib.colors from matplotlib.ticker import MaxNLocator @@ -1726,7 +1728,7 @@ def clean_target_spikes(data, saturation): # pragma: no cover return data -def plot_image_simple(ax, data, scale="lin", title="", units="Image units", cmap=None, +def plot_image_simple(ax, data, scale="lin", title="", units="Image units", cmap=None, mask=None, target_pixcoords=None, vmin=None, vmax=None, aspect=None, cax=None): """Simple function to plot a spectrum with error bars and labels. @@ -1744,6 +1746,8 @@ def plot_image_simple(ax, data, scale="lin", title="", units="Image units", cmap Units of the image to be written in the color bar label (default: "Image units") cmap: colormap Color map label (default: None) + mask: array_like + Mask array (default: None) target_pixcoords: array_like, optional 2D array giving the (x,y) coordinates of the targets on the image: add a scatter plot (default: None) vmin: float @@ -1771,6 +1775,18 @@ def plot_image_simple(ax, data, scale="lin", title="", units="Image units", cmap ... title="tests/data/reduc_20170605_028.fits") >>> if parameters.DISPLAY: plt.show() """ + if cmap is not None and isinstance(cmap, str): + colormap = copy.copy(cm.get_cmap(cmap)) + elif isinstance(cmap, matplotlib.colors.Colormap): + colormap = cmap + else: + colormap = copy.copy(cm.get_cmap('viridis')) + cmap_nan = copy.copy(colormap) + cmap_nan.set_bad(color='lightgrey') + + data = np.copy(data) + if mask is not None: + data[mask] = np.nan if scale == "log" or scale == "log10": # removes the zeros and negative pixels first zeros = np.where(data <= 0) diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index 0c07d2711..3397af9bc 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -137,6 +137,8 @@ def test_ctio_fullchain(): disperser_label=disperser_label, config="") # config already loaded, do not overwrite PSF_POLY_ORDER image.flat = sim.flat image.starfield = sim.starfield + image.mask = np.zeros_like(image.data).astype(bool) + image.mask[680:685, 1255:1260] = True # test masking of some pixels like cosmic rays parameters.SPECTRACTOR_SIMULATE_STARFIELD = False # here we want to test fit with an exact starfield simulation spectrum = SpectractorRun(image, guess=[xpos, ypos], output_directory="./tests/data") From dcb9d520d76f333fb9688c6747c3e30f24ecbb0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 19 Feb 2024 21:05:46 +0100 Subject: [PATCH 043/161] plot mask in debug plot --- spectractor/extractor/extractor.py | 4 ++-- tests/test_fullchain.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 6b6c70ecd..89bebfa14 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1489,7 +1489,7 @@ def bgd_model_func(x, y): gs_kw = dict(width_ratios=[3, 0.08], height_ratios=[1, 1]) fig, ax = plt.subplots(2, 2, sharex='none', figsize=(16, 6), gridspec_kw=gs_kw) xx = np.arange(s.table['Dx'].size) - plot_image_simple(ax[1, 0], data=spectrum.spectrogram_data, scale="symlog", title='', + plot_image_simple(ax[1, 0], data=spectrum.spectrogram_data, scale="symlog", title='', mask=spectrum.spectrogram_mask, units=image.units, aspect='auto', cax=ax[1, 1]) ax[1, 0].plot(xx, target_pixcoords_spectrogram[1] + s.table['Dy_disp_axis'], label='Dispersion axis', color="r") ax[1, 0].scatter(xx, target_pixcoords_spectrogram[1] + s.table['Dy'], @@ -1500,7 +1500,7 @@ def bgd_model_func(x, y): # ax[1, 0].set_ylim(0.5 * Ny - signal_width, 0.5 * Ny + signal_width) ax[1, 0].set_xlim(0, xx.size) ax[1, 0].legend(loc='best') - plot_spectrum_simple(ax[0, 0], spectrum.lambdas, spectrum.data, data_err=spectrum.err, + plot_spectrum_simple(ax[0, 0], spectrum.lambdas, spectrum.data, data_err=spectrum.err, mask=spectrum.spectrogram_mask, units=image.units, label='Fitted spectrum') ax[0, 0].plot(spectrum.lambdas, s.table['flux_sum'], 'k-', label='Cross spectrum') ax[1, 0].set_xlabel(r"$\lambda$ [nm]") diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index 3397af9bc..af91098d4 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -1,5 +1,5 @@ import matplotlib as mpl -mpl.use('Agg') # must be run first! But therefore requires noqa E402 on all other imports +#mpl.use('Agg') # must be run first! But therefore requires noqa E402 on all other imports from scipy.interpolate import interp1d # noqa: E402 @@ -104,7 +104,7 @@ def make_image(): @astropy.config.set_temp_cache(os.path.join(os.path.abspath(os.path.dirname(__file__)), "data", "cache")) def test_ctio_fullchain(): parameters.VERBOSE = True - parameters.DEBUG = False + parameters.DEBUG = True parameters.SPECTRACTOR_ATMOSPHERE_SIM = "libradtran" sim_image_filename = "./tests/data/sim_20170530_134.fits" From 3652a21aeb1e5a9690d2a9fc12a70d2190c8a126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 19 Feb 2024 21:09:49 +0100 Subject: [PATCH 044/161] crop spectrogram mask --- spectractor/fit/fit_spectrogram.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index f6bd7aed8..147993495 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -186,6 +186,8 @@ def crop_spectrogram(self): self.spectrum.spectrogram_flat = self.spectrum.spectrogram_flat[bgd_width:-bgd_width, :] if self.spectrum.spectrogram_starfield is not None: self.spectrum.spectrogram_starfield = self.spectrum.spectrogram_starfield[bgd_width:-bgd_width, :] + if self.spectrum.spectrogram_mask is not None: + self.spectrum.spectrogram_mask = self.spectrum.spectrogram_mask[bgd_width:-bgd_width, :] self.spectrum.spectrogram_y0 -= bgd_width self.spectrum.chromatic_psf.y0 -= bgd_width self.spectrum.spectrogram_Ny, self.spectrum.spectrogram_Nx = self.spectrum.spectrogram_data.shape From 6f85ee13e15b891fa5daa4acdc750c368162bf11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 19 Feb 2024 21:10:44 +0100 Subject: [PATCH 045/161] debug plot --- spectractor/extractor/extractor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 89bebfa14..682447ffe 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1500,7 +1500,7 @@ def bgd_model_func(x, y): # ax[1, 0].set_ylim(0.5 * Ny - signal_width, 0.5 * Ny + signal_width) ax[1, 0].set_xlim(0, xx.size) ax[1, 0].legend(loc='best') - plot_spectrum_simple(ax[0, 0], spectrum.lambdas, spectrum.data, data_err=spectrum.err, mask=spectrum.spectrogram_mask, + plot_spectrum_simple(ax[0, 0], spectrum.lambdas, spectrum.data, data_err=spectrum.err, units=image.units, label='Fitted spectrum') ax[0, 0].plot(spectrum.lambdas, s.table['flux_sum'], 'k-', label='Cross spectrum') ax[1, 0].set_xlabel(r"$\lambda$ [nm]") From 08b42678df4704cc40981b624e81f9536d4949da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 19 Feb 2024 21:15:20 +0100 Subject: [PATCH 046/161] rebin mask --- spectractor/extractor/images.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index 0580de1b8..7fa20e221 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -226,6 +226,8 @@ def rebin(self): new_shape = np.asarray(self.data.shape) // parameters.CCD_REBIN self.data = rebin(self.data, new_shape) self.err = np.sqrt(rebin(self.err ** 2, new_shape)) + if self.mask is not None: + self.mask = rebin(self.mask, new_shape, FLAG_MAKESUM=True) if self.flat is not None: self.flat = rebin(self.flat, new_shape, FLAG_MAKESUM=False) if self.starfield is not None: From 19e1f984f5837dba8ec42578ecb485b86ddbb6fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 19 Feb 2024 21:19:27 +0100 Subject: [PATCH 047/161] don't save None spectrogram mask --- spectractor/extractor/spectrum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index c5ff71f47..980919842 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -713,7 +713,7 @@ def save_spectrum(self, output_file_name, overwrite=False): hdus[extname].data = self.spectrogram_flat elif extname == "S_STAR": hdus[extname].data = self.spectrogram_starfield - elif extname == "S_MASK": + elif extname == "S_MASK" and self.spectrogram_mask is not None: hdus[extname].data = self.spectrogram_mask.astype(int) elif extname == "PSF_TAB": hdus[extname] = fits.table_to_hdu(self.chromatic_psf.table) From 08a6f6b0c776a8b7677d74b9fedbd5f9fcc0d592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 19 Feb 2024 21:35:36 +0100 Subject: [PATCH 048/161] debug rebinning of mask --- spectractor/extractor/images.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index 7fa20e221..9bcb82486 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -212,6 +212,8 @@ def rebin(self): -------- >>> parameters.CCD_REBIN = 2 >>> im = Image('tests/data/reduc_20170605_028.fits') + >>> im.mask = np.zeros_like(im.data).astype(bool) + >>> im.mask[700:750, 800:850] = True >>> im.target_guess = [810, 590] >>> im.data.shape (2048, 2048) @@ -227,7 +229,7 @@ def rebin(self): self.data = rebin(self.data, new_shape) self.err = np.sqrt(rebin(self.err ** 2, new_shape)) if self.mask is not None: - self.mask = rebin(self.mask, new_shape, FLAG_MAKESUM=True) + self.mask = rebin(self.mask, new_shape, FLAG_MAKESUM=True).astype(bool) if self.flat is not None: self.flat = rebin(self.flat, new_shape, FLAG_MAKESUM=False) if self.starfield is not None: From e5d30b48d80c2f2de11504a0df2ed82bc134a906 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 19 Feb 2024 21:38:35 +0100 Subject: [PATCH 049/161] debug saving of None spectrogram_mask --- spectractor/extractor/spectrum.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index 980919842..616dce089 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -713,8 +713,11 @@ def save_spectrum(self, output_file_name, overwrite=False): hdus[extname].data = self.spectrogram_flat elif extname == "S_STAR": hdus[extname].data = self.spectrogram_starfield - elif extname == "S_MASK" and self.spectrogram_mask is not None: - hdus[extname].data = self.spectrogram_mask.astype(int) + elif extname == "S_MASK": + if self.spectrogram_mask is not None: + hdus[extname].data = self.spectrogram_mask.astype(int) + else: + hdus[extname].data = self.spectrogram_mask elif extname == "PSF_TAB": hdus[extname] = fits.table_to_hdu(self.chromatic_psf.table) elif extname == "LINES": From e93e7e03915fc341f70b5c5f883161205afd225f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 19 Feb 2024 21:39:41 +0100 Subject: [PATCH 050/161] debug saving of None spectrogram_mask --- spectractor/extractor/spectrum.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index 616dce089..244501385 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -1090,7 +1090,7 @@ def load_spectrum_latest(self, input_file_name): self.chromatic_psf.opt_reg = float(self.header["PSF_REG"]) if not self.fast_load: - with fits.open(input_file_name) as hdu_list: + with (fits.open(input_file_name) as hdu_list): # load other spectrum info self.cov_matrix = hdu_list["SPEC_COV"].data _, self.data_next_order, self.err_next_order = hdu_list["ORDER2"].data @@ -1109,7 +1109,9 @@ def load_spectrum_latest(self, input_file_name): if "S_STAR" in [hdu.name for hdu in hdu_list]: self.spectrogram_starfield = hdu_list["S_STAR"].data if "S_MASK" in [hdu.name for hdu in hdu_list]: - self.spectrogram_mask = hdu_list["S_MASK"].data.astype(bool) + self.spectrogram_mask = hdu_list["S_MASK"].dat + if self.spectrogram_mask is not None: + self.spectrogram_mask = self.spectrogram_mask.astype(bool) self.chromatic_psf.init_from_table(Table.read(hdu_list["PSF_TAB"]), saturation=self.spectrogram_saturation) self.lines.table = Table.read(hdu_list["LINES"], unit_parse_strict="silent") From fdbb5f7d2dc415eb5fd20871159ab59acafb4c1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 19 Feb 2024 21:39:54 +0100 Subject: [PATCH 051/161] debug saving of None spectrogram_mask --- spectractor/extractor/spectrum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index 244501385..72d9f5b58 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -1109,7 +1109,7 @@ def load_spectrum_latest(self, input_file_name): if "S_STAR" in [hdu.name for hdu in hdu_list]: self.spectrogram_starfield = hdu_list["S_STAR"].data if "S_MASK" in [hdu.name for hdu in hdu_list]: - self.spectrogram_mask = hdu_list["S_MASK"].dat + self.spectrogram_mask = hdu_list["S_MASK"].data if self.spectrogram_mask is not None: self.spectrogram_mask = self.spectrogram_mask.astype(bool) self.chromatic_psf.init_from_table(Table.read(hdu_list["PSF_TAB"]), From afcbd9b324f4e3d70921fe81191dc8d546173fe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 20 Feb 2024 13:34:10 +0100 Subject: [PATCH 052/161] better printing of parameters --- spectractor/extractor/background.py | 4 ++-- spectractor/fit/fitter.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spectractor/extractor/background.py b/spectractor/extractor/background.py index 09351e41c..e93dcb31c 100644 --- a/spectractor/extractor/background.py +++ b/spectractor/extractor/background.py @@ -236,7 +236,7 @@ def extract_spectrogram_background_sextractor(data, err, ws=(20, 30), mask_signa >>> from spectractor import parameters >>> parameters.DEBUG = True >>> psf = MoffatGauss() - >>> s0 = ChromaticPSF(psf, Nx=100, Ny=200, saturation=1000) + >>> s0 = ChromaticPSF(psf, Nx=100, Ny=300, saturation=1000) >>> params = s0.generate_test_poly_params() >>> saturation = params[-1] >>> data = s0.evaluate(s0.set_pixels(mode="1D"), poly_params=params) @@ -272,7 +272,7 @@ def extract_spectrogram_background_sextractor(data, err, ws=(20, 30), mask_signa for dx in range(Nx): bgd_bands[int(Dy_disp_axis[dx] - ws[0]):int(Dy_disp_axis[dx] + ws[0]), dx] = np.nan mask += (np.isnan(bgd_bands)) - bkg = Background2D(data, (parameters.PIXWIDTH_BOXSIZE, parameters.PIXWIDTH_BOXSIZE), + bkg = Background2D(data, (2*parameters.PIXWIDTH_BOXSIZE, parameters.PIXWIDTH_BOXSIZE), filter_size=(filter_size, filter_size), sigma_clip=sigma_clip, bkg_estimator=bkg_estimator, mask=mask) diff --git a/spectractor/fit/fitter.py b/spectractor/fit/fitter.py index 8bac49e53..a2a113e2a 100644 --- a/spectractor/fit/fitter.py +++ b/spectractor/fit/fitter.py @@ -1540,7 +1540,7 @@ def run_gradient_descent(fit_workspace, epsilon, xtol, ftol, niter, verbose=Fals fit_workspace.params_table = np.concatenate([fit_workspace.params_table, tmp_params_table]) fit_workspace.costs = np.concatenate([fit_workspace.costs, tmp_costs]) if verbose or fit_workspace.verbose: - fit_workspace.my_logger.info(f"\n\t{fit_workspace.params.print_parameters_summary()}") + fit_workspace.my_logger.info(f"\n{fit_workspace.params.print_parameters_summary()}") if parameters.DEBUG and (verbose or fit_workspace.verbose): fit_workspace.plot_gradient_descent() if len(fit_workspace.params.get_free_parameters()) > 1: @@ -1552,7 +1552,7 @@ def run_simple_newton_minimisation(fit_workspace, epsilon, xtol=1e-8, ftol=1e-8, epsilon, niter=niter, xtol=xtol, ftol=ftol) if verbose or fit_workspace.verbose: - fit_workspace.my_logger.info(f"\n\t{fit_workspace.params.print_parameters_summary()}") + fit_workspace.my_logger.info(f"\n{fit_workspace.params.print_parameters_summary()}") if parameters.DEBUG and (verbose or fit_workspace.verbose): fit_workspace.plot_gradient_descent() if len(fit_workspace.params.get_free_parameters()) > 1: From 56adb25004aada2cd56c1381c86c17198ee56080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 20 Feb 2024 13:37:59 +0100 Subject: [PATCH 053/161] debug background box --- spectractor/extractor/background.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/extractor/background.py b/spectractor/extractor/background.py index e93dcb31c..4fa382998 100644 --- a/spectractor/extractor/background.py +++ b/spectractor/extractor/background.py @@ -272,7 +272,7 @@ def extract_spectrogram_background_sextractor(data, err, ws=(20, 30), mask_signa for dx in range(Nx): bgd_bands[int(Dy_disp_axis[dx] - ws[0]):int(Dy_disp_axis[dx] + ws[0]), dx] = np.nan mask += (np.isnan(bgd_bands)) - bkg = Background2D(data, (2*parameters.PIXWIDTH_BOXSIZE, parameters.PIXWIDTH_BOXSIZE), + bkg = Background2D(data, (parameters.PIXWIDTH_BOXSIZE, parameters.PIXWIDTH_BOXSIZE), filter_size=(filter_size, filter_size), sigma_clip=sigma_clip, bkg_estimator=bkg_estimator, mask=mask) From c5005c4c87a59856cc612913308c81f9275c50f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 22 Feb 2024 11:17:30 +0100 Subject: [PATCH 054/161] don't crop spectrogram_data if already cropped --- spectractor/extractor/extractor.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 682447ffe..c028a79f8 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -122,25 +122,29 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p # crop data to fit faster self.lambdas = self.spectrum.lambdas self.bgd_width = parameters.PIXWIDTH_BACKGROUND + parameters.PIXDIST_BACKGROUND - parameters.PIXWIDTH_SIGNAL - self.Ny, self.Nx = spectrum.spectrogram_data[self.bgd_width:-self.bgd_width, :].shape + if spectrum.spectrogram_data.shape[0] < 2 * self.bgd_width: + # Data has been already cropped + self.bgd_width = 0 + rows = np.arange(self.bgd_width, spectrum.spectrogram_data.shape[0]-self.bgd_width) + self.Ny, self.Nx = spectrum.spectrogram_data[rows, :].shape yy, xx = np.mgrid[:self.Ny, :self.Nx] self.pixels = np.asarray([xx, yy], dtype=int) - self.data = spectrum.spectrogram_data[self.bgd_width:-self.bgd_width, :].flatten() - self.err = spectrum.spectrogram_err[self.bgd_width:-self.bgd_width, :].flatten() - self.bgd = spectrum.spectrogram_bgd[self.bgd_width:-self.bgd_width, :].flatten() + self.data = spectrum.spectrogram_data[rows, :].flatten() + self.err = spectrum.spectrogram_err[rows, :].flatten() + self.bgd = spectrum.spectrogram_bgd[rows, :].flatten() if spectrum.spectrogram_flat is not None: - self.flat = spectrum.spectrogram_flat[self.bgd_width:-self.bgd_width, :].flatten() + self.flat = spectrum.spectrogram_flat[rows, :].flatten() self.bgd *= self.flat else: self.flat = None if spectrum.spectrogram_starfield is not None: - self.starfield = spectrum.spectrogram_starfield[self.bgd_width:-self.bgd_width, :].flatten() + self.starfield = spectrum.spectrogram_starfield[rows, :].flatten() if self.flat is not None: self.starfield *= self.flat else: self.starfield = None if spectrum.spectrogram_mask is not None: - self.mask = list(np.where(spectrum.spectrogram_mask[self.bgd_width:-self.bgd_width, :].astype(bool).ravel())[0]) + self.mask = list(np.where(spectrum.spectrogram_mask[rows, :].astype(bool).ravel())[0]) else: self.mask = [] @@ -384,6 +388,7 @@ def simulate(self, *params): Load data: >>> spec = Spectrum("./tests/data/sim_20170530_134_spectrum.fits") + >>> spec.plot_spectrogram() Simulate the data with fixed amplitude priors: @@ -813,6 +818,7 @@ def run_ffm_minimisation(w, method="newton", niter=2): -------- >>> spec = Spectrum("./tests/data/sim_20170530_134_spectrum.fits") + >>> spec = Spectrum("./tests/data/test_auxtel_spectrum.fits") >>> parameters.VERBOSE = True >>> w = FullForwardModelFitWorkspace(spec, verbose=True, plot=True, live_fit=True, amplitude_priors_method="spectrum") >>> spec = run_ffm_minimisation(w, method="newton") # doctest: +ELLIPSIS From c17a9710d02ba7d3eced0b1a02c7bf09f8c6fa0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Feb 2024 16:49:55 +0000 Subject: [PATCH 055/161] fix Yc params for order 2 and 3 but Yc0; mask spectrogram region fit edges when not the maximum number of sheets of the psf cube have contributed to the pixel --- spectractor/extractor/extractor.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 682447ffe..12af79004 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -70,6 +70,8 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p self.psf_params_start_index = np.array([p.size + len(self.psf_poly_params) * k for k in range(len(self.diffraction_orders))]) self.saturation = spectrum.spectrogram_saturation p = np.concatenate([p] + [self.psf_poly_params] * len(self.diffraction_orders)) + #for order in self.diffraction_orders: + # p = np.concatenate([p] + [order*self.psf_poly_params]) input_labels = [f"A{order}" for order in self.diffraction_orders] input_labels += [r"D_CCD [mm]", r"shift_x [pix]", r"shift_y [pix]", r"angle [deg]", "B", "A_star", "R", "P [hPa]", "T [Celsius]", "z"] for order in self.diffraction_orders: @@ -84,7 +86,7 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p [D2CCD - 3 * parameters.DISTANCE2CCD_ERR, D2CCD + 3 * parameters.DISTANCE2CCD_ERR], [-parameters.PIXSHIFT_PRIOR, parameters.PIXSHIFT_PRIOR], [-10 * parameters.PIXSHIFT_PRIOR, 10 * parameters.PIXSHIFT_PRIOR], - [-90, 90], [0.2, 5], [0, np.inf], [-360, 360], [300, 1100], [-100, 100], [1.001, 3]] + [-90, 90], [0.2, 5], [0.5, 2], [-360, 360], [300, 1100], [-100, 100], [1.001, 3]] bounds += list(psf_poly_params_bounds) * len(self.diffraction_orders) fixed = [False] * p.size for k, par in enumerate(input_labels): @@ -94,6 +96,13 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p if "y_c" in par: fixed[k] = False p[k] = 0 + for k, par in enumerate(input_labels): + if "y_c" in par and par[-2:]=="_3" and "c_0" not in par: + fixed[k] = True + p[k] = 0 + if "y_c" in par and par[-2:]=="_2" and "c_0" not in par: + fixed[k] = True + p[k] = 0 params = FitParameters(p, labels=input_labels, axis_names=axis_names, fixed=fixed, bounds=bounds, truth=truth, filename=spectrum.filename) @@ -293,8 +302,14 @@ def set_mask(self, params=None, fwhmx_clip=3*parameters.PSF_FWHM_CLIP, fwhmy_cli self.psf_cubes_masked[order] = self.spectrum.chromatic_psf.convolve_psf_cube_masked(psf_cube_masked) # make rectangular mask per wavelength self.boundaries[order], self.psf_cubes_masked[order] = self.spectrum.chromatic_psf.get_boundaries(self.psf_cubes_masked[order]) - self.psf_cube_sparse_indices[order], self.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(self.psf_cubes_masked[order]) + self.psf_cube_sparse_indices[order], self.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(self.psf_cubes_masked[order]) mask = np.sum(self.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], psf_cube_masked[0].size), axis=0) == 0 + # cumulate the boolean values as int + weight_mask = np.sum(self.psf_cubes_masked[self.diffraction_orders[0]], axis=0) + # look for indices with maximum weight per column (all sheets of the psf cube have contributed) + res = np.max(weight_mask, axis=0)[np.newaxis,:] * np.ones((weight_mask.shape[0],1)) + # keep only the pixels where all psf_cube sheets have contributed per column + mask = (weight_mask != res).ravel() self.W = np.copy(self.W_before_mask) self.W[mask] = 0 self.sqrtW = sparse.diags(np.sqrt(self.W), format="dia", dtype="float32") From 31e960b379ccdebe1d235596caefc1088a9210cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Feb 2024 16:50:10 +0000 Subject: [PATCH 056/161] mask spectrogram region fit edges when not the maximum number of sheets of the psf cube have contributed to the pixel --- spectractor/extractor/chromaticpsf.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index 758edbea3..fe10458ca 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -2039,6 +2039,12 @@ def set_mask(self, poly_params=None): self.boundaries, self.psf_cube_masked = self.chromatic_psf.get_boundaries(self.psf_cube_masked) self.psf_cube_sparse_indices, self.M_sparse_indices = self.chromatic_psf.get_sparse_indices(self.psf_cube_masked) mask = np.sum(self.psf_cube_masked.reshape(psf_cube_masked.shape[0], psf_cube_masked[0].size), axis=0) == 0 + # cumulate the boolean values as int + weight_mask = np.sum(self.psf_cube_masked, axis=0) + # look for indices with maximum weight per column (all sheets of the psf cube have contributed) + res = np.max(weight_mask, axis=0)[np.newaxis,:] * np.ones((weight_mask.shape[0],1)) + # keep only the pixels where all psf_cube sheets have contributed per column + mask = (weight_mask != res).ravel() W = np.copy(self.W_before_mask.data.ravel()) W[mask] = 0 self.W = sparse.diags(W, dtype="float32", format="dia") From 29f738c6cb720653a19fe50381adddb155c7de3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Feb 2024 16:50:50 +0000 Subject: [PATCH 057/161] mask spectrogram region fit edges when not the maximum number of sheets of the psf cube have contributed to the pixel --- spectractor/fit/fit_spectrogram.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index 147993495..b96f464ae 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -240,6 +240,12 @@ def set_mask(self, params=None): self.spectrogram_simulation.boundaries[order], self.spectrogram_simulation.psf_cubes_masked[order] = self.spectrum.chromatic_psf.get_boundaries(psf_cube_masked) self.spectrogram_simulation.psf_cube_sparse_indices[order], self.spectrogram_simulation.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(psf_cube_masked) mask = np.sum(self.spectrogram_simulation.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], self.spectrogram_simulation.pixels[0].size), axis=0) == 0 + # cumulate the boolean values as int + weight_mask = np.sum(self.spectrogram_simulation.psf_cubes_masked[self.diffraction_orders[0]], axis=0) + # look for indices with maximum weight per column (all sheets of the psf cube have contributed) + res = np.max(weight_mask, axis=0)[np.newaxis,:] * np.ones((weight_mask.shape[0],1)) + # keep only the pixels where all psf_cube sheets have contributed per column + mask = (weight_mask != res).ravel() self.W = np.copy(self.W_before_mask) self.W[mask] = 0 self.mask += list(np.where(mask)[0]) From 9a1e1e63a9c0aa37db5c1aa4a1696b22e283cc84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Feb 2024 17:59:45 +0100 Subject: [PATCH 058/161] image simulation adapted for auxtel --- spectractor/simulation/image_simulation.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index 4a85e6e00..f19c13561 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -491,12 +491,12 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer my_logger.info(f'\n\tStart IMAGE SIMULATOR') # Load reduced image spectrum = Spectrum(spectrum_filename) + parameters.CALLING_CODE = "" if diffraction_orders is None: diffraction_orders = np.arange(spectrum.order, spectrum.order + 3 * np.sign(spectrum.order), np.sign(spectrum.order)) image = ImageModel(image_filename, target_label=spectrum.target.label) guess = np.array([spectrum.header['TARGETX'], spectrum.header['TARGETY']]) - if "CCDREBIN" in spectrum.header: - guess *= spectrum.header["CCDREBIN"] + guess *= parameters.CCD_REBIN if parameters.DEBUG: image.plot_image(scale='symlog', target_pixcoords=guess) # Fit the star 2D profile @@ -512,7 +512,7 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer # Target model my_logger.info('\n\tStar model...') # Spectrogram is simulated with spectrum.x0 target position: must be this position to simulate the target. - star = StarModel(image.target_pixcoords, image.target_star2D, image.target_star2D.params.values[0]) + star = StarModel(np.array(image.target_pixcoords) / parameters.CCD_REBIN, image.target_star2D, image.target_star2D.params.values[0]) # reso = star.fwhm if parameters.DEBUG: star.plot_model() @@ -596,6 +596,8 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer # Round float ADU into closest integers # image.data = np.around(image.data) + if parameters.OBS_NAME == "AUXTEL": + image.data = image.data.T[::-1, ::-1] # Plot if parameters.VERBOSE and parameters.DISPLAY: # pragma: no cover @@ -606,7 +608,7 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer # Set output path ensure_dir(outputdir) output_filename = image_filename.split('/')[-1] - output_filename = (output_filename.replace('reduc', 'sim')).replace('trim', 'sim') + output_filename = (output_filename.replace('reduc', 'sim')).replace('trim', 'sim').replace('exposure', 'sim') output_filename = os.path.join(outputdir, output_filename) # Save images and parameters From 2b62bbeb658730ae47194c77bfd98472d1f93286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Feb 2024 18:00:15 +0100 Subject: [PATCH 059/161] load_auxtel adapted for data and simulations --- spectractor/extractor/images.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index 9bcb82486..7e8af86ff 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -722,7 +722,10 @@ def load_AUXTEL_image(image): # pragma: no cover image.my_logger.info(f'\n\tLoading AUXTEL image {image.file_name}...') with fits.open(image.file_name) as hdu_list: image.header = hdu_list[0].header - image.data = hdu_list[1].data.astype(np.float64) + if hdu_list[0].data is not None: + image.data = hdu_list[0].data.astype(np.float64) + else: + image.data = hdu_list[1].data.astype(np.float64) image.date_obs = image.header['DATE'] image.expo = float(image.header['EXPTIME']) if "empty" not in image.header['FILTER'].lower(): @@ -765,7 +768,7 @@ def load_AUXTEL_image(image): # pragma: no cover if parameters.OBS_CAMERA_ROTATION < -360: parameters.OBS_CAMERA_ROTATION += 360 image.header["CAM_ROT"] = parameters.OBS_CAMERA_ROTATION - if "CD2_1" in hdu_list[1].header: + if len(hdu_list) > 1 and "CD2_1" in hdu_list[1].header: rotation_wcs = 180 / np.pi * np.arctan2(hdu_list[1].header["CD2_1"], hdu_list[1].header["CD1_1"]) + 90 if not np.isclose(rotation_wcs % 360, parameters.OBS_CAMERA_ROTATION % 360, atol=2): image.my_logger.warning(f"\n\tWCS rotation angle is {rotation_wcs} degree while " From 20a4b593d88ae4f9101a48e8c0516d6790bfefe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Feb 2024 18:00:39 +0100 Subject: [PATCH 060/161] change REBIN key into CCD_REBIN key --- spectractor/extractor/spectrum.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index 72d9f5b58..ca0d1c1fe 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -656,8 +656,8 @@ def save_spectrum(self, output_file_name, overwrite=False): """ from spectractor._version import __version__ self.header["VERSION"] = str(__version__) - self.header["REBIN"] = parameters.CCD_REBIN - self.header.comments['REBIN'] = 'original image rebinning factor to get spectrum.' + self.header["CCD_REBIN"] = parameters.CCD_REBIN + self.header.comments['CCD_REBIN'] = 'original image rebinning factor to get spectrum.' self.header['UNIT1'] = "nanometer" self.header['UNIT2'] = self.units self.header['COMMENTS'] = 'First column gives the wavelength in unit UNIT1, ' \ From 9a6e8616d7682f85aa8975a92574b186a02dae7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Feb 2024 18:01:07 +0100 Subject: [PATCH 061/161] imshow with no interpolation for better plot analysis --- spectractor/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/tools.py b/spectractor/tools.py index e69a82e7e..77f950fac 100644 --- a/spectractor/tools.py +++ b/spectractor/tools.py @@ -1800,7 +1800,7 @@ def plot_image_simple(ax, data, scale="lin", title="", units="Image units", cmap norm = matplotlib.colors.SymLogNorm(vmin=vmin, vmax=vmax, linthresh=10, base=10) else: norm = matplotlib.colors.Normalize(vmin=vmin, vmax=vmax) - im = ax.imshow(data, origin='lower', cmap=cmap, norm=norm, aspect=aspect) + im = ax.imshow(data, origin='lower', cmap=cmap, norm=norm, aspect=aspect, interpolation="none") ax.grid(color='silver', ls='solid') ax.grid(True) ax.set_xlabel(parameters.PLOT_XLABEL) From 9d3b2017d4ae7eaf4631c5ff11599e603f1a8b6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Feb 2024 18:01:28 +0100 Subject: [PATCH 062/161] cleaning --- spectractor/extractor/extractor.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index c028a79f8..76a1a71cd 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -70,6 +70,8 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p self.psf_params_start_index = np.array([p.size + len(self.psf_poly_params) * k for k in range(len(self.diffraction_orders))]) self.saturation = spectrum.spectrogram_saturation p = np.concatenate([p] + [self.psf_poly_params] * len(self.diffraction_orders)) + # for order in self.diffraction_orders: + # p = np.concatenate([p] + [self.psf_poly_params * order]) input_labels = [f"A{order}" for order in self.diffraction_orders] input_labels += [r"D_CCD [mm]", r"shift_x [pix]", r"shift_y [pix]", r"angle [deg]", "B", "A_star", "R", "P [hPa]", "T [Celsius]", "z"] for order in self.diffraction_orders: @@ -818,9 +820,8 @@ def run_ffm_minimisation(w, method="newton", niter=2): -------- >>> spec = Spectrum("./tests/data/sim_20170530_134_spectrum.fits") - >>> spec = Spectrum("./tests/data/test_auxtel_spectrum.fits") >>> parameters.VERBOSE = True - >>> w = FullForwardModelFitWorkspace(spec, verbose=True, plot=True, live_fit=True, amplitude_priors_method="spectrum") + >>> w = FullForwardModelFitWorkspace(spec, verbose=True, plot=True, live_fit=False, amplitude_priors_method="spectrum") >>> spec = run_ffm_minimisation(w, method="newton") # doctest: +ELLIPSIS >>> if 'LBDAS_T' in spec.header: plot_comparison_truth(spec, w) From 34773e787c4dc556e7e6773df77a6f024a64ff0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Feb 2024 18:05:46 +0100 Subject: [PATCH 063/161] auxtel full chain simulation --- tests/test_fullchain.py | 131 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index af91098d4..213cb281d 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -100,6 +100,15 @@ def make_image(): return sim +def make_auxtel_image(): + spectrum_filename = "./tests/data/test_auxtel_spectrum.fits" + image_filename = "./tests/data/exposure_2023092800266_dmpostisrccd.fits" + sim = ImageSim(image_filename, spectrum_filename, "./tests/data/", A1=A1_T, A2=A2_T, A3=A3_T, + psf_poly_params=PSF_POLY_PARAMS_AUXTEL_TRUTH, with_starfield=False, with_rotation=True, with_noise=False, + with_flat=False) + return sim + + @unittest.skipIf(uvspec_available() is False, 'Skipping to avoid libradtran dependency') @astropy.config.set_temp_cache(os.path.join(os.path.abspath(os.path.dirname(__file__)), "data", "cache")) def test_ctio_fullchain(): @@ -229,3 +238,125 @@ def test_ctio_fullchain(): assert np.all(np.isclose(psf_poly_params[(PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1], np.array(PSF_POLY_PARAMS_TRUTH)[(PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1], rtol=0.01, atol=0.01)) + +@unittest.skipIf(uvspec_available() is False, 'Skipping to avoid libradtran dependency') +@astropy.config.set_temp_cache(os.path.join(os.path.abspath(os.path.dirname(__file__)), "data", "cache")) +def auxtel_fullchain(): + parameters.VERBOSE = True + parameters.DEBUG = True + parameters.SPECTRACTOR_ATMOSPHERE_SIM = "libradtran" + sim_image_filename = "./tests/data/sim_2023092800266_dmpostisrccd.fits" + + # load test and make image simulation + # if not os.path.isfile(sim_image_filename): + sim = make_auxtel_image() + image = Image(sim_image_filename, config="./config/auxtel.ini") + lambdas_truth = np.fromstring(image.header['LBDAS_T'][1:-1], sep=' ') + amplitude_truth = np.fromstring(image.header['AMPLIS_T'][1:-1], sep=' ', dtype=float) + parameters.AMPLITUDE_TRUTH = np.copy(amplitude_truth) + parameters.LAMBDA_TRUTH = np.copy(lambdas_truth) + + # extractor + load_config("./config/auxtel.ini") + parameters.SPECTRACTOR_ATMOSPHERE_SIM = "libradtran" + parameters.PSF_POLY_ORDER = PSF_POLY_ORDER + parameters.CCD_REBIN = 1 + # JN: > 1 not working well for now: I guess CTIO spectra are too narrow + # and under-sampled to extract unbiased rebinned spectrum, but pipeline is ok. + apply_rebinning_to_parameters() + if parameters.CCD_REBIN > 1: + for k in range(2 * (PSF_POLY_ORDER + 1), 3 * (PSF_POLY_ORDER +1)): + PSF_POLY_PARAMS_TRUTH[k] /= parameters.CCD_REBIN + + image = SpectractorInit(sim_image_filename, config="") # config already loaded, do not overwrite PSF_POLY_ORDER + xpos, ypos = np.array([image.header["TARGETX"], image.header["TARGETY"]]) / 2 + parameters.SPECTRACTOR_SIMULATE_STARFIELD = False # here we want to test fit with an exact starfield simulation + spectrum = SpectractorRun(image, guess=[xpos, ypos], output_directory="./tests/data") + + # tests + residuals = plot_residuals(spectrum, lambdas_truth, amplitude_truth) + + spectrum.my_logger.warning(f"\n\tQuantities to test with {parameters.CCD_REBIN=}:" + f"\n\t\tspectrum.header['X0_T']={spectrum.header['X0_T'] / parameters.CCD_REBIN:.5g} vs {spectrum.x0[0]:.5g}" + f"\n\t\tspectrum.header['Y0_T']={spectrum.header['Y0_T'] / parameters.CCD_REBIN:.5g} vs {spectrum.x0[1]:.5g}" + f"\n\t\tspectrum.header['ROT_T']={spectrum.header['ROT_T']:.5g} " + f"vs {spectrum.rotation_angle:.5g}" + f"\n\t\tspectrum.header['BKGD_LEV']={spectrum.header['BKGD_LEV'] * parameters.CCD_REBIN**2:.5g} " + f"vs {np.mean(spectrum.spectrogram_bgd):.5g}" + f"\n\t\tspectrum.header['D2CCD_T']={spectrum.header['D2CCD_T']:.5g} " + f"vs {spectrum.disperser.D:.5g}" + f"\n\t\tspectrum.header['A2_FIT']={spectrum.header['A2_FIT']:.5g} vs {A2_T:.5g}" + f"\n\t\tspectrum.header['CHI2_FIT']={spectrum.header['CHI2_FIT']:.4g}" + f"\n\t\tspectrum.chromatic_psf.poly_params=" + f"{spectrum.chromatic_psf.params.values[spectrum.chromatic_psf.Nx + 2 * (PSF_POLY_ORDER + 1):-1]}" + f" vs {PSF_POLY_PARAMS_TRUTH[2 * (PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1]}" + f"\n\t\tresiduals wrt truth: mean={np.mean(residuals[100:-100]):.5g}, " + f"std={np.std(residuals[100:-100]):.5g}") + assert np.isclose(float(spectrum.header['X0_T'] / parameters.CCD_REBIN), spectrum.x0[0], atol=0.2 * parameters.CCD_REBIN) + assert np.isclose(float(spectrum.header['Y0_T'] / parameters.CCD_REBIN), spectrum.x0[1], atol=0.2 * parameters.CCD_REBIN) + assert np.isclose(float(spectrum.header['ROT_T']), spectrum.rotation_angle, atol=1e-3) + assert np.isclose(float(spectrum.header['BKGD_LEV'] * parameters.CCD_REBIN**2), np.mean(spectrum.spectrogram_bgd), rtol=1e-3) + assert np.isclose(float(spectrum.header['D2CCD_T']), spectrum.disperser.D, atol=0.1) + if parameters.CCD_REBIN == 1: + assert float(spectrum.header['CHI2_FIT']) < 1.5e-3 + else: + assert float(spectrum.header['CHI2_FIT']) < 1.5e-1 + assert np.all( + np.isclose(spectrum.chromatic_psf.params.values[spectrum.chromatic_psf.Nx + 2 * (PSF_POLY_ORDER + 1):-1], + np.array(PSF_POLY_PARAMS_TRUTH)[2 * (PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1], rtol=0.01, atol=0.01)) + assert np.abs(np.mean(residuals[100:-100])) < 0.25 + assert np.std(residuals[100:-100]) < 3 + + spectrum_file_name = "./tests/data/sim_20170530_134_spectrum.fits" + assert os.path.isfile(spectrum_file_name) + atmgrid_filename = sim_image_filename.replace('sim', 'reduc').replace('.fits', '_atmsim.fits') + assert os.path.isfile(atmgrid_filename) + spectrum = Spectrum(spectrum_file_name) + w = SpectrumFitWorkspace(spectrum, atmgrid_file_name=atmgrid_filename, fit_angstrom_exponent=False, + verbose=True, plot=True, live_fit=False) + run_spectrum_minimisation(w, method="newton") + nsigma = 2 + labels = ["VAOD_T", "OZONE_T", "PWV_T"] + indices = [2, 4, 5] + ipar = w.params.get_free_parameters() # non fixed param indices + cov_indices = [list(ipar).index(k) for k in indices] # non fixed param indices in cov matrix + assert w.costs[-1] / w.data.size < 0.5 + k = 0 + for i, l in zip(indices, labels): + icov = cov_indices[k] + spectrum.my_logger.info(f"Test {l} best-fit {w.params.values[i]:.3f}+/-{np.sqrt(w.params.cov[icov, icov]):.3f} " + f"vs {spectrum.header[l]:.3f} at {nsigma}sigma level: " + f"{np.abs(w.params.values[i] - spectrum.header[l]) / np.sqrt(w.params.cov[icov, icov]) < nsigma}") + assert np.abs(w.params.values[i] - spectrum.header[l]) / np.sqrt(w.params.cov[icov, icov]) < nsigma + k += 1 + assert np.abs(w.params.values[1]) / np.sqrt(w.params.cov[1, 1]) < 2 * nsigma # A2 + assert np.isclose(np.abs(w.params.values[8]), 0, atol=parameters.PIXSHIFT_PRIOR) # pixshift + assert np.isclose(np.abs(w.params.values[9]), 0, atol=1e-3) # B + + parameters.DEBUG = False + parameters.SPECTRACTOR_ATMOSPHERE_SIM = "libradtran" + w = SpectrogramFitWorkspace(spectrum, atmgrid_file_name=atmgrid_filename, fit_angstrom_exponent=False, + verbose=True, plot=True, live_fit=False) + run_spectrogram_minimisation(w, method="newton") + nsigma = 2 + labels = ["A1_T", "A2_T", "VAOD_T", "OZONE_T", "PWV_T"] + indices = [0, 1, 3, 5, 6] + A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, D, shift_x, shift_y, shift_t, B, Astar, *psf_poly_params = w.params.values + ipar = w.params.get_free_parameters() # non fixed param indices + cov_indices = [list(ipar).index(k) for k in indices] # non fixed param indices in cov matrix + assert w.costs[-1] / w.data.size < 1e-3 + k = 0 + for i, l in zip(indices, labels): + icov = cov_indices[k] + spectrum.my_logger.info(f"Test {l} best-fit {w.params.values[i]:.3f}+/-{np.sqrt(w.params.cov[icov, icov]):.3f} " + f"vs {spectrum.header[l]:.3f} at {nsigma}sigma level: " + f"{np.abs(w.params.values[i] - spectrum.header[l]) / np.sqrt(w.params.cov[icov, icov]) < nsigma}") + assert np.abs(w.params.values[i] - spectrum.header[l]) / np.sqrt(w.params.cov[icov, icov]) < nsigma + k += 1 + assert np.isclose(shift_y, 0, atol=parameters.PIXSHIFT_PRIOR) # shift_y + assert np.isclose(D, spectrum.header["D2CCD_T"], atol=0.1) # D2CCD + assert np.isclose(B, 1, atol=1e-3) # B + assert np.isclose(Astar, 1, atol=1e-2) # Astar + assert np.all(np.isclose(psf_poly_params[(PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1], + np.array(PSF_POLY_PARAMS_TRUTH)[(PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1], + rtol=0.01, atol=0.01)) From 539e601be3bd53cffba4c1e36ffd36ae182be275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Feb 2024 18:06:05 +0100 Subject: [PATCH 064/161] auxtel full chain simulation --- tests/test_fullchain.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index 213cb281d..44a00e5f4 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -29,6 +29,13 @@ 3, 1, 1, 3, 0, 0, 1e6] * N_DIFF_ORDERS + +PSF_POLY_PARAMS_AUXTEL_TRUTH = [1, 0, 0, + 0, 0, 0, + 6, 0, 0, + 3, 0, 0, + 1e6] * N_DIFF_ORDERS + A1_T = 1 A2_T = 1 A3_T = 0 From 44e85cf6594f9a0001c7b04840a91e6b477e92b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Feb 2024 18:13:07 +0100 Subject: [PATCH 065/161] argh with ratio files --- .../holo4_003/ratio_order_2over1.txt | 800 ------------------ .../holo4_003/ratio_order_3over2.txt | 800 ------------------ 2 files changed, 1600 deletions(-) delete mode 100644 spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt delete mode 100644 spectractor/extractor/dispersers/holo4_003/ratio_order_3over2.txt diff --git a/spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt b/spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt deleted file mode 100644 index 6f27e0c43..000000000 --- a/spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt +++ /dev/null @@ -1,800 +0,0 @@ -3.000000000000000000e+02 -7.090213097062541436e+00 -3.010000000000000000e+02 -7.090213097062542325e+00 -3.020000000000000000e+02 -7.090213097062542325e+00 -3.030000000000000000e+02 -7.090213097062543213e+00 -3.040000000000000000e+02 -7.090213097062544989e+00 -3.050000000000000000e+02 -7.090213097062544989e+00 -3.060000000000000000e+02 -7.090213097062544989e+00 -3.070000000000000000e+02 -7.090213097062544989e+00 -3.080000000000000000e+02 -7.090213097062544989e+00 -3.090000000000000000e+02 -7.090213097062544989e+00 -3.100000000000000000e+02 -7.090213097062544989e+00 -3.110000000000000000e+02 -7.090213097062544989e+00 -3.120000000000000000e+02 -7.090213097062544989e+00 -3.130000000000000000e+02 -7.090213097062544989e+00 -3.140000000000000000e+02 -7.090213097062544989e+00 -3.150000000000000000e+02 -7.090213097062544989e+00 -3.160000000000000000e+02 -7.090213097062544989e+00 -3.170000000000000000e+02 -7.090213097062544989e+00 -3.180000000000000000e+02 -7.090213097062544989e+00 -3.190000000000000000e+02 -7.090213097062544989e+00 -3.200000000000000000e+02 -7.090213097062544989e+00 -3.210000000000000000e+02 -7.090213097062544989e+00 -3.220000000000000000e+02 -7.090213097062544989e+00 -3.230000000000000000e+02 -7.090213097062544989e+00 -3.240000000000000000e+02 -7.090213097062544989e+00 -3.250000000000000000e+02 -7.090213097062544989e+00 -3.260000000000000000e+02 -7.090213097062544989e+00 -3.270000000000000000e+02 -7.090213097062544989e+00 -3.280000000000000000e+02 -7.090213097062544989e+00 -3.290000000000000000e+02 -7.090213097062544989e+00 -3.300000000000000000e+02 -7.090213097062544989e+00 -3.310000000000000000e+02 -7.090213097062544989e+00 -3.320000000000000000e+02 -7.090213097062544989e+00 -3.330000000000000000e+02 -7.090213097062544989e+00 -3.340000000000000000e+02 -7.090213097062544989e+00 -3.350000000000000000e+02 -6.328803424402677180e+00 -3.360000000000000000e+02 -5.527802037939696156e+00 -3.370000000000000000e+02 -4.613243163438663252e+00 -3.380000000000000000e+02 -3.812382915170114295e+00 -3.390000000000000000e+02 -2.991109607661365910e+00 -3.400000000000000000e+02 -1.822843895112854273e+00 -3.410000000000000000e+02 -6.926260049797368090e-01 -3.420000000000000000e+02 3.870096902209335665e-01 -3.430000000000000000e+02 1.747384374344775892e+00 -3.440000000000000000e+02 2.303928005602863482e+00 -3.450000000000000000e+02 2.783002638712051446e+00 -3.460000000000000000e+02 3.136856115706376791e+00 -3.470000000000000000e+02 3.573486275341247520e+00 -3.480000000000000000e+02 3.998683400877324878e+00 -3.490000000000000000e+02 4.040869007395492929e+00 -3.500000000000000000e+02 4.153621186251155173e+00 -3.510000000000000000e+02 4.307819339879337406e+00 -3.520000000000000000e+02 4.122505813925746665e+00 -3.530000000000000000e+02 3.909383886504167016e+00 -3.540000000000000000e+02 3.698665671948257128e+00 -3.550000000000000000e+02 3.516173380005064519e+00 -3.560000000000000000e+02 3.356477995828850425e+00 -3.570000000000000000e+02 3.160081580233749854e+00 -3.580000000000000000e+02 2.984200165885861011e+00 -3.590000000000000000e+02 2.770167735908844353e+00 -3.600000000000000000e+02 2.544125745463342803e+00 -3.610000000000000000e+02 2.390559827962756234e+00 -3.620000000000000000e+02 2.312684631433588933e+00 -3.630000000000000000e+02 2.249351988051884632e+00 -3.640000000000000000e+02 2.160481333197594722e+00 -3.650000000000000000e+02 2.080340203487198281e+00 -3.660000000000000000e+02 2.036984480629119965e+00 -3.670000000000000000e+02 1.994087600564666829e+00 -3.680000000000000000e+02 1.940603736211912844e+00 -3.690000000000000000e+02 1.888583656013298029e+00 -3.700000000000000000e+02 1.790755255006616364e+00 -3.710000000000000000e+02 1.692465345587529812e+00 -3.720000000000000000e+02 1.617378317791101860e+00 -3.730000000000000000e+02 1.559343907277888075e+00 -3.740000000000000000e+02 1.511663235743319511e+00 -3.750000000000000000e+02 1.442967817317731161e+00 -3.760000000000000000e+02 1.392010166481182143e+00 -3.770000000000000000e+02 1.356970819697515651e+00 -3.780000000000000000e+02 1.315672992097228322e+00 -3.790000000000000000e+02 1.280728020654762433e+00 -3.800000000000000000e+02 1.250648336598931154e+00 -3.810000000000000000e+02 1.233236446903313910e+00 -3.820000000000000000e+02 1.201881619672994672e+00 -3.830000000000000000e+02 1.146703838483096760e+00 -3.840000000000000000e+02 1.097896025484838445e+00 -3.850000000000000000e+02 1.048476150035318355e+00 -3.860000000000000000e+02 1.017637220687949817e+00 -3.870000000000000000e+02 1.028435253921600401e+00 -3.880000000000000000e+02 1.039485602203704451e+00 -3.890000000000000000e+02 1.007069572347964126e+00 -3.900000000000000000e+02 9.727890037215338737e-01 -3.910000000000000000e+02 9.663333174638393253e-01 -3.920000000000000000e+02 9.478789831251134279e-01 -3.930000000000000000e+02 9.146401266440861155e-01 -3.940000000000000000e+02 8.964838841883382425e-01 -3.950000000000000000e+02 8.709237174070031395e-01 -3.960000000000000000e+02 8.265883653201128167e-01 -3.970000000000000000e+02 8.033407222810033943e-01 -3.980000000000000000e+02 8.118924754640002295e-01 -3.990000000000000000e+02 8.044148519649951812e-01 -4.000000000000000000e+02 7.726953097894549982e-01 -4.010000000000000000e+02 7.646660821341034753e-01 -4.020000000000000000e+02 7.743080343406182342e-01 -4.030000000000000000e+02 7.657572992398562484e-01 -4.040000000000000000e+02 7.496357501429595782e-01 -4.050000000000000000e+02 7.334880799993769296e-01 -4.060000000000000000e+02 7.164893091571650219e-01 -4.070000000000000000e+02 7.012917685380222199e-01 -4.080000000000000000e+02 6.911186014599846050e-01 -4.090000000000000000e+02 6.814727432371219251e-01 -4.100000000000000000e+02 6.712368360203043727e-01 -4.110000000000000000e+02 6.631628188627718412e-01 -4.120000000000000000e+02 6.557240173062228727e-01 -4.130000000000000000e+02 6.426077737163423675e-01 -4.140000000000000000e+02 6.306938107431300233e-01 -4.150000000000000000e+02 6.231470464372395046e-01 -4.160000000000000000e+02 6.155417585989471085e-01 -4.170000000000000000e+02 6.065583524274558158e-01 -4.180000000000000000e+02 5.973653276235721954e-01 -4.190000000000000000e+02 5.880300677074770110e-01 -4.200000000000000000e+02 5.794847797288136260e-01 -4.210000000000000000e+02 5.710896937506615423e-01 -4.220000000000000000e+02 5.649269475079771174e-01 -4.230000000000000000e+02 5.611600528314897307e-01 -4.240000000000000000e+02 5.590998265874644879e-01 -4.250000000000000000e+02 5.521542515421713482e-01 -4.260000000000000000e+02 5.347576224958094926e-01 -4.270000000000000000e+02 5.209377065831362064e-01 -4.280000000000000000e+02 5.173853413716962280e-01 -4.290000000000000000e+02 5.133642763288562838e-01 -4.300000000000000000e+02 5.031284167181094835e-01 -4.310000000000000000e+02 4.935211140689056419e-01 -4.320000000000000000e+02 4.880868077467254151e-01 -4.330000000000000000e+02 4.801128385743494986e-01 -4.340000000000000000e+02 4.717682983576887423e-01 -4.350000000000000000e+02 4.710363751507173347e-01 -4.360000000000000000e+02 4.702276890457245395e-01 -4.370000000000000000e+02 4.622921815338318918e-01 -4.380000000000000000e+02 4.547698834270983981e-01 -4.390000000000000000e+02 4.531389015741070225e-01 -4.400000000000000000e+02 4.503861585087456931e-01 -4.410000000000000000e+02 4.414805861234325501e-01 -4.420000000000000000e+02 4.325248711655828027e-01 -4.430000000000000000e+02 4.286142196459217235e-01 -4.440000000000000000e+02 4.275428105567987691e-01 -4.450000000000000000e+02 4.247827786684365003e-01 -4.460000000000000000e+02 4.209600553455061789e-01 -4.470000000000000000e+02 4.177210706210515712e-01 -4.480000000000000000e+02 4.127250600023361637e-01 -4.490000000000000000e+02 4.061739185334488078e-01 -4.500000000000000000e+02 4.011949896430181406e-01 -4.510000000000000000e+02 3.984389066119622957e-01 -4.520000000000000000e+02 3.960398812874672547e-01 -4.530000000000000000e+02 3.929348478948982426e-01 -4.540000000000000000e+02 3.886898482747888073e-01 -4.550000000000000000e+02 3.830207331471457977e-01 -4.560000000000000000e+02 3.761158173254862125e-01 -4.570000000000000000e+02 3.723824576145031151e-01 -4.580000000000000000e+02 3.715717745057048882e-01 -4.590000000000000000e+02 3.697182244393833472e-01 -4.600000000000000000e+02 3.658589993526584205e-01 -4.610000000000000000e+02 3.616719520199900839e-01 -4.620000000000000000e+02 3.576812568545735815e-01 -4.630000000000000000e+02 3.543864690911576742e-01 -4.640000000000000000e+02 3.522280955521581158e-01 -4.650000000000000000e+02 3.504491996285457045e-01 -4.660000000000000000e+02 3.462631876000078490e-01 -4.670000000000000000e+02 3.415205514492465344e-01 -4.680000000000000000e+02 3.384089465309362277e-01 -4.690000000000000000e+02 3.361808400752953618e-01 -4.700000000000000000e+02 3.338449166956842240e-01 -4.710000000000000000e+02 3.311657795290107731e-01 -4.720000000000000000e+02 3.275213049028709023e-01 -4.730000000000000000e+02 3.239354617756656785e-01 -4.740000000000000000e+02 3.208363739629827571e-01 -4.750000000000000000e+02 3.186696177888769799e-01 -4.760000000000000000e+02 3.161602865869745371e-01 -4.770000000000000000e+02 3.128410256276050738e-01 -4.780000000000000000e+02 3.104662875566143176e-01 -4.790000000000000000e+02 3.090143600831314896e-01 -4.800000000000000000e+02 3.081707598125788539e-01 -4.810000000000000000e+02 3.069198629731377248e-01 -4.820000000000000000e+02 3.019714098310701811e-01 -4.830000000000000000e+02 2.973032450354184952e-01 -4.840000000000000000e+02 2.956908062068524523e-01 -4.850000000000000000e+02 2.947100948529325914e-01 -4.860000000000000000e+02 2.939056685952170511e-01 -4.870000000000000000e+02 2.916286543564557410e-01 -4.880000000000000000e+02 2.870339431469631775e-01 -4.890000000000000000e+02 2.816971438289136986e-01 -4.900000000000000000e+02 2.791004008932900793e-01 -4.910000000000000000e+02 2.802878119207415364e-01 -4.920000000000000000e+02 2.805368097427271001e-01 -4.930000000000000000e+02 2.784182570727317119e-01 -4.940000000000000000e+02 2.753849010497286254e-01 -4.950000000000000000e+02 2.719841364541146778e-01 -4.960000000000000000e+02 2.695455429084538945e-01 -4.970000000000000000e+02 2.678427239474470145e-01 -4.980000000000000000e+02 2.665017100198022737e-01 -4.990000000000000000e+02 2.649065167667907228e-01 -5.000000000000000000e+02 2.625448971300224366e-01 -5.010000000000000000e+02 2.605327268643842786e-01 -5.020000000000000000e+02 2.588775133516937887e-01 -5.030000000000000000e+02 2.567718978178080147e-01 -5.040000000000000000e+02 2.543575805589111116e-01 -5.050000000000000000e+02 2.522306554662914202e-01 -5.060000000000000000e+02 2.508842499016156191e-01 -5.070000000000000000e+02 2.496783842260557051e-01 -5.080000000000000000e+02 2.480466856910102935e-01 -5.090000000000000000e+02 2.465207081940127831e-01 -5.100000000000000000e+02 2.449208617331634363e-01 -5.110000000000000000e+02 2.434411448417727886e-01 -5.120000000000000000e+02 2.420025343302613652e-01 -5.130000000000000000e+02 2.394674880313324705e-01 -5.140000000000000000e+02 2.367835379825995457e-01 -5.150000000000000000e+02 2.353722058444396859e-01 -5.160000000000000000e+02 2.336618640339418185e-01 -5.170000000000000000e+02 2.321268605904972526e-01 -5.180000000000000000e+02 2.304314592746790624e-01 -5.190000000000000000e+02 2.283464729493796530e-01 -5.200000000000000000e+02 2.265780891294194022e-01 -5.210000000000000000e+02 2.256899832125863758e-01 -5.220000000000000000e+02 2.250991244949594738e-01 -5.230000000000000000e+02 2.233560615211991895e-01 -5.240000000000000000e+02 2.215911662546430905e-01 -5.250000000000000000e+02 2.209070846613355177e-01 -5.260000000000000000e+02 2.197276445663630118e-01 -5.270000000000000000e+02 2.190231828766119881e-01 -5.280000000000000000e+02 2.178701800624724405e-01 -5.290000000000000000e+02 2.150125104164173628e-01 -5.300000000000000000e+02 2.125333736501849868e-01 -5.310000000000000000e+02 2.120636993767610057e-01 -5.320000000000000000e+02 2.124650126834856378e-01 -5.330000000000000000e+02 2.114997118427921485e-01 -5.340000000000000000e+02 2.094850735750174442e-01 -5.350000000000000000e+02 2.076346526871917231e-01 -5.360000000000000000e+02 2.052689544373455521e-01 -5.370000000000000000e+02 2.035871992438794964e-01 -5.380000000000000000e+02 2.030179648328740427e-01 -5.390000000000000000e+02 2.017867402520298059e-01 -5.400000000000000000e+02 1.998175876055161004e-01 -5.410000000000000000e+02 1.982126679078189679e-01 -5.420000000000000000e+02 1.968221777258057359e-01 -5.430000000000000000e+02 1.951206513723492408e-01 -5.440000000000000000e+02 1.933572413120855371e-01 -5.450000000000000000e+02 1.924033739507697016e-01 -5.460000000000000000e+02 1.912292451448932284e-01 -5.470000000000000000e+02 1.897415695859978324e-01 -5.480000000000000000e+02 1.884175909126065140e-01 -5.490000000000000000e+02 1.869666203081614686e-01 -5.500000000000000000e+02 1.855619361337265405e-01 -5.510000000000000000e+02 1.845441303939724942e-01 -5.520000000000000000e+02 1.835914214664698674e-01 -5.530000000000000000e+02 1.826191053899133276e-01 -5.540000000000000000e+02 1.814372241223501658e-01 -5.550000000000000000e+02 1.802821089549231093e-01 -5.560000000000000000e+02 1.789652630866330196e-01 -5.570000000000000000e+02 1.778285904912150217e-01 -5.580000000000000000e+02 1.768766064530321314e-01 -5.590000000000000000e+02 1.757726218800563789e-01 -5.600000000000000000e+02 1.741378226592481815e-01 -5.610000000000000000e+02 1.723288261162471136e-01 -5.620000000000000000e+02 1.707501802187501305e-01 -5.630000000000000000e+02 1.696560826079121231e-01 -5.640000000000000000e+02 1.688866431451916950e-01 -5.650000000000000000e+02 1.676131424568440831e-01 -5.660000000000000000e+02 1.660828506312333475e-01 -5.670000000000000000e+02 1.646337159350181323e-01 -5.680000000000000000e+02 1.632198378269752725e-01 -5.690000000000000000e+02 1.623592743612009281e-01 -5.700000000000000000e+02 1.617382098917645727e-01 -5.710000000000000000e+02 1.607528905989208667e-01 -5.720000000000000000e+02 1.594418388929920716e-01 -5.730000000000000000e+02 1.581722095854678212e-01 -5.740000000000000000e+02 1.569735905444122337e-01 -5.750000000000000000e+02 1.559091853012824491e-01 -5.760000000000000000e+02 1.549316713274414004e-01 -5.770000000000000000e+02 1.535227930799748230e-01 -5.780000000000000000e+02 1.519361704420207348e-01 -5.790000000000000000e+02 1.506882691193676127e-01 -5.800000000000000000e+02 1.491550228204485962e-01 -5.810000000000000000e+02 1.472755598602591975e-01 -5.820000000000000000e+02 1.458910722211179678e-01 -5.830000000000000000e+02 1.445061541950944106e-01 -5.840000000000000000e+02 1.432251686690005632e-01 -5.850000000000000000e+02 1.417824358351622016e-01 -5.860000000000000000e+02 1.407177299135873028e-01 -5.870000000000000000e+02 1.395365186160640036e-01 -5.880000000000000000e+02 1.386613500714227454e-01 -5.890000000000000000e+02 1.376856108123127864e-01 -5.900000000000000000e+02 1.371074581111847712e-01 -5.910000000000000000e+02 1.358785692803984035e-01 -5.920000000000000000e+02 1.347587844386158584e-01 -5.930000000000000000e+02 1.339446389066242249e-01 -5.940000000000000000e+02 1.328714086248795612e-01 -5.950000000000000000e+02 1.303082016745845950e-01 -5.960000000000000000e+02 1.280845601150825963e-01 -5.970000000000000000e+02 1.257039358822217012e-01 -5.980000000000000000e+02 1.232436776011627821e-01 -5.990000000000000000e+02 1.205046803707603698e-01 -6.000000000000000000e+02 1.182720193486171689e-01 -6.010000000000000000e+02 1.160052597216233439e-01 -6.020000000000000000e+02 1.129659906267471703e-01 -6.030000000000000000e+02 1.106328400783497257e-01 -6.040000000000000000e+02 1.097242059362349836e-01 -6.050000000000000000e+02 1.081873105499707999e-01 -6.060000000000000000e+02 1.057636530345747450e-01 -6.070000000000000000e+02 1.053256949202308473e-01 -6.080000000000000000e+02 1.042384655554098039e-01 -6.090000000000000000e+02 1.014123589208693055e-01 -6.100000000000000000e+02 1.002267225271305517e-01 -6.110000000000000000e+02 9.796249555250345631e-02 -6.120000000000000000e+02 9.572763560385537385e-02 -6.130000000000000000e+02 9.376457849802230515e-02 -6.140000000000000000e+02 9.194063446381861571e-02 -6.150000000000000000e+02 9.018079583129121057e-02 -6.160000000000000000e+02 8.684672437258034172e-02 -6.170000000000000000e+02 8.513035175552598199e-02 -6.180000000000000000e+02 8.457769811552133532e-02 -6.190000000000000000e+02 8.124867691737501507e-02 -6.200000000000000000e+02 8.083303141529971092e-02 -6.210000000000000000e+02 7.969580623993287316e-02 -6.220000000000000000e+02 7.807788370960067059e-02 -6.230000000000000000e+02 7.588536004885376718e-02 -6.240000000000000000e+02 7.465648723171451617e-02 -6.250000000000000000e+02 7.293219633282768677e-02 -6.260000000000000000e+02 7.102910568592249452e-02 -6.270000000000000000e+02 6.823992446657642374e-02 -6.280000000000000000e+02 6.729404339639416532e-02 -6.290000000000000000e+02 6.570446276328731350e-02 -6.300000000000000000e+02 6.389084977333474302e-02 -6.310000000000000000e+02 6.167264304752995835e-02 -6.320000000000000000e+02 6.168744106786816506e-02 -6.330000000000000000e+02 6.149270221404462555e-02 -6.340000000000000000e+02 6.018832858602345126e-02 -6.350000000000000000e+02 5.800737047095026050e-02 -6.360000000000000000e+02 5.912179117724896543e-02 -6.370000000000000000e+02 5.654270805248425708e-02 -6.380000000000000000e+02 5.412364314191689396e-02 -6.390000000000000000e+02 5.066405966988099530e-02 -6.400000000000000000e+02 4.870174645719493878e-02 -6.410000000000000000e+02 4.809799948468499592e-02 -6.420000000000000000e+02 4.775645758073446961e-02 -6.430000000000000000e+02 5.032795678436362968e-02 -6.440000000000000000e+02 5.380941097176278332e-02 -6.450000000000000000e+02 5.003574563882724757e-02 -6.460000000000000000e+02 4.687504817622907549e-02 -6.470000000000000000e+02 4.278333113019516104e-02 -6.480000000000000000e+02 4.038501734549286570e-02 -6.490000000000000000e+02 3.734994413927558016e-02 -6.500000000000000000e+02 3.159026823157892738e-02 -6.510000000000000000e+02 2.552501180555797472e-02 -6.520000000000000000e+02 1.840569895823435803e-02 -6.530000000000000000e+02 1.095708058464484394e-02 -6.540000000000000000e+02 8.546557230822095577e-03 -6.550000000000000000e+02 8.958049086387047735e-03 -6.560000000000000000e+02 9.449554893691874610e-03 -6.570000000000000000e+02 9.882699255074307160e-03 -6.580000000000000000e+02 1.053704001307656860e-02 -6.590000000000000000e+02 1.126777823618900325e-02 -6.600000000000000000e+02 1.222589539075055742e-02 -6.610000000000000000e+02 1.334616941659527885e-02 -6.620000000000000000e+02 1.414199728570622941e-02 -6.630000000000000000e+02 1.523066274219376376e-02 -6.640000000000000000e+02 1.656803737484623118e-02 -6.650000000000000000e+02 1.791816523222217183e-02 -6.660000000000000000e+02 1.946047719303312801e-02 -6.670000000000000000e+02 2.016747267923760939e-02 -6.680000000000000000e+02 2.075530070851973330e-02 -6.690000000000000000e+02 2.207424218040054606e-02 -6.700000000000000000e+02 2.347914200244569094e-02 -6.710000000000000000e+02 2.611735269247505986e-02 -6.720000000000000000e+02 3.115979221791311329e-02 -6.730000000000000000e+02 3.542261050738817335e-02 -6.740000000000000000e+02 3.838780755210113166e-02 -6.750000000000000000e+02 4.342362526503897036e-02 -6.760000000000000000e+02 4.939630041023400364e-02 -6.770000000000000000e+02 5.373615578630489692e-02 -6.780000000000000000e+02 5.592804575849290305e-02 -6.790000000000000000e+02 5.499742458285750840e-02 -6.800000000000000000e+02 6.175563369688819026e-02 -6.810000000000000000e+02 6.054550042609304489e-02 -6.820000000000000000e+02 5.932669376852171828e-02 -6.830000000000000000e+02 6.079455649472691181e-02 -6.840000000000000000e+02 1.053535976490686116e-02 -6.850000000000000000e+02 -3.669168823655337419e-02 -6.860000000000000000e+02 -8.564000370867089207e-02 -6.870000000000000000e+02 -1.335350554003449097e-01 -6.880000000000000000e+02 -1.784736175504070266e-01 -6.890000000000000000e+02 -2.322038120760240298e-01 -6.900000000000000000e+02 -2.806830911676423401e-01 -6.910000000000000000e+02 -3.284996786866697938e-01 -6.920000000000000000e+02 -3.778162718497888317e-01 -6.930000000000000000e+02 -3.776943659534208186e-01 -6.940000000000000000e+02 -3.809622962482322461e-01 -6.950000000000000000e+02 -3.809622962482322461e-01 -6.960000000000000000e+02 -3.809622962482322461e-01 -6.970000000000000000e+02 -3.809622962482322461e-01 -6.980000000000000000e+02 -3.809622962482322461e-01 -6.990000000000000000e+02 -3.809622962482322461e-01 -7.000000000000000000e+02 -3.809622962482322461e-01 -7.010000000000000000e+02 -3.809622962482322461e-01 -7.020000000000000000e+02 -3.809622962482322461e-01 -7.030000000000000000e+02 -3.809622962482322461e-01 -7.040000000000000000e+02 -3.809622962482322461e-01 -7.050000000000000000e+02 -3.809622962482322461e-01 -7.060000000000000000e+02 -3.809622962482322461e-01 -7.070000000000000000e+02 -3.809622962482322461e-01 -7.080000000000000000e+02 -3.809622962482322461e-01 -7.090000000000000000e+02 -3.809622962482322461e-01 -7.100000000000000000e+02 -3.809622962482322461e-01 -7.110000000000000000e+02 -3.809622962482322461e-01 -7.120000000000000000e+02 -3.809622962482322461e-01 -7.130000000000000000e+02 -3.809622962482322461e-01 -7.140000000000000000e+02 -3.809622962482322461e-01 -7.150000000000000000e+02 -3.809622962482322461e-01 -7.160000000000000000e+02 -3.809622962482322461e-01 -7.170000000000000000e+02 -3.809622962482322461e-01 -7.180000000000000000e+02 -3.809622962482322461e-01 -7.190000000000000000e+02 -3.809622962482322461e-01 -7.200000000000000000e+02 -3.809622962482322461e-01 -7.210000000000000000e+02 -3.809622962482322461e-01 -7.220000000000000000e+02 -3.809622962482322461e-01 -7.230000000000000000e+02 -3.809622962482322461e-01 -7.240000000000000000e+02 -3.809622962482322461e-01 -7.250000000000000000e+02 -3.809622962482322461e-01 -7.260000000000000000e+02 -3.809622962482322461e-01 -7.270000000000000000e+02 -3.809622962482322461e-01 -7.280000000000000000e+02 -3.809622962482322461e-01 -7.290000000000000000e+02 -3.809622962482322461e-01 -7.300000000000000000e+02 -3.809622962482322461e-01 -7.310000000000000000e+02 -3.809622962482322461e-01 -7.320000000000000000e+02 -3.809622962482322461e-01 -7.330000000000000000e+02 -3.809622962482322461e-01 -7.340000000000000000e+02 -3.809622962482322461e-01 -7.350000000000000000e+02 -3.809622962482322461e-01 -7.360000000000000000e+02 -3.809622962482322461e-01 -7.370000000000000000e+02 -3.809622962482322461e-01 -7.380000000000000000e+02 -3.809622962482322461e-01 -7.390000000000000000e+02 -3.809622962482322461e-01 -7.400000000000000000e+02 -3.809622962482322461e-01 -7.410000000000000000e+02 -3.809622962482322461e-01 -7.420000000000000000e+02 -3.809622962482322461e-01 -7.430000000000000000e+02 -3.809622962482322461e-01 -7.440000000000000000e+02 -3.809622962482322461e-01 -7.450000000000000000e+02 -3.809622962482322461e-01 -7.460000000000000000e+02 -3.809622962482322461e-01 -7.470000000000000000e+02 -3.809622962482322461e-01 -7.480000000000000000e+02 -3.809622962482322461e-01 -7.490000000000000000e+02 -3.809622962482322461e-01 -7.500000000000000000e+02 -3.809622962482322461e-01 -7.510000000000000000e+02 -3.809622962482322461e-01 -7.520000000000000000e+02 -3.809622962482322461e-01 -7.530000000000000000e+02 -3.809622962482322461e-01 -7.540000000000000000e+02 -3.809622962482322461e-01 -7.550000000000000000e+02 -3.809622962482322461e-01 -7.560000000000000000e+02 -3.809622962482322461e-01 -7.570000000000000000e+02 -3.809622962482322461e-01 -7.580000000000000000e+02 -3.809622962482322461e-01 -7.590000000000000000e+02 -3.809622962482322461e-01 -7.600000000000000000e+02 -3.809622962482322461e-01 -7.610000000000000000e+02 -3.809622962482322461e-01 -7.620000000000000000e+02 -3.809622962482322461e-01 -7.630000000000000000e+02 -3.809622962482322461e-01 -7.640000000000000000e+02 -3.809622962482322461e-01 -7.650000000000000000e+02 -3.809622962482322461e-01 -7.660000000000000000e+02 -3.809622962482322461e-01 -7.670000000000000000e+02 -3.809622962482322461e-01 -7.680000000000000000e+02 -3.809622962482322461e-01 -7.690000000000000000e+02 -3.809622962482322461e-01 -7.700000000000000000e+02 -3.809622962482322461e-01 -7.710000000000000000e+02 -3.809622962482322461e-01 -7.720000000000000000e+02 -3.809622962482322461e-01 -7.730000000000000000e+02 -3.809622962482322461e-01 -7.740000000000000000e+02 -3.809622962482322461e-01 -7.750000000000000000e+02 -3.809622962482322461e-01 -7.760000000000000000e+02 -3.809622962482322461e-01 -7.770000000000000000e+02 -3.809622962482322461e-01 -7.780000000000000000e+02 -3.809622962482322461e-01 -7.790000000000000000e+02 -3.809622962482322461e-01 -7.800000000000000000e+02 -3.809622962482322461e-01 -7.810000000000000000e+02 -3.809622962482322461e-01 -7.820000000000000000e+02 -3.809622962482322461e-01 -7.830000000000000000e+02 -3.809622962482322461e-01 -7.840000000000000000e+02 -3.809622962482322461e-01 -7.850000000000000000e+02 -3.809622962482322461e-01 -7.860000000000000000e+02 -3.809622962482322461e-01 -7.870000000000000000e+02 -3.809622962482322461e-01 -7.880000000000000000e+02 -3.809622962482322461e-01 -7.890000000000000000e+02 -3.809622962482322461e-01 -7.900000000000000000e+02 -3.809622962482322461e-01 -7.910000000000000000e+02 -3.809622962482322461e-01 -7.920000000000000000e+02 -3.809622962482322461e-01 -7.930000000000000000e+02 -3.809622962482322461e-01 -7.940000000000000000e+02 -3.809622962482322461e-01 -7.950000000000000000e+02 -3.809622962482322461e-01 -7.960000000000000000e+02 -3.809622962482322461e-01 -7.970000000000000000e+02 -3.809622962482322461e-01 -7.980000000000000000e+02 -3.809622962482322461e-01 -7.990000000000000000e+02 -3.809622962482322461e-01 -8.000000000000000000e+02 -3.809622962482322461e-01 -8.010000000000000000e+02 -3.809622962482322461e-01 -8.020000000000000000e+02 -3.809622962482322461e-01 -8.030000000000000000e+02 -3.809622962482322461e-01 -8.040000000000000000e+02 -3.809622962482322461e-01 -8.050000000000000000e+02 -3.809622962482322461e-01 -8.060000000000000000e+02 -3.809622962482322461e-01 -8.070000000000000000e+02 -3.809622962482322461e-01 -8.080000000000000000e+02 -3.809622962482322461e-01 -8.090000000000000000e+02 -3.809622962482322461e-01 -8.100000000000000000e+02 -3.809622962482322461e-01 -8.110000000000000000e+02 -3.809622962482322461e-01 -8.120000000000000000e+02 -3.809622962482322461e-01 -8.130000000000000000e+02 -3.809622962482322461e-01 -8.140000000000000000e+02 -3.809622962482322461e-01 -8.150000000000000000e+02 -3.809622962482322461e-01 -8.160000000000000000e+02 -3.809622962482322461e-01 -8.170000000000000000e+02 -3.809622962482322461e-01 -8.180000000000000000e+02 -3.809622962482322461e-01 -8.190000000000000000e+02 -3.809622962482322461e-01 -8.200000000000000000e+02 -3.809622962482322461e-01 -8.210000000000000000e+02 -3.809622962482322461e-01 -8.220000000000000000e+02 -3.809622962482322461e-01 -8.230000000000000000e+02 -3.809622962482322461e-01 -8.240000000000000000e+02 -3.809622962482322461e-01 -8.250000000000000000e+02 -3.809622962482322461e-01 -8.260000000000000000e+02 -3.809622962482322461e-01 -8.270000000000000000e+02 -3.809622962482322461e-01 -8.280000000000000000e+02 -3.809622962482322461e-01 -8.290000000000000000e+02 -3.809622962482322461e-01 -8.300000000000000000e+02 -3.809622962482322461e-01 -8.310000000000000000e+02 -3.809622962482322461e-01 -8.320000000000000000e+02 -3.809622962482322461e-01 -8.330000000000000000e+02 -3.809622962482322461e-01 -8.340000000000000000e+02 -3.809622962482322461e-01 -8.350000000000000000e+02 -3.809622962482322461e-01 -8.360000000000000000e+02 -3.809622962482322461e-01 -8.370000000000000000e+02 -3.809622962482322461e-01 -8.380000000000000000e+02 -3.809622962482322461e-01 -8.390000000000000000e+02 -3.809622962482322461e-01 -8.400000000000000000e+02 -3.809622962482322461e-01 -8.410000000000000000e+02 -3.809622962482322461e-01 -8.420000000000000000e+02 -3.809622962482322461e-01 -8.430000000000000000e+02 -3.809622962482322461e-01 -8.440000000000000000e+02 -3.809622962482322461e-01 -8.450000000000000000e+02 -3.809622962482322461e-01 -8.460000000000000000e+02 -3.809622962482322461e-01 -8.470000000000000000e+02 -3.809622962482322461e-01 -8.480000000000000000e+02 -3.809622962482322461e-01 -8.490000000000000000e+02 -3.809622962482322461e-01 -8.500000000000000000e+02 -3.809622962482322461e-01 -8.510000000000000000e+02 -3.809622962482322461e-01 -8.520000000000000000e+02 -3.809622962482322461e-01 -8.530000000000000000e+02 -3.809622962482322461e-01 -8.540000000000000000e+02 -3.809622962482322461e-01 -8.550000000000000000e+02 -3.809622962482322461e-01 -8.560000000000000000e+02 -3.809622962482322461e-01 -8.570000000000000000e+02 -3.809622962482322461e-01 -8.580000000000000000e+02 -3.809622962482322461e-01 -8.590000000000000000e+02 -3.809622962482322461e-01 -8.600000000000000000e+02 -3.809622962482322461e-01 -8.610000000000000000e+02 -3.809622962482322461e-01 -8.620000000000000000e+02 -3.809622962482322461e-01 -8.630000000000000000e+02 -3.809622962482322461e-01 -8.640000000000000000e+02 -3.809622962482322461e-01 -8.650000000000000000e+02 -3.809622962482322461e-01 -8.660000000000000000e+02 -3.809622962482322461e-01 -8.670000000000000000e+02 -3.809622962482322461e-01 -8.680000000000000000e+02 -3.809622962482322461e-01 -8.690000000000000000e+02 -3.809622962482322461e-01 -8.700000000000000000e+02 -3.809622962482322461e-01 -8.710000000000000000e+02 -3.809622962482322461e-01 -8.720000000000000000e+02 -3.809622962482322461e-01 -8.730000000000000000e+02 -3.809622962482322461e-01 -8.740000000000000000e+02 -3.809622962482322461e-01 -8.750000000000000000e+02 -3.809622962482322461e-01 -8.760000000000000000e+02 -3.809622962482322461e-01 -8.770000000000000000e+02 -3.809622962482322461e-01 -8.780000000000000000e+02 -3.809622962482322461e-01 -8.790000000000000000e+02 -3.809622962482322461e-01 -8.800000000000000000e+02 -3.809622962482322461e-01 -8.810000000000000000e+02 -3.809622962482322461e-01 -8.820000000000000000e+02 -3.809622962482322461e-01 -8.830000000000000000e+02 -3.809622962482322461e-01 -8.840000000000000000e+02 -3.809622962482322461e-01 -8.850000000000000000e+02 -3.809622962482322461e-01 -8.860000000000000000e+02 -3.809622962482322461e-01 -8.870000000000000000e+02 -3.809622962482322461e-01 -8.880000000000000000e+02 -3.809622962482322461e-01 -8.890000000000000000e+02 -3.809622962482322461e-01 -8.900000000000000000e+02 -3.809622962482322461e-01 -8.910000000000000000e+02 -3.809622962482322461e-01 -8.920000000000000000e+02 -3.809622962482322461e-01 -8.930000000000000000e+02 -3.809622962482322461e-01 -8.940000000000000000e+02 -3.809622962482322461e-01 -8.950000000000000000e+02 -3.809622962482322461e-01 -8.960000000000000000e+02 -3.809622962482322461e-01 -8.970000000000000000e+02 -3.809622962482322461e-01 -8.980000000000000000e+02 -3.809622962482322461e-01 -8.990000000000000000e+02 -3.809622962482322461e-01 -9.000000000000000000e+02 -3.809622962482322461e-01 -9.010000000000000000e+02 -3.809622962482322461e-01 -9.020000000000000000e+02 -3.809622962482322461e-01 -9.030000000000000000e+02 -3.809622962482322461e-01 -9.040000000000000000e+02 -3.809622962482322461e-01 -9.050000000000000000e+02 -3.809622962482322461e-01 -9.060000000000000000e+02 -3.809622962482322461e-01 -9.070000000000000000e+02 -3.809622962482322461e-01 -9.080000000000000000e+02 -3.809622962482322461e-01 -9.090000000000000000e+02 -3.809622962482322461e-01 -9.100000000000000000e+02 -3.809622962482322461e-01 -9.110000000000000000e+02 -3.809622962482322461e-01 -9.120000000000000000e+02 -3.809622962482322461e-01 -9.130000000000000000e+02 -3.809622962482322461e-01 -9.140000000000000000e+02 -3.809622962482322461e-01 -9.150000000000000000e+02 -3.809622962482322461e-01 -9.160000000000000000e+02 -3.809622962482322461e-01 -9.170000000000000000e+02 -3.809622962482322461e-01 -9.180000000000000000e+02 -3.809622962482322461e-01 -9.190000000000000000e+02 -3.809622962482322461e-01 -9.200000000000000000e+02 -3.809622962482322461e-01 -9.210000000000000000e+02 -3.809622962482322461e-01 -9.220000000000000000e+02 -3.809622962482322461e-01 -9.230000000000000000e+02 -3.809622962482322461e-01 -9.240000000000000000e+02 -3.809622962482322461e-01 -9.250000000000000000e+02 -3.809622962482322461e-01 -9.260000000000000000e+02 -3.809622962482322461e-01 -9.270000000000000000e+02 -3.809622962482322461e-01 -9.280000000000000000e+02 -3.809622962482322461e-01 -9.290000000000000000e+02 -3.809622962482322461e-01 -9.300000000000000000e+02 -3.809622962482322461e-01 -9.310000000000000000e+02 -3.809622962482322461e-01 -9.320000000000000000e+02 -3.809622962482322461e-01 -9.330000000000000000e+02 -3.809622962482322461e-01 -9.340000000000000000e+02 -3.809622962482322461e-01 -9.350000000000000000e+02 -3.809622962482322461e-01 -9.360000000000000000e+02 -3.809622962482322461e-01 -9.370000000000000000e+02 -3.809622962482322461e-01 -9.380000000000000000e+02 -3.809622962482322461e-01 -9.390000000000000000e+02 -3.809622962482322461e-01 -9.400000000000000000e+02 -3.809622962482322461e-01 -9.410000000000000000e+02 -3.809622962482322461e-01 -9.420000000000000000e+02 -3.809622962482322461e-01 -9.430000000000000000e+02 -3.809622962482322461e-01 -9.440000000000000000e+02 -3.809622962482322461e-01 -9.450000000000000000e+02 -3.809622962482322461e-01 -9.460000000000000000e+02 -3.809622962482322461e-01 -9.470000000000000000e+02 -3.809622962482322461e-01 -9.480000000000000000e+02 -3.809622962482322461e-01 -9.490000000000000000e+02 -3.809622962482322461e-01 -9.500000000000000000e+02 -3.809622962482322461e-01 -9.510000000000000000e+02 -3.809622962482322461e-01 -9.520000000000000000e+02 -3.809622962482322461e-01 -9.530000000000000000e+02 -3.809622962482322461e-01 -9.540000000000000000e+02 -3.809622962482322461e-01 -9.550000000000000000e+02 -3.809622962482322461e-01 -9.560000000000000000e+02 -3.809622962482322461e-01 -9.570000000000000000e+02 -3.809622962482322461e-01 -9.580000000000000000e+02 -3.809622962482322461e-01 -9.590000000000000000e+02 -3.809622962482322461e-01 -9.600000000000000000e+02 -3.809622962482322461e-01 -9.610000000000000000e+02 -3.809622962482322461e-01 -9.620000000000000000e+02 -3.809622962482322461e-01 -9.630000000000000000e+02 -3.809622962482322461e-01 -9.640000000000000000e+02 -3.809622962482322461e-01 -9.650000000000000000e+02 -3.809622962482322461e-01 -9.660000000000000000e+02 -3.809622962482322461e-01 -9.670000000000000000e+02 -3.809622962482322461e-01 -9.680000000000000000e+02 -3.809622962482322461e-01 -9.690000000000000000e+02 -3.809622962482322461e-01 -9.700000000000000000e+02 -3.809622962482322461e-01 -9.710000000000000000e+02 -3.809622962482322461e-01 -9.720000000000000000e+02 -3.809622962482322461e-01 -9.730000000000000000e+02 -3.809622962482322461e-01 -9.740000000000000000e+02 -3.809622962482322461e-01 -9.750000000000000000e+02 -3.809622962482322461e-01 -9.760000000000000000e+02 -3.809622962482322461e-01 -9.770000000000000000e+02 -3.809622962482322461e-01 -9.780000000000000000e+02 -3.809622962482322461e-01 -9.790000000000000000e+02 -3.809622962482322461e-01 -9.800000000000000000e+02 -3.809622962482322461e-01 -9.810000000000000000e+02 -3.809622962482322461e-01 -9.820000000000000000e+02 -3.809622962482322461e-01 -9.830000000000000000e+02 -3.809622962482322461e-01 -9.840000000000000000e+02 -3.809622962482322461e-01 -9.850000000000000000e+02 -3.809622962482322461e-01 -9.860000000000000000e+02 -3.809622962482322461e-01 -9.870000000000000000e+02 -3.809622962482322461e-01 -9.880000000000000000e+02 -3.809622962482322461e-01 -9.890000000000000000e+02 -3.809622962482322461e-01 -9.900000000000000000e+02 -3.809622962482322461e-01 -9.910000000000000000e+02 -3.809622962482322461e-01 -9.920000000000000000e+02 -3.809622962482322461e-01 -9.930000000000000000e+02 -3.809622962482322461e-01 -9.940000000000000000e+02 -3.809622962482322461e-01 -9.950000000000000000e+02 -3.809622962482322461e-01 -9.960000000000000000e+02 -3.809622962482322461e-01 -9.970000000000000000e+02 -3.809622962482322461e-01 -9.980000000000000000e+02 -3.809622962482322461e-01 -9.990000000000000000e+02 -3.809622962482322461e-01 -1.000000000000000000e+03 -3.809622962482322461e-01 -1.001000000000000000e+03 -3.809622962482322461e-01 -1.002000000000000000e+03 -3.809622962482322461e-01 -1.003000000000000000e+03 -3.809622962482322461e-01 -1.004000000000000000e+03 -3.809622962482322461e-01 -1.005000000000000000e+03 -3.809622962482322461e-01 -1.006000000000000000e+03 -3.809622962482322461e-01 -1.007000000000000000e+03 -3.809622962482322461e-01 -1.008000000000000000e+03 -3.809622962482322461e-01 -1.009000000000000000e+03 -3.809622962482322461e-01 -1.010000000000000000e+03 -3.809622962482322461e-01 -1.011000000000000000e+03 -3.809622962482322461e-01 -1.012000000000000000e+03 -3.809622962482322461e-01 -1.013000000000000000e+03 -3.809622962482322461e-01 -1.014000000000000000e+03 -3.809622962482322461e-01 -1.015000000000000000e+03 -3.809622962482322461e-01 -1.016000000000000000e+03 -3.809622962482322461e-01 -1.017000000000000000e+03 -3.809622962482322461e-01 -1.018000000000000000e+03 -3.809622962482322461e-01 -1.019000000000000000e+03 -3.809622962482322461e-01 -1.020000000000000000e+03 -3.809622962482322461e-01 -1.021000000000000000e+03 -3.809622962482322461e-01 -1.022000000000000000e+03 -3.809622962482322461e-01 -1.023000000000000000e+03 -3.809622962482322461e-01 -1.024000000000000000e+03 -3.809622962482322461e-01 -1.025000000000000000e+03 -3.809622962482322461e-01 -1.026000000000000000e+03 -3.809622962482322461e-01 -1.027000000000000000e+03 -3.809622962482322461e-01 -1.028000000000000000e+03 -3.809622962482322461e-01 -1.029000000000000000e+03 -3.809622962482322461e-01 -1.030000000000000000e+03 -3.809622962482322461e-01 -1.031000000000000000e+03 -3.809622962482322461e-01 -1.032000000000000000e+03 -3.809622962482322461e-01 -1.033000000000000000e+03 -3.809622962482322461e-01 -1.034000000000000000e+03 -3.809622962482322461e-01 -1.035000000000000000e+03 -3.809622962482322461e-01 -1.036000000000000000e+03 -3.809622962482322461e-01 -1.037000000000000000e+03 -3.809622962482322461e-01 -1.038000000000000000e+03 -3.809622962482322461e-01 -1.039000000000000000e+03 -3.809622962482322461e-01 -1.040000000000000000e+03 -3.809622962482322461e-01 -1.041000000000000000e+03 -3.809622962482322461e-01 -1.042000000000000000e+03 -3.809622962482322461e-01 -1.043000000000000000e+03 -3.809622962482322461e-01 -1.044000000000000000e+03 -3.809622962482322461e-01 -1.045000000000000000e+03 -3.809622962482322461e-01 -1.046000000000000000e+03 -3.809622962482322461e-01 -1.047000000000000000e+03 -3.809622962482322461e-01 -1.048000000000000000e+03 -3.809622962482322461e-01 -1.049000000000000000e+03 -3.809622962482322461e-01 -1.050000000000000000e+03 -3.809622962482322461e-01 -1.051000000000000000e+03 -3.809622962482322461e-01 -1.052000000000000000e+03 -3.809622962482322461e-01 -1.053000000000000000e+03 -3.809622962482322461e-01 -1.054000000000000000e+03 -3.809622962482322461e-01 -1.055000000000000000e+03 -3.809622962482322461e-01 -1.056000000000000000e+03 -3.809622962482322461e-01 -1.057000000000000000e+03 -3.809622962482322461e-01 -1.058000000000000000e+03 -3.809622962482322461e-01 -1.059000000000000000e+03 -3.809622962482322461e-01 -1.060000000000000000e+03 -3.809622962482322461e-01 -1.061000000000000000e+03 -3.809622962482322461e-01 -1.062000000000000000e+03 -3.809622962482322461e-01 -1.063000000000000000e+03 -3.809622962482322461e-01 -1.064000000000000000e+03 -3.809622962482322461e-01 -1.065000000000000000e+03 -3.809622962482322461e-01 -1.066000000000000000e+03 -3.809622962482322461e-01 -1.067000000000000000e+03 -3.809622962482322461e-01 -1.068000000000000000e+03 -3.809622962482322461e-01 -1.069000000000000000e+03 -3.809622962482322461e-01 -1.070000000000000000e+03 -3.809622962482322461e-01 -1.071000000000000000e+03 -3.809622962482322461e-01 -1.072000000000000000e+03 -3.809622962482322461e-01 -1.073000000000000000e+03 -3.809622962482322461e-01 -1.074000000000000000e+03 -3.809622962482322461e-01 -1.075000000000000000e+03 -3.809622962482322461e-01 -1.076000000000000000e+03 -3.809622962482322461e-01 -1.077000000000000000e+03 -3.809622962482322461e-01 -1.078000000000000000e+03 -3.809622962482322461e-01 -1.079000000000000000e+03 -3.809622962482322461e-01 -1.080000000000000000e+03 -3.809622962482322461e-01 -1.081000000000000000e+03 -3.809622962482322461e-01 -1.082000000000000000e+03 -3.809622962482322461e-01 -1.083000000000000000e+03 -3.809622962482322461e-01 -1.084000000000000000e+03 -3.809622962482322461e-01 -1.085000000000000000e+03 -3.809622962482322461e-01 -1.086000000000000000e+03 -3.809622962482322461e-01 -1.087000000000000000e+03 -3.809622962482322461e-01 -1.088000000000000000e+03 -3.809622962482322461e-01 -1.089000000000000000e+03 -3.809622962482322461e-01 -1.090000000000000000e+03 -3.809622962482322461e-01 -1.091000000000000000e+03 -3.809622962482322461e-01 -1.092000000000000000e+03 -3.809622962482322461e-01 -1.093000000000000000e+03 -3.809622962482322461e-01 -1.094000000000000000e+03 -3.809622962482322461e-01 -1.095000000000000000e+03 -3.809622962482322461e-01 -1.096000000000000000e+03 -3.809622962482319686e-01 -1.097000000000000000e+03 -3.809622962482319686e-01 -1.098000000000000000e+03 -3.809622962482319686e-01 -1.099000000000000000e+03 -3.809622962482319686e-01 diff --git a/spectractor/extractor/dispersers/holo4_003/ratio_order_3over2.txt b/spectractor/extractor/dispersers/holo4_003/ratio_order_3over2.txt deleted file mode 100644 index dda2e3d92..000000000 --- a/spectractor/extractor/dispersers/holo4_003/ratio_order_3over2.txt +++ /dev/null @@ -1,800 +0,0 @@ -3.000000000000000000e+02 6.509725923171346018e+00 -3.010000000000000000e+02 1.156983590235709514e+01 -3.020000000000000000e+02 2.065892767125739837e+01 -3.030000000000000000e+02 3.266384599854518456e+01 -3.040000000000000000e+02 3.688427015932408182e+01 -3.050000000000000000e+02 2.955846253730900131e+01 -3.060000000000000000e+02 2.086079963948771621e+01 -3.070000000000000000e+02 1.483391093997127363e+01 -3.080000000000000000e+02 1.101253581269824622e+01 -3.090000000000000000e+02 8.543345874672958473e+00 -3.100000000000000000e+02 6.879515790464199476e+00 -3.110000000000000000e+02 5.709608451523049411e+00 -3.120000000000000000e+02 4.855338801222115030e+00 -3.130000000000000000e+02 4.211091270164593503e+00 -3.140000000000000000e+02 3.711767709806035320e+00 -3.150000000000000000e+02 3.315685161054438446e+00 -3.160000000000000000e+02 2.995214546596440375e+00 -3.170000000000000000e+02 2.731470209997443721e+00 -3.180000000000000000e+02 2.511187170917052569e+00 -3.190000000000000000e+02 2.324821673858040505e+00 -3.200000000000000000e+02 2.165359445266830996e+00 -3.210000000000000000e+02 2.027546656272186887e+00 -3.220000000000000000e+02 1.907380888083412884e+00 -3.230000000000000000e+02 1.801766370524660932e+00 -3.240000000000000000e+02 1.708275577335355067e+00 -3.250000000000000000e+02 1.624981230221655082e+00 -3.260000000000000000e+02 1.550335869337169825e+00 -3.270000000000000000e+02 1.483084159928695689e+00 -3.280000000000000000e+02 1.422198114662133195e+00 -3.290000000000000000e+02 1.366828609434258768e+00 -3.300000000000000000e+02 1.316268651832293690e+00 -3.310000000000000000e+02 1.269925240112287579e+00 -3.320000000000000000e+02 1.227297578953946422e+00 -3.330000000000000000e+02 1.187960052992033333e+00 -3.340000000000000000e+02 1.151548799291647995e+00 -3.350000000000000000e+02 1.117751029224237636e+00 -3.360000000000000000e+02 1.086296470221350230e+00 -3.370000000000000000e+02 1.056950456212043310e+00 -3.380000000000000000e+02 1.029508310721562347e+00 -3.390000000000000000e+02 1.003790751240222878e+00 -3.400000000000000000e+02 9.796401062565228690e-01 -3.410000000000000000e+02 9.569171833460039522e-01 -3.420000000000000000e+02 9.354986621867263930e-01 -3.430000000000000000e+02 9.152749133711250984e-01 -3.440000000000000000e+02 8.961481645859491474e-01 -3.450000000000000000e+02 8.780309517196009939e-01 -3.460000000000000000e+02 8.608448048873430514e-01 -3.470000000000000000e+02 8.445191290942747342e-01 -3.480000000000000000e+02 8.289902469153803688e-01 -3.490000000000000000e+02 8.142005766414438517e-01 -3.500000000000000000e+02 8.000979241709312850e-01 -3.510000000000000000e+02 7.866348707990169498e-01 -3.520000000000000000e+02 7.737682421688460987e-01 -3.530000000000000000e+02 7.614586461696587483e-01 -3.540000000000000000e+02 7.496700696129982022e-01 -3.550000000000000000e+02 7.383695251887274491e-01 -3.560000000000000000e+02 7.275267415721883291e-01 -3.570000000000000000e+02 7.171138906805679669e-01 -3.580000000000000000e+02 7.071053470080953529e-01 -3.590000000000000000e+02 6.974774747419761889e-01 -3.600000000000000000e+02 6.882084390034897137e-01 -3.610000000000000000e+02 6.792780380986728206e-01 -3.620000000000000000e+02 6.706675541072550928e-01 -3.630000000000000000e+02 6.623596195251194585e-01 -3.640000000000000000e+02 6.543380979885390358e-01 -3.650000000000000000e+02 6.465879773821993082e-01 -3.660000000000000000e+02 6.390952738614180673e-01 -3.670000000000000000e+02 6.318469455143372882e-01 -3.680000000000000000e+02 6.248308145566628946e-01 -3.690000000000000000e+02 6.180354970939593295e-01 -3.700000000000000000e+02 6.114503396089747689e-01 -3.710000000000000000e+02 6.050653614366442445e-01 -3.720000000000000000e+02 5.988712025800647654e-01 -3.730000000000000000e+02 5.928590762992315133e-01 -3.740000000000000000e+02 5.870207259720922055e-01 -3.750000000000000000e+02 5.813483857864492066e-01 -3.760000000000000000e+02 5.758347448724864259e-01 -3.770000000000000000e+02 5.704729145303520932e-01 -3.780000000000000000e+02 5.652563982462379677e-01 -3.790000000000000000e+02 5.601790642245236818e-01 -3.800000000000000000e+02 5.552351201935545877e-01 -3.810000000000000000e+02 5.504190902687762232e-01 -3.820000000000000000e+02 5.457257936802333287e-01 -3.830000000000000000e+02 5.411503251916882640e-01 -3.840000000000000000e+02 5.366880370567861380e-01 -3.850000000000000000e+02 5.323345223733942921e-01 -3.860000000000000000e+02 5.280855997116135070e-01 -3.870000000000000000e+02 5.239372989032440309e-01 -3.880000000000000000e+02 5.198858478917152137e-01 -3.890000000000000000e+02 5.159276605514671044e-01 -3.900000000000000000e+02 5.120593253943732659e-01 -3.910000000000000000e+02 5.082775950889130145e-01 -3.920000000000000000e+02 5.045793767246775641e-01 -3.930000000000000000e+02 5.009617227611485868e-01 -3.940000000000000000e+02 4.974218226053315761e-01 -3.950000000000000000e+02 4.939569947679042228e-01 -3.960000000000000000e+02 4.905646795520252623e-01 -3.970000000000000000e+02 4.872424322331894153e-01 -3.980000000000000000e+02 4.839879166919889286e-01 -3.990000000000000000e+02 4.807988994651667958e-01 -4.000000000000000000e+02 4.776732441832539644e-01 -4.010000000000000000e+02 4.746089063657677465e-01 -4.020000000000000000e+02 4.716039285475141507e-01 -4.030000000000000000e+02 4.686564357116038138e-01 -4.040000000000000000e+02 4.657646310069922246e-01 -4.050000000000000000e+02 4.629267917299948465e-01 -4.060000000000000000e+02 4.601412655510689342e-01 -4.070000000000000000e+02 4.574064669695095398e-01 -4.080000000000000000e+02 4.547208739802010569e-01 -4.090000000000000000e+02 4.520830249377760790e-01 -4.100000000000000000e+02 4.494915156046404570e-01 -4.110000000000000000e+02 4.469449963704413276e-01 -4.120000000000000000e+02 4.444421696314884707e-01 -4.130000000000000000e+02 4.419817873194388791e-01 -4.140000000000000000e+02 4.395626485694713037e-01 -4.150000000000000000e+02 4.371835975188317347e-01 -4.160000000000000000e+02 4.348435212273337735e-01 -4.170000000000000000e+02 4.325413477119841033e-01 -4.180000000000000000e+02 4.302760440884981774e-01 -4.190000000000000000e+02 4.280466148130216975e-01 -4.200000000000000000e+02 4.258521000177492022e-01 -4.210000000000000000e+02 4.236915739346737708e-01 -4.220000000000000000e+02 4.215641434020956368e-01 -4.230000000000000000e+02 4.194689464488028929e-01 -4.240000000000000000e+02 4.174051509513057034e-01 -4.250000000000000000e+02 4.153719533597377556e-01 -4.260000000000000000e+02 4.133685774883759656e-01 -4.270000000000000000e+02 4.113942733669674334e-01 -4.280000000000000000e+02 4.094483161493540080e-01 -4.290000000000000000e+02 4.075300050760630177e-01 -4.300000000000000000e+02 4.056386624877854619e-01 -4.310000000000000000e+02 4.013912009558592842e-01 -4.320000000000000000e+02 3.971192247879613002e-01 -4.330000000000000000e+02 3.929431662759431121e-01 -4.340000000000000000e+02 3.887877778006299523e-01 -4.350000000000000000e+02 3.847991905271044843e-01 -4.360000000000000000e+02 3.808899497092754771e-01 -4.370000000000000000e+02 3.770321205610598914e-01 -4.380000000000000000e+02 3.732521381443776876e-01 -4.390000000000000000e+02 3.694158397025473217e-01 -4.400000000000000000e+02 3.656361642969984116e-01 -4.410000000000000000e+02 3.637041215579885356e-01 -4.420000000000000000e+02 3.618050021278039763e-01 -4.430000000000000000e+02 3.599573466274055278e-01 -4.440000000000000000e+02 3.581622953562234035e-01 -4.450000000000000000e+02 3.563475298726105911e-01 -4.460000000000000000e+02 3.546131012783114156e-01 -4.470000000000000000e+02 3.529171425161061748e-01 -4.480000000000000000e+02 3.511600645287158429e-01 -4.490000000000000000e+02 3.495001340366898912e-01 -4.500000000000000000e+02 3.478342642145098584e-01 -4.510000000000000000e+02 3.464230590325684256e-01 -4.520000000000000000e+02 3.448679466138410143e-01 -4.530000000000000000e+02 3.432877541094727092e-01 -4.540000000000000000e+02 3.419279637498306990e-01 -4.550000000000000000e+02 3.403899632567217726e-01 -4.560000000000000000e+02 3.388281057218366921e-01 -4.570000000000000000e+02 3.374509332583289223e-01 -4.580000000000000000e+02 3.360451544967197890e-01 -4.590000000000000000e+02 3.346336262677152562e-01 -4.600000000000000000e+02 3.331518803143234675e-01 -4.610000000000000000e+02 3.322999523736291372e-01 -4.620000000000000000e+02 3.314413399858454623e-01 -4.630000000000000000e+02 3.305725970739325503e-01 -4.640000000000000000e+02 3.297325016120075669e-01 -4.650000000000000000e+02 3.288405527362059932e-01 -4.660000000000000000e+02 3.280349124410171235e-01 -4.670000000000000000e+02 3.272181645157655749e-01 -4.680000000000000000e+02 3.264107816982220744e-01 -4.690000000000000000e+02 3.256138361259974801e-01 -4.700000000000000000e+02 3.248861836773703771e-01 -4.710000000000000000e+02 3.236703958241508583e-01 -4.720000000000000000e+02 3.224004875302849960e-01 -4.730000000000000000e+02 3.212142588947224375e-01 -4.740000000000000000e+02 3.201511185091803768e-01 -4.750000000000000000e+02 3.189554620501165449e-01 -4.760000000000000000e+02 3.178098233543905082e-01 -4.770000000000000000e+02 3.167221172560253373e-01 -4.780000000000000000e+02 3.157016581654958909e-01 -4.790000000000000000e+02 3.145593782471240440e-01 -4.800000000000000000e+02 3.134509493041701123e-01 -4.810000000000000000e+02 3.121425769791167926e-01 -4.820000000000000000e+02 3.108784129001939678e-01 -4.830000000000000000e+02 3.096797605619626692e-01 -4.840000000000000000e+02 3.085392244289119623e-01 -4.850000000000000000e+02 3.074820466880909264e-01 -4.860000000000000000e+02 3.064652653738632604e-01 -4.870000000000000000e+02 3.053357684427669416e-01 -4.880000000000000000e+02 3.043780287842099974e-01 -4.890000000000000000e+02 3.033467242744036785e-01 -4.900000000000000000e+02 3.023931681866862675e-01 -4.910000000000000000e+02 3.014207182671409524e-01 -4.920000000000000000e+02 3.004620052485332260e-01 -4.930000000000000000e+02 2.995395110481065548e-01 -4.940000000000000000e+02 2.986801932647105695e-01 -4.950000000000000000e+02 2.978709237690262412e-01 -4.960000000000000000e+02 2.970468427189997818e-01 -4.970000000000000000e+02 2.963053479931697654e-01 -4.980000000000000000e+02 2.955473664731924632e-01 -4.990000000000000000e+02 2.947567652016332418e-01 -5.000000000000000000e+02 2.941277613234809518e-01 -5.010000000000000000e+02 2.934817548728843040e-01 -5.020000000000000000e+02 2.928781479379820585e-01 -5.030000000000000000e+02 2.922706048624220676e-01 -5.040000000000000000e+02 2.916459244383286520e-01 -5.050000000000000000e+02 2.912236565535889499e-01 -5.060000000000000000e+02 2.907475290896360254e-01 -5.070000000000000000e+02 2.902677375099961266e-01 -5.080000000000000000e+02 2.897676634669539841e-01 -5.090000000000000000e+02 2.893731430640880120e-01 -5.100000000000000000e+02 2.889589445163627812e-01 -5.110000000000000000e+02 2.881700181111551684e-01 -5.120000000000000000e+02 2.873480520316719078e-01 -5.130000000000000000e+02 2.865151935771834135e-01 -5.140000000000000000e+02 2.856811667792410470e-01 -5.150000000000000000e+02 2.849473062224541775e-01 -5.160000000000000000e+02 2.840788906049899754e-01 -5.170000000000000000e+02 2.833928994179065741e-01 -5.180000000000000000e+02 2.827039766186793535e-01 -5.190000000000000000e+02 2.819754817033529593e-01 -5.200000000000000000e+02 2.812482993192523262e-01 -5.210000000000000000e+02 2.809187193137456240e-01 -5.220000000000000000e+02 2.806119449158293033e-01 -5.230000000000000000e+02 2.803365836900778563e-01 -5.240000000000000000e+02 2.800123081838547523e-01 -5.250000000000000000e+02 2.797458103743233893e-01 -5.260000000000000000e+02 2.795503012147202426e-01 -5.270000000000000000e+02 2.793651617083823813e-01 -5.280000000000000000e+02 2.791742447571493035e-01 -5.290000000000000000e+02 2.790152870372823446e-01 -5.300000000000000000e+02 2.787765316151872286e-01 -5.310000000000000000e+02 2.782614025891858578e-01 -5.320000000000000000e+02 2.777553322218797582e-01 -5.330000000000000000e+02 2.772724584393295721e-01 -5.340000000000000000e+02 2.767805116406394927e-01 -5.350000000000000000e+02 2.763191815102425952e-01 -5.360000000000000000e+02 2.758573178654324942e-01 -5.370000000000000000e+02 2.754049108370179577e-01 -5.380000000000000000e+02 2.749522072559143493e-01 -5.390000000000000000e+02 2.745113907245025353e-01 -5.400000000000000000e+02 2.740557320472344904e-01 -5.410000000000000000e+02 2.738357205008694062e-01 -5.420000000000000000e+02 2.736625084758002036e-01 -5.430000000000000000e+02 2.734110728475184771e-01 -5.440000000000000000e+02 2.731982861589927758e-01 -5.450000000000000000e+02 2.729718221333193306e-01 -5.460000000000000000e+02 2.728511995680704683e-01 -5.470000000000000000e+02 2.726255409409779062e-01 -5.480000000000000000e+02 2.725091758002506914e-01 -5.490000000000000000e+02 2.723876843379202661e-01 -5.500000000000000000e+02 2.722399028653252340e-01 -5.510000000000000000e+02 2.715911952691412168e-01 -5.520000000000000000e+02 2.709460720857740923e-01 -5.530000000000000000e+02 2.703044947435113143e-01 -5.540000000000000000e+02 2.696664253031139102e-01 -5.550000000000000000e+02 2.690318264447055796e-01 -5.560000000000000000e+02 2.684006614549652170e-01 -5.570000000000000000e+02 2.677728942146391788e-01 -5.580000000000000000e+02 2.671484891863595834e-01 -5.590000000000000000e+02 2.665274114027597063e-01 -5.600000000000000000e+02 2.659096264548642674e-01 -5.610000000000000000e+02 2.652951004807700963e-01 -5.620000000000000000e+02 2.646838001546008567e-01 -5.630000000000000000e+02 2.640756926757049650e-01 -5.640000000000000000e+02 2.634707457581375589e-01 -5.650000000000000000e+02 2.628689276203737268e-01 -5.660000000000000000e+02 2.622702069752671505e-01 -5.670000000000000000e+02 2.616745530202487235e-01 -5.680000000000000000e+02 2.610819354277570947e-01 -5.690000000000000000e+02 2.604923243358777674e-01 -5.700000000000000000e+02 2.599056903392269469e-01 -5.710000000000000000e+02 2.593220044800134683e-01 -5.720000000000000000e+02 2.587412382393369792e-01 -5.730000000000000000e+02 2.581633635286694761e-01 -5.740000000000000000e+02 2.575883526815297420e-01 -5.750000000000000000e+02 2.570161784453716680e-01 -5.760000000000000000e+02 2.564468139736207908e-01 -5.770000000000000000e+02 2.558802328179256569e-01 -5.780000000000000000e+02 2.553164089205607334e-01 -5.790000000000000000e+02 2.547553166070181674e-01 -5.800000000000000000e+02 2.541969305787496469e-01 -5.810000000000000000e+02 2.536412259060807917e-01 -5.820000000000000000e+02 2.530881780567449391e-01 -5.830000000000000000e+02 2.525377627468738395e-01 -5.840000000000000000e+02 2.519899561483122663e-01 -5.850000000000000000e+02 2.514447347391092213e-01 -5.860000000000000000e+02 2.509020753330470366e-01 -5.870000000000000000e+02 2.503619550399095450e-01 -5.880000000000000000e+02 2.498243513939016058e-01 -5.890000000000000000e+02 2.492892421454347696e-01 -5.900000000000000000e+02 2.487566053905642949e-01 -5.910000000000000000e+02 2.482264195314022592e-01 -5.920000000000000000e+02 2.476986632705741043e-01 -5.930000000000000000e+02 2.471733156057744074e-01 -5.940000000000000000e+02 2.466503558244548810e-01 -5.950000000000000000e+02 2.461297634986228111e-01 -5.960000000000000000e+02 2.456115184797426632e-01 -5.970000000000000000e+02 2.450956008937515973e-01 -5.980000000000000000e+02 2.445819911361842014e-01 -5.990000000000000000e+02 2.440706698673940078e-01 -6.000000000000000000e+02 2.435616180078764292e-01 -6.010000000000000000e+02 2.430548167336908649e-01 -6.020000000000000000e+02 2.425502474719749280e-01 -6.030000000000000000e+02 2.420478918965666137e-01 -6.040000000000000000e+02 2.415477319236925824e-01 -6.050000000000000000e+02 2.410497497077650209e-01 -6.060000000000000000e+02 2.405539276372625490e-01 -6.070000000000000000e+02 2.400602483306865376e-01 -6.080000000000000000e+02 2.395686946326125166e-01 -6.090000000000000000e+02 2.390792496098067821e-01 -6.100000000000000000e+02 2.385918965474450038e-01 -6.110000000000000000e+02 2.381066189453825144e-01 -6.120000000000000000e+02 2.376234005145202166e-01 -6.130000000000000000e+02 2.371422251732272779e-01 -6.140000000000000000e+02 2.366630770438537534e-01 -6.150000000000000000e+02 2.361859404492911152e-01 -6.160000000000000000e+02 2.357107999096284823e-01 -6.170000000000000000e+02 2.352376401388481530e-01 -6.180000000000000000e+02 2.347664460416065690e-01 -6.190000000000000000e+02 2.342972027100732046e-01 -6.200000000000000000e+02 2.338298954208279934e-01 -6.210000000000000000e+02 2.333645096318186229e-01 -6.220000000000000000e+02 2.329010309793958511e-01 -6.230000000000000000e+02 2.324394452753779650e-01 -6.240000000000000000e+02 2.319797385041930393e-01 -6.250000000000000000e+02 2.315218968200772609e-01 -6.260000000000000000e+02 2.310659065443141091e-01 -6.270000000000000000e+02 2.306117541625375411e-01 -6.280000000000000000e+02 2.301594263220834435e-01 -6.290000000000000000e+02 2.297089098293993159e-01 -6.300000000000000000e+02 2.292601916474861501e-01 -6.310000000000000000e+02 2.288132588934114198e-01 -6.320000000000000000e+02 2.283680988358526565e-01 -6.330000000000000000e+02 2.279246988926959816e-01 -6.340000000000000000e+02 2.274830466286782149e-01 -6.350000000000000000e+02 2.270431297530706993e-01 -6.360000000000000000e+02 2.266049361174183041e-01 -6.370000000000000000e+02 2.261684537132997164e-01 -6.380000000000000000e+02 2.257336706701522644e-01 -6.390000000000000000e+02 2.253005752531235806e-01 -6.400000000000000000e+02 2.248691558609697549e-01 -6.410000000000000000e+02 2.244394010239880444e-01 -6.420000000000000000e+02 2.240112994019895776e-01 -6.430000000000000000e+02 2.235848397823104738e-01 -6.440000000000000000e+02 2.231600110778641233e-01 -6.450000000000000000e+02 2.227368023252197793e-01 -6.460000000000000000e+02 2.223152026827190930e-01 -6.470000000000000000e+02 2.218952014286380836e-01 -6.480000000000000000e+02 2.214767879593616262e-01 -6.490000000000000000e+02 2.210599517876132847e-01 -6.500000000000000000e+02 2.206446825407070711e-01 -6.510000000000000000e+02 2.202309699588207714e-01 -6.520000000000000000e+02 2.198188038933247268e-01 -6.530000000000000000e+02 2.194081743051159161e-01 -6.540000000000000000e+02 2.189990712630012493e-01 -6.550000000000000000e+02 2.185914849420922679e-01 -6.560000000000000000e+02 2.181854056222474192e-01 -6.570000000000000000e+02 2.177808236865258207e-01 -6.580000000000000000e+02 2.173777296196790776e-01 -6.590000000000000000e+02 2.169761140066586436e-01 -6.600000000000000000e+02 2.165759675311676735e-01 -6.610000000000000000e+02 2.161772809742177892e-01 -6.620000000000000000e+02 2.157800452127254520e-01 -6.630000000000000000e+02 2.153842512181299573e-01 -6.640000000000000000e+02 2.149898900550256398e-01 -6.650000000000000000e+02 2.145969528798400972e-01 -6.660000000000000000e+02 2.142054309395081124e-01 -6.670000000000000000e+02 2.138153155701894848e-01 -6.680000000000000000e+02 2.134265981959994340e-01 -6.690000000000000000e+02 2.130392703277668165e-01 -6.700000000000000000e+02 2.126533235618015827e-01 -6.710000000000000000e+02 2.122687495787007605e-01 -6.720000000000000000e+02 2.118855401421630702e-01 -6.730000000000000000e+02 2.115036870978229122e-01 -6.740000000000000000e+02 2.111231823721143319e-01 -6.750000000000000000e+02 2.107440179711427275e-01 -6.760000000000000000e+02 2.103661859795838140e-01 -6.770000000000000000e+02 2.099896785595972704e-01 -6.780000000000000000e+02 2.096144879497590652e-01 -6.790000000000000000e+02 2.092406064640178198e-01 -6.800000000000000000e+02 2.088680264906531692e-01 -6.810000000000000000e+02 2.084967404912727307e-01 -6.820000000000000000e+02 2.081267409998037721e-01 -6.830000000000000000e+02 2.077580206215242642e-01 -6.840000000000000000e+02 2.073905720320884938e-01 -6.850000000000000000e+02 2.070243879765835127e-01 -6.860000000000000000e+02 2.066594612685986321e-01 -6.870000000000000000e+02 2.062957847893023000e-01 -6.880000000000000000e+02 2.059333514865440695e-01 -6.890000000000000000e+02 2.055721543739636448e-01 -6.900000000000000000e+02 2.052121865301247128e-01 -6.910000000000000000e+02 2.048534410976490527e-01 -6.920000000000000000e+02 2.044959112823747094e-01 -6.930000000000000000e+02 2.041395903525253519e-01 -6.940000000000000000e+02 2.037844716378908461e-01 -6.950000000000000000e+02 2.034305485290265891e-01 -6.960000000000000000e+02 2.030778144764594784e-01 -6.970000000000000000e+02 2.027262629899092006e-01 -6.980000000000000000e+02 2.023758876375233162e-01 -6.990000000000000000e+02 2.020266820451206424e-01 -7.000000000000000000e+02 2.016786398954537873e-01 -7.010000000000000000e+02 2.013317549274782348e-01 -7.020000000000000000e+02 2.009860209356282568e-01 -7.030000000000000000e+02 2.006414317691171401e-01 -7.040000000000000000e+02 2.002979813312388280e-01 -7.050000000000000000e+02 1.999556635786803871e-01 -7.060000000000000000e+02 1.996144725208495729e-01 -7.070000000000000000e+02 1.992744022192144138e-01 -7.080000000000000000e+02 1.989354467866432108e-01 -7.090000000000000000e+02 1.985976003867695738e-01 -7.100000000000000000e+02 1.982608572333535712e-01 -7.110000000000000000e+02 1.979252115896589503e-01 -7.120000000000000000e+02 1.975906577678417098e-01 -7.130000000000000000e+02 1.972571901283477480e-01 -7.140000000000000000e+02 1.969248030793145365e-01 -7.150000000000000000e+02 1.965934910759837284e-01 -7.160000000000000000e+02 1.962632486266521481e-01 -7.170000000000000000e+02 1.959340702659196076e-01 -7.180000000000000000e+02 1.956059505935459353e-01 -7.190000000000000000e+02 1.952788842475245701e-01 -7.200000000000000000e+02 1.949528659101645856e-01 -7.210000000000000000e+02 1.946278903075495947e-01 -7.220000000000000000e+02 1.943039522090126980e-01 -7.230000000000000000e+02 1.939810464266206180e-01 -7.240000000000000000e+02 1.936591678146649953e-01 -7.250000000000000000e+02 1.933383112691586525e-01 -7.260000000000000000e+02 1.930184717273383255e-01 -7.270000000000000000e+02 1.926996441671788018e-01 -7.280000000000000000e+02 1.923818236069127496e-01 -7.290000000000000000e+02 1.920650051045573736e-01 -7.300000000000000000e+02 1.917491837574481495e-01 -7.310000000000000000e+02 1.914343547017823277e-01 -7.320000000000000000e+02 1.911205131121570255e-01 -7.330000000000000000e+02 1.908076542011389876e-01 -7.340000000000000000e+02 1.904957732188080066e-01 -7.350000000000000000e+02 1.901848654523400350e-01 -7.360000000000000000e+02 1.898749262255676751e-01 -7.370000000000000000e+02 1.895659508985683972e-01 -7.380000000000000000e+02 1.892579348672460138e-01 -7.390000000000000000e+02 1.889508735629232272e-01 -7.400000000000000000e+02 1.886447624519428656e-01 -7.410000000000000000e+02 1.883395970352690352e-01 -7.420000000000000000e+02 1.880353728480916031e-01 -7.430000000000000000e+02 1.877320854594486943e-01 -7.440000000000000000e+02 1.874297304676837694e-01 -7.450000000000000000e+02 1.871283035167833897e-01 -7.460000000000000000e+02 1.868278002708305685e-01 -7.470000000000000000e+02 1.865282164305049062e-01 -7.480000000000000000e+02 1.862295477284785505e-01 -7.490000000000000000e+02 1.859317899290809373e-01 -7.500000000000000000e+02 1.856349388279329160e-01 -7.510000000000000000e+02 1.853389902516112964e-01 -7.520000000000000000e+02 1.850439400573179460e-01 -7.530000000000000000e+02 1.847497841325274892e-01 -7.540000000000000000e+02 1.844565183946765274e-01 -7.550000000000000000e+02 1.841641387908259930e-01 -7.560000000000000000e+02 1.838726412973519520e-01 -7.570000000000000000e+02 1.835820219196187264e-01 -7.580000000000000000e+02 1.832922766916768587e-01 -7.590000000000000000e+02 1.830034016759543858e-01 -7.600000000000000000e+02 1.827153929629482532e-01 -7.610000000000000000e+02 1.824282466709342965e-01 -7.620000000000000000e+02 1.821419589456655663e-01 -7.630000000000000000e+02 1.818565259600903039e-01 -7.640000000000000000e+02 1.815719439140544011e-01 -7.650000000000000000e+02 1.812882090340306451e-01 -7.660000000000000000e+02 1.810053175728312536e-01 -7.670000000000000000e+02 1.807232658093354816e-01 -7.680000000000000000e+02 1.804420500482230294e-01 -7.690000000000000000e+02 1.801616666197011218e-01 -7.700000000000000000e+02 1.798821118792424678e-01 -7.710000000000000000e+02 1.796033822073268282e-01 -7.720000000000000000e+02 1.793254740091770050e-01 -7.730000000000000000e+02 1.790483837145204760e-01 -7.740000000000000000e+02 1.787721077773175293e-01 -7.750000000000000000e+02 1.784966426755400792e-01 -7.760000000000000000e+02 1.782219849109021037e-01 -7.770000000000000000e+02 1.779481310086448720e-01 -7.780000000000000000e+02 1.776750775172805386e-01 -7.790000000000000000e+02 1.774028210083636037e-01 -7.800000000000000000e+02 1.771313580762706452e-01 -7.810000000000000000e+02 1.768606853379534605e-01 -7.820000000000000000e+02 1.765907994327330643e-01 -7.830000000000000000e+02 1.763216970220653768e-01 -7.840000000000000000e+02 1.760533747893261169e-01 -7.850000000000000000e+02 1.757858294395991117e-01 -7.860000000000000000e+02 1.755190576994557772e-01 -7.870000000000000000e+02 1.752530563167477573e-01 -7.880000000000000000e+02 1.749878220603999501e-01 -7.890000000000000000e+02 1.747233517202063102e-01 -7.900000000000000000e+02 1.744596421066213210e-01 -7.910000000000000000e+02 1.741966900505709792e-01 -7.920000000000000000e+02 1.739344924032440176e-01 -7.930000000000000000e+02 1.736730460359040829e-01 -7.940000000000000000e+02 1.734123478396928930e-01 -7.950000000000000000e+02 1.731523947254474949e-01 -7.960000000000000000e+02 1.728931836235040598e-01 -7.970000000000000000e+02 1.726347114835185270e-01 -7.980000000000000000e+02 1.723769752742830286e-01 -7.990000000000000000e+02 1.721199719835446451e-01 -8.000000000000000000e+02 1.718636986178233017e-01 -8.010000000000000000e+02 1.716081522022455674e-01 -8.020000000000000000e+02 1.713533297803551958e-01 -8.030000000000000000e+02 1.710992284139661035e-01 -8.040000000000000000e+02 1.708458451829648339e-01 -8.050000000000000000e+02 1.705931771851603995e-01 -8.060000000000000000e+02 1.703412215361158055e-01 -8.070000000000000000e+02 1.700899753689843197e-01 -8.080000000000000000e+02 1.698394358343452148e-01 -8.090000000000000000e+02 1.695896001000487541e-01 -8.100000000000000000e+02 1.693404653510564017e-01 -8.110000000000000000e+02 1.690920287892863638e-01 -8.120000000000000000e+02 1.688442876334581011e-01 -8.130000000000000000e+02 1.685972391189455299e-01 -8.140000000000000000e+02 1.683508804976205087e-01 -8.150000000000000000e+02 1.681052090377070374e-01 -8.160000000000000000e+02 1.678602220236431464e-01 -8.170000000000000000e+02 1.676159167559223562e-01 -8.180000000000000000e+02 1.673722905509618664e-01 -8.190000000000000000e+02 1.671293407409534248e-01 -8.200000000000000000e+02 1.668870646737345698e-01 -8.210000000000000000e+02 1.666454597126409143e-01 -8.220000000000000000e+02 1.664045232363741689e-01 -8.230000000000000000e+02 1.661642526388682484e-01 -8.240000000000000000e+02 1.659246453291537693e-01 -8.250000000000000000e+02 1.656856987312289031e-01 -8.260000000000000000e+02 1.654474102839309790e-01 -8.270000000000000000e+02 1.652097774408066155e-01 -8.280000000000000000e+02 1.649727976699829068e-01 -8.290000000000000000e+02 1.647364684540476298e-01 -8.300000000000000000e+02 1.645007872899181545e-01 -8.310000000000000000e+02 1.642657516887252311e-01 -8.320000000000000000e+02 1.640313591756905609e-01 -8.330000000000000000e+02 1.637976072900084734e-01 -8.340000000000000000e+02 1.635644935847182513e-01 -8.350000000000000000e+02 1.633320156266034329e-01 -8.360000000000000000e+02 1.631001709960651080e-01 -8.370000000000000000e+02 1.628689572870125335e-01 -8.380000000000000000e+02 1.626383721067453936e-01 -8.390000000000000000e+02 1.624084130758482736e-01 -8.400000000000000000e+02 1.621790778280755296e-01 -8.410000000000000000e+02 1.619503640102446240e-01 -8.420000000000000000e+02 1.617222692821323748e-01 -8.430000000000000000e+02 1.614947913163576332e-01 -8.440000000000000000e+02 1.612679277982875803e-01 -8.450000000000000000e+02 1.610416764259272326e-01 -8.460000000000000000e+02 1.608160349098172459e-01 -8.470000000000000000e+02 1.605910009729304699e-01 -8.480000000000000000e+02 1.603665723505774410e-01 -8.490000000000000000e+02 1.601427467903011326e-01 -8.500000000000000000e+02 1.599195220517799498e-01 -8.510000000000000000e+02 1.596968959067274485e-01 -8.520000000000000000e+02 1.594748661388046829e-01 -8.530000000000000000e+02 1.592534305435133468e-01 -8.540000000000000000e+02 1.590325869281131177e-01 -8.550000000000000000e+02 1.588123331115195436e-01 -8.560000000000000000e+02 1.585926669242151421e-01 -8.570000000000000000e+02 1.583735862081580015e-01 -8.580000000000000000e+02 1.581550888166957658e-01 -8.590000000000000000e+02 1.579371726144669363e-01 -8.600000000000000000e+02 1.577198354773206301e-01 -8.610000000000000000e+02 1.575030752922284283e-01 -8.620000000000000000e+02 1.572868899571963908e-01 -8.630000000000000000e+02 1.570712773811751839e-01 -8.640000000000000000e+02 1.568562354839878881e-01 -8.650000000000000000e+02 1.566417621962336304e-01 -8.660000000000000000e+02 1.564278554592107573e-01 -8.670000000000000000e+02 1.562145132248342894e-01 -8.680000000000000000e+02 1.560017334555549029e-01 -8.690000000000000000e+02 1.557895141242813808e-01 -8.700000000000000000e+02 1.555778532142964576e-01 -8.710000000000000000e+02 1.553667487191800478e-01 -8.720000000000000000e+02 1.551561986427322515e-01 -8.730000000000000000e+02 1.549462009989035216e-01 -8.740000000000000000e+02 1.547367538117028762e-01 -8.750000000000000000e+02 1.545278551151350876e-01 -8.760000000000000000e+02 1.543195029531224949e-01 -8.770000000000000000e+02 1.541116953794353095e-01 -8.780000000000000000e+02 1.539044304576116795e-01 -8.790000000000000000e+02 1.536977062608885503e-01 -8.800000000000000000e+02 1.534915208721329694e-01 -8.810000000000000000e+02 1.532858723837701720e-01 -8.820000000000000000e+02 1.530807588977079747e-01 -8.830000000000000000e+02 1.528761785252807925e-01 -8.840000000000000000e+02 1.526721293871620977e-01 -8.850000000000000000e+02 1.524686096133157365e-01 -8.860000000000000000e+02 1.522656173429173809e-01 -8.870000000000000000e+02 1.520631507242903302e-01 -8.880000000000000000e+02 1.518612079148390914e-01 -8.890000000000000000e+02 1.516597870809909543e-01 -8.900000000000000000e+02 1.514588863981203293e-01 -8.910000000000000000e+02 1.512585040504949851e-01 -8.920000000000000000e+02 1.510586382312030795e-01 -8.930000000000000000e+02 1.508592871421043369e-01 -8.940000000000000000e+02 1.506604489937514169e-01 -8.950000000000000000e+02 1.504621220053430630e-01 -8.960000000000000000e+02 1.502643044046546028e-01 -8.970000000000000000e+02 1.500669944279820200e-01 -8.980000000000000000e+02 1.498701903200784780e-01 -8.990000000000000000e+02 1.496738903341030824e-01 -9.000000000000000000e+02 1.494780927315501329e-01 -9.010000000000000000e+02 1.492827957822062956e-01 -9.020000000000000000e+02 1.490879977640773291e-01 -9.030000000000000000e+02 1.488936969633467555e-01 -9.040000000000000000e+02 1.486998916743114685e-01 -9.050000000000000000e+02 1.485065801993235846e-01 -9.060000000000000000e+02 1.483137608487412606e-01 -9.070000000000000000e+02 1.481214319408722668e-01 -9.080000000000000000e+02 1.479295918019182809e-01 -9.090000000000000000e+02 1.477382387659270380e-01 -9.100000000000000000e+02 1.475473711747292971e-01 -9.110000000000000000e+02 1.473569873778970418e-01 -9.120000000000000000e+02 1.471670857326824733e-01 -9.130000000000000000e+02 1.469776646039736012e-01 -9.140000000000000000e+02 1.467887223642389827e-01 -9.150000000000000000e+02 1.466002573934792330e-01 -9.160000000000000000e+02 1.464122680791772602e-01 -9.170000000000000000e+02 1.462247528162418098e-01 -9.180000000000000000e+02 1.460377100069734368e-01 -9.190000000000000000e+02 1.458511380610005848e-01 -9.200000000000000000e+02 1.456650353952339827e-01 -9.210000000000000000e+02 1.454794004338342273e-01 -9.220000000000000000e+02 1.452942316081404783e-01 -9.230000000000000000e+02 1.451095273566402610e-01 -9.240000000000000000e+02 1.449252861249199775e-01 -9.250000000000000000e+02 1.447415063656136980e-01 -9.260000000000000000e+02 1.445581865383607223e-01 -9.270000000000000000e+02 1.443753251097650570e-01 -9.280000000000000000e+02 1.441929205533447889e-01 -9.290000000000000000e+02 1.440109713494855948e-01 -9.300000000000000000e+02 1.438294759854008842e-01 -9.310000000000000000e+02 1.436484329550934413e-01 -9.320000000000000000e+02 1.434678407592990534e-01 -9.330000000000000000e+02 1.432876979054597266e-01 -9.340000000000000000e+02 1.431080029076605975e-01 -9.350000000000000000e+02 1.429287542866095329e-01 -9.360000000000000000e+02 1.427499505695824511e-01 -9.370000000000000000e+02 1.425715902903854915e-01 -9.380000000000000000e+02 1.423936719893119374e-01 -9.390000000000000000e+02 1.422161942131080214e-01 -9.400000000000000000e+02 1.420391555149262408e-01 -9.410000000000000000e+02 1.418625544542850281e-01 -9.420000000000000000e+02 1.416863895970347786e-01 -9.430000000000000000e+02 1.415106595153154956e-01 -9.440000000000000000e+02 1.413353627875172103e-01 -9.450000000000000000e+02 1.411604979982417074e-01 -9.460000000000000000e+02 1.409860637382658599e-01 -9.470000000000000000e+02 1.408120586045039091e-01 -9.480000000000000000e+02 1.406384811999666640e-01 -9.490000000000000000e+02 1.404653301337304150e-01 -9.500000000000000000e+02 1.402926040208922198e-01 -9.510000000000000000e+02 1.401203014825386228e-01 -9.520000000000000000e+02 1.399484211457112381e-01 -9.530000000000000000e+02 1.397769616433654771e-01 -9.540000000000000000e+02 1.396059216143341053e-01 -9.550000000000000000e+02 1.394352997033027897e-01 -9.560000000000000000e+02 1.392650945607592228e-01 -9.570000000000000000e+02 1.390953048429723615e-01 -9.580000000000000000e+02 1.389259292119498224e-01 -9.590000000000000000e+02 1.387569663354068783e-01 -9.600000000000000000e+02 1.385884148867320420e-01 -9.610000000000000000e+02 1.384202735449500676e-01 -9.620000000000000000e+02 1.382525409946983586e-01 -9.630000000000000000e+02 1.380852159261809764e-01 -9.640000000000000000e+02 1.379182970351448267e-01 -9.650000000000000000e+02 1.377517830228466855e-01 -9.660000000000000000e+02 1.375856725960163951e-01 -9.670000000000000000e+02 1.374199644668294418e-01 -9.680000000000000000e+02 1.372546573528691805e-01 -9.690000000000000000e+02 1.370897499771081551e-01 -9.700000000000000000e+02 1.369252410678593879e-01 -9.710000000000000000e+02 1.367611293587581434e-01 -9.720000000000000000e+02 1.365974135887278729e-01 -9.730000000000000000e+02 1.364340925019515149e-01 -9.740000000000000000e+02 1.362711648478356352e-01 -9.750000000000000000e+02 1.361086293809845860e-01 -9.760000000000000000e+02 1.359464848611711407e-01 -9.770000000000000000e+02 1.357847300533093771e-01 -9.780000000000000000e+02 1.356233637274189829e-01 -9.790000000000000000e+02 1.354623846585962799e-01 -9.800000000000000000e+02 1.353017916269985965e-01 -9.810000000000000000e+02 1.351415834177943087e-01 -9.820000000000000000e+02 1.349817588211591479e-01 -9.830000000000000000e+02 1.348223166322229105e-01 -9.840000000000000000e+02 1.346632556510622969e-01 -9.850000000000000000e+02 1.345045746826611932e-01 -9.860000000000000000e+02 1.343462725368876065e-01 -9.870000000000000000e+02 1.341883480615597701e-01 -9.880000000000000000e+02 1.340308000100528529e-01 -9.890000000000000000e+02 1.338736272398056149e-01 -9.900000000000000000e+02 1.337168285799549550e-01 -9.910000000000000000e+02 1.335604028643794794e-01 -9.920000000000000000e+02 1.334043489316852071e-01 -9.930000000000000000e+02 1.332486656251746504e-01 -9.940000000000000000e+02 1.330933517596697702e-01 -9.950000000000000000e+02 1.329384062540855949e-01 -9.960000000000000000e+02 1.327838279325198600e-01 -9.970000000000000000e+02 1.326296156568088636e-01 -9.980000000000000000e+02 1.324757682933597747e-01 -9.990000000000000000e+02 1.323222847131252378e-01 -1.000000000000000000e+03 1.321691637915768103e-01 -1.001000000000000000e+03 1.320164044086875599e-01 -1.002000000000000000e+03 1.318640054489006730e-01 -1.003000000000000000e+03 1.317119658011041139e-01 -1.004000000000000000e+03 1.315602843586153869e-01 -1.005000000000000000e+03 1.314089600191504226e-01 -1.006000000000000000e+03 1.312579916848016226e-01 -1.007000000000000000e+03 1.311073782620212347e-01 -1.008000000000000000e+03 1.309571186615844929e-01 -1.009000000000000000e+03 1.308072117985737415e-01 -1.010000000000000000e+03 1.306576565923632527e-01 -1.011000000000000000e+03 1.305084519665871690e-01 -1.012000000000000000e+03 1.303595968491136625e-01 -1.013000000000000000e+03 1.302110901720373859e-01 -1.014000000000000000e+03 1.300629308716407251e-01 -1.015000000000000000e+03 1.299151178883825863e-01 -1.016000000000000000e+03 1.297676501668720561e-01 -1.017000000000000000e+03 1.296205266558471958e-01 -1.018000000000000000e+03 1.294737463081559459e-01 -1.019000000000000000e+03 1.293273080807343656e-01 -1.020000000000000000e+03 1.291812109345764348e-01 -1.021000000000000000e+03 1.290354538347310565e-01 -1.022000000000000000e+03 1.288900357502606731e-01 -1.023000000000000000e+03 1.287449556542367146e-01 -1.024000000000000000e+03 1.286002125237113713e-01 -1.025000000000000000e+03 1.284558053396971655e-01 -1.026000000000000000e+03 1.283117330871465511e-01 -1.027000000000000000e+03 1.281679947549354548e-01 -1.028000000000000000e+03 1.280245893358402387e-01 -1.029000000000000000e+03 1.278815158265200203e-01 -1.030000000000000000e+03 1.277387732274901377e-01 -1.031000000000000000e+03 1.275963605431077452e-01 -1.032000000000000000e+03 1.274542767815606825e-01 -1.033000000000000000e+03 1.273125209548309766e-01 -1.034000000000000000e+03 1.271710920786854604e-01 -1.035000000000000000e+03 1.270299891726599240e-01 -1.036000000000000000e+03 1.268892112600283895e-01 -1.037000000000000000e+03 1.267487573677982815e-01 -1.038000000000000000e+03 1.266086265266815614e-01 -1.039000000000000000e+03 1.264688177710780737e-01 -1.040000000000000000e+03 1.263293301390636669e-01 -1.041000000000000000e+03 1.261901626723622161e-01 -1.042000000000000000e+03 1.260513144163321331e-01 -1.043000000000000000e+03 1.259127844199509350e-01 -1.044000000000000000e+03 1.257745717357948156e-01 -1.045000000000000000e+03 1.256366754200144431e-01 -1.046000000000000000e+03 1.254990945323299356e-01 -1.047000000000000000e+03 1.253618281360048825e-01 -1.048000000000000000e+03 1.252248752978292745e-01 -1.049000000000000000e+03 1.250882350881037663e-01 -1.050000000000000000e+03 1.249519065806236479e-01 -1.051000000000000000e+03 1.248158888526591098e-01 -1.052000000000000000e+03 1.246801809849393816e-01 -1.053000000000000000e+03 1.245447820616378681e-01 -1.054000000000000000e+03 1.244096911703505004e-01 -1.055000000000000000e+03 1.242749074020829819e-01 -1.056000000000000000e+03 1.241404298512330112e-01 -1.057000000000000000e+03 1.240062576155750995e-01 -1.058000000000000000e+03 1.238723897962429737e-01 -1.059000000000000000e+03 1.237388254977097868e-01 -1.060000000000000000e+03 1.236055638277841762e-01 -1.061000000000000000e+03 1.234726038975752782e-01 -1.062000000000000000e+03 1.233399448214995836e-01 -1.063000000000000000e+03 1.232075857172361122e-01 -1.064000000000000000e+03 1.230755257057444263e-01 -1.065000000000000000e+03 1.229437639112212627e-01 -1.066000000000000000e+03 1.228122994611028224e-01 -1.067000000000000000e+03 1.226811314860330876e-01 -1.068000000000000000e+03 1.225502591198685542e-01 -1.069000000000000000e+03 1.224196814996454802e-01 -1.070000000000000000e+03 1.222893977655738068e-01 -1.071000000000000000e+03 1.221594070610183269e-01 -1.072000000000000000e+03 1.220297085324840297e-01 -1.073000000000000000e+03 1.219003013296086069e-01 -1.074000000000000000e+03 1.217711846051361124e-01 -1.075000000000000000e+03 1.216423575149093717e-01 -1.076000000000000000e+03 1.215138192178531612e-01 -1.077000000000000000e+03 1.213855688759627321e-01 -1.078000000000000000e+03 1.212576056542851444e-01 -1.079000000000000000e+03 1.211299287209078035e-01 -1.080000000000000000e+03 1.210025372469445554e-01 -1.081000000000000000e+03 1.208754304065162571e-01 -1.082000000000000000e+03 1.207486073767464752e-01 -1.083000000000000000e+03 1.206220673377426111e-01 -1.084000000000000000e+03 1.204958094725742113e-01 -1.085000000000000000e+03 1.203698329672737016e-01 -1.086000000000000000e+03 1.202441370108142116e-01 -1.087000000000000000e+03 1.201187207950938918e-01 -1.088000000000000000e+03 1.199935835149330970e-01 -1.089000000000000000e+03 1.198687243680439246e-01 -1.090000000000000000e+03 1.197441425550360011e-01 -1.091000000000000000e+03 1.196198372793898096e-01 -1.092000000000000000e+03 1.194958077474480018e-01 -1.093000000000000000e+03 1.193720531684009240e-01 -1.094000000000000000e+03 1.192485727542798996e-01 -1.095000000000000000e+03 1.191253657199293631e-01 -1.096000000000000000e+03 1.190024312830151171e-01 -1.097000000000000000e+03 1.188797686639917334e-01 -1.098000000000000000e+03 1.187573770861034689e-01 -1.099000000000000000e+03 1.186352557753638376e-01 From 3fbc609c3fe4859cd2059f58ef3410b1134103d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Feb 2024 18:15:23 +0100 Subject: [PATCH 066/161] ratio files with extrapolation from hologram transmission fit --- .../holo4_003/ratio_order_2over1.txt | 800 ++++++++++++++++++ .../holo4_003/ratio_order_3over2.txt | 800 ++++++++++++++++++ 2 files changed, 1600 insertions(+) create mode 100644 spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt create mode 100644 spectractor/extractor/dispersers/holo4_003/ratio_order_3over2.txt diff --git a/spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt b/spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt new file mode 100644 index 000000000..4b12af8f1 --- /dev/null +++ b/spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt @@ -0,0 +1,800 @@ +3.000000000000000000e+02 1.375196993384676658e-01 +3.010000000000000000e+02 1.148794318163027517e-01 +3.020000000000000000e+02 9.490222350357831183e-02 +3.030000000000000000e+02 7.735086209745876962e-02 +3.040000000000000000e+02 6.204249593194603035e-02 +3.050000000000000000e+02 4.884053055081664929e-02 +3.060000000000000000e+02 3.764863700539566871e-02 +3.070000000000000000e+02 2.840642566497900492e-02 +3.080000000000000000e+02 2.108646405197598522e-02 +3.090000000000000000e+02 1.569240891423372142e-02 +3.100000000000000000e+02 1.225809106846927933e-02 +3.110000000000000000e+02 1.084744315406127764e-02 +3.120000000000000000e+02 1.155519988046073768e-02 +3.130000000000000000e+02 1.450833065473079546e-02 +3.140000000000000000e+02 1.986818747794508871e-02 +3.150000000000000000e+02 2.783336754907148047e-02 +3.160000000000000000e+02 3.864330002388263741e-02 +3.170000000000000000e+02 5.258256875017554288e-02 +3.180000000000000000e+02 6.998597524809667403e-02 +3.190000000000000000e+02 9.124432491347865548e-02 +3.200000000000000000e+02 1.168108785874574784e-01 +3.210000000000000000e+02 1.472083428297892016e-01 +3.220000000000000000e+02 1.830361636383368018e-01 +3.230000000000000000e+02 2.249777239274205198e-01 +3.240000000000000000e+02 2.738068038371947455e-01 +3.250000000000000000e+02 3.303923188433796621e-01 +3.260000000000000000e+02 3.956998737968978608e-01 +3.270000000000000000e+02 4.707880318944210885e-01 +3.280000000000000000e+02 5.567963764265303483e-01 +3.290000000000000000e+02 6.549214486136448743e-01 +3.300000000000000000e+02 7.663755463830008718e-01 +3.310000000000000000e+02 8.923223478884041437e-01 +3.320000000000000000e+02 1.033782743649253488e+00 +3.330000000000000000e+02 1.191504747417050591e+00 +3.340000000000000000e+02 1.365793844438335514e+00 +3.350000000000000000e+02 1.556305812750571782e+00 +3.360000000000000000e+02 1.761814046349465590e+00 +3.370000000000000000e+02 1.979978076965569489e+00 +3.380000000000000000e+02 2.207157762071574769e+00 +3.390000000000000000e+02 2.438333688155275958e+00 +3.400000000000000000e+02 2.667200261324630173e+00 +3.410000000000000000e+02 2.886483478563668381e+00 +3.420000000000000000e+02 3.088493799912809479e+00 +3.430000000000000000e+02 3.265860129939112788e+00 +3.440000000000000000e+02 3.412323289469711529e+00 +3.450000000000000000e+02 3.523426536989169300e+00 +3.460000000000000000e+02 3.596951493602348560e+00 +3.470000000000000000e+02 3.633012480717904946e+00 +3.480000000000000000e+02 3.633815578688332160e+00 +3.490000000000000000e+02 3.603171672419537952e+00 +3.500000000000000000e+02 3.545895217416231038e+00 +3.510000000000000000e+02 3.467215628879384060e+00 +3.520000000000000000e+02 3.372290487892572575e+00 +3.530000000000000000e+02 3.265861698961923576e+00 +3.540000000000000000e+02 3.152055284182587069e+00 +3.550000000000000000e+02 3.034300699151680103e+00 +3.560000000000000000e+02 2.915335977922085764e+00 +3.570000000000000000e+02 2.797266005484678963e+00 +3.580000000000000000e+02 2.681647557543167082e+00 +3.590000000000000000e+02 2.569582530867592585e+00 +3.600000000000000000e+02 2.461807804650376852e+00 +3.610000000000000000e+02 2.358775552840453926e+00 +3.620000000000000000e+02 2.260721498246372807e+00 +3.630000000000000000e+02 2.167720853860855890e+00 +3.640000000000000000e+02 2.079732922657751892e+00 +3.650000000000000000e+02 1.996635874843193603e+00 +3.660000000000000000e+02 1.918253360365562710e+00 +3.670000000000000000e+02 1.844374530598193340e+00 +3.680000000000000000e+02 1.774768855344367013e+00 +3.690000000000000000e+02 1.709196900025830690e+00 +3.700000000000000000e+02 1.647418011294166762e+00 +3.710000000000000000e+02 1.589195665544876679e+00 +3.720000000000000000e+02 1.534301070485480034e+00 +3.730000000000000000e+02 1.482515475295091534e+00 +3.740000000000000000e+02 1.433631537264090428e+00 +3.750000000000000000e+02 1.387454008208677925e+00 +3.760000000000000000e+02 1.343799938341827538e+00 +3.770000000000000000e+02 1.302498544902949806e+00 +3.780000000000000000e+02 1.263390854475725300e+00 +3.790000000000000000e+02 1.226329198890880878e+00 +3.800000000000000000e+02 1.191176622770828697e+00 +3.810000000000000000e+02 1.157806244429178344e+00 +3.820000000000000000e+02 1.126100599671812530e+00 +3.830000000000000000e+02 1.095950989035169965e+00 +3.840000000000000000e+02 1.067256842364508573e+00 +3.850000000000000000e+02 1.039925109782515511e+00 +3.860000000000000000e+02 1.013869684581203190e+00 +3.870000000000000000e+02 9.890108610420870194e-01 +3.880000000000000000e+02 9.652748284003803692e-01 +3.890000000000000000e+02 9.425932009233340958e-01 +3.900000000000000000e+02 9.209025832257614619e-01 +3.910000000000000000e+02 9.001441693940476219e-01 +3.920000000000000000e+02 8.802633741475212048e-01 +3.930000000000000000e+02 8.612094940778729502e-01 +3.940000000000000000e+02 8.429353969263738700e-01 +3.950000000000000000e+02 8.253972368534254755e-01 +3.960000000000000000e+02 8.085541937005903401e-01 +3.970000000000000000e+02 7.923682343256113203e-01 +3.980000000000000000e+02 7.768038941903562256e-01 +3.990000000000000000e+02 7.618280774948955614e-01 +4.000000000000000000e+02 7.474098742678558782e-01 +4.010000000000000000e+02 7.335203929410564205e-01 +4.020000000000000000e+02 7.201326070526395950e-01 +4.030000000000000000e+02 7.072212148329793946e-01 +4.040000000000000000e+02 6.947625105339171325e-01 +4.050000000000000000e+02 6.827342664594757693e-01 +4.060000000000000000e+02 6.711156247489294957e-01 +4.070000000000000000e+02 6.598869980471987473e-01 +4.080000000000000000e+02 6.490299782761819181e-01 +4.090000000000000000e+02 6.385272527920262675e-01 +4.100000000000000000e+02 6.283625272786078630e-01 +4.110000000000000000e+02 6.185204547874053604e-01 +4.120000000000000000e+02 6.089865703880761316e-01 +4.130000000000000000e+02 5.997472309431893800e-01 +4.140000000000000000e+02 5.907895595655281440e-01 +4.150000000000000000e+02 5.821013943568177362e-01 +4.160000000000000000e+02 5.736712410634341452e-01 +4.170000000000000000e+02 5.654882293179414043e-01 +4.180000000000000000e+02 5.575420721653520095e-01 +4.190000000000000000e+02 5.498230286005463263e-01 +4.200000000000000000e+02 5.423218688674458221e-01 +4.210000000000000000e+02 5.350298422933366105e-01 +4.220000000000000000e+02 5.279386474518455996e-01 +4.230000000000000000e+02 5.210404044660734701e-01 +4.240000000000000000e+02 5.143276292804849215e-01 +4.250000000000000000e+02 5.077932097447476201e-01 +4.260000000000000000e+02 5.014303833665973986e-01 +4.270000000000000000e+02 4.952327166030171535e-01 +4.280000000000000000e+02 4.891940855703422741e-01 +4.290000000000000000e+02 4.833086580639807672e-01 +4.300000000000000000e+02 4.775708767877461236e-01 +4.310000000000000000e+02 4.719754437012009252e-01 +4.320000000000000000e+02 4.665173054010368081e-01 +4.330000000000000000e+02 4.611916394594177682e-01 +4.340000000000000000e+02 4.559938416486444823e-01 +4.350000000000000000e+02 4.509195139872385072e-01 +4.360000000000000000e+02 4.459644535476448013e-01 +4.370000000000000000e+02 4.411246419708694799e-01 +4.380000000000000000e+02 4.363962356373117801e-01 +4.390000000000000000e+02 4.317755564475641572e-01 +4.400000000000000000e+02 4.272590831700543434e-01 +4.410000000000000000e+02 4.228434433161886163e-01 +4.420000000000000000e+02 4.185254055065021350e-01 +4.430000000000000000e+02 4.143018722940978171e-01 +4.440000000000000000e+02 4.101698734143596203e-01 +4.450000000000000000e+02 4.061265594321264993e-01 +4.460000000000000000e+02 4.021691957597747780e-01 +4.470000000000000000e+02 3.982951570215663151e-01 +4.480000000000000000e+02 3.945019217415195456e-01 +4.490000000000000000e+02 3.907870673336293899e-01 +4.500000000000000000e+02 3.871482653748795633e-01 +4.510000000000000000e+02 3.835832771428268617e-01 +4.520000000000000000e+02 3.800899494009965518e-01 +4.530000000000000000e+02 3.766662104162896152e-01 +4.540000000000000000e+02 3.733100661939305898e-01 +4.550000000000000000e+02 3.700195969163551646e-01 +4.560000000000000000e+02 3.667929535734908431e-01 +4.570000000000000000e+02 3.636283547726303356e-01 +4.580000000000000000e+02 3.605240837170427537e-01 +4.590000000000000000e+02 3.574784853431044462e-01 +4.600000000000000000e+02 3.544899636064058335e-01 +4.610000000000000000e+02 3.515569789080635887e-01 +4.620000000000000000e+02 3.486780456529197103e-01 +4.630000000000000000e+02 3.458517299319014970e-01 +4.640000000000000000e+02 3.430766473212945589e-01 +4.650000000000000000e+02 3.403514607922722979e-01 +4.660000000000000000e+02 3.376748787242742078e-01 +4.670000000000000000e+02 3.350456530163856694e-01 +4.680000000000000000e+02 3.324625772911450339e-01 +4.690000000000000000e+02 3.299244851856524829e-01 +4.700000000000000000e+02 3.274302487250633220e-01 +4.710000000000000000e+02 3.249787767739680810e-01 +4.720000000000000000e+02 3.225690135613545895e-01 +4.730000000000000000e+02 3.201999372751603845e-01 +4.740000000000000000e+02 3.178705587226478002e-01 +4.750000000000000000e+02 3.155799200530782223e-01 +4.760000000000000000e+02 3.133270935393506207e-01 +4.770000000000000000e+02 3.111111804154868543e-01 +4.780000000000000000e+02 3.089313097670201014e-01 +4.790000000000000000e+02 3.067866374715769728e-01 +4.800000000000000000e+02 3.046763451869432537e-01 +4.810000000000000000e+02 3.025996393842827481e-01 +4.820000000000000000e+02 3.005557504241232469e-01 +4.830000000000000000e+02 2.985439316729701642e-01 +4.840000000000000000e+02 2.965634586584907639e-01 +4.850000000000000000e+02 2.946136282613167068e-01 +4.860000000000000000e+02 2.926937579416843960e-01 +4.870000000000000000e+02 2.908031849991328799e-01 +4.880000000000000000e+02 2.889412658636900111e-01 +4.890000000000000000e+02 2.871073754169614078e-01 +4.900000000000000000e+02 2.853009063417092928e-01 +4.910000000000000000e+02 2.835212684985126685e-01 +4.920000000000000000e+02 2.817678883282564439e-01 +4.930000000000000000e+02 2.800402082791625946e-01 +4.940000000000000000e+02 2.783376862572609078e-01 +4.950000000000000000e+02 2.766597950991546151e-01 +4.960000000000000000e+02 2.750060220660593413e-01 +4.970000000000000000e+02 2.733758683581199445e-01 +4.980000000000000000e+02 2.717688486480933086e-01 +4.990000000000000000e+02 2.701844906334607277e-01 +5.000000000000000000e+02 2.686223346061878958e-01 +5.010000000000000000e+02 2.670819330392825708e-01 +5.020000000000000000e+02 2.655628501894329307e-01 +5.030000000000000000e+02 2.640646617149829400e-01 +5.040000000000000000e+02 2.625869543085715407e-01 +5.050000000000000000e+02 2.611293253437843576e-01 +5.060000000000000000e+02 2.596913825352153982e-01 +5.070000000000000000e+02 2.582727436113309016e-01 +5.080000000000000000e+02 2.568730359995868850e-01 +5.090000000000000000e+02 2.554918965232875205e-01 +5.100000000000000000e+02 2.541289711096627602e-01 +5.110000000000000000e+02 2.527839145086937522e-01 +5.120000000000000000e+02 2.514563900222213100e-01 +5.130000000000000000e+02 2.501460692429048338e-01 +5.140000000000000000e+02 2.488526318026602346e-01 +5.150000000000000000e+02 2.475757651300865558e-01 +5.160000000000000000e+02 2.463151642166299671e-01 +5.170000000000000000e+02 2.450705313910027938e-01 +5.180000000000000000e+02 2.438415761016357597e-01 +5.190000000000000000e+02 2.426280147067272908e-01 +5.200000000000000000e+02 2.414295702716698078e-01 +5.210000000000000000e+02 2.402459723734994834e-01 +5.220000000000000000e+02 2.390769569121214688e-01 +5.230000000000000000e+02 2.379222659279945085e-01 +5.240000000000000000e+02 2.367816474261073556e-01 +5.250000000000000000e+02 2.356548552058783941e-01 +5.260000000000000000e+02 2.345416486968476544e-01 +5.270000000000000000e+02 2.334417927998909958e-01 +5.280000000000000000e+02 2.323550577337347989e-01 +5.290000000000000000e+02 2.312812188865958907e-01 +5.300000000000000000e+02 2.302200566727157782e-01 +5.310000000000000000e+02 2.291713563936337017e-01 +5.320000000000000000e+02 2.281349081040016658e-01 +5.330000000000000000e+02 2.271105064817594554e-01 +5.340000000000000000e+02 2.260979507025354940e-01 +5.350000000000000000e+02 2.250970443180893843e-01 +5.360000000000000000e+02 2.241075951386504728e-01 +5.370000000000000000e+02 2.231294151190162389e-01 +5.380000000000000000e+02 2.221623202482787551e-01 +5.390000000000000000e+02 2.212061304430074093e-01 +5.400000000000000000e+02 2.202606694438176416e-01 +5.410000000000000000e+02 2.193257647151560519e-01 +5.420000000000000000e+02 2.184012473482151162e-01 +5.430000000000000000e+02 2.174869519668403695e-01 +5.440000000000000000e+02 2.165827166363491763e-01 +5.450000000000000000e+02 2.156883827751495675e-01 +5.460000000000000000e+02 2.148037950690249442e-01 +5.470000000000000000e+02 2.139288013880628614e-01 +5.480000000000000000e+02 2.130632527060586923e-01 +5.490000000000000000e+02 2.122070030223569270e-01 +5.500000000000000000e+02 2.113599092860327378e-01 +5.510000000000000000e+02 2.105218313223237991e-01 +5.520000000000000000e+02 2.096926317612486379e-01 +5.530000000000000000e+02 2.088721759683206114e-01 +5.540000000000000000e+02 2.080603319772994231e-01 +5.550000000000000000e+02 2.072569704249176969e-01 +5.560000000000000000e+02 2.064619644874903792e-01 +5.570000000000000000e+02 2.056751898193578953e-01 +5.580000000000000000e+02 2.048965244931146568e-01 +5.590000000000000000e+02 2.041258489415463395e-01 +5.600000000000000000e+02 2.033630459012148728e-01 +5.610000000000000000e+02 2.026080003576562205e-01 +5.620000000000000000e+02 2.018605994921285063e-01 +5.630000000000000000e+02 2.011207326298440901e-01 +5.640000000000000000e+02 2.003882911896737729e-01 +5.650000000000000000e+02 1.996631686352361712e-01 +5.660000000000000000e+02 1.989452604273535263e-01 +5.670000000000000000e+02 1.982344639778164663e-01 +5.680000000000000000e+02 1.975306786044317420e-01 +5.690000000000000000e+02 1.968338054872833531e-01 +5.700000000000000000e+02 1.961437476262080093e-01 +5.710000000000000000e+02 1.954604097994022405e-01 +5.720000000000000000e+02 1.947836985231734819e-01 +5.730000000000000000e+02 1.941135220127536698e-01 +5.740000000000000000e+02 1.934497901441677992e-01 +5.750000000000000000e+02 1.927924144171384302e-01 +5.760000000000000000e+02 1.921413079189405460e-01 +5.770000000000000000e+02 1.914963852892475060e-01 +5.780000000000000000e+02 1.908575626858804164e-01 +5.790000000000000000e+02 1.902247577514702692e-01 +5.800000000000000000e+02 1.895978895809742881e-01 +5.810000000000000000e+02 1.889768786900545006e-01 +5.820000000000000000e+02 1.883616469842668839e-01 +5.830000000000000000e+02 1.877521177290443766e-01 +5.840000000000000000e+02 1.871482155204517717e-01 +5.850000000000000000e+02 1.865498662566866805e-01 +5.860000000000000000e+02 1.859569971103169073e-01 +5.870000000000000000e+02 1.853695365012026919e-01 +5.880000000000000000e+02 1.847874140701262768e-01 +5.890000000000000000e+02 1.842105606530616557e-01 +5.900000000000000000e+02 1.836389082561044050e-01 +5.910000000000000000e+02 1.830723900310256558e-01 +5.920000000000000000e+02 1.825109402514278889e-01 +5.930000000000000000e+02 1.819544942894908701e-01 +5.940000000000000000e+02 1.814029885932988695e-01 +5.950000000000000000e+02 1.808563606647166366e-01 +5.960000000000000000e+02 1.803145490378097460e-01 +5.970000000000000000e+02 1.797774932577902163e-01 +5.980000000000000000e+02 1.792451338604707789e-01 +5.990000000000000000e+02 1.787174123522242697e-01 +6.000000000000000000e+02 1.781942711904106469e-01 +6.010000000000000000e+02 1.776756537642888711e-01 +6.020000000000000000e+02 1.771615043435660064e-01 +6.030000000000000000e+02 1.766517681917462446e-01 +6.040000000000000000e+02 1.761463913827418515e-01 +6.050000000000000000e+02 1.756453207867278987e-01 +6.060000000000000000e+02 1.751485042140254467e-01 +6.070000000000000000e+02 1.746558902689490100e-01 +6.080000000000000000e+02 1.741674283661302780e-01 +6.090000000000000000e+02 1.736830687147430941e-01 +6.100000000000000000e+02 1.732027623030943653e-01 +6.110000000000000000e+02 1.727264608835598625e-01 +6.120000000000000000e+02 1.722541169578780673e-01 +6.130000000000000000e+02 1.717856837627745048e-01 +6.140000000000000000e+02 1.713211152559170058e-01 +6.150000000000000000e+02 1.708603661021853293e-01 +6.160000000000000000e+02 1.704033916602639420e-01 +6.170000000000000000e+02 1.699501479695191275e-01 +6.180000000000000000e+02 1.695005917371882054e-01 +6.190000000000000000e+02 1.690546803258453357e-01 +6.200000000000000000e+02 1.686123717411563694e-01 +6.210000000000000000e+02 1.681736246198889118e-01 +6.220000000000000000e+02 1.677383982182137079e-01 +6.230000000000000000e+02 1.673066524002369548e-01 +6.240000000000000000e+02 1.668783476268080046e-01 +6.250000000000000000e+02 1.664534449445581321e-01 +6.260000000000000000e+02 1.660319059751846904e-01 +6.270000000000000000e+02 1.656136929049655537e-01 +6.280000000000000000e+02 1.651987684745031826e-01 +6.290000000000000000e+02 1.647870959686940084e-01 +6.300000000000000000e+02 1.643786392069029323e-01 +6.310000000000000000e+02 1.639733625333615885e-01 +6.320000000000000000e+02 1.635712308077605370e-01 +6.330000000000000000e+02 1.631722093960533970e-01 +6.340000000000000000e+02 1.627762641614442785e-01 +6.350000000000000000e+02 1.623833614555767191e-01 +6.360000000000000000e+02 1.619934681099056972e-01 +6.370000000000000000e+02 1.616065514272382597e-01 +6.380000000000000000e+02 1.612225791734774594e-01 +6.390000000000000000e+02 1.608415195695130917e-01 +6.400000000000000000e+02 1.604633412832952855e-01 +6.410000000000000000e+02 1.600880134220697970e-01 +6.420000000000000000e+02 1.597155055247714561e-01 +6.430000000000000000e+02 1.593457875545740698e-01 +6.440000000000000000e+02 1.589788298916008091e-01 +6.450000000000000000e+02 1.586146033257733734e-01 +6.460000000000000000e+02 1.582530790498115625e-01 +6.470000000000000000e+02 1.578942286523798422e-01 +6.480000000000000000e+02 1.575380241113608637e-01 +6.490000000000000000e+02 1.571844377872793352e-01 +6.500000000000000000e+02 1.568334424168470187e-01 +6.510000000000000000e+02 1.564850111066434790e-01 +6.520000000000000000e+02 1.561391173269168764e-01 +6.530000000000000000e+02 1.557957349055201779e-01 +6.540000000000000000e+02 1.554548380219512305e-01 +6.550000000000000000e+02 1.551164012015274762e-01 +6.560000000000000000e+02 1.547803993096629471e-01 +6.570000000000000000e+02 1.544468075462648027e-01 +6.580000000000000000e+02 1.541156014402393082e-01 +6.590000000000000000e+02 1.537867568440994259e-01 +6.600000000000000000e+02 1.534602499286881194e-01 +6.610000000000000000e+02 1.531360571779925017e-01 +6.620000000000000000e+02 1.528141553840649813e-01 +6.630000000000000000e+02 1.524945216420463545e-01 +6.640000000000000000e+02 1.521771333452694164e-01 +6.650000000000000000e+02 1.518619681804810606e-01 +6.660000000000000000e+02 1.515490041231268015e-01 +6.670000000000000000e+02 1.512382194327490104e-01 +6.680000000000000000e+02 1.509295926484607586e-01 +6.690000000000000000e+02 1.506231025845105598e-01 +6.700000000000000000e+02 1.503187283259222740e-01 +6.710000000000000000e+02 1.500164492242310188e-01 +6.720000000000000000e+02 1.497162448932860546e-01 +6.730000000000000000e+02 1.494180952051416267e-01 +6.740000000000000000e+02 1.491219802860143107e-01 +6.750000000000000000e+02 1.488278805123304516e-01 +6.760000000000000000e+02 1.485357765068309466e-01 +6.770000000000000000e+02 1.482456491347580174e-01 +6.780000000000000000e+02 1.479574795001100673e-01 +6.790000000000000000e+02 1.476712489419663155e-01 +6.800000000000000000e+02 1.473869390308726324e-01 +6.810000000000000000e+02 1.471045315653030650e-01 +6.820000000000000000e+02 1.468240085681773444e-01 +6.830000000000000000e+02 1.465453522834480604e-01 +6.840000000000000000e+02 1.462685451727469277e-01 +6.850000000000000000e+02 1.459935699120862851e-01 +6.860000000000000000e+02 1.457204093886343144e-01 +6.870000000000000000e+02 1.454490466975295604e-01 +6.880000000000000000e+02 1.451794651387686153e-01 +6.890000000000000000e+02 1.449116482141396545e-01 +6.900000000000000000e+02 1.446455796242149261e-01 +6.910000000000000000e+02 1.443812432653953093e-01 +6.920000000000000000e+02 1.441186232270041945e-01 +6.930000000000000000e+02 1.438577037884403720e-01 +6.940000000000000000e+02 1.435984694163715825e-01 +6.950000000000000000e+02 1.433409047619862153e-01 +6.960000000000000000e+02 1.430849946582856691e-01 +6.970000000000000000e+02 1.428307241174262832e-01 +6.980000000000000000e+02 1.425780783281141439e-01 +6.990000000000000000e+02 1.423270426530306443e-01 +7.000000000000000000e+02 1.420776026263178560e-01 +7.010000000000000000e+02 1.418297439510987079e-01 +7.020000000000000000e+02 1.415834524970389086e-01 +7.030000000000000000e+02 1.413387142979579958e-01 +7.040000000000000000e+02 1.410955155494731383e-01 +7.050000000000000000e+02 1.408538426066892890e-01 +7.060000000000000000e+02 1.406136819819222561e-01 +7.070000000000000000e+02 1.403750203424682375e-01 +7.080000000000000000e+02 1.401378445084048019e-01 +7.090000000000000000e+02 1.399021414504308669e-01 +7.100000000000000000e+02 1.396678982877458952e-01 +7.110000000000000000e+02 1.394351022859569855e-01 +7.120000000000000000e+02 1.392037408550322874e-01 +7.130000000000000000e+02 1.389738015472771759e-01 +7.140000000000000000e+02 1.387452720553528640e-01 +7.150000000000000000e+02 1.385181402103203563e-01 +7.160000000000000000e+02 1.382923939797251200e-01 +7.170000000000000000e+02 1.380680214657072358e-01 +7.180000000000000000e+02 1.378450109031419957e-01 +7.190000000000000000e+02 1.376233506578171950e-01 +7.200000000000000000e+02 1.374030292246330165e-01 +7.210000000000000000e+02 1.371840352258389684e-01 +7.220000000000000000e+02 1.369663574092904734e-01 +7.230000000000000000e+02 1.367499846467421509e-01 +7.240000000000000000e+02 1.365349059321644964e-01 +7.250000000000000000e+02 1.363211103800867352e-01 +7.260000000000000000e+02 1.361085872239716776e-01 +7.270000000000000000e+02 1.358973258146107255e-01 +7.280000000000000000e+02 1.356873156185454399e-01 +7.290000000000000000e+02 1.354785462165191412e-01 +7.300000000000000000e+02 1.352710073019500470e-01 +7.310000000000000000e+02 1.350646886794264756e-01 +7.320000000000000000e+02 1.348595802632291674e-01 +7.330000000000000000e+02 1.346556720758768644e-01 +7.340000000000000000e+02 1.344529542466919025e-01 +7.350000000000000000e+02 1.342514170103931148e-01 +7.360000000000000000e+02 1.340510507057060263e-01 +7.370000000000000000e+02 1.338518457739976686e-01 +7.380000000000000000e+02 1.336537927579313778e-01 +7.390000000000000000e+02 1.334568823001454352e-01 +7.400000000000000000e+02 1.332611051419475001e-01 +7.410000000000000000e+02 1.330664521220330521e-01 +7.420000000000000000e+02 1.328729141752216514e-01 +7.430000000000000000e+02 1.326804823312139614e-01 +7.440000000000000000e+02 1.324891477133673112e-01 +7.450000000000000000e+02 1.322989015374920752e-01 +7.460000000000000000e+02 1.321097351106583495e-01 +7.470000000000000000e+02 1.319216398300366300e-01 +7.480000000000000000e+02 1.317346071817368236e-01 +7.490000000000000000e+02 1.315486287396825937e-01 +7.500000000000000000e+02 1.313636961644892853e-01 +7.510000000000000000e+02 1.311798012023666360e-01 +7.520000000000000000e+02 1.309969356840380017e-01 +7.530000000000000000e+02 1.308150915236682699e-01 +7.540000000000000000e+02 1.306342607178183901e-01 +7.550000000000000000e+02 1.304544353444075100e-01 +7.560000000000000000e+02 1.302756075616954834e-01 +7.570000000000000000e+02 1.300977696072762868e-01 +7.580000000000000000e+02 1.299209137970908645e-01 +7.590000000000000000e+02 1.297450325244504654e-01 +7.600000000000000000e+02 1.295701182590793532e-01 +7.610000000000000000e+02 1.293961635461650939e-01 +7.620000000000000000e+02 1.292231610054299651e-01 +7.630000000000000000e+02 1.290511033302104704e-01 +7.640000000000000000e+02 1.288799832865510919e-01 +7.650000000000000000e+02 1.287097937123174718e-01 +7.660000000000000000e+02 1.285405275163115646e-01 +7.670000000000000000e+02 1.283721776774102985e-01 +7.680000000000000000e+02 1.282047372437107036e-01 +7.690000000000000000e+02 1.280381993316879186e-01 +7.700000000000000000e+02 1.278725571253688242e-01 +7.710000000000000000e+02 1.277078038755122547e-01 +7.720000000000000000e+02 1.275439328988054732e-01 +7.730000000000000000e+02 1.273809375770720564e-01 +7.740000000000000000e+02 1.272188113564852174e-01 +7.750000000000000000e+02 1.270575477468026127e-01 +7.760000000000000000e+02 1.268971403206005655e-01 +7.770000000000000000e+02 1.267375827125301058e-01 +7.780000000000000000e+02 1.265788686185743694e-01 +7.790000000000000000e+02 1.264209917953211526e-01 +7.800000000000000000e+02 1.262639460592484830e-01 +7.810000000000000000e+02 1.261077252860119124e-01 +7.820000000000000000e+02 1.259523234097486566e-01 +7.830000000000000000e+02 1.257977344223920324e-01 +7.840000000000000000e+02 1.256439523729893926e-01 +7.850000000000000000e+02 1.254909713670352700e-01 +7.860000000000000000e+02 1.253387855658114891e-01 +7.870000000000000000e+02 1.251873891857347154e-01 +7.880000000000000000e+02 1.250367764977200480e-01 +7.890000000000000000e+02 1.248869418265423359e-01 +7.900000000000000000e+02 1.247378795502165627e-01 +7.910000000000000000e+02 1.245895840993819365e-01 +7.920000000000000000e+02 1.244420499566942090e-01 +7.930000000000000000e+02 1.242952716562259613e-01 +7.940000000000000000e+02 1.241492437828803086e-01 +7.950000000000000000e+02 1.240039609718049246e-01 +7.960000000000000000e+02 1.238594179078202906e-01 +7.970000000000000000e+02 1.237156093248517608e-01 +7.980000000000000000e+02 1.235725300053710229e-01 +7.990000000000000000e+02 1.234301747798454418e-01 +8.000000000000000000e+02 1.232885385261939526e-01 +8.010000000000000000e+02 1.231476161692508092e-01 +8.020000000000000000e+02 1.230074026802350229e-01 +8.030000000000000000e+02 1.228678930762312493e-01 +8.040000000000000000e+02 1.227290824196717867e-01 +8.050000000000000000e+02 1.225909658178292172e-01 +8.060000000000000000e+02 1.224535384223158357e-01 +8.070000000000000000e+02 1.223167954285864500e-01 +8.080000000000000000e+02 1.221807320754543513e-01 +8.090000000000000000e+02 1.220453436446048839e-01 +8.100000000000000000e+02 1.219106254601221018e-01 +8.110000000000000000e+02 1.217765728880213644e-01 +8.120000000000000000e+02 1.216431813357826131e-01 +8.130000000000000000e+02 1.215104462518972472e-01 +8.140000000000000000e+02 1.213783631254127249e-01 +8.150000000000000000e+02 1.212469274854940937e-01 +8.160000000000000000e+02 1.211161349009783755e-01 +8.170000000000000000e+02 1.209859809799447711e-01 +8.180000000000000000e+02 1.208564613692843792e-01 +8.190000000000000000e+02 1.207275717542811572e-01 +8.200000000000000000e+02 1.205993078581916039e-01 +8.210000000000000000e+02 1.204716654418368504e-01 +8.220000000000000000e+02 1.203446403031917661e-01 +8.230000000000000000e+02 1.202182282769889698e-01 +8.240000000000000000e+02 1.200924252343202325e-01 +8.250000000000000000e+02 1.199672270822458447e-01 +8.260000000000000000e+02 1.198426297634096749e-01 +8.270000000000000000e+02 1.197186292556593340e-01 +8.280000000000000000e+02 1.195952215716679506e-01 +8.290000000000000000e+02 1.194724027585634535e-01 +8.300000000000000000e+02 1.193501688975628638e-01 +8.310000000000000000e+02 1.192285161036113345e-01 +8.320000000000000000e+02 1.191074405250234086e-01 +8.330000000000000000e+02 1.189869383431292338e-01 +8.340000000000000000e+02 1.188670057719286438e-01 +8.350000000000000000e+02 1.187476390577470314e-01 +8.360000000000000000e+02 1.186288344788918869e-01 +8.370000000000000000e+02 1.185105883453243109e-01 +8.380000000000000000e+02 1.183928969983197715e-01 +8.390000000000000000e+02 1.182757568101472367e-01 +8.400000000000000000e+02 1.181591641837432677e-01 +8.410000000000000000e+02 1.180431155523922887e-01 +8.420000000000000000e+02 1.179276073794141844e-01 +8.430000000000000000e+02 1.178126361578502035e-01 +8.440000000000000000e+02 1.176981984101587025e-01 +8.450000000000000000e+02 1.175842906879083216e-01 +8.460000000000000000e+02 1.174709095714794732e-01 +8.470000000000000000e+02 1.173580516697685372e-01 +8.480000000000000000e+02 1.172457136198948729e-01 +8.490000000000000000e+02 1.171338920869120920e-01 +8.500000000000000000e+02 1.170225837635221894e-01 +8.510000000000000000e+02 1.169117853697922427e-01 +8.520000000000000000e+02 1.168014936528796455e-01 +8.530000000000000000e+02 1.166917053867518178e-01 +8.540000000000000000e+02 1.165824173719189477e-01 +8.550000000000000000e+02 1.164736264351621947e-01 +8.560000000000000000e+02 1.163653294292692486e-01 +8.570000000000000000e+02 1.162575232327723584e-01 +8.580000000000000000e+02 1.161502047496897339e-01 +8.590000000000000000e+02 1.160433709092682786e-01 +8.600000000000000000e+02 1.159370186657307233e-01 +8.610000000000000000e+02 1.158311449980273383e-01 +8.620000000000000000e+02 1.157257469095881036e-01 +8.630000000000000000e+02 1.156208214280777524e-01 +8.640000000000000000e+02 1.155163656051554077e-01 +8.650000000000000000e+02 1.154123765190639694e-01 +8.660000000000000000e+02 1.153088512630748436e-01 +8.670000000000000000e+02 1.152057869622507003e-01 +8.680000000000000000e+02 1.151031807618744379e-01 +8.690000000000000000e+02 1.150010298300601086e-01 +8.700000000000000000e+02 1.148993313575267239e-01 +8.710000000000000000e+02 1.147980825573793051e-01 +8.720000000000000000e+02 1.146972806648860199e-01 +8.730000000000000000e+02 1.145969229372656856e-01 +8.740000000000000000e+02 1.144970066534688052e-01 +8.750000000000000000e+02 1.143975291112577647e-01 +8.760000000000000000e+02 1.142984876378518588e-01 +8.770000000000000000e+02 1.141998795734209676e-01 +8.780000000000000000e+02 1.141017022817588239e-01 +8.790000000000000000e+02 1.140039531473567985e-01 +8.800000000000000000e+02 1.139066295752069607e-01 +8.810000000000000000e+02 1.138097289906028348e-01 +8.820000000000000000e+02 1.137132488389436674e-01 +8.830000000000000000e+02 1.136171865855429841e-01 +8.840000000000000000e+02 1.135215397154349798e-01 +8.850000000000000000e+02 1.134263057331900415e-01 +8.860000000000000000e+02 1.133314821627231100e-01 +8.870000000000000000e+02 1.132370665471139487e-01 +8.880000000000000000e+02 1.131430564484220691e-01 +8.890000000000000000e+02 1.130494494475066530e-01 +8.900000000000000000e+02 1.129562431438497910e-01 +8.910000000000000000e+02 1.128634351553777365e-01 +8.920000000000000000e+02 1.127710231182890571e-01 +8.930000000000000000e+02 1.126790046868823558e-01 +8.940000000000000000e+02 1.125873775333833121e-01 +8.950000000000000000e+02 1.124961393477777044e-01 +8.960000000000000000e+02 1.124052878376476799e-01 +8.970000000000000000e+02 1.123148207280011135e-01 +8.980000000000000000e+02 1.122247357611138863e-01 +8.990000000000000000e+02 1.121350306963663362e-01 +9.000000000000000000e+02 1.120457033100843575e-01 +9.010000000000000000e+02 1.119567513953821786e-01 +9.020000000000000000e+02 1.118681727620066818e-01 +9.030000000000000000e+02 1.117799652361824297e-01 +9.040000000000000000e+02 1.116921266604606888e-01 +9.050000000000000000e+02 1.116046548935675092e-01 +9.060000000000000000e+02 1.115175478102545109e-01 +9.070000000000000000e+02 1.114308033011527782e-01 +9.080000000000000000e+02 1.113444192726263104e-01 +9.090000000000000000e+02 1.112583936466275264e-01 +9.100000000000000000e+02 1.111727243605556553e-01 +9.110000000000000000e+02 1.110874093671137819e-01 +9.120000000000000000e+02 1.110024466341708316e-01 +9.130000000000000000e+02 1.109178341446235977e-01 +9.140000000000000000e+02 1.108335698962584909e-01 +9.150000000000000000e+02 1.107496519016191172e-01 +9.160000000000000000e+02 1.106660781878698319e-01 +9.170000000000000000e+02 1.105828467966657458e-01 +9.180000000000000000e+02 1.104999557840209007e-01 +9.190000000000000000e+02 1.104174032201786920e-01 +9.200000000000000000e+02 1.103351871894839020e-01 +9.210000000000000000e+02 1.102533057902584657e-01 +9.220000000000000000e+02 1.101717571346719354e-01 +9.230000000000000000e+02 1.100905393486206613e-01 +9.240000000000000000e+02 1.100096505716040840e-01 +9.250000000000000000e+02 1.099290889566041929e-01 +9.260000000000000000e+02 1.098488526699644974e-01 +9.270000000000000000e+02 1.097689398912720243e-01 +9.280000000000000000e+02 1.096893488132392597e-01 +9.290000000000000000e+02 1.096100776415877831e-01 +9.300000000000000000e+02 1.095311245949342899e-01 +9.310000000000000000e+02 1.094524879046762239e-01 +9.320000000000000000e+02 1.093741658148773138e-01 +9.330000000000000000e+02 1.092961565821597286e-01 +9.340000000000000000e+02 1.092184584755904742e-01 +9.350000000000000000e+02 1.091410697765749366e-01 +9.360000000000000000e+02 1.090639887787455964e-01 +9.370000000000000000e+02 1.089872137878586250e-01 +9.380000000000000000e+02 1.089107431216855965e-01 +9.390000000000000000e+02 1.088345751099099173e-01 +9.400000000000000000e+02 1.087587080940246032e-01 +9.410000000000000000e+02 1.086831404272250029e-01 +9.420000000000000000e+02 1.086078704743134171e-01 +9.430000000000000000e+02 1.085328966115946953e-01 +9.440000000000000000e+02 1.084582172267784250e-01 +9.450000000000000000e+02 1.083838307188786793e-01 +9.460000000000000000e+02 1.083097354981193278e-01 +9.470000000000000000e+02 1.082359299858364071e-01 +9.480000000000000000e+02 1.081624126143817394e-01 +9.490000000000000000e+02 1.080891818270307420e-01 +9.500000000000000000e+02 1.080162360778867542e-01 +9.510000000000000000e+02 1.079435738317899574e-01 +9.520000000000000000e+02 1.078711935642250597e-01 +9.530000000000000000e+02 1.077990937612315625e-01 +9.540000000000000000e+02 1.077272729193125556e-01 +9.550000000000000000e+02 1.076557295453476337e-01 +9.560000000000000000e+02 1.075844621565031217e-01 +9.570000000000000000e+02 1.075134692801473502e-01 +9.580000000000000000e+02 1.074427494537623234e-01 +9.590000000000000000e+02 1.073723012248589820e-01 +9.600000000000000000e+02 1.073021231508945322e-01 +9.610000000000000000e+02 1.072322137991859187e-01 +9.620000000000000000e+02 1.071625717468284444e-01 +9.630000000000000000e+02 1.070931955806155161e-01 +9.640000000000000000e+02 1.070240838969546970e-01 +9.650000000000000000e+02 1.069552353017884511e-01 +9.660000000000000000e+02 1.068866484105159831e-01 +9.670000000000000000e+02 1.068183218479119290e-01 +9.680000000000000000e+02 1.067502542480503469e-01 +9.690000000000000000e+02 1.066824442542275569e-01 +9.700000000000000000e+02 1.066148905188842033e-01 +9.710000000000000000e+02 1.065475917035315218e-01 +9.720000000000000000e+02 1.064805464786740541e-01 +9.730000000000000000e+02 1.064137535237385385e-01 +9.740000000000000000e+02 1.063472115269971374e-01 +9.750000000000000000e+02 1.062809191854974522e-01 +9.760000000000000000e+02 1.062148752049877493e-01 +9.770000000000000000e+02 1.061490782998490701e-01 +9.780000000000000000e+02 1.060835271930218177e-01 +9.790000000000000000e+02 1.060182206159362012e-01 +9.800000000000000000e+02 1.059531573084446648e-01 +9.810000000000000000e+02 1.058883360187504313e-01 +9.820000000000000000e+02 1.058237555033426230e-01 +9.830000000000000000e+02 1.057594145269267483e-01 +9.840000000000000000e+02 1.056953118623597948e-01 +9.850000000000000000e+02 1.056314462905811602e-01 +9.860000000000000000e+02 1.055678166005525470e-01 +9.870000000000000000e+02 1.055044215891875609e-01 +9.880000000000000000e+02 1.054412600612911616e-01 +9.890000000000000000e+02 1.053783308294948540e-01 +9.900000000000000000e+02 1.053156327141946957e-01 +9.910000000000000000e+02 1.052531645434879454e-01 +9.920000000000000000e+02 1.051909251531117362e-01 +9.930000000000000000e+02 1.051289133863819170e-01 +9.940000000000000000e+02 1.050671280941335023e-01 +9.950000000000000000e+02 1.050055681346592079e-01 +9.960000000000000000e+02 1.049442323736501925e-01 +9.970000000000000000e+02 1.048831196841388536e-01 +9.980000000000000000e+02 1.048222289464388335e-01 +9.990000000000000000e+02 1.047615590480883013e-01 +1.000000000000000000e+03 1.047011088837912635e-01 +1.001000000000000000e+03 1.046408773553645644e-01 +1.002000000000000000e+03 1.045808633716757835e-01 +1.003000000000000000e+03 1.045210658485939970e-01 +1.004000000000000000e+03 1.044614837089305054e-01 +1.005000000000000000e+03 1.044021158823859041e-01 +1.006000000000000000e+03 1.043429613054957100e-01 +1.007000000000000000e+03 1.042840189215769597e-01 +1.008000000000000000e+03 1.042252876806749745e-01 +1.009000000000000000e+03 1.041667665395101389e-01 +1.010000000000000000e+03 1.041084544614278573e-01 +1.011000000000000000e+03 1.040503504163457910e-01 +1.012000000000000000e+03 1.039924533807007057e-01 +1.013000000000000000e+03 1.039347623374024393e-01 +1.014000000000000000e+03 1.038772762757792512e-01 +1.015000000000000000e+03 1.038199941915297769e-01 +1.016000000000000000e+03 1.037629150866763994e-01 +1.017000000000000000e+03 1.037060379695105838e-01 +1.018000000000000000e+03 1.036493618545506062e-01 +1.019000000000000000e+03 1.035928857624903304e-01 +1.020000000000000000e+03 1.035366087201513852e-01 +1.021000000000000000e+03 1.034805297604388941e-01 +1.022000000000000000e+03 1.034246479222913767e-01 +1.023000000000000000e+03 1.033689622506376027e-01 +1.024000000000000000e+03 1.033134717963493238e-01 +1.025000000000000000e+03 1.032581756161953107e-01 +1.026000000000000000e+03 1.032030727727980546e-01 +1.027000000000000000e+03 1.031481623345881088e-01 +1.028000000000000000e+03 1.030934433757606239e-01 +1.029000000000000000e+03 1.030389149762310774e-01 +1.030000000000000000e+03 1.029845762215917393e-01 +1.031000000000000000e+03 1.029304262030692890e-01 +1.032000000000000000e+03 1.028764640174829326e-01 +1.033000000000000000e+03 1.028226887671999518e-01 +1.034000000000000000e+03 1.027690995600967772e-01 +1.035000000000000000e+03 1.027156955095145097e-01 +1.036000000000000000e+03 1.026624757342202710e-01 +1.037000000000000000e+03 1.026094393583663472e-01 +1.038000000000000000e+03 1.025565855114477232e-01 +1.039000000000000000e+03 1.025039133282645287e-01 +1.040000000000000000e+03 1.024514219488819045e-01 +1.041000000000000000e+03 1.023991105185886874e-01 +1.042000000000000000e+03 1.023469781878613150e-01 +1.043000000000000000e+03 1.022950241123237042e-01 +1.044000000000000000e+03 1.022432474527099205e-01 +1.045000000000000000e+03 1.021916473748243348e-01 +1.046000000000000000e+03 1.021402230495066232e-01 +1.047000000000000000e+03 1.020889736525931596e-01 +1.048000000000000000e+03 1.020378983648797117e-01 +1.049000000000000000e+03 1.019869963720854145e-01 +1.050000000000000000e+03 1.019362668648176734e-01 +1.051000000000000000e+03 1.018857090385330427e-01 +1.052000000000000000e+03 1.018353220935056258e-01 +1.053000000000000000e+03 1.017851052347886476e-01 +1.054000000000000000e+03 1.017350576721808841e-01 +1.055000000000000000e+03 1.016851786201908719e-01 +1.056000000000000000e+03 1.016354672980036983e-01 +1.057000000000000000e+03 1.015859229294466815e-01 +1.058000000000000000e+03 1.015365447429553009e-01 +1.059000000000000000e+03 1.014873319715386413e-01 +1.060000000000000000e+03 1.014382838527483482e-01 +1.061000000000000000e+03 1.013893996286432259e-01 +1.062000000000000000e+03 1.013406785457594550e-01 +1.063000000000000000e+03 1.012921198550748303e-01 +1.064000000000000000e+03 1.012437228119800470e-01 +1.065000000000000000e+03 1.011954866762433819e-01 +1.066000000000000000e+03 1.011474107119828131e-01 +1.067000000000000000e+03 1.010994941876316722e-01 +1.068000000000000000e+03 1.010517363759091680e-01 +1.069000000000000000e+03 1.010041365537898972e-01 +1.070000000000000000e+03 1.009566940024713977e-01 +1.071000000000000000e+03 1.009094080073463240e-01 +1.072000000000000000e+03 1.008622778579714996e-01 +1.073000000000000000e+03 1.008153028480373026e-01 +1.074000000000000000e+03 1.007684822753396048e-01 +1.075000000000000000e+03 1.007218154417496153e-01 +1.076000000000000000e+03 1.006753016531853756e-01 +1.077000000000000000e+03 1.006289402195831434e-01 +1.078000000000000000e+03 1.005827304548678608e-01 +1.079000000000000000e+03 1.005366716769261343e-01 +1.080000000000000000e+03 1.004907632075771329e-01 +1.081000000000000000e+03 1.004450043725472613e-01 +1.082000000000000000e+03 1.003993945014384631e-01 +1.083000000000000000e+03 1.003539329277049613e-01 +1.084000000000000000e+03 1.003086189886229079e-01 +1.085000000000000000e+03 1.002634520252660283e-01 +1.086000000000000000e+03 1.002184313824786566e-01 +1.087000000000000000e+03 1.001735564088459679e-01 +1.088000000000000000e+03 1.001288264566743968e-01 +1.089000000000000000e+03 1.000842408819575258e-01 +1.090000000000000000e+03 1.000397990443580853e-01 +1.091000000000000000e+03 9.999550030717636873e-02 +1.092000000000000000e+03 9.995134403732905404e-02 +1.093000000000000000e+03 9.990732960532092144e-02 +1.094000000000000000e+03 9.986345638522189927e-02 +1.095000000000000000e+03 9.981972375464288894e-02 +1.096000000000000000e+03 9.977613109470875874e-02 +1.097000000000000000e+03 9.973267779003605615e-02 +1.098000000000000000e+03 9.968936322870819433e-02 +1.099000000000000000e+03 9.964618680225158232e-02 diff --git a/spectractor/extractor/dispersers/holo4_003/ratio_order_3over2.txt b/spectractor/extractor/dispersers/holo4_003/ratio_order_3over2.txt new file mode 100644 index 000000000..de6d05742 --- /dev/null +++ b/spectractor/extractor/dispersers/holo4_003/ratio_order_3over2.txt @@ -0,0 +1,800 @@ +3.000000000000000000e+02 7.961299851462676214e-02 +3.010000000000000000e+02 1.332288155026307430e-01 +3.020000000000000000e+02 2.140794239934083465e-01 +3.030000000000000000e+02 3.358020697199494697e-01 +3.040000000000000000e+02 5.203650267662797146e-01 +3.050000000000000000e+02 8.039346299497034387e-01 +3.060000000000000000e+02 1.246857969960517787e+00 +3.070000000000000000e+02 1.948756173976117223e+00 +3.080000000000000000e+02 3.061564326085904231e+00 +3.090000000000000000e+02 4.754068346658284483e+00 +3.100000000000000000e+02 6.980099788528115745e+00 +3.110000000000000000e+02 8.989994104067182690e+00 +3.120000000000000000e+02 9.568274014305636399e+00 +3.130000000000000000e+02 8.602215291399884833e+00 +3.140000000000000000e+02 7.064599362725426879e+00 +3.150000000000000000e+02 5.654047497876379502e+00 +3.160000000000000000e+02 4.554202335271595459e+00 +3.170000000000000000e+02 3.734874132958712512e+00 +3.180000000000000000e+02 3.125853968470231337e+00 +3.190000000000000000e+02 2.666882617112256604e+00 +3.200000000000000000e+02 2.314416691882152044e+00 +3.210000000000000000e+02 2.038406572548078888e+00 +3.220000000000000000e+02 1.818230229845627210e+00 +3.230000000000000000e+02 1.639595893845350316e+00 +3.240000000000000000e+02 1.492441797633357714e+00 +3.250000000000000000e+02 1.369558229931185922e+00 +3.260000000000000000e+02 1.265686753132716502e+00 +3.270000000000000000e+02 1.176926314575905907e+00 +3.280000000000000000e+02 1.100336288900929382e+00 +3.290000000000000000e+02 1.033666940003522106e+00 +3.300000000000000000e+02 9.751734048420805934e-01 +3.310000000000000000e+02 9.234852495649015225e-01 +3.320000000000000000e+02 8.775135804346393398e-01 +3.330000000000000000e+02 8.363839278155630330e-01 +3.340000000000000000e+02 7.993870835692526988e-01 +3.350000000000000000e+02 7.659426242203544177e-01 +3.360000000000000000e+02 7.355715196817254053e-01 +3.370000000000000000e+02 7.078753324939935920e-01 +3.380000000000000000e+02 6.825202553748643819e-01 +3.390000000000000000e+02 6.592247409811804459e-01 +3.400000000000000000e+02 6.377498271070528579e-01 +3.410000000000000000e+02 6.178915046436176395e-01 +3.420000000000000000e+02 5.994746482197726989e-01 +3.430000000000000000e+02 5.823481528430023424e-01 +3.440000000000000000e+02 5.663810090244997264e-01 +3.450000000000000000e+02 5.514591139482380999e-01 +3.460000000000000000e+02 5.374826641907224367e-01 +3.470000000000000000e+02 5.243640111435605711e-01 +3.480000000000000000e+02 5.120258870188540978e-01 +3.490000000000000000e+02 5.003999295189858199e-01 +3.500000000000000000e+02 4.894254486430644757e-01 +3.510000000000000000e+02 4.790483909090546000e-01 +3.520000000000000000e+02 4.692204653945375448e-01 +3.530000000000000000e+02 4.598984030952154023e-01 +3.540000000000000000e+02 4.510433266541649666e-01 +3.550000000000000000e+02 4.426202118881453762e-01 +3.560000000000000000e+02 4.345974260009224932e-01 +3.570000000000000000e+02 4.269463301312558245e-01 +3.580000000000000000e+02 4.196409360911090292e-01 +3.590000000000000000e+02 4.126576089255324931e-01 +3.600000000000000000e+02 4.059748083617220060e-01 +3.610000000000000000e+02 3.995728633805583629e-01 +3.620000000000000000e+02 3.934337750951352741e-01 +3.630000000000000000e+02 3.875410439001367724e-01 +3.640000000000000000e+02 3.818795174965109451e-01 +3.650000000000000000e+02 3.764352569253868741e-01 +3.660000000000000000e+02 3.711954181837090472e-01 +3.670000000000000000e+02 3.661481473589716096e-01 +3.680000000000000000e+02 3.612824875251964829e-01 +3.690000000000000000e+02 3.565882958973327632e-01 +3.700000000000000000e+02 3.520561699557953061e-01 +3.710000000000000000e+02 3.476773814336127644e-01 +3.720000000000000000e+02 3.434438172114515075e-01 +3.730000000000000000e+02 3.393479262955031439e-01 +3.740000000000000000e+02 3.353826721633714203e-01 +3.750000000000000000e+02 3.315414898571716340e-01 +3.760000000000000000e+02 3.278182472833725547e-01 +3.770000000000000000e+02 3.242072102478924522e-01 +3.780000000000000000e+02 3.207030108140977442e-01 +3.790000000000000000e+02 3.173006186224021641e-01 +3.800000000000000000e+02 3.139953148542299344e-01 +3.810000000000000000e+02 3.107826685611519424e-01 +3.820000000000000000e+02 3.076585151131501772e-01 +3.830000000000000000e+02 3.046189365486084988e-01 +3.840000000000000000e+02 3.016602436337605386e-01 +3.850000000000000000e+02 2.987789594610280042e-01 +3.860000000000000000e+02 2.959718044349548549e-01 +3.870000000000000000e+02 2.932356825109964649e-01 +3.880000000000000000e+02 2.905676685672203274e-01 +3.890000000000000000e+02 2.879649968019114548e-01 +3.900000000000000000e+02 2.854250500613068620e-01 +3.910000000000000000e+02 2.829453500119029075e-01 +3.920000000000000000e+02 2.805235480805149395e-01 +3.930000000000000000e+02 2.781574170931823686e-01 +3.940000000000000000e+02 2.758448435509671670e-01 +3.950000000000000000e+02 2.735838204868805135e-01 +3.960000000000000000e+02 2.713724408536276611e-01 +3.970000000000000000e+02 2.692088913968753716e-01 +3.980000000000000000e+02 2.670914469729461227e-01 +3.990000000000000000e+02 2.650184652738983848e-01 +4.000000000000000000e+02 2.629883819263793554e-01 +4.010000000000000000e+02 2.609997059337193503e-01 +4.020000000000000000e+02 2.590510154336600479e-01 +4.030000000000000000e+02 2.571409537464698358e-01 +4.040000000000000000e+02 2.552682256906250169e-01 +4.050000000000000000e+02 2.534315941451266152e-01 +4.060000000000000000e+02 2.516298768394835683e-01 +4.070000000000000000e+02 2.498619433539414070e-01 +4.080000000000000000e+02 2.481267123141129294e-01 +4.090000000000000000e+02 2.464231487654904296e-01 +4.100000000000000000e+02 2.447502617145134174e-01 +4.110000000000000000e+02 2.431071018240412718e-01 +4.120000000000000000e+02 2.414927592520367816e-01 +4.130000000000000000e+02 2.399063616231849327e-01 +4.140000000000000000e+02 2.383470721240262269e-01 +4.150000000000000000e+02 2.368140877129318866e-01 +4.160000000000000000e+02 2.353066374369191249e-01 +4.170000000000000000e+02 2.338239808479604664e-01 +4.180000000000000000e+02 2.323654065119738765e-01 +4.190000000000000000e+02 2.309302306042842479e-01 +4.200000000000000000e+02 2.295177955857041763e-01 +4.210000000000000000e+02 2.281274689539329326e-01 +4.220000000000000000e+02 2.267586420653266988e-01 +4.230000000000000000e+02 2.254107290224274251e-01 +4.240000000000000000e+02 2.240831656230506952e-01 +4.250000000000000000e+02 2.227754083669700180e-01 +4.260000000000000000e+02 2.214869335165711162e-01 +4.270000000000000000e+02 2.202172362080710710e-01 +4.280000000000000000e+02 2.189658296101751611e-01 +4.290000000000000000e+02 2.177322441272342146e-01 +4.300000000000000000e+02 2.165160266441842063e-01 +4.310000000000000000e+02 2.153167398107430908e-01 +4.320000000000000000e+02 2.141339613625038996e-01 +4.330000000000000000e+02 2.129672834767183942e-01 +4.340000000000000000e+02 2.118163121607318511e-01 +4.350000000000000000e+02 2.106806666711602549e-01 +4.360000000000000000e+02 2.095599789620027076e-01 +4.370000000000000000e+02 2.084538931600571632e-01 +4.380000000000000000e+02 2.073620650660302211e-01 +4.390000000000000000e+02 2.062841616799475086e-01 +4.400000000000000000e+02 2.052198607494348237e-01 +4.410000000000000000e+02 2.041688503396373866e-01 +4.420000000000000000e+02 2.031308284235689432e-01 +4.430000000000000000e+02 2.021055024917489673e-01 +4.440000000000000000e+02 2.010925891801146337e-01 +4.450000000000000000e+02 2.000918139151833253e-01 +4.460000000000000000e+02 1.991029105755633688e-01 +4.470000000000000000e+02 1.981256211689262081e-01 +4.480000000000000000e+02 1.971596955236434578e-01 +4.490000000000000000e+02 1.962048909942987196e-01 +4.500000000000000000e+02 1.952609721803653386e-01 +4.510000000000000000e+02 1.943277106573545743e-01 +4.520000000000000000e+02 1.934048847198230336e-01 +4.530000000000000000e+02 1.924922791356010188e-01 +4.540000000000000000e+02 1.915896849107006916e-01 +4.550000000000000000e+02 1.906968990643508333e-01 +4.560000000000000000e+02 1.898137244136666735e-01 +4.570000000000000000e+02 1.889399693674656822e-01 +4.580000000000000000e+02 1.880754477287910620e-01 +4.590000000000000000e+02 1.872199785057147292e-01 +4.600000000000000000e+02 1.863733857300050589e-01 +4.610000000000000000e+02 1.855354982833024580e-01 +4.620000000000000000e+02 1.847061497304345323e-01 +4.630000000000000000e+02 1.838851781595266521e-01 +4.640000000000000000e+02 1.830724260285875316e-01 +4.650000000000000000e+02 1.822677400182809437e-01 +4.660000000000000000e+02 1.814709708905761498e-01 +4.670000000000000000e+02 1.806819733530212746e-01 +4.680000000000000000e+02 1.799006059283672354e-01 +4.690000000000000000e+02 1.791267308293136296e-01 +4.700000000000000000e+02 1.783602138381267521e-01 +4.710000000000000000e+02 1.776009241909256298e-01 +4.720000000000000000e+02 1.768487344664192995e-01 +4.730000000000000000e+02 1.761035204788990172e-01 +4.740000000000000000e+02 1.753651611752923556e-01 +4.750000000000000000e+02 1.746335385361159898e-01 +4.760000000000000000e+02 1.739085374801370154e-01 +4.770000000000000000e+02 1.731900457725939479e-01 +4.780000000000000000e+02 1.724779539368175296e-01 +4.790000000000000000e+02 1.717721551691251125e-01 +4.800000000000000000e+02 1.710725452568100935e-01 +4.810000000000000000e+02 1.703790224991346414e-01 +4.820000000000000000e+02 1.696914876311798881e-01 +4.830000000000000000e+02 1.690098437504338191e-01 +4.840000000000000000e+02 1.683339962460135286e-01 +4.850000000000000000e+02 1.676638527303926374e-01 +4.860000000000000000e+02 1.669993229735621254e-01 +4.870000000000000000e+02 1.663403188394913523e-01 +4.880000000000000000e+02 1.656867542248213754e-01 +4.890000000000000000e+02 1.650385449996839560e-01 +4.900000000000000000e+02 1.643956089505726470e-01 +4.910000000000000000e+02 1.637578657251728687e-01 +4.920000000000000000e+02 1.631252367790876068e-01 +4.930000000000000000e+02 1.624976453243637819e-01 +4.940000000000000000e+02 1.618750162797696068e-01 +4.950000000000000000e+02 1.612572762227393597e-01 +4.960000000000000000e+02 1.606443533429307291e-01 +4.970000000000000000e+02 1.600361773973174306e-01 +4.980000000000000000e+02 1.594326796667862034e-01 +4.990000000000000000e+02 1.588337929141440674e-01 +5.000000000000000000e+02 1.582394513435155803e-01 +5.010000000000000000e+02 1.576495905610547088e-01 +5.020000000000000000e+02 1.570641475369312923e-01 +5.030000000000000000e+02 1.564830605685475218e-01 +5.040000000000000000e+02 1.559062692449307008e-01 +5.050000000000000000e+02 1.553337144122596547e-01 +5.060000000000000000e+02 1.547653381404952011e-01 +5.070000000000000000e+02 1.542010836910570060e-01 +5.080000000000000000e+02 1.536408954855126019e-01 +5.090000000000000000e+02 1.530847190752566700e-01 +5.100000000000000000e+02 1.525325011121264895e-01 +5.110000000000000000e+02 1.519841893199313232e-01 +5.120000000000000000e+02 1.514397324668538269e-01 +5.130000000000000000e+02 1.508990803386966173e-01 +5.140000000000000000e+02 1.503621837129602012e-01 +5.150000000000000000e+02 1.498289943336809926e-01 +5.160000000000000000e+02 1.492994648870618890e-01 +5.170000000000000000e+02 1.487735489778009845e-01 +5.180000000000000000e+02 1.482512011061621615e-01 +5.190000000000000000e+02 1.477323766457019349e-01 +5.200000000000000000e+02 1.472170318216717566e-01 +5.210000000000000000e+02 1.467051236415289894e-01 +5.220000000000000000e+02 1.461966100694034876e-01 +5.230000000000000000e+02 1.456914497601094205e-01 +5.240000000000000000e+02 1.451896020471993842e-01 +5.250000000000000000e+02 1.446910271597220132e-01 +5.260000000000000000e+02 1.441956860136566487e-01 +5.270000000000000000e+02 1.437035402421477648e-01 +5.280000000000000000e+02 1.432145521784317366e-01 +5.290000000000000000e+02 1.427286848392624319e-01 +5.300000000000000000e+02 1.422459019087904397e-01 +5.310000000000000000e+02 1.417661677229094530e-01 +5.320000000000000000e+02 1.412894472540359159e-01 +5.330000000000000000e+02 1.408157060963131368e-01 +5.340000000000000000e+02 1.403449104512287382e-01 +5.350000000000000000e+02 1.398770271136304533e-01 +5.360000000000000000e+02 1.394120234581230355e-01 +5.370000000000000000e+02 1.389498674258441147e-01 +5.380000000000000000e+02 1.384905275116004308e-01 +5.390000000000000000e+02 1.380339727513476555e-01 +5.400000000000000000e+02 1.375801727100182115e-01 +5.410000000000000000e+02 1.371290974696694198e-01 +5.420000000000000000e+02 1.366807176179598571e-01 +5.430000000000000000e+02 1.362350042369165071e-01 +5.440000000000000000e+02 1.357919288920213519e-01 +5.450000000000000000e+02 1.353514636215761568e-01 +5.460000000000000000e+02 1.349135809263443952e-01 +5.470000000000000000e+02 1.344782537594772232e-01 +5.480000000000000000e+02 1.340454555166927519e-01 +5.490000000000000000e+02 1.336151600267161399e-01 +5.500000000000000000e+02 1.331873415419657092e-01 +5.510000000000000000e+02 1.327619747294848385e-01 +5.520000000000000000e+02 1.323390346621011182e-01 +5.530000000000000000e+02 1.319184968098135180e-01 +5.540000000000000000e+02 1.315003370313998776e-01 +5.550000000000000000e+02 1.310845315662466370e-01 +5.560000000000000000e+02 1.306710570263680538e-01 +5.570000000000000000e+02 1.302598903886419413e-01 +5.580000000000000000e+02 1.298510089872303985e-01 +5.590000000000000000e+02 1.294443905062016287e-01 +5.600000000000000000e+02 1.290400129723235645e-01 +5.610000000000000000e+02 1.286378547480406531e-01 +5.620000000000000000e+02 1.282378945246333557e-01 +5.630000000000000000e+02 1.278401113154921109e-01 +5.640000000000000000e+02 1.274444844497578389e-01 +5.650000000000000000e+02 1.270509935657559153e-01 +5.660000000000000000e+02 1.266596186048500883e-01 +5.670000000000000000e+02 1.262703398055137760e-01 +5.680000000000000000e+02 1.258831376973126581e-01 +5.690000000000000000e+02 1.254979930951669320e-01 +5.700000000000000000e+02 1.251148870937316415e-01 +5.710000000000000000e+02 1.247338010619008508e-01 +5.720000000000000000e+02 1.243547166374542462e-01 +5.730000000000000000e+02 1.239776157218182850e-01 +5.740000000000000000e+02 1.236024804749573935e-01 +5.750000000000000000e+02 1.232292933103926735e-01 +5.760000000000000000e+02 1.228580368903178094e-01 +5.770000000000000000e+02 1.224886941208494368e-01 +5.780000000000000000e+02 1.221212481473756550e-01 +5.790000000000000000e+02 1.217556823500183238e-01 +5.800000000000000000e+02 1.213919803391943636e-01 +5.810000000000000000e+02 1.210301259512846506e-01 +5.820000000000000000e+02 1.206701032444012500e-01 +5.830000000000000000e+02 1.203118964942487962e-01 +5.840000000000000000e+02 1.199554901900795889e-01 +5.850000000000000000e+02 1.196008690307446137e-01 +5.860000000000000000e+02 1.192480179208306595e-01 +5.870000000000000000e+02 1.188969219668824795e-01 +5.880000000000000000e+02 1.185475664737183077e-01 +5.890000000000000000e+02 1.181999369408137240e-01 +5.900000000000000000e+02 1.178540190587768349e-01 +5.910000000000000000e+02 1.175097987059009891e-01 +5.920000000000000000e+02 1.171672619447881175e-01 +5.930000000000000000e+02 1.168263950190492340e-01 +5.940000000000000000e+02 1.164871843500789456e-01 +5.950000000000000000e+02 1.161496165338983394e-01 +5.960000000000000000e+02 1.158136783380677715e-01 +5.970000000000000000e+02 1.154793566986649367e-01 +5.980000000000000000e+02 1.151466387173311207e-01 +5.990000000000000000e+02 1.148155116583784441e-01 +6.000000000000000000e+02 1.144859629459602929e-01 +6.010000000000000000e+02 1.141579801613047396e-01 +6.020000000000000000e+02 1.138315510610745790e-01 +6.030000000000000000e+02 1.135066634902111432e-01 +6.040000000000000000e+02 1.131833054857417364e-01 +6.050000000000000000e+02 1.128614652721903477e-01 +6.060000000000000000e+02 1.125411311557544813e-01 +6.070000000000000000e+02 1.122222916051521246e-01 +6.080000000000000000e+02 1.119049352283636445e-01 +6.090000000000000000e+02 1.115890507702966272e-01 +6.100000000000000000e+02 1.112746271105028162e-01 +6.110000000000000000e+02 1.109616532609311729e-01 +6.120000000000000000e+02 1.106501183637413621e-01 +6.130000000000000000e+02 1.103400116891502525e-01 +6.140000000000000000e+02 1.100313226333304029e-01 +6.150000000000000000e+02 1.097240407163439790e-01 +6.160000000000000000e+02 1.094181555801294059e-01 +6.170000000000000000e+02 1.091136569865165939e-01 +6.180000000000000000e+02 1.088105348152902385e-01 +6.190000000000000000e+02 1.085087790622894233e-01 +6.200000000000000000e+02 1.082083798375482048e-01 +6.210000000000000000e+02 1.079093273634639805e-01 +6.220000000000000000e+02 1.076116119730188142e-01 +6.230000000000000000e+02 1.073152241080153890e-01 +6.240000000000000000e+02 1.070201543173670139e-01 +6.250000000000000000e+02 1.067263932554120415e-01 +6.260000000000000000e+02 1.064339316802580815e-01 +6.270000000000000000e+02 1.061427604521662099e-01 +6.280000000000000000e+02 1.058528705319620317e-01 +6.290000000000000000e+02 1.055642529794833112e-01 +6.300000000000000000e+02 1.052768989520453252e-01 +6.310000000000000000e+02 1.049907997029521783e-01 +6.320000000000000000e+02 1.047059465800220385e-01 +6.330000000000000000e+02 1.044223310241524094e-01 +6.340000000000000000e+02 1.041399445679029173e-01 +6.350000000000000000e+02 1.038587788341130691e-01 +6.360000000000000000e+02 1.035788255345441305e-01 +6.370000000000000000e+02 1.033000764685384071e-01 +6.380000000000000000e+02 1.030225235217194779e-01 +6.390000000000000000e+02 1.027461586647041569e-01 +6.400000000000000000e+02 1.024709739518415291e-01 +6.410000000000000000e+02 1.021969615199819770e-01 +6.420000000000000000e+02 1.019241135872587661e-01 +6.430000000000000000e+02 1.016524224518972896e-01 +6.440000000000000000e+02 1.013818804910511656e-01 +6.450000000000000000e+02 1.011124801596522821e-01 +6.460000000000000000e+02 1.008442139892827411e-01 +6.470000000000000000e+02 1.005770745870757932e-01 +6.480000000000000000e+02 1.003110546346218795e-01 +6.490000000000000000e+02 1.000461468869114218e-01 +6.500000000000000000e+02 9.978234417128330203e-02 +6.510000000000000000e+02 9.951963938640100149e-02 +6.520000000000000000e+02 9.925802550124120105e-02 +6.530000000000000000e+02 9.899749555410496116e-02 +6.540000000000000000e+02 9.873804265164554117e-02 +6.550000000000000000e+02 9.847965996791052667e-02 +6.560000000000000000e+02 9.822234074340530086e-02 +6.570000000000000000e+02 9.796607828417108754e-02 +6.580000000000000000e+02 9.771086596087912024e-02 +6.590000000000000000e+02 9.745669720793985469e-02 +6.600000000000000000e+02 9.720356552263154093e-02 +6.610000000000000000e+02 9.695146446423963393e-02 +6.620000000000000000e+02 9.670038765321312124e-02 +6.630000000000000000e+02 9.645032877033810070e-02 +6.640000000000000000e+02 9.620128155591793628e-02 +6.650000000000000000e+02 9.595323980897974003e-02 +6.660000000000000000e+02 9.570619738648178387e-02 +6.670000000000000000e+02 9.546014820254186684e-02 +6.680000000000000000e+02 9.521508622767922703e-02 +6.690000000000000000e+02 9.497100548806669540e-02 +6.700000000000000000e+02 9.472790006479210601e-02 +6.710000000000000000e+02 9.448576409314531077e-02 +6.720000000000000000e+02 9.424459176189903253e-02 +6.730000000000000000e+02 9.400437731261848673e-02 +6.740000000000000000e+02 9.376511503896947652e-02 +6.750000000000000000e+02 9.352679928604872017e-02 +6.760000000000000000e+02 9.328942444971767556e-02 +6.770000000000000000e+02 9.305298497595046459e-02 +6.780000000000000000e+02 9.281747536019520350e-02 +6.790000000000000000e+02 9.258289014673913575e-02 +6.800000000000000000e+02 9.234922392809159775e-02 +6.810000000000000000e+02 9.211647134437117579e-02 +6.820000000000000000e+02 9.188462708270714319e-02 +6.830000000000000000e+02 9.165368587664779465e-02 +6.840000000000000000e+02 9.142364250558188132e-02 +6.850000000000000000e+02 9.119449179416302953e-02 +6.860000000000000000e+02 9.096622861175272801e-02 +6.870000000000000000e+02 9.073884787186277390e-02 +6.880000000000000000e+02 9.051234453161291493e-02 +6.890000000000000000e+02 9.028671359119457007e-02 +6.900000000000000000e+02 9.006195009334588830e-02 +6.910000000000000000e+02 8.983804912283120669e-02 +6.920000000000000000e+02 8.961500580592933474e-02 +6.930000000000000000e+02 8.939281530993493929e-02 +6.940000000000000000e+02 8.917147284266045693e-02 +6.950000000000000000e+02 8.895097365195243910e-02 +6.960000000000000000e+02 8.873131302520982644e-02 +6.970000000000000000e+02 8.851248628891514314e-02 +6.980000000000000000e+02 8.829448880816814782e-02 +6.990000000000000000e+02 8.807731598622996205e-02 +7.000000000000000000e+02 8.786096326407055734e-02 +7.010000000000000000e+02 8.764542611993125787e-02 +7.020000000000000000e+02 8.743070006888306600e-02 +7.030000000000000000e+02 8.721678066239943461e-02 +7.040000000000000000e+02 8.700366348793345250e-02 +7.050000000000000000e+02 8.679134416850203815e-02 +7.060000000000000000e+02 8.657981836227203465e-02 +7.070000000000000000e+02 8.636908176216102906e-02 +7.080000000000000000e+02 8.615913009543682555e-02 +7.090000000000000000e+02 8.594995912332500931e-02 +7.100000000000000000e+02 8.574156464062566985e-02 +7.110000000000000000e+02 8.553394247532862538e-02 +7.120000000000000000e+02 8.532708848824398229e-02 +7.130000000000000000e+02 8.512099857262904468e-02 +7.140000000000000000e+02 8.491566865382750573e-02 +7.150000000000000000e+02 8.471109468890775096e-02 +7.160000000000000000e+02 8.450727266631387347e-02 +7.170000000000000000e+02 8.430419860551655042e-02 +7.180000000000000000e+02 8.410186855666709760e-02 +7.190000000000000000e+02 8.390027860026526285e-02 +7.200000000000000000e+02 8.369942484682130202e-02 +7.210000000000000000e+02 8.349930343653337583e-02 +7.220000000000000000e+02 8.329991053895692554e-02 +7.230000000000000000e+02 8.310124235269428228e-02 +7.240000000000000000e+02 8.290329510507447874e-02 +7.250000000000000000e+02 8.270606505184592561e-02 +7.260000000000000000e+02 8.250954847687301530e-02 +7.270000000000000000e+02 8.231374169183171274e-02 +7.280000000000000000e+02 8.211864103591502706e-02 +7.290000000000000000e+02 8.192424287554087026e-02 +7.300000000000000000e+02 8.173054360406327434e-02 +7.310000000000000000e+02 8.153753964148807709e-02 +7.320000000000000000e+02 8.134522743419352053e-02 +7.330000000000000000e+02 8.115360345465280623e-02 +7.340000000000000000e+02 8.096266420116210449e-02 +7.350000000000000000e+02 8.077240619757197759e-02 +7.360000000000000000e+02 8.058282599302331317e-02 +7.370000000000000000e+02 8.039392016168322996e-02 +7.380000000000000000e+02 8.020568530248957384e-02 +7.390000000000000000e+02 8.001811803889698205e-02 +7.400000000000000000e+02 7.983121501862579239e-02 +7.410000000000000000e+02 7.964497291341322838e-02 +7.420000000000000000e+02 7.945938841877041303e-02 +7.430000000000000000e+02 7.927445825374186683e-02 +7.440000000000000000e+02 7.909017916066828080e-02 +7.450000000000000000e+02 7.890654790495252313e-02 +7.460000000000000000e+02 7.872356127482506294e-02 +7.470000000000000000e+02 7.854121608112407671e-02 +7.480000000000000000e+02 7.835950915705916509e-02 +7.490000000000000000e+02 7.817843735799966109e-02 +7.500000000000000000e+02 7.799799756125053163e-02 +7.510000000000000000e+02 7.781818666583417698e-02 +7.520000000000000000e+02 7.763900159228455389e-02 +7.530000000000000000e+02 7.746043928242785093e-02 +7.540000000000000000e+02 7.728249669917981735e-02 +7.550000000000000000e+02 7.710517082634169017e-02 +7.560000000000000000e+02 7.692845866839373437e-02 +7.570000000000000000e+02 7.675235725029716516e-02 +7.580000000000000000e+02 7.657686361729941493e-02 +7.590000000000000000e+02 7.640197483473448736e-02 +7.600000000000000000e+02 7.622768798783630118e-02 +7.610000000000000000e+02 7.605400018154383213e-02 +7.620000000000000000e+02 7.588090854031788457e-02 +7.630000000000000000e+02 7.570841020795456011e-02 +7.640000000000000000e+02 7.553650234740082181e-02 +7.650000000000000000e+02 7.536518214057852383e-02 +7.660000000000000000e+02 7.519444678820114136e-02 +7.670000000000000000e+02 7.502429350960332366e-02 +7.680000000000000000e+02 7.485471954256316118e-02 +7.690000000000000000e+02 7.468572214313343172e-02 +7.700000000000000000e+02 7.451729858547094520e-02 +7.710000000000000000e+02 7.434944616167016296e-02 +7.720000000000000000e+02 7.418216218159577602e-02 +7.730000000000000000e+02 7.401544397272466491e-02 +7.740000000000000000e+02 7.384928887997892211e-02 +7.750000000000000000e+02 7.368369426557253021e-02 +7.760000000000000000e+02 7.351865750884771511e-02 +7.770000000000000000e+02 7.335417600612696709e-02 +7.780000000000000000e+02 7.319024717055415408e-02 +7.790000000000000000e+02 7.302686843194303168e-02 +7.800000000000000000e+02 7.286403723663467669e-02 +7.810000000000000000e+02 7.270175104734004357e-02 +7.820000000000000000e+02 7.254000734299849429e-02 +7.830000000000000000e+02 7.237880361863653633e-02 +7.840000000000000000e+02 7.221813738521926096e-02 +7.850000000000000000e+02 7.205800616951270332e-02 +7.860000000000000000e+02 7.189840751394413476e-02 +7.870000000000000000e+02 7.173933897646456170e-02 +7.880000000000000000e+02 7.158079813041265393e-02 +7.890000000000000000e+02 7.142278256437989414e-02 +7.900000000000000000e+02 7.126528988207803117e-02 +7.910000000000000000e+02 7.110831770220976678e-02 +7.920000000000000000e+02 7.095186365833487663e-02 +7.930000000000000000e+02 7.079592539874554613e-02 +7.940000000000000000e+02 7.064050058633830620e-02 +7.950000000000000000e+02 7.048558689848902215e-02 +7.960000000000000000e+02 7.033118202692904830e-02 +7.970000000000000000e+02 7.017728367762288144e-02 +7.980000000000000000e+02 7.002388957064674402e-02 +7.990000000000000000e+02 6.987099744006955437e-02 +8.000000000000000000e+02 6.971860503383361940e-02 +8.010000000000000000e+02 6.956671011364025381e-02 +8.020000000000000000e+02 6.941531045483030626e-02 +8.030000000000000000e+02 6.926440384627337299e-02 +8.040000000000000000e+02 6.911398809025275092e-02 +8.050000000000000000e+02 6.896406100235479009e-02 +8.060000000000000000e+02 6.881462041135676111e-02 +8.070000000000000000e+02 6.866566415912081500e-02 +8.080000000000000000e+02 6.851719010048246128e-02 +8.090000000000000000e+02 6.836919610314487472e-02 +8.100000000000000000e+02 6.822168004757425686e-02 +8.110000000000000000e+02 6.807463982689469784e-02 +8.120000000000000000e+02 6.792807334678388487e-02 +8.130000000000000000e+02 6.778197852537252988e-02 +8.140000000000000000e+02 6.763635329314113265e-02 +8.150000000000000000e+02 6.749119559282232284e-02 +8.160000000000000000e+02 6.734650337930052355e-02 +8.170000000000000000e+02 6.720227461951526482e-02 +8.180000000000000000e+02 6.705850729236101371e-02 +8.190000000000000000e+02 6.691519938859687155e-02 +8.200000000000000000e+02 6.677234891074584899e-02 +8.210000000000000000e+02 6.662995387300783834e-02 +8.220000000000000000e+02 6.648801230115966576e-02 +8.230000000000000000e+02 6.634652223246935432e-02 +8.240000000000000000e+02 6.620548171560201867e-02 +8.250000000000000000e+02 6.606488881053071416e-02 +8.260000000000000000e+02 6.592474158844759125e-02 +8.270000000000000000e+02 6.578503813167710379e-02 +8.280000000000000000e+02 6.564577653358878717e-02 +8.290000000000000000e+02 6.550695489850784370e-02 +8.300000000000000000e+02 6.536857134163538696e-02 +8.310000000000000000e+02 6.523062398895929093e-02 +8.320000000000000000e+02 6.509311097717457306e-02 +8.330000000000000000e+02 6.495603045359808758e-02 +8.340000000000000000e+02 6.481938057608727100e-02 +8.350000000000000000e+02 6.468315951296153832e-02 +8.360000000000000000e+02 6.454736544291815592e-02 +8.370000000000000000e+02 6.441199655495803700e-02 +8.380000000000000000e+02 6.427705104830210014e-02 +8.390000000000000000e+02 6.414252713231743952e-02 +8.400000000000000000e+02 6.400842302644024762e-02 +8.410000000000000000e+02 6.387473696009483837e-02 +8.420000000000000000e+02 6.374146717262732520e-02 +8.430000000000000000e+02 6.360861191322132735e-02 +8.440000000000000000e+02 6.347616944083175894e-02 +8.450000000000000000e+02 6.334413802410918115e-02 +8.460000000000000000e+02 6.321251594132408502e-02 +8.470000000000000000e+02 6.308130148030240136e-02 +8.480000000000000000e+02 6.295049293834584225e-02 +8.490000000000000000e+02 6.282008862216974243e-02 +8.500000000000000000e+02 6.269008684783013152e-02 +8.510000000000000000e+02 6.256048594065226343e-02 +8.520000000000000000e+02 6.243128423516935283e-02 +8.530000000000000000e+02 6.230248007504667063e-02 +8.540000000000000000e+02 6.217407181302170988e-02 +8.550000000000000000e+02 6.204605781083433191e-02 +8.560000000000000000e+02 6.191843643916138812e-02 +8.570000000000000000e+02 6.179120607755436700e-02 +8.580000000000000000e+02 6.166436511437235757e-02 +8.590000000000000000e+02 6.153791194671959230e-02 +8.600000000000000000e+02 6.141184498038079059e-02 +8.610000000000000000e+02 6.128616262976280260e-02 +8.620000000000000000e+02 6.116086331782810692e-02 +8.630000000000000000e+02 6.103594547603619774e-02 +8.640000000000000000e+02 6.091140754428196052e-02 +8.650000000000000000e+02 6.078724797083638609e-02 +8.660000000000000000e+02 6.066346521228518224e-02 +8.670000000000000000e+02 6.054005773347347769e-02 +8.680000000000000000e+02 6.041702400744229651e-02 +8.690000000000000000e+02 6.029436251537583641e-02 +8.700000000000000000e+02 6.017207174654047586e-02 +8.710000000000000000e+02 6.005015019822931843e-02 +8.720000000000000000e+02 5.992859637570507186e-02 +8.730000000000000000e+02 5.980740879214777039e-02 +8.740000000000000000e+02 5.968658596859374027e-02 +8.750000000000000000e+02 5.956612643388636830e-02 +8.760000000000000000e+02 5.944602872461682980e-02 +8.770000000000000000e+02 5.932629138507602290e-02 +8.780000000000000000e+02 5.920691296719701041e-02 +8.790000000000000000e+02 5.908789203050245076e-02 +8.800000000000000000e+02 5.896922714205522775e-02 +8.810000000000000000e+02 5.885091687640416069e-02 +8.820000000000000000e+02 5.873295981553382922e-02 +8.830000000000000000e+02 5.861535454881306589e-02 +8.840000000000000000e+02 5.849809967294432311e-02 +8.850000000000000000e+02 5.838119379191560043e-02 +8.860000000000000000e+02 5.826463551694777143e-02 +8.870000000000000000e+02 5.814842346644778087e-02 +8.880000000000000000e+02 5.803255626596106470e-02 +8.890000000000000000e+02 5.791703254812029245e-02 +8.900000000000000000e+02 5.780185095260030603e-02 +8.910000000000000000e+02 5.768701012606759770e-02 +8.920000000000000000e+02 5.757250872213757337e-02 +8.930000000000000000e+02 5.745834540132586238e-02 +8.940000000000000000e+02 5.734451883100093877e-02 +8.950000000000000000e+02 5.723102768533962909e-02 +8.960000000000000000e+02 5.711787064528337649e-02 +8.970000000000000000e+02 5.700504639849190286e-02 +8.980000000000000000e+02 5.689255363929695414e-02 +8.990000000000000000e+02 5.678039106866154123e-02 +9.000000000000000000e+02 5.666855739413403925e-02 +9.010000000000000000e+02 5.655705132980475697e-02 +9.020000000000000000e+02 5.644587159626474060e-02 +9.030000000000000000e+02 5.633501692056052529e-02 +9.040000000000000000e+02 5.622448603615591567e-02 +9.050000000000000000e+02 5.611427768288385770e-02 +9.060000000000000000e+02 5.600439060691189685e-02 +9.070000000000000000e+02 5.589482356069510466e-02 +9.080000000000000000e+02 5.578557530293885847e-02 +9.090000000000000000e+02 5.567664459855761749e-02 +9.100000000000000000e+02 5.556803021863365027e-02 +9.110000000000000000e+02 5.545973094037940504e-02 +9.120000000000000000e+02 5.535174554709338529e-02 +9.130000000000000000e+02 5.524407282812886927e-02 +9.140000000000000000e+02 5.513671157884629526e-02 +9.150000000000000000e+02 5.502966060058165493e-02 +9.160000000000000000e+02 5.492291870060433956e-02 +9.170000000000000000e+02 5.481648469208057900e-02 +9.180000000000000000e+02 5.471035739403662390e-02 +9.190000000000000000e+02 5.460453563132046384e-02 +9.200000000000000000e+02 5.449901823456317074e-02 +9.210000000000000000e+02 5.439380404014901305e-02 +9.220000000000000000e+02 5.428889189017009620e-02 +9.230000000000000000e+02 5.418428063239608822e-02 +9.240000000000000000e+02 5.407996912023766561e-02 +9.250000000000000000e+02 5.397595621270976501e-02 +9.260000000000000000e+02 5.387224077439715930e-02 +9.270000000000000000e+02 5.376882167542018642e-02 +9.280000000000000000e+02 5.366569779140005492e-02 +9.290000000000000000e+02 5.356286800342188043e-02 +9.300000000000000000e+02 5.346033119800532030e-02 +9.310000000000000000e+02 5.335808626706761704e-02 +9.320000000000000000e+02 5.325613210788914670e-02 +9.330000000000000000e+02 5.315446762308459472e-02 +9.340000000000000000e+02 5.305309172056539568e-02 +9.350000000000000000e+02 5.295200331351098549e-02 +9.360000000000000000e+02 5.285120132033131746e-02 +9.370000000000000000e+02 5.275068466464050143e-02 +9.380000000000000000e+02 5.265045227522070770e-02 +9.390000000000000000e+02 5.255050308599330117e-02 +9.400000000000000000e+02 5.245083603598438282e-02 +9.410000000000000000e+02 5.235145006929694395e-02 +9.420000000000000000e+02 5.225234413507608144e-02 +9.430000000000000000e+02 5.215351718748354598e-02 +9.440000000000000000e+02 5.205496818566268669e-02 +9.450000000000000000e+02 5.195669609370881514e-02 +9.460000000000000000e+02 5.185869988064253228e-02 +9.470000000000000000e+02 5.176097852037665065e-02 +9.480000000000000000e+02 5.166353099168728008e-02 +9.490000000000000000e+02 5.156635627818639822e-02 +9.500000000000000000e+02 5.146945336829008427e-02 +9.510000000000000000e+02 5.137282125519330306e-02 +9.520000000000000000e+02 5.127645893683676487e-02 +9.530000000000000000e+02 5.118036541588092542e-02 +9.540000000000000000e+02 5.108453969968018010e-02 +9.550000000000000000e+02 5.098898080025093121e-02 +9.560000000000000000e+02 5.089368773424415848e-02 +9.570000000000000000e+02 5.079865952292122316e-02 +9.580000000000000000e+02 5.070389519212406548e-02 +9.590000000000000000e+02 5.060939377224725477e-02 +9.600000000000000000e+02 5.051515429821440417e-02 +9.610000000000000000e+02 5.042117580944818767e-02 +9.620000000000000000e+02 5.032745734984433311e-02 +9.630000000000000000e+02 5.023399796774737081e-02 +9.640000000000000000e+02 5.014079671592251708e-02 +9.650000000000000000e+02 5.004785265153038898e-02 +9.660000000000000000e+02 4.995516483610217690e-02 +9.670000000000000000e+02 4.986273233551228451e-02 +9.680000000000000000e+02 4.977055421995346673e-02 +9.690000000000000000e+02 4.967862956391449342e-02 +9.700000000000000000e+02 4.958695744614960432e-02 +9.710000000000000000e+02 4.949553694966054435e-02 +9.720000000000000000e+02 4.940436716166575482e-02 +9.730000000000000000e+02 4.931344717357958457e-02 +9.740000000000000000e+02 4.922277608098767077e-02 +9.750000000000000000e+02 4.913235298362070291e-02 +9.760000000000000000e+02 4.904217698533338415e-02 +9.770000000000000000e+02 4.895224719407928471e-02 +9.780000000000000000e+02 4.886256272188840150e-02 +9.790000000000000000e+02 4.877312268483927071e-02 +9.800000000000000000e+02 4.868392620304506924e-02 +9.810000000000000000e+02 4.859497240061909362e-02 +9.820000000000000000e+02 4.850626040566254071e-02 +9.830000000000000000e+02 4.841778935023247771e-02 +9.840000000000000000e+02 4.832955837032919255e-02 +9.850000000000000000e+02 4.824156660586283174e-02 +9.860000000000000000e+02 4.815381320064161114e-02 +9.870000000000000000e+02 4.806629730233984849e-02 +9.880000000000000000e+02 4.797901806248633383e-02 +9.890000000000000000e+02 4.789197463643337510e-02 +9.900000000000000000e+02 4.780516618334321177e-02 +9.910000000000000000e+02 4.771859186615777515e-02 +9.920000000000000000e+02 4.763225085158701716e-02 +9.930000000000000000e+02 4.754614231007906616e-02 +9.940000000000000000e+02 4.746026541580609936e-02 +9.950000000000000000e+02 4.737461934663952240e-02 +9.960000000000000000e+02 4.728920328412990204e-02 +9.970000000000000000e+02 4.720401641348708627e-02 +9.980000000000000000e+02 4.711905792356008843e-02 +9.990000000000000000e+02 4.703432700681647177e-02 +1.000000000000000000e+03 4.694982285932213645e-02 +1.001000000000000000e+03 4.686554468072069018e-02 +1.002000000000000000e+03 4.678149167421420673e-02 +1.003000000000000000e+03 4.669766304654451861e-02 +1.004000000000000000e+03 4.661405800797140814e-02 +1.005000000000000000e+03 4.653067577225675905e-02 +1.006000000000000000e+03 4.644751555664054787e-02 +1.007000000000000000e+03 4.636457658182494695e-02 +1.008000000000000000e+03 4.628185807195582535e-02 +1.009000000000000000e+03 4.619935925460127296e-02 +1.010000000000000000e+03 4.611707936073305286e-02 +1.011000000000000000e+03 4.603501762471245290e-02 +1.012000000000000000e+03 4.595317328426416076e-02 +1.013000000000000000e+03 4.587154558046479397e-02 +1.014000000000000000e+03 4.579013375772208322e-02 +1.015000000000000000e+03 4.570893706375506876e-02 +1.016000000000000000e+03 4.562795474957732911e-02 +1.017000000000000000e+03 4.554718606948134074e-02 +1.018000000000000000e+03 4.546663028101787657e-02 +1.019000000000000000e+03 4.538628664497876969e-02 +1.020000000000000000e+03 4.530615442537974658e-02 +1.021000000000000000e+03 4.522623288944378761e-02 +1.022000000000000000e+03 4.514652130758237819e-02 +1.023000000000000000e+03 4.506701895338031255e-02 +1.024000000000000000e+03 4.498772510357602894e-02 +1.025000000000000000e+03 4.490863903804732243e-02 +1.026000000000000000e+03 4.482976003979229768e-02 +1.027000000000000000e+03 4.475108739491331922e-02 +1.028000000000000000e+03 4.467262039260247453e-02 +1.029000000000000000e+03 4.459435832512118059e-02 +1.030000000000000000e+03 4.451630048778755511e-02 +1.031000000000000000e+03 4.443844617895682109e-02 +1.032000000000000000e+03 4.436079470000889313e-02 +1.033000000000000000e+03 4.428334535532755384e-02 +1.034000000000000000e+03 4.420609745229023280e-02 +1.035000000000000000e+03 4.412905030124629480e-02 +1.036000000000000000e+03 4.405220321550581963e-02 +1.037000000000000000e+03 4.397555551132076995e-02 +1.038000000000000000e+03 4.389910650787198082e-02 +1.039000000000000000e+03 4.382285552725249944e-02 +1.040000000000000000e+03 4.374680189445174366e-02 +1.041000000000000000e+03 4.367094493734085398e-02 +1.042000000000000000e+03 4.359528398665875326e-02 +1.043000000000000000e+03 4.351981837599327302e-02 +1.044000000000000000e+03 4.344454744177256300e-02 +1.045000000000000000e+03 4.336947052324281043e-02 +1.046000000000000000e+03 4.329458696245927496e-02 +1.047000000000000000e+03 4.321989610426901773e-02 +1.048000000000000000e+03 4.314539729629629505e-02 +1.049000000000000000e+03 4.307108988892886792e-02 +1.050000000000000000e+03 4.299697323530446424e-02 +1.051000000000000000e+03 4.292304669129345940e-02 +1.052000000000000000e+03 4.284930961548822498e-02 +1.053000000000000000e+03 4.277576136918651711e-02 +1.054000000000000000e+03 4.270240131637885461e-02 +1.055000000000000000e+03 4.262922882373330891e-02 +1.056000000000000000e+03 4.255624326058293772e-02 +1.057000000000000000e+03 4.248344399891215012e-02 +1.058000000000000000e+03 4.241083041334093445e-02 +1.059000000000000000e+03 4.233840188111369363e-02 +1.060000000000000000e+03 4.226615778208513835e-02 +1.061000000000000000e+03 4.219409749870575016e-02 +1.062000000000000000e+03 4.212222041601004080e-02 +1.063000000000000000e+03 4.205052592160153646e-02 +1.064000000000000000e+03 4.197901340564186290e-02 +1.065000000000000000e+03 4.190768226083528558e-02 +1.066000000000000000e+03 4.183653188241730214e-02 +1.067000000000000000e+03 4.176556166814170828e-02 +1.068000000000000000e+03 4.169477101826717796e-02 +1.069000000000000000e+03 4.162415933554438480e-02 +1.070000000000000000e+03 4.155372602520363695e-02 +1.071000000000000000e+03 4.148347049494242877e-02 +1.072000000000000000e+03 4.141339215491256914e-02 +1.073000000000000000e+03 4.134349041770881555e-02 +1.074000000000000000e+03 4.127376469835493389e-02 +1.075000000000000000e+03 4.120421441429165943e-02 +1.076000000000000000e+03 4.113483898536566402e-02 +1.077000000000000000e+03 4.106563783381777383e-02 +1.078000000000000000e+03 4.099661038426729437e-02 +1.079000000000000000e+03 4.092775606370514102e-02 +1.080000000000000000e+03 4.085907430147769220e-02 +1.081000000000000000e+03 4.079056452927744270e-02 +1.082000000000000000e+03 4.072222618113039566e-02 +1.083000000000000000e+03 4.065405869338484246e-02 +1.084000000000000000e+03 4.058606150469744323e-02 +1.085000000000000000e+03 4.051823405602600348e-02 +1.086000000000000000e+03 4.045057579061465958e-02 +1.087000000000000000e+03 4.038308615398251977e-02 +1.088000000000000000e+03 4.031576459391483097e-02 +1.089000000000000000e+03 4.024861056044839319e-02 +1.090000000000000000e+03 4.018162350586326065e-02 +1.091000000000000000e+03 4.011480288466880151e-02 +1.092000000000000000e+03 4.004814815359631491e-02 +1.093000000000000000e+03 3.998165877158500747e-02 +1.094000000000000000e+03 3.991533419976994040e-02 +1.095000000000000000e+03 3.984917390147672128e-02 +1.096000000000000000e+03 3.978317734220530866e-02 +1.097000000000000000e+03 3.971734398962056128e-02 +1.098000000000000000e+03 3.965167331354341879e-02 +1.099000000000000000e+03 3.958616478593766919e-02 From 3acb8080a014ed19037255d1b2677e390fe5565d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 6 Mar 2024 15:46:47 +0100 Subject: [PATCH 067/161] rename more explicitely get_boundaries into set_rectangular_boundaries because psf_cube_masked is modifiy by this function --- spectractor/extractor/chromaticpsf.py | 14 +++++++------- spectractor/extractor/extractor.py | 2 +- spectractor/fit/fit_spectrogram.py | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index fe10458ca..8873a0147 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -613,7 +613,7 @@ def convolve_psf_cube_masked(psf_cube_masked): return psf_cube_masked @staticmethod - def get_boundaries(psf_cube_masked): + def set_rectangular_boundaries(psf_cube_masked): """Compute the ChromaticPSF computation boundaries, as a dictionnary of integers giving the `"xmin"`, `"xmax"`, `"ymin"` and `"ymax"` edges where to compute the PSF for each wavelength. True regions are rectangular after this operation. The `psf_cube_masked` cube is updated accordingly and returned. @@ -639,7 +639,7 @@ def get_boundaries(psf_cube_masked): >>> profile_params[:, 1] = np.arange(s.Nx) >>> psf_cube_masked = s.build_psf_cube_masked(s.set_pixels(mode="2D"), profile_params) >>> psf_cube_masked = s.convolve_psf_cube_masked(psf_cube_masked) - >>> boundaries, psf_cube_masked = s.get_boundaries(psf_cube_masked) + >>> boundaries, psf_cube_masked = s.set_rectangular_boundaries(psf_cube_masked) >>> boundaries["xmin"].shape (100,) >>> psf_cube_masked.shape @@ -751,7 +751,7 @@ def build_sparse_M(self, pixels, profile_params, M_sparse_indices, boundaries, d >>> psf_cube_masked = s.build_psf_cube_masked(s.set_pixels(mode="2D"), profile_params) >>> psf_cube_masked = s.convolve_psf_cube_masked(psf_cube_masked) - >>> boundaries, psf_cube_masked = s.get_boundaries(psf_cube_masked) + >>> boundaries, psf_cube_masked = s.set_rectangular_boundaries(psf_cube_masked) >>> psf_cube_sparse_indices, M_sparse_indices = s.get_sparse_indices(psf_cube_masked) >>> M = s.build_sparse_M(s.set_pixels(mode="2D"), profile_params, M_sparse_indices, boundaries, dtype="float32") >>> M.shape @@ -770,7 +770,7 @@ def build_sparse_M(self, pixels, profile_params, M_sparse_indices, boundaries, d >>> psf_cube_masked = s.build_psf_cube_masked(s.set_pixels(mode="1D"), profile_params) >>> psf_cube_masked = s.convolve_psf_cube_masked(psf_cube_masked) - >>> boundaries, psf_cube_masked = s.get_boundaries(psf_cube_masked) + >>> boundaries, psf_cube_masked = s.set_rectangular_boundaries(psf_cube_masked) >>> psf_cube_sparse_indices, M_sparse_indices = s.get_sparse_indices(psf_cube_masked) >>> M = s.build_sparse_M(s.set_pixels(mode="1D"), profile_params, M_sparse_indices, boundaries, dtype="float32") >>> M.shape @@ -849,7 +849,7 @@ def build_psf_jacobian(self, pixels, profile_params, psf_cube_sparse_indices, bo >>> profile_params[:, 1] = np.arange(s.Nx) # PSF x_c positions >>> psf_cube_masked = s.build_psf_cube_masked(s.set_pixels(mode="2D"), profile_params) >>> psf_cube_masked = s.convolve_psf_cube_masked(psf_cube_masked) - >>> boundaries, psf_cube_masked = s.get_boundaries(psf_cube_masked) + >>> boundaries, psf_cube_masked = s.set_rectangular_boundaries(psf_cube_masked) >>> psf_cube_sparse_indices, M_sparse_indices = s.get_sparse_indices(psf_cube_masked) >>> s.params.fixed[s.Nx:s.Nx+s.deg+1] = [True] * (s.deg+1) # fix all x_c parameters >>> J = s.build_psf_jacobian(s.set_pixels(mode="2D"), profile_params, psf_cube_sparse_indices, boundaries, dtype="float32") @@ -940,7 +940,7 @@ def build_sparse_dM(self, pixels, profile_params, M_sparse_indices, boundaries, >>> profile_params[:, 1] = np.arange(s.Nx) # PSF x_c positions >>> psf_cube_masked = s.build_psf_cube_masked(s.set_pixels(mode="2D"), profile_params) >>> psf_cube_masked = s.convolve_psf_cube_masked(psf_cube_masked) - >>> boundaries, psf_cube_masked = s.get_boundaries(psf_cube_masked) + >>> boundaries, psf_cube_masked = s.set_rectangular_boundaries(psf_cube_masked) >>> psf_cube_sparse_indices, M_sparse_indices = s.get_sparse_indices(psf_cube_masked) >>> s.params.fixed[s.Nx:s.Nx+s.deg+1] = [True] * (s.deg+1) # fix all x_c parameters >>> dM = s.build_sparse_dM(s.set_pixels(mode="2D"), profile_params, M_sparse_indices, boundaries, dtype="float32") @@ -2036,7 +2036,7 @@ def set_mask(self, poly_params=None): fwhmx_clip=3 * parameters.PSF_FWHM_CLIP, fwhmy_clip=parameters.PSF_FWHM_CLIP) self.psf_cube_masked = self.chromatic_psf.convolve_psf_cube_masked(psf_cube_masked) - self.boundaries, self.psf_cube_masked = self.chromatic_psf.get_boundaries(self.psf_cube_masked) + self.boundaries, self.psf_cube_masked = self.chromatic_psf.set_rectangular_boundaries(self.psf_cube_masked) self.psf_cube_sparse_indices, self.M_sparse_indices = self.chromatic_psf.get_sparse_indices(self.psf_cube_masked) mask = np.sum(self.psf_cube_masked.reshape(psf_cube_masked.shape[0], psf_cube_masked[0].size), axis=0) == 0 # cumulate the boolean values as int diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 5f6ed2872..49e9294bd 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -305,7 +305,7 @@ def set_mask(self, params=None, fwhmx_clip=3*parameters.PSF_FWHM_CLIP, fwhmy_cli self.psf_cubes_masked[order] = self.spectrum.chromatic_psf.convolve_psf_cube_masked(psf_cube_masked) # make rectangular mask per wavelength - self.boundaries[order], self.psf_cubes_masked[order] = self.spectrum.chromatic_psf.get_boundaries(self.psf_cubes_masked[order]) + self.boundaries[order], self.psf_cubes_masked[order] = self.spectrum.chromatic_psf.set_rectangular_boundaries(self.psf_cubes_masked[order]) self.psf_cube_sparse_indices[order], self.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(self.psf_cubes_masked[order]) mask = np.sum(self.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], psf_cube_masked[0].size), axis=0) == 0 # cumulate the boolean values as int diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index b96f464ae..46f6dead5 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -237,8 +237,8 @@ def set_mask(self, params=None): fwhmy_clip=parameters.PSF_FWHM_CLIP) psf_cube_masked = self.spectrum.chromatic_psf.convolve_psf_cube_masked(psf_cube_masked) # make rectangular mask per wavelength - self.spectrogram_simulation.boundaries[order], self.spectrogram_simulation.psf_cubes_masked[order] = self.spectrum.chromatic_psf.get_boundaries(psf_cube_masked) - self.spectrogram_simulation.psf_cube_sparse_indices[order], self.spectrogram_simulation.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(psf_cube_masked) + self.spectrogram_simulation.boundaries[order], self.spectrogram_simulation.psf_cubes_masked[order] = self.spectrum.chromatic_psf.set_rectangular_boundaries(psf_cube_masked) + self.spectrogram_simulation.psf_cube_sparse_indices[order], self.spectrogram_simulation.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(self.spectrogram_simulation.psf_cubes_masked[order]) mask = np.sum(self.spectrogram_simulation.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], self.spectrogram_simulation.pixels[0].size), axis=0) == 0 # cumulate the boolean values as int weight_mask = np.sum(self.spectrogram_simulation.psf_cubes_masked[self.diffraction_orders[0]], axis=0) From 3acf878d61e16e1f143f1e721ef8dac42463dd13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 6 Mar 2024 16:20:14 +0100 Subject: [PATCH 068/161] change arguments of get_sparse_indices to use boundaries (faster and more flexible) --- spectractor/extractor/chromaticpsf.py | 39 +++++++++++++++------------ spectractor/extractor/extractor.py | 2 +- spectractor/fit/fit_spectrogram.py | 2 +- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index 8873a0147..781467c8f 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -678,14 +678,13 @@ def set_rectangular_boundaries(psf_cube_masked): psf_cube_masked[k, ymin:ymax, xmin:xmax] = True return boundaries, psf_cube_masked - @staticmethod - def get_sparse_indices(psf_cube_masked): - """Methods that returns the indices to build sparse matrices from `psf_cube_masked`. + def get_sparse_indices(self, boundaries): + """Methods that returns the indices to build sparse matrices from rectangular `boundaries`. Parameters ---------- - psf_cube_masked: np.ndarray - Cube of boolean values where `psf_cube` cube is positive, eventually convolved. + boundaries: dict + The dictionnary of PSF edges per wavelength. Returns ------- @@ -702,14 +701,20 @@ def get_sparse_indices(psf_cube_masked): >>> profile_params[:, 1] = np.arange(s.Nx) >>> psf_cube_masked = s.build_psf_cube_masked(s.set_pixels(mode="2D"), profile_params) >>> psf_cube_masked = s.convolve_psf_cube_masked(psf_cube_masked) - >>> psf_cube_sparse_indices, M_sparse_indices = s.get_sparse_indices(psf_cube_masked) - >>> M_sparse_indices.shape - (72000,) - >>> len(psf_cube_sparse_indices) - 100 + >>> boundaries, psf_cube_masked = s.set_rectangular_boundaries(psf_cube_masked) + >>> psf_cube_sparse_indices, M_sparse_indices = s.get_sparse_indices(boundaries) + >>> assert M_sparse_indices.shape == np.sum(psf_cube_masked) + >>> assert len(psf_cube_sparse_indices) == s.Nx """ - wl_size = psf_cube_masked.shape[0] - psf_cube_sparse_indices = [np.where(psf_cube_masked[k].ravel() > 0)[0] for k in range(wl_size)] + wl_size = self.Nx # assuming that the number of cube layers is the number of pixel columns + psf_cube_sparse_indices = [] + for k in range(wl_size): + xmin, xmax = boundaries["xmin"][k], boundaries["xmax"][k] + if xmin == -1: + psf_cube_sparse_indices.append([]) + else: + ymin, ymax = boundaries["ymin"][k], boundaries["ymax"][k] + psf_cube_sparse_indices.append(np.concatenate([np.arange(xmin,xmax) + k * wl_size for k in range(ymin, ymax)])) M_sparse_indices = np.concatenate(psf_cube_sparse_indices) return psf_cube_sparse_indices, M_sparse_indices @@ -752,7 +757,7 @@ def build_sparse_M(self, pixels, profile_params, M_sparse_indices, boundaries, d >>> psf_cube_masked = s.build_psf_cube_masked(s.set_pixels(mode="2D"), profile_params) >>> psf_cube_masked = s.convolve_psf_cube_masked(psf_cube_masked) >>> boundaries, psf_cube_masked = s.set_rectangular_boundaries(psf_cube_masked) - >>> psf_cube_sparse_indices, M_sparse_indices = s.get_sparse_indices(psf_cube_masked) + >>> psf_cube_sparse_indices, M_sparse_indices = s.get_sparse_indices(boundaries) >>> M = s.build_sparse_M(s.set_pixels(mode="2D"), profile_params, M_sparse_indices, boundaries, dtype="float32") >>> M.shape (2000, 100) @@ -771,7 +776,7 @@ def build_sparse_M(self, pixels, profile_params, M_sparse_indices, boundaries, d >>> psf_cube_masked = s.build_psf_cube_masked(s.set_pixels(mode="1D"), profile_params) >>> psf_cube_masked = s.convolve_psf_cube_masked(psf_cube_masked) >>> boundaries, psf_cube_masked = s.set_rectangular_boundaries(psf_cube_masked) - >>> psf_cube_sparse_indices, M_sparse_indices = s.get_sparse_indices(psf_cube_masked) + >>> psf_cube_sparse_indices, M_sparse_indices = s.get_sparse_indices(boundaries) >>> M = s.build_sparse_M(s.set_pixels(mode="1D"), profile_params, M_sparse_indices, boundaries, dtype="float32") >>> M.shape (2000, 100) @@ -850,7 +855,7 @@ def build_psf_jacobian(self, pixels, profile_params, psf_cube_sparse_indices, bo >>> psf_cube_masked = s.build_psf_cube_masked(s.set_pixels(mode="2D"), profile_params) >>> psf_cube_masked = s.convolve_psf_cube_masked(psf_cube_masked) >>> boundaries, psf_cube_masked = s.set_rectangular_boundaries(psf_cube_masked) - >>> psf_cube_sparse_indices, M_sparse_indices = s.get_sparse_indices(psf_cube_masked) + >>> psf_cube_sparse_indices, M_sparse_indices = s.get_sparse_indices(boundaries) >>> s.params.fixed[s.Nx:s.Nx+s.deg+1] = [True] * (s.deg+1) # fix all x_c parameters >>> J = s.build_psf_jacobian(s.set_pixels(mode="2D"), profile_params, psf_cube_sparse_indices, boundaries, dtype="float32") >>> J.shape @@ -941,7 +946,7 @@ def build_sparse_dM(self, pixels, profile_params, M_sparse_indices, boundaries, >>> psf_cube_masked = s.build_psf_cube_masked(s.set_pixels(mode="2D"), profile_params) >>> psf_cube_masked = s.convolve_psf_cube_masked(psf_cube_masked) >>> boundaries, psf_cube_masked = s.set_rectangular_boundaries(psf_cube_masked) - >>> psf_cube_sparse_indices, M_sparse_indices = s.get_sparse_indices(psf_cube_masked) + >>> psf_cube_sparse_indices, M_sparse_indices = s.get_sparse_indices(boundaries) >>> s.params.fixed[s.Nx:s.Nx+s.deg+1] = [True] * (s.deg+1) # fix all x_c parameters >>> dM = s.build_sparse_dM(s.set_pixels(mode="2D"), profile_params, M_sparse_indices, boundaries, dtype="float32") >>> len(dM), dM[0].shape @@ -2037,7 +2042,7 @@ def set_mask(self, poly_params=None): fwhmy_clip=parameters.PSF_FWHM_CLIP) self.psf_cube_masked = self.chromatic_psf.convolve_psf_cube_masked(psf_cube_masked) self.boundaries, self.psf_cube_masked = self.chromatic_psf.set_rectangular_boundaries(self.psf_cube_masked) - self.psf_cube_sparse_indices, self.M_sparse_indices = self.chromatic_psf.get_sparse_indices(self.psf_cube_masked) + self.psf_cube_sparse_indices, self.M_sparse_indices = self.chromatic_psf.get_sparse_indices(self.boundaries) mask = np.sum(self.psf_cube_masked.reshape(psf_cube_masked.shape[0], psf_cube_masked[0].size), axis=0) == 0 # cumulate the boolean values as int weight_mask = np.sum(self.psf_cube_masked, axis=0) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 49e9294bd..8a9abfa0a 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -306,7 +306,7 @@ def set_mask(self, params=None, fwhmx_clip=3*parameters.PSF_FWHM_CLIP, fwhmy_cli self.psf_cubes_masked[order] = self.spectrum.chromatic_psf.convolve_psf_cube_masked(psf_cube_masked) # make rectangular mask per wavelength self.boundaries[order], self.psf_cubes_masked[order] = self.spectrum.chromatic_psf.set_rectangular_boundaries(self.psf_cubes_masked[order]) - self.psf_cube_sparse_indices[order], self.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(self.psf_cubes_masked[order]) + self.psf_cube_sparse_indices[order], self.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(self.boundaries[order]) mask = np.sum(self.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], psf_cube_masked[0].size), axis=0) == 0 # cumulate the boolean values as int weight_mask = np.sum(self.psf_cubes_masked[self.diffraction_orders[0]], axis=0) diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index 46f6dead5..2a3d8b352 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -238,7 +238,7 @@ def set_mask(self, params=None): psf_cube_masked = self.spectrum.chromatic_psf.convolve_psf_cube_masked(psf_cube_masked) # make rectangular mask per wavelength self.spectrogram_simulation.boundaries[order], self.spectrogram_simulation.psf_cubes_masked[order] = self.spectrum.chromatic_psf.set_rectangular_boundaries(psf_cube_masked) - self.spectrogram_simulation.psf_cube_sparse_indices[order], self.spectrogram_simulation.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(self.spectrogram_simulation.psf_cubes_masked[order]) + self.spectrogram_simulation.psf_cube_sparse_indices[order], self.spectrogram_simulation.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(self.spectrogram_simulation.boundaries[order]) mask = np.sum(self.spectrogram_simulation.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], self.spectrogram_simulation.pixels[0].size), axis=0) == 0 # cumulate the boolean values as int weight_mask = np.sum(self.spectrogram_simulation.psf_cubes_masked[self.diffraction_orders[0]], axis=0) From 3c187b81c605d5f860a9a2ab971c772dca2ca72c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 6 Mar 2024 18:37:41 +0100 Subject: [PATCH 069/161] image simulation using non squares images and rebinned spectra --- spectractor/simulation/image_simulation.py | 68 ++++++++++++++-------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index f19c13561..c6b3392bb 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -1,6 +1,6 @@ from spectractor import parameters from spectractor.config import set_logger -from spectractor.tools import (pixel_rotation, set_wcs_file_name, set_sources_file_name, +from spectractor.tools import (rebin, pixel_rotation, set_wcs_file_name, set_sources_file_name, set_gaia_catalog_file_name, load_wcs_from_file, ensure_dir, plot_image_simple, iraf_source_detection) from spectractor.extractor.images import Image, find_target @@ -176,7 +176,7 @@ def set_star_list(self): margin = 30 mask = np.zeros(data.shape, dtype=bool) for y in range(int(y0) - 100, int(y0) + 100): - for x in range(parameters.CCD_IMSIZE): + for x in range(self.image.data.shape[1]): u, v = pixel_rotation(x, y, self.image.disperser.theta([x0, y0]) * np.pi / 180., x0, y0) if margin > v > -margin: mask[y, x] = True @@ -217,10 +217,12 @@ def plot_model(self): class BackgroundModel: """Class to model the background of the simulated image. - The background model size is set with the parameters.CCD_IMSIZE global keyword. - Attributes ---------- + Nx: int + Size of the background along X axis in pixels. + Ny: int + Size of the background along Y axis in pixels. level: float The mean level of the background in image units. frame: array_like @@ -228,13 +230,15 @@ class BackgroundModel: and the smoothing gaussian width (default: None). """ - def __init__(self, level, frame=None): + def __init__(self, Nx, Ny, level, frame=None): """Create a BackgroundModel instance. - The background model size is set with the parameters.CCD_IMSIZE global keyword. - Parameters ---------- + Nx: int + Size of the background along X axis in pixels. + Ny: int + Size of the background along Y axis in pixels. level: float The mean level of the background in image units. frame: array_like, None @@ -244,17 +248,19 @@ def __init__(self, level, frame=None): Examples -------- >>> from spectractor import parameters - >>> parameters.CCD_IMSIZE = 200 - >>> bgd = BackgroundModel(10) + >>> Nx, Ny = 200, 300 + >>> bgd = BackgroundModel(Nx, Ny, 10) >>> model = bgd.model() >>> np.all(model==10) True >>> model.shape (200, 200) - >>> bgd = BackgroundModel(10, frame=(160, 180, 3)) + >>> bgd = BackgroundModel(Nx, Ny, 10, frame=(160, 180, 3)) >>> bgd.plot_model() """ self.my_logger = set_logger(self.__class__.__name__) + self.Nx = Nx + self.Ny = Ny self.level = level if self.level <= 0: self.my_logger.warning('\n\tBackground level must be strictly positive.') @@ -266,7 +272,6 @@ def model(self): """Compute the background model for the image simulation in image units. A shadowing vignetting frame is roughly simulated if self.frame is set. - The background model size is set with the parameters.CCD_IMSIZE global keyword. Returns ------- @@ -274,7 +279,7 @@ def model(self): The array of the background model. """ - yy, xx = np.mgrid[0:parameters.CCD_IMSIZE:1, 0:parameters.CCD_IMSIZE:1] + xx, yy = np.mgrid[0:self.Ny:1, 0:self.Nx:1] bkgd = self.level * np.ones_like(xx) if self.frame is None: return bkgd @@ -282,9 +287,9 @@ def model(self): xlim, ylim, width = self.frame bkgd[ylim:, :] = self.level / 100 bkgd[:, xlim:] = self.level / 100 - kernel = np.outer(gaussian(parameters.CCD_IMSIZE, width), gaussian(parameters.CCD_IMSIZE, width)) + kernel = np.outer(gaussian(self.Nx, width), gaussian(self.Ny, width)) bkgd = fftconvolve(bkgd, kernel, mode='same') - bkgd *= self.level / bkgd[parameters.CCD_IMSIZE // 2, parameters.CCD_IMSIZE // 2] + bkgd *= self.level / bkgd[self.Ny // 2, self.Nx // 2] return bkgd def plot_model(self): @@ -313,23 +318,27 @@ def plot_model(self): class FlatModel: """Class to model the pixel flat of the simulated image. Flat is dimensionless and its average must be one. - The flat model size is set with the parameters.CCD_IMSIZE global keyword. - Attributes ---------- + Nx: int + Size of the background along X axis in pixels. + Ny: int + Size of the background along Y axis in pixels. gains: array_like The list of gains to apply. The average must be one. randomness_level: float Level of random quantum efficiency to apply to pixels (default: 0.). """ - def __init__(self, gains, randomness_level=0.): + def __init__(self, Nx, Ny, gains, randomness_level=0.): """Create a FlatModel instance. Flat is dimensionless and its average must be one. - The flat model size is set with the parameters.CCD_IMSIZE global keyword. - Parameters ---------- + Nx: int + Size of the background along X axis in pixels. + Ny: int + Size of the background along Y axis in pixels. gains: array_like The list of gains to apply. The average must be one. randomness_level: float @@ -338,8 +347,8 @@ def __init__(self, gains, randomness_level=0.): Examples -------- >>> from spectractor import parameters - >>> parameters.CCD_IMSIZE = 200 - >>> flat = FlatModel(gains=[[1, 2, 3, 4], [4, 3, 2, 1]], with_randomness=True) + >>> Nx, Ny = 200, 300 + >>> flat = FlatModel(Nx, Ny, gains=[[1, 2, 3, 4], [4, 3, 2, 1]]) >>> model = flat.model() >>> print(f"{np.mean(model):.4f}") 1.0000 @@ -348,6 +357,8 @@ def __init__(self, gains, randomness_level=0.): >>> flat.plot_model() """ self.my_logger = set_logger(self.__class__.__name__) + self.Nx = Nx + self.Ny = Ny self.gains = np.atleast_2d(gains).astype(float) if len(self.gains) <= 0: raise ValueError(f"Gains list is empty") @@ -368,7 +379,7 @@ def model(self): flat: array_like The array of the flat model. """ - yy, xx = np.mgrid[0:parameters.CCD_IMSIZE:1, 0:parameters.CCD_IMSIZE:1] + yy, xx = np.mgrid[0:self.Nx:1, 0:self.Ny:1] flat = np.ones_like(xx, dtype=float) hflats = np.array_split(flat, self.gains.shape[0]) for h in range(self.gains.shape[0]): @@ -496,7 +507,14 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer diffraction_orders = np.arange(spectrum.order, spectrum.order + 3 * np.sign(spectrum.order), np.sign(spectrum.order)) image = ImageModel(image_filename, target_label=spectrum.target.label) guess = np.array([spectrum.header['TARGETX'], spectrum.header['TARGETY']]) - guess *= parameters.CCD_REBIN + if parameters.CCD_REBIN != 1: + # these lines allow to simulate images using rebinned spectrum files + guess *= parameters.CCD_REBIN + new_shape = np.asarray((parameters.CCD_IMSIZE, parameters.CCD_IMSIZE)) + old_edge = parameters.CCD_IMSIZE * parameters.CCD_REBIN + image.gain = rebin(image.gain[:old_edge, :old_edge], new_shape, FLAG_MAKESUM=False) + image.read_out_noise = rebin(image.read_out_noise[:old_edge, :old_edge], new_shape, FLAG_MAKESUM=False) + if parameters.DEBUG: image.plot_image(scale='symlog', target_pixcoords=guess) # Fit the star 2D profile @@ -505,7 +523,7 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer # Background model my_logger.info('\n\tBackground model...') bgd_level = float(np.mean(spectrum.spectrogram_bgd)) - background = BackgroundModel(level=bgd_level, frame=None) # (1600, 1650, 100)) + background = BackgroundModel(parameters.CCD_IMSIZE, parameters.CCD_IMSIZE, level=bgd_level, frame=None) if parameters.DEBUG: background.plot_model() @@ -527,7 +545,7 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer flat = None if with_flat: my_logger.info('\n\tFlat model...') - flat = FlatModel(gains=[[1, 2, 3, 4], [4, 3, 2, 1]], randomness_level=1e-2) + flat = FlatModel(parameters.CCD_IMSIZE, parameters.CCD_IMSIZE, gains=[[1, 2, 3, 4], [4, 3, 2, 1]], randomness_level=1e-2) if parameters.DEBUG: flat.plot_model() From 9c8faf0799ade974ced82dcaadc44d082ede17c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 7 Mar 2024 09:29:56 +0100 Subject: [PATCH 070/161] enlarge the next diffraction order footprints to fit inside main order footprint (remove outliers at the edges) --- spectractor/extractor/extractor.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 8a9abfa0a..b388bc6b0 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -306,6 +306,11 @@ def set_mask(self, params=None, fwhmx_clip=3*parameters.PSF_FWHM_CLIP, fwhmy_cli self.psf_cubes_masked[order] = self.spectrum.chromatic_psf.convolve_psf_cube_masked(psf_cube_masked) # make rectangular mask per wavelength self.boundaries[order], self.psf_cubes_masked[order] = self.spectrum.chromatic_psf.set_rectangular_boundaries(self.psf_cubes_masked[order]) + if k > 0: + # spectrogram modelisation must be accurate inside the k=0 order footprint + for i in range(len(psf_cube_masked)): + self.boundaries[order]["ymin"] = np.zeros_like(self.boundaries[order]["ymin"]) + self.boundaries[order]["ymax"] = self.Ny * np.ones_like(self.boundaries[order]["ymax"]) self.psf_cube_sparse_indices[order], self.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(self.boundaries[order]) mask = np.sum(self.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], psf_cube_masked[0].size), axis=0) == 0 # cumulate the boolean values as int From f1bafc8709599c7d233ccd6c96b4a47b067cd0d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 7 Mar 2024 10:49:53 +0100 Subject: [PATCH 071/161] possibility to choose between different parametrisation: legendre or polynomial. DEFAULT NOW is polynomial. Fit for angle and shift_y in FFM, and higher order polynomial terms --- config/default.ini | 2 + spectractor/config.py | 4 ++ spectractor/extractor/chromaticpsf.py | 86 ++++++++++++++++++++------- spectractor/extractor/extractor.py | 20 ++++--- spectractor/parameters.py | 1 + tests/test_fullchain.py | 2 +- 6 files changed, 83 insertions(+), 32 deletions(-) diff --git a/config/default.ini b/config/default.ini index f45ac947b..6db0988f9 100644 --- a/config/default.ini +++ b/config/default.ini @@ -121,6 +121,8 @@ PSF_TYPE = Moffat PSF_POLY_ORDER = 2 # regularisation parameter for the chisq minimisation to extract the spectrum PSF_FIT_REG_PARAM = 0.01 +# polynomial type: must be polynomial or legendre +PSF_POLY_TYPE = "polynomial" [detection line algorithm parameters] # order of the background polynome to fit diff --git a/spectractor/config.py b/spectractor/config.py index 4cba851da..e25984b7a 100644 --- a/spectractor/config.py +++ b/spectractor/config.py @@ -116,6 +116,10 @@ def load_config(config_filename, rebin=True): if parameters.PIXWIDTH_BOXSIZE > parameters.PIXWIDTH_BACKGROUND: raise ValueError(f'parameters.PIXWIDTH_BOXSIZE must be smaller than parameters.PIXWIDTH_BACKGROUND (or equal).') + # check consistency + if parameters.PSF_POLY_TYPE not in ["polynomial", "legendre"]: + raise ValueError(f'parameters.PSF_POLY_TYPE must be either "polynomial" or "legendre". Got {parameters.PSF_POLY_TYPE=}') + # check presence of atmospheric simulation packages if parameters.SPECTRACTOR_ATMOSPHERE_SIM.lower() not in ["none", "libradtran", "getobsatmo"]: raise ValueError(f'parameters.SPECTRACTOR_ATMOSPHERE_SIM must be either ["none", "libradtran", "getobsatmo"]. ' diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index 781467c8f..cd3612682 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -252,7 +252,12 @@ def generate_test_poly_params(self): continue else: shift = self.degrees[name] + 1 - c = np.polynomial.legendre.poly2leg(params[index + shift:index:-1]) + if parameters.PSF_POLY_TYPE == "legendre": + c = np.polynomial.legendre.poly2leg(params[index + shift:index:-1]) + elif parameters.PSF_POLY_TYPE == "polynomial": + c = params[index + shift:index:-1] + else: + raise ValueError(f"Unknown polynomial type {parameters.PSF_POLY_TYPE=}.") coeffs = np.zeros(shift) coeffs[:c.size] = c poly_params[index + 1:index + shift + 1] = coeffs @@ -884,8 +889,13 @@ def build_psf_jacobian(self, pixels, profile_params, psf_cube_sparse_indices, bo if Nx != profile_params.shape[0]: raise ValueError(f"Number of pixels along x axis must be same as profile_params table length. " f"Got {Nx=} and {profile_params.shape}.") - leg_pixels = np.linspace(-1, 1, Nx) - legs = np.zeros((self.n_poly_params-Nx, Nx), dtype=dtype) + if parameters.PSF_POLY_TYPE == "legendre": + poly_x = np.linspace(-1, 1, Nx) + elif parameters.PSF_POLY_TYPE == "polynomial": + poly_x = np.arange(0, Nx) + else: + raise ValueError(f"Unknown polynomial type {parameters.PSF_POLY_TYPE=}.") + polys = np.zeros((self.n_poly_params-Nx, Nx), dtype=dtype) ip = 0 repeats = [] for ipsf, label in enumerate(self.psf.params.labels): @@ -894,7 +904,10 @@ def build_psf_jacobian(self, pixels, profile_params, psf_cube_sparse_indices, bo repeats.append(nparams) for k in range(nparams): coeffs = np.eye(1, nparams, k)[0] - legs[ip] = np.polynomial.legendre.legval(leg_pixels, coeffs).astype(dtype) + if parameters.PSF_POLY_TYPE == "legendre": + polys[ip] = np.polynomial.legendre.legval(poly_x, coeffs).astype(dtype) + elif parameters.PSF_POLY_TYPE == "polynomial": + polys[ip] = np.polynomial.polynomial.polyval(poly_x, coeffs).astype(dtype) ip += 1 for ip, label in enumerate(self.psf.params.labels): if "amplitude" in label: # skip computation of ChromaticPSF jacobian for amplitude parameters @@ -910,7 +923,7 @@ def build_psf_jacobian(self, pixels, profile_params, psf_cube_sparse_indices, bo else: Jpsf = self.psf.jacobian(pixels[boundaries["ymin"][x]:boundaries["ymax"][x]], profile_params[x, :], analytical=True) - J[:, psf_cube_sparse_indices[x]] += np.repeat(Jpsf[1:], repeats, axis=0) * legs[:, x, None] # Jpsf[1:] excludes amplitude + J[:, psf_cube_sparse_indices[x]] += np.repeat(Jpsf[1:], repeats, axis=0) * polys[:, x, None] # Jpsf[1:] excludes amplitude return J def build_sparse_dM(self, pixels, profile_params, M_sparse_indices, boundaries, dtype="float32"): @@ -976,8 +989,13 @@ def build_sparse_dM(self, pixels, profile_params, M_sparse_indices, boundaries, if Nx != profile_params.shape[0]: raise ValueError(f"Number of pixels along x axis must be same as profile_params table length. " f"Got {Nx=} and {profile_params.shape}.") - leg_pixels = np.linspace(-1, 1, Nx) - legs = np.zeros((self.n_poly_params-Nx, Nx), dtype=dtype) + if parameters.PSF_POLY_TYPE == "legendre": + poly_x = np.linspace(-1, 1, Nx) + elif parameters.PSF_POLY_TYPE == "polynomial": + poly_x = np.arange(0, Nx) + else: + raise ValueError(f"Unknown polynomial type {parameters.PSF_POLY_TYPE=}.") + polys = np.zeros((self.n_poly_params-Nx, Nx), dtype=dtype) ip = 0 repeats = [] for ipsf, label in enumerate(self.psf.params.labels): @@ -987,7 +1005,10 @@ def build_sparse_dM(self, pixels, profile_params, M_sparse_indices, boundaries, for k in range(nparams): # psf_index.append(ipsf) coeffs = np.eye(1, nparams, k)[0] - legs[ip] = np.polynomial.legendre.legval(leg_pixels, coeffs).astype(dtype) + if parameters.PSF_POLY_TYPE == "legendre": + polys[ip] = np.polynomial.legendre.legval(poly_x, coeffs).astype(dtype) + elif parameters.PSF_POLY_TYPE == "polynomial": + polys[ip] = np.polynomial.polynomial.polyval(poly_x, coeffs).astype(dtype) ip += 1 sparse_J = np.zeros((self.n_poly_params - self.Nx, M_sparse_indices.size), dtype=dtype) indptr = np.zeros(Nx+1, dtype=int) @@ -1001,7 +1022,7 @@ def build_sparse_dM(self, pixels, profile_params, M_sparse_indices, boundaries, indptr[x+1] = (boundaries["xmax"][x]-boundaries["xmin"][x])*(boundaries["ymax"][x]-boundaries["ymin"][x]) + indptr[x] if boundaries["xmin"][x] < 0: continue - sparse_J[:, indptr[x]:indptr[x+1]] += np.repeat(Jpsf[1:], repeats, axis=0) * legs[:, x, None] + sparse_J[:, indptr[x]:indptr[x + 1]] += np.repeat(Jpsf[1:], repeats, axis=0) * polys[:, x, None] dM = [sparse.csr_matrix((sparse_J[ip], M_sparse_indices, indptr), shape=(len(profile_params), pixels[0].size), dtype=dtype).T for ip in range(sparse_J.shape[0])] return dM @@ -1070,7 +1091,8 @@ def rotate_table(self, angle_degree): def from_profile_params_to_poly_params(self, profile_params, indices=None): """ Transform the profile_params array into a set of parameters for the chromatic PSF parameterisation. - Fit Legendre polynomial functions across the pixels for each PSF parameters. + Fit polynomial functions across the pixels for each PSF parameters. + Type of the polynomial function is set by parameters.PSF_POLY_TYPE. The order of the polynomial functions is given by the self.degrees array. Parameters @@ -1127,8 +1149,12 @@ def from_profile_params_to_poly_params(self, profile_params, indices=None): if amplitude is None: self.my_logger.warning('\n\tAmplitude array not initialized. ' 'Polynomial fit for shape parameters will be unweighted.') - - pixels = np.linspace(-1, 1, len(self.table))[indices] + if parameters.PSF_POLY_TYPE == "legendre": + poly_x = np.linspace(-1, 1, len(self.table))[indices] + elif parameters.PSF_POLY_TYPE == "polynomial": + poly_x = np.arange(0, len(self.table))[indices] + else: + raise ValueError(f"Unknown polynomial type {parameters.PSF_POLY_TYPE=}.") for k, name in enumerate(self.psf.params.labels): delta = 0 if name != 'amplitude': @@ -1137,8 +1163,12 @@ def from_profile_params_to_poly_params(self, profile_params, indices=None): delta = self.x0 if name == 'y_c': delta = self.y0 - fit = np.polynomial.legendre.legfit(pixels, profile_params[indices, k] - delta, - deg=self.degrees[name], w=weights) + if parameters.PSF_POLY_TYPE == "legendre": + fit = np.polynomial.legendre.legfit(poly_x, profile_params[indices, k] - delta, + deg=self.degrees[name], w=weights) + elif parameters.PSF_POLY_TYPE == "polynomial": + fit = np.polynomial.polynomial.polyfit(poly_x, profile_params[indices, k] - delta, + deg=self.degrees[name], w=weights) poly_params = np.concatenate([poly_params, fit]) return poly_params @@ -1264,7 +1294,12 @@ def from_poly_params_to_profile_params(self, poly_params, apply_bounds=False): """ length = len(self.table) - pixels = np.linspace(-1, 1, length) + if parameters.PSF_POLY_TYPE == "legendre": + poly_x = np.linspace(-1, 1, length) + elif parameters.PSF_POLY_TYPE == "polynomial": + poly_x = np.arange(0, length) + else: + raise ValueError(f"Unknown polynomial type {parameters.PSF_POLY_TYPE=}.") profile_params = np.zeros((length, len(self.psf.params.labels))) shift = 0 for k, name in enumerate(self.psf.params.labels): @@ -1275,14 +1310,17 @@ def from_poly_params_to_profile_params(self, poly_params, apply_bounds=False): profile_params[:, k] = np.ones(length) else: if len(poly_params) > length: - profile_params[:, k] = \ - np.polynomial.legendre.legval(pixels, - poly_params[ - length + shift:length + shift + self.degrees[name] + 1]) + if parameters.PSF_POLY_TYPE == "legendre": + profile_params[:, k] = np.polynomial.legendre.legval(poly_x, poly_params[length + shift:length + shift + self.degrees[name] + 1]) + elif parameters.PSF_POLY_TYPE == "polynomial": + profile_params[:, k] = np.polynomial.polynomial.polyval(poly_x, poly_params[length + shift:length + shift + self.degrees[name] + 1]) else: p = poly_params[shift:shift + self.degrees[name] + 1] if len(p) > 0: # to avoid saturation parameters in case not set - profile_params[:, k] = np.polynomial.legendre.legval(pixels, p) + if parameters.PSF_POLY_TYPE == "legendre": + profile_params[:, k] = np.polynomial.legendre.legval(poly_x, p) + elif parameters.PSF_POLY_TYPE == "polynomial": + profile_params[:, k] = np.polynomial.polynomial.polyval(poly_x, p) shift += self.degrees[name] + 1 if name == 'x_c': profile_params[:, k] += self.x0 @@ -1419,14 +1457,16 @@ def plot_summary(self, truth=None): PSF_truth[:, 1] = np.arange(self.Nx) # replace x_c all_pixels = np.arange(self.profile_params.shape[0]) for i, name in enumerate(self.psf.params.labels): - legs = [self.params.values[k] for k in range(self.params.ndim) if name in self.params.labels[k]] - pval = np.polynomial.legendre.leg2poly(legs)[::-1] + coeffs = [self.params.values[k] for k in range(self.params.ndim) if name in self.params.labels[k]] delta = 0 if name == 'x_c': delta = self.x0 if name == 'y_c': delta = self.y0 - PSF_models.append(np.polyval(pval, rescale_x_to_legendre(all_pixels)) + delta) + if parameters.PSF_POLY_TYPE == "legendre": + PSF_models.append(np.polynomial.polynomial.legval(rescale_x_to_legendre(all_pixels), coeffs) + delta) + elif parameters.PSF_POLY_TYPE == "polynomial": + PSF_models.append(np.polynomial.polynomial.polyval(all_pixels, coeffs) + delta) for i, name in enumerate(self.psf.params.labels): p = ax.plot(all_pixels, self.profile_params[:, i], marker='+', linestyle='none') ax.plot(all_pixels[self.fitted_pixels], self.profile_params[self.fitted_pixels, i], label=name, diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index b388bc6b0..76e3b90b8 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -94,14 +94,18 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p fixed[k] = True for k, par in enumerate(input_labels): if "y_c" in par: - fixed[k] = False - p[k] = 0 - for k, par in enumerate(input_labels): - if "y_c" in par and par[-2:]=="_3" and "c_0" not in par: fixed[k] = True p[k] = 0 - if "y_c" in par and par[-2:]=="_2" and "c_0" not in par: - fixed[k] = True + # for k, par in enumerate(input_labels): + # if "y_c" in par and par[-2:]=="_3" and "c_0" not in par: + # fixed[k] = True + # p[k] = 0 + # if "y_c" in par and par[-2:]=="_2" and "c_0" not in par: + # fixed[k] = True + # p[k] = 0 + for k, par in enumerate(input_labels): + if "y_c_2" in par: + fixed[k] = False p[k] = 0 params = FitParameters(p, labels=input_labels, axis_names=axis_names, fixed=fixed, bounds=bounds, @@ -117,8 +121,8 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p params.fixed[params.get_index("A_star")] = True # Astar params.fixed[params.get_index("D_CCD [mm]")] = True # D2CCD: spectrogram can not tell something on this parameter: rely on calibrate_spectrum params.fixed[params.get_index("shift_x [pix]")] = True # delta x: if False, extracted spectrum is biased compared with truth - params.fixed[params.get_index("shift_y [pix]")] = True # delta y - params.fixed[params.get_index("angle [deg]")] = True # angle + params.fixed[params.get_index("shift_y [pix]")] = False # delta y + params.fixed[params.get_index("angle [deg]")] = False # angle params.fixed[params.get_index("B")] = True # B: not needed in simulations, to check with data params.fixed[params.get_index("R")] = True # camera rot params.fixed[params.get_index("P [hPa]")] = True # pressure diff --git a/spectractor/parameters.py b/spectractor/parameters.py index c4375dbdb..3b7603a77 100644 --- a/spectractor/parameters.py +++ b/spectractor/parameters.py @@ -114,6 +114,7 @@ def __getattr__(name): PSF_FIT_REG_PARAM = 0.01 # regularisation parameter for the chisq minimisation to extract the spectrum PSF_PIXEL_STEP_TRANSVERSE_FIT = 10 # step size in pixels for the first transverse PSF1D fit PSF_FWHM_CLIP = 2 # PSF is not evaluated outside a region larger than max(PIXWIDTH_SIGNAL, PSF_FWHM_CLIP*fwhm) pixels +PSF_POLY_TYPE = "polynomial" # polynomial type: must be polynomial or legendre # Detection line algorithm CALIB_BGD_ORDER = 3 # order of the background polynome to fit diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index 44a00e5f4..e0689b1e2 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -26,7 +26,7 @@ PSF_POLY_ORDER = 2 PSF_POLY_PARAMS_TRUTH = [1, 0, 0, 0, 0, 0, - 3, 1, 1, + 3, 0, 0, 3, 0, 0, 1e6] * N_DIFF_ORDERS From f5caf638f4c6b498c86e3872cb7d7cb9c1d2fbdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 7 Mar 2024 10:53:30 +0100 Subject: [PATCH 072/161] possibility to choose between different parametrisation: legendre or polynomial. DEFAULT NOW is polynomial. Fit for angle and shift_y in FFM, and higher order polynomial terms --- spectractor/extractor/chromaticpsf.py | 2 +- spectractor/extractor/extractor.py | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index cd3612682..c2e7f51a9 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -255,7 +255,7 @@ def generate_test_poly_params(self): if parameters.PSF_POLY_TYPE == "legendre": c = np.polynomial.legendre.poly2leg(params[index + shift:index:-1]) elif parameters.PSF_POLY_TYPE == "polynomial": - c = params[index + shift:index:-1] + c = np.asarray(params[index + shift:index:-1]) else: raise ValueError(f"Unknown polynomial type {parameters.PSF_POLY_TYPE=}.") coeffs = np.zeros(shift) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 76e3b90b8..3d5ccc3e5 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -96,15 +96,8 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p if "y_c" in par: fixed[k] = True p[k] = 0 - # for k, par in enumerate(input_labels): - # if "y_c" in par and par[-2:]=="_3" and "c_0" not in par: - # fixed[k] = True - # p[k] = 0 - # if "y_c" in par and par[-2:]=="_2" and "c_0" not in par: - # fixed[k] = True - # p[k] = 0 for k, par in enumerate(input_labels): - if "y_c_2" in par: + if "y_c_0" not in par and "y_c_1" not in par: fixed[k] = False p[k] = 0 From bd2ee6bfe50c87b8bac370d22f95858ba3de0529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 7 Mar 2024 11:05:01 +0100 Subject: [PATCH 073/161] possibility to choose between different parametrisation: legendre or polynomial. DEFAULT NOW is polynomial. Fit for angle and shift_y in FFM, and higher order polynomial terms --- spectractor/extractor/chromaticpsf.py | 13 +++++-------- spectractor/extractor/extractor.py | 17 ----------------- 2 files changed, 5 insertions(+), 25 deletions(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index c2e7f51a9..4705b7646 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -224,7 +224,7 @@ def generate_test_poly_params(self): .. doctest:: :hide: - >>> assert(np.all(np.isclose(params,[10, 50, 100, 150, 200, 0, 0, 0, 0, 5, 0, 2, 0, -0.4, -0.4,1,0,20000]))) + >>> assert(np.all(np.isclose(params,[10, 50, 100, 150, 200, 0, 0, 0, 0, 5, 0, 2, 0, -0.4, 0, 1, 0, 20000]))) """ if not isinstance(self.psf, MoffatGauss) and not isinstance(self.psf, Moffat): @@ -241,7 +241,7 @@ def generate_test_poly_params(self): params += [0.] * (self.degrees['gamma'] - 1) + [0, 5] # gamma params += [0.] * (self.degrees['alpha'] - 1) + [0, 2] # alpha if isinstance(self.psf, MoffatGauss): - params += [0.] * (self.degrees['eta_gauss'] - 1) + [-0.4, -0.4] # eta_gauss + params += [0.] * (self.degrees['eta_gauss'] - 1) + [0, -0.4] # eta_gauss params += [0.] * (self.degrees['stddev'] - 1) + [0, 1] # stddev params += [self.saturation] # saturation poly_params = np.zeros_like(params) @@ -1126,8 +1126,7 @@ def from_profile_params_to_poly_params(self, profile_params, indices=None): .. doctest:: :hide: - - >>> assert(np.all(np.isclose(profile_params[0], [10, 0, 50, 5, 2, 0, 1, 8e3]))) + >>> assert(np.all(np.isclose(profile_params[0], [10, 0, 50, 5, 2, -0.4, 1, 8e3]))) From the profile parameters to the polynomial parameters: @@ -1271,8 +1270,7 @@ def from_poly_params_to_profile_params(self, poly_params, apply_bounds=False): .. doctest:: :hide: - - >>> assert np.allclose(profile_params[0], [10, 0, 50, 5, 2, -5e-3, 1, 8e3], rtol=1e-3, atol=1e-3) + >>> assert np.allclose(profile_params[0], [10, 0, 50, 5, 2, -0.4, 1, 8e3], rtol=1e-3, atol=1e-3) From the profile parameters to the polynomial parameters: @@ -1289,8 +1287,7 @@ def from_poly_params_to_profile_params(self, poly_params, apply_bounds=False): .. doctest:: :hide: - - >>> assert np.allclose(profile_params[0], [1, 0, 50, 5, 2, 0, 1, 8e3]) + >>> assert np.allclose(profile_params[0], [1, 0, 50, 5, 2, -0.4, 1, 8e3]) """ length = len(self.table) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 3d5ccc3e5..8633dedd9 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -921,23 +921,6 @@ def run_ffm_minimisation(w, method="newton", niter=2): if parameters.DEBUG and parameters.DISPLAY: w.plot_fit() - # recompute angle and dy0 if fixed while y_c parameters are free - # if w.fixed[3] and w.fixed[4] and not np.any([w.fixed[k] for k, par in enumerate(w.input_labels) if "y_c" in par]): - # pval_leg = [w.p[k] for k, par in enumerate(w.input_labels) if "y_c" in par][ - # :w.spectrum.chromatic_psf.degrees["y_c"] + 1] - # pval_poly = np.polynomial.legendre.leg2poly(pval_leg) - # new_dy0, new_angle = w.p[2], w.p[4] - # from numpy.polynomial import Polynomial as P - # p = P(pval_poly) - # pX = P([0, 0.5 * (w.spectrum.spectrogram_Nx)]) - # pfinal = p(pX) - # pval_poly = pfinal.coef - # for k in range(pval_poly.size): - # if k == 0: - # new_dy0 += pval_poly[k] - # if k == 1: - # new_angle += np.arctan(pval_poly[k]) * 180 / np.pi - w.spectrum.lambdas = np.copy(w.lambdas) w.spectrum.chromatic_psf.table['lambdas'] = np.copy(w.lambdas) w.spectrum.data = np.copy(w.amplitude_params) From f69284e7ce2389d6efe989adee8be386415df671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 7 Mar 2024 11:29:54 +0100 Subject: [PATCH 074/161] possibility to choose between different parametrisation: legendre or polynomial. DEFAULT NOW is polynomial. Fit for angle and shift_y in FFM, and higher order polynomial terms --- spectractor/extractor/extractor.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 8633dedd9..f22354fad 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -97,7 +97,7 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p fixed[k] = True p[k] = 0 for k, par in enumerate(input_labels): - if "y_c_0" not in par and "y_c_1" not in par: + if "y_c" in par and "y_c_0" not in par and "y_c_1" not in par: fixed[k] = False p[k] = 0 @@ -304,10 +304,9 @@ def set_mask(self, params=None, fwhmx_clip=3*parameters.PSF_FWHM_CLIP, fwhmy_cli # make rectangular mask per wavelength self.boundaries[order], self.psf_cubes_masked[order] = self.spectrum.chromatic_psf.set_rectangular_boundaries(self.psf_cubes_masked[order]) if k > 0: - # spectrogram modelisation must be accurate inside the k=0 order footprint - for i in range(len(psf_cube_masked)): - self.boundaries[order]["ymin"] = np.zeros_like(self.boundaries[order]["ymin"]) - self.boundaries[order]["ymax"] = self.Ny * np.ones_like(self.boundaries[order]["ymax"]) + # spectrogram model must be accurate inside the k=0 order footprint: enlarge the next order footprints + self.boundaries[order]["ymin"] = np.zeros_like(self.boundaries[order]["ymin"]) + self.boundaries[order]["ymax"] = self.Ny * np.ones_like(self.boundaries[order]["ymax"]) self.psf_cube_sparse_indices[order], self.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(self.boundaries[order]) mask = np.sum(self.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], psf_cube_masked[0].size), axis=0) == 0 # cumulate the boolean values as int From 4368bd93333829d97a1f2b03d90f876e6720aea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 7 Mar 2024 10:54:25 +0000 Subject: [PATCH 075/161] extrapolate ratios for holo4_003 in UV with hologram transmission model --- .../extractor/dispersers/holo4_003/NOTES | 6 +- .../holo4_003/ratio_order_2over1.txt | 1600 ++++++++--------- .../holo4_003/ratio_order_3over2.txt | 1600 ++++++++--------- 3 files changed, 1604 insertions(+), 1602 deletions(-) diff --git a/spectractor/extractor/dispersers/holo4_003/NOTES b/spectractor/extractor/dispersers/holo4_003/NOTES index 9d8fb6eeb..2b1ee98e9 100644 --- a/spectractor/extractor/dispersers/holo4_003/NOTES +++ b/spectractor/extractor/dispersers/holo4_003/NOTES @@ -1,3 +1,5 @@ - transmission.txt : prediction from the chimera built with LPNHE optical test bench measurements between 430 and 1000nm, then extrapolating with an hologram efficiency model fitted on data -- ratio_order_2over1.txt : computed using separated extraction of spectrum order 1 and 2 from BG40 exposures, nights 20220608, 20220628, 20220629 and 20220630 with ratio 3/2 model, CCD_REBIN=2 with Savitsky Golay filter -- ratio_order_3over2.txt : prediction from the chimera built with LPNHE optical test bench measurements between 430 and 1000nm, then extrapolating with an hologram efficiency model fitted on data +- ratio_order_2over1.txt : computed using separated extraction of spectrum order 1 and 2 from BG40 exposures, nights 20220608, 20220628, 20220629 and 20220630 with ratio 3/2 model, CCD_REBIN=2 with Savitsky Golay filter, extrapolated fitting an hologram transmission model (see ratio_order_2over1_from_fit.txt) +- ratio_order_3over2.txt : prediction from the chimera built with LPNHE optical test bench measurements between 430 and 1000nm, rescaled with the estimate using SDSSg filter ratio of orders, extrapolated fitting an hologram transmission model (see ratio_order_2over1_from_fit.txt) +#- ratio_order_2over1.txt : computed using separated extraction of spectrum order 1 and 2 from BG40 exposures, nights 20220608, 20220628, 20220629 and 20220630 with ratio 3/2 model, CCD_REBIN=2 with Savitsky Golay filter +#- ratio_order_3over2.txt : prediction from the chimera built with LPNHE optical test bench measurements between 430 and 1000nm, rescaled with the estimate using SDSSg filter ratio of orders diff --git a/spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt b/spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt index 6f27e0c43..4b12af8f1 100644 --- a/spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt +++ b/spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt @@ -1,800 +1,800 @@ -3.000000000000000000e+02 -7.090213097062541436e+00 -3.010000000000000000e+02 -7.090213097062542325e+00 -3.020000000000000000e+02 -7.090213097062542325e+00 -3.030000000000000000e+02 -7.090213097062543213e+00 -3.040000000000000000e+02 -7.090213097062544989e+00 -3.050000000000000000e+02 -7.090213097062544989e+00 -3.060000000000000000e+02 -7.090213097062544989e+00 -3.070000000000000000e+02 -7.090213097062544989e+00 -3.080000000000000000e+02 -7.090213097062544989e+00 -3.090000000000000000e+02 -7.090213097062544989e+00 -3.100000000000000000e+02 -7.090213097062544989e+00 -3.110000000000000000e+02 -7.090213097062544989e+00 -3.120000000000000000e+02 -7.090213097062544989e+00 -3.130000000000000000e+02 -7.090213097062544989e+00 -3.140000000000000000e+02 -7.090213097062544989e+00 -3.150000000000000000e+02 -7.090213097062544989e+00 -3.160000000000000000e+02 -7.090213097062544989e+00 -3.170000000000000000e+02 -7.090213097062544989e+00 -3.180000000000000000e+02 -7.090213097062544989e+00 -3.190000000000000000e+02 -7.090213097062544989e+00 -3.200000000000000000e+02 -7.090213097062544989e+00 -3.210000000000000000e+02 -7.090213097062544989e+00 -3.220000000000000000e+02 -7.090213097062544989e+00 -3.230000000000000000e+02 -7.090213097062544989e+00 -3.240000000000000000e+02 -7.090213097062544989e+00 -3.250000000000000000e+02 -7.090213097062544989e+00 -3.260000000000000000e+02 -7.090213097062544989e+00 -3.270000000000000000e+02 -7.090213097062544989e+00 -3.280000000000000000e+02 -7.090213097062544989e+00 -3.290000000000000000e+02 -7.090213097062544989e+00 -3.300000000000000000e+02 -7.090213097062544989e+00 -3.310000000000000000e+02 -7.090213097062544989e+00 -3.320000000000000000e+02 -7.090213097062544989e+00 -3.330000000000000000e+02 -7.090213097062544989e+00 -3.340000000000000000e+02 -7.090213097062544989e+00 -3.350000000000000000e+02 -6.328803424402677180e+00 -3.360000000000000000e+02 -5.527802037939696156e+00 -3.370000000000000000e+02 -4.613243163438663252e+00 -3.380000000000000000e+02 -3.812382915170114295e+00 -3.390000000000000000e+02 -2.991109607661365910e+00 -3.400000000000000000e+02 -1.822843895112854273e+00 -3.410000000000000000e+02 -6.926260049797368090e-01 -3.420000000000000000e+02 3.870096902209335665e-01 -3.430000000000000000e+02 1.747384374344775892e+00 -3.440000000000000000e+02 2.303928005602863482e+00 -3.450000000000000000e+02 2.783002638712051446e+00 -3.460000000000000000e+02 3.136856115706376791e+00 -3.470000000000000000e+02 3.573486275341247520e+00 -3.480000000000000000e+02 3.998683400877324878e+00 -3.490000000000000000e+02 4.040869007395492929e+00 -3.500000000000000000e+02 4.153621186251155173e+00 -3.510000000000000000e+02 4.307819339879337406e+00 -3.520000000000000000e+02 4.122505813925746665e+00 -3.530000000000000000e+02 3.909383886504167016e+00 -3.540000000000000000e+02 3.698665671948257128e+00 -3.550000000000000000e+02 3.516173380005064519e+00 -3.560000000000000000e+02 3.356477995828850425e+00 -3.570000000000000000e+02 3.160081580233749854e+00 -3.580000000000000000e+02 2.984200165885861011e+00 -3.590000000000000000e+02 2.770167735908844353e+00 -3.600000000000000000e+02 2.544125745463342803e+00 -3.610000000000000000e+02 2.390559827962756234e+00 -3.620000000000000000e+02 2.312684631433588933e+00 -3.630000000000000000e+02 2.249351988051884632e+00 -3.640000000000000000e+02 2.160481333197594722e+00 -3.650000000000000000e+02 2.080340203487198281e+00 -3.660000000000000000e+02 2.036984480629119965e+00 -3.670000000000000000e+02 1.994087600564666829e+00 -3.680000000000000000e+02 1.940603736211912844e+00 -3.690000000000000000e+02 1.888583656013298029e+00 -3.700000000000000000e+02 1.790755255006616364e+00 -3.710000000000000000e+02 1.692465345587529812e+00 -3.720000000000000000e+02 1.617378317791101860e+00 -3.730000000000000000e+02 1.559343907277888075e+00 -3.740000000000000000e+02 1.511663235743319511e+00 -3.750000000000000000e+02 1.442967817317731161e+00 -3.760000000000000000e+02 1.392010166481182143e+00 -3.770000000000000000e+02 1.356970819697515651e+00 -3.780000000000000000e+02 1.315672992097228322e+00 -3.790000000000000000e+02 1.280728020654762433e+00 -3.800000000000000000e+02 1.250648336598931154e+00 -3.810000000000000000e+02 1.233236446903313910e+00 -3.820000000000000000e+02 1.201881619672994672e+00 -3.830000000000000000e+02 1.146703838483096760e+00 -3.840000000000000000e+02 1.097896025484838445e+00 -3.850000000000000000e+02 1.048476150035318355e+00 -3.860000000000000000e+02 1.017637220687949817e+00 -3.870000000000000000e+02 1.028435253921600401e+00 -3.880000000000000000e+02 1.039485602203704451e+00 -3.890000000000000000e+02 1.007069572347964126e+00 -3.900000000000000000e+02 9.727890037215338737e-01 -3.910000000000000000e+02 9.663333174638393253e-01 -3.920000000000000000e+02 9.478789831251134279e-01 -3.930000000000000000e+02 9.146401266440861155e-01 -3.940000000000000000e+02 8.964838841883382425e-01 -3.950000000000000000e+02 8.709237174070031395e-01 -3.960000000000000000e+02 8.265883653201128167e-01 -3.970000000000000000e+02 8.033407222810033943e-01 -3.980000000000000000e+02 8.118924754640002295e-01 -3.990000000000000000e+02 8.044148519649951812e-01 -4.000000000000000000e+02 7.726953097894549982e-01 -4.010000000000000000e+02 7.646660821341034753e-01 -4.020000000000000000e+02 7.743080343406182342e-01 -4.030000000000000000e+02 7.657572992398562484e-01 -4.040000000000000000e+02 7.496357501429595782e-01 -4.050000000000000000e+02 7.334880799993769296e-01 -4.060000000000000000e+02 7.164893091571650219e-01 -4.070000000000000000e+02 7.012917685380222199e-01 -4.080000000000000000e+02 6.911186014599846050e-01 -4.090000000000000000e+02 6.814727432371219251e-01 -4.100000000000000000e+02 6.712368360203043727e-01 -4.110000000000000000e+02 6.631628188627718412e-01 -4.120000000000000000e+02 6.557240173062228727e-01 -4.130000000000000000e+02 6.426077737163423675e-01 -4.140000000000000000e+02 6.306938107431300233e-01 -4.150000000000000000e+02 6.231470464372395046e-01 -4.160000000000000000e+02 6.155417585989471085e-01 -4.170000000000000000e+02 6.065583524274558158e-01 -4.180000000000000000e+02 5.973653276235721954e-01 -4.190000000000000000e+02 5.880300677074770110e-01 -4.200000000000000000e+02 5.794847797288136260e-01 -4.210000000000000000e+02 5.710896937506615423e-01 -4.220000000000000000e+02 5.649269475079771174e-01 -4.230000000000000000e+02 5.611600528314897307e-01 -4.240000000000000000e+02 5.590998265874644879e-01 -4.250000000000000000e+02 5.521542515421713482e-01 -4.260000000000000000e+02 5.347576224958094926e-01 -4.270000000000000000e+02 5.209377065831362064e-01 -4.280000000000000000e+02 5.173853413716962280e-01 -4.290000000000000000e+02 5.133642763288562838e-01 -4.300000000000000000e+02 5.031284167181094835e-01 -4.310000000000000000e+02 4.935211140689056419e-01 -4.320000000000000000e+02 4.880868077467254151e-01 -4.330000000000000000e+02 4.801128385743494986e-01 -4.340000000000000000e+02 4.717682983576887423e-01 -4.350000000000000000e+02 4.710363751507173347e-01 -4.360000000000000000e+02 4.702276890457245395e-01 -4.370000000000000000e+02 4.622921815338318918e-01 -4.380000000000000000e+02 4.547698834270983981e-01 -4.390000000000000000e+02 4.531389015741070225e-01 -4.400000000000000000e+02 4.503861585087456931e-01 -4.410000000000000000e+02 4.414805861234325501e-01 -4.420000000000000000e+02 4.325248711655828027e-01 -4.430000000000000000e+02 4.286142196459217235e-01 -4.440000000000000000e+02 4.275428105567987691e-01 -4.450000000000000000e+02 4.247827786684365003e-01 -4.460000000000000000e+02 4.209600553455061789e-01 -4.470000000000000000e+02 4.177210706210515712e-01 -4.480000000000000000e+02 4.127250600023361637e-01 -4.490000000000000000e+02 4.061739185334488078e-01 -4.500000000000000000e+02 4.011949896430181406e-01 -4.510000000000000000e+02 3.984389066119622957e-01 -4.520000000000000000e+02 3.960398812874672547e-01 -4.530000000000000000e+02 3.929348478948982426e-01 -4.540000000000000000e+02 3.886898482747888073e-01 -4.550000000000000000e+02 3.830207331471457977e-01 -4.560000000000000000e+02 3.761158173254862125e-01 -4.570000000000000000e+02 3.723824576145031151e-01 -4.580000000000000000e+02 3.715717745057048882e-01 -4.590000000000000000e+02 3.697182244393833472e-01 -4.600000000000000000e+02 3.658589993526584205e-01 -4.610000000000000000e+02 3.616719520199900839e-01 -4.620000000000000000e+02 3.576812568545735815e-01 -4.630000000000000000e+02 3.543864690911576742e-01 -4.640000000000000000e+02 3.522280955521581158e-01 -4.650000000000000000e+02 3.504491996285457045e-01 -4.660000000000000000e+02 3.462631876000078490e-01 -4.670000000000000000e+02 3.415205514492465344e-01 -4.680000000000000000e+02 3.384089465309362277e-01 -4.690000000000000000e+02 3.361808400752953618e-01 -4.700000000000000000e+02 3.338449166956842240e-01 -4.710000000000000000e+02 3.311657795290107731e-01 -4.720000000000000000e+02 3.275213049028709023e-01 -4.730000000000000000e+02 3.239354617756656785e-01 -4.740000000000000000e+02 3.208363739629827571e-01 -4.750000000000000000e+02 3.186696177888769799e-01 -4.760000000000000000e+02 3.161602865869745371e-01 -4.770000000000000000e+02 3.128410256276050738e-01 -4.780000000000000000e+02 3.104662875566143176e-01 -4.790000000000000000e+02 3.090143600831314896e-01 -4.800000000000000000e+02 3.081707598125788539e-01 -4.810000000000000000e+02 3.069198629731377248e-01 -4.820000000000000000e+02 3.019714098310701811e-01 -4.830000000000000000e+02 2.973032450354184952e-01 -4.840000000000000000e+02 2.956908062068524523e-01 -4.850000000000000000e+02 2.947100948529325914e-01 -4.860000000000000000e+02 2.939056685952170511e-01 -4.870000000000000000e+02 2.916286543564557410e-01 -4.880000000000000000e+02 2.870339431469631775e-01 -4.890000000000000000e+02 2.816971438289136986e-01 -4.900000000000000000e+02 2.791004008932900793e-01 -4.910000000000000000e+02 2.802878119207415364e-01 -4.920000000000000000e+02 2.805368097427271001e-01 -4.930000000000000000e+02 2.784182570727317119e-01 -4.940000000000000000e+02 2.753849010497286254e-01 -4.950000000000000000e+02 2.719841364541146778e-01 -4.960000000000000000e+02 2.695455429084538945e-01 -4.970000000000000000e+02 2.678427239474470145e-01 -4.980000000000000000e+02 2.665017100198022737e-01 -4.990000000000000000e+02 2.649065167667907228e-01 -5.000000000000000000e+02 2.625448971300224366e-01 -5.010000000000000000e+02 2.605327268643842786e-01 -5.020000000000000000e+02 2.588775133516937887e-01 -5.030000000000000000e+02 2.567718978178080147e-01 -5.040000000000000000e+02 2.543575805589111116e-01 -5.050000000000000000e+02 2.522306554662914202e-01 -5.060000000000000000e+02 2.508842499016156191e-01 -5.070000000000000000e+02 2.496783842260557051e-01 -5.080000000000000000e+02 2.480466856910102935e-01 -5.090000000000000000e+02 2.465207081940127831e-01 -5.100000000000000000e+02 2.449208617331634363e-01 -5.110000000000000000e+02 2.434411448417727886e-01 -5.120000000000000000e+02 2.420025343302613652e-01 -5.130000000000000000e+02 2.394674880313324705e-01 -5.140000000000000000e+02 2.367835379825995457e-01 -5.150000000000000000e+02 2.353722058444396859e-01 -5.160000000000000000e+02 2.336618640339418185e-01 -5.170000000000000000e+02 2.321268605904972526e-01 -5.180000000000000000e+02 2.304314592746790624e-01 -5.190000000000000000e+02 2.283464729493796530e-01 -5.200000000000000000e+02 2.265780891294194022e-01 -5.210000000000000000e+02 2.256899832125863758e-01 -5.220000000000000000e+02 2.250991244949594738e-01 -5.230000000000000000e+02 2.233560615211991895e-01 -5.240000000000000000e+02 2.215911662546430905e-01 -5.250000000000000000e+02 2.209070846613355177e-01 -5.260000000000000000e+02 2.197276445663630118e-01 -5.270000000000000000e+02 2.190231828766119881e-01 -5.280000000000000000e+02 2.178701800624724405e-01 -5.290000000000000000e+02 2.150125104164173628e-01 -5.300000000000000000e+02 2.125333736501849868e-01 -5.310000000000000000e+02 2.120636993767610057e-01 -5.320000000000000000e+02 2.124650126834856378e-01 -5.330000000000000000e+02 2.114997118427921485e-01 -5.340000000000000000e+02 2.094850735750174442e-01 -5.350000000000000000e+02 2.076346526871917231e-01 -5.360000000000000000e+02 2.052689544373455521e-01 -5.370000000000000000e+02 2.035871992438794964e-01 -5.380000000000000000e+02 2.030179648328740427e-01 -5.390000000000000000e+02 2.017867402520298059e-01 -5.400000000000000000e+02 1.998175876055161004e-01 -5.410000000000000000e+02 1.982126679078189679e-01 -5.420000000000000000e+02 1.968221777258057359e-01 -5.430000000000000000e+02 1.951206513723492408e-01 -5.440000000000000000e+02 1.933572413120855371e-01 -5.450000000000000000e+02 1.924033739507697016e-01 -5.460000000000000000e+02 1.912292451448932284e-01 -5.470000000000000000e+02 1.897415695859978324e-01 -5.480000000000000000e+02 1.884175909126065140e-01 -5.490000000000000000e+02 1.869666203081614686e-01 -5.500000000000000000e+02 1.855619361337265405e-01 -5.510000000000000000e+02 1.845441303939724942e-01 -5.520000000000000000e+02 1.835914214664698674e-01 -5.530000000000000000e+02 1.826191053899133276e-01 -5.540000000000000000e+02 1.814372241223501658e-01 -5.550000000000000000e+02 1.802821089549231093e-01 -5.560000000000000000e+02 1.789652630866330196e-01 -5.570000000000000000e+02 1.778285904912150217e-01 -5.580000000000000000e+02 1.768766064530321314e-01 -5.590000000000000000e+02 1.757726218800563789e-01 -5.600000000000000000e+02 1.741378226592481815e-01 -5.610000000000000000e+02 1.723288261162471136e-01 -5.620000000000000000e+02 1.707501802187501305e-01 -5.630000000000000000e+02 1.696560826079121231e-01 -5.640000000000000000e+02 1.688866431451916950e-01 -5.650000000000000000e+02 1.676131424568440831e-01 -5.660000000000000000e+02 1.660828506312333475e-01 -5.670000000000000000e+02 1.646337159350181323e-01 -5.680000000000000000e+02 1.632198378269752725e-01 -5.690000000000000000e+02 1.623592743612009281e-01 -5.700000000000000000e+02 1.617382098917645727e-01 -5.710000000000000000e+02 1.607528905989208667e-01 -5.720000000000000000e+02 1.594418388929920716e-01 -5.730000000000000000e+02 1.581722095854678212e-01 -5.740000000000000000e+02 1.569735905444122337e-01 -5.750000000000000000e+02 1.559091853012824491e-01 -5.760000000000000000e+02 1.549316713274414004e-01 -5.770000000000000000e+02 1.535227930799748230e-01 -5.780000000000000000e+02 1.519361704420207348e-01 -5.790000000000000000e+02 1.506882691193676127e-01 -5.800000000000000000e+02 1.491550228204485962e-01 -5.810000000000000000e+02 1.472755598602591975e-01 -5.820000000000000000e+02 1.458910722211179678e-01 -5.830000000000000000e+02 1.445061541950944106e-01 -5.840000000000000000e+02 1.432251686690005632e-01 -5.850000000000000000e+02 1.417824358351622016e-01 -5.860000000000000000e+02 1.407177299135873028e-01 -5.870000000000000000e+02 1.395365186160640036e-01 -5.880000000000000000e+02 1.386613500714227454e-01 -5.890000000000000000e+02 1.376856108123127864e-01 -5.900000000000000000e+02 1.371074581111847712e-01 -5.910000000000000000e+02 1.358785692803984035e-01 -5.920000000000000000e+02 1.347587844386158584e-01 -5.930000000000000000e+02 1.339446389066242249e-01 -5.940000000000000000e+02 1.328714086248795612e-01 -5.950000000000000000e+02 1.303082016745845950e-01 -5.960000000000000000e+02 1.280845601150825963e-01 -5.970000000000000000e+02 1.257039358822217012e-01 -5.980000000000000000e+02 1.232436776011627821e-01 -5.990000000000000000e+02 1.205046803707603698e-01 -6.000000000000000000e+02 1.182720193486171689e-01 -6.010000000000000000e+02 1.160052597216233439e-01 -6.020000000000000000e+02 1.129659906267471703e-01 -6.030000000000000000e+02 1.106328400783497257e-01 -6.040000000000000000e+02 1.097242059362349836e-01 -6.050000000000000000e+02 1.081873105499707999e-01 -6.060000000000000000e+02 1.057636530345747450e-01 -6.070000000000000000e+02 1.053256949202308473e-01 -6.080000000000000000e+02 1.042384655554098039e-01 -6.090000000000000000e+02 1.014123589208693055e-01 -6.100000000000000000e+02 1.002267225271305517e-01 -6.110000000000000000e+02 9.796249555250345631e-02 -6.120000000000000000e+02 9.572763560385537385e-02 -6.130000000000000000e+02 9.376457849802230515e-02 -6.140000000000000000e+02 9.194063446381861571e-02 -6.150000000000000000e+02 9.018079583129121057e-02 -6.160000000000000000e+02 8.684672437258034172e-02 -6.170000000000000000e+02 8.513035175552598199e-02 -6.180000000000000000e+02 8.457769811552133532e-02 -6.190000000000000000e+02 8.124867691737501507e-02 -6.200000000000000000e+02 8.083303141529971092e-02 -6.210000000000000000e+02 7.969580623993287316e-02 -6.220000000000000000e+02 7.807788370960067059e-02 -6.230000000000000000e+02 7.588536004885376718e-02 -6.240000000000000000e+02 7.465648723171451617e-02 -6.250000000000000000e+02 7.293219633282768677e-02 -6.260000000000000000e+02 7.102910568592249452e-02 -6.270000000000000000e+02 6.823992446657642374e-02 -6.280000000000000000e+02 6.729404339639416532e-02 -6.290000000000000000e+02 6.570446276328731350e-02 -6.300000000000000000e+02 6.389084977333474302e-02 -6.310000000000000000e+02 6.167264304752995835e-02 -6.320000000000000000e+02 6.168744106786816506e-02 -6.330000000000000000e+02 6.149270221404462555e-02 -6.340000000000000000e+02 6.018832858602345126e-02 -6.350000000000000000e+02 5.800737047095026050e-02 -6.360000000000000000e+02 5.912179117724896543e-02 -6.370000000000000000e+02 5.654270805248425708e-02 -6.380000000000000000e+02 5.412364314191689396e-02 -6.390000000000000000e+02 5.066405966988099530e-02 -6.400000000000000000e+02 4.870174645719493878e-02 -6.410000000000000000e+02 4.809799948468499592e-02 -6.420000000000000000e+02 4.775645758073446961e-02 -6.430000000000000000e+02 5.032795678436362968e-02 -6.440000000000000000e+02 5.380941097176278332e-02 -6.450000000000000000e+02 5.003574563882724757e-02 -6.460000000000000000e+02 4.687504817622907549e-02 -6.470000000000000000e+02 4.278333113019516104e-02 -6.480000000000000000e+02 4.038501734549286570e-02 -6.490000000000000000e+02 3.734994413927558016e-02 -6.500000000000000000e+02 3.159026823157892738e-02 -6.510000000000000000e+02 2.552501180555797472e-02 -6.520000000000000000e+02 1.840569895823435803e-02 -6.530000000000000000e+02 1.095708058464484394e-02 -6.540000000000000000e+02 8.546557230822095577e-03 -6.550000000000000000e+02 8.958049086387047735e-03 -6.560000000000000000e+02 9.449554893691874610e-03 -6.570000000000000000e+02 9.882699255074307160e-03 -6.580000000000000000e+02 1.053704001307656860e-02 -6.590000000000000000e+02 1.126777823618900325e-02 -6.600000000000000000e+02 1.222589539075055742e-02 -6.610000000000000000e+02 1.334616941659527885e-02 -6.620000000000000000e+02 1.414199728570622941e-02 -6.630000000000000000e+02 1.523066274219376376e-02 -6.640000000000000000e+02 1.656803737484623118e-02 -6.650000000000000000e+02 1.791816523222217183e-02 -6.660000000000000000e+02 1.946047719303312801e-02 -6.670000000000000000e+02 2.016747267923760939e-02 -6.680000000000000000e+02 2.075530070851973330e-02 -6.690000000000000000e+02 2.207424218040054606e-02 -6.700000000000000000e+02 2.347914200244569094e-02 -6.710000000000000000e+02 2.611735269247505986e-02 -6.720000000000000000e+02 3.115979221791311329e-02 -6.730000000000000000e+02 3.542261050738817335e-02 -6.740000000000000000e+02 3.838780755210113166e-02 -6.750000000000000000e+02 4.342362526503897036e-02 -6.760000000000000000e+02 4.939630041023400364e-02 -6.770000000000000000e+02 5.373615578630489692e-02 -6.780000000000000000e+02 5.592804575849290305e-02 -6.790000000000000000e+02 5.499742458285750840e-02 -6.800000000000000000e+02 6.175563369688819026e-02 -6.810000000000000000e+02 6.054550042609304489e-02 -6.820000000000000000e+02 5.932669376852171828e-02 -6.830000000000000000e+02 6.079455649472691181e-02 -6.840000000000000000e+02 1.053535976490686116e-02 -6.850000000000000000e+02 -3.669168823655337419e-02 -6.860000000000000000e+02 -8.564000370867089207e-02 -6.870000000000000000e+02 -1.335350554003449097e-01 -6.880000000000000000e+02 -1.784736175504070266e-01 -6.890000000000000000e+02 -2.322038120760240298e-01 -6.900000000000000000e+02 -2.806830911676423401e-01 -6.910000000000000000e+02 -3.284996786866697938e-01 -6.920000000000000000e+02 -3.778162718497888317e-01 -6.930000000000000000e+02 -3.776943659534208186e-01 -6.940000000000000000e+02 -3.809622962482322461e-01 -6.950000000000000000e+02 -3.809622962482322461e-01 -6.960000000000000000e+02 -3.809622962482322461e-01 -6.970000000000000000e+02 -3.809622962482322461e-01 -6.980000000000000000e+02 -3.809622962482322461e-01 -6.990000000000000000e+02 -3.809622962482322461e-01 -7.000000000000000000e+02 -3.809622962482322461e-01 -7.010000000000000000e+02 -3.809622962482322461e-01 -7.020000000000000000e+02 -3.809622962482322461e-01 -7.030000000000000000e+02 -3.809622962482322461e-01 -7.040000000000000000e+02 -3.809622962482322461e-01 -7.050000000000000000e+02 -3.809622962482322461e-01 -7.060000000000000000e+02 -3.809622962482322461e-01 -7.070000000000000000e+02 -3.809622962482322461e-01 -7.080000000000000000e+02 -3.809622962482322461e-01 -7.090000000000000000e+02 -3.809622962482322461e-01 -7.100000000000000000e+02 -3.809622962482322461e-01 -7.110000000000000000e+02 -3.809622962482322461e-01 -7.120000000000000000e+02 -3.809622962482322461e-01 -7.130000000000000000e+02 -3.809622962482322461e-01 -7.140000000000000000e+02 -3.809622962482322461e-01 -7.150000000000000000e+02 -3.809622962482322461e-01 -7.160000000000000000e+02 -3.809622962482322461e-01 -7.170000000000000000e+02 -3.809622962482322461e-01 -7.180000000000000000e+02 -3.809622962482322461e-01 -7.190000000000000000e+02 -3.809622962482322461e-01 -7.200000000000000000e+02 -3.809622962482322461e-01 -7.210000000000000000e+02 -3.809622962482322461e-01 -7.220000000000000000e+02 -3.809622962482322461e-01 -7.230000000000000000e+02 -3.809622962482322461e-01 -7.240000000000000000e+02 -3.809622962482322461e-01 -7.250000000000000000e+02 -3.809622962482322461e-01 -7.260000000000000000e+02 -3.809622962482322461e-01 -7.270000000000000000e+02 -3.809622962482322461e-01 -7.280000000000000000e+02 -3.809622962482322461e-01 -7.290000000000000000e+02 -3.809622962482322461e-01 -7.300000000000000000e+02 -3.809622962482322461e-01 -7.310000000000000000e+02 -3.809622962482322461e-01 -7.320000000000000000e+02 -3.809622962482322461e-01 -7.330000000000000000e+02 -3.809622962482322461e-01 -7.340000000000000000e+02 -3.809622962482322461e-01 -7.350000000000000000e+02 -3.809622962482322461e-01 -7.360000000000000000e+02 -3.809622962482322461e-01 -7.370000000000000000e+02 -3.809622962482322461e-01 -7.380000000000000000e+02 -3.809622962482322461e-01 -7.390000000000000000e+02 -3.809622962482322461e-01 -7.400000000000000000e+02 -3.809622962482322461e-01 -7.410000000000000000e+02 -3.809622962482322461e-01 -7.420000000000000000e+02 -3.809622962482322461e-01 -7.430000000000000000e+02 -3.809622962482322461e-01 -7.440000000000000000e+02 -3.809622962482322461e-01 -7.450000000000000000e+02 -3.809622962482322461e-01 -7.460000000000000000e+02 -3.809622962482322461e-01 -7.470000000000000000e+02 -3.809622962482322461e-01 -7.480000000000000000e+02 -3.809622962482322461e-01 -7.490000000000000000e+02 -3.809622962482322461e-01 -7.500000000000000000e+02 -3.809622962482322461e-01 -7.510000000000000000e+02 -3.809622962482322461e-01 -7.520000000000000000e+02 -3.809622962482322461e-01 -7.530000000000000000e+02 -3.809622962482322461e-01 -7.540000000000000000e+02 -3.809622962482322461e-01 -7.550000000000000000e+02 -3.809622962482322461e-01 -7.560000000000000000e+02 -3.809622962482322461e-01 -7.570000000000000000e+02 -3.809622962482322461e-01 -7.580000000000000000e+02 -3.809622962482322461e-01 -7.590000000000000000e+02 -3.809622962482322461e-01 -7.600000000000000000e+02 -3.809622962482322461e-01 -7.610000000000000000e+02 -3.809622962482322461e-01 -7.620000000000000000e+02 -3.809622962482322461e-01 -7.630000000000000000e+02 -3.809622962482322461e-01 -7.640000000000000000e+02 -3.809622962482322461e-01 -7.650000000000000000e+02 -3.809622962482322461e-01 -7.660000000000000000e+02 -3.809622962482322461e-01 -7.670000000000000000e+02 -3.809622962482322461e-01 -7.680000000000000000e+02 -3.809622962482322461e-01 -7.690000000000000000e+02 -3.809622962482322461e-01 -7.700000000000000000e+02 -3.809622962482322461e-01 -7.710000000000000000e+02 -3.809622962482322461e-01 -7.720000000000000000e+02 -3.809622962482322461e-01 -7.730000000000000000e+02 -3.809622962482322461e-01 -7.740000000000000000e+02 -3.809622962482322461e-01 -7.750000000000000000e+02 -3.809622962482322461e-01 -7.760000000000000000e+02 -3.809622962482322461e-01 -7.770000000000000000e+02 -3.809622962482322461e-01 -7.780000000000000000e+02 -3.809622962482322461e-01 -7.790000000000000000e+02 -3.809622962482322461e-01 -7.800000000000000000e+02 -3.809622962482322461e-01 -7.810000000000000000e+02 -3.809622962482322461e-01 -7.820000000000000000e+02 -3.809622962482322461e-01 -7.830000000000000000e+02 -3.809622962482322461e-01 -7.840000000000000000e+02 -3.809622962482322461e-01 -7.850000000000000000e+02 -3.809622962482322461e-01 -7.860000000000000000e+02 -3.809622962482322461e-01 -7.870000000000000000e+02 -3.809622962482322461e-01 -7.880000000000000000e+02 -3.809622962482322461e-01 -7.890000000000000000e+02 -3.809622962482322461e-01 -7.900000000000000000e+02 -3.809622962482322461e-01 -7.910000000000000000e+02 -3.809622962482322461e-01 -7.920000000000000000e+02 -3.809622962482322461e-01 -7.930000000000000000e+02 -3.809622962482322461e-01 -7.940000000000000000e+02 -3.809622962482322461e-01 -7.950000000000000000e+02 -3.809622962482322461e-01 -7.960000000000000000e+02 -3.809622962482322461e-01 -7.970000000000000000e+02 -3.809622962482322461e-01 -7.980000000000000000e+02 -3.809622962482322461e-01 -7.990000000000000000e+02 -3.809622962482322461e-01 -8.000000000000000000e+02 -3.809622962482322461e-01 -8.010000000000000000e+02 -3.809622962482322461e-01 -8.020000000000000000e+02 -3.809622962482322461e-01 -8.030000000000000000e+02 -3.809622962482322461e-01 -8.040000000000000000e+02 -3.809622962482322461e-01 -8.050000000000000000e+02 -3.809622962482322461e-01 -8.060000000000000000e+02 -3.809622962482322461e-01 -8.070000000000000000e+02 -3.809622962482322461e-01 -8.080000000000000000e+02 -3.809622962482322461e-01 -8.090000000000000000e+02 -3.809622962482322461e-01 -8.100000000000000000e+02 -3.809622962482322461e-01 -8.110000000000000000e+02 -3.809622962482322461e-01 -8.120000000000000000e+02 -3.809622962482322461e-01 -8.130000000000000000e+02 -3.809622962482322461e-01 -8.140000000000000000e+02 -3.809622962482322461e-01 -8.150000000000000000e+02 -3.809622962482322461e-01 -8.160000000000000000e+02 -3.809622962482322461e-01 -8.170000000000000000e+02 -3.809622962482322461e-01 -8.180000000000000000e+02 -3.809622962482322461e-01 -8.190000000000000000e+02 -3.809622962482322461e-01 -8.200000000000000000e+02 -3.809622962482322461e-01 -8.210000000000000000e+02 -3.809622962482322461e-01 -8.220000000000000000e+02 -3.809622962482322461e-01 -8.230000000000000000e+02 -3.809622962482322461e-01 -8.240000000000000000e+02 -3.809622962482322461e-01 -8.250000000000000000e+02 -3.809622962482322461e-01 -8.260000000000000000e+02 -3.809622962482322461e-01 -8.270000000000000000e+02 -3.809622962482322461e-01 -8.280000000000000000e+02 -3.809622962482322461e-01 -8.290000000000000000e+02 -3.809622962482322461e-01 -8.300000000000000000e+02 -3.809622962482322461e-01 -8.310000000000000000e+02 -3.809622962482322461e-01 -8.320000000000000000e+02 -3.809622962482322461e-01 -8.330000000000000000e+02 -3.809622962482322461e-01 -8.340000000000000000e+02 -3.809622962482322461e-01 -8.350000000000000000e+02 -3.809622962482322461e-01 -8.360000000000000000e+02 -3.809622962482322461e-01 -8.370000000000000000e+02 -3.809622962482322461e-01 -8.380000000000000000e+02 -3.809622962482322461e-01 -8.390000000000000000e+02 -3.809622962482322461e-01 -8.400000000000000000e+02 -3.809622962482322461e-01 -8.410000000000000000e+02 -3.809622962482322461e-01 -8.420000000000000000e+02 -3.809622962482322461e-01 -8.430000000000000000e+02 -3.809622962482322461e-01 -8.440000000000000000e+02 -3.809622962482322461e-01 -8.450000000000000000e+02 -3.809622962482322461e-01 -8.460000000000000000e+02 -3.809622962482322461e-01 -8.470000000000000000e+02 -3.809622962482322461e-01 -8.480000000000000000e+02 -3.809622962482322461e-01 -8.490000000000000000e+02 -3.809622962482322461e-01 -8.500000000000000000e+02 -3.809622962482322461e-01 -8.510000000000000000e+02 -3.809622962482322461e-01 -8.520000000000000000e+02 -3.809622962482322461e-01 -8.530000000000000000e+02 -3.809622962482322461e-01 -8.540000000000000000e+02 -3.809622962482322461e-01 -8.550000000000000000e+02 -3.809622962482322461e-01 -8.560000000000000000e+02 -3.809622962482322461e-01 -8.570000000000000000e+02 -3.809622962482322461e-01 -8.580000000000000000e+02 -3.809622962482322461e-01 -8.590000000000000000e+02 -3.809622962482322461e-01 -8.600000000000000000e+02 -3.809622962482322461e-01 -8.610000000000000000e+02 -3.809622962482322461e-01 -8.620000000000000000e+02 -3.809622962482322461e-01 -8.630000000000000000e+02 -3.809622962482322461e-01 -8.640000000000000000e+02 -3.809622962482322461e-01 -8.650000000000000000e+02 -3.809622962482322461e-01 -8.660000000000000000e+02 -3.809622962482322461e-01 -8.670000000000000000e+02 -3.809622962482322461e-01 -8.680000000000000000e+02 -3.809622962482322461e-01 -8.690000000000000000e+02 -3.809622962482322461e-01 -8.700000000000000000e+02 -3.809622962482322461e-01 -8.710000000000000000e+02 -3.809622962482322461e-01 -8.720000000000000000e+02 -3.809622962482322461e-01 -8.730000000000000000e+02 -3.809622962482322461e-01 -8.740000000000000000e+02 -3.809622962482322461e-01 -8.750000000000000000e+02 -3.809622962482322461e-01 -8.760000000000000000e+02 -3.809622962482322461e-01 -8.770000000000000000e+02 -3.809622962482322461e-01 -8.780000000000000000e+02 -3.809622962482322461e-01 -8.790000000000000000e+02 -3.809622962482322461e-01 -8.800000000000000000e+02 -3.809622962482322461e-01 -8.810000000000000000e+02 -3.809622962482322461e-01 -8.820000000000000000e+02 -3.809622962482322461e-01 -8.830000000000000000e+02 -3.809622962482322461e-01 -8.840000000000000000e+02 -3.809622962482322461e-01 -8.850000000000000000e+02 -3.809622962482322461e-01 -8.860000000000000000e+02 -3.809622962482322461e-01 -8.870000000000000000e+02 -3.809622962482322461e-01 -8.880000000000000000e+02 -3.809622962482322461e-01 -8.890000000000000000e+02 -3.809622962482322461e-01 -8.900000000000000000e+02 -3.809622962482322461e-01 -8.910000000000000000e+02 -3.809622962482322461e-01 -8.920000000000000000e+02 -3.809622962482322461e-01 -8.930000000000000000e+02 -3.809622962482322461e-01 -8.940000000000000000e+02 -3.809622962482322461e-01 -8.950000000000000000e+02 -3.809622962482322461e-01 -8.960000000000000000e+02 -3.809622962482322461e-01 -8.970000000000000000e+02 -3.809622962482322461e-01 -8.980000000000000000e+02 -3.809622962482322461e-01 -8.990000000000000000e+02 -3.809622962482322461e-01 -9.000000000000000000e+02 -3.809622962482322461e-01 -9.010000000000000000e+02 -3.809622962482322461e-01 -9.020000000000000000e+02 -3.809622962482322461e-01 -9.030000000000000000e+02 -3.809622962482322461e-01 -9.040000000000000000e+02 -3.809622962482322461e-01 -9.050000000000000000e+02 -3.809622962482322461e-01 -9.060000000000000000e+02 -3.809622962482322461e-01 -9.070000000000000000e+02 -3.809622962482322461e-01 -9.080000000000000000e+02 -3.809622962482322461e-01 -9.090000000000000000e+02 -3.809622962482322461e-01 -9.100000000000000000e+02 -3.809622962482322461e-01 -9.110000000000000000e+02 -3.809622962482322461e-01 -9.120000000000000000e+02 -3.809622962482322461e-01 -9.130000000000000000e+02 -3.809622962482322461e-01 -9.140000000000000000e+02 -3.809622962482322461e-01 -9.150000000000000000e+02 -3.809622962482322461e-01 -9.160000000000000000e+02 -3.809622962482322461e-01 -9.170000000000000000e+02 -3.809622962482322461e-01 -9.180000000000000000e+02 -3.809622962482322461e-01 -9.190000000000000000e+02 -3.809622962482322461e-01 -9.200000000000000000e+02 -3.809622962482322461e-01 -9.210000000000000000e+02 -3.809622962482322461e-01 -9.220000000000000000e+02 -3.809622962482322461e-01 -9.230000000000000000e+02 -3.809622962482322461e-01 -9.240000000000000000e+02 -3.809622962482322461e-01 -9.250000000000000000e+02 -3.809622962482322461e-01 -9.260000000000000000e+02 -3.809622962482322461e-01 -9.270000000000000000e+02 -3.809622962482322461e-01 -9.280000000000000000e+02 -3.809622962482322461e-01 -9.290000000000000000e+02 -3.809622962482322461e-01 -9.300000000000000000e+02 -3.809622962482322461e-01 -9.310000000000000000e+02 -3.809622962482322461e-01 -9.320000000000000000e+02 -3.809622962482322461e-01 -9.330000000000000000e+02 -3.809622962482322461e-01 -9.340000000000000000e+02 -3.809622962482322461e-01 -9.350000000000000000e+02 -3.809622962482322461e-01 -9.360000000000000000e+02 -3.809622962482322461e-01 -9.370000000000000000e+02 -3.809622962482322461e-01 -9.380000000000000000e+02 -3.809622962482322461e-01 -9.390000000000000000e+02 -3.809622962482322461e-01 -9.400000000000000000e+02 -3.809622962482322461e-01 -9.410000000000000000e+02 -3.809622962482322461e-01 -9.420000000000000000e+02 -3.809622962482322461e-01 -9.430000000000000000e+02 -3.809622962482322461e-01 -9.440000000000000000e+02 -3.809622962482322461e-01 -9.450000000000000000e+02 -3.809622962482322461e-01 -9.460000000000000000e+02 -3.809622962482322461e-01 -9.470000000000000000e+02 -3.809622962482322461e-01 -9.480000000000000000e+02 -3.809622962482322461e-01 -9.490000000000000000e+02 -3.809622962482322461e-01 -9.500000000000000000e+02 -3.809622962482322461e-01 -9.510000000000000000e+02 -3.809622962482322461e-01 -9.520000000000000000e+02 -3.809622962482322461e-01 -9.530000000000000000e+02 -3.809622962482322461e-01 -9.540000000000000000e+02 -3.809622962482322461e-01 -9.550000000000000000e+02 -3.809622962482322461e-01 -9.560000000000000000e+02 -3.809622962482322461e-01 -9.570000000000000000e+02 -3.809622962482322461e-01 -9.580000000000000000e+02 -3.809622962482322461e-01 -9.590000000000000000e+02 -3.809622962482322461e-01 -9.600000000000000000e+02 -3.809622962482322461e-01 -9.610000000000000000e+02 -3.809622962482322461e-01 -9.620000000000000000e+02 -3.809622962482322461e-01 -9.630000000000000000e+02 -3.809622962482322461e-01 -9.640000000000000000e+02 -3.809622962482322461e-01 -9.650000000000000000e+02 -3.809622962482322461e-01 -9.660000000000000000e+02 -3.809622962482322461e-01 -9.670000000000000000e+02 -3.809622962482322461e-01 -9.680000000000000000e+02 -3.809622962482322461e-01 -9.690000000000000000e+02 -3.809622962482322461e-01 -9.700000000000000000e+02 -3.809622962482322461e-01 -9.710000000000000000e+02 -3.809622962482322461e-01 -9.720000000000000000e+02 -3.809622962482322461e-01 -9.730000000000000000e+02 -3.809622962482322461e-01 -9.740000000000000000e+02 -3.809622962482322461e-01 -9.750000000000000000e+02 -3.809622962482322461e-01 -9.760000000000000000e+02 -3.809622962482322461e-01 -9.770000000000000000e+02 -3.809622962482322461e-01 -9.780000000000000000e+02 -3.809622962482322461e-01 -9.790000000000000000e+02 -3.809622962482322461e-01 -9.800000000000000000e+02 -3.809622962482322461e-01 -9.810000000000000000e+02 -3.809622962482322461e-01 -9.820000000000000000e+02 -3.809622962482322461e-01 -9.830000000000000000e+02 -3.809622962482322461e-01 -9.840000000000000000e+02 -3.809622962482322461e-01 -9.850000000000000000e+02 -3.809622962482322461e-01 -9.860000000000000000e+02 -3.809622962482322461e-01 -9.870000000000000000e+02 -3.809622962482322461e-01 -9.880000000000000000e+02 -3.809622962482322461e-01 -9.890000000000000000e+02 -3.809622962482322461e-01 -9.900000000000000000e+02 -3.809622962482322461e-01 -9.910000000000000000e+02 -3.809622962482322461e-01 -9.920000000000000000e+02 -3.809622962482322461e-01 -9.930000000000000000e+02 -3.809622962482322461e-01 -9.940000000000000000e+02 -3.809622962482322461e-01 -9.950000000000000000e+02 -3.809622962482322461e-01 -9.960000000000000000e+02 -3.809622962482322461e-01 -9.970000000000000000e+02 -3.809622962482322461e-01 -9.980000000000000000e+02 -3.809622962482322461e-01 -9.990000000000000000e+02 -3.809622962482322461e-01 -1.000000000000000000e+03 -3.809622962482322461e-01 -1.001000000000000000e+03 -3.809622962482322461e-01 -1.002000000000000000e+03 -3.809622962482322461e-01 -1.003000000000000000e+03 -3.809622962482322461e-01 -1.004000000000000000e+03 -3.809622962482322461e-01 -1.005000000000000000e+03 -3.809622962482322461e-01 -1.006000000000000000e+03 -3.809622962482322461e-01 -1.007000000000000000e+03 -3.809622962482322461e-01 -1.008000000000000000e+03 -3.809622962482322461e-01 -1.009000000000000000e+03 -3.809622962482322461e-01 -1.010000000000000000e+03 -3.809622962482322461e-01 -1.011000000000000000e+03 -3.809622962482322461e-01 -1.012000000000000000e+03 -3.809622962482322461e-01 -1.013000000000000000e+03 -3.809622962482322461e-01 -1.014000000000000000e+03 -3.809622962482322461e-01 -1.015000000000000000e+03 -3.809622962482322461e-01 -1.016000000000000000e+03 -3.809622962482322461e-01 -1.017000000000000000e+03 -3.809622962482322461e-01 -1.018000000000000000e+03 -3.809622962482322461e-01 -1.019000000000000000e+03 -3.809622962482322461e-01 -1.020000000000000000e+03 -3.809622962482322461e-01 -1.021000000000000000e+03 -3.809622962482322461e-01 -1.022000000000000000e+03 -3.809622962482322461e-01 -1.023000000000000000e+03 -3.809622962482322461e-01 -1.024000000000000000e+03 -3.809622962482322461e-01 -1.025000000000000000e+03 -3.809622962482322461e-01 -1.026000000000000000e+03 -3.809622962482322461e-01 -1.027000000000000000e+03 -3.809622962482322461e-01 -1.028000000000000000e+03 -3.809622962482322461e-01 -1.029000000000000000e+03 -3.809622962482322461e-01 -1.030000000000000000e+03 -3.809622962482322461e-01 -1.031000000000000000e+03 -3.809622962482322461e-01 -1.032000000000000000e+03 -3.809622962482322461e-01 -1.033000000000000000e+03 -3.809622962482322461e-01 -1.034000000000000000e+03 -3.809622962482322461e-01 -1.035000000000000000e+03 -3.809622962482322461e-01 -1.036000000000000000e+03 -3.809622962482322461e-01 -1.037000000000000000e+03 -3.809622962482322461e-01 -1.038000000000000000e+03 -3.809622962482322461e-01 -1.039000000000000000e+03 -3.809622962482322461e-01 -1.040000000000000000e+03 -3.809622962482322461e-01 -1.041000000000000000e+03 -3.809622962482322461e-01 -1.042000000000000000e+03 -3.809622962482322461e-01 -1.043000000000000000e+03 -3.809622962482322461e-01 -1.044000000000000000e+03 -3.809622962482322461e-01 -1.045000000000000000e+03 -3.809622962482322461e-01 -1.046000000000000000e+03 -3.809622962482322461e-01 -1.047000000000000000e+03 -3.809622962482322461e-01 -1.048000000000000000e+03 -3.809622962482322461e-01 -1.049000000000000000e+03 -3.809622962482322461e-01 -1.050000000000000000e+03 -3.809622962482322461e-01 -1.051000000000000000e+03 -3.809622962482322461e-01 -1.052000000000000000e+03 -3.809622962482322461e-01 -1.053000000000000000e+03 -3.809622962482322461e-01 -1.054000000000000000e+03 -3.809622962482322461e-01 -1.055000000000000000e+03 -3.809622962482322461e-01 -1.056000000000000000e+03 -3.809622962482322461e-01 -1.057000000000000000e+03 -3.809622962482322461e-01 -1.058000000000000000e+03 -3.809622962482322461e-01 -1.059000000000000000e+03 -3.809622962482322461e-01 -1.060000000000000000e+03 -3.809622962482322461e-01 -1.061000000000000000e+03 -3.809622962482322461e-01 -1.062000000000000000e+03 -3.809622962482322461e-01 -1.063000000000000000e+03 -3.809622962482322461e-01 -1.064000000000000000e+03 -3.809622962482322461e-01 -1.065000000000000000e+03 -3.809622962482322461e-01 -1.066000000000000000e+03 -3.809622962482322461e-01 -1.067000000000000000e+03 -3.809622962482322461e-01 -1.068000000000000000e+03 -3.809622962482322461e-01 -1.069000000000000000e+03 -3.809622962482322461e-01 -1.070000000000000000e+03 -3.809622962482322461e-01 -1.071000000000000000e+03 -3.809622962482322461e-01 -1.072000000000000000e+03 -3.809622962482322461e-01 -1.073000000000000000e+03 -3.809622962482322461e-01 -1.074000000000000000e+03 -3.809622962482322461e-01 -1.075000000000000000e+03 -3.809622962482322461e-01 -1.076000000000000000e+03 -3.809622962482322461e-01 -1.077000000000000000e+03 -3.809622962482322461e-01 -1.078000000000000000e+03 -3.809622962482322461e-01 -1.079000000000000000e+03 -3.809622962482322461e-01 -1.080000000000000000e+03 -3.809622962482322461e-01 -1.081000000000000000e+03 -3.809622962482322461e-01 -1.082000000000000000e+03 -3.809622962482322461e-01 -1.083000000000000000e+03 -3.809622962482322461e-01 -1.084000000000000000e+03 -3.809622962482322461e-01 -1.085000000000000000e+03 -3.809622962482322461e-01 -1.086000000000000000e+03 -3.809622962482322461e-01 -1.087000000000000000e+03 -3.809622962482322461e-01 -1.088000000000000000e+03 -3.809622962482322461e-01 -1.089000000000000000e+03 -3.809622962482322461e-01 -1.090000000000000000e+03 -3.809622962482322461e-01 -1.091000000000000000e+03 -3.809622962482322461e-01 -1.092000000000000000e+03 -3.809622962482322461e-01 -1.093000000000000000e+03 -3.809622962482322461e-01 -1.094000000000000000e+03 -3.809622962482322461e-01 -1.095000000000000000e+03 -3.809622962482322461e-01 -1.096000000000000000e+03 -3.809622962482319686e-01 -1.097000000000000000e+03 -3.809622962482319686e-01 -1.098000000000000000e+03 -3.809622962482319686e-01 -1.099000000000000000e+03 -3.809622962482319686e-01 +3.000000000000000000e+02 1.375196993384676658e-01 +3.010000000000000000e+02 1.148794318163027517e-01 +3.020000000000000000e+02 9.490222350357831183e-02 +3.030000000000000000e+02 7.735086209745876962e-02 +3.040000000000000000e+02 6.204249593194603035e-02 +3.050000000000000000e+02 4.884053055081664929e-02 +3.060000000000000000e+02 3.764863700539566871e-02 +3.070000000000000000e+02 2.840642566497900492e-02 +3.080000000000000000e+02 2.108646405197598522e-02 +3.090000000000000000e+02 1.569240891423372142e-02 +3.100000000000000000e+02 1.225809106846927933e-02 +3.110000000000000000e+02 1.084744315406127764e-02 +3.120000000000000000e+02 1.155519988046073768e-02 +3.130000000000000000e+02 1.450833065473079546e-02 +3.140000000000000000e+02 1.986818747794508871e-02 +3.150000000000000000e+02 2.783336754907148047e-02 +3.160000000000000000e+02 3.864330002388263741e-02 +3.170000000000000000e+02 5.258256875017554288e-02 +3.180000000000000000e+02 6.998597524809667403e-02 +3.190000000000000000e+02 9.124432491347865548e-02 +3.200000000000000000e+02 1.168108785874574784e-01 +3.210000000000000000e+02 1.472083428297892016e-01 +3.220000000000000000e+02 1.830361636383368018e-01 +3.230000000000000000e+02 2.249777239274205198e-01 +3.240000000000000000e+02 2.738068038371947455e-01 +3.250000000000000000e+02 3.303923188433796621e-01 +3.260000000000000000e+02 3.956998737968978608e-01 +3.270000000000000000e+02 4.707880318944210885e-01 +3.280000000000000000e+02 5.567963764265303483e-01 +3.290000000000000000e+02 6.549214486136448743e-01 +3.300000000000000000e+02 7.663755463830008718e-01 +3.310000000000000000e+02 8.923223478884041437e-01 +3.320000000000000000e+02 1.033782743649253488e+00 +3.330000000000000000e+02 1.191504747417050591e+00 +3.340000000000000000e+02 1.365793844438335514e+00 +3.350000000000000000e+02 1.556305812750571782e+00 +3.360000000000000000e+02 1.761814046349465590e+00 +3.370000000000000000e+02 1.979978076965569489e+00 +3.380000000000000000e+02 2.207157762071574769e+00 +3.390000000000000000e+02 2.438333688155275958e+00 +3.400000000000000000e+02 2.667200261324630173e+00 +3.410000000000000000e+02 2.886483478563668381e+00 +3.420000000000000000e+02 3.088493799912809479e+00 +3.430000000000000000e+02 3.265860129939112788e+00 +3.440000000000000000e+02 3.412323289469711529e+00 +3.450000000000000000e+02 3.523426536989169300e+00 +3.460000000000000000e+02 3.596951493602348560e+00 +3.470000000000000000e+02 3.633012480717904946e+00 +3.480000000000000000e+02 3.633815578688332160e+00 +3.490000000000000000e+02 3.603171672419537952e+00 +3.500000000000000000e+02 3.545895217416231038e+00 +3.510000000000000000e+02 3.467215628879384060e+00 +3.520000000000000000e+02 3.372290487892572575e+00 +3.530000000000000000e+02 3.265861698961923576e+00 +3.540000000000000000e+02 3.152055284182587069e+00 +3.550000000000000000e+02 3.034300699151680103e+00 +3.560000000000000000e+02 2.915335977922085764e+00 +3.570000000000000000e+02 2.797266005484678963e+00 +3.580000000000000000e+02 2.681647557543167082e+00 +3.590000000000000000e+02 2.569582530867592585e+00 +3.600000000000000000e+02 2.461807804650376852e+00 +3.610000000000000000e+02 2.358775552840453926e+00 +3.620000000000000000e+02 2.260721498246372807e+00 +3.630000000000000000e+02 2.167720853860855890e+00 +3.640000000000000000e+02 2.079732922657751892e+00 +3.650000000000000000e+02 1.996635874843193603e+00 +3.660000000000000000e+02 1.918253360365562710e+00 +3.670000000000000000e+02 1.844374530598193340e+00 +3.680000000000000000e+02 1.774768855344367013e+00 +3.690000000000000000e+02 1.709196900025830690e+00 +3.700000000000000000e+02 1.647418011294166762e+00 +3.710000000000000000e+02 1.589195665544876679e+00 +3.720000000000000000e+02 1.534301070485480034e+00 +3.730000000000000000e+02 1.482515475295091534e+00 +3.740000000000000000e+02 1.433631537264090428e+00 +3.750000000000000000e+02 1.387454008208677925e+00 +3.760000000000000000e+02 1.343799938341827538e+00 +3.770000000000000000e+02 1.302498544902949806e+00 +3.780000000000000000e+02 1.263390854475725300e+00 +3.790000000000000000e+02 1.226329198890880878e+00 +3.800000000000000000e+02 1.191176622770828697e+00 +3.810000000000000000e+02 1.157806244429178344e+00 +3.820000000000000000e+02 1.126100599671812530e+00 +3.830000000000000000e+02 1.095950989035169965e+00 +3.840000000000000000e+02 1.067256842364508573e+00 +3.850000000000000000e+02 1.039925109782515511e+00 +3.860000000000000000e+02 1.013869684581203190e+00 +3.870000000000000000e+02 9.890108610420870194e-01 +3.880000000000000000e+02 9.652748284003803692e-01 +3.890000000000000000e+02 9.425932009233340958e-01 +3.900000000000000000e+02 9.209025832257614619e-01 +3.910000000000000000e+02 9.001441693940476219e-01 +3.920000000000000000e+02 8.802633741475212048e-01 +3.930000000000000000e+02 8.612094940778729502e-01 +3.940000000000000000e+02 8.429353969263738700e-01 +3.950000000000000000e+02 8.253972368534254755e-01 +3.960000000000000000e+02 8.085541937005903401e-01 +3.970000000000000000e+02 7.923682343256113203e-01 +3.980000000000000000e+02 7.768038941903562256e-01 +3.990000000000000000e+02 7.618280774948955614e-01 +4.000000000000000000e+02 7.474098742678558782e-01 +4.010000000000000000e+02 7.335203929410564205e-01 +4.020000000000000000e+02 7.201326070526395950e-01 +4.030000000000000000e+02 7.072212148329793946e-01 +4.040000000000000000e+02 6.947625105339171325e-01 +4.050000000000000000e+02 6.827342664594757693e-01 +4.060000000000000000e+02 6.711156247489294957e-01 +4.070000000000000000e+02 6.598869980471987473e-01 +4.080000000000000000e+02 6.490299782761819181e-01 +4.090000000000000000e+02 6.385272527920262675e-01 +4.100000000000000000e+02 6.283625272786078630e-01 +4.110000000000000000e+02 6.185204547874053604e-01 +4.120000000000000000e+02 6.089865703880761316e-01 +4.130000000000000000e+02 5.997472309431893800e-01 +4.140000000000000000e+02 5.907895595655281440e-01 +4.150000000000000000e+02 5.821013943568177362e-01 +4.160000000000000000e+02 5.736712410634341452e-01 +4.170000000000000000e+02 5.654882293179414043e-01 +4.180000000000000000e+02 5.575420721653520095e-01 +4.190000000000000000e+02 5.498230286005463263e-01 +4.200000000000000000e+02 5.423218688674458221e-01 +4.210000000000000000e+02 5.350298422933366105e-01 +4.220000000000000000e+02 5.279386474518455996e-01 +4.230000000000000000e+02 5.210404044660734701e-01 +4.240000000000000000e+02 5.143276292804849215e-01 +4.250000000000000000e+02 5.077932097447476201e-01 +4.260000000000000000e+02 5.014303833665973986e-01 +4.270000000000000000e+02 4.952327166030171535e-01 +4.280000000000000000e+02 4.891940855703422741e-01 +4.290000000000000000e+02 4.833086580639807672e-01 +4.300000000000000000e+02 4.775708767877461236e-01 +4.310000000000000000e+02 4.719754437012009252e-01 +4.320000000000000000e+02 4.665173054010368081e-01 +4.330000000000000000e+02 4.611916394594177682e-01 +4.340000000000000000e+02 4.559938416486444823e-01 +4.350000000000000000e+02 4.509195139872385072e-01 +4.360000000000000000e+02 4.459644535476448013e-01 +4.370000000000000000e+02 4.411246419708694799e-01 +4.380000000000000000e+02 4.363962356373117801e-01 +4.390000000000000000e+02 4.317755564475641572e-01 +4.400000000000000000e+02 4.272590831700543434e-01 +4.410000000000000000e+02 4.228434433161886163e-01 +4.420000000000000000e+02 4.185254055065021350e-01 +4.430000000000000000e+02 4.143018722940978171e-01 +4.440000000000000000e+02 4.101698734143596203e-01 +4.450000000000000000e+02 4.061265594321264993e-01 +4.460000000000000000e+02 4.021691957597747780e-01 +4.470000000000000000e+02 3.982951570215663151e-01 +4.480000000000000000e+02 3.945019217415195456e-01 +4.490000000000000000e+02 3.907870673336293899e-01 +4.500000000000000000e+02 3.871482653748795633e-01 +4.510000000000000000e+02 3.835832771428268617e-01 +4.520000000000000000e+02 3.800899494009965518e-01 +4.530000000000000000e+02 3.766662104162896152e-01 +4.540000000000000000e+02 3.733100661939305898e-01 +4.550000000000000000e+02 3.700195969163551646e-01 +4.560000000000000000e+02 3.667929535734908431e-01 +4.570000000000000000e+02 3.636283547726303356e-01 +4.580000000000000000e+02 3.605240837170427537e-01 +4.590000000000000000e+02 3.574784853431044462e-01 +4.600000000000000000e+02 3.544899636064058335e-01 +4.610000000000000000e+02 3.515569789080635887e-01 +4.620000000000000000e+02 3.486780456529197103e-01 +4.630000000000000000e+02 3.458517299319014970e-01 +4.640000000000000000e+02 3.430766473212945589e-01 +4.650000000000000000e+02 3.403514607922722979e-01 +4.660000000000000000e+02 3.376748787242742078e-01 +4.670000000000000000e+02 3.350456530163856694e-01 +4.680000000000000000e+02 3.324625772911450339e-01 +4.690000000000000000e+02 3.299244851856524829e-01 +4.700000000000000000e+02 3.274302487250633220e-01 +4.710000000000000000e+02 3.249787767739680810e-01 +4.720000000000000000e+02 3.225690135613545895e-01 +4.730000000000000000e+02 3.201999372751603845e-01 +4.740000000000000000e+02 3.178705587226478002e-01 +4.750000000000000000e+02 3.155799200530782223e-01 +4.760000000000000000e+02 3.133270935393506207e-01 +4.770000000000000000e+02 3.111111804154868543e-01 +4.780000000000000000e+02 3.089313097670201014e-01 +4.790000000000000000e+02 3.067866374715769728e-01 +4.800000000000000000e+02 3.046763451869432537e-01 +4.810000000000000000e+02 3.025996393842827481e-01 +4.820000000000000000e+02 3.005557504241232469e-01 +4.830000000000000000e+02 2.985439316729701642e-01 +4.840000000000000000e+02 2.965634586584907639e-01 +4.850000000000000000e+02 2.946136282613167068e-01 +4.860000000000000000e+02 2.926937579416843960e-01 +4.870000000000000000e+02 2.908031849991328799e-01 +4.880000000000000000e+02 2.889412658636900111e-01 +4.890000000000000000e+02 2.871073754169614078e-01 +4.900000000000000000e+02 2.853009063417092928e-01 +4.910000000000000000e+02 2.835212684985126685e-01 +4.920000000000000000e+02 2.817678883282564439e-01 +4.930000000000000000e+02 2.800402082791625946e-01 +4.940000000000000000e+02 2.783376862572609078e-01 +4.950000000000000000e+02 2.766597950991546151e-01 +4.960000000000000000e+02 2.750060220660593413e-01 +4.970000000000000000e+02 2.733758683581199445e-01 +4.980000000000000000e+02 2.717688486480933086e-01 +4.990000000000000000e+02 2.701844906334607277e-01 +5.000000000000000000e+02 2.686223346061878958e-01 +5.010000000000000000e+02 2.670819330392825708e-01 +5.020000000000000000e+02 2.655628501894329307e-01 +5.030000000000000000e+02 2.640646617149829400e-01 +5.040000000000000000e+02 2.625869543085715407e-01 +5.050000000000000000e+02 2.611293253437843576e-01 +5.060000000000000000e+02 2.596913825352153982e-01 +5.070000000000000000e+02 2.582727436113309016e-01 +5.080000000000000000e+02 2.568730359995868850e-01 +5.090000000000000000e+02 2.554918965232875205e-01 +5.100000000000000000e+02 2.541289711096627602e-01 +5.110000000000000000e+02 2.527839145086937522e-01 +5.120000000000000000e+02 2.514563900222213100e-01 +5.130000000000000000e+02 2.501460692429048338e-01 +5.140000000000000000e+02 2.488526318026602346e-01 +5.150000000000000000e+02 2.475757651300865558e-01 +5.160000000000000000e+02 2.463151642166299671e-01 +5.170000000000000000e+02 2.450705313910027938e-01 +5.180000000000000000e+02 2.438415761016357597e-01 +5.190000000000000000e+02 2.426280147067272908e-01 +5.200000000000000000e+02 2.414295702716698078e-01 +5.210000000000000000e+02 2.402459723734994834e-01 +5.220000000000000000e+02 2.390769569121214688e-01 +5.230000000000000000e+02 2.379222659279945085e-01 +5.240000000000000000e+02 2.367816474261073556e-01 +5.250000000000000000e+02 2.356548552058783941e-01 +5.260000000000000000e+02 2.345416486968476544e-01 +5.270000000000000000e+02 2.334417927998909958e-01 +5.280000000000000000e+02 2.323550577337347989e-01 +5.290000000000000000e+02 2.312812188865958907e-01 +5.300000000000000000e+02 2.302200566727157782e-01 +5.310000000000000000e+02 2.291713563936337017e-01 +5.320000000000000000e+02 2.281349081040016658e-01 +5.330000000000000000e+02 2.271105064817594554e-01 +5.340000000000000000e+02 2.260979507025354940e-01 +5.350000000000000000e+02 2.250970443180893843e-01 +5.360000000000000000e+02 2.241075951386504728e-01 +5.370000000000000000e+02 2.231294151190162389e-01 +5.380000000000000000e+02 2.221623202482787551e-01 +5.390000000000000000e+02 2.212061304430074093e-01 +5.400000000000000000e+02 2.202606694438176416e-01 +5.410000000000000000e+02 2.193257647151560519e-01 +5.420000000000000000e+02 2.184012473482151162e-01 +5.430000000000000000e+02 2.174869519668403695e-01 +5.440000000000000000e+02 2.165827166363491763e-01 +5.450000000000000000e+02 2.156883827751495675e-01 +5.460000000000000000e+02 2.148037950690249442e-01 +5.470000000000000000e+02 2.139288013880628614e-01 +5.480000000000000000e+02 2.130632527060586923e-01 +5.490000000000000000e+02 2.122070030223569270e-01 +5.500000000000000000e+02 2.113599092860327378e-01 +5.510000000000000000e+02 2.105218313223237991e-01 +5.520000000000000000e+02 2.096926317612486379e-01 +5.530000000000000000e+02 2.088721759683206114e-01 +5.540000000000000000e+02 2.080603319772994231e-01 +5.550000000000000000e+02 2.072569704249176969e-01 +5.560000000000000000e+02 2.064619644874903792e-01 +5.570000000000000000e+02 2.056751898193578953e-01 +5.580000000000000000e+02 2.048965244931146568e-01 +5.590000000000000000e+02 2.041258489415463395e-01 +5.600000000000000000e+02 2.033630459012148728e-01 +5.610000000000000000e+02 2.026080003576562205e-01 +5.620000000000000000e+02 2.018605994921285063e-01 +5.630000000000000000e+02 2.011207326298440901e-01 +5.640000000000000000e+02 2.003882911896737729e-01 +5.650000000000000000e+02 1.996631686352361712e-01 +5.660000000000000000e+02 1.989452604273535263e-01 +5.670000000000000000e+02 1.982344639778164663e-01 +5.680000000000000000e+02 1.975306786044317420e-01 +5.690000000000000000e+02 1.968338054872833531e-01 +5.700000000000000000e+02 1.961437476262080093e-01 +5.710000000000000000e+02 1.954604097994022405e-01 +5.720000000000000000e+02 1.947836985231734819e-01 +5.730000000000000000e+02 1.941135220127536698e-01 +5.740000000000000000e+02 1.934497901441677992e-01 +5.750000000000000000e+02 1.927924144171384302e-01 +5.760000000000000000e+02 1.921413079189405460e-01 +5.770000000000000000e+02 1.914963852892475060e-01 +5.780000000000000000e+02 1.908575626858804164e-01 +5.790000000000000000e+02 1.902247577514702692e-01 +5.800000000000000000e+02 1.895978895809742881e-01 +5.810000000000000000e+02 1.889768786900545006e-01 +5.820000000000000000e+02 1.883616469842668839e-01 +5.830000000000000000e+02 1.877521177290443766e-01 +5.840000000000000000e+02 1.871482155204517717e-01 +5.850000000000000000e+02 1.865498662566866805e-01 +5.860000000000000000e+02 1.859569971103169073e-01 +5.870000000000000000e+02 1.853695365012026919e-01 +5.880000000000000000e+02 1.847874140701262768e-01 +5.890000000000000000e+02 1.842105606530616557e-01 +5.900000000000000000e+02 1.836389082561044050e-01 +5.910000000000000000e+02 1.830723900310256558e-01 +5.920000000000000000e+02 1.825109402514278889e-01 +5.930000000000000000e+02 1.819544942894908701e-01 +5.940000000000000000e+02 1.814029885932988695e-01 +5.950000000000000000e+02 1.808563606647166366e-01 +5.960000000000000000e+02 1.803145490378097460e-01 +5.970000000000000000e+02 1.797774932577902163e-01 +5.980000000000000000e+02 1.792451338604707789e-01 +5.990000000000000000e+02 1.787174123522242697e-01 +6.000000000000000000e+02 1.781942711904106469e-01 +6.010000000000000000e+02 1.776756537642888711e-01 +6.020000000000000000e+02 1.771615043435660064e-01 +6.030000000000000000e+02 1.766517681917462446e-01 +6.040000000000000000e+02 1.761463913827418515e-01 +6.050000000000000000e+02 1.756453207867278987e-01 +6.060000000000000000e+02 1.751485042140254467e-01 +6.070000000000000000e+02 1.746558902689490100e-01 +6.080000000000000000e+02 1.741674283661302780e-01 +6.090000000000000000e+02 1.736830687147430941e-01 +6.100000000000000000e+02 1.732027623030943653e-01 +6.110000000000000000e+02 1.727264608835598625e-01 +6.120000000000000000e+02 1.722541169578780673e-01 +6.130000000000000000e+02 1.717856837627745048e-01 +6.140000000000000000e+02 1.713211152559170058e-01 +6.150000000000000000e+02 1.708603661021853293e-01 +6.160000000000000000e+02 1.704033916602639420e-01 +6.170000000000000000e+02 1.699501479695191275e-01 +6.180000000000000000e+02 1.695005917371882054e-01 +6.190000000000000000e+02 1.690546803258453357e-01 +6.200000000000000000e+02 1.686123717411563694e-01 +6.210000000000000000e+02 1.681736246198889118e-01 +6.220000000000000000e+02 1.677383982182137079e-01 +6.230000000000000000e+02 1.673066524002369548e-01 +6.240000000000000000e+02 1.668783476268080046e-01 +6.250000000000000000e+02 1.664534449445581321e-01 +6.260000000000000000e+02 1.660319059751846904e-01 +6.270000000000000000e+02 1.656136929049655537e-01 +6.280000000000000000e+02 1.651987684745031826e-01 +6.290000000000000000e+02 1.647870959686940084e-01 +6.300000000000000000e+02 1.643786392069029323e-01 +6.310000000000000000e+02 1.639733625333615885e-01 +6.320000000000000000e+02 1.635712308077605370e-01 +6.330000000000000000e+02 1.631722093960533970e-01 +6.340000000000000000e+02 1.627762641614442785e-01 +6.350000000000000000e+02 1.623833614555767191e-01 +6.360000000000000000e+02 1.619934681099056972e-01 +6.370000000000000000e+02 1.616065514272382597e-01 +6.380000000000000000e+02 1.612225791734774594e-01 +6.390000000000000000e+02 1.608415195695130917e-01 +6.400000000000000000e+02 1.604633412832952855e-01 +6.410000000000000000e+02 1.600880134220697970e-01 +6.420000000000000000e+02 1.597155055247714561e-01 +6.430000000000000000e+02 1.593457875545740698e-01 +6.440000000000000000e+02 1.589788298916008091e-01 +6.450000000000000000e+02 1.586146033257733734e-01 +6.460000000000000000e+02 1.582530790498115625e-01 +6.470000000000000000e+02 1.578942286523798422e-01 +6.480000000000000000e+02 1.575380241113608637e-01 +6.490000000000000000e+02 1.571844377872793352e-01 +6.500000000000000000e+02 1.568334424168470187e-01 +6.510000000000000000e+02 1.564850111066434790e-01 +6.520000000000000000e+02 1.561391173269168764e-01 +6.530000000000000000e+02 1.557957349055201779e-01 +6.540000000000000000e+02 1.554548380219512305e-01 +6.550000000000000000e+02 1.551164012015274762e-01 +6.560000000000000000e+02 1.547803993096629471e-01 +6.570000000000000000e+02 1.544468075462648027e-01 +6.580000000000000000e+02 1.541156014402393082e-01 +6.590000000000000000e+02 1.537867568440994259e-01 +6.600000000000000000e+02 1.534602499286881194e-01 +6.610000000000000000e+02 1.531360571779925017e-01 +6.620000000000000000e+02 1.528141553840649813e-01 +6.630000000000000000e+02 1.524945216420463545e-01 +6.640000000000000000e+02 1.521771333452694164e-01 +6.650000000000000000e+02 1.518619681804810606e-01 +6.660000000000000000e+02 1.515490041231268015e-01 +6.670000000000000000e+02 1.512382194327490104e-01 +6.680000000000000000e+02 1.509295926484607586e-01 +6.690000000000000000e+02 1.506231025845105598e-01 +6.700000000000000000e+02 1.503187283259222740e-01 +6.710000000000000000e+02 1.500164492242310188e-01 +6.720000000000000000e+02 1.497162448932860546e-01 +6.730000000000000000e+02 1.494180952051416267e-01 +6.740000000000000000e+02 1.491219802860143107e-01 +6.750000000000000000e+02 1.488278805123304516e-01 +6.760000000000000000e+02 1.485357765068309466e-01 +6.770000000000000000e+02 1.482456491347580174e-01 +6.780000000000000000e+02 1.479574795001100673e-01 +6.790000000000000000e+02 1.476712489419663155e-01 +6.800000000000000000e+02 1.473869390308726324e-01 +6.810000000000000000e+02 1.471045315653030650e-01 +6.820000000000000000e+02 1.468240085681773444e-01 +6.830000000000000000e+02 1.465453522834480604e-01 +6.840000000000000000e+02 1.462685451727469277e-01 +6.850000000000000000e+02 1.459935699120862851e-01 +6.860000000000000000e+02 1.457204093886343144e-01 +6.870000000000000000e+02 1.454490466975295604e-01 +6.880000000000000000e+02 1.451794651387686153e-01 +6.890000000000000000e+02 1.449116482141396545e-01 +6.900000000000000000e+02 1.446455796242149261e-01 +6.910000000000000000e+02 1.443812432653953093e-01 +6.920000000000000000e+02 1.441186232270041945e-01 +6.930000000000000000e+02 1.438577037884403720e-01 +6.940000000000000000e+02 1.435984694163715825e-01 +6.950000000000000000e+02 1.433409047619862153e-01 +6.960000000000000000e+02 1.430849946582856691e-01 +6.970000000000000000e+02 1.428307241174262832e-01 +6.980000000000000000e+02 1.425780783281141439e-01 +6.990000000000000000e+02 1.423270426530306443e-01 +7.000000000000000000e+02 1.420776026263178560e-01 +7.010000000000000000e+02 1.418297439510987079e-01 +7.020000000000000000e+02 1.415834524970389086e-01 +7.030000000000000000e+02 1.413387142979579958e-01 +7.040000000000000000e+02 1.410955155494731383e-01 +7.050000000000000000e+02 1.408538426066892890e-01 +7.060000000000000000e+02 1.406136819819222561e-01 +7.070000000000000000e+02 1.403750203424682375e-01 +7.080000000000000000e+02 1.401378445084048019e-01 +7.090000000000000000e+02 1.399021414504308669e-01 +7.100000000000000000e+02 1.396678982877458952e-01 +7.110000000000000000e+02 1.394351022859569855e-01 +7.120000000000000000e+02 1.392037408550322874e-01 +7.130000000000000000e+02 1.389738015472771759e-01 +7.140000000000000000e+02 1.387452720553528640e-01 +7.150000000000000000e+02 1.385181402103203563e-01 +7.160000000000000000e+02 1.382923939797251200e-01 +7.170000000000000000e+02 1.380680214657072358e-01 +7.180000000000000000e+02 1.378450109031419957e-01 +7.190000000000000000e+02 1.376233506578171950e-01 +7.200000000000000000e+02 1.374030292246330165e-01 +7.210000000000000000e+02 1.371840352258389684e-01 +7.220000000000000000e+02 1.369663574092904734e-01 +7.230000000000000000e+02 1.367499846467421509e-01 +7.240000000000000000e+02 1.365349059321644964e-01 +7.250000000000000000e+02 1.363211103800867352e-01 +7.260000000000000000e+02 1.361085872239716776e-01 +7.270000000000000000e+02 1.358973258146107255e-01 +7.280000000000000000e+02 1.356873156185454399e-01 +7.290000000000000000e+02 1.354785462165191412e-01 +7.300000000000000000e+02 1.352710073019500470e-01 +7.310000000000000000e+02 1.350646886794264756e-01 +7.320000000000000000e+02 1.348595802632291674e-01 +7.330000000000000000e+02 1.346556720758768644e-01 +7.340000000000000000e+02 1.344529542466919025e-01 +7.350000000000000000e+02 1.342514170103931148e-01 +7.360000000000000000e+02 1.340510507057060263e-01 +7.370000000000000000e+02 1.338518457739976686e-01 +7.380000000000000000e+02 1.336537927579313778e-01 +7.390000000000000000e+02 1.334568823001454352e-01 +7.400000000000000000e+02 1.332611051419475001e-01 +7.410000000000000000e+02 1.330664521220330521e-01 +7.420000000000000000e+02 1.328729141752216514e-01 +7.430000000000000000e+02 1.326804823312139614e-01 +7.440000000000000000e+02 1.324891477133673112e-01 +7.450000000000000000e+02 1.322989015374920752e-01 +7.460000000000000000e+02 1.321097351106583495e-01 +7.470000000000000000e+02 1.319216398300366300e-01 +7.480000000000000000e+02 1.317346071817368236e-01 +7.490000000000000000e+02 1.315486287396825937e-01 +7.500000000000000000e+02 1.313636961644892853e-01 +7.510000000000000000e+02 1.311798012023666360e-01 +7.520000000000000000e+02 1.309969356840380017e-01 +7.530000000000000000e+02 1.308150915236682699e-01 +7.540000000000000000e+02 1.306342607178183901e-01 +7.550000000000000000e+02 1.304544353444075100e-01 +7.560000000000000000e+02 1.302756075616954834e-01 +7.570000000000000000e+02 1.300977696072762868e-01 +7.580000000000000000e+02 1.299209137970908645e-01 +7.590000000000000000e+02 1.297450325244504654e-01 +7.600000000000000000e+02 1.295701182590793532e-01 +7.610000000000000000e+02 1.293961635461650939e-01 +7.620000000000000000e+02 1.292231610054299651e-01 +7.630000000000000000e+02 1.290511033302104704e-01 +7.640000000000000000e+02 1.288799832865510919e-01 +7.650000000000000000e+02 1.287097937123174718e-01 +7.660000000000000000e+02 1.285405275163115646e-01 +7.670000000000000000e+02 1.283721776774102985e-01 +7.680000000000000000e+02 1.282047372437107036e-01 +7.690000000000000000e+02 1.280381993316879186e-01 +7.700000000000000000e+02 1.278725571253688242e-01 +7.710000000000000000e+02 1.277078038755122547e-01 +7.720000000000000000e+02 1.275439328988054732e-01 +7.730000000000000000e+02 1.273809375770720564e-01 +7.740000000000000000e+02 1.272188113564852174e-01 +7.750000000000000000e+02 1.270575477468026127e-01 +7.760000000000000000e+02 1.268971403206005655e-01 +7.770000000000000000e+02 1.267375827125301058e-01 +7.780000000000000000e+02 1.265788686185743694e-01 +7.790000000000000000e+02 1.264209917953211526e-01 +7.800000000000000000e+02 1.262639460592484830e-01 +7.810000000000000000e+02 1.261077252860119124e-01 +7.820000000000000000e+02 1.259523234097486566e-01 +7.830000000000000000e+02 1.257977344223920324e-01 +7.840000000000000000e+02 1.256439523729893926e-01 +7.850000000000000000e+02 1.254909713670352700e-01 +7.860000000000000000e+02 1.253387855658114891e-01 +7.870000000000000000e+02 1.251873891857347154e-01 +7.880000000000000000e+02 1.250367764977200480e-01 +7.890000000000000000e+02 1.248869418265423359e-01 +7.900000000000000000e+02 1.247378795502165627e-01 +7.910000000000000000e+02 1.245895840993819365e-01 +7.920000000000000000e+02 1.244420499566942090e-01 +7.930000000000000000e+02 1.242952716562259613e-01 +7.940000000000000000e+02 1.241492437828803086e-01 +7.950000000000000000e+02 1.240039609718049246e-01 +7.960000000000000000e+02 1.238594179078202906e-01 +7.970000000000000000e+02 1.237156093248517608e-01 +7.980000000000000000e+02 1.235725300053710229e-01 +7.990000000000000000e+02 1.234301747798454418e-01 +8.000000000000000000e+02 1.232885385261939526e-01 +8.010000000000000000e+02 1.231476161692508092e-01 +8.020000000000000000e+02 1.230074026802350229e-01 +8.030000000000000000e+02 1.228678930762312493e-01 +8.040000000000000000e+02 1.227290824196717867e-01 +8.050000000000000000e+02 1.225909658178292172e-01 +8.060000000000000000e+02 1.224535384223158357e-01 +8.070000000000000000e+02 1.223167954285864500e-01 +8.080000000000000000e+02 1.221807320754543513e-01 +8.090000000000000000e+02 1.220453436446048839e-01 +8.100000000000000000e+02 1.219106254601221018e-01 +8.110000000000000000e+02 1.217765728880213644e-01 +8.120000000000000000e+02 1.216431813357826131e-01 +8.130000000000000000e+02 1.215104462518972472e-01 +8.140000000000000000e+02 1.213783631254127249e-01 +8.150000000000000000e+02 1.212469274854940937e-01 +8.160000000000000000e+02 1.211161349009783755e-01 +8.170000000000000000e+02 1.209859809799447711e-01 +8.180000000000000000e+02 1.208564613692843792e-01 +8.190000000000000000e+02 1.207275717542811572e-01 +8.200000000000000000e+02 1.205993078581916039e-01 +8.210000000000000000e+02 1.204716654418368504e-01 +8.220000000000000000e+02 1.203446403031917661e-01 +8.230000000000000000e+02 1.202182282769889698e-01 +8.240000000000000000e+02 1.200924252343202325e-01 +8.250000000000000000e+02 1.199672270822458447e-01 +8.260000000000000000e+02 1.198426297634096749e-01 +8.270000000000000000e+02 1.197186292556593340e-01 +8.280000000000000000e+02 1.195952215716679506e-01 +8.290000000000000000e+02 1.194724027585634535e-01 +8.300000000000000000e+02 1.193501688975628638e-01 +8.310000000000000000e+02 1.192285161036113345e-01 +8.320000000000000000e+02 1.191074405250234086e-01 +8.330000000000000000e+02 1.189869383431292338e-01 +8.340000000000000000e+02 1.188670057719286438e-01 +8.350000000000000000e+02 1.187476390577470314e-01 +8.360000000000000000e+02 1.186288344788918869e-01 +8.370000000000000000e+02 1.185105883453243109e-01 +8.380000000000000000e+02 1.183928969983197715e-01 +8.390000000000000000e+02 1.182757568101472367e-01 +8.400000000000000000e+02 1.181591641837432677e-01 +8.410000000000000000e+02 1.180431155523922887e-01 +8.420000000000000000e+02 1.179276073794141844e-01 +8.430000000000000000e+02 1.178126361578502035e-01 +8.440000000000000000e+02 1.176981984101587025e-01 +8.450000000000000000e+02 1.175842906879083216e-01 +8.460000000000000000e+02 1.174709095714794732e-01 +8.470000000000000000e+02 1.173580516697685372e-01 +8.480000000000000000e+02 1.172457136198948729e-01 +8.490000000000000000e+02 1.171338920869120920e-01 +8.500000000000000000e+02 1.170225837635221894e-01 +8.510000000000000000e+02 1.169117853697922427e-01 +8.520000000000000000e+02 1.168014936528796455e-01 +8.530000000000000000e+02 1.166917053867518178e-01 +8.540000000000000000e+02 1.165824173719189477e-01 +8.550000000000000000e+02 1.164736264351621947e-01 +8.560000000000000000e+02 1.163653294292692486e-01 +8.570000000000000000e+02 1.162575232327723584e-01 +8.580000000000000000e+02 1.161502047496897339e-01 +8.590000000000000000e+02 1.160433709092682786e-01 +8.600000000000000000e+02 1.159370186657307233e-01 +8.610000000000000000e+02 1.158311449980273383e-01 +8.620000000000000000e+02 1.157257469095881036e-01 +8.630000000000000000e+02 1.156208214280777524e-01 +8.640000000000000000e+02 1.155163656051554077e-01 +8.650000000000000000e+02 1.154123765190639694e-01 +8.660000000000000000e+02 1.153088512630748436e-01 +8.670000000000000000e+02 1.152057869622507003e-01 +8.680000000000000000e+02 1.151031807618744379e-01 +8.690000000000000000e+02 1.150010298300601086e-01 +8.700000000000000000e+02 1.148993313575267239e-01 +8.710000000000000000e+02 1.147980825573793051e-01 +8.720000000000000000e+02 1.146972806648860199e-01 +8.730000000000000000e+02 1.145969229372656856e-01 +8.740000000000000000e+02 1.144970066534688052e-01 +8.750000000000000000e+02 1.143975291112577647e-01 +8.760000000000000000e+02 1.142984876378518588e-01 +8.770000000000000000e+02 1.141998795734209676e-01 +8.780000000000000000e+02 1.141017022817588239e-01 +8.790000000000000000e+02 1.140039531473567985e-01 +8.800000000000000000e+02 1.139066295752069607e-01 +8.810000000000000000e+02 1.138097289906028348e-01 +8.820000000000000000e+02 1.137132488389436674e-01 +8.830000000000000000e+02 1.136171865855429841e-01 +8.840000000000000000e+02 1.135215397154349798e-01 +8.850000000000000000e+02 1.134263057331900415e-01 +8.860000000000000000e+02 1.133314821627231100e-01 +8.870000000000000000e+02 1.132370665471139487e-01 +8.880000000000000000e+02 1.131430564484220691e-01 +8.890000000000000000e+02 1.130494494475066530e-01 +8.900000000000000000e+02 1.129562431438497910e-01 +8.910000000000000000e+02 1.128634351553777365e-01 +8.920000000000000000e+02 1.127710231182890571e-01 +8.930000000000000000e+02 1.126790046868823558e-01 +8.940000000000000000e+02 1.125873775333833121e-01 +8.950000000000000000e+02 1.124961393477777044e-01 +8.960000000000000000e+02 1.124052878376476799e-01 +8.970000000000000000e+02 1.123148207280011135e-01 +8.980000000000000000e+02 1.122247357611138863e-01 +8.990000000000000000e+02 1.121350306963663362e-01 +9.000000000000000000e+02 1.120457033100843575e-01 +9.010000000000000000e+02 1.119567513953821786e-01 +9.020000000000000000e+02 1.118681727620066818e-01 +9.030000000000000000e+02 1.117799652361824297e-01 +9.040000000000000000e+02 1.116921266604606888e-01 +9.050000000000000000e+02 1.116046548935675092e-01 +9.060000000000000000e+02 1.115175478102545109e-01 +9.070000000000000000e+02 1.114308033011527782e-01 +9.080000000000000000e+02 1.113444192726263104e-01 +9.090000000000000000e+02 1.112583936466275264e-01 +9.100000000000000000e+02 1.111727243605556553e-01 +9.110000000000000000e+02 1.110874093671137819e-01 +9.120000000000000000e+02 1.110024466341708316e-01 +9.130000000000000000e+02 1.109178341446235977e-01 +9.140000000000000000e+02 1.108335698962584909e-01 +9.150000000000000000e+02 1.107496519016191172e-01 +9.160000000000000000e+02 1.106660781878698319e-01 +9.170000000000000000e+02 1.105828467966657458e-01 +9.180000000000000000e+02 1.104999557840209007e-01 +9.190000000000000000e+02 1.104174032201786920e-01 +9.200000000000000000e+02 1.103351871894839020e-01 +9.210000000000000000e+02 1.102533057902584657e-01 +9.220000000000000000e+02 1.101717571346719354e-01 +9.230000000000000000e+02 1.100905393486206613e-01 +9.240000000000000000e+02 1.100096505716040840e-01 +9.250000000000000000e+02 1.099290889566041929e-01 +9.260000000000000000e+02 1.098488526699644974e-01 +9.270000000000000000e+02 1.097689398912720243e-01 +9.280000000000000000e+02 1.096893488132392597e-01 +9.290000000000000000e+02 1.096100776415877831e-01 +9.300000000000000000e+02 1.095311245949342899e-01 +9.310000000000000000e+02 1.094524879046762239e-01 +9.320000000000000000e+02 1.093741658148773138e-01 +9.330000000000000000e+02 1.092961565821597286e-01 +9.340000000000000000e+02 1.092184584755904742e-01 +9.350000000000000000e+02 1.091410697765749366e-01 +9.360000000000000000e+02 1.090639887787455964e-01 +9.370000000000000000e+02 1.089872137878586250e-01 +9.380000000000000000e+02 1.089107431216855965e-01 +9.390000000000000000e+02 1.088345751099099173e-01 +9.400000000000000000e+02 1.087587080940246032e-01 +9.410000000000000000e+02 1.086831404272250029e-01 +9.420000000000000000e+02 1.086078704743134171e-01 +9.430000000000000000e+02 1.085328966115946953e-01 +9.440000000000000000e+02 1.084582172267784250e-01 +9.450000000000000000e+02 1.083838307188786793e-01 +9.460000000000000000e+02 1.083097354981193278e-01 +9.470000000000000000e+02 1.082359299858364071e-01 +9.480000000000000000e+02 1.081624126143817394e-01 +9.490000000000000000e+02 1.080891818270307420e-01 +9.500000000000000000e+02 1.080162360778867542e-01 +9.510000000000000000e+02 1.079435738317899574e-01 +9.520000000000000000e+02 1.078711935642250597e-01 +9.530000000000000000e+02 1.077990937612315625e-01 +9.540000000000000000e+02 1.077272729193125556e-01 +9.550000000000000000e+02 1.076557295453476337e-01 +9.560000000000000000e+02 1.075844621565031217e-01 +9.570000000000000000e+02 1.075134692801473502e-01 +9.580000000000000000e+02 1.074427494537623234e-01 +9.590000000000000000e+02 1.073723012248589820e-01 +9.600000000000000000e+02 1.073021231508945322e-01 +9.610000000000000000e+02 1.072322137991859187e-01 +9.620000000000000000e+02 1.071625717468284444e-01 +9.630000000000000000e+02 1.070931955806155161e-01 +9.640000000000000000e+02 1.070240838969546970e-01 +9.650000000000000000e+02 1.069552353017884511e-01 +9.660000000000000000e+02 1.068866484105159831e-01 +9.670000000000000000e+02 1.068183218479119290e-01 +9.680000000000000000e+02 1.067502542480503469e-01 +9.690000000000000000e+02 1.066824442542275569e-01 +9.700000000000000000e+02 1.066148905188842033e-01 +9.710000000000000000e+02 1.065475917035315218e-01 +9.720000000000000000e+02 1.064805464786740541e-01 +9.730000000000000000e+02 1.064137535237385385e-01 +9.740000000000000000e+02 1.063472115269971374e-01 +9.750000000000000000e+02 1.062809191854974522e-01 +9.760000000000000000e+02 1.062148752049877493e-01 +9.770000000000000000e+02 1.061490782998490701e-01 +9.780000000000000000e+02 1.060835271930218177e-01 +9.790000000000000000e+02 1.060182206159362012e-01 +9.800000000000000000e+02 1.059531573084446648e-01 +9.810000000000000000e+02 1.058883360187504313e-01 +9.820000000000000000e+02 1.058237555033426230e-01 +9.830000000000000000e+02 1.057594145269267483e-01 +9.840000000000000000e+02 1.056953118623597948e-01 +9.850000000000000000e+02 1.056314462905811602e-01 +9.860000000000000000e+02 1.055678166005525470e-01 +9.870000000000000000e+02 1.055044215891875609e-01 +9.880000000000000000e+02 1.054412600612911616e-01 +9.890000000000000000e+02 1.053783308294948540e-01 +9.900000000000000000e+02 1.053156327141946957e-01 +9.910000000000000000e+02 1.052531645434879454e-01 +9.920000000000000000e+02 1.051909251531117362e-01 +9.930000000000000000e+02 1.051289133863819170e-01 +9.940000000000000000e+02 1.050671280941335023e-01 +9.950000000000000000e+02 1.050055681346592079e-01 +9.960000000000000000e+02 1.049442323736501925e-01 +9.970000000000000000e+02 1.048831196841388536e-01 +9.980000000000000000e+02 1.048222289464388335e-01 +9.990000000000000000e+02 1.047615590480883013e-01 +1.000000000000000000e+03 1.047011088837912635e-01 +1.001000000000000000e+03 1.046408773553645644e-01 +1.002000000000000000e+03 1.045808633716757835e-01 +1.003000000000000000e+03 1.045210658485939970e-01 +1.004000000000000000e+03 1.044614837089305054e-01 +1.005000000000000000e+03 1.044021158823859041e-01 +1.006000000000000000e+03 1.043429613054957100e-01 +1.007000000000000000e+03 1.042840189215769597e-01 +1.008000000000000000e+03 1.042252876806749745e-01 +1.009000000000000000e+03 1.041667665395101389e-01 +1.010000000000000000e+03 1.041084544614278573e-01 +1.011000000000000000e+03 1.040503504163457910e-01 +1.012000000000000000e+03 1.039924533807007057e-01 +1.013000000000000000e+03 1.039347623374024393e-01 +1.014000000000000000e+03 1.038772762757792512e-01 +1.015000000000000000e+03 1.038199941915297769e-01 +1.016000000000000000e+03 1.037629150866763994e-01 +1.017000000000000000e+03 1.037060379695105838e-01 +1.018000000000000000e+03 1.036493618545506062e-01 +1.019000000000000000e+03 1.035928857624903304e-01 +1.020000000000000000e+03 1.035366087201513852e-01 +1.021000000000000000e+03 1.034805297604388941e-01 +1.022000000000000000e+03 1.034246479222913767e-01 +1.023000000000000000e+03 1.033689622506376027e-01 +1.024000000000000000e+03 1.033134717963493238e-01 +1.025000000000000000e+03 1.032581756161953107e-01 +1.026000000000000000e+03 1.032030727727980546e-01 +1.027000000000000000e+03 1.031481623345881088e-01 +1.028000000000000000e+03 1.030934433757606239e-01 +1.029000000000000000e+03 1.030389149762310774e-01 +1.030000000000000000e+03 1.029845762215917393e-01 +1.031000000000000000e+03 1.029304262030692890e-01 +1.032000000000000000e+03 1.028764640174829326e-01 +1.033000000000000000e+03 1.028226887671999518e-01 +1.034000000000000000e+03 1.027690995600967772e-01 +1.035000000000000000e+03 1.027156955095145097e-01 +1.036000000000000000e+03 1.026624757342202710e-01 +1.037000000000000000e+03 1.026094393583663472e-01 +1.038000000000000000e+03 1.025565855114477232e-01 +1.039000000000000000e+03 1.025039133282645287e-01 +1.040000000000000000e+03 1.024514219488819045e-01 +1.041000000000000000e+03 1.023991105185886874e-01 +1.042000000000000000e+03 1.023469781878613150e-01 +1.043000000000000000e+03 1.022950241123237042e-01 +1.044000000000000000e+03 1.022432474527099205e-01 +1.045000000000000000e+03 1.021916473748243348e-01 +1.046000000000000000e+03 1.021402230495066232e-01 +1.047000000000000000e+03 1.020889736525931596e-01 +1.048000000000000000e+03 1.020378983648797117e-01 +1.049000000000000000e+03 1.019869963720854145e-01 +1.050000000000000000e+03 1.019362668648176734e-01 +1.051000000000000000e+03 1.018857090385330427e-01 +1.052000000000000000e+03 1.018353220935056258e-01 +1.053000000000000000e+03 1.017851052347886476e-01 +1.054000000000000000e+03 1.017350576721808841e-01 +1.055000000000000000e+03 1.016851786201908719e-01 +1.056000000000000000e+03 1.016354672980036983e-01 +1.057000000000000000e+03 1.015859229294466815e-01 +1.058000000000000000e+03 1.015365447429553009e-01 +1.059000000000000000e+03 1.014873319715386413e-01 +1.060000000000000000e+03 1.014382838527483482e-01 +1.061000000000000000e+03 1.013893996286432259e-01 +1.062000000000000000e+03 1.013406785457594550e-01 +1.063000000000000000e+03 1.012921198550748303e-01 +1.064000000000000000e+03 1.012437228119800470e-01 +1.065000000000000000e+03 1.011954866762433819e-01 +1.066000000000000000e+03 1.011474107119828131e-01 +1.067000000000000000e+03 1.010994941876316722e-01 +1.068000000000000000e+03 1.010517363759091680e-01 +1.069000000000000000e+03 1.010041365537898972e-01 +1.070000000000000000e+03 1.009566940024713977e-01 +1.071000000000000000e+03 1.009094080073463240e-01 +1.072000000000000000e+03 1.008622778579714996e-01 +1.073000000000000000e+03 1.008153028480373026e-01 +1.074000000000000000e+03 1.007684822753396048e-01 +1.075000000000000000e+03 1.007218154417496153e-01 +1.076000000000000000e+03 1.006753016531853756e-01 +1.077000000000000000e+03 1.006289402195831434e-01 +1.078000000000000000e+03 1.005827304548678608e-01 +1.079000000000000000e+03 1.005366716769261343e-01 +1.080000000000000000e+03 1.004907632075771329e-01 +1.081000000000000000e+03 1.004450043725472613e-01 +1.082000000000000000e+03 1.003993945014384631e-01 +1.083000000000000000e+03 1.003539329277049613e-01 +1.084000000000000000e+03 1.003086189886229079e-01 +1.085000000000000000e+03 1.002634520252660283e-01 +1.086000000000000000e+03 1.002184313824786566e-01 +1.087000000000000000e+03 1.001735564088459679e-01 +1.088000000000000000e+03 1.001288264566743968e-01 +1.089000000000000000e+03 1.000842408819575258e-01 +1.090000000000000000e+03 1.000397990443580853e-01 +1.091000000000000000e+03 9.999550030717636873e-02 +1.092000000000000000e+03 9.995134403732905404e-02 +1.093000000000000000e+03 9.990732960532092144e-02 +1.094000000000000000e+03 9.986345638522189927e-02 +1.095000000000000000e+03 9.981972375464288894e-02 +1.096000000000000000e+03 9.977613109470875874e-02 +1.097000000000000000e+03 9.973267779003605615e-02 +1.098000000000000000e+03 9.968936322870819433e-02 +1.099000000000000000e+03 9.964618680225158232e-02 diff --git a/spectractor/extractor/dispersers/holo4_003/ratio_order_3over2.txt b/spectractor/extractor/dispersers/holo4_003/ratio_order_3over2.txt index dda2e3d92..de6d05742 100644 --- a/spectractor/extractor/dispersers/holo4_003/ratio_order_3over2.txt +++ b/spectractor/extractor/dispersers/holo4_003/ratio_order_3over2.txt @@ -1,800 +1,800 @@ -3.000000000000000000e+02 6.509725923171346018e+00 -3.010000000000000000e+02 1.156983590235709514e+01 -3.020000000000000000e+02 2.065892767125739837e+01 -3.030000000000000000e+02 3.266384599854518456e+01 -3.040000000000000000e+02 3.688427015932408182e+01 -3.050000000000000000e+02 2.955846253730900131e+01 -3.060000000000000000e+02 2.086079963948771621e+01 -3.070000000000000000e+02 1.483391093997127363e+01 -3.080000000000000000e+02 1.101253581269824622e+01 -3.090000000000000000e+02 8.543345874672958473e+00 -3.100000000000000000e+02 6.879515790464199476e+00 -3.110000000000000000e+02 5.709608451523049411e+00 -3.120000000000000000e+02 4.855338801222115030e+00 -3.130000000000000000e+02 4.211091270164593503e+00 -3.140000000000000000e+02 3.711767709806035320e+00 -3.150000000000000000e+02 3.315685161054438446e+00 -3.160000000000000000e+02 2.995214546596440375e+00 -3.170000000000000000e+02 2.731470209997443721e+00 -3.180000000000000000e+02 2.511187170917052569e+00 -3.190000000000000000e+02 2.324821673858040505e+00 -3.200000000000000000e+02 2.165359445266830996e+00 -3.210000000000000000e+02 2.027546656272186887e+00 -3.220000000000000000e+02 1.907380888083412884e+00 -3.230000000000000000e+02 1.801766370524660932e+00 -3.240000000000000000e+02 1.708275577335355067e+00 -3.250000000000000000e+02 1.624981230221655082e+00 -3.260000000000000000e+02 1.550335869337169825e+00 -3.270000000000000000e+02 1.483084159928695689e+00 -3.280000000000000000e+02 1.422198114662133195e+00 -3.290000000000000000e+02 1.366828609434258768e+00 -3.300000000000000000e+02 1.316268651832293690e+00 -3.310000000000000000e+02 1.269925240112287579e+00 -3.320000000000000000e+02 1.227297578953946422e+00 -3.330000000000000000e+02 1.187960052992033333e+00 -3.340000000000000000e+02 1.151548799291647995e+00 -3.350000000000000000e+02 1.117751029224237636e+00 -3.360000000000000000e+02 1.086296470221350230e+00 -3.370000000000000000e+02 1.056950456212043310e+00 -3.380000000000000000e+02 1.029508310721562347e+00 -3.390000000000000000e+02 1.003790751240222878e+00 -3.400000000000000000e+02 9.796401062565228690e-01 -3.410000000000000000e+02 9.569171833460039522e-01 -3.420000000000000000e+02 9.354986621867263930e-01 -3.430000000000000000e+02 9.152749133711250984e-01 -3.440000000000000000e+02 8.961481645859491474e-01 -3.450000000000000000e+02 8.780309517196009939e-01 -3.460000000000000000e+02 8.608448048873430514e-01 -3.470000000000000000e+02 8.445191290942747342e-01 -3.480000000000000000e+02 8.289902469153803688e-01 -3.490000000000000000e+02 8.142005766414438517e-01 -3.500000000000000000e+02 8.000979241709312850e-01 -3.510000000000000000e+02 7.866348707990169498e-01 -3.520000000000000000e+02 7.737682421688460987e-01 -3.530000000000000000e+02 7.614586461696587483e-01 -3.540000000000000000e+02 7.496700696129982022e-01 -3.550000000000000000e+02 7.383695251887274491e-01 -3.560000000000000000e+02 7.275267415721883291e-01 -3.570000000000000000e+02 7.171138906805679669e-01 -3.580000000000000000e+02 7.071053470080953529e-01 -3.590000000000000000e+02 6.974774747419761889e-01 -3.600000000000000000e+02 6.882084390034897137e-01 -3.610000000000000000e+02 6.792780380986728206e-01 -3.620000000000000000e+02 6.706675541072550928e-01 -3.630000000000000000e+02 6.623596195251194585e-01 -3.640000000000000000e+02 6.543380979885390358e-01 -3.650000000000000000e+02 6.465879773821993082e-01 -3.660000000000000000e+02 6.390952738614180673e-01 -3.670000000000000000e+02 6.318469455143372882e-01 -3.680000000000000000e+02 6.248308145566628946e-01 -3.690000000000000000e+02 6.180354970939593295e-01 -3.700000000000000000e+02 6.114503396089747689e-01 -3.710000000000000000e+02 6.050653614366442445e-01 -3.720000000000000000e+02 5.988712025800647654e-01 -3.730000000000000000e+02 5.928590762992315133e-01 -3.740000000000000000e+02 5.870207259720922055e-01 -3.750000000000000000e+02 5.813483857864492066e-01 -3.760000000000000000e+02 5.758347448724864259e-01 -3.770000000000000000e+02 5.704729145303520932e-01 -3.780000000000000000e+02 5.652563982462379677e-01 -3.790000000000000000e+02 5.601790642245236818e-01 -3.800000000000000000e+02 5.552351201935545877e-01 -3.810000000000000000e+02 5.504190902687762232e-01 -3.820000000000000000e+02 5.457257936802333287e-01 -3.830000000000000000e+02 5.411503251916882640e-01 -3.840000000000000000e+02 5.366880370567861380e-01 -3.850000000000000000e+02 5.323345223733942921e-01 -3.860000000000000000e+02 5.280855997116135070e-01 -3.870000000000000000e+02 5.239372989032440309e-01 -3.880000000000000000e+02 5.198858478917152137e-01 -3.890000000000000000e+02 5.159276605514671044e-01 -3.900000000000000000e+02 5.120593253943732659e-01 -3.910000000000000000e+02 5.082775950889130145e-01 -3.920000000000000000e+02 5.045793767246775641e-01 -3.930000000000000000e+02 5.009617227611485868e-01 -3.940000000000000000e+02 4.974218226053315761e-01 -3.950000000000000000e+02 4.939569947679042228e-01 -3.960000000000000000e+02 4.905646795520252623e-01 -3.970000000000000000e+02 4.872424322331894153e-01 -3.980000000000000000e+02 4.839879166919889286e-01 -3.990000000000000000e+02 4.807988994651667958e-01 -4.000000000000000000e+02 4.776732441832539644e-01 -4.010000000000000000e+02 4.746089063657677465e-01 -4.020000000000000000e+02 4.716039285475141507e-01 -4.030000000000000000e+02 4.686564357116038138e-01 -4.040000000000000000e+02 4.657646310069922246e-01 -4.050000000000000000e+02 4.629267917299948465e-01 -4.060000000000000000e+02 4.601412655510689342e-01 -4.070000000000000000e+02 4.574064669695095398e-01 -4.080000000000000000e+02 4.547208739802010569e-01 -4.090000000000000000e+02 4.520830249377760790e-01 -4.100000000000000000e+02 4.494915156046404570e-01 -4.110000000000000000e+02 4.469449963704413276e-01 -4.120000000000000000e+02 4.444421696314884707e-01 -4.130000000000000000e+02 4.419817873194388791e-01 -4.140000000000000000e+02 4.395626485694713037e-01 -4.150000000000000000e+02 4.371835975188317347e-01 -4.160000000000000000e+02 4.348435212273337735e-01 -4.170000000000000000e+02 4.325413477119841033e-01 -4.180000000000000000e+02 4.302760440884981774e-01 -4.190000000000000000e+02 4.280466148130216975e-01 -4.200000000000000000e+02 4.258521000177492022e-01 -4.210000000000000000e+02 4.236915739346737708e-01 -4.220000000000000000e+02 4.215641434020956368e-01 -4.230000000000000000e+02 4.194689464488028929e-01 -4.240000000000000000e+02 4.174051509513057034e-01 -4.250000000000000000e+02 4.153719533597377556e-01 -4.260000000000000000e+02 4.133685774883759656e-01 -4.270000000000000000e+02 4.113942733669674334e-01 -4.280000000000000000e+02 4.094483161493540080e-01 -4.290000000000000000e+02 4.075300050760630177e-01 -4.300000000000000000e+02 4.056386624877854619e-01 -4.310000000000000000e+02 4.013912009558592842e-01 -4.320000000000000000e+02 3.971192247879613002e-01 -4.330000000000000000e+02 3.929431662759431121e-01 -4.340000000000000000e+02 3.887877778006299523e-01 -4.350000000000000000e+02 3.847991905271044843e-01 -4.360000000000000000e+02 3.808899497092754771e-01 -4.370000000000000000e+02 3.770321205610598914e-01 -4.380000000000000000e+02 3.732521381443776876e-01 -4.390000000000000000e+02 3.694158397025473217e-01 -4.400000000000000000e+02 3.656361642969984116e-01 -4.410000000000000000e+02 3.637041215579885356e-01 -4.420000000000000000e+02 3.618050021278039763e-01 -4.430000000000000000e+02 3.599573466274055278e-01 -4.440000000000000000e+02 3.581622953562234035e-01 -4.450000000000000000e+02 3.563475298726105911e-01 -4.460000000000000000e+02 3.546131012783114156e-01 -4.470000000000000000e+02 3.529171425161061748e-01 -4.480000000000000000e+02 3.511600645287158429e-01 -4.490000000000000000e+02 3.495001340366898912e-01 -4.500000000000000000e+02 3.478342642145098584e-01 -4.510000000000000000e+02 3.464230590325684256e-01 -4.520000000000000000e+02 3.448679466138410143e-01 -4.530000000000000000e+02 3.432877541094727092e-01 -4.540000000000000000e+02 3.419279637498306990e-01 -4.550000000000000000e+02 3.403899632567217726e-01 -4.560000000000000000e+02 3.388281057218366921e-01 -4.570000000000000000e+02 3.374509332583289223e-01 -4.580000000000000000e+02 3.360451544967197890e-01 -4.590000000000000000e+02 3.346336262677152562e-01 -4.600000000000000000e+02 3.331518803143234675e-01 -4.610000000000000000e+02 3.322999523736291372e-01 -4.620000000000000000e+02 3.314413399858454623e-01 -4.630000000000000000e+02 3.305725970739325503e-01 -4.640000000000000000e+02 3.297325016120075669e-01 -4.650000000000000000e+02 3.288405527362059932e-01 -4.660000000000000000e+02 3.280349124410171235e-01 -4.670000000000000000e+02 3.272181645157655749e-01 -4.680000000000000000e+02 3.264107816982220744e-01 -4.690000000000000000e+02 3.256138361259974801e-01 -4.700000000000000000e+02 3.248861836773703771e-01 -4.710000000000000000e+02 3.236703958241508583e-01 -4.720000000000000000e+02 3.224004875302849960e-01 -4.730000000000000000e+02 3.212142588947224375e-01 -4.740000000000000000e+02 3.201511185091803768e-01 -4.750000000000000000e+02 3.189554620501165449e-01 -4.760000000000000000e+02 3.178098233543905082e-01 -4.770000000000000000e+02 3.167221172560253373e-01 -4.780000000000000000e+02 3.157016581654958909e-01 -4.790000000000000000e+02 3.145593782471240440e-01 -4.800000000000000000e+02 3.134509493041701123e-01 -4.810000000000000000e+02 3.121425769791167926e-01 -4.820000000000000000e+02 3.108784129001939678e-01 -4.830000000000000000e+02 3.096797605619626692e-01 -4.840000000000000000e+02 3.085392244289119623e-01 -4.850000000000000000e+02 3.074820466880909264e-01 -4.860000000000000000e+02 3.064652653738632604e-01 -4.870000000000000000e+02 3.053357684427669416e-01 -4.880000000000000000e+02 3.043780287842099974e-01 -4.890000000000000000e+02 3.033467242744036785e-01 -4.900000000000000000e+02 3.023931681866862675e-01 -4.910000000000000000e+02 3.014207182671409524e-01 -4.920000000000000000e+02 3.004620052485332260e-01 -4.930000000000000000e+02 2.995395110481065548e-01 -4.940000000000000000e+02 2.986801932647105695e-01 -4.950000000000000000e+02 2.978709237690262412e-01 -4.960000000000000000e+02 2.970468427189997818e-01 -4.970000000000000000e+02 2.963053479931697654e-01 -4.980000000000000000e+02 2.955473664731924632e-01 -4.990000000000000000e+02 2.947567652016332418e-01 -5.000000000000000000e+02 2.941277613234809518e-01 -5.010000000000000000e+02 2.934817548728843040e-01 -5.020000000000000000e+02 2.928781479379820585e-01 -5.030000000000000000e+02 2.922706048624220676e-01 -5.040000000000000000e+02 2.916459244383286520e-01 -5.050000000000000000e+02 2.912236565535889499e-01 -5.060000000000000000e+02 2.907475290896360254e-01 -5.070000000000000000e+02 2.902677375099961266e-01 -5.080000000000000000e+02 2.897676634669539841e-01 -5.090000000000000000e+02 2.893731430640880120e-01 -5.100000000000000000e+02 2.889589445163627812e-01 -5.110000000000000000e+02 2.881700181111551684e-01 -5.120000000000000000e+02 2.873480520316719078e-01 -5.130000000000000000e+02 2.865151935771834135e-01 -5.140000000000000000e+02 2.856811667792410470e-01 -5.150000000000000000e+02 2.849473062224541775e-01 -5.160000000000000000e+02 2.840788906049899754e-01 -5.170000000000000000e+02 2.833928994179065741e-01 -5.180000000000000000e+02 2.827039766186793535e-01 -5.190000000000000000e+02 2.819754817033529593e-01 -5.200000000000000000e+02 2.812482993192523262e-01 -5.210000000000000000e+02 2.809187193137456240e-01 -5.220000000000000000e+02 2.806119449158293033e-01 -5.230000000000000000e+02 2.803365836900778563e-01 -5.240000000000000000e+02 2.800123081838547523e-01 -5.250000000000000000e+02 2.797458103743233893e-01 -5.260000000000000000e+02 2.795503012147202426e-01 -5.270000000000000000e+02 2.793651617083823813e-01 -5.280000000000000000e+02 2.791742447571493035e-01 -5.290000000000000000e+02 2.790152870372823446e-01 -5.300000000000000000e+02 2.787765316151872286e-01 -5.310000000000000000e+02 2.782614025891858578e-01 -5.320000000000000000e+02 2.777553322218797582e-01 -5.330000000000000000e+02 2.772724584393295721e-01 -5.340000000000000000e+02 2.767805116406394927e-01 -5.350000000000000000e+02 2.763191815102425952e-01 -5.360000000000000000e+02 2.758573178654324942e-01 -5.370000000000000000e+02 2.754049108370179577e-01 -5.380000000000000000e+02 2.749522072559143493e-01 -5.390000000000000000e+02 2.745113907245025353e-01 -5.400000000000000000e+02 2.740557320472344904e-01 -5.410000000000000000e+02 2.738357205008694062e-01 -5.420000000000000000e+02 2.736625084758002036e-01 -5.430000000000000000e+02 2.734110728475184771e-01 -5.440000000000000000e+02 2.731982861589927758e-01 -5.450000000000000000e+02 2.729718221333193306e-01 -5.460000000000000000e+02 2.728511995680704683e-01 -5.470000000000000000e+02 2.726255409409779062e-01 -5.480000000000000000e+02 2.725091758002506914e-01 -5.490000000000000000e+02 2.723876843379202661e-01 -5.500000000000000000e+02 2.722399028653252340e-01 -5.510000000000000000e+02 2.715911952691412168e-01 -5.520000000000000000e+02 2.709460720857740923e-01 -5.530000000000000000e+02 2.703044947435113143e-01 -5.540000000000000000e+02 2.696664253031139102e-01 -5.550000000000000000e+02 2.690318264447055796e-01 -5.560000000000000000e+02 2.684006614549652170e-01 -5.570000000000000000e+02 2.677728942146391788e-01 -5.580000000000000000e+02 2.671484891863595834e-01 -5.590000000000000000e+02 2.665274114027597063e-01 -5.600000000000000000e+02 2.659096264548642674e-01 -5.610000000000000000e+02 2.652951004807700963e-01 -5.620000000000000000e+02 2.646838001546008567e-01 -5.630000000000000000e+02 2.640756926757049650e-01 -5.640000000000000000e+02 2.634707457581375589e-01 -5.650000000000000000e+02 2.628689276203737268e-01 -5.660000000000000000e+02 2.622702069752671505e-01 -5.670000000000000000e+02 2.616745530202487235e-01 -5.680000000000000000e+02 2.610819354277570947e-01 -5.690000000000000000e+02 2.604923243358777674e-01 -5.700000000000000000e+02 2.599056903392269469e-01 -5.710000000000000000e+02 2.593220044800134683e-01 -5.720000000000000000e+02 2.587412382393369792e-01 -5.730000000000000000e+02 2.581633635286694761e-01 -5.740000000000000000e+02 2.575883526815297420e-01 -5.750000000000000000e+02 2.570161784453716680e-01 -5.760000000000000000e+02 2.564468139736207908e-01 -5.770000000000000000e+02 2.558802328179256569e-01 -5.780000000000000000e+02 2.553164089205607334e-01 -5.790000000000000000e+02 2.547553166070181674e-01 -5.800000000000000000e+02 2.541969305787496469e-01 -5.810000000000000000e+02 2.536412259060807917e-01 -5.820000000000000000e+02 2.530881780567449391e-01 -5.830000000000000000e+02 2.525377627468738395e-01 -5.840000000000000000e+02 2.519899561483122663e-01 -5.850000000000000000e+02 2.514447347391092213e-01 -5.860000000000000000e+02 2.509020753330470366e-01 -5.870000000000000000e+02 2.503619550399095450e-01 -5.880000000000000000e+02 2.498243513939016058e-01 -5.890000000000000000e+02 2.492892421454347696e-01 -5.900000000000000000e+02 2.487566053905642949e-01 -5.910000000000000000e+02 2.482264195314022592e-01 -5.920000000000000000e+02 2.476986632705741043e-01 -5.930000000000000000e+02 2.471733156057744074e-01 -5.940000000000000000e+02 2.466503558244548810e-01 -5.950000000000000000e+02 2.461297634986228111e-01 -5.960000000000000000e+02 2.456115184797426632e-01 -5.970000000000000000e+02 2.450956008937515973e-01 -5.980000000000000000e+02 2.445819911361842014e-01 -5.990000000000000000e+02 2.440706698673940078e-01 -6.000000000000000000e+02 2.435616180078764292e-01 -6.010000000000000000e+02 2.430548167336908649e-01 -6.020000000000000000e+02 2.425502474719749280e-01 -6.030000000000000000e+02 2.420478918965666137e-01 -6.040000000000000000e+02 2.415477319236925824e-01 -6.050000000000000000e+02 2.410497497077650209e-01 -6.060000000000000000e+02 2.405539276372625490e-01 -6.070000000000000000e+02 2.400602483306865376e-01 -6.080000000000000000e+02 2.395686946326125166e-01 -6.090000000000000000e+02 2.390792496098067821e-01 -6.100000000000000000e+02 2.385918965474450038e-01 -6.110000000000000000e+02 2.381066189453825144e-01 -6.120000000000000000e+02 2.376234005145202166e-01 -6.130000000000000000e+02 2.371422251732272779e-01 -6.140000000000000000e+02 2.366630770438537534e-01 -6.150000000000000000e+02 2.361859404492911152e-01 -6.160000000000000000e+02 2.357107999096284823e-01 -6.170000000000000000e+02 2.352376401388481530e-01 -6.180000000000000000e+02 2.347664460416065690e-01 -6.190000000000000000e+02 2.342972027100732046e-01 -6.200000000000000000e+02 2.338298954208279934e-01 -6.210000000000000000e+02 2.333645096318186229e-01 -6.220000000000000000e+02 2.329010309793958511e-01 -6.230000000000000000e+02 2.324394452753779650e-01 -6.240000000000000000e+02 2.319797385041930393e-01 -6.250000000000000000e+02 2.315218968200772609e-01 -6.260000000000000000e+02 2.310659065443141091e-01 -6.270000000000000000e+02 2.306117541625375411e-01 -6.280000000000000000e+02 2.301594263220834435e-01 -6.290000000000000000e+02 2.297089098293993159e-01 -6.300000000000000000e+02 2.292601916474861501e-01 -6.310000000000000000e+02 2.288132588934114198e-01 -6.320000000000000000e+02 2.283680988358526565e-01 -6.330000000000000000e+02 2.279246988926959816e-01 -6.340000000000000000e+02 2.274830466286782149e-01 -6.350000000000000000e+02 2.270431297530706993e-01 -6.360000000000000000e+02 2.266049361174183041e-01 -6.370000000000000000e+02 2.261684537132997164e-01 -6.380000000000000000e+02 2.257336706701522644e-01 -6.390000000000000000e+02 2.253005752531235806e-01 -6.400000000000000000e+02 2.248691558609697549e-01 -6.410000000000000000e+02 2.244394010239880444e-01 -6.420000000000000000e+02 2.240112994019895776e-01 -6.430000000000000000e+02 2.235848397823104738e-01 -6.440000000000000000e+02 2.231600110778641233e-01 -6.450000000000000000e+02 2.227368023252197793e-01 -6.460000000000000000e+02 2.223152026827190930e-01 -6.470000000000000000e+02 2.218952014286380836e-01 -6.480000000000000000e+02 2.214767879593616262e-01 -6.490000000000000000e+02 2.210599517876132847e-01 -6.500000000000000000e+02 2.206446825407070711e-01 -6.510000000000000000e+02 2.202309699588207714e-01 -6.520000000000000000e+02 2.198188038933247268e-01 -6.530000000000000000e+02 2.194081743051159161e-01 -6.540000000000000000e+02 2.189990712630012493e-01 -6.550000000000000000e+02 2.185914849420922679e-01 -6.560000000000000000e+02 2.181854056222474192e-01 -6.570000000000000000e+02 2.177808236865258207e-01 -6.580000000000000000e+02 2.173777296196790776e-01 -6.590000000000000000e+02 2.169761140066586436e-01 -6.600000000000000000e+02 2.165759675311676735e-01 -6.610000000000000000e+02 2.161772809742177892e-01 -6.620000000000000000e+02 2.157800452127254520e-01 -6.630000000000000000e+02 2.153842512181299573e-01 -6.640000000000000000e+02 2.149898900550256398e-01 -6.650000000000000000e+02 2.145969528798400972e-01 -6.660000000000000000e+02 2.142054309395081124e-01 -6.670000000000000000e+02 2.138153155701894848e-01 -6.680000000000000000e+02 2.134265981959994340e-01 -6.690000000000000000e+02 2.130392703277668165e-01 -6.700000000000000000e+02 2.126533235618015827e-01 -6.710000000000000000e+02 2.122687495787007605e-01 -6.720000000000000000e+02 2.118855401421630702e-01 -6.730000000000000000e+02 2.115036870978229122e-01 -6.740000000000000000e+02 2.111231823721143319e-01 -6.750000000000000000e+02 2.107440179711427275e-01 -6.760000000000000000e+02 2.103661859795838140e-01 -6.770000000000000000e+02 2.099896785595972704e-01 -6.780000000000000000e+02 2.096144879497590652e-01 -6.790000000000000000e+02 2.092406064640178198e-01 -6.800000000000000000e+02 2.088680264906531692e-01 -6.810000000000000000e+02 2.084967404912727307e-01 -6.820000000000000000e+02 2.081267409998037721e-01 -6.830000000000000000e+02 2.077580206215242642e-01 -6.840000000000000000e+02 2.073905720320884938e-01 -6.850000000000000000e+02 2.070243879765835127e-01 -6.860000000000000000e+02 2.066594612685986321e-01 -6.870000000000000000e+02 2.062957847893023000e-01 -6.880000000000000000e+02 2.059333514865440695e-01 -6.890000000000000000e+02 2.055721543739636448e-01 -6.900000000000000000e+02 2.052121865301247128e-01 -6.910000000000000000e+02 2.048534410976490527e-01 -6.920000000000000000e+02 2.044959112823747094e-01 -6.930000000000000000e+02 2.041395903525253519e-01 -6.940000000000000000e+02 2.037844716378908461e-01 -6.950000000000000000e+02 2.034305485290265891e-01 -6.960000000000000000e+02 2.030778144764594784e-01 -6.970000000000000000e+02 2.027262629899092006e-01 -6.980000000000000000e+02 2.023758876375233162e-01 -6.990000000000000000e+02 2.020266820451206424e-01 -7.000000000000000000e+02 2.016786398954537873e-01 -7.010000000000000000e+02 2.013317549274782348e-01 -7.020000000000000000e+02 2.009860209356282568e-01 -7.030000000000000000e+02 2.006414317691171401e-01 -7.040000000000000000e+02 2.002979813312388280e-01 -7.050000000000000000e+02 1.999556635786803871e-01 -7.060000000000000000e+02 1.996144725208495729e-01 -7.070000000000000000e+02 1.992744022192144138e-01 -7.080000000000000000e+02 1.989354467866432108e-01 -7.090000000000000000e+02 1.985976003867695738e-01 -7.100000000000000000e+02 1.982608572333535712e-01 -7.110000000000000000e+02 1.979252115896589503e-01 -7.120000000000000000e+02 1.975906577678417098e-01 -7.130000000000000000e+02 1.972571901283477480e-01 -7.140000000000000000e+02 1.969248030793145365e-01 -7.150000000000000000e+02 1.965934910759837284e-01 -7.160000000000000000e+02 1.962632486266521481e-01 -7.170000000000000000e+02 1.959340702659196076e-01 -7.180000000000000000e+02 1.956059505935459353e-01 -7.190000000000000000e+02 1.952788842475245701e-01 -7.200000000000000000e+02 1.949528659101645856e-01 -7.210000000000000000e+02 1.946278903075495947e-01 -7.220000000000000000e+02 1.943039522090126980e-01 -7.230000000000000000e+02 1.939810464266206180e-01 -7.240000000000000000e+02 1.936591678146649953e-01 -7.250000000000000000e+02 1.933383112691586525e-01 -7.260000000000000000e+02 1.930184717273383255e-01 -7.270000000000000000e+02 1.926996441671788018e-01 -7.280000000000000000e+02 1.923818236069127496e-01 -7.290000000000000000e+02 1.920650051045573736e-01 -7.300000000000000000e+02 1.917491837574481495e-01 -7.310000000000000000e+02 1.914343547017823277e-01 -7.320000000000000000e+02 1.911205131121570255e-01 -7.330000000000000000e+02 1.908076542011389876e-01 -7.340000000000000000e+02 1.904957732188080066e-01 -7.350000000000000000e+02 1.901848654523400350e-01 -7.360000000000000000e+02 1.898749262255676751e-01 -7.370000000000000000e+02 1.895659508985683972e-01 -7.380000000000000000e+02 1.892579348672460138e-01 -7.390000000000000000e+02 1.889508735629232272e-01 -7.400000000000000000e+02 1.886447624519428656e-01 -7.410000000000000000e+02 1.883395970352690352e-01 -7.420000000000000000e+02 1.880353728480916031e-01 -7.430000000000000000e+02 1.877320854594486943e-01 -7.440000000000000000e+02 1.874297304676837694e-01 -7.450000000000000000e+02 1.871283035167833897e-01 -7.460000000000000000e+02 1.868278002708305685e-01 -7.470000000000000000e+02 1.865282164305049062e-01 -7.480000000000000000e+02 1.862295477284785505e-01 -7.490000000000000000e+02 1.859317899290809373e-01 -7.500000000000000000e+02 1.856349388279329160e-01 -7.510000000000000000e+02 1.853389902516112964e-01 -7.520000000000000000e+02 1.850439400573179460e-01 -7.530000000000000000e+02 1.847497841325274892e-01 -7.540000000000000000e+02 1.844565183946765274e-01 -7.550000000000000000e+02 1.841641387908259930e-01 -7.560000000000000000e+02 1.838726412973519520e-01 -7.570000000000000000e+02 1.835820219196187264e-01 -7.580000000000000000e+02 1.832922766916768587e-01 -7.590000000000000000e+02 1.830034016759543858e-01 -7.600000000000000000e+02 1.827153929629482532e-01 -7.610000000000000000e+02 1.824282466709342965e-01 -7.620000000000000000e+02 1.821419589456655663e-01 -7.630000000000000000e+02 1.818565259600903039e-01 -7.640000000000000000e+02 1.815719439140544011e-01 -7.650000000000000000e+02 1.812882090340306451e-01 -7.660000000000000000e+02 1.810053175728312536e-01 -7.670000000000000000e+02 1.807232658093354816e-01 -7.680000000000000000e+02 1.804420500482230294e-01 -7.690000000000000000e+02 1.801616666197011218e-01 -7.700000000000000000e+02 1.798821118792424678e-01 -7.710000000000000000e+02 1.796033822073268282e-01 -7.720000000000000000e+02 1.793254740091770050e-01 -7.730000000000000000e+02 1.790483837145204760e-01 -7.740000000000000000e+02 1.787721077773175293e-01 -7.750000000000000000e+02 1.784966426755400792e-01 -7.760000000000000000e+02 1.782219849109021037e-01 -7.770000000000000000e+02 1.779481310086448720e-01 -7.780000000000000000e+02 1.776750775172805386e-01 -7.790000000000000000e+02 1.774028210083636037e-01 -7.800000000000000000e+02 1.771313580762706452e-01 -7.810000000000000000e+02 1.768606853379534605e-01 -7.820000000000000000e+02 1.765907994327330643e-01 -7.830000000000000000e+02 1.763216970220653768e-01 -7.840000000000000000e+02 1.760533747893261169e-01 -7.850000000000000000e+02 1.757858294395991117e-01 -7.860000000000000000e+02 1.755190576994557772e-01 -7.870000000000000000e+02 1.752530563167477573e-01 -7.880000000000000000e+02 1.749878220603999501e-01 -7.890000000000000000e+02 1.747233517202063102e-01 -7.900000000000000000e+02 1.744596421066213210e-01 -7.910000000000000000e+02 1.741966900505709792e-01 -7.920000000000000000e+02 1.739344924032440176e-01 -7.930000000000000000e+02 1.736730460359040829e-01 -7.940000000000000000e+02 1.734123478396928930e-01 -7.950000000000000000e+02 1.731523947254474949e-01 -7.960000000000000000e+02 1.728931836235040598e-01 -7.970000000000000000e+02 1.726347114835185270e-01 -7.980000000000000000e+02 1.723769752742830286e-01 -7.990000000000000000e+02 1.721199719835446451e-01 -8.000000000000000000e+02 1.718636986178233017e-01 -8.010000000000000000e+02 1.716081522022455674e-01 -8.020000000000000000e+02 1.713533297803551958e-01 -8.030000000000000000e+02 1.710992284139661035e-01 -8.040000000000000000e+02 1.708458451829648339e-01 -8.050000000000000000e+02 1.705931771851603995e-01 -8.060000000000000000e+02 1.703412215361158055e-01 -8.070000000000000000e+02 1.700899753689843197e-01 -8.080000000000000000e+02 1.698394358343452148e-01 -8.090000000000000000e+02 1.695896001000487541e-01 -8.100000000000000000e+02 1.693404653510564017e-01 -8.110000000000000000e+02 1.690920287892863638e-01 -8.120000000000000000e+02 1.688442876334581011e-01 -8.130000000000000000e+02 1.685972391189455299e-01 -8.140000000000000000e+02 1.683508804976205087e-01 -8.150000000000000000e+02 1.681052090377070374e-01 -8.160000000000000000e+02 1.678602220236431464e-01 -8.170000000000000000e+02 1.676159167559223562e-01 -8.180000000000000000e+02 1.673722905509618664e-01 -8.190000000000000000e+02 1.671293407409534248e-01 -8.200000000000000000e+02 1.668870646737345698e-01 -8.210000000000000000e+02 1.666454597126409143e-01 -8.220000000000000000e+02 1.664045232363741689e-01 -8.230000000000000000e+02 1.661642526388682484e-01 -8.240000000000000000e+02 1.659246453291537693e-01 -8.250000000000000000e+02 1.656856987312289031e-01 -8.260000000000000000e+02 1.654474102839309790e-01 -8.270000000000000000e+02 1.652097774408066155e-01 -8.280000000000000000e+02 1.649727976699829068e-01 -8.290000000000000000e+02 1.647364684540476298e-01 -8.300000000000000000e+02 1.645007872899181545e-01 -8.310000000000000000e+02 1.642657516887252311e-01 -8.320000000000000000e+02 1.640313591756905609e-01 -8.330000000000000000e+02 1.637976072900084734e-01 -8.340000000000000000e+02 1.635644935847182513e-01 -8.350000000000000000e+02 1.633320156266034329e-01 -8.360000000000000000e+02 1.631001709960651080e-01 -8.370000000000000000e+02 1.628689572870125335e-01 -8.380000000000000000e+02 1.626383721067453936e-01 -8.390000000000000000e+02 1.624084130758482736e-01 -8.400000000000000000e+02 1.621790778280755296e-01 -8.410000000000000000e+02 1.619503640102446240e-01 -8.420000000000000000e+02 1.617222692821323748e-01 -8.430000000000000000e+02 1.614947913163576332e-01 -8.440000000000000000e+02 1.612679277982875803e-01 -8.450000000000000000e+02 1.610416764259272326e-01 -8.460000000000000000e+02 1.608160349098172459e-01 -8.470000000000000000e+02 1.605910009729304699e-01 -8.480000000000000000e+02 1.603665723505774410e-01 -8.490000000000000000e+02 1.601427467903011326e-01 -8.500000000000000000e+02 1.599195220517799498e-01 -8.510000000000000000e+02 1.596968959067274485e-01 -8.520000000000000000e+02 1.594748661388046829e-01 -8.530000000000000000e+02 1.592534305435133468e-01 -8.540000000000000000e+02 1.590325869281131177e-01 -8.550000000000000000e+02 1.588123331115195436e-01 -8.560000000000000000e+02 1.585926669242151421e-01 -8.570000000000000000e+02 1.583735862081580015e-01 -8.580000000000000000e+02 1.581550888166957658e-01 -8.590000000000000000e+02 1.579371726144669363e-01 -8.600000000000000000e+02 1.577198354773206301e-01 -8.610000000000000000e+02 1.575030752922284283e-01 -8.620000000000000000e+02 1.572868899571963908e-01 -8.630000000000000000e+02 1.570712773811751839e-01 -8.640000000000000000e+02 1.568562354839878881e-01 -8.650000000000000000e+02 1.566417621962336304e-01 -8.660000000000000000e+02 1.564278554592107573e-01 -8.670000000000000000e+02 1.562145132248342894e-01 -8.680000000000000000e+02 1.560017334555549029e-01 -8.690000000000000000e+02 1.557895141242813808e-01 -8.700000000000000000e+02 1.555778532142964576e-01 -8.710000000000000000e+02 1.553667487191800478e-01 -8.720000000000000000e+02 1.551561986427322515e-01 -8.730000000000000000e+02 1.549462009989035216e-01 -8.740000000000000000e+02 1.547367538117028762e-01 -8.750000000000000000e+02 1.545278551151350876e-01 -8.760000000000000000e+02 1.543195029531224949e-01 -8.770000000000000000e+02 1.541116953794353095e-01 -8.780000000000000000e+02 1.539044304576116795e-01 -8.790000000000000000e+02 1.536977062608885503e-01 -8.800000000000000000e+02 1.534915208721329694e-01 -8.810000000000000000e+02 1.532858723837701720e-01 -8.820000000000000000e+02 1.530807588977079747e-01 -8.830000000000000000e+02 1.528761785252807925e-01 -8.840000000000000000e+02 1.526721293871620977e-01 -8.850000000000000000e+02 1.524686096133157365e-01 -8.860000000000000000e+02 1.522656173429173809e-01 -8.870000000000000000e+02 1.520631507242903302e-01 -8.880000000000000000e+02 1.518612079148390914e-01 -8.890000000000000000e+02 1.516597870809909543e-01 -8.900000000000000000e+02 1.514588863981203293e-01 -8.910000000000000000e+02 1.512585040504949851e-01 -8.920000000000000000e+02 1.510586382312030795e-01 -8.930000000000000000e+02 1.508592871421043369e-01 -8.940000000000000000e+02 1.506604489937514169e-01 -8.950000000000000000e+02 1.504621220053430630e-01 -8.960000000000000000e+02 1.502643044046546028e-01 -8.970000000000000000e+02 1.500669944279820200e-01 -8.980000000000000000e+02 1.498701903200784780e-01 -8.990000000000000000e+02 1.496738903341030824e-01 -9.000000000000000000e+02 1.494780927315501329e-01 -9.010000000000000000e+02 1.492827957822062956e-01 -9.020000000000000000e+02 1.490879977640773291e-01 -9.030000000000000000e+02 1.488936969633467555e-01 -9.040000000000000000e+02 1.486998916743114685e-01 -9.050000000000000000e+02 1.485065801993235846e-01 -9.060000000000000000e+02 1.483137608487412606e-01 -9.070000000000000000e+02 1.481214319408722668e-01 -9.080000000000000000e+02 1.479295918019182809e-01 -9.090000000000000000e+02 1.477382387659270380e-01 -9.100000000000000000e+02 1.475473711747292971e-01 -9.110000000000000000e+02 1.473569873778970418e-01 -9.120000000000000000e+02 1.471670857326824733e-01 -9.130000000000000000e+02 1.469776646039736012e-01 -9.140000000000000000e+02 1.467887223642389827e-01 -9.150000000000000000e+02 1.466002573934792330e-01 -9.160000000000000000e+02 1.464122680791772602e-01 -9.170000000000000000e+02 1.462247528162418098e-01 -9.180000000000000000e+02 1.460377100069734368e-01 -9.190000000000000000e+02 1.458511380610005848e-01 -9.200000000000000000e+02 1.456650353952339827e-01 -9.210000000000000000e+02 1.454794004338342273e-01 -9.220000000000000000e+02 1.452942316081404783e-01 -9.230000000000000000e+02 1.451095273566402610e-01 -9.240000000000000000e+02 1.449252861249199775e-01 -9.250000000000000000e+02 1.447415063656136980e-01 -9.260000000000000000e+02 1.445581865383607223e-01 -9.270000000000000000e+02 1.443753251097650570e-01 -9.280000000000000000e+02 1.441929205533447889e-01 -9.290000000000000000e+02 1.440109713494855948e-01 -9.300000000000000000e+02 1.438294759854008842e-01 -9.310000000000000000e+02 1.436484329550934413e-01 -9.320000000000000000e+02 1.434678407592990534e-01 -9.330000000000000000e+02 1.432876979054597266e-01 -9.340000000000000000e+02 1.431080029076605975e-01 -9.350000000000000000e+02 1.429287542866095329e-01 -9.360000000000000000e+02 1.427499505695824511e-01 -9.370000000000000000e+02 1.425715902903854915e-01 -9.380000000000000000e+02 1.423936719893119374e-01 -9.390000000000000000e+02 1.422161942131080214e-01 -9.400000000000000000e+02 1.420391555149262408e-01 -9.410000000000000000e+02 1.418625544542850281e-01 -9.420000000000000000e+02 1.416863895970347786e-01 -9.430000000000000000e+02 1.415106595153154956e-01 -9.440000000000000000e+02 1.413353627875172103e-01 -9.450000000000000000e+02 1.411604979982417074e-01 -9.460000000000000000e+02 1.409860637382658599e-01 -9.470000000000000000e+02 1.408120586045039091e-01 -9.480000000000000000e+02 1.406384811999666640e-01 -9.490000000000000000e+02 1.404653301337304150e-01 -9.500000000000000000e+02 1.402926040208922198e-01 -9.510000000000000000e+02 1.401203014825386228e-01 -9.520000000000000000e+02 1.399484211457112381e-01 -9.530000000000000000e+02 1.397769616433654771e-01 -9.540000000000000000e+02 1.396059216143341053e-01 -9.550000000000000000e+02 1.394352997033027897e-01 -9.560000000000000000e+02 1.392650945607592228e-01 -9.570000000000000000e+02 1.390953048429723615e-01 -9.580000000000000000e+02 1.389259292119498224e-01 -9.590000000000000000e+02 1.387569663354068783e-01 -9.600000000000000000e+02 1.385884148867320420e-01 -9.610000000000000000e+02 1.384202735449500676e-01 -9.620000000000000000e+02 1.382525409946983586e-01 -9.630000000000000000e+02 1.380852159261809764e-01 -9.640000000000000000e+02 1.379182970351448267e-01 -9.650000000000000000e+02 1.377517830228466855e-01 -9.660000000000000000e+02 1.375856725960163951e-01 -9.670000000000000000e+02 1.374199644668294418e-01 -9.680000000000000000e+02 1.372546573528691805e-01 -9.690000000000000000e+02 1.370897499771081551e-01 -9.700000000000000000e+02 1.369252410678593879e-01 -9.710000000000000000e+02 1.367611293587581434e-01 -9.720000000000000000e+02 1.365974135887278729e-01 -9.730000000000000000e+02 1.364340925019515149e-01 -9.740000000000000000e+02 1.362711648478356352e-01 -9.750000000000000000e+02 1.361086293809845860e-01 -9.760000000000000000e+02 1.359464848611711407e-01 -9.770000000000000000e+02 1.357847300533093771e-01 -9.780000000000000000e+02 1.356233637274189829e-01 -9.790000000000000000e+02 1.354623846585962799e-01 -9.800000000000000000e+02 1.353017916269985965e-01 -9.810000000000000000e+02 1.351415834177943087e-01 -9.820000000000000000e+02 1.349817588211591479e-01 -9.830000000000000000e+02 1.348223166322229105e-01 -9.840000000000000000e+02 1.346632556510622969e-01 -9.850000000000000000e+02 1.345045746826611932e-01 -9.860000000000000000e+02 1.343462725368876065e-01 -9.870000000000000000e+02 1.341883480615597701e-01 -9.880000000000000000e+02 1.340308000100528529e-01 -9.890000000000000000e+02 1.338736272398056149e-01 -9.900000000000000000e+02 1.337168285799549550e-01 -9.910000000000000000e+02 1.335604028643794794e-01 -9.920000000000000000e+02 1.334043489316852071e-01 -9.930000000000000000e+02 1.332486656251746504e-01 -9.940000000000000000e+02 1.330933517596697702e-01 -9.950000000000000000e+02 1.329384062540855949e-01 -9.960000000000000000e+02 1.327838279325198600e-01 -9.970000000000000000e+02 1.326296156568088636e-01 -9.980000000000000000e+02 1.324757682933597747e-01 -9.990000000000000000e+02 1.323222847131252378e-01 -1.000000000000000000e+03 1.321691637915768103e-01 -1.001000000000000000e+03 1.320164044086875599e-01 -1.002000000000000000e+03 1.318640054489006730e-01 -1.003000000000000000e+03 1.317119658011041139e-01 -1.004000000000000000e+03 1.315602843586153869e-01 -1.005000000000000000e+03 1.314089600191504226e-01 -1.006000000000000000e+03 1.312579916848016226e-01 -1.007000000000000000e+03 1.311073782620212347e-01 -1.008000000000000000e+03 1.309571186615844929e-01 -1.009000000000000000e+03 1.308072117985737415e-01 -1.010000000000000000e+03 1.306576565923632527e-01 -1.011000000000000000e+03 1.305084519665871690e-01 -1.012000000000000000e+03 1.303595968491136625e-01 -1.013000000000000000e+03 1.302110901720373859e-01 -1.014000000000000000e+03 1.300629308716407251e-01 -1.015000000000000000e+03 1.299151178883825863e-01 -1.016000000000000000e+03 1.297676501668720561e-01 -1.017000000000000000e+03 1.296205266558471958e-01 -1.018000000000000000e+03 1.294737463081559459e-01 -1.019000000000000000e+03 1.293273080807343656e-01 -1.020000000000000000e+03 1.291812109345764348e-01 -1.021000000000000000e+03 1.290354538347310565e-01 -1.022000000000000000e+03 1.288900357502606731e-01 -1.023000000000000000e+03 1.287449556542367146e-01 -1.024000000000000000e+03 1.286002125237113713e-01 -1.025000000000000000e+03 1.284558053396971655e-01 -1.026000000000000000e+03 1.283117330871465511e-01 -1.027000000000000000e+03 1.281679947549354548e-01 -1.028000000000000000e+03 1.280245893358402387e-01 -1.029000000000000000e+03 1.278815158265200203e-01 -1.030000000000000000e+03 1.277387732274901377e-01 -1.031000000000000000e+03 1.275963605431077452e-01 -1.032000000000000000e+03 1.274542767815606825e-01 -1.033000000000000000e+03 1.273125209548309766e-01 -1.034000000000000000e+03 1.271710920786854604e-01 -1.035000000000000000e+03 1.270299891726599240e-01 -1.036000000000000000e+03 1.268892112600283895e-01 -1.037000000000000000e+03 1.267487573677982815e-01 -1.038000000000000000e+03 1.266086265266815614e-01 -1.039000000000000000e+03 1.264688177710780737e-01 -1.040000000000000000e+03 1.263293301390636669e-01 -1.041000000000000000e+03 1.261901626723622161e-01 -1.042000000000000000e+03 1.260513144163321331e-01 -1.043000000000000000e+03 1.259127844199509350e-01 -1.044000000000000000e+03 1.257745717357948156e-01 -1.045000000000000000e+03 1.256366754200144431e-01 -1.046000000000000000e+03 1.254990945323299356e-01 -1.047000000000000000e+03 1.253618281360048825e-01 -1.048000000000000000e+03 1.252248752978292745e-01 -1.049000000000000000e+03 1.250882350881037663e-01 -1.050000000000000000e+03 1.249519065806236479e-01 -1.051000000000000000e+03 1.248158888526591098e-01 -1.052000000000000000e+03 1.246801809849393816e-01 -1.053000000000000000e+03 1.245447820616378681e-01 -1.054000000000000000e+03 1.244096911703505004e-01 -1.055000000000000000e+03 1.242749074020829819e-01 -1.056000000000000000e+03 1.241404298512330112e-01 -1.057000000000000000e+03 1.240062576155750995e-01 -1.058000000000000000e+03 1.238723897962429737e-01 -1.059000000000000000e+03 1.237388254977097868e-01 -1.060000000000000000e+03 1.236055638277841762e-01 -1.061000000000000000e+03 1.234726038975752782e-01 -1.062000000000000000e+03 1.233399448214995836e-01 -1.063000000000000000e+03 1.232075857172361122e-01 -1.064000000000000000e+03 1.230755257057444263e-01 -1.065000000000000000e+03 1.229437639112212627e-01 -1.066000000000000000e+03 1.228122994611028224e-01 -1.067000000000000000e+03 1.226811314860330876e-01 -1.068000000000000000e+03 1.225502591198685542e-01 -1.069000000000000000e+03 1.224196814996454802e-01 -1.070000000000000000e+03 1.222893977655738068e-01 -1.071000000000000000e+03 1.221594070610183269e-01 -1.072000000000000000e+03 1.220297085324840297e-01 -1.073000000000000000e+03 1.219003013296086069e-01 -1.074000000000000000e+03 1.217711846051361124e-01 -1.075000000000000000e+03 1.216423575149093717e-01 -1.076000000000000000e+03 1.215138192178531612e-01 -1.077000000000000000e+03 1.213855688759627321e-01 -1.078000000000000000e+03 1.212576056542851444e-01 -1.079000000000000000e+03 1.211299287209078035e-01 -1.080000000000000000e+03 1.210025372469445554e-01 -1.081000000000000000e+03 1.208754304065162571e-01 -1.082000000000000000e+03 1.207486073767464752e-01 -1.083000000000000000e+03 1.206220673377426111e-01 -1.084000000000000000e+03 1.204958094725742113e-01 -1.085000000000000000e+03 1.203698329672737016e-01 -1.086000000000000000e+03 1.202441370108142116e-01 -1.087000000000000000e+03 1.201187207950938918e-01 -1.088000000000000000e+03 1.199935835149330970e-01 -1.089000000000000000e+03 1.198687243680439246e-01 -1.090000000000000000e+03 1.197441425550360011e-01 -1.091000000000000000e+03 1.196198372793898096e-01 -1.092000000000000000e+03 1.194958077474480018e-01 -1.093000000000000000e+03 1.193720531684009240e-01 -1.094000000000000000e+03 1.192485727542798996e-01 -1.095000000000000000e+03 1.191253657199293631e-01 -1.096000000000000000e+03 1.190024312830151171e-01 -1.097000000000000000e+03 1.188797686639917334e-01 -1.098000000000000000e+03 1.187573770861034689e-01 -1.099000000000000000e+03 1.186352557753638376e-01 +3.000000000000000000e+02 7.961299851462676214e-02 +3.010000000000000000e+02 1.332288155026307430e-01 +3.020000000000000000e+02 2.140794239934083465e-01 +3.030000000000000000e+02 3.358020697199494697e-01 +3.040000000000000000e+02 5.203650267662797146e-01 +3.050000000000000000e+02 8.039346299497034387e-01 +3.060000000000000000e+02 1.246857969960517787e+00 +3.070000000000000000e+02 1.948756173976117223e+00 +3.080000000000000000e+02 3.061564326085904231e+00 +3.090000000000000000e+02 4.754068346658284483e+00 +3.100000000000000000e+02 6.980099788528115745e+00 +3.110000000000000000e+02 8.989994104067182690e+00 +3.120000000000000000e+02 9.568274014305636399e+00 +3.130000000000000000e+02 8.602215291399884833e+00 +3.140000000000000000e+02 7.064599362725426879e+00 +3.150000000000000000e+02 5.654047497876379502e+00 +3.160000000000000000e+02 4.554202335271595459e+00 +3.170000000000000000e+02 3.734874132958712512e+00 +3.180000000000000000e+02 3.125853968470231337e+00 +3.190000000000000000e+02 2.666882617112256604e+00 +3.200000000000000000e+02 2.314416691882152044e+00 +3.210000000000000000e+02 2.038406572548078888e+00 +3.220000000000000000e+02 1.818230229845627210e+00 +3.230000000000000000e+02 1.639595893845350316e+00 +3.240000000000000000e+02 1.492441797633357714e+00 +3.250000000000000000e+02 1.369558229931185922e+00 +3.260000000000000000e+02 1.265686753132716502e+00 +3.270000000000000000e+02 1.176926314575905907e+00 +3.280000000000000000e+02 1.100336288900929382e+00 +3.290000000000000000e+02 1.033666940003522106e+00 +3.300000000000000000e+02 9.751734048420805934e-01 +3.310000000000000000e+02 9.234852495649015225e-01 +3.320000000000000000e+02 8.775135804346393398e-01 +3.330000000000000000e+02 8.363839278155630330e-01 +3.340000000000000000e+02 7.993870835692526988e-01 +3.350000000000000000e+02 7.659426242203544177e-01 +3.360000000000000000e+02 7.355715196817254053e-01 +3.370000000000000000e+02 7.078753324939935920e-01 +3.380000000000000000e+02 6.825202553748643819e-01 +3.390000000000000000e+02 6.592247409811804459e-01 +3.400000000000000000e+02 6.377498271070528579e-01 +3.410000000000000000e+02 6.178915046436176395e-01 +3.420000000000000000e+02 5.994746482197726989e-01 +3.430000000000000000e+02 5.823481528430023424e-01 +3.440000000000000000e+02 5.663810090244997264e-01 +3.450000000000000000e+02 5.514591139482380999e-01 +3.460000000000000000e+02 5.374826641907224367e-01 +3.470000000000000000e+02 5.243640111435605711e-01 +3.480000000000000000e+02 5.120258870188540978e-01 +3.490000000000000000e+02 5.003999295189858199e-01 +3.500000000000000000e+02 4.894254486430644757e-01 +3.510000000000000000e+02 4.790483909090546000e-01 +3.520000000000000000e+02 4.692204653945375448e-01 +3.530000000000000000e+02 4.598984030952154023e-01 +3.540000000000000000e+02 4.510433266541649666e-01 +3.550000000000000000e+02 4.426202118881453762e-01 +3.560000000000000000e+02 4.345974260009224932e-01 +3.570000000000000000e+02 4.269463301312558245e-01 +3.580000000000000000e+02 4.196409360911090292e-01 +3.590000000000000000e+02 4.126576089255324931e-01 +3.600000000000000000e+02 4.059748083617220060e-01 +3.610000000000000000e+02 3.995728633805583629e-01 +3.620000000000000000e+02 3.934337750951352741e-01 +3.630000000000000000e+02 3.875410439001367724e-01 +3.640000000000000000e+02 3.818795174965109451e-01 +3.650000000000000000e+02 3.764352569253868741e-01 +3.660000000000000000e+02 3.711954181837090472e-01 +3.670000000000000000e+02 3.661481473589716096e-01 +3.680000000000000000e+02 3.612824875251964829e-01 +3.690000000000000000e+02 3.565882958973327632e-01 +3.700000000000000000e+02 3.520561699557953061e-01 +3.710000000000000000e+02 3.476773814336127644e-01 +3.720000000000000000e+02 3.434438172114515075e-01 +3.730000000000000000e+02 3.393479262955031439e-01 +3.740000000000000000e+02 3.353826721633714203e-01 +3.750000000000000000e+02 3.315414898571716340e-01 +3.760000000000000000e+02 3.278182472833725547e-01 +3.770000000000000000e+02 3.242072102478924522e-01 +3.780000000000000000e+02 3.207030108140977442e-01 +3.790000000000000000e+02 3.173006186224021641e-01 +3.800000000000000000e+02 3.139953148542299344e-01 +3.810000000000000000e+02 3.107826685611519424e-01 +3.820000000000000000e+02 3.076585151131501772e-01 +3.830000000000000000e+02 3.046189365486084988e-01 +3.840000000000000000e+02 3.016602436337605386e-01 +3.850000000000000000e+02 2.987789594610280042e-01 +3.860000000000000000e+02 2.959718044349548549e-01 +3.870000000000000000e+02 2.932356825109964649e-01 +3.880000000000000000e+02 2.905676685672203274e-01 +3.890000000000000000e+02 2.879649968019114548e-01 +3.900000000000000000e+02 2.854250500613068620e-01 +3.910000000000000000e+02 2.829453500119029075e-01 +3.920000000000000000e+02 2.805235480805149395e-01 +3.930000000000000000e+02 2.781574170931823686e-01 +3.940000000000000000e+02 2.758448435509671670e-01 +3.950000000000000000e+02 2.735838204868805135e-01 +3.960000000000000000e+02 2.713724408536276611e-01 +3.970000000000000000e+02 2.692088913968753716e-01 +3.980000000000000000e+02 2.670914469729461227e-01 +3.990000000000000000e+02 2.650184652738983848e-01 +4.000000000000000000e+02 2.629883819263793554e-01 +4.010000000000000000e+02 2.609997059337193503e-01 +4.020000000000000000e+02 2.590510154336600479e-01 +4.030000000000000000e+02 2.571409537464698358e-01 +4.040000000000000000e+02 2.552682256906250169e-01 +4.050000000000000000e+02 2.534315941451266152e-01 +4.060000000000000000e+02 2.516298768394835683e-01 +4.070000000000000000e+02 2.498619433539414070e-01 +4.080000000000000000e+02 2.481267123141129294e-01 +4.090000000000000000e+02 2.464231487654904296e-01 +4.100000000000000000e+02 2.447502617145134174e-01 +4.110000000000000000e+02 2.431071018240412718e-01 +4.120000000000000000e+02 2.414927592520367816e-01 +4.130000000000000000e+02 2.399063616231849327e-01 +4.140000000000000000e+02 2.383470721240262269e-01 +4.150000000000000000e+02 2.368140877129318866e-01 +4.160000000000000000e+02 2.353066374369191249e-01 +4.170000000000000000e+02 2.338239808479604664e-01 +4.180000000000000000e+02 2.323654065119738765e-01 +4.190000000000000000e+02 2.309302306042842479e-01 +4.200000000000000000e+02 2.295177955857041763e-01 +4.210000000000000000e+02 2.281274689539329326e-01 +4.220000000000000000e+02 2.267586420653266988e-01 +4.230000000000000000e+02 2.254107290224274251e-01 +4.240000000000000000e+02 2.240831656230506952e-01 +4.250000000000000000e+02 2.227754083669700180e-01 +4.260000000000000000e+02 2.214869335165711162e-01 +4.270000000000000000e+02 2.202172362080710710e-01 +4.280000000000000000e+02 2.189658296101751611e-01 +4.290000000000000000e+02 2.177322441272342146e-01 +4.300000000000000000e+02 2.165160266441842063e-01 +4.310000000000000000e+02 2.153167398107430908e-01 +4.320000000000000000e+02 2.141339613625038996e-01 +4.330000000000000000e+02 2.129672834767183942e-01 +4.340000000000000000e+02 2.118163121607318511e-01 +4.350000000000000000e+02 2.106806666711602549e-01 +4.360000000000000000e+02 2.095599789620027076e-01 +4.370000000000000000e+02 2.084538931600571632e-01 +4.380000000000000000e+02 2.073620650660302211e-01 +4.390000000000000000e+02 2.062841616799475086e-01 +4.400000000000000000e+02 2.052198607494348237e-01 +4.410000000000000000e+02 2.041688503396373866e-01 +4.420000000000000000e+02 2.031308284235689432e-01 +4.430000000000000000e+02 2.021055024917489673e-01 +4.440000000000000000e+02 2.010925891801146337e-01 +4.450000000000000000e+02 2.000918139151833253e-01 +4.460000000000000000e+02 1.991029105755633688e-01 +4.470000000000000000e+02 1.981256211689262081e-01 +4.480000000000000000e+02 1.971596955236434578e-01 +4.490000000000000000e+02 1.962048909942987196e-01 +4.500000000000000000e+02 1.952609721803653386e-01 +4.510000000000000000e+02 1.943277106573545743e-01 +4.520000000000000000e+02 1.934048847198230336e-01 +4.530000000000000000e+02 1.924922791356010188e-01 +4.540000000000000000e+02 1.915896849107006916e-01 +4.550000000000000000e+02 1.906968990643508333e-01 +4.560000000000000000e+02 1.898137244136666735e-01 +4.570000000000000000e+02 1.889399693674656822e-01 +4.580000000000000000e+02 1.880754477287910620e-01 +4.590000000000000000e+02 1.872199785057147292e-01 +4.600000000000000000e+02 1.863733857300050589e-01 +4.610000000000000000e+02 1.855354982833024580e-01 +4.620000000000000000e+02 1.847061497304345323e-01 +4.630000000000000000e+02 1.838851781595266521e-01 +4.640000000000000000e+02 1.830724260285875316e-01 +4.650000000000000000e+02 1.822677400182809437e-01 +4.660000000000000000e+02 1.814709708905761498e-01 +4.670000000000000000e+02 1.806819733530212746e-01 +4.680000000000000000e+02 1.799006059283672354e-01 +4.690000000000000000e+02 1.791267308293136296e-01 +4.700000000000000000e+02 1.783602138381267521e-01 +4.710000000000000000e+02 1.776009241909256298e-01 +4.720000000000000000e+02 1.768487344664192995e-01 +4.730000000000000000e+02 1.761035204788990172e-01 +4.740000000000000000e+02 1.753651611752923556e-01 +4.750000000000000000e+02 1.746335385361159898e-01 +4.760000000000000000e+02 1.739085374801370154e-01 +4.770000000000000000e+02 1.731900457725939479e-01 +4.780000000000000000e+02 1.724779539368175296e-01 +4.790000000000000000e+02 1.717721551691251125e-01 +4.800000000000000000e+02 1.710725452568100935e-01 +4.810000000000000000e+02 1.703790224991346414e-01 +4.820000000000000000e+02 1.696914876311798881e-01 +4.830000000000000000e+02 1.690098437504338191e-01 +4.840000000000000000e+02 1.683339962460135286e-01 +4.850000000000000000e+02 1.676638527303926374e-01 +4.860000000000000000e+02 1.669993229735621254e-01 +4.870000000000000000e+02 1.663403188394913523e-01 +4.880000000000000000e+02 1.656867542248213754e-01 +4.890000000000000000e+02 1.650385449996839560e-01 +4.900000000000000000e+02 1.643956089505726470e-01 +4.910000000000000000e+02 1.637578657251728687e-01 +4.920000000000000000e+02 1.631252367790876068e-01 +4.930000000000000000e+02 1.624976453243637819e-01 +4.940000000000000000e+02 1.618750162797696068e-01 +4.950000000000000000e+02 1.612572762227393597e-01 +4.960000000000000000e+02 1.606443533429307291e-01 +4.970000000000000000e+02 1.600361773973174306e-01 +4.980000000000000000e+02 1.594326796667862034e-01 +4.990000000000000000e+02 1.588337929141440674e-01 +5.000000000000000000e+02 1.582394513435155803e-01 +5.010000000000000000e+02 1.576495905610547088e-01 +5.020000000000000000e+02 1.570641475369312923e-01 +5.030000000000000000e+02 1.564830605685475218e-01 +5.040000000000000000e+02 1.559062692449307008e-01 +5.050000000000000000e+02 1.553337144122596547e-01 +5.060000000000000000e+02 1.547653381404952011e-01 +5.070000000000000000e+02 1.542010836910570060e-01 +5.080000000000000000e+02 1.536408954855126019e-01 +5.090000000000000000e+02 1.530847190752566700e-01 +5.100000000000000000e+02 1.525325011121264895e-01 +5.110000000000000000e+02 1.519841893199313232e-01 +5.120000000000000000e+02 1.514397324668538269e-01 +5.130000000000000000e+02 1.508990803386966173e-01 +5.140000000000000000e+02 1.503621837129602012e-01 +5.150000000000000000e+02 1.498289943336809926e-01 +5.160000000000000000e+02 1.492994648870618890e-01 +5.170000000000000000e+02 1.487735489778009845e-01 +5.180000000000000000e+02 1.482512011061621615e-01 +5.190000000000000000e+02 1.477323766457019349e-01 +5.200000000000000000e+02 1.472170318216717566e-01 +5.210000000000000000e+02 1.467051236415289894e-01 +5.220000000000000000e+02 1.461966100694034876e-01 +5.230000000000000000e+02 1.456914497601094205e-01 +5.240000000000000000e+02 1.451896020471993842e-01 +5.250000000000000000e+02 1.446910271597220132e-01 +5.260000000000000000e+02 1.441956860136566487e-01 +5.270000000000000000e+02 1.437035402421477648e-01 +5.280000000000000000e+02 1.432145521784317366e-01 +5.290000000000000000e+02 1.427286848392624319e-01 +5.300000000000000000e+02 1.422459019087904397e-01 +5.310000000000000000e+02 1.417661677229094530e-01 +5.320000000000000000e+02 1.412894472540359159e-01 +5.330000000000000000e+02 1.408157060963131368e-01 +5.340000000000000000e+02 1.403449104512287382e-01 +5.350000000000000000e+02 1.398770271136304533e-01 +5.360000000000000000e+02 1.394120234581230355e-01 +5.370000000000000000e+02 1.389498674258441147e-01 +5.380000000000000000e+02 1.384905275116004308e-01 +5.390000000000000000e+02 1.380339727513476555e-01 +5.400000000000000000e+02 1.375801727100182115e-01 +5.410000000000000000e+02 1.371290974696694198e-01 +5.420000000000000000e+02 1.366807176179598571e-01 +5.430000000000000000e+02 1.362350042369165071e-01 +5.440000000000000000e+02 1.357919288920213519e-01 +5.450000000000000000e+02 1.353514636215761568e-01 +5.460000000000000000e+02 1.349135809263443952e-01 +5.470000000000000000e+02 1.344782537594772232e-01 +5.480000000000000000e+02 1.340454555166927519e-01 +5.490000000000000000e+02 1.336151600267161399e-01 +5.500000000000000000e+02 1.331873415419657092e-01 +5.510000000000000000e+02 1.327619747294848385e-01 +5.520000000000000000e+02 1.323390346621011182e-01 +5.530000000000000000e+02 1.319184968098135180e-01 +5.540000000000000000e+02 1.315003370313998776e-01 +5.550000000000000000e+02 1.310845315662466370e-01 +5.560000000000000000e+02 1.306710570263680538e-01 +5.570000000000000000e+02 1.302598903886419413e-01 +5.580000000000000000e+02 1.298510089872303985e-01 +5.590000000000000000e+02 1.294443905062016287e-01 +5.600000000000000000e+02 1.290400129723235645e-01 +5.610000000000000000e+02 1.286378547480406531e-01 +5.620000000000000000e+02 1.282378945246333557e-01 +5.630000000000000000e+02 1.278401113154921109e-01 +5.640000000000000000e+02 1.274444844497578389e-01 +5.650000000000000000e+02 1.270509935657559153e-01 +5.660000000000000000e+02 1.266596186048500883e-01 +5.670000000000000000e+02 1.262703398055137760e-01 +5.680000000000000000e+02 1.258831376973126581e-01 +5.690000000000000000e+02 1.254979930951669320e-01 +5.700000000000000000e+02 1.251148870937316415e-01 +5.710000000000000000e+02 1.247338010619008508e-01 +5.720000000000000000e+02 1.243547166374542462e-01 +5.730000000000000000e+02 1.239776157218182850e-01 +5.740000000000000000e+02 1.236024804749573935e-01 +5.750000000000000000e+02 1.232292933103926735e-01 +5.760000000000000000e+02 1.228580368903178094e-01 +5.770000000000000000e+02 1.224886941208494368e-01 +5.780000000000000000e+02 1.221212481473756550e-01 +5.790000000000000000e+02 1.217556823500183238e-01 +5.800000000000000000e+02 1.213919803391943636e-01 +5.810000000000000000e+02 1.210301259512846506e-01 +5.820000000000000000e+02 1.206701032444012500e-01 +5.830000000000000000e+02 1.203118964942487962e-01 +5.840000000000000000e+02 1.199554901900795889e-01 +5.850000000000000000e+02 1.196008690307446137e-01 +5.860000000000000000e+02 1.192480179208306595e-01 +5.870000000000000000e+02 1.188969219668824795e-01 +5.880000000000000000e+02 1.185475664737183077e-01 +5.890000000000000000e+02 1.181999369408137240e-01 +5.900000000000000000e+02 1.178540190587768349e-01 +5.910000000000000000e+02 1.175097987059009891e-01 +5.920000000000000000e+02 1.171672619447881175e-01 +5.930000000000000000e+02 1.168263950190492340e-01 +5.940000000000000000e+02 1.164871843500789456e-01 +5.950000000000000000e+02 1.161496165338983394e-01 +5.960000000000000000e+02 1.158136783380677715e-01 +5.970000000000000000e+02 1.154793566986649367e-01 +5.980000000000000000e+02 1.151466387173311207e-01 +5.990000000000000000e+02 1.148155116583784441e-01 +6.000000000000000000e+02 1.144859629459602929e-01 +6.010000000000000000e+02 1.141579801613047396e-01 +6.020000000000000000e+02 1.138315510610745790e-01 +6.030000000000000000e+02 1.135066634902111432e-01 +6.040000000000000000e+02 1.131833054857417364e-01 +6.050000000000000000e+02 1.128614652721903477e-01 +6.060000000000000000e+02 1.125411311557544813e-01 +6.070000000000000000e+02 1.122222916051521246e-01 +6.080000000000000000e+02 1.119049352283636445e-01 +6.090000000000000000e+02 1.115890507702966272e-01 +6.100000000000000000e+02 1.112746271105028162e-01 +6.110000000000000000e+02 1.109616532609311729e-01 +6.120000000000000000e+02 1.106501183637413621e-01 +6.130000000000000000e+02 1.103400116891502525e-01 +6.140000000000000000e+02 1.100313226333304029e-01 +6.150000000000000000e+02 1.097240407163439790e-01 +6.160000000000000000e+02 1.094181555801294059e-01 +6.170000000000000000e+02 1.091136569865165939e-01 +6.180000000000000000e+02 1.088105348152902385e-01 +6.190000000000000000e+02 1.085087790622894233e-01 +6.200000000000000000e+02 1.082083798375482048e-01 +6.210000000000000000e+02 1.079093273634639805e-01 +6.220000000000000000e+02 1.076116119730188142e-01 +6.230000000000000000e+02 1.073152241080153890e-01 +6.240000000000000000e+02 1.070201543173670139e-01 +6.250000000000000000e+02 1.067263932554120415e-01 +6.260000000000000000e+02 1.064339316802580815e-01 +6.270000000000000000e+02 1.061427604521662099e-01 +6.280000000000000000e+02 1.058528705319620317e-01 +6.290000000000000000e+02 1.055642529794833112e-01 +6.300000000000000000e+02 1.052768989520453252e-01 +6.310000000000000000e+02 1.049907997029521783e-01 +6.320000000000000000e+02 1.047059465800220385e-01 +6.330000000000000000e+02 1.044223310241524094e-01 +6.340000000000000000e+02 1.041399445679029173e-01 +6.350000000000000000e+02 1.038587788341130691e-01 +6.360000000000000000e+02 1.035788255345441305e-01 +6.370000000000000000e+02 1.033000764685384071e-01 +6.380000000000000000e+02 1.030225235217194779e-01 +6.390000000000000000e+02 1.027461586647041569e-01 +6.400000000000000000e+02 1.024709739518415291e-01 +6.410000000000000000e+02 1.021969615199819770e-01 +6.420000000000000000e+02 1.019241135872587661e-01 +6.430000000000000000e+02 1.016524224518972896e-01 +6.440000000000000000e+02 1.013818804910511656e-01 +6.450000000000000000e+02 1.011124801596522821e-01 +6.460000000000000000e+02 1.008442139892827411e-01 +6.470000000000000000e+02 1.005770745870757932e-01 +6.480000000000000000e+02 1.003110546346218795e-01 +6.490000000000000000e+02 1.000461468869114218e-01 +6.500000000000000000e+02 9.978234417128330203e-02 +6.510000000000000000e+02 9.951963938640100149e-02 +6.520000000000000000e+02 9.925802550124120105e-02 +6.530000000000000000e+02 9.899749555410496116e-02 +6.540000000000000000e+02 9.873804265164554117e-02 +6.550000000000000000e+02 9.847965996791052667e-02 +6.560000000000000000e+02 9.822234074340530086e-02 +6.570000000000000000e+02 9.796607828417108754e-02 +6.580000000000000000e+02 9.771086596087912024e-02 +6.590000000000000000e+02 9.745669720793985469e-02 +6.600000000000000000e+02 9.720356552263154093e-02 +6.610000000000000000e+02 9.695146446423963393e-02 +6.620000000000000000e+02 9.670038765321312124e-02 +6.630000000000000000e+02 9.645032877033810070e-02 +6.640000000000000000e+02 9.620128155591793628e-02 +6.650000000000000000e+02 9.595323980897974003e-02 +6.660000000000000000e+02 9.570619738648178387e-02 +6.670000000000000000e+02 9.546014820254186684e-02 +6.680000000000000000e+02 9.521508622767922703e-02 +6.690000000000000000e+02 9.497100548806669540e-02 +6.700000000000000000e+02 9.472790006479210601e-02 +6.710000000000000000e+02 9.448576409314531077e-02 +6.720000000000000000e+02 9.424459176189903253e-02 +6.730000000000000000e+02 9.400437731261848673e-02 +6.740000000000000000e+02 9.376511503896947652e-02 +6.750000000000000000e+02 9.352679928604872017e-02 +6.760000000000000000e+02 9.328942444971767556e-02 +6.770000000000000000e+02 9.305298497595046459e-02 +6.780000000000000000e+02 9.281747536019520350e-02 +6.790000000000000000e+02 9.258289014673913575e-02 +6.800000000000000000e+02 9.234922392809159775e-02 +6.810000000000000000e+02 9.211647134437117579e-02 +6.820000000000000000e+02 9.188462708270714319e-02 +6.830000000000000000e+02 9.165368587664779465e-02 +6.840000000000000000e+02 9.142364250558188132e-02 +6.850000000000000000e+02 9.119449179416302953e-02 +6.860000000000000000e+02 9.096622861175272801e-02 +6.870000000000000000e+02 9.073884787186277390e-02 +6.880000000000000000e+02 9.051234453161291493e-02 +6.890000000000000000e+02 9.028671359119457007e-02 +6.900000000000000000e+02 9.006195009334588830e-02 +6.910000000000000000e+02 8.983804912283120669e-02 +6.920000000000000000e+02 8.961500580592933474e-02 +6.930000000000000000e+02 8.939281530993493929e-02 +6.940000000000000000e+02 8.917147284266045693e-02 +6.950000000000000000e+02 8.895097365195243910e-02 +6.960000000000000000e+02 8.873131302520982644e-02 +6.970000000000000000e+02 8.851248628891514314e-02 +6.980000000000000000e+02 8.829448880816814782e-02 +6.990000000000000000e+02 8.807731598622996205e-02 +7.000000000000000000e+02 8.786096326407055734e-02 +7.010000000000000000e+02 8.764542611993125787e-02 +7.020000000000000000e+02 8.743070006888306600e-02 +7.030000000000000000e+02 8.721678066239943461e-02 +7.040000000000000000e+02 8.700366348793345250e-02 +7.050000000000000000e+02 8.679134416850203815e-02 +7.060000000000000000e+02 8.657981836227203465e-02 +7.070000000000000000e+02 8.636908176216102906e-02 +7.080000000000000000e+02 8.615913009543682555e-02 +7.090000000000000000e+02 8.594995912332500931e-02 +7.100000000000000000e+02 8.574156464062566985e-02 +7.110000000000000000e+02 8.553394247532862538e-02 +7.120000000000000000e+02 8.532708848824398229e-02 +7.130000000000000000e+02 8.512099857262904468e-02 +7.140000000000000000e+02 8.491566865382750573e-02 +7.150000000000000000e+02 8.471109468890775096e-02 +7.160000000000000000e+02 8.450727266631387347e-02 +7.170000000000000000e+02 8.430419860551655042e-02 +7.180000000000000000e+02 8.410186855666709760e-02 +7.190000000000000000e+02 8.390027860026526285e-02 +7.200000000000000000e+02 8.369942484682130202e-02 +7.210000000000000000e+02 8.349930343653337583e-02 +7.220000000000000000e+02 8.329991053895692554e-02 +7.230000000000000000e+02 8.310124235269428228e-02 +7.240000000000000000e+02 8.290329510507447874e-02 +7.250000000000000000e+02 8.270606505184592561e-02 +7.260000000000000000e+02 8.250954847687301530e-02 +7.270000000000000000e+02 8.231374169183171274e-02 +7.280000000000000000e+02 8.211864103591502706e-02 +7.290000000000000000e+02 8.192424287554087026e-02 +7.300000000000000000e+02 8.173054360406327434e-02 +7.310000000000000000e+02 8.153753964148807709e-02 +7.320000000000000000e+02 8.134522743419352053e-02 +7.330000000000000000e+02 8.115360345465280623e-02 +7.340000000000000000e+02 8.096266420116210449e-02 +7.350000000000000000e+02 8.077240619757197759e-02 +7.360000000000000000e+02 8.058282599302331317e-02 +7.370000000000000000e+02 8.039392016168322996e-02 +7.380000000000000000e+02 8.020568530248957384e-02 +7.390000000000000000e+02 8.001811803889698205e-02 +7.400000000000000000e+02 7.983121501862579239e-02 +7.410000000000000000e+02 7.964497291341322838e-02 +7.420000000000000000e+02 7.945938841877041303e-02 +7.430000000000000000e+02 7.927445825374186683e-02 +7.440000000000000000e+02 7.909017916066828080e-02 +7.450000000000000000e+02 7.890654790495252313e-02 +7.460000000000000000e+02 7.872356127482506294e-02 +7.470000000000000000e+02 7.854121608112407671e-02 +7.480000000000000000e+02 7.835950915705916509e-02 +7.490000000000000000e+02 7.817843735799966109e-02 +7.500000000000000000e+02 7.799799756125053163e-02 +7.510000000000000000e+02 7.781818666583417698e-02 +7.520000000000000000e+02 7.763900159228455389e-02 +7.530000000000000000e+02 7.746043928242785093e-02 +7.540000000000000000e+02 7.728249669917981735e-02 +7.550000000000000000e+02 7.710517082634169017e-02 +7.560000000000000000e+02 7.692845866839373437e-02 +7.570000000000000000e+02 7.675235725029716516e-02 +7.580000000000000000e+02 7.657686361729941493e-02 +7.590000000000000000e+02 7.640197483473448736e-02 +7.600000000000000000e+02 7.622768798783630118e-02 +7.610000000000000000e+02 7.605400018154383213e-02 +7.620000000000000000e+02 7.588090854031788457e-02 +7.630000000000000000e+02 7.570841020795456011e-02 +7.640000000000000000e+02 7.553650234740082181e-02 +7.650000000000000000e+02 7.536518214057852383e-02 +7.660000000000000000e+02 7.519444678820114136e-02 +7.670000000000000000e+02 7.502429350960332366e-02 +7.680000000000000000e+02 7.485471954256316118e-02 +7.690000000000000000e+02 7.468572214313343172e-02 +7.700000000000000000e+02 7.451729858547094520e-02 +7.710000000000000000e+02 7.434944616167016296e-02 +7.720000000000000000e+02 7.418216218159577602e-02 +7.730000000000000000e+02 7.401544397272466491e-02 +7.740000000000000000e+02 7.384928887997892211e-02 +7.750000000000000000e+02 7.368369426557253021e-02 +7.760000000000000000e+02 7.351865750884771511e-02 +7.770000000000000000e+02 7.335417600612696709e-02 +7.780000000000000000e+02 7.319024717055415408e-02 +7.790000000000000000e+02 7.302686843194303168e-02 +7.800000000000000000e+02 7.286403723663467669e-02 +7.810000000000000000e+02 7.270175104734004357e-02 +7.820000000000000000e+02 7.254000734299849429e-02 +7.830000000000000000e+02 7.237880361863653633e-02 +7.840000000000000000e+02 7.221813738521926096e-02 +7.850000000000000000e+02 7.205800616951270332e-02 +7.860000000000000000e+02 7.189840751394413476e-02 +7.870000000000000000e+02 7.173933897646456170e-02 +7.880000000000000000e+02 7.158079813041265393e-02 +7.890000000000000000e+02 7.142278256437989414e-02 +7.900000000000000000e+02 7.126528988207803117e-02 +7.910000000000000000e+02 7.110831770220976678e-02 +7.920000000000000000e+02 7.095186365833487663e-02 +7.930000000000000000e+02 7.079592539874554613e-02 +7.940000000000000000e+02 7.064050058633830620e-02 +7.950000000000000000e+02 7.048558689848902215e-02 +7.960000000000000000e+02 7.033118202692904830e-02 +7.970000000000000000e+02 7.017728367762288144e-02 +7.980000000000000000e+02 7.002388957064674402e-02 +7.990000000000000000e+02 6.987099744006955437e-02 +8.000000000000000000e+02 6.971860503383361940e-02 +8.010000000000000000e+02 6.956671011364025381e-02 +8.020000000000000000e+02 6.941531045483030626e-02 +8.030000000000000000e+02 6.926440384627337299e-02 +8.040000000000000000e+02 6.911398809025275092e-02 +8.050000000000000000e+02 6.896406100235479009e-02 +8.060000000000000000e+02 6.881462041135676111e-02 +8.070000000000000000e+02 6.866566415912081500e-02 +8.080000000000000000e+02 6.851719010048246128e-02 +8.090000000000000000e+02 6.836919610314487472e-02 +8.100000000000000000e+02 6.822168004757425686e-02 +8.110000000000000000e+02 6.807463982689469784e-02 +8.120000000000000000e+02 6.792807334678388487e-02 +8.130000000000000000e+02 6.778197852537252988e-02 +8.140000000000000000e+02 6.763635329314113265e-02 +8.150000000000000000e+02 6.749119559282232284e-02 +8.160000000000000000e+02 6.734650337930052355e-02 +8.170000000000000000e+02 6.720227461951526482e-02 +8.180000000000000000e+02 6.705850729236101371e-02 +8.190000000000000000e+02 6.691519938859687155e-02 +8.200000000000000000e+02 6.677234891074584899e-02 +8.210000000000000000e+02 6.662995387300783834e-02 +8.220000000000000000e+02 6.648801230115966576e-02 +8.230000000000000000e+02 6.634652223246935432e-02 +8.240000000000000000e+02 6.620548171560201867e-02 +8.250000000000000000e+02 6.606488881053071416e-02 +8.260000000000000000e+02 6.592474158844759125e-02 +8.270000000000000000e+02 6.578503813167710379e-02 +8.280000000000000000e+02 6.564577653358878717e-02 +8.290000000000000000e+02 6.550695489850784370e-02 +8.300000000000000000e+02 6.536857134163538696e-02 +8.310000000000000000e+02 6.523062398895929093e-02 +8.320000000000000000e+02 6.509311097717457306e-02 +8.330000000000000000e+02 6.495603045359808758e-02 +8.340000000000000000e+02 6.481938057608727100e-02 +8.350000000000000000e+02 6.468315951296153832e-02 +8.360000000000000000e+02 6.454736544291815592e-02 +8.370000000000000000e+02 6.441199655495803700e-02 +8.380000000000000000e+02 6.427705104830210014e-02 +8.390000000000000000e+02 6.414252713231743952e-02 +8.400000000000000000e+02 6.400842302644024762e-02 +8.410000000000000000e+02 6.387473696009483837e-02 +8.420000000000000000e+02 6.374146717262732520e-02 +8.430000000000000000e+02 6.360861191322132735e-02 +8.440000000000000000e+02 6.347616944083175894e-02 +8.450000000000000000e+02 6.334413802410918115e-02 +8.460000000000000000e+02 6.321251594132408502e-02 +8.470000000000000000e+02 6.308130148030240136e-02 +8.480000000000000000e+02 6.295049293834584225e-02 +8.490000000000000000e+02 6.282008862216974243e-02 +8.500000000000000000e+02 6.269008684783013152e-02 +8.510000000000000000e+02 6.256048594065226343e-02 +8.520000000000000000e+02 6.243128423516935283e-02 +8.530000000000000000e+02 6.230248007504667063e-02 +8.540000000000000000e+02 6.217407181302170988e-02 +8.550000000000000000e+02 6.204605781083433191e-02 +8.560000000000000000e+02 6.191843643916138812e-02 +8.570000000000000000e+02 6.179120607755436700e-02 +8.580000000000000000e+02 6.166436511437235757e-02 +8.590000000000000000e+02 6.153791194671959230e-02 +8.600000000000000000e+02 6.141184498038079059e-02 +8.610000000000000000e+02 6.128616262976280260e-02 +8.620000000000000000e+02 6.116086331782810692e-02 +8.630000000000000000e+02 6.103594547603619774e-02 +8.640000000000000000e+02 6.091140754428196052e-02 +8.650000000000000000e+02 6.078724797083638609e-02 +8.660000000000000000e+02 6.066346521228518224e-02 +8.670000000000000000e+02 6.054005773347347769e-02 +8.680000000000000000e+02 6.041702400744229651e-02 +8.690000000000000000e+02 6.029436251537583641e-02 +8.700000000000000000e+02 6.017207174654047586e-02 +8.710000000000000000e+02 6.005015019822931843e-02 +8.720000000000000000e+02 5.992859637570507186e-02 +8.730000000000000000e+02 5.980740879214777039e-02 +8.740000000000000000e+02 5.968658596859374027e-02 +8.750000000000000000e+02 5.956612643388636830e-02 +8.760000000000000000e+02 5.944602872461682980e-02 +8.770000000000000000e+02 5.932629138507602290e-02 +8.780000000000000000e+02 5.920691296719701041e-02 +8.790000000000000000e+02 5.908789203050245076e-02 +8.800000000000000000e+02 5.896922714205522775e-02 +8.810000000000000000e+02 5.885091687640416069e-02 +8.820000000000000000e+02 5.873295981553382922e-02 +8.830000000000000000e+02 5.861535454881306589e-02 +8.840000000000000000e+02 5.849809967294432311e-02 +8.850000000000000000e+02 5.838119379191560043e-02 +8.860000000000000000e+02 5.826463551694777143e-02 +8.870000000000000000e+02 5.814842346644778087e-02 +8.880000000000000000e+02 5.803255626596106470e-02 +8.890000000000000000e+02 5.791703254812029245e-02 +8.900000000000000000e+02 5.780185095260030603e-02 +8.910000000000000000e+02 5.768701012606759770e-02 +8.920000000000000000e+02 5.757250872213757337e-02 +8.930000000000000000e+02 5.745834540132586238e-02 +8.940000000000000000e+02 5.734451883100093877e-02 +8.950000000000000000e+02 5.723102768533962909e-02 +8.960000000000000000e+02 5.711787064528337649e-02 +8.970000000000000000e+02 5.700504639849190286e-02 +8.980000000000000000e+02 5.689255363929695414e-02 +8.990000000000000000e+02 5.678039106866154123e-02 +9.000000000000000000e+02 5.666855739413403925e-02 +9.010000000000000000e+02 5.655705132980475697e-02 +9.020000000000000000e+02 5.644587159626474060e-02 +9.030000000000000000e+02 5.633501692056052529e-02 +9.040000000000000000e+02 5.622448603615591567e-02 +9.050000000000000000e+02 5.611427768288385770e-02 +9.060000000000000000e+02 5.600439060691189685e-02 +9.070000000000000000e+02 5.589482356069510466e-02 +9.080000000000000000e+02 5.578557530293885847e-02 +9.090000000000000000e+02 5.567664459855761749e-02 +9.100000000000000000e+02 5.556803021863365027e-02 +9.110000000000000000e+02 5.545973094037940504e-02 +9.120000000000000000e+02 5.535174554709338529e-02 +9.130000000000000000e+02 5.524407282812886927e-02 +9.140000000000000000e+02 5.513671157884629526e-02 +9.150000000000000000e+02 5.502966060058165493e-02 +9.160000000000000000e+02 5.492291870060433956e-02 +9.170000000000000000e+02 5.481648469208057900e-02 +9.180000000000000000e+02 5.471035739403662390e-02 +9.190000000000000000e+02 5.460453563132046384e-02 +9.200000000000000000e+02 5.449901823456317074e-02 +9.210000000000000000e+02 5.439380404014901305e-02 +9.220000000000000000e+02 5.428889189017009620e-02 +9.230000000000000000e+02 5.418428063239608822e-02 +9.240000000000000000e+02 5.407996912023766561e-02 +9.250000000000000000e+02 5.397595621270976501e-02 +9.260000000000000000e+02 5.387224077439715930e-02 +9.270000000000000000e+02 5.376882167542018642e-02 +9.280000000000000000e+02 5.366569779140005492e-02 +9.290000000000000000e+02 5.356286800342188043e-02 +9.300000000000000000e+02 5.346033119800532030e-02 +9.310000000000000000e+02 5.335808626706761704e-02 +9.320000000000000000e+02 5.325613210788914670e-02 +9.330000000000000000e+02 5.315446762308459472e-02 +9.340000000000000000e+02 5.305309172056539568e-02 +9.350000000000000000e+02 5.295200331351098549e-02 +9.360000000000000000e+02 5.285120132033131746e-02 +9.370000000000000000e+02 5.275068466464050143e-02 +9.380000000000000000e+02 5.265045227522070770e-02 +9.390000000000000000e+02 5.255050308599330117e-02 +9.400000000000000000e+02 5.245083603598438282e-02 +9.410000000000000000e+02 5.235145006929694395e-02 +9.420000000000000000e+02 5.225234413507608144e-02 +9.430000000000000000e+02 5.215351718748354598e-02 +9.440000000000000000e+02 5.205496818566268669e-02 +9.450000000000000000e+02 5.195669609370881514e-02 +9.460000000000000000e+02 5.185869988064253228e-02 +9.470000000000000000e+02 5.176097852037665065e-02 +9.480000000000000000e+02 5.166353099168728008e-02 +9.490000000000000000e+02 5.156635627818639822e-02 +9.500000000000000000e+02 5.146945336829008427e-02 +9.510000000000000000e+02 5.137282125519330306e-02 +9.520000000000000000e+02 5.127645893683676487e-02 +9.530000000000000000e+02 5.118036541588092542e-02 +9.540000000000000000e+02 5.108453969968018010e-02 +9.550000000000000000e+02 5.098898080025093121e-02 +9.560000000000000000e+02 5.089368773424415848e-02 +9.570000000000000000e+02 5.079865952292122316e-02 +9.580000000000000000e+02 5.070389519212406548e-02 +9.590000000000000000e+02 5.060939377224725477e-02 +9.600000000000000000e+02 5.051515429821440417e-02 +9.610000000000000000e+02 5.042117580944818767e-02 +9.620000000000000000e+02 5.032745734984433311e-02 +9.630000000000000000e+02 5.023399796774737081e-02 +9.640000000000000000e+02 5.014079671592251708e-02 +9.650000000000000000e+02 5.004785265153038898e-02 +9.660000000000000000e+02 4.995516483610217690e-02 +9.670000000000000000e+02 4.986273233551228451e-02 +9.680000000000000000e+02 4.977055421995346673e-02 +9.690000000000000000e+02 4.967862956391449342e-02 +9.700000000000000000e+02 4.958695744614960432e-02 +9.710000000000000000e+02 4.949553694966054435e-02 +9.720000000000000000e+02 4.940436716166575482e-02 +9.730000000000000000e+02 4.931344717357958457e-02 +9.740000000000000000e+02 4.922277608098767077e-02 +9.750000000000000000e+02 4.913235298362070291e-02 +9.760000000000000000e+02 4.904217698533338415e-02 +9.770000000000000000e+02 4.895224719407928471e-02 +9.780000000000000000e+02 4.886256272188840150e-02 +9.790000000000000000e+02 4.877312268483927071e-02 +9.800000000000000000e+02 4.868392620304506924e-02 +9.810000000000000000e+02 4.859497240061909362e-02 +9.820000000000000000e+02 4.850626040566254071e-02 +9.830000000000000000e+02 4.841778935023247771e-02 +9.840000000000000000e+02 4.832955837032919255e-02 +9.850000000000000000e+02 4.824156660586283174e-02 +9.860000000000000000e+02 4.815381320064161114e-02 +9.870000000000000000e+02 4.806629730233984849e-02 +9.880000000000000000e+02 4.797901806248633383e-02 +9.890000000000000000e+02 4.789197463643337510e-02 +9.900000000000000000e+02 4.780516618334321177e-02 +9.910000000000000000e+02 4.771859186615777515e-02 +9.920000000000000000e+02 4.763225085158701716e-02 +9.930000000000000000e+02 4.754614231007906616e-02 +9.940000000000000000e+02 4.746026541580609936e-02 +9.950000000000000000e+02 4.737461934663952240e-02 +9.960000000000000000e+02 4.728920328412990204e-02 +9.970000000000000000e+02 4.720401641348708627e-02 +9.980000000000000000e+02 4.711905792356008843e-02 +9.990000000000000000e+02 4.703432700681647177e-02 +1.000000000000000000e+03 4.694982285932213645e-02 +1.001000000000000000e+03 4.686554468072069018e-02 +1.002000000000000000e+03 4.678149167421420673e-02 +1.003000000000000000e+03 4.669766304654451861e-02 +1.004000000000000000e+03 4.661405800797140814e-02 +1.005000000000000000e+03 4.653067577225675905e-02 +1.006000000000000000e+03 4.644751555664054787e-02 +1.007000000000000000e+03 4.636457658182494695e-02 +1.008000000000000000e+03 4.628185807195582535e-02 +1.009000000000000000e+03 4.619935925460127296e-02 +1.010000000000000000e+03 4.611707936073305286e-02 +1.011000000000000000e+03 4.603501762471245290e-02 +1.012000000000000000e+03 4.595317328426416076e-02 +1.013000000000000000e+03 4.587154558046479397e-02 +1.014000000000000000e+03 4.579013375772208322e-02 +1.015000000000000000e+03 4.570893706375506876e-02 +1.016000000000000000e+03 4.562795474957732911e-02 +1.017000000000000000e+03 4.554718606948134074e-02 +1.018000000000000000e+03 4.546663028101787657e-02 +1.019000000000000000e+03 4.538628664497876969e-02 +1.020000000000000000e+03 4.530615442537974658e-02 +1.021000000000000000e+03 4.522623288944378761e-02 +1.022000000000000000e+03 4.514652130758237819e-02 +1.023000000000000000e+03 4.506701895338031255e-02 +1.024000000000000000e+03 4.498772510357602894e-02 +1.025000000000000000e+03 4.490863903804732243e-02 +1.026000000000000000e+03 4.482976003979229768e-02 +1.027000000000000000e+03 4.475108739491331922e-02 +1.028000000000000000e+03 4.467262039260247453e-02 +1.029000000000000000e+03 4.459435832512118059e-02 +1.030000000000000000e+03 4.451630048778755511e-02 +1.031000000000000000e+03 4.443844617895682109e-02 +1.032000000000000000e+03 4.436079470000889313e-02 +1.033000000000000000e+03 4.428334535532755384e-02 +1.034000000000000000e+03 4.420609745229023280e-02 +1.035000000000000000e+03 4.412905030124629480e-02 +1.036000000000000000e+03 4.405220321550581963e-02 +1.037000000000000000e+03 4.397555551132076995e-02 +1.038000000000000000e+03 4.389910650787198082e-02 +1.039000000000000000e+03 4.382285552725249944e-02 +1.040000000000000000e+03 4.374680189445174366e-02 +1.041000000000000000e+03 4.367094493734085398e-02 +1.042000000000000000e+03 4.359528398665875326e-02 +1.043000000000000000e+03 4.351981837599327302e-02 +1.044000000000000000e+03 4.344454744177256300e-02 +1.045000000000000000e+03 4.336947052324281043e-02 +1.046000000000000000e+03 4.329458696245927496e-02 +1.047000000000000000e+03 4.321989610426901773e-02 +1.048000000000000000e+03 4.314539729629629505e-02 +1.049000000000000000e+03 4.307108988892886792e-02 +1.050000000000000000e+03 4.299697323530446424e-02 +1.051000000000000000e+03 4.292304669129345940e-02 +1.052000000000000000e+03 4.284930961548822498e-02 +1.053000000000000000e+03 4.277576136918651711e-02 +1.054000000000000000e+03 4.270240131637885461e-02 +1.055000000000000000e+03 4.262922882373330891e-02 +1.056000000000000000e+03 4.255624326058293772e-02 +1.057000000000000000e+03 4.248344399891215012e-02 +1.058000000000000000e+03 4.241083041334093445e-02 +1.059000000000000000e+03 4.233840188111369363e-02 +1.060000000000000000e+03 4.226615778208513835e-02 +1.061000000000000000e+03 4.219409749870575016e-02 +1.062000000000000000e+03 4.212222041601004080e-02 +1.063000000000000000e+03 4.205052592160153646e-02 +1.064000000000000000e+03 4.197901340564186290e-02 +1.065000000000000000e+03 4.190768226083528558e-02 +1.066000000000000000e+03 4.183653188241730214e-02 +1.067000000000000000e+03 4.176556166814170828e-02 +1.068000000000000000e+03 4.169477101826717796e-02 +1.069000000000000000e+03 4.162415933554438480e-02 +1.070000000000000000e+03 4.155372602520363695e-02 +1.071000000000000000e+03 4.148347049494242877e-02 +1.072000000000000000e+03 4.141339215491256914e-02 +1.073000000000000000e+03 4.134349041770881555e-02 +1.074000000000000000e+03 4.127376469835493389e-02 +1.075000000000000000e+03 4.120421441429165943e-02 +1.076000000000000000e+03 4.113483898536566402e-02 +1.077000000000000000e+03 4.106563783381777383e-02 +1.078000000000000000e+03 4.099661038426729437e-02 +1.079000000000000000e+03 4.092775606370514102e-02 +1.080000000000000000e+03 4.085907430147769220e-02 +1.081000000000000000e+03 4.079056452927744270e-02 +1.082000000000000000e+03 4.072222618113039566e-02 +1.083000000000000000e+03 4.065405869338484246e-02 +1.084000000000000000e+03 4.058606150469744323e-02 +1.085000000000000000e+03 4.051823405602600348e-02 +1.086000000000000000e+03 4.045057579061465958e-02 +1.087000000000000000e+03 4.038308615398251977e-02 +1.088000000000000000e+03 4.031576459391483097e-02 +1.089000000000000000e+03 4.024861056044839319e-02 +1.090000000000000000e+03 4.018162350586326065e-02 +1.091000000000000000e+03 4.011480288466880151e-02 +1.092000000000000000e+03 4.004814815359631491e-02 +1.093000000000000000e+03 3.998165877158500747e-02 +1.094000000000000000e+03 3.991533419976994040e-02 +1.095000000000000000e+03 3.984917390147672128e-02 +1.096000000000000000e+03 3.978317734220530866e-02 +1.097000000000000000e+03 3.971734398962056128e-02 +1.098000000000000000e+03 3.965167331354341879e-02 +1.099000000000000000e+03 3.958616478593766919e-02 From 7b1363bf7d56f076219b5145970a6ca9be185908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 7 Mar 2024 15:41:23 +0100 Subject: [PATCH 076/161] enlarge boundaries for next diffraction order footprints, free shift_y and angle but polynomial coefficients --- spectractor/fit/fit_spectrogram.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index 2a3d8b352..b4efef70c 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -98,6 +98,10 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, fixed[k] = True for k, par in enumerate(input_labels): if "y_c" in par: + fixed[k] = True + p[k] = 0 + for k, par in enumerate(input_labels): + if "y_c" in par and (("y_c_0" not in par and "y_c_1" not in par) or (par[-2:] == "_2" or par[-2:]=="_3")): fixed[k] = False p[k] = 0 @@ -110,8 +114,8 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, if "A3" in params.labels: params.fixed[params.get_index(f"A{self.diffraction_orders[2]}")] = "A3_T" not in self.spectrum.header params.fixed[params.get_index(r"shift_x [pix]")] = True # Delta x - params.fixed[params.get_index(r"shift_y [pix]")] = True # Delta y - params.fixed[params.get_index(r"angle [deg]")] = True # angle + params.fixed[params.get_index(r"shift_y [pix]")] = False # Delta y + params.fixed[params.get_index(r"angle [deg]")] = False # angle params.fixed[params.get_index("B")] = True # B FitWorkspace.__init__(self, params, verbose=verbose, plot=plot, live_fit=live_fit, file_name=self.filename) @@ -238,6 +242,10 @@ def set_mask(self, params=None): psf_cube_masked = self.spectrum.chromatic_psf.convolve_psf_cube_masked(psf_cube_masked) # make rectangular mask per wavelength self.spectrogram_simulation.boundaries[order], self.spectrogram_simulation.psf_cubes_masked[order] = self.spectrum.chromatic_psf.set_rectangular_boundaries(psf_cube_masked) + if k > 0: + # spectrogram model must be accurate inside the k=0 order footprint: enlarge the next order footprints + self.spectrogram_simulation.boundaries[order]["ymin"] = np.zeros_like(self.spectrogram_simulation.boundaries[order]["ymin"]) + self.spectrogram_simulation.boundaries[order]["ymax"] = self.Ny * np.ones_like(self.spectrogram_simulation.boundaries[order]["ymax"]) self.spectrogram_simulation.psf_cube_sparse_indices[order], self.spectrogram_simulation.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(self.spectrogram_simulation.boundaries[order]) mask = np.sum(self.spectrogram_simulation.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], self.spectrogram_simulation.pixels[0].size), axis=0) == 0 # cumulate the boolean values as int From e70f5e184fb1737d62c6412c6d00cd745da91f23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 8 Mar 2024 17:17:40 +0100 Subject: [PATCH 077/161] set_bounds adapted to polynomial parametrisation --- spectractor/extractor/chromaticpsf.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index 4705b7646..e8b3d51da 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -1374,17 +1374,29 @@ def from_profile_params_to_shape_params(self, profile_params): def set_bounds(self): """ This function returns an array of bounds for PSF polynomial parameters (no amplitude ones). - It is very touchy, change the values with caution ! Returns ------- bounds: list 2D array containing the pair of bounds for each polynomial parameters. + Examples + ________ + >>> psf = MoffatGauss() + >>> s = ChromaticPSF(psf, Nx=100, Ny=100, deg=4, saturation=8000) + >>> s.set_bounds() # doctest: +ELLIPSIS + [array([-inf, inf]), array([-inf, inf]), ... + """ bounds = [[], []] for k, name in enumerate(self.psf.params.labels): - tmp_bounds = [[-np.inf] * (1 + self.degrees[name]), [np.inf] * (1 + self.degrees[name])] + if parameters.PSF_POLY_TYPE == "legendre": + tmp_bounds = [[-np.inf] * (1 + self.degrees[name]), [np.inf] * (1 + self.degrees[name])] + elif parameters.PSF_POLY_TYPE == "polynomial": + tmp_bounds = [[self.psf.params.bounds[k][0]] + [-np.inf] * (self.degrees[name]), + [self.psf.params.bounds[k][1]] + [np.inf] * (self.degrees[name])] + else: + raise ValueError(f"Unknown polynomial type {parameters.PSF_POLY_TYPE=}.") if name == "saturation": tmp_bounds = [[0], [2 * self.saturation]] elif name == "amplitude": From 96002153a29a7f585fa3c826d536f96fd58aa610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 8 Mar 2024 17:17:50 +0100 Subject: [PATCH 078/161] set_bounds adapted to polynomial parametrisation --- spectractor/extractor/chromaticpsf.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index e8b3d51da..df3708ad4 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -1962,9 +1962,10 @@ def __init__(self, chromatic_psf, data, data_errors, mode, bgd_model_func=None, self.psf_cube_masked = None self.M_sparse_indices = None - # update the bounds - self.chromatic_psf.psf.apply_max_width_to_bounds(max_half_width=self.Ny) - self.params.bounds = self.chromatic_psf.set_bounds() + # update the bounds only for 2D mode + if mode == "2D": + self.chromatic_psf.psf.apply_max_width_to_bounds(max_half_width=self.Ny) + self.params.bounds = self.chromatic_psf.set_bounds() # error matrix # here image uncertainties are assumed to be uncorrelated From 98ce0fcfa2893a02ea3775922035d0da897a94d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 8 Mar 2024 17:18:12 +0100 Subject: [PATCH 079/161] cancel A3 --- spectractor/extractor/extractor.py | 2 +- spectractor/fit/fit_spectrogram.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index f22354fad..62045d37c 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -64,7 +64,7 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p spectrum.chromatic_psf.psf.apply_max_width_to_bounds(max_half_width=spectrum.spectrogram_Ny) psf_poly_params_bounds = spectrum.chromatic_psf.set_bounds() D2CCD = np.copy(spectrum.header['D2CCD']) - p = np.array([1, 1, 1, D2CCD, np.copy(spectrum.header['PIXSHIFT']), 0, + p = np.array([1, 1, 0, D2CCD, np.copy(spectrum.header['PIXSHIFT']), 0, np.copy(spectrum.rotation_angle), 1, 1, parameters.OBS_CAMERA_ROTATION, np.copy(spectrum.pressure), np.copy(spectrum.temperature), np.copy(spectrum.airmass)]) self.psf_params_start_index = np.array([p.size + len(self.psf_poly_params) * k for k in range(len(self.diffraction_orders))]) diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index b4efef70c..1b4887efd 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -68,7 +68,7 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, self.spectrum.chromatic_psf.psf.apply_max_width_to_bounds(max_half_width=self.spectrum.spectrogram_Ny) self.saturation = self.spectrum.spectrogram_saturation D2CCD = np.copy(spectrum.header['D2CCD']) - p = np.array([1, 1, 1, 0.05, 1.2, 400, 5, D2CCD, self.spectrum.header['PIXSHIFT'], + p = np.array([1, 1, 0, 0.05, 1.2, 400, 5, D2CCD, self.spectrum.header['PIXSHIFT'], 0, self.spectrum.rotation_angle, 1, 1]) # parameter indices for which we don't need to recompute the PSF cube for model evaluation self.fixed_psf_params = np.array([0, 1, 2, 3, 4, 5, 6, 9, 10]) From 97d10e602b805e8c33983acc09b7d0fbbf4289c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 8 Mar 2024 17:18:51 +0100 Subject: [PATCH 080/161] fix only y_c_0_1 and y_c_1_1 --- spectractor/extractor/extractor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 62045d37c..402224334 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -97,7 +97,7 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p fixed[k] = True p[k] = 0 for k, par in enumerate(input_labels): - if "y_c" in par and "y_c_0" not in par and "y_c_1" not in par: + if "y_c" in par and (("y_c_0" not in par and "y_c_1" not in par) or (par[-2:] == "_2" or par[-2:]=="_3")): fixed[k] = False p[k] = 0 From 542175c01dde292316b5a2000a1a16e035fb257d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 8 Mar 2024 17:20:08 +0100 Subject: [PATCH 081/161] more robust way to save LBDAS_T and AMPLI_T --- spectractor/extractor/extractor.py | 6 +++--- spectractor/fit/fit_spectrogram.py | 6 +++--- spectractor/simulation/image_simulation.py | 6 +++--- tests/test_fullchain.py | 12 ++++++------ 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 402224334..2a3c59c37 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1630,11 +1630,11 @@ def run_spectrogram_deconvolution_psf2d(spectrum, bgd_model_func): def plot_comparison_truth(spectrum, w): # pragma: no cover s = spectrum.chromatic_psf - lambdas_truth = np.fromstring(spectrum.header['LBDAS_T'][1:-1], sep=' ') - psf_poly_truth = np.fromstring(spectrum.header['PSF_P_T'][1:-1], sep=' ', dtype=float) + lambdas_truth = np.fromstring(spectrum.header['LBDAS_T'][1:-1], sep=',') + psf_poly_truth = np.fromstring(spectrum.header['PSF_P_T'][1:-1], sep=',', dtype=float) deg_truth = int(spectrum.header["PSF_DEG"]) psf_poly_truth[-1] = spectrum.spectrogram_saturation - amplitude_truth = np.fromstring(spectrum.header['AMPLIS_T'][1:-1], sep=' ', dtype=float) + amplitude_truth = np.fromstring(spectrum.header['AMPLIS_T'][1:-1], sep=',', dtype=float) amplitude_truth *= parameters.FLAM_TO_ADURATE * lambdas_truth * np.gradient(lambdas_truth) * parameters.CCD_REBIN s0 = ChromaticPSF(s.psf, lambdas_truth.size, s.Ny, deg=deg_truth, saturation=spectrum.spectrogram_saturation) diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index 1b4887efd..256a76d48 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -279,11 +279,11 @@ def get_spectrogram_truth(self): rotation_angle = self.spectrum.header['ROT_T'] B = 1 Astar = 1 - poly_truth = np.fromstring(self.spectrum.header['PSF_P_T'][1:-1], sep=' ', dtype=float) + poly_truth = np.fromstring(self.spectrum.header['PSF_P_T'][1:-1], sep=',', dtype=float) self.truth = (A1_truth, A2_truth, A3_truth, aerosols_truth, ozone_truth, pwv_truth, D_truth, shiftx_truth, shifty_truth, rotation_angle, B, Astar, *poly_truth) - self.lambdas_truth = np.fromstring(self.spectrum.header['LBDAS_T'][1:-1], sep=' ', dtype=float) - self.amplitude_truth = np.fromstring(self.spectrum.header['AMPLIS_T'][1:-1], sep=' ', dtype=float) + self.lambdas_truth = np.fromstring(self.spectrum.header['LBDAS_T'][1:-1], sep=',', dtype=float) + self.amplitude_truth = np.fromstring(self.spectrum.header['AMPLIS_T'][1:-1], sep=',', dtype=float) else: self.truth = None diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index c6b3392bb..93d3990ef 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -648,9 +648,9 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer psf_poly_params_truth = np.array(psf_poly_params) if psf_poly_params_truth.size > spectrum.spectrogram_Nx: psf_poly_params_truth = psf_poly_params_truth[spectrum.spectrogram_Nx:] - image.header['LBDAS_T'] = np.array_str(true_lambdas, max_line_width=1000000, precision=2) - image.header['AMPLIS_T'] = np.array_str(true_spectrum, max_line_width=1000000, precision=2) - image.header['PSF_P_T'] = np.array_str(psf_poly_params_truth, max_line_width=1000000, precision=4) + image.header['LBDAS_T'] = str(np.round(true_lambdas, decimals=2).tolist()) + image.header['AMPLIS_T'] = str(true_spectrum.tolist()) + image.header['PSF_P_T'] = str(psf_poly_params_truth.tolist()) image.save_image(output_filename, overwrite=True) return image diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index e0689b1e2..f64284dc7 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -65,8 +65,8 @@ def plot_residuals(spectrum, lambdas_truth, amplitude_truth): >>> from spectractor.extractor.spectrum import Spectrum >>> image = Image("./tests/data/sim_20170530_134.fits") >>> spectrum = Spectrum("./tests/data/sim_20170530_134_spectrum.fits") - >>> lambdas_truth = np.fromstring(image.header['LBDAS_T'][1:-1], sep=' ') - >>> amplitude_truth = np.fromstring(image.header['AMPLIS_T'][1:-1], sep=' ', dtype=float)[:lambdas_truth.size] + >>> lambdas_truth = np.fromstring(image.header['LBDAS_T'][1:-1], sep=',') + >>> amplitude_truth = np.fromstring(image.header['AMPLIS_T'][1:-1], sep=',', dtype=float)[:lambdas_truth.size] >>> plot_residuals(spectrum, lambdas_truth, amplitude_truth) #doctest: +ELLIPSIS array([... """ @@ -128,8 +128,8 @@ def test_ctio_fullchain(): # if not os.path.isfile(sim_image_filename): sim = make_image() image = Image(sim_image_filename, config="./config/ctio.ini") - lambdas_truth = np.fromstring(image.header['LBDAS_T'][1:-1], sep=' ') - amplitude_truth = np.fromstring(image.header['AMPLIS_T'][1:-1], sep=' ', dtype=float) + lambdas_truth = np.fromstring(image.header['LBDAS_T'][1:-1], sep=',') + amplitude_truth = np.fromstring(image.header['AMPLIS_T'][1:-1], sep=',', dtype=float) parameters.AMPLITUDE_TRUTH = np.copy(amplitude_truth) parameters.LAMBDA_TRUTH = np.copy(lambdas_truth) @@ -258,8 +258,8 @@ def auxtel_fullchain(): # if not os.path.isfile(sim_image_filename): sim = make_auxtel_image() image = Image(sim_image_filename, config="./config/auxtel.ini") - lambdas_truth = np.fromstring(image.header['LBDAS_T'][1:-1], sep=' ') - amplitude_truth = np.fromstring(image.header['AMPLIS_T'][1:-1], sep=' ', dtype=float) + lambdas_truth = np.fromstring(image.header['LBDAS_T'][1:-1], sep=',') + amplitude_truth = np.fromstring(image.header['AMPLIS_T'][1:-1], sep=',', dtype=float) parameters.AMPLITUDE_TRUTH = np.copy(amplitude_truth) parameters.LAMBDA_TRUTH = np.copy(lambdas_truth) From 273010841090c3e445cf287294ac161f3e212dae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 8 Mar 2024 17:21:04 +0100 Subject: [PATCH 082/161] fix shift_y and angle but fit all y_c parameters (works better for fit_spectrogram than FFM) --- spectractor/fit/fit_spectrogram.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index 256a76d48..74defb279 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -98,10 +98,6 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, fixed[k] = True for k, par in enumerate(input_labels): if "y_c" in par: - fixed[k] = True - p[k] = 0 - for k, par in enumerate(input_labels): - if "y_c" in par and (("y_c_0" not in par and "y_c_1" not in par) or (par[-2:] == "_2" or par[-2:]=="_3")): fixed[k] = False p[k] = 0 @@ -114,8 +110,8 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, if "A3" in params.labels: params.fixed[params.get_index(f"A{self.diffraction_orders[2]}")] = "A3_T" not in self.spectrum.header params.fixed[params.get_index(r"shift_x [pix]")] = True # Delta x - params.fixed[params.get_index(r"shift_y [pix]")] = False # Delta y - params.fixed[params.get_index(r"angle [deg]")] = False # angle + params.fixed[params.get_index(r"shift_y [pix]")] = True # Delta y + params.fixed[params.get_index(r"angle [deg]")] = True # angle params.fixed[params.get_index("B")] = True # B FitWorkspace.__init__(self, params, verbose=verbose, plot=plot, live_fit=live_fit, file_name=self.filename) From 8c8e4a7583aae09fbda27bd22615c3166a916761 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 8 Mar 2024 17:21:27 +0100 Subject: [PATCH 083/161] allow for negative y_c values with bounds --- spectractor/extractor/psf.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spectractor/extractor/psf.py b/spectractor/extractor/psf.py index b8de4f9c0..23654458b 100644 --- a/spectractor/extractor/psf.py +++ b/spectractor/extractor/psf.py @@ -1194,7 +1194,7 @@ def __init__(self, values=None, clip=False): def apply_max_width_to_bounds(self, max_half_width=None): if max_half_width is not None: self.max_half_width = max_half_width - self.params.bounds[2] = (0, 2 * self.max_half_width) + self.params.bounds[2] = (-2 * self.max_half_width, 2 * self.max_half_width) self.params.bounds[3] = (0.5, self.max_half_width) def evaluate(self, pixels, values=None): @@ -1390,7 +1390,7 @@ def __init__(self, values=None, clip=False): def apply_max_width_to_bounds(self, max_half_width=None): if max_half_width is not None: self.max_half_width = max_half_width - self.params.bounds[2] = (0, 2 * self.max_half_width) + self.params.bounds[2] = (-2 * self.max_half_width, 2 * self.max_half_width) self.params.bounds[3] = (1, self.max_half_width) def evaluate(self, pixels, values=None): @@ -1563,7 +1563,7 @@ def __init__(self, values=None, clip=False): def apply_max_width_to_bounds(self, max_half_width=None): if max_half_width is not None: self.max_half_width = max_half_width - self.params.bounds[2] = (0, 2 * self.max_half_width) + self.params.bounds[2] = (-2 * self.max_half_width, 2 * self.max_half_width) self.params.bounds[3] = (0.5, self.max_half_width) self.params.bounds[6] = (0.5, self.max_half_width) @@ -1769,7 +1769,7 @@ def func(x, y, amplitude, x_c, y_c, gamma): def apply_max_width_to_bounds(self, max_half_width=None): if max_half_width is not None: self.max_half_width = max_half_width - self.params.bounds[2] = (0, 2 * self.max_half_width) + self.params.bounds[2] = (-2 * self.max_half_width, 2 * self.max_half_width) def evaluate(self, pixels, values=None): r"""Evaluate the Order 0 interpolated function. From fb6573c921cb302383631a1d2567bd5845b87f50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 8 Mar 2024 17:01:24 +0000 Subject: [PATCH 084/161] initialize bounds for chromaticpsf1d --- spectractor/extractor/chromaticpsf.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index df3708ad4..e8b3d51da 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -1962,10 +1962,9 @@ def __init__(self, chromatic_psf, data, data_errors, mode, bgd_model_func=None, self.psf_cube_masked = None self.M_sparse_indices = None - # update the bounds only for 2D mode - if mode == "2D": - self.chromatic_psf.psf.apply_max_width_to_bounds(max_half_width=self.Ny) - self.params.bounds = self.chromatic_psf.set_bounds() + # update the bounds + self.chromatic_psf.psf.apply_max_width_to_bounds(max_half_width=self.Ny) + self.params.bounds = self.chromatic_psf.set_bounds() # error matrix # here image uncertainties are assumed to be uncorrelated From afec03f4f571e6e10e27a45d8de003707c55d031 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 14 Mar 2024 11:38:26 +0100 Subject: [PATCH 085/161] rescale abscissa x for polynoms event when they are canonical (better control on bounds) --- spectractor/extractor/chromaticpsf.py | 30 +++++---------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index e8b3d51da..50b750a46 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -889,12 +889,7 @@ def build_psf_jacobian(self, pixels, profile_params, psf_cube_sparse_indices, bo if Nx != profile_params.shape[0]: raise ValueError(f"Number of pixels along x axis must be same as profile_params table length. " f"Got {Nx=} and {profile_params.shape}.") - if parameters.PSF_POLY_TYPE == "legendre": - poly_x = np.linspace(-1, 1, Nx) - elif parameters.PSF_POLY_TYPE == "polynomial": - poly_x = np.arange(0, Nx) - else: - raise ValueError(f"Unknown polynomial type {parameters.PSF_POLY_TYPE=}.") + poly_x = np.linspace(-1, 1, Nx) polys = np.zeros((self.n_poly_params-Nx, Nx), dtype=dtype) ip = 0 repeats = [] @@ -989,12 +984,7 @@ def build_sparse_dM(self, pixels, profile_params, M_sparse_indices, boundaries, if Nx != profile_params.shape[0]: raise ValueError(f"Number of pixels along x axis must be same as profile_params table length. " f"Got {Nx=} and {profile_params.shape}.") - if parameters.PSF_POLY_TYPE == "legendre": - poly_x = np.linspace(-1, 1, Nx) - elif parameters.PSF_POLY_TYPE == "polynomial": - poly_x = np.arange(0, Nx) - else: - raise ValueError(f"Unknown polynomial type {parameters.PSF_POLY_TYPE=}.") + poly_x = np.linspace(-1, 1, Nx) polys = np.zeros((self.n_poly_params-Nx, Nx), dtype=dtype) ip = 0 repeats = [] @@ -1148,12 +1138,7 @@ def from_profile_params_to_poly_params(self, profile_params, indices=None): if amplitude is None: self.my_logger.warning('\n\tAmplitude array not initialized. ' 'Polynomial fit for shape parameters will be unweighted.') - if parameters.PSF_POLY_TYPE == "legendre": - poly_x = np.linspace(-1, 1, len(self.table))[indices] - elif parameters.PSF_POLY_TYPE == "polynomial": - poly_x = np.arange(0, len(self.table))[indices] - else: - raise ValueError(f"Unknown polynomial type {parameters.PSF_POLY_TYPE=}.") + poly_x = np.linspace(-1, 1, len(self.table))[indices] for k, name in enumerate(self.psf.params.labels): delta = 0 if name != 'amplitude': @@ -1291,12 +1276,7 @@ def from_poly_params_to_profile_params(self, poly_params, apply_bounds=False): """ length = len(self.table) - if parameters.PSF_POLY_TYPE == "legendre": - poly_x = np.linspace(-1, 1, length) - elif parameters.PSF_POLY_TYPE == "polynomial": - poly_x = np.arange(0, length) - else: - raise ValueError(f"Unknown polynomial type {parameters.PSF_POLY_TYPE=}.") + poly_x = np.linspace(-1, 1, length) profile_params = np.zeros((length, len(self.psf.params.labels))) shift = 0 for k, name in enumerate(self.psf.params.labels): @@ -1475,7 +1455,7 @@ def plot_summary(self, truth=None): if parameters.PSF_POLY_TYPE == "legendre": PSF_models.append(np.polynomial.polynomial.legval(rescale_x_to_legendre(all_pixels), coeffs) + delta) elif parameters.PSF_POLY_TYPE == "polynomial": - PSF_models.append(np.polynomial.polynomial.polyval(all_pixels, coeffs) + delta) + PSF_models.append(np.polynomial.polynomial.polyval(rescale_x_to_legendre(all_pixels), coeffs) + delta) for i, name in enumerate(self.psf.params.labels): p = ax.plot(all_pixels, self.profile_params[:, i], marker='+', linestyle='none') ax.plot(all_pixels[self.fitted_pixels], self.profile_params[self.fitted_pixels, i], label=name, From 5bda1fb746974787687e784a105c795cca3a9a06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 14 Mar 2024 11:41:02 +0100 Subject: [PATCH 086/161] fix wavelength evolution for PSF parameters of higher order diffraction spectra --- spectractor/extractor/extractor.py | 5 ++++- spectractor/fit/fit_spectrogram.py | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 2a3c59c37..9aae4d51c 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -97,9 +97,12 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p fixed[k] = True p[k] = 0 for k, par in enumerate(input_labels): - if "y_c" in par and (("y_c_0" not in par and "y_c_1" not in par) or (par[-2:] == "_2" or par[-2:]=="_3")): + if "y_c" in par and (("y_c_0" not in par and "y_c_1" not in par) or (par[-2:] == "_2" or par[-2:] == "_3")): fixed[k] = False p[k] = 0 + elif k >= self.psf_params_start_index[0] and "y_c" not in par and "x_c" not in par and par[-2:] != f"_{spectrum.order}" and "_0_" not in par: + fixed[k] = True + p[k] = 0 params = FitParameters(p, labels=input_labels, axis_names=axis_names, fixed=fixed, bounds=bounds, truth=truth, filename=spectrum.filename) diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index 74defb279..375551374 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -100,6 +100,10 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, if "y_c" in par: fixed[k] = False p[k] = 0 + for k, par in enumerate(input_labels): + if k >= self.psf_params_start_index[0] and "y_c" not in par and "x_c" not in par and par[-2:] != f"_{spectrum.order}" and "_0_" not in par: + fixed[k] = True + p[k] = 0 params = FitParameters(p, labels=input_labels, axis_names=axis_names, bounds=bounds, fixed=fixed, truth=truth, filename=self.filename) From 0b147770b679fa89cc85913a5f072758fb5ca224 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 14 Mar 2024 11:42:04 +0100 Subject: [PATCH 087/161] reorder paramaters to have all fixed psf parameters together --- spectractor/fit/fit_spectrogram.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index 375551374..588733532 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -68,29 +68,29 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, self.spectrum.chromatic_psf.psf.apply_max_width_to_bounds(max_half_width=self.spectrum.spectrogram_Ny) self.saturation = self.spectrum.spectrogram_saturation D2CCD = np.copy(spectrum.header['D2CCD']) - p = np.array([1, 1, 0, 0.05, 1.2, 400, 5, D2CCD, self.spectrum.header['PIXSHIFT'], - 0, self.spectrum.rotation_angle, 1, 1]) + p = np.array([1, 1, 0, 0.05, 1.2, 400, 5, 1, 1, D2CCD, self.spectrum.header['PIXSHIFT'], + 0, self.spectrum.rotation_angle]) # parameter indices for which we don't need to recompute the PSF cube for model evaluation - self.fixed_psf_params = np.array([0, 1, 2, 3, 4, 5, 6, 9, 10]) + # warning: they must be contiguous to preserve psf_cube in jacobian function loop + self.fixed_psf_params = np.arange(0, 9, dtype=int) self.psf_params_start_index = np.array([p.size + len(self.psf_poly_params) * k for k in range(len(self.diffraction_orders))]) psf_poly_params_labels = np.copy(self.spectrum.chromatic_psf.params.labels[length:]) psf_poly_params_names = np.copy(self.spectrum.chromatic_psf.params.axis_names[length:]) psf_poly_params_bounds = self.spectrum.chromatic_psf.set_bounds() p = np.concatenate([p] + [self.psf_poly_params] * len(self.diffraction_orders)) input_labels = [f"A{order}" for order in self.diffraction_orders] - input_labels += ["VAOD", "angstrom_exp", "ozone [db]", "PWV [mm]", r"D_CCD [mm]", - r"shift_x [pix]", r"shift_y [pix]", r"angle [deg]", "B", "A_star"] + input_labels += ["VAOD", "angstrom_exp", "ozone [db]", "PWV [mm]", "B", "A_star", + r"D_CCD [mm]", r"shift_x [pix]", r"shift_y [pix]", r"angle [deg]"] for order in self.diffraction_orders: input_labels += [label + f"_{order}" for label in psf_poly_params_labels] axis_names = [f"$A_{order}$" for order in self.diffraction_orders] - axis_names += ["VAOD", r'$\"a$', "ozone [db]", "PWV [mm]", r"$D_{CCD}$ [mm]", - r"$\Delta_{\mathrm{x}}$ [pix]", r"$\Delta_{\mathrm{y}}$ [pix]", r"$\theta$ [deg]", - "$B$", r"$A_{star}$"] + axis_names += ["VAOD", r'$\"a$', "ozone [db]", "PWV [mm]", "$B$", r"$A_{star}$", r"$D_{CCD}$ [mm]", + r"$\Delta_{\mathrm{x}}$ [pix]", r"$\Delta_{\mathrm{y}}$ [pix]", r"$\theta$ [deg]"] for order in self.diffraction_orders: axis_names += [label+rf"$\!_{order}$" for label in psf_poly_params_names] - bounds = [[0, 2], [0, 2], [0, 2], [0, 0.1], [0, 3], [100, 700], [0, 20], + bounds = [[0, 2], [0, 2], [0, 2], [0, 0.1], [0, 3], [100, 700], [0, 20], [0.8, 1.2], [0, np.inf], [D2CCD - 5 * parameters.DISTANCE2CCD_ERR, D2CCD + 5 * parameters.DISTANCE2CCD_ERR], [-2, 2], - [-10, 10], [-90, 90], [0.8, 1.2], [0, np.inf]] + [-10, 10], [-90, 90]] bounds += list(psf_poly_params_bounds) * len(self.diffraction_orders) fixed = [False] * p.size for k, par in enumerate(input_labels): @@ -220,7 +220,7 @@ def set_mask(self, params=None): self.my_logger.info("\n\tReset spectrogram mask with current parameters.") if params is None: params = self.params.values - A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, D, shift_x, shift_y, angle, B, Astar, *psf_poly_params_all = params + A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, B, Astar, D, shift_x, shift_y, angle, *psf_poly_params_all = params poly_params = np.array(psf_poly_params_all).reshape((len(self.diffraction_orders), -1)) self.spectrogram_simulation.psf_cubes_masked = {} self.spectrogram_simulation.M_sparse_indices = {} @@ -387,7 +387,7 @@ def simulate(self, *params): >>> w.plot_fit() """ - A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, D, shift_x, shift_y, angle, B, Astar, *psf_poly_params = params + A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, B, Astar, D, shift_x, shift_y, angle, *psf_poly_params = params self.params.values = np.asarray(params) if not self.fit_angstrom_exponent: angstrom_exponent = None From d9264009af9e143736d6cf5441368391bf8cc48a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 14 Mar 2024 11:42:15 +0100 Subject: [PATCH 088/161] fit shift_x --- spectractor/fit/fit_spectrogram.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index 588733532..657782c92 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -113,7 +113,7 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, params.fixed[params.get_index(f"A{self.diffraction_orders[1]}")] = "A2_T" not in self.spectrum.header if "A3" in params.labels: params.fixed[params.get_index(f"A{self.diffraction_orders[2]}")] = "A3_T" not in self.spectrum.header - params.fixed[params.get_index(r"shift_x [pix]")] = True # Delta x + params.fixed[params.get_index(r"shift_x [pix]")] = False # Delta x params.fixed[params.get_index(r"shift_y [pix]")] = True # Delta y params.fixed[params.get_index(r"angle [deg]")] = True # angle params.fixed[params.get_index("B")] = True # B From 56de744a05d05fda2f5f038f9494ca6f2f880889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 14 Mar 2024 11:44:45 +0100 Subject: [PATCH 089/161] fit A1, angle and shift_y first to prepare the fit --- spectractor/fit/fit_spectrogram.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index 657782c92..e7006c317 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -564,7 +564,7 @@ def run_spectrogram_minimisation(fit_workspace, method="newton", verbose=False): my_logger.info(f"\n\tStart guess: {guess}\n\twith {fit_workspace.params.labels}") epsilon = 1e-4 * guess epsilon[epsilon == 0] = 1e-4 - fixed = np.copy(fit_workspace.params.fixed) + fixed_default = np.copy(fit_workspace.params.fixed) # fit_workspace.simulation.fast_sim = True # fit_workspace.simulation.fix_psf_cube = False @@ -586,7 +586,16 @@ def run_spectrogram_minimisation(fit_workspace, method="newton", verbose=False): fit_workspace.spectrogram_simulation.fast_sim = False fit_workspace.spectrogram_simulation.fix_psf_cube = False - fit_workspace.params.fixed = np.copy(fixed) + fit_workspace.params.fixed = [True] * len(fit_workspace.params.values) + fit_workspace.params.fixed[fit_workspace.params.get_index(r"A1")] = False # shift y + fit_workspace.params.fixed[fit_workspace.params.get_index(r"shift_y [pix]")] = False # shift y + fit_workspace.params.fixed[fit_workspace.params.get_index(r"angle [deg]")] = False # angle + run_minimisation(fit_workspace, "newton", epsilon, xtol=1e-2, ftol=0.01, with_line_search=False) + fit_workspace.params.fixed = fixed_default + + fit_workspace.spectrogram_simulation.fast_sim = False + fit_workspace.spectrogram_simulation.fix_psf_cube = False + fit_workspace.params.fixed = np.copy(fixed_default) # guess = fit_workspace.p # params_table, costs = run_gradient_descent(fit_workspace, guess, epsilon, params_table, costs, # fix=fit_workspace.fixed, xtol=1e-6, ftol=1 / fit_workspace.data.size, From 8ffb1d0de9037d52cc3deaa67fa2bfb1f6202891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 14 Mar 2024 11:45:46 +0100 Subject: [PATCH 090/161] change unit of reso parameter in labels (nm) --- spectractor/fit/fit_spectrum.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spectractor/fit/fit_spectrum.py b/spectractor/fit/fit_spectrum.py index 003406b04..4bc6be3ca 100644 --- a/spectractor/fit/fit_spectrum.py +++ b/spectractor/fit/fit_spectrum.py @@ -75,9 +75,9 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, (0.1, 10),(p[7] - 5 * parameters.DISTANCE2CCD_ERR, p[7] + 5 * parameters.DISTANCE2CCD_ERR), (-2, 2), (-np.inf, np.inf)] params = FitParameters(p, labels=["A1", "A2", "VAOD", "angstrom_exp", "ozone [db]", "PWV [mm]", - "reso [pix]", r"D_CCD [mm]", r"alpha_pix [pix]", "B"], + "reso [nm]", r"D_CCD [mm]", r"alpha_pix [pix]", "B"], axis_names=["$A_1$", "$A_2$", "VAOD", r'$\"a$', "ozone [db]", "PWV [mm]", - "reso [pix]", r"$D_{CCD}$ [mm]", r"$\alpha_{\mathrm{pix}}$ [pix]", "$B$"], + "reso [nm]", r"$D_{CCD}$ [mm]", r"$\alpha_{\mathrm{pix}}$ [pix]", "$B$"], bounds=bounds, fixed=fixed, truth=truth, filename=spectrum.filename) FitWorkspace.__init__(self, params, verbose=verbose, plot=plot, live_fit=live_fit, file_name=spectrum.filename) if atmgrid_file_name == "": From d0f987b16697fead8bb09c87df9be29dc06eae3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 14 Mar 2024 11:47:29 +0100 Subject: [PATCH 091/161] more robust way to set weight of outliers to zero --- spectractor/fit/fitter.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/spectractor/fit/fitter.py b/spectractor/fit/fitter.py index a2a113e2a..5c156fe0c 100644 --- a/spectractor/fit/fitter.py +++ b/spectractor/fit/fitter.py @@ -942,11 +942,15 @@ def prepare_weight_matrices(self): f"\nHere W type is {type(self.W)}, shape is {self.W.shape} and W is {self.W}.") else: format = self.W.getformat() - W = self.W.tocsr() - W[:, bad_indices] = 0 - W[bad_indices, :] = 0 - W.eliminate_zeros() - self.W = W.asformat(format=format) + if format == 'dia': + self.W.data[0, bad_indices] = 0 + else: + W = self.W.tolil() + W[:, bad_indices] = 0 + W[bad_indices, :] = 0 + W = self.W.asformat(format='csr') + W.eliminate_zeros() + self.W = W.asformat(format=format) def compute_W_with_model_error(self, model_err): """Propagate model uncertainties to weight matrix W. From b8423ea840088b588cc0b137b34ef7b4af78c95d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 14 Mar 2024 11:49:07 +0100 Subject: [PATCH 092/161] restrict bounds for moffat parameters alpha=(1.1,10) and gamma > 1 pixel --- spectractor/extractor/psf.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/spectractor/extractor/psf.py b/spectractor/extractor/psf.py index 23654458b..85bc2c58a 100644 --- a/spectractor/extractor/psf.py +++ b/spectractor/extractor/psf.py @@ -1187,15 +1187,15 @@ def __init__(self, values=None, clip=False): values = np.copy(self.values_default) labels = ["amplitude", "x_c", "y_c", "gamma", "alpha", "saturation"] axis_names = ["$A$", r"$x_c$", r"$y_c$", r"$\gamma$", r"$\alpha$", "saturation"] - bounds = [(0, np.inf), (-np.inf, np.inf), (-np.inf, np.inf), (0.5, np.inf), - (1.1, 100), (0, np.inf)] + bounds = [(0, np.inf), (-np.inf, np.inf), (-np.inf, np.inf), (1, np.inf), + (1.1, 10), (0, np.inf)] self.params = FitParameters(values=values, labels=labels, axis_names=axis_names, bounds=bounds) def apply_max_width_to_bounds(self, max_half_width=None): if max_half_width is not None: self.max_half_width = max_half_width self.params.bounds[2] = (-2 * self.max_half_width, 2 * self.max_half_width) - self.params.bounds[3] = (0.5, self.max_half_width) + self.params.bounds[3] = (1, self.max_half_width) def evaluate(self, pixels, values=None): r"""Evaluate the Moffat function. @@ -1556,16 +1556,16 @@ def __init__(self, values=None, clip=False): values = np.copy(self.values_default) labels = ["amplitude", "x_c", "y_c", "gamma", "alpha", "eta_gauss", "stddev", "saturation"] axis_names = ["$A$", r"$x_c$", r"$y_c$", r"$\gamma$", r"$\alpha$", r"$\eta$", r"$\sigma$", "saturation"] - bounds = [(0, np.inf), (-np.inf, np.inf), (-np.inf, np.inf), (0.5, np.inf), (1.1, 100), - (-1, -5e-3), (0.5, np.inf), (0, np.inf)] + bounds = [(0, np.inf), (-np.inf, np.inf), (-np.inf, np.inf), (1, np.inf), (1.1, 10), + (-1, -5e-3), (1, np.inf), (0, np.inf)] self.params = FitParameters(values=values, labels=labels, axis_names=axis_names, bounds=bounds) def apply_max_width_to_bounds(self, max_half_width=None): if max_half_width is not None: self.max_half_width = max_half_width self.params.bounds[2] = (-2 * self.max_half_width, 2 * self.max_half_width) - self.params.bounds[3] = (0.5, self.max_half_width) - self.params.bounds[6] = (0.5, self.max_half_width) + self.params.bounds[3] = (1, self.max_half_width) + self.params.bounds[6] = (1, self.max_half_width) def evaluate(self, pixels, values=None): r"""Evaluate the MoffatGauss function. From c1459e9f71abae62405aaaedb4b28a1f6ea73d4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 14 Mar 2024 11:52:50 +0100 Subject: [PATCH 093/161] fit temporarily A1 to help finding the trace of the spectrogram with fixed amplitude vector --- spectractor/extractor/extractor.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 9aae4d51c..28c316089 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -809,11 +809,18 @@ def adjust_spectrogram_position_parameters(self): epsilon[epsilon == 0] = 1e-4 fixed_default = np.copy(self.params.fixed) self.params.fixed = [True] * len(self.params.values) + strategy = copy.copy(self.amplitude_priors_method) + self.amplitude_priors_method = "fixed" + # let A1 free to help finding the spectrogram trace, with amplitude fixed to prior + self.params.fixed[self.params.get_index(r"A1")] = False # A1 self.params.fixed[self.params.get_index(r"shift_y [pix]")] = False # shift y self.params.fixed[self.params.get_index(r"angle [deg]")] = False # angle run_minimisation(self, "newton", epsilon, xtol=1e-2, ftol=0.01, with_line_search=False) # 1000 / self.data.size) self.params.fixed = fixed_default self.set_mask(params=self.params.values, fwhmx_clip=3 * parameters.PSF_FWHM_CLIP, fwhmy_clip=parameters.PSF_FWHM_CLIP) + # refix A1=1 and let amplitude parameters free + self.amplitude_priors_method = strategy + self.params.values[self.params.get_index(r"A1")] = 1 def run_ffm_minimisation(w, method="newton", niter=2): From 27d1e51270de68377b7d1a48380fcf6b5b91b76e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 14 Mar 2024 10:57:00 +0000 Subject: [PATCH 094/161] set very high uncertainties below 380nm and above 1000nm to ease the fits --- ...02_AuxTel_doGainsPTC_v3.0.3_throughput.txt | 358 +++++++++--------- 1 file changed, 179 insertions(+), 179 deletions(-) diff --git a/spectractor/simulation/AuxTelThroughput/multispectra_holo4_003_HD142331_20230802_AuxTel_doGainsPTC_v3.0.3_throughput.txt b/spectractor/simulation/AuxTelThroughput/multispectra_holo4_003_HD142331_20230802_AuxTel_doGainsPTC_v3.0.3_throughput.txt index 01480e375..92f8f6131 100644 --- a/spectractor/simulation/AuxTelThroughput/multispectra_holo4_003_HD142331_20230802_AuxTel_doGainsPTC_v3.0.3_throughput.txt +++ b/spectractor/simulation/AuxTelThroughput/multispectra_holo4_003_HD142331_20230802_AuxTel_doGainsPTC_v3.0.3_throughput.txt @@ -1,83 +1,83 @@ -3.000000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.010000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.020000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.030000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.040000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.050000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.060000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.070000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.080000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.090000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.100000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.110000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.120000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.130000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.140000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.150000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.160000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.170000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.180000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.190000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.200000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.210000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.220000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.230000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.240000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.250000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.260000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.270000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.280000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.290000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.300000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.310000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.320000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.330000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.340000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.350000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.360000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.370000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.380000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.390000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.400000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.410000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.420000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.430000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.440000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.450000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.460000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.470000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.480000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.490000000000000000e+02 0.000000000000000000e+00 1.000000000000000021e-02 -3.500000000000000000e+02 4.460543080675311023e-04 1.000000000000000021e-02 -3.510000000000000000e+02 5.127732532376337755e-03 1.000000000000000021e-02 -3.520000000000000000e+02 9.809410756685144409e-03 1.000000000000000021e-02 -3.530000000000000000e+02 1.449108898099395193e-02 1.000000000000000021e-02 -3.540000000000000000e+02 2.151360631745716928e-02 1.000000000000000021e-02 -3.550000000000000000e+02 2.853612365392038663e-02 1.000000000000000021e-02 -3.560000000000000000e+02 4.258115832684682134e-02 1.076978108162215649e-03 -3.570000000000000000e+02 5.662619299977324216e-02 1.000000000000000021e-02 -3.580000000000000000e+02 7.067122767269960748e-02 9.179710898409596063e-04 -3.590000000000000000e+02 8.458727746713645690e-02 1.000000000000000021e-02 -3.600000000000000000e+02 9.981309525069298472e-02 1.000000000000000021e-02 -3.610000000000000000e+02 1.159818086563590006e-01 1.000000000000000021e-02 -3.620000000000000000e+02 1.320523482528832560e-01 1.663011488662912915e-03 -3.630000000000000000e+02 1.476744926766204169e-01 1.000000000000000021e-02 -3.640000000000000000e+02 1.507394599221379972e-01 8.333343236250701294e-03 -3.650000000000000000e+02 1.538044271676555774e-01 6.666686472501400645e-03 -3.660000000000000000e+02 1.568693944131731577e-01 5.000029708752101731e-03 -3.670000000000000000e+02 1.599343616586907380e-01 3.333372945002801950e-03 -3.680000000000000000e+02 1.629993289042083182e-01 1.666716181253502602e-03 -3.690000000000000000e+02 1.783612927446105167e-01 1.870126998706461013e-03 -3.700000000000000000e+02 1.936064772326762939e-01 1.970150181592436340e-03 -3.710000000000000000e+02 2.081650200601536937e-01 2.119537801644612567e-03 -3.720000000000000000e+02 2.259372492357716034e-01 2.291670345302004863e-03 -3.730000000000000000e+02 2.425423740773889891e-01 2.455992604441717755e-03 -3.740000000000000000e+02 2.620251063350992338e-01 2.646727927819524529e-03 -3.750000000000000000e+02 2.815262246846203520e-01 2.844843184435932783e-03 -3.760000000000000000e+02 3.016515719597132605e-01 3.040447514683536183e-03 -3.770000000000000000e+02 3.179438795109302274e-01 3.206015471118409035e-03 -3.780000000000000000e+02 3.388975841081813822e-01 3.412701411070339849e-03 -3.790000000000000000e+02 3.466918843041088549e-01 3.487155017944860904e-03 +3.000000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.010000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.020000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.030000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.040000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.050000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.060000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.070000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.080000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.090000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.100000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.110000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.120000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.130000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.140000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.150000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.160000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.170000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.180000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.190000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.200000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.210000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.220000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.230000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.240000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.250000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.260000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.270000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.280000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.290000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.300000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.310000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.320000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.330000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.340000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.350000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.360000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.370000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.380000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.390000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.400000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.410000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.420000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.430000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.440000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.450000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.460000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.470000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.480000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.490000000000000000e+02 0.000000000000000000e+00 1.000000000000000000e+00 +3.500000000000000000e+02 4.460543080675311023e-04 1.000000000000000000e+00 +3.510000000000000000e+02 5.127732532376337755e-03 1.000000000000000000e+00 +3.520000000000000000e+02 9.809410756685144409e-03 1.000000000000000000e+00 +3.530000000000000000e+02 1.449108898099395193e-02 1.000000000000000000e+00 +3.540000000000000000e+02 2.151360631745716928e-02 1.000000000000000000e+00 +3.550000000000000000e+02 2.853612365392038663e-02 1.000000000000000000e+00 +3.560000000000000000e+02 4.258115832684682134e-02 1.000000000000000000e+00 +3.570000000000000000e+02 5.662619299977324216e-02 1.000000000000000000e+00 +3.580000000000000000e+02 7.067122767269960748e-02 1.000000000000000000e+00 +3.590000000000000000e+02 8.458727746713645690e-02 1.000000000000000000e+00 +3.600000000000000000e+02 9.981309525069298472e-02 1.000000000000000000e+00 +3.610000000000000000e+02 1.159818086563590006e-01 1.000000000000000000e+00 +3.620000000000000000e+02 1.320523482528832560e-01 1.000000000000000000e+00 +3.630000000000000000e+02 1.476744926766204169e-01 1.000000000000000000e+00 +3.640000000000000000e+02 1.507394599221379972e-01 1.000000000000000000e+00 +3.650000000000000000e+02 1.538044271676555774e-01 1.000000000000000000e+00 +3.660000000000000000e+02 1.568693944131731577e-01 1.000000000000000000e+00 +3.670000000000000000e+02 1.599343616586907380e-01 1.000000000000000000e+00 +3.680000000000000000e+02 1.629993289042083182e-01 1.000000000000000000e+00 +3.690000000000000000e+02 1.783612927446105167e-01 1.000000000000000000e+00 +3.700000000000000000e+02 1.936064772326762939e-01 1.000000000000000000e+00 +3.710000000000000000e+02 2.081650200601536937e-01 1.000000000000000000e+00 +3.720000000000000000e+02 2.259372492357716034e-01 1.000000000000000000e+00 +3.730000000000000000e+02 2.425423740773889891e-01 1.000000000000000000e+00 +3.740000000000000000e+02 2.620251063350992338e-01 1.000000000000000000e+00 +3.750000000000000000e+02 2.815262246846203520e-01 1.000000000000000000e+00 +3.760000000000000000e+02 3.016515719597132605e-01 1.000000000000000000e+00 +3.770000000000000000e+02 3.179438795109302274e-01 1.000000000000000000e+00 +3.780000000000000000e+02 3.388975841081813822e-01 1.000000000000000000e+00 +3.790000000000000000e+02 3.466918843041088549e-01 1.000000000000000000e+00 3.800000000000000000e+02 3.537462102758726079e-01 3.575908857438699941e-03 3.810000000000000000e+02 3.604314183201944299e-01 3.651607519698463374e-03 3.820000000000000000e+02 3.681364447930130512e-01 3.714686331139742826e-03 @@ -699,102 +699,102 @@ 9.980000000000000000e+02 2.812373383558955386e-01 2.827643069676258596e-03 9.990000000000000000e+02 2.749788897718989933e-01 2.764330318055280636e-03 1.000000000000000000e+03 2.688198661347008800e-01 2.703798765187609768e-03 -1.001000000000000000e+03 2.626858331583472594e-01 2.642294925490960671e-03 -1.002000000000000000e+03 2.566380882610728720e-01 2.582674352689992743e-03 -1.003000000000000000e+03 2.506406642678879471e-01 2.523052630478435972e-03 -1.004000000000000000e+03 2.445805906376559147e-01 2.462670342248521327e-03 -1.005000000000000000e+03 2.384449151187563454e-01 2.402066659047045246e-03 -1.006000000000000000e+03 2.324181618625841272e-01 2.338632723353782032e-03 -1.007000000000000000e+03 2.263790747128379688e-01 2.278862670804639688e-03 -1.008000000000000000e+03 2.203749307534488555e-01 2.218035745811968319e-03 -1.009000000000000000e+03 2.144023626539646177e-01 2.159174455415866726e-03 -1.010000000000000000e+03 2.085083162517175626e-01 2.099530574967484707e-03 -1.011000000000000000e+03 2.027598266556651652e-01 2.042647505464125282e-03 -1.012000000000000000e+03 1.971316607775393526e-01 1.989290471299883997e-03 -1.013000000000000000e+03 1.915961281823060358e-01 1.934952990022929071e-03 -1.014000000000000000e+03 1.860896486576171516e-01 1.880464770718611204e-03 -1.015000000000000000e+03 1.806084251255839213e-01 1.826057556671594525e-03 -1.016000000000000000e+03 1.751840996217163549e-01 1.772766608616137794e-03 -1.017000000000000000e+03 1.699292533656071025e-01 1.720024025067603494e-03 -1.018000000000000000e+03 1.648253291334529913e-01 1.670169106422806542e-03 -1.019000000000000000e+03 1.599413311535699544e-01 1.620524357714481873e-03 -1.020000000000000000e+03 1.550995389730692731e-01 1.573670485639895155e-03 -1.021000000000000000e+03 1.501884077670336826e-01 1.524170542004606166e-03 -1.022000000000000000e+03 1.451769617188636563e-01 1.475043594854790309e-03 -1.023000000000000000e+03 1.400422500111145885e-01 1.424081586205500159e-03 -1.024000000000000000e+03 1.349361203646674001e-01 1.373436919252747287e-03 -1.025000000000000000e+03 1.299316336185109000e-01 1.324560078061857776e-03 -1.026000000000000000e+03 1.250822021568329667e-01 1.276046108168024098e-03 -1.027000000000000000e+03 1.203902626949029386e-01 1.230764779016065708e-03 -1.028000000000000000e+03 1.158435635843868411e-01 1.184273647097548298e-03 -1.029000000000000000e+03 1.113628634525782590e-01 1.148079837018516113e-03 -1.030000000000000000e+03 1.071331508999577159e-01 1.104077842662819914e-03 -1.031000000000000000e+03 1.030328734580701622e-01 1.069558316461686033e-03 -1.032000000000000000e+03 9.897703059925638813e-02 1.030711554635111186e-03 -1.033000000000000000e+03 9.502098388115687300e-02 9.967592639921547988e-04 -1.034000000000000000e+03 9.121032303002588049e-02 9.569960465470421507e-04 -1.035000000000000000e+03 8.758718231083717498e-02 9.236251748465754445e-04 -1.036000000000000000e+03 8.422038789529767699e-02 8.919992371290537880e-04 -1.037000000000000000e+03 8.114766280502058726e-02 8.613009439363004992e-04 -1.038000000000000000e+03 7.831952673163725120e-02 8.358958316476878007e-04 -1.039000000000000000e+03 7.564386588068071349e-02 7.968575400530856839e-04 -1.040000000000000000e+03 7.292613926279578607e-02 7.731060425568140508e-04 -1.041000000000000000e+03 7.016850977876504247e-02 7.446963329554155036e-04 -1.042000000000000000e+03 6.745740654215512389e-02 7.122153971857195188e-04 -1.043000000000000000e+03 6.495798992699892971e-02 6.947504519314385077e-04 -1.044000000000000000e+03 6.270525431671919447e-02 6.753775118836584076e-04 -1.045000000000000000e+03 6.066431717329990453e-02 6.559615538185594157e-04 -1.046000000000000000e+03 5.894564991770784995e-02 6.315141427348644129e-04 -1.047000000000000000e+03 5.746473567181502318e-02 6.297817567149599461e-04 -1.048000000000000000e+03 5.613709189995956528e-02 6.143078174291037065e-04 -1.049000000000000000e+03 5.498369486041716769e-02 6.021371346904693745e-04 -1.050000000000000000e+03 5.397177732146830192e-02 5.926933529180221025e-04 -1.051000000000000000e+03 5.280612241128356671e-02 6.143816255422037548e-04 -1.052000000000000000e+03 5.169321034488788547e-02 6.089535753514795351e-04 -1.053000000000000000e+03 5.064899427349616595e-02 5.897112727267215561e-04 -1.054000000000000000e+03 4.963468792895304321e-02 5.796219646114333717e-04 -1.055000000000000000e+03 4.874155299496014948e-02 5.475960922906729540e-04 -1.056000000000000000e+03 4.792922545752861807e-02 5.381912556774555911e-04 -1.057000000000000000e+03 4.715536370557339013e-02 5.287326911311681027e-04 -1.058000000000000000e+03 4.636232041424764166e-02 5.186969275864616565e-04 -1.059000000000000000e+03 4.555588605030019833e-02 5.361508561385514319e-04 -1.060000000000000000e+03 4.477065780367314729e-02 5.309154762718984065e-04 -1.061000000000000000e+03 4.402301902457297217e-02 4.989388995924729821e-04 -1.062000000000000000e+03 4.333220388136843626e-02 4.955957656644576588e-04 -1.063000000000000000e+03 4.280785989472904451e-02 4.925201621502814636e-04 -1.064000000000000000e+03 4.236036332700753720e-02 4.993465219291960558e-04 -1.065000000000000000e+03 4.198928768615071971e-02 5.131605353879616386e-04 -1.066000000000000000e+03 4.168687308875029113e-02 5.151988970972071983e-04 -1.067000000000000000e+03 4.128830020406685369e-02 4.947015081778467598e-04 -1.068000000000000000e+03 4.077523432980383750e-02 4.900586617293405155e-04 -1.069000000000000000e+03 4.017064276046052734e-02 4.800469433877069605e-04 -1.070000000000000000e+03 3.938520105824146189e-02 4.678362836705530960e-04 -1.071000000000000000e+03 3.860265371760809860e-02 4.721488869384776114e-04 -1.072000000000000000e+03 3.794444885152389174e-02 4.506952258253157299e-04 -1.073000000000000000e+03 3.745606571401392804e-02 4.514017268251912705e-04 -1.074000000000000000e+03 3.718445982832373209e-02 4.495596483287294439e-04 -1.075000000000000000e+03 3.690507733666610612e-02 4.490612658475153364e-04 -1.076000000000000000e+03 3.648760106433639877e-02 4.389242208124782612e-04 -1.077000000000000000e+03 3.612551329519327059e-02 4.385290842412436487e-04 -1.078000000000000000e+03 3.590296164655401578e-02 4.379362369103643625e-04 -1.079000000000000000e+03 3.596241610115500503e-02 4.453104997070488828e-04 -1.080000000000000000e+03 3.653693458020594587e-02 4.512004759485544565e-04 -1.081000000000000000e+03 3.652455959653668621e-02 4.553953438629825619e-04 -1.082000000000000000e+03 3.651218461286743350e-02 4.458842083632784696e-04 -1.083000000000000000e+03 3.649980962919818078e-02 4.570186605607101963e-04 -1.084000000000000000e+03 3.648743464552892807e-02 4.754696431392953573e-04 -1.085000000000000000e+03 3.647505966185967535e-02 4.535532179073188566e-04 -1.086000000000000000e+03 3.646268467819042264e-02 4.514732532388483267e-04 -1.087000000000000000e+03 3.645030969452116992e-02 4.471991029299272891e-04 -1.088000000000000000e+03 3.643793471085191721e-02 4.358203587333960819e-04 -1.089000000000000000e+03 3.642555972718266449e-02 4.149538629036672718e-04 -1.090000000000000000e+03 3.641318474351341178e-02 4.168680000230486006e-04 -1.091000000000000000e+03 0.000000000000000000e+00 1.000000000000000021e-02 -1.092000000000000000e+03 0.000000000000000000e+00 1.000000000000000021e-02 -1.093000000000000000e+03 0.000000000000000000e+00 1.000000000000000021e-02 -1.094000000000000000e+03 0.000000000000000000e+00 1.000000000000000021e-02 -1.095000000000000000e+03 0.000000000000000000e+00 1.000000000000000021e-02 -1.096000000000000000e+03 0.000000000000000000e+00 1.000000000000000021e-02 -1.097000000000000000e+03 0.000000000000000000e+00 1.000000000000000021e-02 -1.098000000000000000e+03 0.000000000000000000e+00 1.000000000000000021e-02 -1.099000000000000000e+03 0.000000000000000000e+00 1.000000000000000021e-02 +1.001000000000000000e+03 2.626858331583472594e-01 1.000000000000000000e+00 +1.002000000000000000e+03 2.566380882610728720e-01 1.000000000000000000e+00 +1.003000000000000000e+03 2.506406642678879471e-01 1.000000000000000000e+00 +1.004000000000000000e+03 2.445805906376559147e-01 1.000000000000000000e+00 +1.005000000000000000e+03 2.384449151187563454e-01 1.000000000000000000e+00 +1.006000000000000000e+03 2.324181618625841272e-01 1.000000000000000000e+00 +1.007000000000000000e+03 2.263790747128379688e-01 1.000000000000000000e+00 +1.008000000000000000e+03 2.203749307534488555e-01 1.000000000000000000e+00 +1.009000000000000000e+03 2.144023626539646177e-01 1.000000000000000000e+00 +1.010000000000000000e+03 2.085083162517175626e-01 1.000000000000000000e+00 +1.011000000000000000e+03 2.027598266556651652e-01 1.000000000000000000e+00 +1.012000000000000000e+03 1.971316607775393526e-01 1.000000000000000000e+00 +1.013000000000000000e+03 1.915961281823060358e-01 1.000000000000000000e+00 +1.014000000000000000e+03 1.860896486576171516e-01 1.000000000000000000e+00 +1.015000000000000000e+03 1.806084251255839213e-01 1.000000000000000000e+00 +1.016000000000000000e+03 1.751840996217163549e-01 1.000000000000000000e+00 +1.017000000000000000e+03 1.699292533656071025e-01 1.000000000000000000e+00 +1.018000000000000000e+03 1.648253291334529913e-01 1.000000000000000000e+00 +1.019000000000000000e+03 1.599413311535699544e-01 1.000000000000000000e+00 +1.020000000000000000e+03 1.550995389730692731e-01 1.000000000000000000e+00 +1.021000000000000000e+03 1.501884077670336826e-01 1.000000000000000000e+00 +1.022000000000000000e+03 1.451769617188636563e-01 1.000000000000000000e+00 +1.023000000000000000e+03 1.400422500111145885e-01 1.000000000000000000e+00 +1.024000000000000000e+03 1.349361203646674001e-01 1.000000000000000000e+00 +1.025000000000000000e+03 1.299316336185109000e-01 1.000000000000000000e+00 +1.026000000000000000e+03 1.250822021568329667e-01 1.000000000000000000e+00 +1.027000000000000000e+03 1.203902626949029386e-01 1.000000000000000000e+00 +1.028000000000000000e+03 1.158435635843868411e-01 1.000000000000000000e+00 +1.029000000000000000e+03 1.113628634525782590e-01 1.000000000000000000e+00 +1.030000000000000000e+03 1.071331508999577159e-01 1.000000000000000000e+00 +1.031000000000000000e+03 1.030328734580701622e-01 1.000000000000000000e+00 +1.032000000000000000e+03 9.897703059925638813e-02 1.000000000000000000e+00 +1.033000000000000000e+03 9.502098388115687300e-02 1.000000000000000000e+00 +1.034000000000000000e+03 9.121032303002588049e-02 1.000000000000000000e+00 +1.035000000000000000e+03 8.758718231083717498e-02 1.000000000000000000e+00 +1.036000000000000000e+03 8.422038789529767699e-02 1.000000000000000000e+00 +1.037000000000000000e+03 8.114766280502058726e-02 1.000000000000000000e+00 +1.038000000000000000e+03 7.831952673163725120e-02 1.000000000000000000e+00 +1.039000000000000000e+03 7.564386588068071349e-02 1.000000000000000000e+00 +1.040000000000000000e+03 7.292613926279578607e-02 1.000000000000000000e+00 +1.041000000000000000e+03 7.016850977876504247e-02 1.000000000000000000e+00 +1.042000000000000000e+03 6.745740654215512389e-02 1.000000000000000000e+00 +1.043000000000000000e+03 6.495798992699892971e-02 1.000000000000000000e+00 +1.044000000000000000e+03 6.270525431671919447e-02 1.000000000000000000e+00 +1.045000000000000000e+03 6.066431717329990453e-02 1.000000000000000000e+00 +1.046000000000000000e+03 5.894564991770784995e-02 1.000000000000000000e+00 +1.047000000000000000e+03 5.746473567181502318e-02 1.000000000000000000e+00 +1.048000000000000000e+03 5.613709189995956528e-02 1.000000000000000000e+00 +1.049000000000000000e+03 5.498369486041716769e-02 1.000000000000000000e+00 +1.050000000000000000e+03 5.397177732146830192e-02 1.000000000000000000e+00 +1.051000000000000000e+03 5.280612241128356671e-02 1.000000000000000000e+00 +1.052000000000000000e+03 5.169321034488788547e-02 1.000000000000000000e+00 +1.053000000000000000e+03 5.064899427349616595e-02 1.000000000000000000e+00 +1.054000000000000000e+03 4.963468792895304321e-02 1.000000000000000000e+00 +1.055000000000000000e+03 4.874155299496014948e-02 1.000000000000000000e+00 +1.056000000000000000e+03 4.792922545752861807e-02 1.000000000000000000e+00 +1.057000000000000000e+03 4.715536370557339013e-02 1.000000000000000000e+00 +1.058000000000000000e+03 4.636232041424764166e-02 1.000000000000000000e+00 +1.059000000000000000e+03 4.555588605030019833e-02 1.000000000000000000e+00 +1.060000000000000000e+03 4.477065780367314729e-02 1.000000000000000000e+00 +1.061000000000000000e+03 4.402301902457297217e-02 1.000000000000000000e+00 +1.062000000000000000e+03 4.333220388136843626e-02 1.000000000000000000e+00 +1.063000000000000000e+03 4.280785989472904451e-02 1.000000000000000000e+00 +1.064000000000000000e+03 4.236036332700753720e-02 1.000000000000000000e+00 +1.065000000000000000e+03 4.198928768615071971e-02 1.000000000000000000e+00 +1.066000000000000000e+03 4.168687308875029113e-02 1.000000000000000000e+00 +1.067000000000000000e+03 4.128830020406685369e-02 1.000000000000000000e+00 +1.068000000000000000e+03 4.077523432980383750e-02 1.000000000000000000e+00 +1.069000000000000000e+03 4.017064276046052734e-02 1.000000000000000000e+00 +1.070000000000000000e+03 3.938520105824146189e-02 1.000000000000000000e+00 +1.071000000000000000e+03 3.860265371760809860e-02 1.000000000000000000e+00 +1.072000000000000000e+03 3.794444885152389174e-02 1.000000000000000000e+00 +1.073000000000000000e+03 3.745606571401392804e-02 1.000000000000000000e+00 +1.074000000000000000e+03 3.718445982832373209e-02 1.000000000000000000e+00 +1.075000000000000000e+03 3.690507733666610612e-02 1.000000000000000000e+00 +1.076000000000000000e+03 3.648760106433639877e-02 1.000000000000000000e+00 +1.077000000000000000e+03 3.612551329519327059e-02 1.000000000000000000e+00 +1.078000000000000000e+03 3.590296164655401578e-02 1.000000000000000000e+00 +1.079000000000000000e+03 3.596241610115500503e-02 1.000000000000000000e+00 +1.080000000000000000e+03 3.653693458020594587e-02 1.000000000000000000e+00 +1.081000000000000000e+03 3.652455959653668621e-02 1.000000000000000000e+00 +1.082000000000000000e+03 3.651218461286743350e-02 1.000000000000000000e+00 +1.083000000000000000e+03 3.649980962919818078e-02 1.000000000000000000e+00 +1.084000000000000000e+03 3.648743464552892807e-02 1.000000000000000000e+00 +1.085000000000000000e+03 3.647505966185967535e-02 1.000000000000000000e+00 +1.086000000000000000e+03 3.646268467819042264e-02 1.000000000000000000e+00 +1.087000000000000000e+03 3.645030969452116992e-02 1.000000000000000000e+00 +1.088000000000000000e+03 3.643793471085191721e-02 1.000000000000000000e+00 +1.089000000000000000e+03 3.642555972718266449e-02 1.000000000000000000e+00 +1.090000000000000000e+03 3.641318474351341178e-02 1.000000000000000000e+00 +1.091000000000000000e+03 0.000000000000000000e+00 1.000000000000000000e+00 +1.092000000000000000e+03 0.000000000000000000e+00 1.000000000000000000e+00 +1.093000000000000000e+03 0.000000000000000000e+00 1.000000000000000000e+00 +1.094000000000000000e+03 0.000000000000000000e+00 1.000000000000000000e+00 +1.095000000000000000e+03 0.000000000000000000e+00 1.000000000000000000e+00 +1.096000000000000000e+03 0.000000000000000000e+00 1.000000000000000000e+00 +1.097000000000000000e+03 0.000000000000000000e+00 1.000000000000000000e+00 +1.098000000000000000e+03 0.000000000000000000e+00 1.000000000000000000e+00 +1.099000000000000000e+03 0.000000000000000000e+00 1.000000000000000000e+00 From 9aa2545458c8a7b5031bf70903ca3993040f5384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 14 Mar 2024 11:02:39 +0000 Subject: [PATCH 095/161] SDSS g filter --- .../simulation/AuxTelThroughput/SDSSg.txt | 221 ++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 spectractor/simulation/AuxTelThroughput/SDSSg.txt diff --git a/spectractor/simulation/AuxTelThroughput/SDSSg.txt b/spectractor/simulation/AuxTelThroughput/SDSSg.txt new file mode 100644 index 000000000..995cf6ead --- /dev/null +++ b/spectractor/simulation/AuxTelThroughput/SDSSg.txt @@ -0,0 +1,221 @@ +380 0.0000 +381 0.0000 +382 0.0000 +383 0.0000 +384 0.0000 +385 0.0000 +386 0.0000 +387 0.0000 +388 0.0000 +389 0.0000 +390 0.00005 +391 0.000149999999999999 +392 0.000599999999999999 +393 0.0027 +394 0.0249 +395 0.1686 +396 0.4554 +397 0.6898 +398 0.7937 +399 0.8518 +400 0.8893 +401 0.90645 +402 0.91595 +403 0.9241 +404 0.93125 +405 0.93795 +406 0.93915 +407 0.94105 +408 0.9456 +409 0.95105 +410 0.9532 +411 0.95715 +412 0.9597 +413 0.96175 +414 0.9605 +415 0.9611 +416 0.96505 +417 0.9713 +418 0.97295 +419 0.9717 +420 0.9714 +421 0.9745 +422 0.9758 +423 0.9711 +424 0.96195 +425 0.96105 +426 0.9665 +427 0.97565 +428 0.9812 +429 0.97955 +430 0.97655 +431 0.97665 +432 0.97865 +433 0.97795 +434 0.9756 +435 0.9718 +436 0.97215 +437 0.97775 +438 0.9837 +439 0.9861 +440 0.9858 +441 0.9833 +442 0.9828 +443 0.98345 +444 0.9853 +445 0.98515 +446 0.9839 +447 0.98385 +448 0.98445 +449 0.987 +450 0.9867 +451 0.9842 +452 0.97975 +453 0.9758 +454 0.97525 +455 0.9779 +456 0.98265 +457 0.98525 +458 0.9852 +459 0.98545 +460 0.9853 +461 0.9863 +462 0.9877 +463 0.988649999999999 +464 0.98705 +465 0.9837 +466 0.9818 +467 0.98225 +468 0.9848 +469 0.9873 +470 0.98885 +471 0.98775 +472 0.9839 +473 0.9806 +474 0.9792 +475 0.98035 +476 0.98205 +477 0.98335 +478 0.9833 +479 0.98355 +480 0.9826 +481 0.98295 +482 0.9856 +483 0.98925 +484 0.99005 +485 0.98845 +486 0.9826 +487 0.9784 +488 0.97425 +489 0.974599999999999 +490 0.9795 +491 0.98585 +492 0.99045 +493 0.9903 +494 0.98655 +495 0.9795 +496 0.9734 +497 0.97195 +498 0.97395 +499 0.97935 +500 0.9859 +501 0.9896 +502 0.9906 +503 0.9876 +504 0.9833 +505 0.9809 +506 0.98035 +507 0.98235 +508 0.98455 +509 0.98515 +510 0.98305 +511 0.97925 +512 0.97535 +513 0.97265 +514 0.9731 +515 0.97495 +516 0.9793 +517 0.98115 +518 0.9797 +519 0.9753 +520 0.96845 +521 0.9624 +522 0.95935 +523 0.9598 +524 0.96425 +525 0.9694 +526 0.9734 +527 0.97435 +528 0.9703 +529 0.9638 +530 0.95705 +531 0.95155 +532 0.9501 +533 0.95115 +534 0.95485 +535 0.9596 +536 0.9648 +537 0.9694 +538 0.97425 +539 0.97815 +540 0.98 +541 0.97815 +542 0.97005 +543 0.9588 +544 0.94475 +545 0.93505 +546 0.9309 +547 0.9338 +548 0.9316 +549 0.9093 +550 0.84955 +551 0.74365 +552 0.6038 +553 0.46095 +554 0.33455 +555 0.2317 +556 0.1552 +557 0.1012 +558 0.06525 +559 0.0419 +560 0.02715 +561 0.01795 +562 0.01205 +563 0.0084 +564 0.0061 +565 0.0046 +566 0.00354999999999999 +567 0.0028 +568 0.00225 +569 0.0018 +570 0.0015 +571 0.00119999999999999 +572 0.001 +573 0.0008 +574 0.000599999999999999 +575 0.00045 +576 0.00035 +577 0.000299999999999999 +578 0.0002 +579 0.0002 +580 0.000149999999999999 +581 0.0001 +582 0.0001 +583 0.00005 +584 0.00005 +585 0.00005 +586 0.00005 +587 0.00005 +588 0.0000 +589 0.00005 +590 0.0000 +591 0.00005 +592 0.0000 +593 0.0000 +594 0.0000 +595 0.0000 +596 0.0000 +597 0.0000 +598 0.0000 +599 0.0000 +600 0.0000 \ No newline at end of file From 99becf5a95b4bea1ea5ea4555759d812e7d4ebc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 14 Mar 2024 13:30:43 +0100 Subject: [PATCH 096/161] debug position of B, Astar --- tests/test_fullchain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index f64284dc7..0e4ba827d 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -226,7 +226,7 @@ def test_ctio_fullchain(): nsigma = 2 labels = ["A1_T", "A2_T", "VAOD_T", "OZONE_T", "PWV_T"] indices = [0, 1, 3, 5, 6] - A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, D, shift_x, shift_y, shift_t, B, Astar, *psf_poly_params = w.params.values + A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, B, Astar, D, shift_x, shift_y, shift_t, *psf_poly_params = w.params.values ipar = w.params.get_free_parameters() # non fixed param indices cov_indices = [list(ipar).index(k) for k in indices] # non fixed param indices in cov matrix assert w.costs[-1] / w.data.size < 1e-3 From 43b1a7fa78f890b9837fca27db5a37613d34f343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 14 Mar 2024 13:31:59 +0100 Subject: [PATCH 097/161] sketch of auxtel full chain test --- tests/test_fullchain.py | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index 0e4ba827d..6fa0ce439 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -1,5 +1,5 @@ import matplotlib as mpl -#mpl.use('Agg') # must be run first! But therefore requires noqa E402 on all other imports +mpl.use('Agg') # must be run first! But therefore requires noqa E402 on all other imports from scipy.interpolate import interp1d # noqa: E402 @@ -32,7 +32,7 @@ PSF_POLY_PARAMS_AUXTEL_TRUTH = [1, 0, 0, 0, 0, 0, - 6, 0, 0, + 8, 0, 0, 3, 0, 0, 1e6] * N_DIFF_ORDERS @@ -111,8 +111,8 @@ def make_auxtel_image(): spectrum_filename = "./tests/data/test_auxtel_spectrum.fits" image_filename = "./tests/data/exposure_2023092800266_dmpostisrccd.fits" sim = ImageSim(image_filename, spectrum_filename, "./tests/data/", A1=A1_T, A2=A2_T, A3=A3_T, - psf_poly_params=PSF_POLY_PARAMS_AUXTEL_TRUTH, with_starfield=False, with_rotation=True, with_noise=False, - with_flat=False) + psf_poly_params=PSF_POLY_PARAMS_AUXTEL_TRUTH, with_starfield=False, with_rotation=True, + with_noise=False, with_flat=False) return sim @@ -249,9 +249,18 @@ def test_ctio_fullchain(): @unittest.skipIf(uvspec_available() is False, 'Skipping to avoid libradtran dependency') @astropy.config.set_temp_cache(os.path.join(os.path.abspath(os.path.dirname(__file__)), "data", "cache")) def auxtel_fullchain(): + """ + + Returns + ------- + + Examples + -------- + >>> test_auxtel_fullchain() + """ parameters.VERBOSE = True parameters.DEBUG = True - parameters.SPECTRACTOR_ATMOSPHERE_SIM = "libradtran" + parameters.SPECTRACTOR_ATMOSPHERE_SIM = "getObsAtmo" sim_image_filename = "./tests/data/sim_2023092800266_dmpostisrccd.fits" # load test and make image simulation @@ -265,7 +274,6 @@ def auxtel_fullchain(): # extractor load_config("./config/auxtel.ini") - parameters.SPECTRACTOR_ATMOSPHERE_SIM = "libradtran" parameters.PSF_POLY_ORDER = PSF_POLY_ORDER parameters.CCD_REBIN = 1 # JN: > 1 not working well for now: I guess CTIO spectra are too narrow @@ -314,13 +322,11 @@ def auxtel_fullchain(): assert np.abs(np.mean(residuals[100:-100])) < 0.25 assert np.std(residuals[100:-100]) < 3 - spectrum_file_name = "./tests/data/sim_20170530_134_spectrum.fits" + spectrum_file_name = "./tests/data/sim_2023092800266_dmpostisrccd_spectrum.fits" assert os.path.isfile(spectrum_file_name) - atmgrid_filename = sim_image_filename.replace('sim', 'reduc').replace('.fits', '_atmsim.fits') - assert os.path.isfile(atmgrid_filename) spectrum = Spectrum(spectrum_file_name) - w = SpectrumFitWorkspace(spectrum, atmgrid_file_name=atmgrid_filename, fit_angstrom_exponent=False, - verbose=True, plot=True, live_fit=False) + parameters.SPECTRACTOR_ATMOSPHERE_SIM = "getObsAtmo" + w = SpectrumFitWorkspace(spectrum, fit_angstrom_exponent=False, verbose=True, plot=True, live_fit=False) run_spectrum_minimisation(w, method="newton") nsigma = 2 labels = ["VAOD_T", "OZONE_T", "PWV_T"] @@ -341,14 +347,13 @@ def auxtel_fullchain(): assert np.isclose(np.abs(w.params.values[9]), 0, atol=1e-3) # B parameters.DEBUG = False - parameters.SPECTRACTOR_ATMOSPHERE_SIM = "libradtran" - w = SpectrogramFitWorkspace(spectrum, atmgrid_file_name=atmgrid_filename, fit_angstrom_exponent=False, - verbose=True, plot=True, live_fit=False) + parameters.SPECTRACTOR_ATMOSPHERE_SIM = "getObsAtmo" + w = SpectrogramFitWorkspace(spectrum, fit_angstrom_exponent=False, verbose=True, plot=True, live_fit=False) run_spectrogram_minimisation(w, method="newton") nsigma = 2 labels = ["A1_T", "A2_T", "VAOD_T", "OZONE_T", "PWV_T"] indices = [0, 1, 3, 5, 6] - A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, D, shift_x, shift_y, shift_t, B, Astar, *psf_poly_params = w.params.values + A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, B, Astar, D, shift_x, shift_y, shift_t, *psf_poly_params = w.params.values ipar = w.params.get_free_parameters() # non fixed param indices cov_indices = [list(ipar).index(k) for k in indices] # non fixed param indices in cov matrix assert w.costs[-1] / w.data.size < 1e-3 From 138e8809dcf41343e66699b3ce66850e6ed34459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 15 Mar 2024 09:50:41 +0100 Subject: [PATCH 098/161] keep tentative to set bounds for polynomial parameters --- spectractor/extractor/chromaticpsf.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index 50b750a46..a00d7e328 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -1375,6 +1375,8 @@ def set_bounds(self): elif parameters.PSF_POLY_TYPE == "polynomial": tmp_bounds = [[self.psf.params.bounds[k][0]] + [-np.inf] * (self.degrees[name]), [self.psf.params.bounds[k][1]] + [np.inf] * (self.degrees[name])] + # tmp_bounds = [[self.psf.params.bounds[k][0]] + [-0.5 * 2 * (self.psf.params.bounds[k][1] - self.psf.params.bounds[k][0]) for deg in range(1, self.degrees[name] + 1)], + # [self.psf.params.bounds[k][1]] + [0.5 * 2 * (self.psf.params.bounds[k][1] - self.psf.params.bounds[k][0]) for deg in range(1, self.degrees[name] + 1)]] else: raise ValueError(f"Unknown polynomial type {parameters.PSF_POLY_TYPE=}.") if name == "saturation": From f89d3a2bfaf3083dba35d7b26befb6f50fb6a9fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 15 Mar 2024 09:51:08 +0100 Subject: [PATCH 099/161] for CTIO PSF_POLY_ORDER=2 --- config/ctio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ctio.ini b/config/ctio.ini index e9c0579e9..98ba7bd59 100644 --- a/config/ctio.ini +++ b/config/ctio.ini @@ -104,7 +104,7 @@ PIXWIDTH_BOXSIZE = 40 # the PSF model: Gauss, Moffat or MoffatGauss PSF_TYPE = Moffat # the order of the polynomials to model wavelength dependence of the PSF shape parameters -PSF_POLY_ORDER = 4 +PSF_POLY_ORDER = 2 # regularisation parameter for the chisq minimisation to extract the spectrum PSF_FIT_REG_PARAM = 0.04 # step size in pixels for the first transverse PSF1D fit From 9ebe370eb1b8267da081fc862b9f92da33fe0048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 9 Apr 2024 21:00:17 +0200 Subject: [PATCH 100/161] PSF_POLY_ORDER=2 --- config/stardice.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/stardice.ini b/config/stardice.ini index d3864c1b6..802ae32c4 100644 --- a/config/stardice.ini +++ b/config/stardice.ini @@ -108,7 +108,7 @@ PIXWIDTH_BOXSIZE = 40 # the PSF model: Gauss, Moffat or MoffatGauss PSF_TYPE = Moffat # the order of the polynomials to model wavelength dependence of the PSF shape parameters -PSF_POLY_ORDER = 4 +PSF_POLY_ORDER = 2 # regularisation parameter for the chisq minimisation to extract the spectrum PSF_FIT_REG_PARAM = 0.1 # step size in pixels for the first transverse PSF1D fit From e0a705105e1f5fe63b90dc28838e1b168b454294 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 9 Apr 2024 21:00:38 +0200 Subject: [PATCH 101/161] repair runAstrometry.py --- runAstrometry.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/runAstrometry.py b/runAstrometry.py index b0255433b..e40110211 100644 --- a/runAstrometry.py +++ b/runAstrometry.py @@ -2,6 +2,7 @@ from spectractor.astrometry import Astrometry from spectractor.logbook import LogBook from spectractor.config import load_config, apply_rebinning_to_parameters +from spectractor.extractor.images import Image if __name__ == "__main__": @@ -50,7 +51,6 @@ logbook = LogBook(logbook=args.logbook) for file_name in file_names: - disperser_label = args.disperser_label if parameters.OBS_NAME == "CTIO": tag = file_name.split('/')[-1] tag = tag.replace('sim_', 'reduc_') @@ -66,8 +66,8 @@ ypos = float(ypos) guess = [xpos, ypos] target_label = args.target_label - a = Astrometry(file_name, target_label=target_label, disperser_label=disperser_label, - output_directory=args.output_directory) + image = Image(file_name, config=args.config) + a = Astrometry(image, output_directory=args.output_directory) extent = ((int(max(0, xpos - radius)), int(min(xpos + radius, parameters.CCD_IMSIZE))), (int(max(0, ypos - radius)), int(min(ypos + radius, parameters.CCD_IMSIZE)))) gaia_min_residuals = a.run_full_astrometry(extent=extent, maxiter=int(args.maxiter)) From 8d1f44168468587599f2dfb182dda4e530b237bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 9 Apr 2024 21:01:05 +0200 Subject: [PATCH 102/161] output_filename as argument of ImageSim --- spectractor/simulation/image_simulation.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index 8db114bfe..c523e74f2 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -366,7 +366,7 @@ def load_image(self, filename): # self.true_lambdas, self.true_spectrum = hdu_list[1].data -def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aerosols=0.03, A1=1, A2=1, A3=1, angstrom_exponent=None, +def ImageSim(image_filename, spectrum_filename, output_filename, pwv=5, ozone=300, aerosols=0.03, A1=1, A2=1, A3=1, angstrom_exponent=None, psf_poly_params=None, psf_type=None, diffraction_orders=None, with_rotation=True, with_stars=True, with_adr=True, with_noise=True): """ The basic use of the extractor consists first to define: - the path to the fits image from which to extract the image, @@ -493,12 +493,6 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer image.plot_image(scale="symlog", title="Image simulation", target_pixcoords=target_pixcoords, units=image.units) image.convert_to_ADU_units() - # Set output path - ensure_dir(outputdir) - output_filename = image_filename.split('/')[-1] - output_filename = (output_filename.replace('reduc', 'sim')).replace('trim', 'sim') - output_filename = os.path.join(outputdir, output_filename) - # Save images and parameters image.header['A1_T'] = A1 image.header['A2_T'] = A2 From 58cce5a1f613812721411f65efc72e3550e63cca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 9 Apr 2024 21:01:37 +0200 Subject: [PATCH 103/161] stardice load image with detrend and load WCS if there --- spectractor/extractor/images.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index 896482107..c1b068913 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -759,7 +759,22 @@ def load_STARDICE_image(image): # pragma: no cover if "BSCALE" in image.header: del image.header["BSCALE"] - #Set the flip signs depending on the side of the pillar + ILLUREGION = slice(None, 1032), slice(1, 1057) + OVERSCANA = slice(1032, None), slice(None) + OVERSCANB = slice(None, 1032), slice(1059, None) + + def detrend(im): + res = im - np.mean(im[OVERSCANA], axis=0) # [:-100] + return np.subtract(res[ILLUREGION].T, np.mean(res[OVERSCANB], axis=1)).T + + if image.data.shape[0] > 1032 and image.data.shape[1] > 1057: + image.data = detrend(image.data) + # transformations so that stars are like in Stellarium up to a rotation + # with spectrogram nearly horizontal and on the right of central star + # no transformation if data are simulated + image.data = image.data[::-1, ::-1] + + #Set the flip signs depending on the side of the pillar if image.header['MOUNTTAU'] < 90: parameters.OBS_CAMERA_ROTATION = 180 @@ -770,9 +785,6 @@ def load_STARDICE_image(image): # pragma: no cover image.date_obs = image.header['DATE-OBS'] image.expo = float(image.header['cameraexptime']) image.filter_label = 'EMPTY' - # transformations so that stars are like in Stellarium up to a rotation - # with spectrogram nearly horizontal and on the right of central star - image.data = image.data[::-1, ::-1] image.airmass = 1/np.cos(np.radians(90-image.header['MOUNTALT'])) image.my_logger.info('\n\tImage loaded') @@ -790,6 +802,12 @@ def load_STARDICE_image(image): # pragma: no cover image.pressure = 1000 image.humidity = 87 image.units = 'ADU' + # WCS + wcs_file_name = set_wcs_file_name(image.file_name) + if os.path.isfile(wcs_file_name): + image.my_logger.info(f"\n\tUse WCS {wcs_file_name}.") + image.wcs = load_wcs_from_file(wcs_file_name) + if "PC2_1" in image.header: rotation_wcs = 180 / np.pi * np.arctan2(-hdu_list[0].header["PC2_1"]/hdu_list[0].header["CDELT2"], hdu_list[0].header["PC1_1"]/hdu_list[0].header["CDELT1"]) atol = 0.02 From e4e0f63eaf4e64cd44ab1a8a81b3268a46b294e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 9 Apr 2024 21:02:06 +0200 Subject: [PATCH 104/161] add stardice full chain test --- tests/test_fullchain.py | 134 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 133 insertions(+), 1 deletion(-) diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index ac9d3b586..4465fc11f 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -94,10 +94,17 @@ def plot_residuals(spectrum, lambdas_truth, amplitude_truth): def make_image(): spectrum_filename = "./tests/data/reduc_20170530_134_spectrum.fits" image_filename = "./tests/data/reduc_20170530_134.fits" - ImageSim(image_filename, spectrum_filename, "./tests/data/", A1=A1_T, A2=A2_T, A3=A3_T, + ImageSim(image_filename, spectrum_filename, "./tests/data/sim_20170530_134.fits", A1=A1_T, A2=A2_T, A3=A3_T, psf_poly_params=PSF_POLY_PARAMS_TRUTH, with_stars=False, with_rotation=True, with_noise=False) +def make_stardice_image(): + spectrum_filename = "./tests/data/IMG_0019584_spectrum.fits" + image_filename = "./tests/data/IMG_0019584.fits" + ImageSim(image_filename, spectrum_filename, "./tests/data/IMG_0019584_sim.fits", A1=A1_T, A2=A2_T, A3=A3_T, + psf_poly_params=PSF_POLY_PARAMS_TRUTH, with_stars=False, with_rotation=True, with_noise=False, pwv=8) + + @unittest.skipIf(uvspec_available() is False, 'Skipping to avoid libradtran dependency') @astropy.config.set_temp_cache(os.path.join(os.path.abspath(os.path.dirname(__file__)), "data", "cache")) def test_ctio_fullchain(): @@ -218,3 +225,128 @@ def test_ctio_fullchain(): assert np.all(np.isclose(psf_poly_params[(PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1], np.array(PSF_POLY_PARAMS_TRUTH)[(PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1], rtol=0.01, atol=0.01)) + + + +@unittest.skipIf(uvspec_available() is False, 'Skipping to avoid libradtran dependency') +@astropy.config.set_temp_cache(os.path.join(os.path.abspath(os.path.dirname(__file__)), "data", "cache")) +def test_stardice_fullchain(): + """ + + Returns + ------- + + Examples + -------- + >>> test_stardice_fullchain() + """ + parameters.VERBOSE = True + parameters.DEBUG = True + parameters.SPECTRACTOR_ATMOSPHERE_SIM = "getObsAtmo" + sim_image = "./tests/data/IMG_0019584_sim.fits" + + # load test and make image simulation + #if not os.path.isfile(sim_image): + make_stardice_image() + image = Image(sim_image, config="./config/stardice.ini") + lambdas_truth = np.fromstring(image.header['LBDAS_T'][1:-1], sep=' ') + amplitude_truth = np.fromstring(image.header['AMPLIS_T'][1:-1], sep=' ', dtype=float) + parameters.AMPLITUDE_TRUTH = np.copy(amplitude_truth) + parameters.LAMBDA_TRUTH = np.copy(lambdas_truth) + + # extractor + load_config("./config/stardice.ini") + parameters.SPECTRACTOR_ATMOSPHERE_SIM = "getObsAtmo" + parameters.PSF_POLY_ORDER = PSF_POLY_ORDER + parameters.CCD_REBIN = 1 + # JN: > 1 not working well for now: I guess CTIO spectra are too narrow + # and under-sampled to extract unbiased rebinned spectrum, but pipeline is ok. + apply_rebinning_to_parameters() + if parameters.CCD_REBIN > 1: + for k in range(2 * (PSF_POLY_ORDER + 1), 3 * (PSF_POLY_ORDER +1)): + PSF_POLY_PARAMS_TRUTH[k] /= parameters.CCD_REBIN + spectrum = Spectractor(sim_image, "./tests/data", config="", guess=(530, 610)) # config already loaded, do not overwrite PSF_POLY_ORDER + # tests + residuals = plot_residuals(spectrum, lambdas_truth, amplitude_truth) + + spectrum.my_logger.warning(f"\n\tQuantities to test with {parameters.CCD_REBIN=}:" + f"\n\t\tspectrum.header['X0_T']={spectrum.header['X0_T'] / parameters.CCD_REBIN:.5g} vs {spectrum.x0[0]:.5g}" + f"\n\t\tspectrum.header['Y0_T']={spectrum.header['Y0_T'] / parameters.CCD_REBIN:.5g} vs {spectrum.x0[1]:.5g}" + f"\n\t\tspectrum.header['ROT_T']={spectrum.header['ROT_T']:.5g} " + f"vs {spectrum.rotation_angle:.5g}" + f"\n\t\tspectrum.header['BKGD_LEV']={spectrum.header['BKGD_LEV'] * parameters.CCD_REBIN**2:.5g} " + f"vs {np.mean(spectrum.spectrogram_bgd):.5g}" + f"\n\t\tspectrum.header['D2CCD_T']={spectrum.header['D2CCD_T']:.5g} " + f"vs {spectrum.disperser.D:.5g}" + f"\n\t\tspectrum.header['A2_FIT']={spectrum.header['A2_FIT']:.5g} vs {A2_T:.5g}" + f"\n\t\tspectrum.header['CHI2_FIT']={spectrum.header['CHI2_FIT']:.4g}" + f"\n\t\tspectrum.chromatic_psf.poly_params=" + f"{spectrum.chromatic_psf.params.values[spectrum.chromatic_psf.Nx + 2 * (PSF_POLY_ORDER + 1):-1]}" + f" vs {PSF_POLY_PARAMS_TRUTH[2 * (PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1]}" + f"\n\t\tresiduals wrt truth: mean={np.mean(residuals[100:-100]):.5g}, " + f"std={np.std(residuals[100:-100]):.5g}") + assert np.isclose(float(spectrum.header['X0_T'] / parameters.CCD_REBIN), spectrum.x0[0], atol=0.2 * parameters.CCD_REBIN) + assert np.isclose(float(spectrum.header['Y0_T'] / parameters.CCD_REBIN), spectrum.x0[1], atol=0.2 * parameters.CCD_REBIN) + assert np.isclose(float(spectrum.header['ROT_T']), spectrum.rotation_angle, atol=1e-3) + assert np.isclose(float(spectrum.header['BKGD_LEV'] * parameters.CCD_REBIN**2), np.mean(spectrum.spectrogram_bgd), rtol=1e-3) + assert np.isclose(float(spectrum.header['D2CCD_T']), spectrum.disperser.D, atol=0.2) + if parameters.CCD_REBIN == 1: + assert float(spectrum.header['CHI2_FIT']) < 3e-3 + else: + assert float(spectrum.header['CHI2_FIT']) < 3e-1 + assert np.all( + np.isclose(spectrum.chromatic_psf.params.values[spectrum.chromatic_psf.Nx + 2 * (PSF_POLY_ORDER + 1):-1], + np.array(PSF_POLY_PARAMS_TRUTH)[2 * (PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1], rtol=0.05, atol=0.1)) + assert np.abs(np.mean(residuals[100:-100])) < 0.3 + assert np.std(residuals[100:-100]) < 1 + + spectrum_file_name = "./tests/data/IMG_0019584_spectrum.fits" + assert os.path.isfile(spectrum_file_name) + spectrum = Spectrum(spectrum_file_name) + w = SpectrumFitWorkspace(spectrum, fit_angstrom_exponent=False, + verbose=True, plot=True, live_fit=False) + run_spectrum_minimisation(w, method="newton") + nsigma = 2 + labels = ["VAOD_T", "OZONE_T", "PWV_T"] + indices = [2, 4, 5] + ipar = w.params.get_free_parameters() # non fixed param indices + cov_indices = [list(ipar).index(k) for k in indices] # non fixed param indices in cov matrix + assert w.costs[-1] / w.data.size < 3 + k = 0 + for i, l in zip(indices, labels): + icov = cov_indices[k] + spectrum.my_logger.info(f"Test {l} best-fit {w.params.values[i]:.3f}+/-{np.sqrt(w.params.cov[icov, icov]):.3f} " + f"vs {spectrum.header[l]:.3f} at {nsigma}sigma level: " + f"{np.abs(w.params.values[i] - spectrum.header[l]) / np.sqrt(w.params.cov[icov, icov]) < nsigma}") + assert np.abs(w.params.values[i] - spectrum.header[l]) / np.sqrt(w.params.cov[icov, icov]) < nsigma + k += 1 + assert np.abs(w.params.values[1]) / np.sqrt(w.params.cov[1, 1]) < 2 * nsigma # A2 + assert np.isclose(np.abs(w.params.values[8]), 0, atol=parameters.PIXSHIFT_PRIOR) # pixshift + assert np.isclose(np.abs(w.params.values[9]), 0, atol=1e-3) # B + + parameters.DEBUG = False + parameters.SPECTRACTOR_ATMOSPHERE_SIM = "getObsAtmo" + w = SpectrogramFitWorkspace(spectrum, fit_angstrom_exponent=False, + verbose=True, plot=True, live_fit=False) + run_spectrogram_minimisation(w, method="newton") + nsigma = 2 + labels = ["A1_T", "A2_T", "VAOD_T", "OZONE_T", "PWV_T"] + indices = [0, 1, 3, 5, 6] + A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, D, shift_x, shift_y, shift_t, B, *psf_poly_params = w.params.values + ipar = w.params.get_free_parameters() # non fixed param indices + cov_indices = [list(ipar).index(k) for k in indices] # non fixed param indices in cov matrix + assert w.costs[-1] / w.data.size < 3 + k = 0 + for i, l in zip(indices, labels): + icov = cov_indices[k] + spectrum.my_logger.info(f"Test {l} best-fit {w.params.values[i]:.3f}+/-{np.sqrt(w.params.cov[icov, icov]):.3f} " + f"vs {spectrum.header[l]:.3f} at {nsigma}sigma level: " + f"{np.abs(w.params.values[i] - spectrum.header[l]) / np.sqrt(w.params.cov[icov, icov]) < nsigma}") + assert np.abs(w.params.values[i] - spectrum.header[l]) / np.sqrt(w.params.cov[icov, icov]) < nsigma + k += 1 + assert np.isclose(shift_y, 0, atol=parameters.PIXSHIFT_PRIOR) # shift_y + assert np.isclose(D, spectrum.header["D2CCD_T"], atol=0.1) # D2CCD + assert np.isclose(B, 1, atol=1e-3) # B + assert np.all(np.isclose(psf_poly_params[(PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1], + np.array(PSF_POLY_PARAMS_TRUTH)[(PSF_POLY_ORDER + 1):len(PSF_POLY_PARAMS_TRUTH)//N_DIFF_ORDERS - 1], + rtol=0.01, atol=0.01)) From 185fdce58fc46a0451f77fd71e7394de4c2c9616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 9 Apr 2024 21:02:27 +0200 Subject: [PATCH 105/161] red circle for target position in plot_image_simple --- spectractor/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/tools.py b/spectractor/tools.py index d3b89ccb8..e1f20fe3b 100644 --- a/spectractor/tools.py +++ b/spectractor/tools.py @@ -1800,7 +1800,7 @@ def plot_image_simple(ax, data, scale="lin", title="", units="Image units", cmap if title != "": ax.set_title(title) if target_pixcoords is not None: - ax.scatter(target_pixcoords[0], target_pixcoords[1], marker='o', s=100, edgecolors='k', facecolors='none', + ax.scatter(target_pixcoords[0], target_pixcoords[1], marker='o', s=100, edgecolors='r', facecolors='none', label='Target', linewidth=2) From 9da2cecaf257651c02fa377dd6bdd9a1244ee94d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 9 Apr 2024 21:07:31 +0200 Subject: [PATCH 106/161] TODO: add good pressure temp and humiduty values if available in header --- spectractor/extractor/images.py | 1 + 1 file changed, 1 insertion(+) diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index c1b068913..cc74fe54b 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -798,6 +798,7 @@ def detrend(im): if image.header['MOUNTTAU'] >= 90: image.hour_angle = image.hour_angle - 180*units.deg image.dec = 180*units.deg - image.dec + # TODO: here take goods values if exist image.temperature = 10 image.pressure = 1000 image.humidity = 87 From e9de2e020e7312f06c51779541999844545b1db9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Tue, 9 Apr 2024 23:30:16 +0200 Subject: [PATCH 107/161] merge with v3.1.0 --- tests/test_fullchain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index 61f93282f..11abf65c1 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -1,5 +1,5 @@ import matplotlib as mpl -#mpl.use('Agg') # must be run first! But therefore requires noqa E402 on all other imports +mpl.use('Agg') # must be run first! But therefore requires noqa E402 on all other imports from scipy.interpolate import interp1d # noqa: E402 From 42ee3ace23e8203a1fb93a68a4e6a04622d92cab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 10 Apr 2024 10:36:33 +0200 Subject: [PATCH 108/161] add good pressure temp and humidity values if available in header --- spectractor/extractor/images.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index 0427d0745..e2c7ee966 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -829,6 +829,7 @@ def detrend(im): elif image.header['MOUNTTAU'] >= 90: parameters.OBS_CAMERA_ROTATION = 0 + image.units = 'ADU' image.target_label = image.header['mountTARGET'] image.date_obs = image.header['DATE-OBS'] image.expo = float(image.header['cameraexptime']) @@ -846,11 +847,20 @@ def detrend(im): if image.header['MOUNTTAU'] >= 90: image.hour_angle = image.hour_angle - 180*units.deg image.dec = 180*units.deg - image.dec - # TODO: here take goods values if exist - image.temperature = 10 - image.pressure = 1000 - image.humidity = 87 - image.units = 'ADU' + + if "weatherAir temperature [C]" in image.header: + image.temperature = float(image.header["weatherAir temperature [C]"]) + else: + image.temperature = 10. + if "weatherAir pressure [hPa]" in image.header: + image.pressure = float(image.header["weatherAir pressure [hPa]"]) + else: + image.pressure = 950. + if "weatherRelative humidity [%]" in image.header: + image.humidity = float(image.header["weatherRelative humidity [%]"]) + else: + image.humidity = 50. + # WCS wcs_file_name = set_wcs_file_name(image.file_name) if os.path.isfile(wcs_file_name): From 6e6266437a9c92d531172dfb4ca766c9e4e500af Mon Sep 17 00:00:00 2001 From: Eli Rykoff Date: Sun, 14 Apr 2024 19:52:29 -0700 Subject: [PATCH 109/161] Add hd111980_stis_006.fits to test cache. --- .../2c303169e6bbbb2b9c683391733d2931/contents | 401 ++++++++++++++++++ .../url/2c303169e6bbbb2b9c683391733d2931/url | 1 + 2 files changed, 402 insertions(+) create mode 100644 tests/data/cache/astropy/download/url/2c303169e6bbbb2b9c683391733d2931/contents create mode 100644 tests/data/cache/astropy/download/url/2c303169e6bbbb2b9c683391733d2931/url diff --git a/tests/data/cache/astropy/download/url/2c303169e6bbbb2b9c683391733d2931/contents b/tests/data/cache/astropy/download/url/2c303169e6bbbb2b9c683391733d2931/contents new file mode 100644 index 000000000..04468f14b --- /dev/null +++ b/tests/data/cache/astropy/download/url/2c303169e6bbbb2b9c683391733d2931/contents @@ -0,0 +1,401 @@ +SIMPLE = T / BITPIX = 16 / NAXIS = 0 / EXTEND = T /FITS extensions present? TARGETID= 'HD111980' / DBTABLE = 'CRSPECTRUM' / MAPKEY = 'calspec ' / AIRMASS = 0.00000 /Mean airmass of the observation DESCRIP = 'Standard star flux with an HST/STIS calibration------' / SOURCE = 'Flux scale of Bohlin, et al.2020, AJ, 160, 21' / USEAFTER= 'Jan 01 2000 00:00:00' / COMMENT = 'HST Flux scale is based on TMAP AND TLUSTY WD NLTE MODELS' / COMMENT Model Normalized to obs. by 2.48727e-18 at 6800.0-7700.0 Ang PEDIGREE= 'INFLIGHT 1997 to 2022' / HISTORY FILE WRITTEN BY stismrg.PRO ON 27-Jan-2023 16:01:53.00 HISTORY FILE WRITTEN BY STISREDUCE.PRO ON 27-Jan-2023 16:01:53.00 HISTORY coadd lst for G230LB from dir=dat/: HISTORY oc3i04010 HISTORY EPOCH: 2012.336:03:46:21-2012.336:03:46:21 HISTORY gwidth for G230LB flux cal=11 HISTORY Sensitivity file: /Users/bohlin/stisidl/scal/sens11_g230lb.fits HISTORY SYS-ERROR is the broadband ~1% SYSTEMATIC UNCERTAINTY of STIS fluxes. HISTORY Bohlin(2014,PASP,126,711). BOTH THE STAT-ERR AND SYS-ERR ARE 1-SIGMA.HISTORY Net & Flux corr for time(2019,AJ,158,211)&CTE loss(2022, CTE update, in HISTORY coadd lst for G430L from dir=dat/: HISTORY oc3i04020 oc3i04030 HISTORY EPOCH: 2012.336:04:10:41-2012.336:05:11:53 HISTORY gwidth for G430L flux cal=11 HISTORY Net and Flux corr for time(2019,AJ,158,211)&CTE loss(2022, CTE update, iHISTORY MERGE POINT = 3065.0 HISTORY coadd lst for G750L from dir=dat/: HISTORY oc3i04040 HISTORY EPOCH: 2012.336:05:15:07-2012.336:05:15:07 HISTORY gwidth for G750L flux cal=11 HISTORY MERGE POINT = 5450.0 HISTORY HISTORY HISTORY HISTORY Units: Angstroms(A) and erg s-1 cm-2 A-1 HISTORY Written by MAKE_STIS_CALSPEC.pro 16-Feb-2023 HISTORY Sources for this spectrum: HISTORY ---------------- ---------------------- ---------- HISTORY WAVELENGTH RANGE SOURCE FILE HISTORY ---------------- ---------------------- ---------- HISTORY 1710 10120 STIS hd111980.mrg HISTORY 10120 318789 Bohlin et al. 2017 BOSZ2022 R=500 Model HISTORY Model Normalized to Observed Flux at 6800-7700A HISTORY Method:Bohlin, et al. 2017, AJ, 153, 234 HISTORY Model with Teff,log g,log z,E(B-V)= 5860 3.40 -1.21 0.008 HISTORY BOSZ2022 model with good sampling in the IR HISTORY All wavelengths are in vacuum w/ model adjusted for radial vel= 155.0 HISTORY CHANGES from previous version: HISTORY Revised BOSZ2022 models & Gordon extinction HISTORY For details see: HISTORY http://www.stsci.edu/hst/instrumentation/reference- HISTORY data-for-calibration-and-tools/astronomical- HISTORY catalogs/calspec FILENAME= 'hd111980_stis_006.fits' / WMIN = 1710.76721200 /Minimum Wavelength WMAX = 318789.625000 /Maximum Wavelength END XTENSION= 'BINTABLE' /Written by IDL: Thu Feb 16 16:36:49 2023 BITPIX = 8 / NAXIS = 2 /Binary table NAXIS1 = 30 /Number of bytes per row NAXIS2 = 6815 /Number of rows PCOUNT = 0 /Random parameter count GCOUNT = 1 /Group count TFIELDS = 7 /Number of columns EXTNAME = 'SCI ' / EXTVER = 1 / INHERIT = T / TFORM1 = '1D ' /Real*8 (double precision) TTYPE1 = 'WAVELENGTH' /Label for column 1 TUNIT1 = 'ANGSTROMS' /Units of column 1 TDISP1 = 'G10.4 ' /Display format for column 1 TFORM2 = '1E ' /Real*4 (floating point) TTYPE2 = 'FLUX ' /Absolutely calibrated net spectrum TUNIT2 = 'FLAM ' /Units of column 2 TDISP2 = 'E12.4 ' /Display format for column 2 TFORM3 = '1E ' /Real*4 (floating point) TTYPE3 = 'STATERROR' /Statistical flux error TUNIT3 = 'FLAM ' /Units of column 3 TDISP3 = 'E12.4 ' /Display format for column 3 TFORM4 = '1E ' /Real*4 (floating point) TTYPE4 = 'SYSERROR' /Systematic flux error=0.01*FLAM TUNIT4 = 'FLAM ' /Units of column 4 TDISP4 = 'E12.4 ' /Display format for column 4 TFORM5 = '1E ' /Real*4 (floating point) TTYPE5 = 'FWHM ' /FWHM spectral resolution TUNIT5 = 'ANGSTROMS' /Units of column 5 TDISP5 = 'G6.2 ' /Display format for column 5 TFORM6 = '1I ' /Integer*2 (short integer) TTYPE6 = 'DATAQUAL' /Data quality: 1=good, 0=bad TUNIT6 = 'NONE ' /Units of column 6 TDISP6 = 'I2 ' /Display format for column 6 TFORM7 = '1E ' /Real*4 (floating point) TTYPE7 = 'TOTEXP ' /Total exposure time TUNIT7 = 'SEC ' /Units of column 7 TDISP7 = 'G10.2 ' /Display format for column 7 END @š» Äe(Í·&'»ÞZ%ƒ¨j@/}þD€@šÀ€CR(¶ƒL'ì:â%iÒ@/}þD€@šÆ èîl(¼&Á'®®™%pÕr@/}þD€@šË…_þmY(׆6'žäê%‰ï@/|D€@šÑ@ìF(Ó©'§³%‡vg@/}þD€@šÖ}?á—_(’ÕÚ'•ë`%;ó@/}þD€@šÛù÷L(QO.'˜ò#%õ<@/~D€@šáu ÝD(¤Ù'»ƒ +%R + @/€D€@šæñ ¤<(³Ï‹(&ò%f(`@/þD€@šìmæOU(¯Ý–'J¯%a¡@/þD€@šñé÷L(û'¨;% ®Ã@/€D€@š÷e ÝD(ïiO'¥dÐ%™9(@/‚D€@šüá@ìF))ˆ(%÷%«ºH@/þD€@›]?á—_(©Ÿ£'‰³%YA@/þD€@›Ù_í¦a( ¹v'†%Mº1@/‚D€@› U_þmY)P'¡i¡%£ý×@/‚D€@›Ñ€ +|[(ž{O'©3%JÛF@/„D€@›M ‹](~b'€SÎ%"’Î@/ƒýD€@›É¿ß~€)t‹'ûÅ%Æû”@/ƒýD€@›#Eßë‚(Ïv{'£~½%„Ƶ@/„D€@›(Áÿ÷œ„(²½&'šq%dÉ&@/„D€@›.> «†(šÎ†'|¥ù%F'@/†D€@›3º` “(²lr'€jÝ%daÙ@/†D€@›96€”(ç'uç\%IË@/†D€@›>²Àh¡(Ö¦‹'yáž%‰`Y@/‡ýD€@›D.ÿâ£Ï(Îó 'v%„r—@/‡ýD€@›I«?éúÛ(ëÿe'tîT%— Ú@/ˆD€@›O'ñQç(À~,'‘>.%vd@/ˆD€@›T£¿ø¨ô(­.r'h¡x%]¬@/ˆD€@›Z (ÄK='mú8%{A•@/ˆD€@›_œ@W (çl'mö‡%”-@/ŠD€@›e  ö#(·û'_ü%9=j@/ŠD€@›j”àM/(ˤÎ'b¼†%‚Tÿ@/ŠD€@›p@ìF(ø¢~'kk\%Ÿ P@/ŠD€@›u€CR(Çõ·'fÌì%òÖ@/ŠD€@›{ àâi(ÕÒh'”ÈÖ%ˆØ•@/ŒD€@›€†@ €(ØCJ'{¹Û%Šh‚@/‹üD€@›†Ÿà¸(ß..'\@Q%ŽÕà@/‹üD€@›‹~ÿâ£Ï(ÍðË'vÞŒ%ƒÍO@/ŒD€@›û_åBå) h¢'[½Y%³¹"@/ŽD€@›–wßã*(øÇb'õ%Ÿ7í@/ŽD€@››ô?åÉ(õÞ™'k7µ%[C@/ŽD€@›¡p¿ã°>(ÛË.'N|ý%Œªÿ@/ŽD€@›¦íæOU(þ¢/'OX‚%¢÷(@/ŽD€@›¬iŸä6v(ð'Z™ã%™‚@/D€@›±æâ—(Ä}÷'_ü%{‚„@/D€@›·bŸà¸(æ­'Nlc%“F2@/D€@›¼ß !¸(ÿqµ'Na%£{ù@/D€@›Â[ îÙ)ßó'”Kf%¦=`@/D€@›ÇØ Õú)B'HÈ%¥Et@/‘ÿD€@›ÍTÀ%(ô„¸'D[a%œ}ç@/‘ÿD€@›ÒÑ@ìF)šÙ'Ep%ÀÆ5@/‘ÿD€@›ØMà q(ðÛ'JZ&%™ªÊ@/‘ÿD€@›ÝÊ` “(íD„'RÚÝ%—Ùî@/‘ÿD€@›ãG1¾)Rï'@£‡%®~£@/“ÿD€@›èßý`é) ”r'KFD%³ñ6@/“ÿD€@›î@?ö(åG<':¹ %’¼ó@/“ÿD€@›ó¼ßï¿@)ºÍ'ͼ%¬t9@/“ÿD€@›ù9èîl) ô0'gOå%³$@/“ÿD€@›þ¶â—(éúâ':Zø%•¿I@/–D€@œ2à°«(ó„Æ'h`è%›Ú@/–D€@œ ¯€ß×(ù„w'>*Í%Ÿ°ð@/•ÿD€@œ,@W (õ÷ö'?y%k@/•ÿD€@œ¨à†8(ûOS'88ò% Öœ@/•ÿD€@œ%Ÿôým)¢'EÜê%·@/—ÿD€@œ¢_ét£)›¤'¹iQ%ɼû@/˜D€@œ% !¸) !O'3¶.%¯†Ë@/˜D€@œ*›à~í)&'72%È÷;@/—ÿD€@œ0  ö#) p´'-)_%³Ãv@/—ÿD€@œ5•_þmY) +Sü'5ûA%±W@/™þD€@œ;?î,™(û<',Œ“% ¥é@/™þD€@œ@Žÿâ£Ï(âg«'4X%æ0@/šD€@œF à~í(ó{Œ',Fz%›Ô1@/šD€@œKˆ  ö#) +pÏ''À%±4<@/™þD€@œQùµc(ëg5'Q˲%–¨t@/›þD€@œV‚_ét£)®'#ì€%¬cþ@/œD€@œ[ÿ@OÂ(ér×'%%•h8@/œD€@œa| )¯”'-–%¤·È@/›þD€@œføÿûÎB(ý„' [%¢h@/›þD€@œlußë‚)ìF'Р%¯Bé@/œD€@œqòÀh¡(ëÅ¿'J_%–äõ@/œD€@œwo 'á)n +'Ònó%¼µÏ@/þD€@œ|ìŸù/+)Èê''µ%ÂHÙ@/þD€@œ‚ièîl) ÷™'%%´p@/žD€@œ‡æ€”(õ?~'^A%œõp@/ D€@œc€ß)è'6ð˜%½ˆ×@/ŸýD€@œ’àí ))Y'7P%¥·@/ D€@œ˜]€CR)vô'U¥%ÄoM@/ D€@œÚ€J)Ð'(›‰%ǵ…@/ŸýD€@œ£WñQç)2S'òr%äAb@/ D€@œ¨Ô€u)0 '·6%ÄH@/ D€@œ®Q€ +|[)Bø'Ot-%Ƽ@/¡ýD€@œ³ÎŸð˰)Ã'Ó%Å$Ñ@/¢D€@œ¹K îÙ)#!'HL%ÐÎ=@/¢D€@œ¾ÈÀ>-) rõ'Õô%µ@/¡ýD€@œÄE¿ðEx(òÕ‡' %{%›ið@/¢D€@œÉÂà°«(ö&'>±%Ìå@/¤D€@œÏ@)Ôy' Ü%¤ç@/£ýD€@œÔ½æOU(îtã'¢N%˜œº@/¤D€@œÚ:@ºˆ(ÀYG'¹B%v4Ö@/¤D€@œß·_ö Ý(³b'\j%e?6@/¤D€@œå4€u(Æd€'˜x%}ñG@/¤D€@œê± Äe(±±¬'<%crÇ@/¥üD€@œð.ßç[Ä(᱂'+8%q›@/¦D€@œõ¬Æø(ú!C' Áß% I@/¦D€@œû)?ò^W) à©'•™%Íì^@/¦D€@¦`ÉŠ)@A'“õ%öØ@/¦D€@#Ÿý`é))å÷' +AÅ%ÙxF@/§üD€@  ßÞøH)ÈŽ' òr%Ë>&@/¨D€@ «†)ÓW'Nz%Á„@/¨D€@›_åBå) ];'±%ÍD"@/¨D€@  ö#)F€' , %ýs×@/¨D€@!•ßë‚)2¸‰'}j%äÃ?@/¨D€@' @À)"I‡' 0$%ϺF@/¨D€@,_ñØ)9;©' mm%í+@/ªD€@2 ÀÓg)]Š„' É©& ÉJ@/ªD€@7ŠÿójÆ)kA)'.€&@/ªD€@=`f)h“,'°>&Ù@/ªD€@B…Ÿôým)b§'T&Æ@/ªD€@Hø¶)NP}'pé& +@/¬D€@M€_ñØ)Tv' +dÑ&·V@/¬D€@RýÀÓg)F¶['ò§%þZ@/¬D€@X{î²Ñ)P¤Œ'2f&ˆ@/¬D€@]ø€®)_Ï–'9’&=-@/¬D€@cußë‚)D-C' º%û7@/¬D€@hó@ ˆÊ)f„J'æ&‡Ý@/¬D€@npŸèh4)fÓ×'TÔ&ºÇ@/®D€@sî «†)tP×' ·k&\²@/®D€@ykàŠð)€5' ‡u&#îX@/®D€@~èÿûÎB)hŸÛ'x&á0@/®D€@„f`ÉŠ)sÌ'½ú&ˆ1@/®D€@‰ãßóðþ){”€'²&!á@/¯ÿD€@a`4P)tæ' +uk&,¼@/¯ÿD€@”Þßç[Ä)pR3'ºïw&Î5@/¯ÿD€@š\`Ÿ)|Jª'FG&!ww@/°D€@ŸÙàâi)uÞ™'¡&[C@/¯ÿD€@¥W_ö Ý)qšÈ' N& €@/¯ÿD€@ªÔàM/)bGc&þ¨&ч@/¯ÿD€@°R_ét£)Q;•'W&è±@/±ÿD€@µÐ)Bþ &óºD%ù—@/²D€@»M€CR)TQU&ó=&â"@/±ÿD€@ÀËî²Ñ)‰`$'JÉ&/×8@/±ÿD€@ÆH  ö#)ŽŸß'³Q&62@/²D€@ËÆ@ €)&0''&7;@/±ÿD€@ÑC¿ø¨ô)’ä'”*&:ýM@/±ÿD€@ÖÁ`4P)‰ñi'Zû&0‘*@/³ÿD€@Ü>ÿâ£Ï)†H'Áv&+ác@/³ÿD€@἟ù/+) 2' J•&8a‡@/´D€@ç:@ºˆ)Z¥'nM:&7~D@/³ÿD€@ì·ßã*)›Üâ'8Át&G"@/³ÿD€@ò5ùµc)Ÿ!T'¥Ê&K¯È@/¶D€@÷³@ ˆÊ)¥‰\' nÜ&Sã@/µþD€@ý0ßÞøH) ð'#Žk&LïG@/³ÿD€@ž®õƒ¥)¢w¥' ä‚&OõN@/¶D€@ž,@W )±1'­&b™Ø@/¶D€@ž ©àâi)¦Ãˆ'A&Uu)@/µþD€@ž'Ÿì™ò) ¢g':Q¿&Mœ­@/·þD€@ž¥_þmY)˜DÚ&ÿA¿&Bç~@/¶D€@ž#ø¶)†~Ù']Ù&,'|@/µþD€@ž# ¿ã°>)\z'žO&4ñ@@/·þD€@ž)õƒ¥)LlC&èƒô&Ô¥@/¸D€@ž.œ@W )(&Ô*˜%ÅR@/¸D€@ž4*s)+/³&Ø­\%ÛV@/·þD€@ž9—¿çáü)4Á¨'ÄU%ç^H@/¹þD€@ž?Ÿôým),;-&ùd.%Ütµ@/ºD€@žD“`ÐÕ),I'Í%%܆j@/¸D€@žJ ¤<)o²&䉲&÷|@/¹þD€@žOŽÿâ£Ï)”%Z&ô€&= t@/¹þD€@žU ¿ôw6)°vY'*œ&aß*@/ºD€@žZŠ ’§)Ï/”' È×&„™T@/ºD€@ž``f)̘'ê&‚ð¯@/ºD€@že†@ €)È,{'ß&€w@/»ýD€@žkê)Á# +'0Â&w7@/»ýD€@žpÿ÷œ„)ʧ)'l›&²ª@/¼D€@žuÿà·ö)Ô3['ÙÚ&‡Îó@/¼D€@ž{}ÀÓg)ÎqX'—Û&„•@/¼D€@ž€û îÙ)Â|W' Z)&xñ@/»ýD€@ž†yèîl)»²ã'Û&pA"@/»ýD€@ž‹÷_ö Ý)Ìo¸'ÝŠ&‚ÖÜ@/¼D€@ž‘u@%N)»Aæ&÷žd&o°ƒ@/¼D€@ž–ó @À)ǘè'H½&| +@/¾D€@žœq ¤<)ÃÌþ&ùŒÄ&zŸý@/½ýD€@ž¡îÿâ£Ï)Ê·N&üèb&¼þ@/½ýD€@ž§lÿëJ)Ã1Y&ù…c&yØÄ@/¾D€@ž¬êßø"¼)Ä‚”&ùgß&{ˆk@/¾D€@ž²hà†8)ÄŒô&þÀž&{•³@/ÀD€@ž·æàé´)á¬æ'fª&n§@/ÀD€@ž½dàM/)íb~'+Ö&—í@/¾D€@žÂâÀh¡)øv®' +&ŸF@/½ýD€@žÈ`¿ã°>)ô•'Ú&œ4Ú@/¿ýD€@žÍÞ¿ìº)åùð')Ê&“/R@/ÀD€@žÓ\¿ôw6)ã&ý^q&‘W@/ÀD€@žØÚ¿üÚ²)Ù€&ù7é&Šõp@/ÂD€@žÞXà†8)×Þi&÷}0&Š'ñ@/ÂD€@žãÖàé´)ÊH &öÈi&uÊ@/ÀD€@žéTàM/)¶&é«&i +?@/ÂD€@žîÓø¶)´Cj&èfp&f¼°@/ÂD€@žôQ\1)¹æß&ê:ü&môP@/¿ýD€@žùÎÿâ£Ï)Ìži&õ6E&‚ô¾@/ÁýD€@žÿMæOU)ÃÙ&è’¶&z¯|@/ÄD€@ŸË?éúÛ)ÇK©&ì›»&*@/ÂD€@Ÿ +I?ò^W)¸s'Ï›&lc@/ÂD€@ŸÇ_ö Ý)«Þ^&ÜÅ"&[ýé@/ÄD€@ŸEùµc)›o[&Ò¹©&Fôð@/ÄD€@Ÿßý`é)¯e&ß-A&`j@/ÄD€@Ÿ AÀ o)Ê2$&í¥]&gÅ@/ÄD€@Ÿ%¿à·ö)Üt&ë@î&@/ÄD€@Ÿ+>c|)Þ«æ&ì9&Ž‚@/ÄD€@Ÿ0¼ )äƒ=&ùŸ6&’?ƒ@/ÄD€@Ÿ6:@ºˆ)á¬æ&ì(&n§@/ÄD€@Ÿ;¸`f)ìž'f&—Á@/ÄD€@ŸA6€”)îkª&ò>D&˜–Ó@/ÆD€@ŸF´À%)ôFv&ñí&œV@/ÆD€@ŸL2à°«*ëô&õî½&¨Ü@/ÆD€@ŸQ± ¤<* &ó•`&£ãF@/ÆD€@ŸW/@OÂ)ý°&ó}&¢\4@/ÆD€@Ÿ\­€CR*Ôè'Ïf&¶Ó@/ÆD€@Ÿb+ îÙ*ýÆ' ì&ª:—@/ÆD€@Ÿg©àâi*0Y&õ»&®R]@/ÈD€@Ÿm( Õú*b§&ôËG&ª»·@/ÈD€@Ÿr¦`ÉŠ*x©&ðÔµ&¨H‡@/ÆD€@Ÿx$€u* ^5&ôÐ&´ów@/ÆD€@Ÿ}¢Àh¡*wä&ù—Õ&»z½@/ÈD€@Ÿƒ!\1* ÈT&òž0&´3ž@/ÈD€@ŸˆŸ@OÂ*óN' f@&ºÑ@/ÈD€@ŸŽ€CR*è‘&ý^q&ù @/ÊD€@Ÿ“›à~í*³å'ùŸ&ºÝ@/ÊD€@Ÿ™ r~* OË&ñª±&´á@/ÈD€@Ÿž˜`f*ߤ&ðWE&­ë@/ÈD€@Ÿ¤ YŸ*ü2&óü­&¦aˆ@/ÊD€@Ÿ©• •:)ãÖM&ßCd&‘ÐÕ@/ÊD€@Ÿ¯@ ˆÊ)ÜýH&×8&næ@/ÊD€@Ÿ´‘ Äe* {&ê}e&µ[@/ÊD€@Ÿºà·ö*k'Ÿ&¿AY@/ÊD€@Ÿ¿Ž?þó‘*%8&þ!ú&ÓPì@/ÊD€@ŸÅ ýç!*%Þ&ûÁ<&ÓÙm@/ÊD€@ŸÊŠßø"¼*܃'K&Âað@/ËÿD€@ŸÐ ?ò^W*Ź&ðßÇ&ÉòØ@/ÊD€@ŸÕ‡ñQç*'œÛ&öµö&Ö‹V@/ÊD€@ŸÛßë‚*)C&õiì&ØTÑ@/ËÿD€@Ÿà„?åÉ* Í&ð>&ÍÓH@/ËÿD€@ŸæŸà¸*°&ëW&ÇHQ@/ÌD€@Ÿë\1*.®ñ's*&ߘ?@/ÌD€@Ÿðÿ`—Ì*6¸è&ù‰&éâq@/ËÿD€@Ÿö}ÀÓg*8¥È'c–&ìYR@/ËÿD€@Ÿûü *@¤8&ýùe&ö”Â@/ËÿD€@ ½@%N*?ý &þôE&õ¾Ç@/ÍÿD€@ |ýç!*=,x&ú¬‰&ò$p@/ÏÿD€@ ;¿ø¨ô*?·Þ&þ%«&õf;@/ËÿD€@ úßø"¼*?ƒý'¤[&õ#Ó@/ËÿD€@  ºòä*=¹³&øs&òÙ8@/ÐD€@ y`4P*7)Q'ª¶&êrT@/ÌD€@ 8€®*!–Ó'†o&ÎÕ‰@/ËÿD€@ ÷À oë*&ã[+&ÊG³@/ÏÿD€@ ·1¾*v•&Þk&¿P@/ÏÿD€@ v?þó‘*$^Á&è’¶&ÒdÎ@/ÏÿD€@ 5ùµc*# †'%±&е&@/ËÿD€@ ôŸù/+*š¿&ܘÝ&ÃUo@/ËÿD€@ !³ßóðþ**dÉ&æ&Ú›@/ÐD€@ $s @À*/Ï,'³&á /@/ÐD€@ '2` “**(B&ö†&ÙÍ!@/ÏÿD€@ )ñ Äe*6ÇR'.ü&éôã@/ÏÿD€@ ,°à†8*@&÷EÙ&õÜJ@/ÏÿD€@ /pûH +*LÕÁ&öô®')@/ÏÿD€@ 2/_ö Ý*L”&ò_'ëä@/ÏÿD€@ 4îŸð˰*UN&úA‹'Se@/ÐD€@ 7­à q*Z*f&÷ÎZ'  B@/ÐD€@ :m ÝD*iÜU&þ;Í'«»@/ÏÿD€@ =,`Ÿ*kMD'di'—Ú@/ÓþD€@ ?ë¿ø¨ô*`B&ø1÷'n>@/ÓþD€@ BªÿójÆ*_!&ü/ê'ÍÂ@/ÐD€@ Ej@ºˆ*Z5î'×™' §¢@/ÐD€@ H)€ +|[*SÓª&ò<'‘´@/ÏÿD€@ JèÀ>-*V‡j&÷š´' Lm@/ÓþD€@ M¨ûH +*Z>“&ïá6' ­+@/ÓþD€@ Pg_ö Ý*inÎ&÷>x'e¢@/ÏÿD€@ S&Ÿð˰*jÅÌ&÷3f'A'@/ÐD€@ Uåà q*do&óÔ'2™@/ÔD€@ X¥@%N*h‚t&ôvm'Î_@/ÓþD€@ [dýç!*tÍî&ùt'¬Á@/ÓþD€@ ^#ßóðþ*rì–&ø5¨'x²@/ÔD€@ `ã @À*rÕ‡'ï'ið@/ÐD€@ c¢` “*{ç&ù%v' ·ž@/ÓþD€@ faÀ o*}æÕ'}ž'"A@/ÓþD€@ i ÿûÎB*{U«&ü÷$' Ú«@/ÓþD€@ kà_ñØ*x+½&ý¾]'ÔP@/ÔD€@ nŸ 'á*~HÕ&ýX'"½ù@/ÔD€@ q_1¾*o,Ç&ï­'k@/ÓþD€@ t?þó‘*ˆÆ:' +n'/6@/ÓþD€@ vÝŸôým*Þš' _'9nÚ@/ÓþD€@ yœßï¿@*†¦é'™I',ZÄ@/ÔD€@ |\@W *hïü&ìC/'x@/ØD€@ Ÿý`é*p>™' t'Áª@/ÓþD€@ Úßø"¼*&÷XK'%>@/ÔD€@ „š@ºˆ*‚¸ý&ô`J''S/@/ÔD€@ ‡Y€ +|[*±&õ.ä'#¤Ž@/ÓþD€@ Šà†8*sÓ&þ4l'5"@/×þD€@ ŒØ?ö*›åÒ'^«'GŒ’@/ØD€@ — 'á*•Ñ`'¦Ñ'?ÄR@/ÔD€@ ’Vàé´*Ÿƒ'ã'K §@/ÓþD€@ •?þó‘*’óÔ&ÿ'<a@/×þD€@ —ÕŸôým*i¹¾&÷©v'•™@/ØD€@ š• •:*!ð-&Ä‹W&ÏGç@/ÔD€@ T@W *F|"&â &þˆ@/ÓþD€@  Ÿý`é*³&ïv8'%ļ@/×þD€@ ¢ÒÿójÆ*†,j&îê'+½ø@/ØD€@ ¥’` “*ƒÍ°&ì‰'(µ]@/ØD€@ ¨QÀ o*uwý&äs'—@/×þD€@ «÷L*r<Ä&åno'+@/ØD€@ ­Ð€®*hÄ¿&àö¼'øÌ@/ØD€@ °à·ö*R#Q&ÒR['}@/×þD€@ ³O?úÁÓ*nN×&Ý­'„a@/ÓþD€@ ¶õƒ¥*‚§²&ç­ù''= @/ÔD€@ ¸Íà q*qDã'À'i‡@/ØD€@ »@%N*Žú`&òÙ8'7 +@/×þD€@ ¾LŸù/+*œIB&ù”%'H Ú@/ØD€@ Á Æø*œžI&ÿjT'Hx°@/ÜD€@ ÃË€ß*ž×‹&ù!Æ'KQU@/ÛýD€@ ÆŠßø"¼*’µÜ&ðŠì';Ê@/ØD€@ ÉJ@ºˆ*Žx¬&ììå'6]@/ØD€@ Ì  Äe*ŽX÷&ì`³'64p@/×þD€@ ÎÈÿûÎB*Žé&í Œ'6ìè@/×þD€@ Ñˆ_ñØ*‰ÒH&çBû'0iR@/ØD€@ ÔGÀ oë*•Â÷' +'?±à@/ØD€@ ×ÿyÈ*œV;&òö»'Ht@/×þD€@ ÙÆõƒ¥*—@Þ&ô?'Aš¶@/ÜD€@ Ü†c|*‘'¹x'9žÐ@/ÜD€@ ßE_þmY*ƒðG&à¯'(á¢@/×þD€@ â¿ôw6*†mD&àúm',û@/ØD€@ äÄ *™m'&íT2'DbÂ@/ØD€@ çƒ€ß*›—ÿ&îê'G(õ@/ÛýD€@ êBÿójÆ*”&&è:+'=—:@/ÜD€@ í` “*†ÙZ&Þ_',›U@/ØD€@ ïÁÀ o*f¡&Ð÷'šP@/×þD€@ ò÷L*{ºŒ&Õ`€'!;@/ÜD€@ õ@  ö#*ƒˆ„&Ù¶þ'(\Ñ@/ÜD€@ ø*Œu&ã=§'9´@/×þD€@ ú¿_ö Ý*“£¦&믜'<ún@/ÜD€@ ý~àé´*Š©&Þmi'1|-@/ÜD€@¡>?þó‘*‚eg&Ór'&è1@/×þD€@¡ýŸôým*…z&ã^Û'*àœ@/ÜD€@¡½ ÝD*…RÍ&Õ\Ï'*§m@/ÜD€@¡|ýç!*–C:&áÔ'@V @/ÜD€@¡ <Æø*ª¬Ø&ò_x'Zv×@/ÜD€@¡ û`ÐÕ*¸¤W&üF 'lWz@/ÛýD€@¡ºßø"¼*·oï&ù48'jÌ·@/ÜD€@¡z@ºˆ*¤µ9&ìð•'RÓ|@/ØD€@¡9 Äe*¦ú&í„('Uºã@/ÛýD€@¡ù÷L*Òð&Ûä'5ˆâ@/ÜD€@¡¸€®*ŸÉ¨&èîò'L‡=@/ÜD€@¡x*¥cš&ìQñ'S²°@/ÛýD€@¡!7_ö Ý*¨wé&ëîT'W£º@/ÜD€@¡#öàé´*¯¸&ù”%'`ë«@/ÜD€@¡&¶?þó‘*ÁR™&ýt”'ws÷@/ÛýD€@¡)u¿ðEx*Àôì&ýeÒ'vü@/ÜD€@¡,5 ÝD*ºís&özï'oDj@/ÜD€@¡.ôŸù/+*ħÂ&û)ù'{¸@/àD€@¡1´ *Ážú&úÜ'wÕ»@/ÜD€@¡4s€ß*¥ìƒ&î{X'Taï@/ÛýD€@¡72ÿójÆ*»$6&ý5Ü'oŠƒ@/ÜD€@¡9ò` “*ÉA.&û-*™,M&ܽÁ'D¿@/àD€@¡Dð?ö*|x&âóÝ'54@/ÜD€@¡G¯ 'á*l­&ÆÊ'ƒ@/ÜD€@¡JoÿyÈ*e·¥&Á>z'ä@/ßüD€@¡M.Ÿð˰*˜Çl&á.'CŽž@/ÜD€@¡Oîc|*šH5&ß”'E{&@/ÜD€@¡R­ùµc*Û¸&ØF'9k)@/àD€@¡Um •:*{ñP&¼Î)'!>G@/ÜD€@¡X,`Ÿ* «&Ò’'7-@/ÛýD€@¡Zëßóðþ*«G &å—'[<8@/àD€@¡]«`ÐÕ*µ¬Ú&èmÑ'h‹U@/àD€@¡`jßø"¼*±…&çµZ'c2–@/ÜD€@¡c*@ºˆ*°”œ&ñÎ'bç@/ÜD€@¡eéÀ o*¯Ò&ï±@'a ß@/ßüD€@¡h©?ò^W*®c&ãÔê'^Ýï@/àD€@¡khÀ>-*²s&ä½X'djV@/ÜD€@¡n(ûH +*½â&ëxE's Þ@/ÜD€@¡pç 'á*½¤'¬Ž'r½Œ@/àD€@¡s§ÿyÈ*Ϭ&ôJ''„é@/ßüD€@¡vfŸð˰*ØJ&øDi'Šm@/ÜD€@¡y&c|*Õ„&ö-u'ˆ¦h@/ÜD€@¡{åùµc*ÕF'4r'ˆ[²@/àD€@¡~¥ •:*ÔŠ°&õòm'ˆ×@/àD€@¡dýç!*ÕKÎ&÷B('ˆ‚o@/ßüD€@¡„#ÿï9*П&ó²ã'…/@/ÜD€@¡†ã`ÐÕ*Á0&÷j¾'wG±@/ÜD€@¡‰¢ßø"¼*¶Þa&äü'jg@/àD€@¡Œb` “*µM½&ã»'h•@/àD€@¡!ßüTz*ÇEå&ëß’'É@/àD€@¡‘á`4P*ÆK"&ðÅó'}ÐÐ@/àD€@¡” à†8*µWÓ&ß-A'h@/ÛýD€@¡—`?ö*¬Ü&á¡']B“@/ÜD€@¡šÀ oë*®Û&Ú˲'^Ï-@/àD€@¡œß?úÁÓ*°;&Ý“½'aej@/àD€@¡ŸžÀ ¡©*¥Ñ!&ÔŠ„'T>â@/àD€@¡¢^?þó‘*ª#&Õ´'ZNA@/ßüD€@¡¥¿ðEx*±v&Ù•Ê'b—¢@/àD€@¡§Ý@%N*·Â&Ýyê'k5Ý@/àD€@¡ªœ¿ôw6*©&ØÒA'Xyµ@/àD€@¡­\@W *¥ë&Ò B'T`@/ÜD€@¡°Ÿý`é*³‰7&Ù+'eÎ[@/ÜD€@¡²Û @À*£k3&бv'Q-@/àD€@¡µš ’§*œw&ÑÉÚ'GÖ[@/ßüD€@¡¸Zòä*–$&ÆrU'@ +k@/àD€@¡» Äe*“Ü&æ™'èÎ@/àD€@¢ˆ€®*­é&ŽŽ'^›‡@/àD€@¢H*¶T&ËÙ×'iaQ@/ßüD€@¢ñQç*¹Ã!&Êõ'mÆ‘@/àD€@¢ Ç1¾*µÅ&ÈÖÄ'gÂC@/ÜD€@¢#†_ú;›*¦“¯&¾Ãé'U7ê@/ÜD€@¢&Eà q*¯Ý–&ÌýL'a¡@/àD€@¢)_þmY*ÉKE&×"™'€Ô@/ßüD€@¢+Äßï¿@*ÇÔ‘&Ъ'Èh@/àD€@¢.„`Ÿ*¡Æb&¹ÙØ'Oi@/àD€@¢1Cßóðþ*‰2&³{&'I¥^@/àD€@¢4`ÐÕ*¦n7&½¯6'Uô@/àD€@¢6Âßø"¼*¯p&Âõƒ'`o@/àD€@¢9‚` “*½&­ë'4„É@/àD€@¢cÂ&¯-&ó²ã@/àD€@¢];¿ø¨ô*d8L&‹ö'@/àD€@¢_û@ ˆÊ*œ‚è&³"›'HU£@/àD€@¢bº¿üÚ²*°ÙÉ&¿b'b^r@/àD€@¢ez@ºˆ*¸3î&Â&'kÇ—@/àD€@¢h9À o*£{ &µº°'QAX@/ßüD€@¢jù?ò^W*¨“K&¸â¨'WÆÆ@/àD€@¢m¸À>-*³æä&¾}Ð'fFC@/àD€@¢px?ö*“¶b&¬þñ'=i@/ÜD€@¢s7 'á*P[ê&’È'Y‹@/ÜD€@¢u÷ÿyÈ*‚ï&¢TÓ'&yƒ@/ßüD€@¢x¶Ÿð˰*™‰ú&°†Õ'D‡¦@/àD€@¢{v «†*‹î¶&ªçý'3@/àD€@¢~5Ÿôým*~Qz&§À'"Ã@/àD€@¢€õ ÝD*‡È•&©Öú'-ÍŒ@/àD€@¢ƒ´Ÿù/+*“-z&¯ ÷'-*½®,&¾ q'rÊv@/ÜD€@£˜ûH +*¸ð¹&¸G´'l¹>@/ÜD€@£W 'á*Ò3,&ÄH'†‡&@/ÜD€@£1¾*á=î&Ì''¢@/×þD€@£Ö_ú;›*Δ‚&ÂÉ='„6@/×þD€@£•¿ðEx*È ä&¿qO'€U@/ÜD€@£ U@%N*Äô$&Í›ñ'|Ç@/ÜD€@£#Ÿù/+*¼á‡&º.³'qÄ„@/×þD€@£%Óÿï9*»U6&¸í¹'oÉ;@/ÜD€@£(“€ß*¬8&µ*Î'\Î\@/ÜD€@£+Rßø"¼*¨Øx&²$ +'XR@/ØD€@£.@ºˆ*¨>D&¯ï’'WYð@/ØD€@£0Ñ Äe*±šç&µW'cU¢@/×þD€@£3ÿûÎB*²Ý¸&´/î'dò×@/ÜD€@£6P€®*»&¹'oþº@/ÜD€@£9à·ö*ºx·&¸Å$'n®ÿ@/×þD€@£;Ï?úÁÓ*¬ñ &±']^>@/×þD€@£>ŽŸð˰*œ*ÿ&©ÓI'Gå@/ØD€@£ANc|*‘^Ý&¢ïÇ':@/ØD€@£D _þmY*¤™×&¬án'R°o@/×þD€@£FÌ¿ôw6*®’&±ÇÏ'_sZ@/ÜD€@£IŒ@W *¯jK&±á¢'`ˆ@/ÜD€@£LKŸý`é*¸Ñ&Ü@Q'l©@/×þD€@£O +ÿójÆ*¹hV&¶±à'mRZ@/ØD€@£QÊ` “*¼hy&»ðÌ'q)@/ØD€@£T‰À o*©è&±é'Y +@/×þD€@£WI÷L*½J»&¹Œ^'rK-@/ØD€@£Z€®*Âä®&»`ê'yv¡@/ØD€@£\Çà·ö*µ9&¶Úu'g÷Â@/×þD€@£_‡?úÁÓ*¢pp&¶å‡'Oì@/×þD€@£bFŸð˰*+Ä&žæÃ'4²æ@/ÔD€@£eà q*¥¤t&¬Q‹'T³@/ÔD€@£gÅ@%N*ä<&¥bø'5Ÿ@/×þD€@£j„Ÿù/+*S É&ЇÞ'l@/×þD€@£mCÿï9*€Ãx&þU'$Ñ=@/ØD€@£p`ÐÕ*€Hø&©]:'$4q@/ØD€@£r¿üÚ²*wj &˜Õ‹'X¸@/×þD€@£u‚òä*Sö@&‹§¢'§×@/ÔD€@£xA`4P*4dE&ŒE&ææ¿@/ÔD€@£{À>-*eñJ&0C')É@/×þD€@£}ÀûH +*šíñ&¥='FOI@/×þD€@£€ñQç*¿F&¸]'tÔ@/ÔD€@£ƒ>À ¡©*Êg-&¼yN'‰¶@/ÔD€@£…þ «†*Ä©3&º@'{¹Û@/×þD€@£ˆ½ùµc*É&»hK'€° +@/×þD€@£‹|ßï¿@*Ñ4&¿Lk'…±@/ÔD€@£Ž< *®•&¯óB'_w @/ÔD€@£û€ß*¼Ë&µîW'qmÑ@/ÓþD€@£“º¿üÚ²*»üb&µÍ#'pŸ6@/ÓþD€@£–zòä*˜Xt&£Ûå'C”@/ØD€@£™9€ +|[*Xøà&Šò' +ܸ@/ÔD€@£›øÀ>-*”:ø&¢©'=¼@/ÓþD€@£ž¸ûH +*²æ&°9['d:@/ÓþD€@£¡w_ö Ý*–·ö&¡ÿø'@ëx@/ÔD€@£¤6À ¡©*‡ù•&šèÏ'. D@/ÔD€@£¦öc|*?~9&…M&õr@/ÓþD€@£©µ_þmY)ÿÂj&Wzh&£¯ @/ÓþD€@£¬tŸù/+)çÁW&MŒr&”RÇ@/ÓþD€@£¯3ÿï9* +k &dEÏ&±,Û@/ÔD€@£±ó@ ˆÊ*Ôd&i!Ü&ß9@/ÐD€@£´²€J*YâX&‰èÛ' r$@/ÓþD€@£·qßüTz*H¥‰&„éÂ'iñ@/ÓþD€@£º1÷L*:Ö&cw5&¹äé@/ÏÿD€@£¼ð_ñØ*è‘&h¤l&ù @/ÔD€@£¿¯À oë**s2&€•&Ú- @/ÔD€@£Âo1¾*{ +&pûÑ&Ã,Ú@/ÏÿD€@£Å.?þó‘* âË&b!’&µ,@/ÏÿD€@£Çíùµc*W…&‹‹÷' îÂ@/ÓþD€@£Ê¬ßï¿@*ˆòç&že¢'/Ke@/ÔD€@£Íl *T@&š¸'8½Ã@/ÐD€@£Ð+`ÐÕ*‹]&žh'1îŒ@/ÏÿD€@£Òê ’§*‡Ep&™ â'-%®@/ÏÿD€@£Õ©ßüTz*‹l&¿'†'2 @/ÏÿD€@£Øi÷L*å­&‹ö'5 Ý@/ÔD€@£Û(€®*—· &©s]'B1ú@/ÔD€@£ÝçÀ oë*‘çÆ&ž‘è':ÂE@/ÏÿD€@£à§1¾*£™Q&¨™±'Qh@/ÏÿD€@£ãf?þó‘*¬Ù!&«Ô']>â@/ÏÿD€@£æ%ùµc* }Í&¥6²'MmÓ@/ÏÿD€@£èä¿ôw6*™*Ü&¢­_'D ç@/ÏÿD€@£ë£ÿï9*•Õ³& ò¦'?ÉÛ@/ÌD€@£îc @À*Œ®c&ªTj'4j@/ÌD€@£ñ"` “*·þœ&²6}'kƒW@/ÏÿD€@£óá Äe*ßÔ3&Âî"'@!@/ÏÿD€@£ö à†8*Ü&Á5'ŒÎÈ@/ÏÿD€@£ù`ûH +*ä²Ì&Åê'’]ó@/ÏÿD€@£ü_ö Ý*ß,&Â.I' ¶@/ÏÿD€@£þÞŸð˰*á3×&³'!-@/ËÿD€@¤¿ðEx*ö–Ç&Ìð'Ñ#@/ÌD€@¤] •:*ê+˜&Çò'•Þv@/ÐD€@¤@W *Î(&»Ä‡'„;Ÿ@/ËÿD€@¤ Û`ÐÕ*­†&«†¡'^>@/ËÿD€@¤ š ’§*Ù8I&¿E +'‹N@/ÏÿD€@¤YßüTz*ÿ¾&ÏV©'£¬Û@/ËÿD€@¤ÿûÎB*ý®¡&Κ'¢[H@/ËÿD€@¤Ø?ö+lð&Òªç'©3@/ËÿD€@¤—_ö Ý+ ðà&Ù''³×@/ËÿD€@¤VŸð˰+^©&Ô= +'­E÷@/ÐD€@¤à q+ +ö&× w'±ÞÞ@/ÌD€@¤Õ •:+ã€&Ö³ë'§‰š@/ÈD€@¤"” *ß”Ê& d'‹@/ËÿD€@¤%S`ÐÕ*ä«—& ¨'’YV@/ËÿD€@¤(€J+e»&Ò‰²'©wú@/ËÿD€@¤*ÑÀ o+$N&Üו'»¿@/ËÿD€@¤-à†8+ó&Ý*'¼u@/ÈD€@¤0P+÷&Ó ö'©¯Q@/ËÿD€@¤3?úÁÓ*ñd˜&οf'š}Ò@/ËÿD€@¤5Î_ú;›*ÈB&¶È'€*M@/ÈD€@¤8ùµc*Ï&´ '„Šñ@/ÈD€@¤;LŸù/+*þM'&Íß'¢À½@/ËÿD€@¤> ßóðþ+ÿ\&àäJ'¼(#@/ËÿD€@¤@ÊÿójÆ+w&à>D'À˜u@/ÈD€@¤CŠòä+|º&Ñßý'®´"@/ÈD€@¤FI?ò^W*þiú&ʘÞ'¢Ó/@/ÈD€@¤I_ñØ+íû&Ð'¥¨@/ÈD€@¤KÇñQç*ÿj&Ï'£w\@/ÈD€@¤N†Ÿð˰*·Ù&¯ˆE'jB]@/ÈD€@¤QE¿ðEx*)Ê&ŠŠÑ'%T6@/ÈD€@¤Tßï¿@*Šmí&™i'10‹@/ÈD€@¤VÃÿï9*ä“&âé'’I¨@/ÈD€@¤Yƒ @À+x‡&ÏD7'¤qQ@/ÈD€@¤\B@ºˆ*ãêz&ÄÉ'‘ݾ@/ÈD€@¤_`4P*³[&±•'e“T@/ÈD€@¤aÀ€®*’OŠ&œé¡';G@/ÃüD€@¤dñQç*À¢Ç&³˜ª'v’ê@/ÃüD€@¤g>Ÿð˰*Ðù&» '…)•@/ÈD€@¤iý¿ðEx*›Z&¢­_'Gã@/ÈD€@¤l¼ßï¿@*ŒÁ&”-â'4*e@/ÄD€@¤o{ßóðþ*˜ƒ°&ž•˜'C7ë@/ÄD€@¤r:ÿójÆ*ÑOx&ÃUo'…õk@/ÈD€@¤túòä*â#&Ç•Ë'ºI@/ÄD€@¤w¹÷L*̲&¸›'‚ê @/ÄD€@¤zx?ö*ü÷š&ËÒv'¡æ%@/ÄD€@¤}7?úÁÓ*ùq&ÍÈ6'Ÿf @/ÄD€@¤ö_ú;›*ýN&Ëóª'¡úp@/ÄD€@¤‚µ_þmY+©Ë&Ò"e'¬^u@/ÄD€@¤…týç!*íßß&Çb$'˜=\@/ÄD€@¤ˆ3€ß*Ê<&¶Œû'YÀ@/ÄD€@¤Šò ’§*Çe&¶Ë³'oÝ@/ÄD€@¤± Äe*µWÓ&®§8'h@/ÀD€@¤p  ö#*ž©m&¡”û'KN@/ÄD€@¤“/À oë*›)&Ÿá£'Fšë@/ÄD€@¤•îÀ ¡©*ðe&Çú'™±@/¿ýD€@¤˜­¿ðEx+…e&âk\'Êè0@/¿ýD€@¤›l¿ôw6+,2­&ìNA'ÜiÓ@/ÀD€@¤ž+¿ø¨ô+9¾&öà'íÀ@/ÄD€@¤ êßø"¼+F'&ý5Ü'ý¢²@/ÄD€@¤£©ßüTz+H‚ó&ÿ:^(SÎ@/ÀD€@¤¦hà†8+I`*';Ó(ác@/ÀD€@¤©'à·ö+Uÿ'Xº(\(@/ÀD€@¤«æàé´+R9¨'äƒ(‹M@/ÀD€@¤®¥à q+JD–&þÄO(s“@/¿ýD€@¤±dßï¿@+F'?„'ýt”@/¿ýD€@¤´#ßóðþ+@:K&ùrð'ö -@/ÀD€@¤¶âßø"¼+A&ùµY'÷&}@/¼D€@¤¹¡À o+BP&ú +4'øoÃ@/¼D€@¤¼`À>-+Bãõ&û•'ùuµ@/ÀD€@¤¿À oë+K{(&ÿö†(:W@/ÀD€@¤ÁÞÀ ¡©+Wô'‡@( +5Ç@/»ýD€@¤ÄŸôým+Uyì'FG(Ÿó@/»ýD€@¤Ç\Ÿù/++P†m'šP(tÁ@/ÀD€@¤ÊŸý`é+J®ƒ&ÿ6®(·^@/¼D€@¤ÌÚ€J+FŸq&ü'þ<º@/¼D€@¤Ï™€ +|[+:Hp&õ#Ó'îq3@/»ýD€@¤ÒX_ñØ+2_ž&î-Þ'äQn@/»ýD€@¤Õ_ö Ý+4˜ß'g'ç*@/¼D€@¤×Ö?þó‘+1¹*&î½Á'ã|_@/¼D€@¤Ú•@%N+1ér&ðÍT'ãº+@/¼D€@¤ÝT +22ñ&î̃'ä?@/¼D€@¤à @À+6ßÒ'¦h'ê@@/»ýD€@¤âÑÿ÷œ„+8$Ì&÷T›'ë´9@/·þD€@¤åà†8+0Â&î< 'â@@/¼D€@¤èOà·ö+I÷|&ýŠ·(B;@/¼D€@¤ëÀ ¡©+M½&ÿjT(¬2@/·þD€@¤íÍŸôým+?Óù&÷´‡'õŠ4@/·þD€@¤ðŒýç!+1)Å&íAÀ'âÄÓ@/¸D€@¤óK`ÐÕ+5dÌ&îº'è/@/¸D€@¤ö +@ºˆ+AÆœ&÷¿˜'øv@/·þD€@¤øÉ÷L+G`Ž&úA‹'ÿ3é@/·þD€@¤ûˆ+Bm&÷ó?'øÝ…@/¸D€@¤þFàé´+AQà&ø= '÷s @/·þD€@¥¿ðEx+BNÌ&þ˜ 'ø¶È@/·þD€@¥ÄŸù/++:ëI&òþ'ïA¦@/¸D€@¥ƒ€ß+2]u&ïM£'äNª@/¸D€@¥ B` “+0y;&êyµ'áâÚ@/·þD€@¥ ?ò^W+6¤»&︡'éÈž@/·þD€@¥ÀûH ++7ó&ðmh'êfV@/´D€@¥~àé´+2®&í Œ'ãñ‚@/³ÿD€@¥=¿ðEx+,eÖ&çé'Ü«O@/·þD€@¥üŸù/++.šÄ&ée'ß~l@/´D€@¥»`ÐÕ+8l#&íýè'ì‰@/´D€@¥z@ºˆ+C'Ï'ùºâ@/³ÿD€@¥8ÿûÎB+;Û=&ó}'ðtÉ@/³ÿD€@¥!÷à·ö+C"¦&öÚÛ'ùÅó@/³ÿD€@¥$¶Ÿð˰+I’›&ùáž(«@/³ÿD€@¥'uùµc+>–ë&ó†ž'óô`@/´D€@¥*4@W +6ÇR&í°n'éôã@/¯ÿD€@¥,òÿójÆ+6O´&íÂà'é[È@/³ÿD€@¥/±ßüTz+5D_&í–›'è˜@/´D€@¥2p  ö#+2iµ&ë^r'ä^X@/¯ÿD€@¥5/_ö Ý+6)&î< 'è÷?@/¯ÿD€@¥7î «†+,u°&ç,Ø'Ü¿š@/´D€@¥:­ •:+ ¸ã&Þmi'͹t@/³ÿD€@¥=k¿ø¨ô+,&åè/'ÜG²@/¯ÿD€@¥@*€J+:u&Ý%'ʈC@/¯ÿD€@¥Bé?ò^W+ •*&Ð`K'³ò"@/¯ÿD€@¥E¨+œr&ÕD'¼ñ5@/°D€@¥HfÀ ¡©+ Z~&ÝU'Í@¡@/¯ÿD€@¥K%ùµc+®þ&ÝFC'Ìe@/¯ÿD€@¥Mä@W +¿&Úz‡'ÇÕo@/¬D€@¥P¢ßø"¼+’,&ÜÓä'Ì@8@/¬D€@¥Sa Äe+ _‰&Ü‘|'ÍG@/¯ÿD€@¥V _ñØ+4|Å&û«'ç@/¯ÿD€@¥XßÿyÈ+:5´&ó}'îY8@/¬D€@¥[¿ðEx+/Éi&ïò'áÎ@/¬D€@¥^\ýç!+$Uc&äÌ'ÒXÐ@/°D€@¥a@ ˆÊ+Α&ÙÂ'ȶ|@/¬D€@¥cÙßüTz+&ÕÚ?'Àö@/¬D€@¥f˜  ö#+úô&Åld'¥B@/¬D€@¥iW?úÁÓ+wñ&ÇŽj'¨G›@/¬D€@¥lc|*ü?"&½<×'¡p@/¬D€@¥nÔŸù/+*þ(&÷'¢¡a@/¨D€@¥q“@ ˆÊ*Ù+&µ š'‹EÞ@/¬D€@¥tQÿ÷œ„*ä}y&¹FE'’;Ó@/¬D€@¥w  ö#*ø +˜&Á,'ž¿@/¨D€@¥yÏ?úÁÓ*Ƈª&¬Xì'~J@/¨D€@¥|à q*Ùl+&³ø—'‹&‚@/¨D€@¥Lýç!*ɳ&®¥'k@/¨D€@¥‚ @À*ùˆ€&Á +Ô'Ÿ³…@/¨D€@¥„ÉÀ o+&‰&Õ÷Ã'Ä^@/¬D€@¥‡ˆ€®+²&Í”'·î=@/¨D€@¥ŠG1¾*ñr&¼'šI?@/£ýD€@¥Ÿôým*àuœ&µÉr'§n@/¨D€@¥Ä@W +s³&Ñ–3'¿Lk@/¨D€@¥’‚ßø"¼+.ß9&âÀ7'ßÖ @/¨D€@¥•A€ +|[+(_i&áÐh'ׄ^@/¨D€@¥˜ûH ++¨Ä&Øn¤'Åö½@/£ýD€@¥š¾Ÿð˰+UÖ&Õ¹ 'Ê«P@/¤D€@¥}@%N+*ñL&Þ#Ÿ'ÚÎv@/¨D€@¥ ;ßóðþ+(ÖN&ܧŸ'Ø@/¤D€@¥¢ú` “+!Ýq&ØF'Ï/ì@/¤D€@¥¥¸ÿûÎB+ìN&×é'Ç”ß@/£ýD€@¥¨wñQç+%Ñ!&Ú~8'Ô>â@/¤D€@¥«6 «†+.Èâ&ßËæ'ß¹s@/¤D€@¥­ôŸù/++*o˜&ÞÞ'Ú(q@/ D€@¥°³ @À++æK&à6ä'Ü@/¤D€@¥³qÀ o+ ¯&Öj"'Ìô@/£ýD€@¥¶0?ö+f&Êâ§'¸jÁ@/ D€@¥¸îÀ ¡©+üd&Âp²'¥@/ D€@¥»­@%N*í£X&ºç*'˜Ÿ@/ŸýD€@¥¾k¿ø¨ô*ë¹Z&Æjô'–Ý@/¤D€@¥Á*` “*ë/&·¬À'–„{@/¤D€@¥Ãèà†8*ßO&²ØÒ'ŽëF@/ŸýD€@¥Æ§_ö Ý*Û&š&¯­)'ŒAª@/ D€@¥Éeà q*Ê¢C&©8U'¯‡@/œD€@¥Ì$@W *¦¼ &™Ô'Uk‘@/›þD€@¥Îâ¿üÚ²*®`&ˆ ú'%ýë@/ŸýD€@¥Ñ¡?ò^W*?P&j9ƒ&ôáj@/ D€@¥Ô_À oë*z?&Oûò&º6@/ D€@¥×?þó‘)å^K&; ¸&’˵@/›þD€@¥ÙÜŸù/+)º®&'RÑ&n,d@/œD€@¥Ü› @À)½T&&ó¡&rÇ@/œD€@¥ßY€ +|[)¹e¾&%0Ë&mO@/›þD€@¥â)Ê´l&/ö6&»&@/›þD€@¥äÖ_ú;›)×ÎØ&1ê}&Šû@/›þD€@¥ç”ßï¿@)¾\&.3_&sNŠ@/œD€@¥êS@ ˆÊ)È5´&,H&€"_@/œD€@¥íÀ o*ÇÊ&>}&¤ÖÆ@/›þD€@¥ïÐûH +* žò&VJg&͘@@/—ÿD€@¥òŽõƒ¥*ZüÏ&€×&' &ë@/—ÿD€@¥õLßï¿@*“Ì&Žâk'=.@/˜D€@¥ø @ ˆÊ*´:z&Ùp'f±@@/œD€@¥úÉÀ o*Á©&¤`¶'wâ¥@/›þD€@¥ýˆûH +*Þ ù&­–5'Ž)•@/—ÿD€@¦Fõƒ¥+»&½£'¥6²@/—ÿD€@¦ßï¿@+õ&ÅÓ±'¸hè@/”D€@¦à @À+k&Åôå'º"µ@/”D€@¦€ +|[+ïè&ÍÀÕ'Ç™{@/—ÿD€@¦ ?à·ö+%”š&Ö‡¥'Óñi@/—ÿD€@¦ þ?þó‘+-Šd&Øyµ'Þ!Ç@/—ÿD€@¦¼Ÿù/++3}°&Üו'å¿™@/“ÿD€@¦zßø"¼+;)B&à='ïø@/“ÿD€@¦9?ò^W+9ø&ßG'í…@/“ÿD€@¦÷ñQç+2Í%&Úå…'äÝ @/”D€@¦µà q+:è&ßô{'ïë@/”D€@¦t +=pì&ßûÜ'ò|@/“ÿD€@¦!2€J+@—ø&á×É'ö…@/“ÿD€@¦#ðÀ>-+?‘®&á&²'õ5Y@/D€@¦&¯1¾+Aþ&âQ‰'÷®@/“ÿD€@¦)m_þmY+7°É&ܶa'ëº@/“ÿD€@¦,+Ÿý`é+)—l&Ó,'Ù½@/D€@¦.éßüTz+BE&áÅW'øiN@/D€@¦1¨ûH ++?Ð^&àc)'õ…—@/D€@¦4f_ú;›+5‹µ&Úû¨'è`è@/D€@¦7$Ÿù/++:…¯&Ýû +'î¿™@/D€@¦9âßø"¼+/ Ë&ÖHí'à)ú@/D€@¦<¡÷L+-ŸI&Õ7ê'Þ<‡@/D€@¦?__ö Ý+*Âv&Ö¥)'Ú’‚@/D€@¦BŸôým+!\u&̨q'ΊÓ@/ŒD€@¦DÛ¿ø¨ô+c&»hK'«Ú@/ŒD€@¦G™ÿ÷œ„*Ç¢!&¡¹ß'‡Ø@/D€@¦JX?ö*€àJ&‚&á'$ö"@/ŒD€@¦M_ú;›*KÌ•&gˆW'nt@/ŒD€@¦OÔŸù/+*–Äî&Œ¬'@ü@/ŒD€@¦R’¿üÚ²*á¡^&¬z 'gF@/ŒD€@¦UPÿûÎB+ Â^&¿Hº'µs«@/ŒD€@¦XÿyÈ+$”Ì&Í4£'Ò©û@/ŒD€@¦ZÍ_þmY+-+N4&ãf<(àÅ@/„D€@¦{¶À ¡©+A¼…&ÛWä'÷ûŒ@/ƒýD€@¦~tßï¿@+@‹&Ùi„'õÞ#@/‡ýD€@¦2ÿójÆ+:Š&Ù2-'îÅ"@/„D€@¦ƒðÿûÎB+"U&ÈNB'ÏÉ@/„D€@¦†¯ÿyÈ*åEË&§À'’¼@/„D€@¦‰m ÝD+ +;|&¸5B'°ïû@/€D€@¦Œ+ @À+9Þ&ÕË}'ìã¬@/ƒýD€@¦Žé?ò^W+Q¹e&æt`(96@/ƒýD€@¦‘§?úÁÓ+Y:s&å“T( °@/€D€@¦”e@%N+Tøð&âJ((Mf@/€D€@¦—#@ ˆÊ+MÙ)&àö¼(¾/@/þD€@¦™á?ò^W+Lâ¹&ß›ð( v@/þD€@¦œŸ?úÁÓ+J-‡&Ûý(dÑ@/€D€@¦Ÿ]@%N+HÚ#&Û+ž(‹œ@/€D€@¦¢@ ˆÊ+XÔÙ&âÝ»( +Å©@/þD€@¦¤Ù?ò^W+f÷&ésÃ(…@/þD€@¦§—?úÁÓ+m¦:&ìz†(w@/€D€@¦ªU@%N+u &ð³(Ò’@/|D€@¦­ @À+€ú&÷y(%ÃÐ@/{þD€@¦¯Ñ÷L+z!C&ò€¬( I@/þD€@¦²ÿyÈ+Ø+&õ’(&3j@/|D€@¦µM •:+ƒTþ&ö‰±((ß@/wÿD€@¦¸ +ßø"¼+k\&ôª(%¨$@/{þD€@¦ºÈà†8+y:­&ïÇc(¶@/|D€@¦½†À ¡©+lØ$&ì¼ï(”’@/{þD€@¦ÀD¿ôw6+iDJ&æ^>(Jm@/{þD€@¦Ã ’§+q´”&êÙ¡(±@/xD€@¦ÅÀ€®+€>â&ñd˜($'‡@/wÿD€@¦È~_ú;›+|"&î½Á(!Pº@/wÿD€@¦Ë<@W +u%×&íz(å@/wÿD€@¦Íúòä+ps&é–(¬s@/wÿD€@¦Ð¸+k]×&æO|(¢u@/xD€@¦Óuà q+v’&êót(̆@/wÿD€@¦Ö3¿ø¨ô+v½°&é®Ë(ê +@/wÿD€@¦Øñ Äe+rgH&èL(#a@/tD€@¦Û¯_ö Ý+bO&àTg(Ök@/tD€@¦Þm@%N+aC±&߬(+S@/tD€@¦á*ÿójÆ+]º¦&Ý´ñ( è@/tD€@¦ãèà†8+\¦«&ÜVt( 7x@/tD€@¦æ¦Ÿð˰+`¶v&ÛWä(Ðï@/tD€@¦édýç!+zíç&ê:ü( ˜B@/tD€@¦ì"@ºˆ+‚‘·&í„((' ë@/tD€@¦îàûH ++€z&ë¨;(#áä@/tD€@¦ñà q+eu&ë.|(#t"@/pD€@¦ô[Ÿý`é+cu&Ý­(’“@/pD€@¦÷`4P+Z*f&؈w(  B@/pD€@¦ù×ÿyÈ+h&à +ž(Ís@/oüD€@¦ü”ßï¿@+qrI&ãŽÑ(†•@/pD€@¦ÿR ’§+lxN&àˆ(W<@/pD€@§_ñØ+€På&êv($>–@/pD€@§Î «†+p²œ&â0T( é@/lD€@§‹¿ø¨ô+y݇&æt(éð@/lD€@§ +I€ +|[+jb\&Þ¯Ñ(‚@/pD€@§ ?úÁÓ+^õ&Òs( @/kýD€@§Äßï¿@+hz‡&Þ’N(ÉL@/lD€@§‚ ’§+{Oç&奯( Öú@/lD€@§@?ö+~è&æœö(##ä@/lD€@§þc|+fhè&ÚáÔ(vW@/lD€@§»Ÿý`é+¤¦&è‹U(%ñx@/gýD€@§y?ò^W+~ª'ìê("ü;@/hD€@§ 6àé´+‚p6&é®Ë(&ö@/lD€@§"ôŸù/++‚}Š&é5 ('@/lD€@§%²@ºˆ+€«&æêp($7@/hD€@§(oà·ö+…µ)&ë.|(+%S@/gýD€@§+-ùµc+„b!&èú()s]@/cþD€@§-êÿójÆ+i‰w&ÚU¢(v³@/dD€@§0¨  ö#+Z:A&Óg( ªg@/hD€@§3f?þó‘+`¼9&Ö/(Ô @/gýD€@§6#ßóðþ+_€&ÕUn( +¢@/dD€@§8á`4P+T;m&Ð}Ï(Ô@/dD€@§;Ÿ1¾+m±Â&Ü1(Ø@/cþD€@§>\ýç!+m¹¯&Ûug($u@/cþD€@§Aòä+„šU&çªH()»N@/dD€@§C× 'á+âž&äzð(&@Ê@/dD€@§F•@%N+‡u[&ëÔ(-c@/cþD€@§IR¿üÚ²+‰šp&ê\1(0!Ö@/_þD€@§L?ö+|â'¸(!Hã@/_þD€@§NÍ¿ðEx+l2i&Ù2-(*@/`D€@§Q‹@ ˆÊ+hÆ0&Ö³ë(ù¹@/`D€@§THÀ>-+P9&Ê£ï(p$@/_þD€@§W?þó‘+KËÜ&ÈÀ¡(mþ@/_þD€@§Yÿø¨ô+\Pì&ÐÀ( —@/_þD€@§\?ò^W+ktæ&×8(±7@/`D€@§_>À ¡©+ð«&á>(&RÆ@/\D€@§aü +‡æ!&ù!Æ(-ó]@/[ÿD€@§d¹ Äe+ƒ•Ø&æüâ((má@/[ÿD€@§gw1¾+|\­'±ã(!‚þ@/[ÿD€@§j4ýç!+r3f&Ù‡(-@/[ÿD€@§lñßüTz+†Vî&äµ÷(+ôc@/[ÿD€@§o¯_ö Ý+‰!&ç’(/w5@/[ÿD€@§rl¿ôw6+s•&Ùß“(ÖÆ@/XD€@§u*òä+\\s&λµ( ø@/XD€@§wçñQç+\5Š&ÏD7( ï@/XD€@§z¤ßï¿@+\6û&Íÿ( ïý@/XD€@§}b@ºˆ+|’&ÝU(!¥@/XD€@§€ 'á+„C&á¶•()L*@/XD€@§‚Ý •:+u&Ùù(Ù@/XD€@§…š` “+rø&×íƒ(€@/XD€@§ˆWÀ oë+…ªZ&âÚ +(+}@/TD€@§‹ •:+‡L&ä†(-„9@/TD€@§Ò` “+„%&ßðË() ü@/XD€@§À oë++—&ߪ²(%V„@/TD€@§“M •:+}Žì&ÜD("Fý@/PD€@§– +@ºˆ+qЮ&Öfq(Âÿ@/TD€@§˜Ç 'á+`gë&Ñ=¨(ž«@/SüD€@§›„ßï¿@+TN)&Ì+(à@/OýD€@§žBòä+AŒ÷&¿ö '÷¾¬@/PD€@§ ÿ_ö Ý+ý&þôE(#<Ë@/PD€@§£¼Ÿù/++‰Ö&â“ñ(/a@/PD€@§¦yßüTz+„ý&ÝŒ\()¿@/PD€@§©7ÿyÈ+ƒÂá&Þ9Â((§‡@/PD€@§«ô`Ÿ+¸i&éws(9=ø@/PD€@§®± Äe+‹/&äíN(2à@/PD€@§±nàé´+…u&ß›ð(*@•@/LD€@§´,Æø+ˆŒ”&ä½X(.Èl@/KýD€@§¶é?ò^W+Ž’&éÈž(6wÅ@/OýD€@§¹¦õƒ¥+‘…Ç&è[_(:DÕ@/LD€@§¼cŸý`é+}&è6z(8wª@/HD€@§¿ À>-+|²m&Øì(!¹ß@/LD€@§ÁÞc|+†¶g'Úá(,n™@/LD€@§Ä› @À+ˆqë'iT(.¦L@/GþD€@§ÇX?ö+‘1&Û+ž(%Ø‘@/GþD€@§Ê_þmY+†¯ë&ß4¢(,fL@/HD€@§ÌÒ€J+Œú &ä0(4sB@/HD€@§Ï 'á+ŽtY&äÏË(6W|@/GþD€@§ÒL¿ôw6+†0a&ÝÀ(+à @/GþD€@§Õ ßüTz+„ˆ®&Üw¨()¤µ@/HD€@§×Ç1¾+çÖ'º~(5£¡@/CþD€@§Úƒÿï9+’ÂÔ&çUm(;Ú©@/CþD€@§ÝA÷L+–ðã&ë*(A4U@/DD€@§ßþ «†+‹~ª&᫃(2¦@/DD€@§â»@ ˆÊ+‹&áwÝ(1ïx@/CþD€@§åx?ö+€·ð&ýØ1($Â{@/CþD€@§è5_þmY+ff&Í0ó(t@/DD€@§êò` “+q…&Ò®—(’’@´üD€@§ó… ÝD+r“<'pUm(?ƒ@áCH@§ù@ ˆÊ+n–.'m +i(² @¯ÄCH@§þ`4P+’Û'sgB(#‘0@¯ÃþCH@¨ÿñQç+§ä't0T(%õž@¯ÃþCH@¨ }Ÿôým+ƒS1's§Ò((‘@¯ÄCH@¨û¿ø¨ô+„”‘'tÂ()³í@¯ÆCH@¨yÿ÷œ„+„ÿï'r†5(*=[@¯ÆCH@¨øûH ++‡K't7´(--…@¯ÆCH@¨v_ú;›+„1!'p±©()4¥@¯ÆCH@¨$ôýç!+q/þ'd²G(\'@¯ÆCH@¨*r¿üÚ²+eÇ'^f(‘#@¯ÈCH@¨/ðÿûÎB+d­'^k(ZB@¯ÈCH@¨5o?úÁÓ+c«'\l—(µ)@¯ÈCH@¨:íùµc+a{-'Z˲(NÕ@¯ÈCH@¨@k¿ø¨ô+x?2'e”(àÄ@¯ÈCH@¨Eéÿ÷œ„+…ä['m<7(+a¼@¯ÈCH@¨Kh?ö+Žm%'t7´(6NC@¯ÈCH@¨Pæõƒ¥+t‹'rlb(5@¯ÈCH@¨Vd¿ôw6+ŒÎÐ'pÏ-(4;ë@¯ÊCH@¨[ã @À+‡"Ú'k=>(,ùi@¯ÊCH@¨aa`4P+'c¡D(#Gf@¯ÊCH@¨fßÀ oë+~ñr'c–2(#)ã@¯ÊCH@¨l^c|+âž'epG(&@Ê@¯ÊCH@¨qÜ`Ÿ+‚‘['eEÚ(' u@¯ÊCH@¨wZ ’§+€ã,'cm($ùÒ@¯ÊCH@¨|ØÿûÎB+ƒØÜ'e_­((è@¯ËÿCH@¨‚W_ö Ý+ˆèt'h·›(/>@¯ËÿCH@¨‡Õ¿ðEx+‹7°'måí(22Ì@¯ÌCH@¨T +†µS'fFC(,m7@¯ÌCH@¨’Ò€J+g¶ˆ'U%x(KÜ@¯ËÿCH@¨˜Pà†8+zÛ+'\§Ÿ( ŒE@¯ËÿCH@¨Ï?úÁÓ+ˆŠ'fIó(.Å2@¯ÍÿCH@¨£M¿ðEx+Š‚'fÇc(1J^@¯ÎCH@¨¨Ì +„,r'`×`().¦@¯ÌCH@¨®J€J+oðÇ'S >(Û@¯ÍÿCH@¨³ÈÿûÎB+iód'R²H(º}@¯ÍÿCH@¨¹G_ö Ý+{A~'Y p( ÍÁ@¯ÎCH@¨¾Åà q+„Ö€'^>(*R@¯ÎCH@¨ÄD@W +‹'aÐh(2@¯ÍÿCH@¨É¿üÚ²+““Ì'h¾ü(<æ$@¯ÏÿCH@¨ÏA?ò^W+–'ic)(@ö@¯ÐCH@¨Ô¿À oë+W¹'b7µ(4ë*@¯ÐCH@¨Ú>?þó‘+{v'TÛ( õj@¯ÏÿCH@¨ß¼¿ôw6+w÷'Qx¯((L@¯ÐCH@¨å;@ ˆÊ+ƒ…þ'Wçû((Y—@¯ÐCH@¨ê¹À o+Š¿¶'\(1™;@¯ÏÿCH@¨ð8?ö+‡#'Xê<(-t@¯ÐCH@¨õ¶À ¡©+ƒB'S½('Ä,@¯ÒCH@¨û5_þmY+‰ØÄ'Xß*(0qŸ@¯ÑþCH@©³ßóðþ+“ '_ X('_ú(?°ó@¯ÒCH@© °ÿûÎB+šC*'cØ›(Et±@¯ÑþCH@©/ñQç+˜ÈÝ'`§j(Cw@¯ÒCH@©® «†+ŒÎÐ'W“ (4;ë@¯ÔCH@©,¿ôw6+‡ZV'QÚt(-@n@¯ÒCH@©!«@ ˆÊ+‰2¬'S1(/@¯ÒCH@©')ßüTz+p['Wàš(8á¼@¯ÔCH@©,¨€®+’Ü 'Y?(;úò@¯ÔCH@©2'ÿyÈ+ŽPR'TæÀ(6)^@¯ÓþCH@©7¥¿ðEx+‰b—'PèÍ(/Ú[@¯ÔCH@©=$`Ÿ+ƒü'Kaï('П@¯ÔCH@©B¢ÿójÆ+†fÈ'LÚ@(,®@¯ÔCH@©H! Äe+„ï'Kî!(*'®@¯ÖCH@©M _ñØ+‰&É'Né(/Í@¯ÖCH@©S1¾+(L'S4(8…€@¯ÔCH@©XŸôým+•N'UîŠ(>Ó—@¯ÖCH@©^`Ÿ+˜³?'Xóu(CtË@¯ÖCH@©cšÿójÆ+’o÷'S<¡(;p˜@¯ÖCH@©iÀ o+“Ø@'T d(==Ã@¯ÖCH@©n˜_ñØ+™å}'X¦(DüÉ@¯ÖCH@©tÿyÈ+£2þ'\Æû(På@¯ØCH@©y•à q+¨N×'a,;(Wo'@¯ÖCH@©ýç!+¥ž°'^ì±(SþR@¯ÖCH@©„“@ ˆÊ+¥2š'^”&(Ssø@¯ØCH@©Šÿ÷œ„+¨.j'_Õ(WE¦@¯ØCH@©À>-+¦O;']¯h(TàK@¯ØCH@©•ñQç+¢Î'ZÂx(Pcü@¯ØCH@©šŽ?þó‘+¡p¢'Y¢³(N¤¦@¯ØCH@©  •:+žPË'Vš(J¤Û@¯ØCH@©¥‹¿ø¨ô+¡ù‹'Y=>(OSå@¯ØCH@©« +€J+£ã‰'Y›S(QÇ@¯ÚCH@©°‰`4P+¡ Á'WÑØ(N#†@¯ÙÿCH@©¶ûH ++¥©'YÃè(T (@¯ØCH@©»†àé´+¯£ð'`8(`Ñ×@¯ÙÿCH@©Á¿ðEx+³­÷'bg«(eýe@¯ÙÿCH@©Æ„ýç!+²ï'`úm(eú@¯ÚCH@©Ì`ÐÕ+±®['`'(cn‰@¯ÙÿCH@©Ñ‚òä+©vF'ZLi(XéP@¯ÙÿCH@©×ÿûÎB+¦Ê'W  (TŸ»@¯ÜCH@©Üà·ö+ª þ'ZK(Y¦d@¯ÙÿCH@©áþŸð˰+­'\r(]…ç@¯ÙÿCH@©ç}ùµc+©â\'X¼(Ys©@¯ÜCH@©ìü`Ÿ+«Y'Y9Ž([SG@¯ÜCH@©ò{@ ˆÊ+ª¶î'YZ(ZƒÀ@¯ÛÿCH@©÷úòä+£Â'S´‰(P­Å@¯ÛÿCH@©ýxÿûÎB+¦,'T±A(T„@¯ÜCH@ª÷à·ö+¥êY'TQU(T_+@¯ÜCH@ªvÀ ¡©+¦šä'T= +(UA$@¯ÛÿCH@ª õŸôým+¥w'T%(S˘@¯ÝÿCH@ªtŸù/++ µI'O§Ô(M´Ø@¯ÞCH@ªó€ß+¢/–'P,¥(O™@¯ÜCH@ªr` “+¢çU'Pùg(P„D@¯ÛÿCH@ª#ñ?ò^W+§³ê'S$¦(V¨Ú@¯ÝÿCH@ª)p?ö+£¸M'PÃè(Q¾@¯ÞCH@ª.ïÿyÈ+œ?,'I˜u(Gþð@¯ÞCH@ª4n «†+¦Vo'Pt–(Té„@¯ÞCH@ª9í •:+¨Þô'R (X'Ÿ@¯ÞCH@ª?lÆø+¤'ý'N"š(Rµ@¯ßþCH@ªDêÿójÆ+–ø'DûÝ(A=Ž@¯ÝÿCH@ªJißüTz+ ÇL'K d(MËç@¯ÞCH@ªOèà†8+¤©±'MÜ(Rĺ@¯àCH@ªUgà·ö+Ò±'HØœ(Jr@¯àCH@ªZæàé´+šU.'EÞÂ(E‹À@¯àCH@ª`eà q+¡Ç'JT(OU@¯ßþCH@ªeäßï¿@+¨ˆ|'MÊ(W¸ñ@¯ßþCH@ªkcßóðþ+>ú'F_ã(IF^@¯àCH@ªpâßø"¼+ Ÿ«'H!ý(M™,@¯àCH@ªvaßüTz+¨.j'Lf (WE¦@¯àCH@ª{àà†8+©û'Nî(XQ @¯àCH@ª_à·ö+¨G'Kv:(W¯·@¯àCH@ª†Þàé´+§5Ð'H%­(Vq@¯àCH@ªŒ]à q+­€M'NÊw(^Þ@¯âCH@ª‘Ý •:+²ÕË'R˜t(dè²@¯âCH@ª—\Æø+±ƒ'Oz(c72@¯ßþCH@ªœÚÿójÆ+¨oD'HÄQ(W˜©@¯áþCH@ª¢Zòä+¦ø‘'I C(U¹ @¯âCH@ª§Ù÷L+§»'Hª~(V²@¯âCH@ª­X?ö+¦Â†'Gð.(UsÞ@¯âCH@ª²×?úÁÓ+¦âó'G.}(U_@¯âCH@ª¸V_ú;›+°7'MUØ(aN[@¯äCH@ª½Õùµc+±b²'LWG(c ±@¯âCH@ªÃTýç!+­ 'Iö‰(]K@¯âCH@ªÈÓŸý`é+®äü'J¶a(_Ýl@¯äCH@ªÎR¿üÚ²+µH²'MµÄ(h !@¯äCH@ªÓÑßüTz+³ 'LH…(e7@¯äCH@ªÙPÿûÎB+²!¦'K}›(d@¯âCH@ªÞÐ+ª¶î'Fel(ZƒÀ@¯âCH@ªäOÿyÈ+žxm'?4o(J×–@¯äCH@ªéÎ?þó‘+šî'<ÌP(E=Z@¯äCH@ªïM_þmY+¤S9'BŒ](RV @¯äCH@ªôÌýç!+­8>'H¡(]¸¢@¯äCH@ªúKŸý`é+®|'GØ3(_W¯@¯æCH@ªÿÊßø"¼+¬¶Š'Fv(]œ@¯æCH@«Iÿ÷œ„+¯f±'Hœ(`ƒq@¯äCH@« +É÷L+©‹ä'C÷Ä(Yû@¯äCH@«H?ö+©.8'C‡=(X@¯æCH@«ÇñQç+­Ýú'Ej‹(^ŒÅ@¯æCH@«FŸð˰+°7'Fi(aN[@¯äCH@« Å¿ðEx+²Êü'H+6(dÚÜ@¯æCH@«&E •:+©‹ä'AóB(Yû@¯æCH@«+Ä +¡¸±'=õO(Oâ@¯æCH@«1C`ÐÕ+©Ì¾'BÙ×(YWþ@¯æCH@«6€J+°7'E~Ö(aN[@¯æCH@«õƒ¥+§R£'@6±(V,V@¯çÿCH@«W½¿ðEx+©gÝ'A3i(XÖÝ@¯èCH@«]= •:+°j'Eï(aÏ|@¯æCH@«b¼ +²Ý'F&´(dñë@¯æCH@«h;`ÐÕ+±fL'DÓH(cM@¯çÿCH@«mº ’§+°‘»'D€E(b6@¯çÿCH@«s9ßüTz+«™ê'@œ&([¦J@¯çÿCH@«x¹÷L+ªÓÁ'?Ø(Z¨¥@¯çÿCH@«~8_ñØ+°" +'C¡(as@@¯èCH@«ƒ· 'á+®§½'A‚»(_@¯èCH@«‰6àé´+§¥'>(V–g@¯çÿCH@«Ž¶ «†+ Üê'8Z&(Mç’@¯çÿCH@«”5_þmY+©ÿ'<ôæ(XlÌ@¯çÿCH@«™´Ÿù/++±TI'A»ë(bû>@¯çÿCH@«Ÿ3ßóðþ+³wì'B}›(e¸8@¯èCH@«¤³ @À+·Ý'D‚(jYl@¯êCH@«ª2€J+ºdŠ'E:•(n•+@¯éÿCH@«¯±À o+º¬™'EÑÙ(nñg@¯çÿCH@«µ0ÿûÎB+½Y%'G9(r] @¯çÿCH@«º°?ö+¼¡f'EÈ (qrm@¯êCH@«À/ 'á+»ûª'E‘H(pžJ@¯êCH@«Å®àé´+¸æ¢'C¬"(l¬U@¯éÿCH@«Ë.?þó‘+¶Âÿ'B}›(iï[@¯éÿCH@«Ð­ùµc+·\'Cl(jö9@¯çÿCH@«Ö,¿ôw6+¸6'Cß(kÊ\@¯êCH@«Û¬ +´¢ö'A*0(g6ý@¯êCH@«á+`ÐÕ+§R£'9¨ (V,V@¯éÿCH@«æª¿üÚ²+£aÕ'7Ì(Q!@¯ëÿCH@«ì*òä+£('6'†(P©)@¯êCH@«ñ©`4P+¨f'8óB(W.—@¯êCH@«÷(À>-+©³†':±«(Y7¶@¯éÿCH@«ü¨+¥øÃ'8–(Tq@¯éÿCH@¬'_ö Ý+ ä'4á(MðË@¯ìCH@¬¦À ¡©+™¨>'0º|(D®c@¯êCH@¬ &c|+žj'2ÿ(JÅ#@¯éÿCH@¬¥_þmY+­u~':a(^@¯ëÿCH@¬$¿ôw6+³ŸŽ'=¸o(eêó@¯ìCH@¬¤ +¸°—'@‚R(lg(@¯ìCH@¬##€ß+ºD'AM<(nkª@¯éÿCH@¬(¢¿üÚ²+³›ó'=B`(eæV@¯éÿCH@¬."òä+­F¨':)*(]Ë@¯ìCH@¬3¡€ +|[+«J¦'9p²([@Õ@¯ìCH@¬9 à†8+ª@ '7Jü(Yë‘@¯ëÿCH@¬> ?ö+«5'7þ([%)@¯ìCH@¬D 'á+®áb'9¢(_ØÏ@¯ìCH@¬IŸ1¾+§Ð½'5Fy(V;@¯ëÿCH@¬O_ú;›+«ìÇ'8L(\[@¯ëÿCH@¬T¿ðEx+³Õ™'<‰(f0 @¯ìCH@¬Z ÝD+»@P'>èÎ(o®|@¯ìCH@¬_œýç!+³Õ™':ŽŸ(f0 @¯ëÿCH@¬eßóðþ+¦©M'3¡ã(US–@¯îCH@¬j›`ÐÕ+¬–'6ÉÛ(\é@¯îCH@¬p¿üÚ²+´”':ñ(g$‹@¯ëÿCH@¬ušòä+¸ü@';®d(lÈ@¯ìCH@¬{€ +|[+°7'7LÔ(aN[@¯ìCH@¬€˜à†8+­qä'6u(^k@¯íþCH@¬†_ñØ+®fã'5¯Ÿ(_<@¯îCH@¬‹—À oë+µù<'9;3(hí@¯ìCH@¬‘ÿyÈ+¼¬5'<–Ò(q€C@¯ëÿCH@¬––õƒ¥+Á¤'>«î(wÜ0@¯îCH@¬œc|+À'>óß(y›…@¯îCH@¬¡•_þmY+Á¤'=«…(wÜ0@¯ëÿCH@¬§¿ôw6+¾ÏØ';(t==@¯îCH@¬¬”@W +¿ }';ÞZ(t‡@¯îCH@¬²Ÿý`é+½–d':ÍW(r¬@¯ëÿCH@¬·’ÿójÆ+Á0»'=Ê(wH@¯îCH@¬½€J+ºûÜ'9v(oVÜ@¯îCH@¬Â‘ßüTz+¸E'7 Ž(k¥w@¯îCH@¬È`4P+¸l#'6–4(l‰@¯îCH@¬ÍÀ>-+¶ù +'5Žk(j4ˆ@¯íþCH@¬Ó?ö+µ r'4\3(g¼»@¯îCH@¬Ø 'á+½'8L(rd@¯îCH@¬ÞÿyÈ+õ¥':ÂE(z‚@¯íþCH@¬ãŽõƒ¥+Ä0%':…f({ç@¯îCH@¬éc|+Ä£o'93Ò({²z@¯îCH@¬î_þmY+ÉžÛ'<˜( ‚@¯íþCH@¬ô ßï¿@+º.'3”ú(nOÿ@¯ðCH@¬ùŒ`Ÿ+±‘ˆ'/Î^(cI¤@¯îCH@¬ÿ ¿ø¨ô+¶î;'10‹(j&²@¯îCH@­‹@ ˆÊ+¼€ù'4gE(qHì@¯ðCH@­ + +¿üÚ²+ÊVš':0‹(@¯íþCH@­Šòä+Ëžw':Øh(‚Pð@¯îCH@­  Äe+³¸Æ'.·Ò(f ;@¯ðCH@­‰÷L+²Ùe',5à(díN@¯îCH@­ €®+ÄΫ'5Çš({éÑ@¯îCH@­%ˆ+Ç(Z'7†(~ëø@¯ïþCH@­+ñQç+¼³i'3IX(q‰|@¯îCH@­0†àé´+¦…F'%·Ò(U%x@¯îCH@­6_ú;›+¦hs'$m (U“@¯ðCH@­;…à q+½J»'0—p(rK-@¯ðCH@­A_þmY+Ê…p'5HR(@¯ïþCH@­F„ßï¿@+»“.'-·i(p@¯îCH@­L@W +«G '%Á ([<8@¯îCH@­Qƒ¿ø¨ô+®?A'"@‰(_ I@¯ðCH@­W@ ˆÊ+ÁB¾'/öó(w_¬@¯ðCH@­\‚¿üÚ²+Ôµì'7oà(ˆ"ƒ@¯ðCH@­b@ºˆ+É¢u'1Òà( Ð@¯îCH@­g Äe+Ìûñ'2˜A(ƒ0š@¯íþCH@­m÷L+ÓuD'5ÅÂ(‡UK@¯ðCH@­r€  ö#+ÉO—'1ªK(€ÖÇ@¯ðCH@­xûH ++»×£')4¥(pp,@¯ðCH@­} 'á+¿Þ'*e(u—@¯ðCH@­‚ÿÿyÈ+ÕBp'3c+(ˆ|p@¯ïþCH@­ˆ~Ÿð˰+ãÓk'8ê (‘Îý@¯ðCH@­þ «†+íù'=‘(˜M€@¯îCH@­“}ùµc+ð U'=—:(™®K@¯îCH@­˜ý •:+çfŒ'8ÃL(”¬@¯ðCH@­ž|ýç!+à“''5!•(ºV@¯ðCH@­£üÆø+Û( '3($(ŒB–@¯ðCH@­©{€ß+ÌdŸ',,¦(‚ÏÂ@¯ïþCH@­®úÿójÆ+·'à'".(jp{@¯ðCH@­´z€J+½y’'$˜(r‡!@¯ðCH@­¹ùÿ÷œ„+Ú j'0`(‹Œm@¯ðCH@­¿y€ +|[+è{ø'5ùh(”Ê8@¯ðCH@­ÄøÿûÎB+éIU'5C(•M§@¯ðCH@­Êx€®+î­='7þ(˜ÀË@¯ðCH@­Ïø+ã|ó'22Ì(‘—¥@¯ïþCH@­ÕwñQç+ÜÆ`'0(Á(KÂ@¯ðCH@­Ú÷1¾+â-á'0„ý(Á4@¯ðCH@­àvõƒ¥+Ú6¦',Îû(‹¨@¯ðCH@­åöc|+Ñ÷]'(ç+(†`ß@¯ðCH@­ëuùµc+Ć'#ª({•@¯ðCH@­ðõ •:+¹='cÊ(m@¯ðCH@­ötýç!+¥ü'ט(SXM@¯ïþCH@­ûóÿï9+šá±'6ç(F?›@¯ðCH@®s€ß+¤2Ì'åñ(R,Š@¯ðCH@®òÿójÆ+¾þ®'ˆ®(ty1@¯ðCH@® r€J+Û<')0(Œ;«@¯ðCH@®ñÿ÷œ„+êm+'.é (–m@¯ðCH@®q€ +|[+ó +!'1ò<(›‹š@¯ðCH@®ðÿûÎB+ôÌ}'1A(œ«Õ@¯ðCH@®"p€®+ôð…'1 ¦(œÂä@¯ðCH@®'ð+ìé'-Ø(—Ó@¯ïþCH@®-oñQç+æ••'+(“’ï@¯ðCH@®2ï1¾+öÈ'0þ½(ðõ@¯ðCH@®8nõƒ¥+üÄ'2ƒ÷(¡J»@¯ðCH@®=îc|+úýÂ'1ÿ&( ¢g@¯ðCH@®Cmùµc+ðD]'-z(™ÅZ@¯ðCH@®Hí •:+åX‡')Þ[(’È@¯ðCH@®Nlýç!+çIº')0(”9@¯ðCH@®SìÆø+ã"à''—p(‘^@¯ðCH@®Yk€ß+ãÓk''0#(‘Îý@¯ïþCH@®^êÿójÆ+Ñu©'d3(† Ý@¯ðCH@®dj€J+¸l#'àh(l‰@¯ðCH@®iéÿ÷œ„+´Zç'‡Ý(fÚÂ@¯ðCH@®oi€ +|[+Êã'ð™(Ù@¯ðCH@®tèÿûÎB+×ä-' –j(Š+¢@¯ðCH@®zh€®+Þ¬Ã'"Mr(Žƒ @¯ðCH@®è+áÛ'#D(Œ+@¯ïþCH@®…gñQç+ÞÅü'!$t(Ž“0@¯ðCH@®Šç1¾+â\¸'!«(ß.@¯ðCH@®fõƒ¥+í=¾'&I(—Õ˜@¯ðCH@®•æc|+îøæ''e¢(˜ñ7@¯ðCH@®›eùµc+ì+í'%Jü(—&Z@¯ðCH@® å •:+åq¿'"„É(’Ø)@¯ðCH@®¦dýç!+Û¿]'9\(Œ£o@¯ïþCH@®«ãÿï9+Õú/'EÝ(ˆò +@¯îCH@®±c`ÐÕ+Çpi'|.(H4@¯îCH@®¶âßø"¼+›4'Åø(F©¬@¯ðCH@®¼b` “+Qg?&Ú4n(£@¯ðCH@®ÁáßüTz+)EF&Âõƒ'ت˜@¯ðCH@®Ça`4P+p”Y&èÇ(ø‹@¯ðCH@®Ìàà†8+«1n' +wC([ Œ@¯ïþCH@®Ò`_ñØ+Åtg'¯(|½ô@¯ðCH@®×ßà·ö+Óè'âu(‡Ÿ@¯ðCH@®Ý__ö Ý+ÞŒV'I%(ŽnL@¯ðCH@®âÞàé´+âû>':Ì(‘D£@¯îCH@®è^?þó‘+äJP'„•(’@¯íþCH@®íÝ¿ðEx+á’õ'·Ó(^ @¯ðCH@®ó]@%N+Üߘ'™}([æ@¯ðCH@®øÜ¿ôw6+Ã|'¨©(z8R@¯ðCH@®þ\@W + œ'1ý(M”@¯îCH@¯ÛŸý`é+]ë&ÙÔ‚( ~@¯îCH@¯ [ @À+P}&Ò½Y(nÂ@¯ðCH@¯Ú ’§+–o.&ýxD(@ŽP@¯ïþCH@¯Zòä+ù?'¥–(z†¸@¯ðCH@¯Ù Äe+Þo„'ÁA(Ž[Ù@¯îCH@¯XÿûÎB+ì˜'¶d(—k‡@¯îCH@¯$Ø€®+ñs'›!(š‡ @¯ðCH@¯*X+õ1_' I(œìf@¯ïþCH@¯/×ñQç+üI9'"n§(¡v‹@¯îCH@¯5Vàé´,mâ'#Ö](¥«_@¯îCH@¯:Ö_ú;›,5'"gF(£îX@¯ðCH@¯@Uà q+ý/Î' ô~(¢ +@¯îCH@¯EÕ@%N,·¾'#k_(¦ é@¯íþCH@¯KT¿ôw6,Â['#Â(§_-@¯ðCH@¯PÔ@W +þû' ³î(¢”w@¯îCH@¯VSŸý`é,|'#;i(§?@¯îCH@¯[Ó @À,>C'% D(ª#@¯îCH@¯aR€J,Ex'$'‡(ª–\@¯íþCH@¯fÑÿ÷œ„,I'$ ´(ªšù@¯îCH@¯lQ`4P,^~'$ &(«þ@¯îCH@¯qÐà†8,:w'$+(«Ïõ@¯ïþCH@¯wP_ñØ,ð›'#Fz(«qj@¯îCH@¯|ÏÀ oë,ו'"Ç2(ª ´@¯îCH@¯‚O?úÁÓ,™P'á£(¤›H@¯íþCH@¯‡ÎŸð˰+ÿ©ê'H‡(£Ÿò@¯îCH@¯N «†,ú'!-+ÿñø'ÕW(£Î@¯ëÿCH@° ýç!+õN1'Êz(œþØ@¯ëÿCH@°àûH ++ÝÿÓ'¸Ú(Ž^@¯ìCH@°Ÿà·ö+Åœ 'Ô†(|ð¯@¯ìCH@° _€ß+ÜHF'lÏ(Œû@¯ëÿCH@°?úÁÓ+ò¹'s^(šå•@¯ëÿCH@°Þßø"¼+üPm'Xí(¡{'@¯ìCH@°ž ’§,Tx'e9(¦Ò…@¯ìCH@°^?þó‘,ˆ'±D(ªë­@¯ìCH@°c|,ª¾'TŸ(¨ˆ¡@¯ìCH@°Ý Äe,0>'>|(§ëÕ@¯çÿCH@°@%N,±À'ñk(©ÙH@¯ëÿCH@°!\ÿûÎB,nç'ä(ªËe@¯ëÿCH@°$Ÿù/+,L­'øÌ(ªŸ–@¯ìCH@°&Ü`Ÿ,k±'>(¨7í@¯ìCH@°)œ,o'>|(©ƒ÷@¯çÿCH@°,[Ÿý`é,­^'Òá(®òd@¯ìCH@°/`ÐÕ, z»'Òá(¯ùA@¯ìCH@°1Û1¾,à—'ä(ª<@¯çÿCH@°4š ’§,`L'„•(¬a@¯çÿCH@°7Z?þó‘,m'æZ(¬Ïç@¯ëÿCH@°:ÿ÷œ„,¾*'(«0Ú@¯ìCH@°<Ù Äe,>v'û«(©Eµ@¯èCH@°?™@%N,i²'˵(©} @¯çÿCH@°BXà†8,Zä'uj(«ùv@¯ëÿCH@°EŸù/+,´Ä'Z((­´/@¯ìCH@°GØ@W ,aµ'š¸(®‘‹@¯èCH@°J—à·ö,Ê•'p(¬ˆl@¯çÿCH@°MW€ß,íe'í(¨Ýò@¯çÿCH@°PÿyÈ+ÿ+Ð'hµ(£O=@¯çÿCH@°RÖ¿üÚ²,'¡'ë®(¥Qq@¯çÿCH@°U–_ú;›,MC'¶/(¦ÉL@¯èCH@°XVc|,‘…' s(¨hY@¯ìCH@°[À o,Ñ'†¢(§ÂS@¯ëÿCH@°]Õ_þmY,GÛ'Ì(¦Âa@¯çÿCH@°`”ÿûÎB,;'þ‰(§ÔÆ@¯çÿCH@°cTŸù/+,U¯'z!(ª«@¯èCH@°f@W ,ÎÅ'ß-(¨¶¿@¯èCH@°hÓà·ö,ÔÃ'Hð(¤ç`@¯çÿCH@°k“€ß,&'|—(¤µ@¯çÿCH@°nSÿyÈ,äÇ'ý¸(¦CŽ@¯çÿCH@°q¿üÚ²,'+Ö(§À@¯çÿCH@°sÒ_ú;›,,r',>(©.¦@¯äCH@°v‘ßüTz,†'ó(©­x@¯äCH@°yQùµc,'<'»¸(§àM@¯èCH@°| ÝD,Ð'ƒø(¦}4@¯èCH@°~ÐÀ>-,Ï'å½(§¶Ì@¯çÿCH@°`Ÿ,Ì'G(¥!@¯çÿCH@°„P+ó¬B'ŽÕ(›ó^@¯çÿCH@°‡Ÿý`é+ôY3'6J(œb @¯äCH@°‰ÏÿyÈ,4'”’(¦m@¯äCH@°ŒŽ¿üÚ², '7í(¥*>@¯çÿCH@°N_ú;›+ÿØÀ'Œ_(£½ì@¯èCH@°’c|,'A'(¥AM@¯äCH@°”Íùµc,]z'%ä(¦Þ @¯äCH@°— ÝD,_G'k”(¦àZ@¯èCH@°šLÀ>-+þ”~'•0(¢îe@¯äCH@° @W +ýë('jÂ(¢‚@¯äCH@°ŸËà·ö,sJ'÷](¥²J@¯çÿCH@°¢‹€ß,¾ó'„þ(¦"@¯äCH@°¥K1¾,ø˜'Û²(¦\ì@¯äCH@°¨ + ’§+ÿaÛ' +Ö(£qÔ@¯çÿCH@°ªÊ?þó‘,<Ú'2e(§ûù@¯äCH@°­‰À o,ä•'ÔQ(§Šü@¯äCH@°°I_þmY+þiB'²K(¢Ò¹@¯äCH@°³à†8+ö?–'±(™V@¯äCH@°µÈýç!+ú ]'Ë( ê@¯äCH@°¸ˆ,øÊ'-â(¥~@¯äCH@°»GŸý`é+ý{'£ (¢F@¯äCH@°¾ÿyÈ+ú0d'‰L( ù@¯àCH@°ÀÆ ’§+õÏæ'Rü(QÛ@¯äCH@°Ã†?þó‘+îü€'2Î(˜ó…@¯äCH@°ÆEÀ o+ìLZ' Bÿ(—;@¯àCH@°É@%N+í›k' ÇÐ(˜Œ@¯äCH@°ËÄà†8+çq[' Š(”—@¯äCH@°Î„`Ÿ+×Pu'ÁB(‰Í@¯àCH@°ÑCà·ö+Ò4œ'ô(†ˆ@¯äCH@°Ô€ß+Õh'£U(ˆea@¯äCH@°ÖÃ1¾+Ñá¿'С(†S @¯àCH@°Ù‚€J+ÕÊ'÷Ç(ˆWŒ@¯ßþCH@°ÜAÿ÷œ„+ä¤b' À¤(’Tº@¯äCH@°ß Äe+÷½~'Ó³(žÁ@¯äCH@°áÁ ÝD,Ø]'m¡(¤ëü@¯ßþCH@°ä€Ÿù/++û¹'?(¡O@¯ßþCH@°ç@ûH ++ï=Z' ¶Í(™@¯àCH@°éÿŸý`é+ñR”'Ó(šrJ@¯àCH@°ì¿ÿyÈ+üb'âu(¡X‘@¯àCH@°ï~ ’§+ý’'þ!(¡îr@¯àCH@°ò> «†+ò"' ¶Í(šîÎ@¯àCH@°ôý Äe+×t|'ùŸ(‰ä'@¯àCH@°÷½ ÝD+Ä&ûæ!(y²”@¯ßþCH@°ú|Ÿù/++Øÿ'c(Š>@¯ßþCH@°ý<ûH ++ïß{' Š(™„Ê@¯àCH@°ÿûŸý`é+ú,Ê'”“( ª@¯àCH@±»ÿyÈ+ôéP'  (œ¾H@¯àCH@±z ’§+úÝU'°>( §@¯ÛÿCH@±9ÿ÷œ„,¹½'D:(¤ÄÉ@¯ÛÿCH@± +ùùµc,ž'ÒD(¦‚@¯àCH@± ¸ÿûÎB,Ùb'áo(ª @¯àCH@±xýç!,k'ùj(©[@¯àCH@±8,k'Z](¦Ð@¯ÜCH@±÷`ÐÕ,‡'e(¥Ë§@¯ÛÿCH@±¶ßø"¼,;£'IZ(¤#a@¯ßþCH@±v_ú;›,/'š„(¤<@¯ÜCH@±5À o,@§'l(¦¹'@¯ÜCH@± õ@%N+ý¸·' ã|(¢a½@¯ÛÿCH@±#´Ÿù/++ôó' Kg(œ:Ù@¯ÛÿCH@±&tûH ++üf ' …h(¡ˆý@¯àCH@±)3Ÿý`é,Ò'Öû(¥Cœ@¯ÜCH@±+ó1¾,е'-,Z'A(¥’@¯ÛÿCH@±9°ûH +,ÛÅ'€H(¦8@¯ÛÿCH@±(«>°@¯ØCH@±Rj¿üÚ²,ÜÊ'«(«X @¯ÛÿCH@±U*?þó‘,>v'q†(©Eµ@¯ÜCH@±Wé Äe,¢'ém(ªZi@¯ØCH@±Z¨ÿûÎB,ùk'úp(¬Ä`@¯ØCH@±]h`Ÿ,Õú' á¤(¨¿ø@¯ØCH@±`'¿ø¨ô,ðÿ' oE(¨âŽ@¯ØCH@±bçÿyÈ,^ã'~p(©o6@¯ØCH@±e¦€J,Jà'(ªG@¯ØCH@±heßüTz, ' N(§Ð)@¯ÔCH@±k% ÝD,w' &ë(¤ox@¯ÔCH@±mäýç!,F' û(¦À@¯ØCH@±p£à·ö,Åõ' ù6(§cÉ@¯ØCH@±sc?úÁÓ,Y{'=ß(©hL@¯ØCH@±v" ’§,×Ç' 7î(¨ÂF@¯ÔCH@±xáßüTz,°%' oE(¨Œ@¯ÔCH@±{¡@%N,$Ù'»P(«´I@¯ØCH@±~`Ÿù/+,Az'A(­ œ@¯ÔCH@±à·ö,ð7'}(®F@¯ÔCH@±ƒß?úÁÓ,Ÿ½' y(©Â9@¯ØCH@±†ž ’§,Y{' =w(©hL@¯ÔCH@±‰]ßüTz,?'ðÎ(¬ôÌ@¯ÔCH@±Œ@%N,Õ'%ä(«:@¯ÔCH@±ŽÜýç!,Ã’' ·6(«7Å@¯ÔCH@±‘›à·ö,g€'JÉ(¬ š@¯ÔCH@±”[ÿyÈ,p'¥-(¬æö@¯ÔCH@±—€J,{'"(­je@¯ÔCH@±™ÙÀ o,¦)'jŽ(®é*@¯ÏÿCH@±œ˜ÿûÎB, +>'ó(°­@¯ÔCH@±ŸX`Ÿ, +§'ø˜(°¿@¯ÔCH@±¢Ÿý`é, + '¸(°£ã@¯ÏÿCH@±¤Ößø"¼,åh'ÀØ(­òq@¯ÐCH@±§– «†,CG'”“(­"ê@¯ÔCH@±ªUùµc,¨Z'Ó(¬\@¯ÔCH@±­À>-,ï' aò(©¿ë@¯ÐCH@±¯Ô,Ð' m(¨ûì@¯ÏÿCH@±²“?úÁÓ,O' XP(¦Ëš@¯ÐCH@±µR€J,|K' +ýí(¥½Ñ@¯ÐCH@±¸À o,.Õ' +Èn(¥Zª@¯ÏÿCH@±ºÐÿûÎB,4' +¬Â(¦m@¯ÐCH@±½@W ,v' Zú(ªÔž@¯ÐCH@±ÀO€ß,Ø' Ž¡(¬íá@¯ÏÿCH@±Ã¿üÚ²,,' |/(«½‚@¯ÐCH@±ÅÎc|,3§' Š(©7ß@¯ÐCH@±È@%N,I©' +ñ(¦Ä¯@¯ËÿCH@±ËL`Ÿ, +œ' +Ľ(¦sû@¯ËÿCH@±Î Ÿý`é,VE' _(¦ÔÓ@¯ÏÿCH@±ÐÊßø"¼,&Ø' Ž8(ªo)@¯ÐCH@±ÓŠ «†,{Q' Áß(¬"÷@¯ÌCH@±ÖI@%N,û8' ø(¬Æ®@¯ËÿCH@±Ùýç!, +'¿(®%+@¯ÏÿCH@±ÛÇ¿ø¨ô,e' …h(­Nº@¯ËÿCH@±Þ†ßø"¼,¾*' ;5(«0Ú@¯ÌCH@±áF «†,û8' –(¬Æ®@¯ÌCH@±ä@%N,^L' Oé(­E@¯ËÿCH@±æÄýç!,wé' ÔQ(ªÖí@¯ËÿCH@±éƒŸý`é,Eª' óD(©Nî@¯ÈCH@±ìB¿üÚ²,ÿi' IŽ(¨õ@¯ËÿCH@±ïÿ÷œ„,³[' õ…(«#@¯ÌCH@±ñÁ ÝD,:©' øÍ(ªˆ‡@¯ÈCH@±ô€@W ,€ë' {Æ(ªât@¯ËÿCH@±÷?€ß,k' Áß(¬7@¯ËÿCH@±ùþ ’§,iM' á;(¬ è@¯ÈCH@±ü½À o,í' te(«lÎ@¯ÈCH@±ÿ|à†8,!?' O€(«¯¬@¯ÈCH@²<,’¼' ù6(¬@ñ@¯ÈCH@²ûÿyÈ,l¶' f (­Wó@¯ÈCH@²º?þó‘,J|' ),(­,#@¯ÈCH@² +y_þmY,ŸY' ÷^(¬Q@¯ÈCH@² 8ýç!,rO' Òy(¬p@¯ÈCH@²÷Ÿý`é,Å-' N(¬@¯ÈCH@²¶¿üÚ²,Êc' Ü(­ÏÚ@¯ÈCH@²ußüTz, <' êt(¬Ý½@¯ÈCH@²4ÿûÎB,â' ´õ(¬¦f@¯ÈCH@²ôûH +,ÈÇ' Y(¬†@¯ÄCH@²³ÿyÈ,y„' „ÿ(¬ ©@¯ÄCH@² r?þó‘,iM' ¨ (¬ è@¯ÈCH@²#1_þmY,^L' ‡@(­E@¯ÄCH@²%ð`Ÿ,b' É@(¬¯@¯ÄCH@²(¯€ß,ÿ' o(«ƒÝ@¯ÈCH@²+n ’§,Ò-' r(ªÉ@¯ÄCH@².- Äe,% ' ä‚(ªlÛ@¯ÄCH@²0ìÀ>-, Ó' ü}(ªL“@¯ÃþCH@²3«¿ø¨ô,é™' Q(ª Ã@¯¿ÿCH@²6j¿üÚ²,† ' ‡@(¬0Í@¯ÄCH@²9)ßüTz,‚T' Ë(­sž@¯ÄCH@²;èà†8,NH' ¨(«éR@¯ÀCH@²>§à·ö,NÞ' ëã(¨@¯ÄCH@²Ag1¾,o' 9](©ƒ÷@¯ÄCH@²D&c|,Ñû' Œ`(«J7@¯¿ÿCH@²FäÿûÎB,±\' ¶Í(¬h$@¯¿ÿCH@²I¤,3B' Áß(«Æ»@¯ÀCH@²Lc1¾,m' ³(ªÉ@¯¿ÿCH@²O!ÿ÷œ„,ù' õ…(«|ò@¯¿ÿCH@²QàÿûÎB,Ã`' tÎ(¬3@¯ÀCH@²T ,‹' 4=(¬NÇ@¯ÀCH@²W_1¾,/v' Ôº(­ @¯ÀCH@²Zc|,Z²' v¦(­@ä@¯¿ÿCH@²\ÜÿûÎB,UK' Ž¡(­9ù@¯¿ÿCH@²_œ,Ex' `(ª–\@¯ÀCH@²b[1¾,É' @U(§hf@¯¼CH@²eßüTz,¬½' +ñ(§C@¯¼CH@²gØà†8,fI' Ï(¨1@¯ÀCH@²j—à·ö,¬Y' p´(©Ò]@¯¼CH@²mV¿üÚ²,eå' ¯l(ª¿Þ@¯¼CH@²pÀ o,¯Á' êt(«h@¯¼CH@²rÔŸù/+,(s' +(«¸æ@¯¼CH@²u“Ÿý`é,ý7' 9Æ(«@¯¼CH@²xR€J,eå' ‘é(ª¿Þ@¯¼CH@²{ùµc,tO' æÃ(ªÒP@¯¼CH@²}Ð`Ÿ,ÌÆ' Ž8(©ûß@¯¸CH@²€?úÁÓ,`°' ëã(©q…@¯¼CH@²ƒN?þó‘,o'  (©ƒ÷@¯¼CH@²† ÝD,Û/' H(ªQ@¯¸CH@²ˆÌ,ÓÈ' ,Ü(«L†@¯·þCH@²‹Šßø"¼,Õ' 'T(«:@¯¸CH@²ŽIÀ o,÷Ð' ÷^(«z¤@¯¸CH@²‘Ÿù/+,9' j(«@¯¸CH@²“Ç€ß,š#' „ÿ(«¼@¯¸CH@²–†_ú;›,·(' Z‘(©à3@¯¸CH@²™E@%N,šU' U (©»N@¯¸CH@²œûH +,Ð' Š(¨ûì@¯¸CH@²žÃ1¾,§#' ÃN(¨„@¯¸CH@²¡ßüTz,.?'ˆ(©0õ@¯¸CH@²¤@À>-,¯ó' ýO(©Öú@¯´CH@²¦ÿ€ß,¡' ²´(©I@¯³ÿCH@²©¾_ú;›,Å‘' ³(©ò¥@¯¸CH@²¬}@%N,Sá' Òy(ª¨Ï@¯´CH@²¯<,3t' ¸¦(ªM@¯³ÿCH@²±úßø"¼,¯ó' x(©Öú@¯´CH@²´¹ Äe,• ' 0$(¨lõ@¯´CH@²·xýç!,¡¼' g(¨}@¯³ÿCH@²º7?úÁÓ,£‰' †n(¨h@¯´CH@²¼ö «†,AÞ' û(ª‘À@¯´CH@²¿´à†8,–‰' õ…(ªþ @¯¯ÿCH@²ÂsŸý`é,ë˜' àÒ(¨Û¤@¯¯ÿCH@²Å2_ú;›,ÿi' ÛI(¨õ@¯´CH@²Çñ@%N,×Ç' w¬(¨ÂF@¯´CH@²Ê°,Ãö' r$(¨¨é@¯¯ÿCH@²Ín¿üÚ²,ðÿ' XP(¨âŽ@¯¯ÿCH@²Ð-ùµc,!£' £ò(© Ð@¯°CH@²Òì@W , +8' <¥(©×@¯°CH@²Õ«1¾,`°' @U(©q…@¯¯ÿCH@²ØiÀ o,³À' +ÏÏ(¨”(@¯¯ÿCH@²Û(ýç!,ñ1' +šP(§› @¯¯ÿCH@²Ýç?úÁÓ,£‰' +Èn(¨h@¯¬CH@²à¥ßüTz,×Ç' +»„(¨ÂF@¯¬CH@²ãdŸù/+,' +&(§¹@¯°CH@²æ#`ÐÕ,·Œ' ë(§QW@¯¬CH@²èáÿ÷œ„,ˆ¶' ùÓ(§c@¯¬CH@²ë À>-,™' ¡H(¥â¶@¯¬CH@²î_`ÐÕ,öý' H½(¥/@¯¬CH@²ñ «†+ÿñø'¯¡(£Î@¯¬CH@²óÜÀ>-+ÿ=Ô'µ*(£ZÅ@¯¬CH@²ö›€ß+ýü'ä·(¡÷«@¯¬CH@²ùZ «†+õ€¢'=à( @¯¨CH@²üÀ>-+ç;P'ul(“ý@¯¬CH@²þ×€ß+Îà&ô`J(„<@¯¬CH@³– «†+ò &î*.(z}~@¯¨CH@³TÀ>-+Ú6&úš(‹‡Ð@¯¨CH@³`ÐÕ+í‚3'aó(˜h@¯§þCH@³ Ñÿ÷œ„+ñÿ„'Oé(šÞª@¯§þCH@³ Ÿù/++óåè'r(œB@¯¨CH@³O?úÁÓ+÷F™'`ì(žA©@¯¨CH@³ ßüTz+û`'lg( °=@¯¨CH@³Ìýç!+þ,'!.(¢«†@¯¨CH@³‹ÿyÈ+üý^'×d(¡éÕ@¯¨CH@³IÀ o+ýü'5x(¡÷«@¯¤CH@³@W +úè$'½(( ”’@¯£ÿCH@³Æßø"¼+ýø'Aù(¡ì$@¯§þCH@³"…ùµc,-'(¥X\@¯¤CH@³%D,Ðö'm8(¦*1@¯¤CH@³( ’§,—Q'æ(¥àh@¯¤CH@³*Á ÝD,Ñ('ß.(¤âÃ@¯£ÿCH@³-¿ø¨ô,IÛ'ë(¥}A@¯£ÿCH@³0>?þó‘,Œ´'Gë(¤‹$@¯ CH@³2üÀ>-,8 'ôè(¤Ä@¯¤CH@³5»`ÐÕ,¹½'¶™(¤ÄÉ@¯£ÿCH@³8yßüTz+þ(h'äN(¢©8@¯ŸÿCH@³;8`Ÿ+ù,ü'<(Ÿxó@¯ŸÿCH@³=ößø"¼+úŽ')•( ÿ@¯ŸÿCH@³@µ_þmY+ý’'¬Ž(¡îr@¯ CH@³Csà·ö,Ø]'9)(¤ëü@¯ŸÿCH@³F2_ú;›,]Þ'äN(¤O0@¯ŸÿCH@³Hðà†8+ý0'ô(¡üH@¯ CH@³K¯`ÐÕ+ý3i'(&(¢ l@¯ŸÿCH@³NmßüTz+ý{w' Å(¢:Š@¯œCH@³Q,@W ,S'«(¤AZ@¯œCH@³Sê¿üÚ²,¬ï'@Š(¥ü@¯ŸÿCH@³V©@%N,Ÿ'—=(¦‹ +@¯œCH@³YgŸý`é, +œ'V­(¦sû@¯œCH@³\& «†,9¤'é×(¥h€@¯œCH@³^äýç!+ÿÑ‹'R“(£¹O@¯œCH@³a£1¾+ûÙˆ'ìµ(¡/@¯œCH@³da_þmY,Fr'c-(¤16@¯œCH@³gà·ö,-'Í(¥X\@¯œCH@³iÞ?þó‘,¥ì'>I(¤«l@¯—ÿCH@³lœŸù/+,üd'‹Ã(¥@¯˜CH@³o[1¾,á_'öX(¤÷„@¯œCH@³rùµc,Vw'lg(¥e@¯œCH@³t×à·ö,n'¬Ž(¤cñ@¯˜CH@³w–?þó‘+ý:'ç-(¢ @¯—ÿCH@³zTŸù/++ú3ÿ'÷^( !G@¯“ÿCH@³}ßø"¼+ùÀ´'©ä(Ÿ×}@¯”CH@³Ñ@%N+üä%'ÚC(¡Ù±@¯˜CH@³‚Ÿý`é+ý­è'ßÌ(¢ZÒ@¯˜CH@³…Nc|+þE:'Ü(¢»ª@¯˜CH@³ˆ `Ÿ+ÿsß' (£}[@¯“ÿCH@³ŠÊ ’§+ü‘G'C(¡¤©@¯“ÿCH@³ˆÿûÎB+ùýô'ÔQ(Ÿþ°@¯“ÿCH@³G?úÁÓ+øöñ'™J(ŸV]@¯”CH@³“ Äe+øáS';6(ŸH‡@¯”CH@³•Ãà·ö+ù£á'0$(ŸÅ @¯“ÿCH@³˜‚?þó‘+õnž'ÿ(™@¯“ÿCH@³›@ýç!+önl'XQ(·P@¯CH@³þ¿üÚ²+÷ÚP'œ‘(ž 4@¯CH@³ ¼ÿûÎB+ú>Î'1ý( (2@¯”CH@³£{`ÐÕ+û¼¶'À(¡@¯”CH@³¦9 Äe+üÜñ'gä(¡Õ@¯CH@³¨÷à·ö+ûË'¼¿(¡%Ö@¯CH@³«¶ «†+ýªN'êt(¢X„@¯CH@³®t`Ÿ+ûŸã'Áß(¡ ++@¯ŒCH@³±2€J+øŽu'‹÷(Ÿ~@¯ŒCH@³³ðÀ>-+õŒ'€}(œÙó@¯CH@³¶¯1¾+øq£' ú(Ÿ @¯CH@³¹m@%N+ýb?'Y(¢*f@¯ŒCH@³¼+`ÐÕ+üîô'aó(¡àœ@¯ŒCH@³¾é Äe+ûB6'Î`( Î7@¯‹þCH@³Á§¿ø¨ô+þ¼'ó®(£Â@¯ŒCH@³Äfc|+þÕX'º(£æ@¯ŒCH@³Ç$ûH ++ÿ»í',Ý(£«y@¯‹þCH@³Éâ_ú;›+ÿüÇ' (£Ôú@¯ŒCH@³Ì ýç!+üîô'ð(¡àœ@¯ˆCH@³Ï^ ’§+ûäW';6(¡5ú@¯ˆCH@³ÒÀ>-+übq'pµ(¡†¯@¯ŒCH@³ÔÛ1¾+û˜®'àÒ(¡Ž@¯ŒCH@³×™ ÝD+ú ]'nt( ê@¯‡ÿCH@³ÚW?úÁÓ+ö÷U'jZ(žï@¯‡ÿCH@³Ý_þmY+õì¸'ë(dM@¯„CH@³ßÓ`ÐÕ+ùMi'@V(Ÿ´@¯ƒÿCH@³â‘ùµc+ûÝ#'º(¡1^@¯‡ÿCH@³åOŸý`é+ýàY'Š(¢{@¯ˆCH@³è À o+üý'Š(¡Zß@¯ƒÿCH@³êË¿ø¨ô+ûª²'†o(¡@¯ƒÿCH@³í‰ßüTz+ùIÏ'g(Ÿ‹f@¯ˆCH@³ðH+ù݇'£Š(Ÿéð@¯„CH@³óc|+û‘z'M?(¡ò@¯€CH@³õÄ+ú3ÿ'ài( !G@¯ƒÿCH@³ø‚ «†+øXj'´$(žðè@¯ƒÿCH@³û@ûH ++úÆ'G·( #@¯€CH@³ýþ «†+ûß'B.( þ£@¯„CH@´¼@W +û¼¶'_²(¡@¯ƒÿCH@´z?þó‘+ûäW'`(¡5ú@¯€CH@´8@W +ùBš'˜x(Ÿ†É@¯€CH@´ö?þó‘+÷&,'¼ô(ž,é@¯€CH@´ ´@W +öÈ'–(ðõ@¯€CH@´r?þó‘+÷¤E' F(ž}@¯{þCH@´0ûH ++÷ck'îÂ(žT@¯|CH@´î «†+õ ½' ((œÓ@¯€CH@´¬ûH ++òkš&þ?~(›&%@¯{þCH@´iÿ÷œ„+ó#Z&ÿy(››¾@¯|CH@´(+õnž'kÊ(™@¯€CH@´æc|+ög8'®(²³@¯|CH@´!£à·ö+öc'z‹(°e@¯wÿCH@´$aÀ o+öZ';Ó(}ª@¯{þCH@´'¿ø¨ô+ø)”'ö#(žÒî@¯|CH@´)Ý Äe+ùŠ©'oã(Ÿ´ç@¯xCH@´,›€ß+öXÎ'fA(©z@¯wÿCH@´/Y_þmY+ò.[&þ®,(šþò@¯wÿCH@´2?úÁÓ+å)±&÷Ùl(’ª @¯xCH@´4Õ ÝD+ß*Ý&õmœ(ŽÓÁ@¯xCH@´7“1¾+Þ5Þ&ôz(Ž6õ@¯wÿCH@´:Pà†8+èŠb&ú°9(”Ór@¯wÿCH@´=¿üÚ²+ò¡¥&ÿ–š(›H¼@¯wÿCH@´?ÌŸù/++ðV`&þ8(™Ðâ@¯xCH@´BŠ€J+ç z&÷T›(“ß@¯tCH@´EH@W +æq&ø.G(“{à@¯tCH@´H «†+í&üÇ(—®e@¯tCH@´JÃà·ö+íê®&ýæ(˜DG@¯tCH@´MÀ o+îzÌ&ý¾](˜ ƒ@¯tCH@´P?€ß+ðžo&þ¼î(™þÿ@¯pCH@´Rý@%N+ñV.&ÿ/M(št™@¯tCH@´U»ÿyÈ+ðâä&ÿy(š*Ï@¯tCH@´Xxà†8+îç&ý@í(˜Tk@¯pCH@´[6 ’§+îŒÐ&ýß’(˜¬ +@¯pCH@´]ô`Ÿ+ñéæ&ÿI (šÓ#@¯pCH@´`² «†+ôG/'SÎ(œV„@¯pCH@´coà·ö+óº¬'W(›ü—@¯pCH@´f- Äe+õ–@'ª‚(,ö@¯pCH@´hë`ÐÕ+ö¨'&(Ü4@¯kÿCH@´k¨ÿûÎB+óð'C4(›’…@¯kÿCH@´nf¿üÚ²+í¿r&ý³L(˜(›@¯pCH@´q$ýç!+îæâ&þYQ(˜å¯@¯lCH@´sâ «†+ññ'|d(š×¿@¯lCH@´vŸà·ö+ò¡¥'YW(›H¼@¯kÿCH@´y]ùµc+öJe'"i( A@¯gÿCH@´|ÿyÈ+öFË'(ò@¯lCH@´~Øà†8+ö1-'N¯(@¯lCH@´–€J+õ¶­'q»(A·@¯gÿCH@´„TûH ++õ W'8Œ(œÕW@¯gÿCH@´‡À o+ô€Ô'à(œ{i@¯hCH@´‰Ï`ÐÕ+õyn'˜(„@¯gÿCH@´ŒŒÿûÎB+õÏæ'ÜP(QÛ@¯gÿCH@´J ’§+ód4'®(›Å@@¯hCH@´’@W +ìpa&ý9Œ(—R*@¯gÿCH@´”ÅßüTz+çF&ú€C(”ë@¯dCH@´—ƒ`ÐÕ+ç«&úxâ(“Ø@¯dCH@´š@ÿûÎB+çtö&û%(”!å@¯dCH@´œþ€J+ìõ¯&þ)[(—§{@¯dCH@´Ÿ¼ûH ++ð·¨&ÿ© (š$@¯dCH@´¢y Äe+ò]1'Ïf(›ì@¯dCH@´¥7?úÁÓ+ðÿ¶'6K(š=A@¯dCH@´§ôÀ>-+ññ'J•(š×¿@¯`CH@´ª²?þó‘+õN1'T7(œþØ@¯_þCH@´­o¿ø¨ô+öÏ´'/¼(õ’@¯`CH@´°-@%N+õȱ'‰¶(M>@¯`CH@´²ê¿üÚ²+ôéP'†(œ¾H@¯`CH@´µ¨@W +ñ×ã'…(šÇ›@¯`CH@´¸eÀ o+òÂ'Æ-(›]|@¯_þCH@´»#?úÁÓ+ô$'X(œ3î@¯`CH@´½àÀ>-+õN1'ul(œþØ@¯\CH@´Àž «†+õ '˜x((Y@¯[ÿCH@´Ã[Ÿý`é+ô×L'°s(œ²À@¯[ÿCH@´ÆÿûÎB+óé‚'jZ(œ‘@¯\CH@´ÈÖ€J+òñ'5(šõ¹@¯\CH@´Ë“à·ö+óV'n (›7@¯[ÿCH@´ÎQ_þmY+ð'…(™õÆ@¯[ÿCH@´Ñ¿üÚ²+í—Ñ&ÿ´(˜>@¯XCH@´ÓÌûH ++ê˜g&þé4(–$@¯XCH@´Ö‰ùµc+î°×'Ln(˜Ã@¯XCH@´ÙFßø"¼+ðK‘'½(™É÷@¯XCH@´Ü@W +ðÉ«'5(š«@¯XCH@´ÞÁ Äe+î´q'‹&(˜Åg@¯XCH@´á1¾+ï8'·k(™R@¯XCH@´ä<`Ÿ+ðK‘'ÖÇ(™É÷@¯TCH@´æù Äe+ñQ'~¥(š?@¯TCH@´é·1¾+ñ¬¦'([(š«ð@¯TCH@´ìt@W +ñÛ}'a!(šÉê@¯TCH@´ï1 Äe+ô³E'Vx(œ›±@¯SþCH@´ñîßø"¼+ôNd']Ù(œ[!@¯TCH@´ô¬@W +ò¥@' ¯(›K +@¯TCH@´÷iùµc+ða/'[˜(™×Ì@¯OÿCH@´ú&¿üÚ²+í+»'|d(—Ê@¯PCH@´üä+ë,&ÿ·Î(–‚£@¯PCH@´ÿ¡@%N+ì˜'b(—k‡@¯PCH@µ^€J+ðâä'y(š*Ï@¯OÿCH@µ¿ø¨ô+ñí'ài(šÕq@¯OÿCH@µØÿûÎB+ðG÷'°s(™Ç¨@¯PCH@µ +–?þó‘+ïzš'ul(™D:@¯LCH@µ S`ÐÕ+ðâä'¿5(š*Ï@¯KÿCH@µŸù/++ðˆÑ'¿5(™ñ*@¯KÿCH@µÍÀ o+îõK'|Í(˜îé@¯LCH@µ‹1¾+í—Ñ'6´(˜>@¯KÿCH@µHûH ++ë}'h(–iF@¯HCH@µ@%N+걟'](–4=@¯LCH@µ€J+ëP&'¡H(–™²@¯KÿCH@µ Ÿý`é+éf(')a(•`@¯HCH@µ#<À>-+ë$ê'£!(–~@¯HCH@µ%ùßüTz+ëãÞ'ÍŽ(–ø<@¯HCH@µ(·1¾+î+ˆ'ÿÅ(˜mÈ@¯HCH@µ+tûH ++î—Ÿ'ë{(˜²õ@¯HCH@µ.1@%N+îÜ'åò(˜ÞÄ@¯DCH@µ0î?þó‘+î—Ÿ' ú(˜²õ@¯DCH@µ3«`ÐÕ+íØ«'v(˜8¿@¯HCH@µ6hýç!+íl•'|Í(—ó’@¯CþCH@µ9%ùµc+ëeÄ'½](–§ˆ@¯@CH@µ;â€J+ëW['¬Ã(–žO@¯DCH@µ>ŸŸý`é+ìѨ'®›(—l@¯CþCH@µA\Ÿù/++ï'¼'‘€(™1@¯@CH@µD Äe+ï©'Ð8(™rW@¯@CH@µFÖ ’§+î…›'Z)(˜§m@¯?ÿCH@µI“Ÿý`é+ë'Jþ(–k”@ù[ÿCH@µN¡ùµc+ëµ'ó(–ÚBAÐC(@µS€Ÿù/++êpÅ'Z)(– +¼AäC(@µX_¿ø¨ô+ë±m'òÜ(–×ôAâC(@µ]>¿üÚ²+ë(„'¾Ì(–€UAâC(@µbßüTz+ìà'"(—™¥AäC(@µfüÿûÎB+ë>"&ý5Ü(–Ž*AäC(@µkÜûH ++êÙA&û]Ÿ(–MšAæC(@µp»`ÐÕ+ë†1&ú$(–¼HAæC(@µuš€J+ëÙ&ú:*(–ñQAäC(@µzy Äe+ëÙ&ø³(–ñQAæC(@µXà†8+ë†1&øx(–¼HAæC(@µ„8+éŠ0&ö A(•w)AæC(@µ‰?úÁÓ+éýz&õùÎ(•ÀòAèC(@µö€J+êÜÛ&÷>x(–OèAèC(@µ’ÕÀ o+íH&øêo(—܃AçÿC(@µ—´ÿûÎB+êîß&÷ ô(–[pAèC(@µœ”@W +çƒ_&óøü(”+AêC(@µ¡sŸý`é+éÝ &õ͉(•¬1AéÿC(@µ¦Rßø"¼+èïC&ô“ð(•AêC(@µ«2?þó‘+ëi^&õqM(–©ÖAêC(@µ°ùµc+ë&õE(–tÍAêC(@µ´ðà†8+éýz&óÔ(•ÀòAìC(@µ¹Ð@W +éà¨&ô¾(•®€AìC(@µ¾¯Ÿý`é+èàÚ&óD5(• +ÉAìC(@µÃ1¾+çó&ó?(”r™AìC(@µÈn_ú;›+åÓ&ð¯Ñ(“kAîC(@µÍMßüTz+ç«&ñŸŸ(“ØAîC(@µÒ-@%N+è!æ&ñâ(”“AìC(@µ× Ÿù/++ä÷@&îw¨(’‰ÃAîC(@µÛìûH ++â¨a&í:(‘šAðC(@µàËŸý`é+ã×&íò×(‘ÑKAðC(@µå«ÿyÈ+ãCM&ìvÖ(‘rÁAðC(@µêŠ ’§+æÀÑ&î< (“®šAðC(@µïj «†+å®ÿ&ìš(’ÿ\AðC(@µôI Äe+ã B&êv(‘P*AðC(@µù) ÝD+å§Ê&ì9(’ú¿AòC(@µþÀ>-+åì?&ìz†(“&AòC(@¶è@W +æT»&êá(“imAòC(@¶Çà·ö+åcV&èöS(’ÎïAòC(@¶ §`ÐÕ+å_¼&éÅ(’Ì¡AòC(@¶‡1¾+åŠø&çÚ>(’èMAôC(@¶f ’§+åÖ¡&çË}(“¹AôC(@¶F?þó‘+ä"®&æ.G(’·AôC(@¶ %ßüTz+ãN&åIŠ(‘y¬AôC(@¶%ùµc+ãì£&åy€(‘ß!AöC(@¶)å@%N+ä•ù&å/·(’KAöC(@¶.Äà†8+â¤Æ&äa(‘ LAõÿC(@¶3¤Ÿù/++äß&å©v(‘úÌAöC(@¶8„@W +âìÕ&ãm(‘;jAöC(@¶=d+âÐ&ãùÏ(‘(÷A÷ÿC(@¶BC¿ø¨ô+ã B&ã.å(‘P*AøC(@¶G#€ß+ãgU&âð-(‘‰ÐAøC(@¶L?úÁÓ+â©&áâÚ(±AøC(@¶Pã1¾+à§&àÎ'(kðAøC(@¶U¿üÚ²+â&á²ä(®ÂAúC(@¶Z¢ ’§+âé;&áGç(‘9AúC(@¶_‚_ú;›+ã«&à¸(‘YcAúC(@¶db?þó‘+ã8~&áÎ(‘iˆAúC(@¶iAÿ÷œ„+â’Ã&àí(‘ÄAúC(@¶n!ßüTz+âºd&àM(‘"AüC(@¶sÀ o+âå &ßÖ÷(‘6ÍAüC(@¶wá Äe+â«û&ß½$(‘èAüC(@¶|Áùµc+à¡&ß›ð(ÃAüC(@¶¡_þmY+àUç&ÝžÎ(“#AüC(@¶†@%N+àðÔ&ݦ/(öJAþC(@¶‹a@%N+áˆ&&Ý;2(W"AþC(@¶A ÝD+â©&Þ‡<(±AþC(@¶•! ÝD+ãXë&ß¾(‘€—AýÿC(@¶šÿûÎB+à¨Å&Ûä(È,AýÿC(@¶žàÿûÎB+ßÉd&ÚŸl(96AC(@¶£ÀÿûÎB+ß]N&Ú!ü(Žô AC(@¶¨ ÿûÎB+ßÛh&ÚJ‘(D½AC(@¶­€ÿûÎB+ßÛh&ÚŒú(D½AC(@¶²`ÿûÎB+ßk·&Ù•Ê(ŽýBAC(@¶·@ÿûÎB+ßæ7&ØïÅ(K¨AC(@¶¼! ÝD+àB&Ù9Ž(n>AC(@¶Á ÝD+ßY³&Ø¥û(Žñ»AC(@¶Åá@%N+Þê&×]¡(Žª?AC(@¶ÊÁ@%N+Þˆ¼&ÖÆ^(ŽkýAC(@¶Ï¡_þmY+Þ°^&×ôä(Ž…[AÿC(@¶Ôùµc+ÞÅü&××(Ž“0AC(@¶Ùa Äe+Ýßf&Õì²(ÿAC(@¶ÞAÀ o+Û^&Õ7ê(Œe-AÿC(@¶ã!ßüTz+Øý3&Ò¹©(Šß}AÿC(@¶èÿ÷œ„+Ùò2&Ó€â(‹|IAC(@¶ìâ?þó‘+Û~ƒ&ÔÖ(ŒyíAC(@¶ñÂ_ú;›+ÜÍ”&Ôs(P_AC(@¶ö¢ ’§+ÜV¯&Ô†Ô(GAC(@¶û‚¿üÚ²+Û<&Óg(Œ;«AC(@·c1¾+ÚLD&ÒíO(‹µîAC(@·C?úÁÓ+Ôá)&Ðr¾(ˆ>.AC(@· +#`ÐÕ+Ôá)&ЛS(ˆ>.AC(@·Ÿý`é+Ö£…&ÐÚ (‰^iA +C(@·ä+Ù”…&Ò×,(‹@UA +C(@·Ä@W +ÛÆ’&ÓÕ½(Œ¨ AC(@·¤ýç!+Ù6Ø&ÒC™(‹bAC(@·"„À>-+Ú©ñ&Óöñ(‹ñâA +C(@·'e ÝD+Øeá&Òh~(Š~¤A +C(@·,E_þmY+Ú j&Óšµ(‹ŒmA +C(@·1%À o+Ù´ò&Ó¢(‹UA C(@·6 «†+ÚW&Óëà(‹¼ÙA +C(@·:æ_ú;›+ÙLv&ÓEÛ(‹7A +C(@·?Æ¿üÚ²+Ù¸&Ó$¦(‹WdA C(@·D§ÿyÈ+Ùà.&Ô= +(‹pÁA C(@·I‡€ß+Ø[&ÒN«(Šw¹A C(@·Ngà·ö+Ù &Ó¢(Šô=AC(@·SH`Ÿ+ÙÑ&Ó +Ó(ŠíSAC(@·X(À>-+Ù/¤&ÒÞ(ŠÿÅAC(@·] @%N+×T&Ѩ¦(‰ÏfAC(@·aé Äe+ׂæ&ÒV (‰í`AC(@·fÊ «†+×3¢&Òó(‰º¥AC(@·kª€J+×Ì&Ñë(‰œ«AC(@·p‹1¾+×ÃÀ&ÒÓ|(ŠáAC(@·uk€ß+Õµº&Ђ(ˆÆ:AC(@·zL+ÖWÜ&ÐÇ™(‰-ýAC(@·,ýç!+ÕÎó&Ð…0(ˆÖ^AC(@·„ ÿûÎB+ÕŽ&φŸ(ˆ¬ÝAC(@·ˆíùµc+ÕI¤&ÏÐi(ˆ AC(@·Î «†+ÔŽK&Ï1Å(ˆ &AC(@·’® ’§+Õ e&ÏD7(ˆYÚAÿC(@·—?úÁÓ+Õè+&Îçû(ˆæ‚AÿC(@·œo¿ø¨ô+ØÒ&Ñ.æ(ŠP†AC(@·¡P`Ÿ+Ö)&Í…Î(‰AC(@·¦0ÿûÎB+Ôè]&ÍG(ˆBËAC(@·« Äe+ÔT¥&Ì+(‡äAAC(@·¯ò «†+Ó &ˈ¬(‡pöAÿC(@·´Ò¿üÚ²+Ó4j&Ë;2(‡+ÉAC(@·¹³€ß+ÓuD&Ê«P(‡UKAC(@·¾”ûH ++Ó2&Êhç(‡¥AC(@·ÃtÀ>-+Ó8&ÊøÊ(‡.AC(@·ÈU_þmY+Ò‡z&È®/(†½AC(@·Í6 «†+ÒÁ &ÈÞ%(†âAC(@·Ò¿üÚ²+Òƒà&Èå†(†ºÍAC(@·Ö÷€ß+ÒÝò&ÈvØ(†ôrAC(@·ÛØ@W +ÒX¤&ÇØ3(†Ÿ!AC(@·à¸à†8+ÒÆ&ÇxG(†jAC(@·å™ Äe+ÑÌ!&Çb$(†E4AC(@·êz_ú;›+Ñ14&Ç8(…â AC(@·ï[ÿyÈ+Íâ‡&ľý(ƒÄ-AC(@·ô;à·ö+ÐÌS&Åôå(…¡}AC(@·ùÀ>-+ÎéŠ&Å5 („lAÿC(@·ýýùµc+ÍRi&ÃF­(ƒgòAC(@¸Þ?þó‘+Í}¦&ר(ƒƒAC(@¸¿ÿyÈ+Íô‹&ù (ƒÏµAC(@¸ Ÿà·ö+Î`¡&Ã…e(„âAC(@¸€À>-+ÍÿZ&Ãd1(ƒÖ AÿC(@¸aùµc+Ës;&ÂO}(‚5DAÿC(@¸B_ú;›+ËŒs&•–(‚EhAC(@¸ #?úÁÓ+ÍrÖ&Ûˆ(ƒ|²AC(@¸%ûH ++ΈB&Ãðc(„.?AC(@¸)äÿûÎB+Î¥&Ãv£(„@±AC(@¸.ÅßüTz+ÎR7&Ãw(„ ©AC(@¸3¦¿üÚ²+Îr¤&Ã?L(„ iAC(@¸8‡Ÿý`é+ÍÉO&‘æ(ƒ´ AC(@¸=hŸù/++Îø&ÂО(ƒävAC(@¸BIùµc+Íô‹&¨ (ƒÏµAC(@¸G*€J+ÍŒ&ÃoB(ƒŒÖAC(@¸L `ÐÕ+Ì·}&Ã7ë(ƒËAC(@¸Pì`Ÿ+Ëæ…&Á¸:(‚AC(@¸UÍ@%N+ÌRœ&ÁÎ](‚Ä;AC(@¸Z®?þó‘+ˤ&Á¥(‚>}AÿC(@¸_?úÁÓ+Ë &Âv(‚G·A C(@¸dp@W +ËY&ÁóB(ô´A C(@¸iQ@%N+Êsm&Á‹ô(‘AÿC(@¸n2?þó‘+É¿H&ÀÁ +(BAÿC(@¸s?úÁÓ+ÉÑL&Â= ()ÊA"C(@¸wô`Ÿ+Ê+^&Á(X(coA"C(@¸|Õ_þmY+ÉãO&ÀÚÞ(5QAÿC(@¸¶_ú;›+Ê+^&À¹©(coA"C(@¸†—€ß+ËK™&ÀíP(‚çA"C(@¸‹xýç!+Ëzo&Á:Ê(‚9áA"C(@¸Y Äe+ÊêR&Àa(Ý¥A$C(@¸•:¿üÚ²+Êíì&ÁuÒ(ßóA$C(@¸šà·ö+ËŠ&Á,(íÉA"C(@¸žüà†8+Ée5&À1((€äA"C(@¸£Þc|+ÈOÉ&À4Ø(€3A$C(@¸¨¿ÿyÈ+Èñë&Àd(€šÔA$C(@¸­ @W +Èï&ÀR\(€ A&C(@¸²ùµc+ÆÃx&¿[,(~j×A&C(@¸·b ’§+Æp›&¾÷(~ÆA$C(@¸¼C¿ø¨ô+ÅÒ&¾g­(}5ÜA$C(@¸Á$à†8+ÅÎy&¾Ãé(}1?A&C(@¸Æ «†+ƉÓ&¾÷(~!A&C(@¸Êç?úÁÓ+ÆSÈ&¾›T(}ÛáA&C(@¸ÏÈýç!+ÆÑâ&½9&(~}JA(C(@¸Ô©À o+Æ‚ž&¼(~ÕA&C(@¸ÙŠßø"¼+dž&¼>F(cßA&C(@¸ÞlûH ++ÆZý&º¾•(}åA(C(@¸ãM_þmY+Æ,&&º ~(}©'A(C(@¸è. ’§+ÆWb&º.³(}à~A(C(@¸íà·ö+Ç^e&¹À(1%A(C(@¸ññ ÝD+ÆAÄ&¸Þ÷(}ÄÒA'ÿC(@¸öÒ_ú;›+Çð&¹¼T(~Ù†A'ÿC(@¸û³Ÿý`é+ÄŠ7&¸ ¬({’2A*C(@¹”ÿûÎB+ÄÃÜ&¸×—({ÛûA*C(@¹v?þó‘+Ãö&·ú:(zÕA*C(@¹ +WŸý`é+ÃbÇ&·jX(z A*C(@¹8à†8+ÂÀ¦&¶Ó(yHƒA*C(@¹?þó‘+Ä&¶ê(y²”A*C(@¹û€ß+Âä®&¶`¶(yv¡A*C(@¹Üà†8+Êi&¶Ÿn(zJÄA,C(@¹"¾?þó‘+ÃM)&¶vØ(yü^A,C(@¹'ŸŸý`é+Âj.&µ¯Ÿ(xÙÕA,C(@¹,€ÿûÎB+ÁfÆ&µ¤(wÊA,C(@¹1b_ú;›+ÁáE&µ.~(x*–A,C(@¹6C¿ø¨ô+ÁŽh&µú(wÀ…A,C(@¹;% ÝD+Á‡3&´ì(w·KA,C(@¹@€J+Àïá&´c”(võ›A,C(@¹Dçà·ö+Àå&´jõ(vçÅA,C(@¹IÉ@%N+Á§ &µ Ý(wàÍA.C(@¹Nª¿üÚ²+À &´jõ(v&A.C(@¹SŒûH ++À«l&´!,(vûA.C(@¹Xm Äe+Áþ&´ÝT(w®A.C(@¹]O1¾+¿º&³×b(uiA.C(@¹b0ýç!+¾J‰&³]£(s’›A/ÿC(@¹gÿ÷œ„+½™&²Â¯(rµ?A0C(@¹kó€ß+ÀŠÿ&´Ù£(vtzA.C(@¹pÔà†8+ÀJ%&´ˆy(v!wA.C(@¹u¶_ú;›+ÁTÂ&µZÄ(wv»A0C(@¹z—à·ö+À K&´n¦(uÎuA0C(@¹y_þmY+¿ó­&´¸o(u²ÉA/ÿC(@¹„Zßø"¼+¿ÖÚ&´“Š(uäA2C(@¹‰<ýç!+¿XÁ&´\3(tì|A2C(@¹Žc|+¿_õ&´Õó(tõµA0C(@¹’ÿ€ß+½ |&³Á?(qüÇA/ÿC(@¹—àÿûÎB+¹ôÙ&±Ï0(n5A2C(@¹œÂ ’§+´X&¯žh(gRA2C(@¹¡¤ûH ++­²¾&¬\(^UnA2C(@¹¦…À o+¡ Á&¤~:(N#†A2C(@¹«g?úÁÓ+¤[&§ïû(QëúA2C(@¹°Hà†8+±{ê&®¹ª(c-ùA4C(@¹µ*€J+·w&°ÔO(j^ A4C(@¹º ûH ++º5´&²©(nY8A2C(@¹¾í Äe+¼€ù&³üG(qHìA2C(@¹ÃÏ?úÁÓ+»ºÐ&³aS(pKHA4C(@¹È°à†8+¼š1&³ÞÃ(qi4A4C(@¹Í’€J+½C(@º‚3à·ö+¶Vé&®<:(ieA>C(@º‡À o+· &¯>{(jK—A<C(@º‹÷Ÿý`é+µÕ5&­¤÷(h¾üA<C(@ºÙùµc+µÀ&®¥(hg\A<C(@º•»`ÐÕ+´˜'&­™å(g)(A>C(@ºš_þmY+µÑš&®½[(hº_A=ÿC(@ºŸ?úÁÓ+µÎ&¯…(hµÃA>C(@º¤a@%N+µÛ&­E +(gÏ-A>C(@º©CÿyÈ+´¸”&¬±x(gR©A>C(@º®% ÝD+µêÓ&®R](hÚ§A>C(@º³1¾+µ£&­[-(g®åA=ÿC(@º·èÿûÎB+´±_&®V (gIpA@C(@º¼Ë1¾+³Ñþ&­SÌ(f+ƒA>C(@ºÁ¬à†8+³eè&¬Ãê(e¡)A=ÿC(@ºÆŽßø"¼+´iQ&­Ø(fí4A@C(@ºËpà†8+² &«^ (cæqA@C(@ºÐRßø"¼+²pé&«a¼(dg‘A@C(@ºÕ4à†8+±äf&«†¡(c³¶A@C(@ºÚßø"¼+²3ª&«½ø(d+A@C(@ºÞøà†8+²àš&¬…2(dö‡A@C(@ºãÚßø"¼+±Òc&¬4(cœ§A@C(@ºè¼à†8+²Š"&¬óà(d‡ÙA@C(@ºížßø"¼+³ª]&­ë(eøÉA@C(@ºò€à†8+³/Ý&­¬X(e[ýABC(@º÷c1¾+°Ò•&« â(bU9ABC(@ºüDÿûÎB+± :&«£(bŸA@C(@»'1¾+°²(&ª¥”(b+¸ABC(@» ÝD+±Ç”&«Ô(cŽÑABC(@» +ëÿyÈ+°j&ª©E(aÏ|ABC(@»Í@%N+°f&«<Ø(aÊßABC(@»¯?úÁÓ+± &«ºH(b¬ØABC(@»‘_þmY+¯Ë’&«C(a’ABC(@»s`ÐÕ+°§Y&¬#(bâABC(@»#Uùµc+°f&«œÄ(aÊßACÿC(@»(7Ÿý`é+¯[â&ª + (`uœABC(@»- Äe+¯Q&©Ä‡(`gÆABC(@»1û¿ø¨ô+®úš&©µÆ(_ùACÿC(@»6ÝßüTz+¯Mx&ªäL(`c)ADC(@»;À+¯Mx&«‚ñ(`c)ADC(@»@¢ «†+®œî&ªM (_0ADC(@»E„@W +®²Œ&ªÙ;(_œÜACÿC(@»Jf_ú;›+®Ô&ªyO(^ßÈACÿC(@»OHýç!+®& &ª¡ä(^éADC(@»T* ’§+­Ï&©Ï™(^zSADC(@»Y À>-+®Šê&«V«(_j!ACÿC(@»]îßø"¼+­" &¨¬#(]œöACÿC(@»bÐÿûÎB+¬\x&§Ý‰(\ŸRAFC(@»g³?úÁÓ+¬ð0&© (]\fAFC(@»l•_þmY+«÷–&¨Å÷(\1ADC(@»qw€ß+¬¨!&©Úª(]*AFC(@»vYÀ o+¬u°&¨ÂF(\¿šAFC(@»{;à·ö+¬XÝ&¨f +(\šµAFC(@»€ «†+ªìù&¦²³(ZÈíAFC(@»…@W +«Å&&§-([Ý¡AFC(@»‰â€J+« Ì&¦Þø(ZíÒAEÿC(@»ŽÄŸù/++«Uu&§nÛ([NªAEÿC(@»“¦ßø"¼+«\ª&¨.³([WäAFC(@»˜ˆÿûÎB+«×)&¨³„([ô°AFC(@»k?úÁÓ+ª¯º&§v<(Zz‡AHC(@»¢Mùµc+ªÓÁ&§-(Z¨¥AHC(@»§/¿ø¨ô+ªNs&¦‚¼(YþAFC(@»¬ßüTz+ªˆ&¦Ð6(ZGÍAFC(@»°ôûH ++©å÷&¦w«(YxFAHC(@»µÖ_ú;›+©Û(&§O(YjpAHC(@»º¸Ÿù/++ª1 &§äê(YÙAHC(@»¿šßø"¼+ªÍ&§„þ(Y´:AHC(@»Ä} ÝD+ªœ&§(YÂAHC(@»É_`ÐÕ+©gÝ&¦D(XÖÝAHC(@»ÎA Äe+¨ ý&¥~(W%AHC(@»Ó#à·ö+§ûù&¥öŠ(WAHC(@»Ø «†+¨N×&¦-â(Wo'AHC(@»Üè`Ÿ+§ˆ®&¥àh(VqƒAHC(@»áÊ ’§+§ß&&¦º(Và1AJC(@»æ¬ÿûÎB+¨°&§¼U(Wë«AJC(@»ë?úÁÓ+¨1&§;4(W%^AHC(@»ðqùµc+§ov&¦¯(VQ;AJC(@»õSà·ö+¦ø‘&¥Ñ¦(U¹ AJC(@»ú6 «†+¦Û¾&¥AÃ(U”&AHC(@»ÿ`Ÿ+¦hs&¥'ð(U“AJC(@¼ú¿üÚ²+¦ +Æ&¥àh(Tˆ¬AJC(@¼ÜÿûÎB+¦°‚&¦†m(U\ÏAJC(@¼ ¿`ÐÕ+¥õ(&¦§¡(TmAJC(@¼¡ Äe+¥Ûð&§°(TL¸AJC(@¼„+¥ü]&§(Tv:AJC(@¼f?þó‘+¥z©&¦8ó(SÐ4AJC(@¼!HŸù/++¥h¥&¦lš(S¹%ALC(@¼&+1¾+¤´€&¥Âä(RÒAJC(@¼+ @%N+¤‰D&¥–ž(R›9AJC(@¼/ïŸý`é+¥°´&§FF(TaAKÿC(@¼4Ñÿ÷œ„+¥Ä&¦ÛH(S8ALC(@¼9´`Ÿ+¥Ô»&¨9Å(TCAJC(@¼>– ’§+¤¸&¨6(R×,AJC(@¼CxÿûÎB+¥64&¨^ª(Sx•ALC(@¼H[`ÐÕ+¤.&§Çf(RßALC(@¼M=À o+¤Âê&§±C(RåAKÿC(@¼R ûH ++¤y&§%(R¤rALC(@¼W€J+¤'ý&¦øÌ(RµALC(@¼[äà†8+£`&¦Š(PÉqAKÿC(@¼`Ç?úÁÓ+£±&¨Oè(Q†…ALC(@¼e© Äe+¤/2&©Cg(R'îALC(@¼jŒ+¤VÔ&©Ï™(RZ¨AKÿC(@¼on_ú;›+¢üó&©o­(PŸðALC(@¼tPÀ>-+¢¼&©®e(PLíALC(@¼y3ÿyÈ+¢^&¨=u(OxÊANC(@¼~ Äe+¢:e&¨ÂF(O¦èANC(@¼‚ø+¡p¢&§¢(N¤¦AKÿC(@¼‡Ú_ú;›+ ù½&¦ñk(N wALC(@¼Œ¼À>-+ Êç&§¢(MЃANC(@¼‘Ÿ?úÁÓ+¡¸±&¨’P(OâANC(@¼– Äe+¡ªG&©¹v(NîpALC(@¼›d+¡àS&ª>G(O3ANC(@¼ F€J+ ^Ð&©À×(MF*ANC(@¼¥(à†8+ x &©À×(MfrAKÿC(@¼ª ?úÁÓ+ Êç&ªP¹(MЃANC(@¼®íÀ o+¡P5&ªTj(N{%ANC(@¼³ÐûH ++ ‚Ø&©8U(MtGANC(@¼¸² ’§+¡u&ª[Ë(NÉ‹ANC(@¼½”ÿûÎB+ \&©£S(LîŠANC(@¼Âw€ß+ŸÙ‚&©ÓI(L›ˆANC(@¼ÇYßüTz+Ÿ!Ã&©ÿ(K°UANC(@¼Ì<`Ÿ+ ö&«ó(Ló'APC(@¼Ñßø"¼+ŸP™&ª|ÿ(KìIANC(@¼Ö@%N+Ÿ(&ª Ã(K«¹ANC(@¼Úã¿ø¨ô+Ÿb&ªX(LXANC(@¼ßÆ «†+À®&¨ÍX(IìcANC(@¼ä¨Ÿù/++ž!õ&©›ò(JhçAPC(@¼é‹ÿyÈ+ž))&©Ÿ£(Jr!APC(@¼îm Äe+äµ&©²(JANC(@¼óP+œfÍ&©G(H1«ANC(@¼ø2€J+œË¯&ªIX(H²ËAPC(@¼ýÿûÎB+œè&ªn=(H×°APC(@½÷€ß+œÒã&«£(H¼APC(@½Ùÿ÷œ„+œF`&ª($(H)APC(@½ ¼ýç!+œ²v&ª6æ(H’ƒANC(@½žßø"¼+œ²v&©‚(H’ƒANC(@½_þmY+F.&©§(IO—APC(@½cà·ö+œŽo&¨ò<(HdeAPC(@½F_ú;›+)\&©˜B(I*³APC(@½$(à†8+;_&©ðÍ(IAÂAPC(@½) `ÐÕ+œŠÕ&ªfÜ(H_ÉAPC(@½-íßüTz+œ;‘&ªq(GúTAPC(@½2Ð`Ÿ+›å&ª+Õ(G‹¥APC(@½7²ßø"¼+œ7÷&ª´V(Gõ·APC(@½<•_þmY+›X–&©8U(F×ÊAPC(@½Awà·ö+›¤?&¨·5(G8£APC(@½FZ_ú;›+›•Ö&¨bZ(G&0AQÿC(@½K<ÿûÎB+š€j&§—p(EÃARC(@½P€ß+š ×&¨Ž (Eì˜APC(@½Uÿ÷œ„+š_ý&¨Ô¹(E™•APC(@½Yäýç!+šr&ªfÜ(E°¤APC(@½^Ç1¾+š‡ž&ªšƒ(EÌPAPC(@½c©ùµc+š‡ž&©å¼(EÌPAQÿC(@½hŒûH ++™J‘&¨Oè(D6|ARC(@½mn ’§+™"ï&§%(DÁAPC(@½rQ ÝD+™«Ø&§O(D³APC(@½w3Ÿý`é+š)ò&¨.³(ETiAQÿC(@½|?þó‘+™Ïß&¨îŒ(DáARC(@½€øÀ>-+˜¶Ù&¨¨s(CyhAPC(@½…Û?úÁÓ+™ÌE&ªÑÚ(DÜAQÿC(@½Š½ßüTz+™o&«ŠR(D ŽARC(@½ `Ÿ+™¯r&«&µ(D·œAPC(@½”‚ßø"¼+˜uÿ&©"3(C&eAQÿC(@½™eùµc+˜¡;&¨=u(C]¼ARC(@½žH+—ÓÞ&§>å(BVÞAPC(@½£*€J+—ÓÞ&§7„(BVÞARC(@½¨ ÝD+–°&§U(@áRAQÿC(@½¬ïŸý`é+—‹Ï&©Ä‡(Aú£AQÿC(@½±Ò?þó‘+—R*&ªÃ(A°ÙARC(@½¶´À>-+—‹Ï&«wß(Aú£ARC(@½»—`ÐÕ+—ˆ5&ªP¹(AöAQÿC(@½ÀyßüTz+—`“&©À×(AÃKAPC(@½Å\`Ÿ+–ây&¨õí(A!ãARC(@½Ê?1¾+—&¨‘(Ak¬AQÿC(@½Ï!ùµc+–o.&¦Ì†(@ŽPAQÿC(@½ÔûH ++—&§©â(APARC(@½Øæ ’§+–Cò&§î(@VùARC(@½ÝÉ@%N+•æF&§7„(?ßATC(@½â«à·ö+–¶&©¯(@¢AQÿC(@½çŽ_ú;›+–`Å&«Z[(@{ÝAQÿC(@½ìpÿûÎB+”h^&«&µ(=ö;ARC(@½ñS€ß+“­&«•c(=lARC(@½ö6 «†+“üH&ªÙ;(=káAQÿC(@½ûŸù/++”€&«.(=Œ)AQÿC(@½ÿû?úÁÓ+”Û©&ª²(>‰ÎATC(@¾ÝßüTz+•å&¨É§(>Á%ARC(@¾ À`Ÿ+”za&¨à(> JARC(@¾£1¾+”¥ž&©4¥(>D¡AQÿC(@¾…ùµc+“®&©q(<-¬AQÿC(@¾hûH ++’=†&ª´V(;0ATC(@¾J¿üÚ²+“K½&¬÷‘(<‰èARC(@¾"-@%N+’“þ&­(;ž¶ARC(@¾'à·ö+“Z'&®µú(<œZATC(@¾+ò€J+”vÇ&®~£(>­AQÿC(@¾0ÔÿûÎB+“Íq&­‡s(=/íAQÿC(@¾5·Ÿý`é+”“š&¬Îû(>-’ATC(@¾:š?þó‘+“íÞ&«ß-(=YoARC(@¾?|À>-+’°Ñ&©Öú(;ÚARC(@¾D_`ÐÕ+’F&ªc,(:á¡ASÿC(@¾IAÿ÷œ„+êÚ&«wß(9~ˆAQÿC(@¾N$ýç!+’D»&¯yƒ(;9AARC(@¾SÿyÈ+’“þ&±F(;ž¶ATC(@¾WéÀ o+’+‚&±…f(;ùATC(@¾\Ì`Ÿ+‘Ê;&±Y (:œuAQÿC(@¾a®ßø"¼+‘Œû&±Bþ(:NAQÿC(@¾f‘ùµc+¦f&¯M=(9&éATC(@¾ktûH ++‘H‡&®~£(9öoATC(@¾pV¿üÚ²+‘zø&¬þñ(:7ARC(@¾u9@%N+­š&¬Ó(90"ARC(@¾zà·ö+3&¬­Ç(8“VATC(@¾~þ€J+üÞ&°tc(9•—AQÿC(@¾ƒàÿûÎB+‘ å&²ƒ÷(9õAQÿC(@¾ˆÃŸý`é+±5&³ø—(94¾ATC(@¾¦?þó‘+!&´(8|GATC(@¾’ˆà†8+Î&´ì(9Y£ARC(@¾—k`ÐÕ+LS&³ø—(8³žARC(@¾œNc|+Ãk&±¦š(8_ASÿC(@¾¡0Ÿù/++P &¯àÐ(7pÌASÿC(@¾¦?úÁÓ+P &¯EÜ(7pÌATC(@¾ªõßüTz+ŽÕ &®‰´(6ÔARC(@¾¯Ø`Ÿ+WT&¯“V(7zARC(@¾´»1¾+=ê&²W±(8¡,ATC(@¾¹ Äe+˜.&³ÿ÷(7ÍATC(@¾¾€@W +Ž’&µ«(6wÅAQÿC(@¾Ãb¿üÚ²+6ç&·jX(7P„AQÿC(@¾ÈE_þmY+ŽAè&·jX(6ìATC(@¾Í(+ «&·šN(7-ATC(@¾Ò + ’§+6ç&¶!þ(7P„ARC(@¾Öí ÝD+LS&µÉr(8³žAQÿC(@¾ÛÏ¿ø¨ô+ŽÊÑ&²ëD(6Æ+ASÿC(@¾à²_ú;›+ŽÎl&²ý¶(6ÊÇATC(@¾å”ÿûÎB+7L&±¶(4Á¨ARC(@¾êw€ß+ŒFü&±ÇÏ(3™ARC(@¾ïZ «†+Œu&²¨Û(3ÉATC(@¾ô<À>-+Œiî&³~×(3ºËAQÿC(@¾ù?úÁÓ+Œ1&´šë(3qíAQÿC(@¾þßüTz+Šóô&´Õó(1ÜATC(@¿äýç!+‹„&·(2”‘ATC(@¿ÇÿyÈ+ŠË&·Es(1[åARC(@¿ © Äe+‹>,&¸æX(2;ARC(@¿Œ@W +гv&º@(1‰ASÿC(@¿nßø"¼+ŠÇG&»-C(1¢êAQÿC(@¿Q_þmY+‹þ4&¹“¿(30çARC(@¿ 4+ŒIÝ&»Y‰(3‘¿ATC(@¿% ’§+Œnú&ºq(3Á?ATC(@¿)ù@%N+Ä&¹À(50WAQÿC(@¿.Û¿ø¨ô+,|&¸˜Þ(4³ÓAQÿC(@¿3¾_ú;›+‹é«&·¬À(3žATC(@¿8 ÿûÎB+‹Wd&¹,(2[bARC(@¿=ƒ€ß+‰èž&¹}œ(0…éARC(@¿Bf «†+‰n×&»Cf(/ê ATC(@¿GHÀ>-+о&½×Ë(0ÌxAQÿC(@¿L+?úÁÓ+Šó;&¿’„(1Û-AQÿC(@¿Q ßüTz+‹l&¾Ò«(2 ARC(@¿Uð`Ÿ+ŠÐI&¿P(1®qARC(@¿ZÓ1¾+‹5†&½ê=(20ATC(@¿_µ Äe+Šîè&¼X(1Õ¤AQÿC(@¿d˜ûH ++ˆç¼&¹rŠ(/=AQÿC(@¿iz¿üÚ²+‰F}&¹gy(/¶cARC(@¿n]@%N+‰<&¹¸£(/\uARC(@¿s?à·ö+ˆ¡z&ºq(.ã,ATC(@¿x"€J+ˆô´&½<×(/M³AQÿC(@¿}ÿûÎB+ˆëV&¿•(/A¶AQÿC(@¿çŸý`é+‰ ö&ÁuÒ(/héARC(@¿†Ê «†+ˆêA&Á_¯(/@TARC(@¿‹¬À>-+ˆ<õ&À¤(.bAQÿC(@¿?úÁÓ+‡ƒ &½‚ð(-t‹AQÿC(@¿•qßüTz+‡!Å&»R((,øARC(@¿šT`Ÿ+‡¡P&»ª³(-›HARC(@¿Ÿ71¾+†þv&»ûÞ(,ÊÕAQÿC(@¿¤ùµc+†ö‰&½øÿ(,À¯AQÿC(@¿¨üûH ++‡¥F&Àøa(- ZARC(@¿­Þ ’§+‡4%&Á“U(-ŒARC(@¿²Á@%N+ˆŽ&Ûˆ(.ÞAQÿC(@¿·£¿ø¨ô+‡Úõ&Äj#(-åAPC(@¿¼†?þó‘+‡1&ÃF­(,×HARC(@¿Áhà†8+‡gN&Ä ç(-QARC(@¿ÆK`ÐÕ+‡ÂÒ&Äq„(-Æ+ARC(@¿Ë.c|+†¾±&÷(,y4AQÿC(@¿Ðýç!+…Ú¡&ÀJû(+UIAPC(@¿Ôó1¾+†ä)&Á„(,©*ARC(@¿ÙÕ Äe+…ñ°&¿u(+rÍAQÿC(@¿Þ¸ûH ++†c&Àoà(+ÚAPC(@¿ãš ’§+…à& ¨(+\4ARC(@¿è}@%N+† Ê&Ä'º(+–ÅAQÿC(@¿í_¿ø¨ô+…›8&Åe(+APC(@¿òB?þó‘+…~Á&Åâs(*ß°APC(@¿÷$À>-+„Œ¤&ÄH()©ÈARC(@¿ü`ÐÕ+ƒ¡`&•–((|£APC(@Àtà†8+ƒÇ&†Õ((­†ANC(@Àæ «†+ƒ·Z&Á„“((˜ÅATC(@ÀW€ß+ƒŸï&ʼnç((zËASÿC(@ÀÈ¿üÚ²+‚ØU&İ<('{NAPC(@À +:+ƒ0š&Ç@ð('ìKAPC(@À «@%N+‚çw&Å×a('Ž­APC(@Àýç!+‚ÆR&Å('d?APC(@ÀÀ o+ƒ3&Ä|•((bÐAPC(@Àÿ1¾+„Hè&Æc“()SAPC(@Àp?þó‘+‚úì&º{('§”APC(@Àá€ß+ƒà&Ãô((ÌâAPC(@ÀR¿üÚ²+ƒ.q&Ä€E('é†APC(@ÀÄ+ƒ`â&Ƨ((*APC(@À 5@%N+‚éD&ÈÈ('ûAPC(@À"¦ýç!+ƒ &ÈÈ('°ÍAPC(@À%À o+‚O&ÇÛä(&ËšAPC(@À'ˆÿûÎB+‚¦&ÇãE(';ªAPC(@À)ú?þó‘+‚1á&Æjô(&¦?APC(@À,k€ß+‚x&Åñ5('£APC(@À.Ü¿üÚ²+‚ü&Å~Ö(&‹€APC(@À1N+Þ§&Å9(&;·APC(@À3¿@%N+ã³&Ä–h(&B,ALC(@À60`Ÿ+¥&ÄëC(%ñîAKÿC(@À8¡Ÿý`é+F@&ÈNB(%x¤APC(@À;à†8+=÷&É’ì(%n APC(@À=„ «†+'D&Ê{Z(%PûAPC(@À?õ_þmY+(&Ȫ~(%!{APC(@ÀBf ’§+€gô&Æ($\APC(@ÀD×ßüTz+€ Í&ÅVA(#çmAKÿC(@ÀGHÿûÎB+€‘&Å@(#îÎALC(@ÀIº?þó‘+~ÉÐ&ÃQ¿(#…APC(@ÀL+€ß+~ã &ÃF­(# ©APC(@ÀNœ¿üÚ²+Y5&ć¦(#lKAPC(@ÀQ+£&ÄE>(#BTALC(@ÀSÿyÈ+£&ÅüF(#BTALC(@ÀUð`Ÿ+}°&Æä´("\4APC(@ÀXaŸý`é+}4!&ÈÖÄ(" âAPC(@ÀZÒà†8+|öá&É´ (!å¯ALC(@À]D+®&ËU(#EŽALC(@À_µ@%N+}ß &ËÀ("z¤APC(@Àb&ýç!+y¢&Í]8(# AKÿC(@Àd—Ÿý`é+}ŒÃ&̤Á("E›ALC(@Àgà†8+~HÕ&Í®c("½ùAPC(@Àiz «†+}€ƒ&Ì Í("=ÄALC(@Àkë@%N+|Ó&Ê ?(!Y}AKÿC(@Àn\ýç!+}Ê&Éܵ("lÎAPC(@ÀpÍÀ o+}sŠ&LJ ("5wALC(@Às>à†8+|½<&ÄØÑ(!ÀÊALC(@Àu° «†+{Æ&Ã))(!"œALC(@Àx!@%N+|¡Ú&Ã?L(!¯DAKÿC(@Àz’ýç!+|“&¨ (!Q¦APC(@À}À o+y™&Á°Ù(¾ ALC(@Àtà†8+xðu&Š…(R6ALC(@Àæ «†+x=&ÄbÂ(Ä¢ALC(@À„W@%N+y'ñ&Ç*Í(u¹AKÿC(@À†Èýç!+z>Î&ÊÓå( (2AKÿC(@À‰9Ÿý`é+{ãŸ&ÌÍV(!5„ALC(@À‹ªà†8+zó«&̤Á( ›óALC(@ÀŽ+x= &Ê{Z(ßbAHC(@ÀÿyÈ+y &ÉLÓ(d3ALC(@À’þ`Ÿ+y|&Ǩ(iEALC(@À•o€ß+xzH&ÅaR(•AKÿC(@À—à¿üÚ²+v[°&Âã(«RAKÿC(@ÀšQßüTz+r 5&¿¨¦(é¼AHC(@ÀœÃ1¾+lÒ&»ÿŽ(^ALC(@ÀŸ4?þó‘+qi£&½²æ( AKÿC(@À¡¥_þmY+r|-&¼ö¾(0ÁAHC(@À¤ýç!+s‹Õ&¾ q(ÞALC(@À¦‡À o+uŒ&ÀÄ»(ÙóALC(@À¨øà†8+sÖÆ&Ã(“AHC(@À«j+p{&Äú(¤&AHC(@À­ÛÿyÈ+n>ý&ÆÊá(z?þó‘+f²g&Ãðc(¥aA@C(@ÁG¯@%N+góÈ&Ä6|(sA@C(@ÁJ ?þó‘+f¼~&Áöò(«ÖA@C(@ÁL‘@%N+düK&¾BÈ(ŒýA@C(@ÁO?þó‘+cWz&½wÞ(ªA@C(@ÁQs@%N+a:S&¼€¯(%TA@C(@ÁSä?þó‘+_²U&¾›T(*tA<C(@ÁVUÿyÈ+cáÔ&ÂDl(Ø6A<C(@ÁXÆ «†+eœC&Âõƒ(ó^A@C(@Á[7ÿyÈ+dÁí&Áä€(g¢A@C(@Á]¨ «†+ee&ÀdÏ(ÐRA@C(@Á`ÿyÈ+cÞò&¿W|(Ö^A<C(@ÁbŠ+aîx&¿u(˜ŸA<C(@Ádû1¾+c Ñ&À‘(O>A@C(@Ágl+cáÔ&Â1ú(Ø6A<C(@ÁiÜà†8+c% +&Ãw(_bA<C(@ÁlMßüTz+bû÷&Ä—(EA<C(@Án¾¿üÚ²+dHß&Å1\((A<C(@Áq/À o+cvv&Äš(“A@C(@Ás ¿üÚ²+`rº&ÂH(¥–A<C(@ÁvŸý`é+b7ø&Ás(Ç©A<C(@Áx‚ ’§+a×&½¯6(ÑA<C(@Ázó€ß+aË&½el(\«A8C(@Á}d`Ÿ+bN&¾BÈ(¶™A<C(@ÁÕ_þmY+c‘Ø&À1((¥A<C(@Á‚F?þó‘+cA$&¿ùÑ(q_A<C(@Á„·@%N+c ¨&½¤$(MÜA<C(@Á‡( «†+`Ûî&»0ô(èêA7ÿC(@Á‰˜ÿûÎB+`4 &º/(}vA<C(@ÁŒ ++a¨“&¿R(kãA<C(@ÁŽzà†8+`e &ÂiQ(œÒA8C(@ÁëÀ o+c¥M&Æ/í(±yA8C(@Á“\ ’§+^ÏZ&Ã…e(˜¹A8C(@Á•Í€ß+]Ø&ÀÏÌ( ƒA<C(@Á˜>ýç!+\\s&¿2—( øA<C(@Áš¯_þmY+ZEÈ&¼ + ( ±ÈA8C(@Á ?þó‘+Y¤_&»dš( J{A8C(@ÁŸ‘ÿyÈ+XÖJ&º‡>( +Æ–A8C(@Á¢+\ì&ºÍW( á;A8C(@Á¤rà†8+] c&¹U( v¦A8C(@Á¦ãÀ o+^G)&¸{[(BA8C(@Á©T ’§+^µ&·¡¯(6A8C(@Á«Å€ß+]#T&¶Ÿn( ‡@A8C(@Á®6`Ÿ+]·Ä&¶›½( æ@A4C(@Á°§ÿyÈ+\¡&¶À¢( Ö)A4C(@Á³+\-&¹ =( éþA8C(@Áµˆà†8+\>è&½ á( õA8C(@Á·ùÀ o+ZŠ=&¿2—( Ý—A8C(@Áºj ’§+]×y&Ãÿ%( ú‹A4C(@Á¼Û_þmY+]à×&Æú×(ŠA4C(@Á¿L?þó‘+[ö!&ÆX‚( Æ{A8C(@ÁÁ½ÿyÈ+Y, &‘æ( +ýwA4C(@ÁÄ-ßüTz+Vá}&½æ( †A4C(@ÁÆž¿üÚ²+WDí&¼A÷( Å·A4C(@ÁÉ€ß+ZÁ¹&¼|þ( A4C(@ÁË€`Ÿ+Z®ü&¸øË( õA4C(@ÁÍñÿyÈ+Z“›&µÍ#( ã–A4C(@ÁÐb+Y ++&³«( +çÊA4C(@ÁÒÒ¿üÚ²+Yƒ:&³ä( v=A/ÿC(@Áß¿üÚ²+[,^&¼|þ( E[A0C(@Ááw€ß+\ʳ&Â×( N‡A4C(@Áãè`Ÿ+\X &Å"š( 3A4C(@ÁæYÿyÈ+[( &ǯž( B–A/ÿC(@ÁèÉßüTz+X¢h&Çpæ( +¥aA0C(@Áë: ’§+V—E&ÄÜ( V’A0C(@Áí«_þmY+U¤o&ÂZ(»(A0C(@Á𠫆+V‹&¿( N»A0C(@ÁòŒà†8+Y‰&¾óß( +íÉA/ÿC(@ÁôýŸý`é+XÖJ&ºÔ¸( +Æ–A0C(@Á÷n`Ÿ+Y…c&·>( 6¦A0C(@ÁùßÿyÈ+W¢&³2?þó‘+MóÒ&ÅÄï(Ï?A(C(@Â@¢à†8+Lr&œ÷(â4A(C(@ÂC€ß+L7:&À”Å(²´A(C(@ÂE„ «†+KOì&¼“!(«A'ÿC(@ÂGô¿üÚ²+M9ê&¹rŠ(XDA'ÿC(@ÂJe_þmY+MyS&µ¯Ÿ(€ÙA(C(@ÂLÖ+M~^&³¹Þ(„A$C(@ÂOFýç!+NÎ(&³sÅ(ZûA$C(@ÂQ·ÿyÈ+M¦&³í…(pA(C(@ÂT'À o+Mšx&¶8 (–A(C(@ÂV˜`Ÿ+MÖÿ&ºx|(¼ÌA$C(@ÂYà†8+N¥&¾óß(á±A$C(@Â[y€ß+M=„&Åê(Z’A$C(@Â]ê+MmË&Ë›(yxA$C(@Â`Z ’§+L¾²&ÏõN( gA$C(@ÂbËÿyÈ+M]ñ&Óšµ(oSA$C(@Âe;À o+Jû&Ó7(è¶A$C(@Âg¬?þó‘+GGV&Îö½'ÿ¡AÿC(@Âj¿üÚ²+IY®&ÍÀÕ(ÝA C(@Âqn`Ÿ+KdÑ&Æ,<(, A C(@ÂsÞà†8+KC¬&À§7(ÔA$C(@ÂvO€ß+K +&»)“(ýwA$C(@ÂxÀ+JÎð&¼±(ÌAÿC(@Â{0ýç!+J6-&¸Z&(jZAÿC(@Â} ÿûÎB+K®Q&ºõì([A C(@€€ß+KpY&ÃV(3lA C(@‚‚+K\,&Ío(&‚AÿC(@„òýç!+Kg³&Õd0(-ãA C(@‡c1¾+Häò&×"™(’‡AC(@‰Ó_þmY+H@¨&×R()aAÿC(@ÂŒCßüTz+H´«&Ö¡y(s¡A C(@ÂŽ´`Ÿ+HŽz&Õé([/A C(@‘$à†8+Hû&Óʬ( ÉAC(@“•@%N+HΜ&Ó¸9(„;AC(@–À o+HÜ&Òó(¢AÿC(@˜v?þó‘+G m&ΰ¤'þáÓAC(@šæ ’§+FÖí&ËIô'þƒ¿AC(@ÂWÿyÈ+F6õ&ÅÇ'ý¶üAC(@Ÿǀß+Fã-&ÀÏÌ'þ“mAC(@¢8+D–&¼>F'úâAC(@¤¨`Ÿ+CŒ&ºò<'ù¡úAC(@§à†8+@Ø&¼±'ö×+AC(@©‰@%N+?&ÁXN'ô¢²AC(@«ùŸý`é+BE&ÊæX'øiNAC(@®j+D¿Š&Ôu'ûÖsAC(@°Úýç!+Dï&Ü‚º'üSAC(@³Jà†8+DJ&ß-A'û@AC(@µ»@%N+Cd8&Ýó'úâAC(@¸+Ÿý`é+D(ð&Ýv9'û®AC(@ºœ+D÷&Ú±Þ'üxAC(@½ `Ÿ+E4þ&×®Ë'ülÊAC(@¿|¿üÚ²+E‡#&ÓPì'üÕðAC(@ÂÁíÿyÈ+F<&Ï#'ý½qAC(@ÂÄ]€ß+Eó9&Éú9'ý`IAC(@ÂÆÍßüTz+DÍó&Æá'ûèåAC(@ÂÉ> «†+Bµ&ǃX'ù9ÁAC(@ÂË®ýç!+Ckm&Ë <'ú#AC(@ÂÎà†8+@E&Ó¢'öAC(@ÂÐ@%N+B__&ßéj'øËÿAC(@ÂÒÿ€ß+Bšu&æÄ'ù¡AÿC(@ÂÕoßüTz+BBŒ&æÛ®'ø§AC(@Â×à «†+@ý’&äzð'÷!AC(@ÂÚPýç!+@#<&áÔ'õï©AÿC(@ÂÜÀ¿üÚ²+?IŸ&Þ·2'ôÙAC(@Âß1ÿyÈ+>‡&×üE'óàAC(@Âá¡_þmY+?åü&ÑW{'õ¡CAC(@ÂäŸý`é+B__&Í£Q'øËÿAC(@Âæ‚+@K–&Én'ö#PAC(@Âèò?þó‘+ArM&Êí¸'÷œŒAC(@Âëbýç!+@˜°&Î|ý'ö†AC(@ÂíÒ¿üÚ²+AØ &Ö–g'ø…AC(@ÂðC1¾+CX±&àþ'ú AC(@Âò³@%N+C€&è'ù›…AC(@Âõ#€ß+As¾&ï!]'÷ždAC(@Â÷“À o+@-S&òçù'õü“AC(@Âú+>©§&ñÚ§'ô [AC(@Âüt?þó‘+?˜â&ñ]7'õ>’AC(@Âþäýç!+=Íà&ïþº'òó AC(@ÃT¿üÚ²+>rä&ïžÎ'óÆBAC(@ÃÄÿûÎB+>W‚&ð^'ó£5A C(@Ã5ÿyÈ+>È£&ôBÆ'ô4A C(@Ã¥_þmY+>KB&îº'ó“‡AC(@à Ÿý`é+>Æ&ìz†'óL‚A C(@à …À o+?Òˆ&ët•'õˆ\A C(@Ãö+??ˆ&çó'ôÌ4A C(@Ãf «†+>ó'&áñœ'ôjoA C(@ÃÖ`Ÿ+>É\&ßÀÔ'ô4ðA ÿC(@ÃFýç!+>é&Ûò×'ô]…AC(@ö ’§+=éB&Û>'óA C(@Ã&à†8+<Ç–&ÛšL'ñ£PA C(@×1¾+:%Ù&ß~l'îDíAC(@Ã!ÿyÈ+:-&æÅ‹'îN&AC(@Ã#w@%N+;ÿý&ñÈ4'ð£ÓA C(@Ã%ç€ß+>7&û5 +'óN[A ÿC(@Ã(WŸý`é+=K'Œþ'ò +AC(@Ã*ÇÀ o+<)'‚¾'ðØfAC(@Ã-7ßüTz+;oß'Æÿ'ïë[AC(@Ã/¨+;+k'e:'AC(@Ã2+;˜:'¹'ðAC(@Ã4ˆ «†+<—&þ÷ö'ð¨pAC(@Ã6ø?þó‘+;ø&û@'ð™®AC(@Ã9h`Ÿ+:Ɖ&ô±t'ïœAC(@Ã;Ø`Ÿ+;m¶&'ïè—AÿC(@Ã>Hýç!+DAüC(@Ãl˜à†8+76J' m'ê‚îAüC(@Ãoà†8+7ðë' a‰'ëqÐAC(@Ãqxà†8+7>ï' Ïf'êÿAüC(@Ãsè¿üÚ²+68¥' ë'é>DAüC(@ÃvX¿üÚ²+7'vr'êE"AüC(@ÃxÈ ’§+6<ø'þŠ'éCÍAüC(@Ã{8 ’§+64R';'é8»AüC(@Ã}¨ýç!+7'à'Ž'êp{AøC(@À`Ÿ+7|è'eo'êÝQAøC(@ˆ?þó‘+6W¡'‚'éeíAüC(@Äø?þó‘+5–„'rX'èn½AüC(@Çh «†+4ðÈ' +šP'çššAøC(@ÉØ+6Ž'®Ï'é®ËA÷ÿC(@ÃŒGßüTz+5'âª'èw AøC(@ÃŽ·À o+5üÖ'Áª'èñ¶AøC(@Ñ'Ÿý`é+5éb'Œ_'èØÏAøC(@Ó—€ß+4Ž'7í'ç>AøC(@Ö_þmY+2ï'!‹Á'åúAøC(@Øw@%N+3[Ò'"¤%'å”@AôC(@Úç1¾+3Ìó'#L'æ%AôC(@ÃVà†8+2¸@'$¤÷'äÂáA÷ÿC(@ßƿüÚ²+0„Â'$s)'áñœAôC(@â6ýç!+.ˆ'#À:'ßfqAôC(@ä¦`Ÿ+.ã'#cþ'Þ¾“AôC(@ç «†+-܉'"‘³'ÞŠíAôC(@é†+02'!R’'áˆwAôC(@ëõÀ o+0‚™'D×'áîØAôC(@îeŸý`é+1Þ£'A'ã¬UAôC(@ðÕ_þmY+0£¾'«R'âEAðC(@óEÿyÈ+1+ï'œ'âǘAðC(@õ´à†8+2"^' €'äAðC(@ø$ ’§+1l'nÛ'ã®AðC(@ú”`Ÿ+3 »'à'åHžAðC(@ý «†+1ùL' »O'ãÎvAïÿC(@ÿsßüTz+0sw'!†9'áÛzAïÿC(@ÃÁãŸý`é+1•Û'%Ÿ×'ãO-AðC(@ÃÆP€+/üÐ(aC™A H@Ãʪ€+/¦Ï(`ÕƒA @@ÃÏÀ+/S)(`jrA H@ÃÓkÀ+.ó(_ðA à@Ã×Åà+.»Š(_¨^A D@ÃÜ +.‹ø(_kzA H@Ãà‡+.Fì(_A Ü@Ãäî+-óã(^¨ÐA à@ÃéU +-˜(^3UA ä@Ãí¯ +-?Í(]ÂNA @@Ãò@+,Ôé(]9|A ä@Ãö}@+,`­(\¤´A à@Ãúä +,(˜(\\ìA Ü@ÃÿK +,](\+üA à@Ä¿++Àí([Ø9A|@Ä%à++r([sMA Ü@Ä Œà++!à([ £A à@ÄÀ+*Ïù(Z£ÎA|@Äg +*r6(Z+ÉA Ü@ÄÛ€+* \(Y©kA|@ÄB€+)¾Ñ(YF*A à@Ä"¶ +)xà(Xì£At@Ä'*+(ý(XN(A|@Ä+à+(!A(W4ÎA|@Ä0 +'WŠ(V2›Ax@Ä4…`+'y(UØìAx@Ä8ù +'B‡(V¶Ax@Ä=m+'UR(V/ÅA|@ÄAàÀ+&åˆ(U ®Ax@ÄFa`+&n(U3ÀA@ÄJÕ +&†u(U&üAx@ÄOUÀ+&Z|(Tî³A@ÄSÉ€+&ý(T—Ax@ÄXJ +%ÑÛ(T?ÐA@Ä\ÊÀ+%‡§(SàÕA@Äa>€+%9á(S}HAx@Äe¿+$Ù"(SsA@Äj? +$.6(R&«A@ÄnÀ@+#w­(Q=A@Äs@à+#UÐ(Q®A@ÄwÎ@+#r³(Q6§A¬@Ä|Nà+#[ý(Q–A@Āπ+#³(PÀåA@Ä…\à+"¿3(PPåA¬@ĉ݀+"n(OèÿA@ÄŽjà+"#v(O‰ŒA¬@Ä’ø@+!Î.(OcA¬@Ä—xà+!‡¶(NÂ0A@Äœ@+!O©(NzrA¬@Ä “À+! +#(N!tA°@Ä¥!+ «Z(M¨"A¨@Ä©®€+ù (LÃçA°@Ä®;à+Z(K©hA¬@IJÉ@+¿=(K29A¬@Ä·c€+Ž´(JôAH@Ä»ðà+š(K’A¬@ÄÀ~@+¸‘(K)¯A¬@ÄÅ€+a(JòhAH@ÄɲÀ+K(Jž(AH@ÄÎ@ +×ø(J +3A¬@ÄÒÚ`+²(I5AH@Ä×t +ì(Hx8AH@ÄÜ +ë(G“XA@@Äà¨à+„+(EÇäAH@ÄåC +)¬(ETAH@ÄéÝ`+ñÛ(FTKAH@Äîw +J(FÅ"AH@Äó +êý(FKAà@Ä÷¸à+q_(E¯ÖAH@Äü_à+:Ó(EjAà@Åú+å¢(DüøAD@Å¡+ñ¼(E vAà@Å +;@+ô(E'ŸAH@Åâ@+(D|ÝAà@ʼn@+×>(C¢ßAà@Å0@+¶Ì(CyWAà@Å×@+wÜ(C(ÇAà@Å!~`+Ó›(BV‰Aä@Å&%`+2[(Aˆ"Aà@Å*Ù + (AUÝAx@Å/€@+Aß(A›ÿAä@Å44+*d(A}ðAx@Å8Û+_/(@yÕAà@Å=Žà+{B(?VA|@ÅB5À+©(?^IAÜ@ÅFé +»¸(?¨šA|@ÅK`+ –(?…ÞAx@ÅPQ@+è (>™¨A|@ÅU +~‰(<ÊíA|@ÅY¸à+‘I(9 âAx@Å^lÀ+ ù•(4rªA|@Åc €+ ¸d(5fçAx@Ågá +Â(9²äA@Ål•+žw(;¬A|@ÅqU +§@(;·[A@Åv €+„«(;‹A|@ÅzÊ +Ú6(;ø—A@ÅŠÀ+èY(< +¯A@Å„>€+c (;`Ax@ňÿ +(:ãëA@Å¿À+!(:û A@Å’€`+ „(:íuA@Å—Mà+Ïu(:£%A°@Åœ€+ +(:QøA@Å Ï@+P/(:`*¿ü,'õ½©A6|@Êÿ *¿âÝ'õCA8@Ê¿à*¿›Ó'õBVA8@Ê€ *¿E¼'ôÔ$A8@Ê$N`*¾Óx'ôAáA9¸@Ê* *¾Væ'ó¢nA8@Ê/Ïà*¾ D'óAžA8@Ê5`*½Ì.'òðÞA9°@Ê;^ *½qà'ò}HA8@ÊA+À*½;'ò²A9´@ÊFù@*¼ÀÈ'ñššA9°@ÊLÆÀ*¼h<'ñ)BA9°@ÊR”`*¼ ¾'ð°OA9´@ÊXb*»š‚'ð!îA9´@Ê^/ *»†'ï{A9´@Êcý *º¸‘'ï¹A9°@Êi×€*º„ 'î½~A;L@Êo¥*º9-'î]ªA9°@Êu`*¹Á9'íÄA;L@Ê{Yà*¹,'íÖA;P@Ê'`*¸¸'ìp¸A9°@ʇÀ*¸‡À'ì2áA;L@ÊŒÜ *¸YG'ë÷eA;L@Ê’¶€*¸'ëšþA;L@ʘÀ*·®P'ëA<è@Êžx *·%6'êmA;L@ʤR`*¶´¥'éÜüA;H@ʪ9 *¶{'é“ûA<è@ʰà*¶0o'é3ÁA;H@ʵû@*µÄm'è©A<ì@Ê»â`*µDî'èNA<ä@ÊÁÉ€*´¸;'çR7A<ä@Êǰ *´[•'æÛ A<ä@ÊÍ—à*´/|'æ£.A<è@ÊÓ *´ 'æwA<è@ÊÙs*³È7'æþA>|@ÊßZ *³h½'å¤ÉA<ä@ÊåN@*³Ÿ'å;­A>„@Êë5`*²Ì¨'äÝA<ä@Êñ)`*²x+'äpÚA>€@Ê÷@*² ('ä3A>|@Êý`*±ÂÉ'㈯A>„@Ë`*±Y'ãA>€@Ëù@*°ÿ7'âŽZA>|@Ëí`*°´'â.6A>„@Ëá@*°`.'áÂÊA>|@Ëâ*° þ'áWA@@Ë Ö *¯°Ï'àâPA>„@Ë&Öà*¯?ö'àQßA@@Ë,× *®í‡'ßè[A@@Ë2Ø€*®¼Å'ß©ñA@@Ë8Ù@*®wŸ'ßQoA@@Ë>Ú*®f'Þß;A@@ËDÚà*­Ç9'Þo¥A@@ËJÛ *­uO'ÞÌA@@ËPé *­ ,'Ý€AA°@ËVê*¬yV'ÜÄEA@@Ë\÷ *¬'Ü.AA´@Ëbø€*«×-'Ûô´A@@Ëi*«©‚'Ûº?AA°@Ëo *«k*'ÛjsAA´@Ëu!@*«"Ÿ'Û ˜AA´@Ë{.À*ªÅ`'Ú–=AA°@Ë<€*ªd&'ÚÊAA¸@ˇVà*ªi'Ù³¹ACL@Ëd`*©¶'Ù;AA°@Ë“~à*©B•'ا%ACP@Ë™Œ`*¨õ"'ØDAA°@ËŸ¦à*¨Ér'Ø ACP@Ë¥Á@*¨Þ'׿ÔACL@Ë«ÛÀ*¨=ø'×YACP@˱ö*§ë†'ÖðACH@˸€*§”Ú'ÖACP@˾*à*§3'ÖóACL@ËÄR*¦¼™'ÕlIADä@ËÊl€*¦'Í'Ô­ÓACP@ËГ *¥¬‚'ÔADä@ËÖ® *¥„›'ÓÜðACP@ËÜÕ@*¥qâ'ÓÄøADä@Ëâü€*¥8'ÓWRADè@Ëé#À*¤€ð'ÒŽADè@ËïK*¤$È'Ò™ADè@Ëõr *¤·'Ò ·ADä@Ëû¦@*£ý1'ÑçìAF„@ÌÍ`*£À!'Ñ™ÃADä@Ì`*£y4'Ñ>ûAF€@Ì(À*£+8'ÐÛ)ADì@Ì\ *¢Ðï'Ðg˜AF|@ÌÀ*¢8•'Ϥ–AF„@Ì Ä *¡B¬'ÎiÒAF|@Ì&øÀ* ²Ñ'ͱ¯AF„@Ì-,À* ©…'Í¥ÈAF€@Ì3`À* ’'͇¯AF€@Ì9¡ * v'ÍcóAH@Ì?Õ * gâ'ÍQÅAF€@ÌF€* 6¯'ÍËAH@ÌLJ`*ŸÚ'ÌœÝAF|@ÌR‹@*Ÿ['Ëù¾AH@ÌXÌ*žÅÃ'Ë:”AH@Ì_ à*ži¼'ÊÄÇAH@ÌeMÀ*ý¨'Ê:qAH@Ìk›`*Sõ'Éa9AI´@ÌqÜ@*'ÉIAH@Ìx *K‹'ÉVuAH@Ì~j *\Ò'Él’AI°@Ì„¸`*,ç'É/NAKP@ÌÃÚ@*™Ûö'Äð—AI´@ÌÊ4 *™¦¢'ĬTAKL@ÌÐ *™Z‚'ÄJãAKP@ÌÖé *™†'ÃñOAKP@ÌÝD *˜Ó+'èAKP@Ìã«@*˜‹‰'ÃAöALä@ÌêÀ*˜EÇ'Âè­AKP@Ìðm*—á'ÂgÊALè@ÌöÇ€*—i'ÁÎ.AKP@Ìý. *—%ö'ÁxDALä@Í•à*–ïÒ'Á2øALè@Í ý *–/'À<3ALè@Íd`*•Í'¾ÏALè@ÍË *”úg'¾±'ALè@Í? *•|n'¿W—AN€@Í#¦à*•ˆ×'¿gyALè@Í*@*•L³'¿~ALì@Í0‚@*”ï'¾¢·AN€@Í6ö@*”‹x'¾#)AN€@Í=j@*”CÓ'½ÇtAN€@ÍCÞ`*”'½w AN„@ÍJR€*“­ˆ'½AN„@ÍPÆ€*“$L'¼WlAN€@ÍW: *‘û<'ºÛ-AN„@Í]»`*’Û'¹ åAP@Íd/`*õ]'¸DNAN€@Íj°@*‘ì'¹ ²AP@Íq1 *‘o'º'·AP@Íw¥@*‘‹û'ºLÆAN„@Í~& *‘W¡'º ÃAP@Í„§*‘º'¹º‡AP@Í‹4 *½©'¹D¯AQ´@Í‘µ`*`á'¸ÍíAP@͘6@*#¢'¸‡AP@ÍžÄ*ên'¸6OAQ¸@Í¥Q *¢'·ÙšAQ´@ͫҀ*Eà'·c®AP@Ͳ`@*ŽÛ•'¶Û AQ¸@͸íà*Žs'¶{tAQ´@Í¿{€*Žj¤'¶KAQ´@ÍÆ @*Ž&%'µócAQ¸@ÍÌ£À*¾ã'µo7ASP@ÍÓ1`*pQ'µ +¥AQ´@ÍÙËà*-'´µ/ASP@ÍàY€*ŒÀã'´*AQ´@Íæô*Œ‰B'³âäASP@Í펀*Œl–'³¾0ASP@Íô)*‹ñ,'³ 9ASP@ÍúÃ`*‹'²‘FASL@Î]À*‹s '²~ÇASL@Î *‹^u'²dlATì@Ο *‹ 2'±û"ASP@ÎFà*ЦY'±xÃATè@Îá`*ŠR’'± ˆASP@Î"ˆ *‰áÄ'°}#ATè@Î)0*‰b'¯Ù¿ATì@Î/×@*‰:ð'¯§šATè@Î6~€*‰J‘'¯»šATè@Î=2 *‰2ô'¯bAV„@ÎCÙà*ˆü*'¯W@ATè@ÎJà*ˆ´¼'®ûÒAV€@ÎQ5@*ˆS‹'®jATì@ÎWé@*‡´¹'­´ AV€@Î^`*†Øæ'¬šÀAV„@ÎeQ`*†67'«ÊƒAV€@Îl€*†B7'«ÙßAV„@Îr¹ *†m'¬¹AV„@Îym *†Ih'«ãAV€@΀. *†ã'«œAX @ΆâÀ*…Ì\'«CAV„@Σ *…¡'« †AX@ΔW *…o'ªË AV€@Λ€*„ïH'ª( +AX@ΡÙ`*„'©pAX@Ψš@*ƒÙ'§µAX@ίh *‚—Ž'§(dAY¼@ζ)*‚èk'§åAX@μéà*‚ܘ'§€ÂAX@Î÷€*‚)F'¦›:AY´@ÎÊ…@*Š.'¥Ï—AY¸@ÎÑRà*“R'¥ÛIAY´@ÎØà*‚2ã'¦§‰AX @ÎÞî`*‚X'¦×¯A[P@Îå¼*Èë'¦åAY´@Îì‰À*ß'¥?ÕAY¸@ÎóW`*€°§'¤¹(AY´@Îú2*€“'£ßtA[T@Ï €*|üG'¡é#A[P@ÏÚ *y‰'ŸÀûAY´@Ï´ *y_—'Ÿ™VA[P@Ï@*{é;'¡9A[T@Ïi *~´'¢’_A[L@Ï#D *~´ö'£-A[P@Ï*+`*~/Ü'¢­ýA\è@Ï1*}lð'¢1=A[T@Ï7í@*}Xþ'¢$zA\è@Ï>ÇÀ*},G'¢ÛA[P@ÏE¯*|hÏ'¡ŠÂA\è@ÏL–€*{Âu'¡ KA\ð@ÏS}À*{"Ð' ºA\è@ÏZe*z Š' ÓA\è@ÏaY@*xæ''ŸKžA^ˆ@Ïh@€*w;A'ž:gA\è@Ïo4€*tMÞ'œZËA^€@Ïv*p¿7'šúA\ð@Ï}*oÖý'™ZA^€@Ï„ *qì#'šÔ‘A^„@ÏŠø@*sÚý'œEA^„@Ï‘ì`*taZ'œgDA^„@Ϙà€*tj¼'œmEA^„@ÏŸá€*tV='œ`'A` @ϦՀ*sÛ}'œ—A^€@Ï­Ö€*sU'›»A` @Ï´×`*rü·'›ƒA`@ϻˀ*r­€'›PRA^„@ÏÂÌ€*rð'›3)A` @ÏÉÍ`*r4#'›¥A`@ÏÐÛ *q3'š™ºAa¸@Ï×Ü*p¡S'šÙA`@ÏÞÜà*otõ'™@A`@ÏåêÀ*n~'˜¢•Aa¼@Ïìø`*m¿¶'˜(ÆAa´@Ïóù`*lpT'—R!A` @Ïû*jw'•ÆAa´@Ð +`*fj¦'“wtAa¸@ЗÀ*bA`'Í®AcX@Ѐ*`1Û'|Aa°@Ð ¥`*b0j'ÂÓAa¸@Ð2À*dûí'’ŒÁAcX@ÐÀ*fµ'“åAcP@ÐFÀ*g!’'“ì†Aa°@ÐÔ *fÚ"'“¾ÎAcX@Ða`*fyZ'“€ÝAcP@Ð î *fg'“CuAcP@Ð$‚@*eÈ'’á$Adè@Ð(€*dü/'’ŒëAcP@Ð+£@*df„'’-!Adð@Ð/0€*c²½'‘ºAcP@Ð2Ä *býÒ'‘FIAdè@Ð6Wà*b€Ç'öAAdð@Ð9ë€*b¸'±Adè@Ð=@*aob'GIAdð@ÐAà*`¤1'Å>Adè@ÐD¬à*_È{'8 Af€@ÐH@ *^Û'Ž öAdð@ÐKÚÀ*]ø}'ެAfˆ@ÐOtÀ*]k«'µŒAf€@ÐSà*\¬¼';ZAfˆ@ÐV¨à*[¡R'Œ4Af€@ÐZC*Zl('‹ÊWAfˆ@Ð]Ý *XÖ['ŠÆ Afˆ@Ðaw *W¿'‰§„Af€@Ðe *Sç"'‡ž*Ah @Ðh± *NÄ¡'„TáAf€@ÐlR *Lo'‚¸Ah @Ðoò *NÕœ'„_ÀAh @Ðs“ *R‡”'†½+Ah @Ðw3 *T1Å'‡ÍîAh @ÐzÔ *T‚¹'ˆ¾Ah @Ð~{*T2!'‡Î)Ai¸@Ђ`*Sé'‡ŸkAh@Ð…Â`*S߯'‡™tAiÀ@Љi@*S’+'‡gÉAi¸@Ð *Sî'‡ ÁAi¸@з*R[Œ'† ýAi¸@Д]à*Q³M'†5PAi¸@Иà*Q'…ÅÔAiÀ@Л« *P? '…GAi°@ПXà*O«I'„èAkP@ТÿÀ*O<£'„¡°Ai¸@Ц­ *N­ˆ'„FAkX@ЪZ`*NÎ'ƒå¢AkP@ЮÀ*M{‰'ƒ‚CAkX@бµ*LŒ'‚éAkP@еb@*K.'‚ AkP@й*J‚.'šþAlð@мà *Jž'­1AkH@ÐÀvà*JZa'†Alð@ÐÄ* *IÃû'!DAlð@ÐÇÞ@*I+['€¿–Alè@ÐË’*Hê'€QÝAlð@ÐÏE *G®'—Alè@ÐÒù`*FÉü'~s.Alð@ÐÖ³€*F;'}– Anˆ@ÐÚg *E¢('|ø…Alè@ÐÞ!@*DæA'|Anˆ@ÐáÛ`*Cõ%'zÓbAnˆ@Ðå *Bâ.'ysnAlð@ÐéO *A+¾'wB;Ap @Ðí €*>V 's¡qAnx@Ððà*:# 'nAVAnˆ@Ðô}À*5.L'géWAnˆ@Ðø>@*4J'fÅ6Ap @ÐûþÀ*8læ'l‚Ap @Ðÿ¿@*;ú‹'pœÚAp @ÑÀ*=Y'r]xAp @Ñ@@*=—’'r­‡Ap @Ñ À*==ú'r:ÚAp @ÑÁ@*<ºK'q’KAp @ш *I`*¤Ò'>CœA€Ü@ÒBP@*¼9'=âA€Ü@ÒFW@*ö':ômA€à@ÒJ^@*T'6.A€à@ÒNk€*Öæ'-ßßA¨@ÒRr`*=')MA€Ü@ÒVà*-5'.NWA°@ÒZ†À* â'5DøA€Ü@Ò^”*Ý'8%8A¨@Òb¡€*S´'8½A°@Òfµ */'8ŽA‚t@Òj€*Ì*'8‘A¬@ÒnÏÀ*‚'7±[A¨@Òrã *Gý'7fbA‚|@Òv÷@*Ùà'6ÙpA‚t@Ò{ *G'6:A‚x@ÒÀ* ËÕ'5ÉA‚x@Òƒ2€* l'5&A‚x@Ò‡F@* P'4ŸA‚x@Ò‹Z* Ç$'42A‚x@Òt * kè'3½RAƒD@Ò“Ž@* a'3=ìAƒD@Ò—¨€* 3'2¤AƒH@қ€* 13'2*~Aƒ@@ÒŸÜ * +áI'1Ä4AƒD@Ò£öà* +|¿'1CƒAƒH@Ò¨`* ÿö'0£ÊA„@Ò¬1€* z†'/øýAƒD@Ò°R * †'/vnA„@Ò´r *¾~'/PA„@Ò¸“ *WÇ'.„ÕA„@Ò¼³À*å '-òA„@ÒÀÔ@*mw'-XêA„@ÒÄû@*?',Ï­A„à@ÒÉÀ*¡&',ScA„@ÒÍB *1º'+ÄÅA„Ü@ÒÑi *¨6'+ÀA„à@ÒÕ *'*UÌA„à@ÒÙ·€*x_')ÕA„Ü@ÒÝÞ€*ò-'(äA„à@Òâ À*ª²'(ˆ’A…¨@Òæ2à*X7'(þA„ä@Òê` *ÇF''eyA…¨@Òî€*åt'&DlA…¬@Òòºà*µé'$¿âA…¬@Òöè )ý]'!÷EA…¨@Òû )ôIï'XGA…°@ÒÿI@)ì¾Ê'„XA†t@ÓvÀ)ð%W'±A…°@Óª`)÷Ø'žÄA†t@Ó Þ@)ûQ' ­¤A†|@Óà)ûôƒ'!@TA†t@ÓE )üë`'!ÞRA†x@Óy€)ý2€'" ×A†|@Ó³€)üÄ‹'!ÅxA‡@@Ó ç`)ü±'!UA†|@Ó%!€)ûRˆ' Ø©A‡D@Ó)[À)ú‚s' S|A‡H@Ó-•À)ù¼Ñ'ÕA‡@@Ó1Ð)ù@'náA‡H@Ó6 + )ø„ì' dA‡D@Ó:JÀ)÷ÇM'”Aˆ@Ó>„à)ö±ª'âXA‡D@ÓBÅ€)õ/'êòAˆ@ÓG)ôI'WÂAˆ@ÓKF )ô')§Aˆ@ÓO‡ )òì¹'xÈAˆ@ÓSÎ )ñÔ,'Å;Aˆà@ÓX )ñ¨6'©Aˆ@Ó\U )ñcÌ'}OAˆà@Ó`œ€)ð‚c'í AˆÜ@Ódã )ï4['DAˆä@Ói*€)îw'žgAˆÜ@Ómq€)îXÕ'ŠÆAˆà@Óq¸`)íÇÁ'-ìAˆÜ@Óvà)ì¨j'vA‰°@ÓzLÀ)ëÀÚ'áÓAˆÜ@Ó~š )ëLˆ'—aA‰¬@Ó‚ç€)êÅc'@ãA‰¬@Ó‡4à)ê/ô'á?A‰¬@Ó‹ˆÀ)é€2'pÄAŠ|@ÓÖ)è¸H'ðÒA‰¨@Ó”)à)èM'{AŠ|@Ó˜w )çUÇ' ðA‰¨@ÓœË)æ®í'£'AŠ|@Ó¡ )åÿþ'31AŠt@Ó¥r€)åQ,'ÃOAŠ|@Ó©ÌÀ)ä¢''SLA‹H@Ó® `)ãìÒ'ß>AŠt@Ó²z )ã6^'jyA‹H@Ó¶Î`)₵'÷~AŠx@Ó»(€)áÏþ'…A‹D@Ó¿‚À)áÑ')A‹H@ÓÃã@)àcÉ'œAŒ@ÓÈ=€)ß­,''&A‹H@ÓÌ— )Þìg'«ÇA‹D@ÓÐø@)Þ*'%9AŒ@ÓÕXà)Ý]C' ¬TAŒ@ÓÙ¹`)ÜÉÊ' MñAŒ@ÓÞ)Ü*€' èAŒ@Óâz€)ÛsI' r¾AŒ@Óæá€)Ú°È' öBAŒà@ÓëB )Ú@' ‡3AŒ@Óï©)Ùrâ' *ÎAŒÜ@Óô)ØÕ\' +ÅýAŒà@Óøw )Ø'8' +VŠAŒä@ÓüÞ)×x' æzAŒÜ@ÔE)ÖÊq' wRAŒà@Ô²`)ÖF' KA¬@Ô +`)Õe¡'’öAŒà@Ô†À)Ô½÷''¨A¬@Ôô )Ô'ÁYA¬@Ôa€)Óv<'UéA¬@ÔÎà)Ò³'Ù A¬@Ô BÀ)ÑÜK'OŒAŽ|@Ô$° )Ñ(Û'ܵA¬@Ô)#à)Л3'‚ AŽx@Ô-— )Ðä')ˆAŽx@Ô2 €)Ïab'¹4AŽ|@Ô6@)Ηh'7ðAŽx@Ô:ó)Íé'ÈdAŽx@Ô?m@)ÍaQ'q{AH@ÔCá)ÌÞV'§AŽx@ÔH[ )ÌP«'ÂýAD@ÔLÕ`)˯–'[åAH@ÔQO )Êþ7'ê`AH@ÔUÉÀ)ÊOÊ'z¾AD@ÔZJ`)É¥—' ÑA@Ô^Ä )É +'ª@AH@ÔcE@)È{¶'O,A@ÔgÅÀ)ÇÎ&ÿÀ$A@ÔlF`)Æë¤&þžCA@ÔpÇ)Æ(Ž&ý¤ŒA@ÔuG )ÅÉx&ý*ÖA@ÔyΠ)Åb)&ü¦›Aà@Ô~O )ÄÑ?&ûíA@Ô‚Ö )Ä3E&û"çAà@Ô‡] )ËŒ&úL7Aà@Ô‹ä )ÂÕ&&ùbÀAà@Ôk )£&øWÚAà@Ô”ø€)ÁRî&÷tdA‘¬@Ô™€)ÀßÞ&öáAà@Ôž )Àif&öIxA‘°@Ô¢š`)¿ÞK&õ—iA‘¬@Ô§' )¿6&ôÀA‘¨@Ô«µ )¾[&óÖ6A‘°@Ô°Hà)½ßÂ&ó îA’x@Ô´Ö`)½MÃ&òOA‘°@Ô¹j )¼À&ñšPA’x@Ô½þ)¼9&&ðìýA’|@Ô‹@)»£X&ð-¹Aœ@Ö…À)”Ó"&¾~äA›H@Ö f`)”k&½ù¶Aœ@Ö%M€)”z&½ùAœä@Ö*. )“¹&½ÕAœ@Ö/À)“@/&¼{Aœ@Ö3õÀ)’Õ-&»ò%Aœà@Ö8ÜÀ)’nA&»nhAœà@Ö=Ãà)‘ø"&º×6Aœä@ÖB«)‘rE&º+ÝAœä@ÖG˜`)ç &¹y¥A¬@ÖL`)w&¸êVAœà@ÖQlà)þ&¸lËA°@ÖVZ@)¥Ñ&·Þ|A¬@Ö[Gà).¼&·FA´@Ö`5@)ޏŽ&¶®ÊA¬@Öe" )ŽF·&¶A¬@Öj€)×;&µŽ`Až|@Öo +€)i¸&µ2Až€@Ösþ@)ŒüQ&´v*Ažx@Öxò )ŒÈ&³è®Až|@Ö}åà)Œ€&³XöAžx@Ö‚Ùà)‹©v&²ÄnAž€@Ö‡Ô )‹7&²2AŸH@ÖŒÎ`)ŠÉ¸&±¦ +AŸH@Ö‘Â )Š[?&±¢Ažx@Ö–Âà)‰ça&°„RA @Ö›½ )‰o1&¯ê|AŸH@Ö ·`)ˆýÐ&¯Y[AŸH@Ö¥¸)ˆ•&®ÓêA @Öª¸À)ˆ*ä&®KaA @Ö¯¹`)‡º¹&­»ÎA @Ö´º)‡Kæ&­-óA @Ö¹ºÀ)†àX&¬¤GA @Ö¾»`)†t&¬ŸA @ÖÃÂ`)†š&«ŒJA à@ÖÈÉ€)…”t&ªûvA ä@ÖÍЀ)…&ªcØA à@ÖÒ× )„§F&©ËÞA ä@Ö×Þ )„:ï&©A1A à@ÖÜì )ƒàv&¨ÍcA¡°@Öáù )ƒƒ»&¨V±A¡°@Öç )ƒY&§Ò^A à@Öì€)‚³)&§K¹A¢|@Öñ")‚Hæ&¦ÃµA¡°@Öö/€)ÛÙ&¦8 A¡°@ÖûC`)oT&¥­8A¢|@×PÀ)þ&¥!EA¡¬@×dÀ)€‘&¤ÈA¢€@× +x€)€,!&¤†A¢x@×’À)¡†&£š“A£H@צÀ)~Þˆ&£ÈA¢€@×Á)~&¢š@A£H@×Ôà)}&“²·A§L@׹Ϡ)eÛæ&“A§D@׿ +)dù6&’‹A§L@×ÄJ )dN&’A¨@×É…)cÇm&‘ÇPA§L@×ÎÅÀ)c<(&‘n.A¨@×Ô`)bšl&‘«A¨@×ÙM€)aÞ¢&Ž|A¨ä@×ÞŽ )a·&ðA¨@×ãÎà)`@&eGA¨@×éà)_ V&ŽÀ7A¨à@×î] )^Ku&ŽDÅA¨è@×ó¤@)]Æ.&ïyA¨ä@×øñ )]1u&KA©¬@×þ8À)\þ&(ôA¨ä@؆@)\&ŒÐ­A©°@ØÍ`)[t»&Œs«A¨ä@Øà)Z·Ó&‹úÄA©°@ØnÀ)YÛ=&‹m—Aª|@ؼ@)XÚ3&ŠÉA©°@Ø )WÒÝ&Š Aª|@Ø#] )WP&‰©ÍA©°@Ø(± )V³´&‰hÅAª€@Ø.€)Vcµ&‰5’Aª|@Ø3_À)UÕå&ˆÚÐA«H@Ø8³À)Tã)&ˆ?vAª€@Ø>)Sï&&‡£KA«H@ØCh`)SD &‡5ËA«L@ØH )R‹µ&†¿ÐA«H@ØNà)Qø>&†aoA«H@ØSw@)Qd&†›A«L@ØXØ)P`ÿ&…\ÌA¬@Ø^8 )OX—&„³”A¬@Øc™`)NÙ &„bRA¬@Øhú )N´ä&„JÏA¬@ØnZÀ)Nt€&„!šA¬@ØsÁà)Nã&ƒØ?A¬ä@Øy" )Ms&ƒ|ßA¬@Ø~‰ )LÒW&ƒúA¬à@؃ðà)L&è&‚¨CA¬è@؉^`)K~Ü&‚<¶A­°@ØŽÅ€)JØB&ÒA¬ä@Ø”3)J$Ÿ&_A­°@Ø™š )IZe&€Ý±A¬ä@ØŸ )HhÔ&€CA­°@ؤ{ )G4ø&~üA®€@Ø©é)Eõâ&}c°A­¬@د])ES&|“:A®€@Ø´Ê€)EN&|ŒôA­°@غ>€)E=¦&|wÞA®€@Ø¿²@)Dèc&| +¼A®x@ØÅ, )DiŒ&{h`A¯L@ØÊ  )C·Ý&z„òA®€@ØÐ)B¾v&yEµA¯L@ØÕ•@)Aþß&xPyA¯H@ØÛ€)A»s&wú,A¯H@Øà‰à)AUÞ&wx&A¯L@Øæ + )@­b&v }A°@Øë…)?ìß&uªA¯L@ØñÀ)?6ß&tÁA°@Øö†`)>…&sÞA°@Øü )=­]&rÉlA°@ÙŽ@)<|œ&qCWA°ä@Ù);æ&ocµA°@Ù – ):õ&nòA°ä@Ù@)9ûÔ&n$A°ä@Ù¤`):>C&nd,A°ä@Ù1à):=&nb•A±°@Ù"¹)9õ¡&n4A°ä@Ù(F )9…¹&mw÷A±´@Ù-Ô )91&lÎSA±°@Ù3a )8n˜&l®A±°@Ù8ï@)7½Z&k/ÏA±´@Ù>ƒ)6Þ;&j7A²x@ÙD )6, &i.áA±´@ÙI¤€)5Úë&hÆKA²|@ÙO8€)5k™&h7ÍA²€@ÙTÒà)4Ì &gk®A³L@ÙZfÀ)44Ò&fªA²|@Ù` )3£%&eï‹A³L@Ùe• )3&e#ÞA²€@Ùk5à)2Z&dJñA´@ÙpÐ@)1ž &cY©A³L@Ùvj€)0¨{&bUA³H@Ù| @)/K$&``.A´@Ù¬)-º¯&^_˜A´@Ù‡L ),öÓ&]däA´@ÙŒí`)-#­&]žNA´@Ù’Ž )-®&]‹A´@Ù˜5`)+Ú&[øwA´è@ÙÜ€)(i'&WÕA´ä@Ù£}@)#Óœ&Q²³A´@Ù©*À)# r&Qq6Aµ°@Ù®Ñà)'kø&VLÂA´ä@Ù´€))¼Ö&YC¡Aµ´@Ùº& )*+R&YÑ A´ä@Ù¿Ô ))Ü]&YkûAµ°@ÙÅÀ))$²&X€ãAµ´@ÙË5 )(„*&W³iA¶|@ÙÐã@)(It&WhBAµ´@ÙÖ— )(Ü&WA¶|@ÙÜK )'•&V{ A¶€@Ùáÿ )'‘&UÅØA¶€@Ùç³)&`>&TöA¶|@Ùím`)%ºÔ&T"WA·L@Ùó'à)%Bk&Sˆ7A·P@Ùøâ@)$Á÷&RãËA·L@Ùþœ€)#úþ&QåA·H@ÚVà)#Š&PÇA·L@Ú +@)"kæ&OæEA·L@ÚÒ)!áD&O4ÒA¸@Ú’À) ñD&NžA¸@ÚS€)Už&Kò¶A¸@Ú!@)&JOqA¸@Ú&Û`)2¶&J~YA¸ä@Ú,¢€)áÙ&K^†A¸ä@Ú2iÀ)&K¦‚A¸è@Ú81)ëƒ&KjäA¸è@Ú=ø )Žö&JônA¸ä@ÚC¿@) ã&Jg‰A¸ä@ÚIŒà)­™&IÓ÷A¹´@ÚOZ`)5š&I:^A¹°@ÚU'à)¹›&H›§A¹°@ÚZõ€);Ê&GúœA¹´@Ú`É`)º÷&GU·Aº|@Úf€)9?&F¯­Aº„@Úlk)­&EüDA¹°@Úr?)©&EG?Aº€@Úx`)¦v&D¬A»L@Ú}í@)5Æ&DßAº|@ڃǠ)Æ_&CFA»L@Ú‰¢ )N]&Bó©A»P@Ú|€)Ît&BOðA»L@Ú•Và)Pe&A®•A»L@Ú›7 )Ó&A3A¼@Ú¡à)Qé&@hØA»H@Ú¦òÀ)×ê&?̱A¼@Ú¬Ó€)aˆ&?5(A¼@Ú²ºÀ)ä&>”—A¼è@Ú¸›€)^Ð&=êA¼@Ú¾‚À)ÓŠ&=7»A¼è@ÚÄià)T &<”‰A¼ä@ÚÊQ)Þ¶&;þYA¼ä@ÚÐ8 )` &;\õA¼ä@ÚÖ%à)Ðß&:¤ôA½¸@ÚÜ`)$w&9ÈGA½°@Úâ)8;&8™äA½´@Úçî€)»?&6²Ü&­YAÆ„@Ü#…(ó¼y&ý¾AÆ|@Ü)¹ (ói6&ÈuAÆ„@Ü/ó€(òͲ&dìAÇL@Ü6'€(ò"ë&÷¡AÆ€@Ü`(Ø}1& +AÌè@ݬ(×Ë\& +ÀAÍ´@Ý @(×÷& ªÛAÌè@Ý&€à(ÖiW& 9-AÍ´@Ý,î (Õµ&ÅÒA͸@Ý3b (Õ‡&SŠA΀@Ý9Ð@(ÔRž&âôAÍ´@Ý@D@(Ó `&páA΀@ÝF¸`(Òí±&þ†A΄@ÝM2à(Ò@&nAÏP@ÝS¦à(Ñ–"&"¥A΀@ÝZ!`(Ðêl&´ÀAÏP@Ý`›À(Ð;Ü&EAÏL@Ýg@(ÏË&Õ AÏP@Ým (Îß +&eÉAÏL@Ýt€(Î/&õAÐ@Ýz’`(Í€k&…cAÐ@Ý@(ÌÏ`&AÐ@݇” (Ì<&žÞAÐ@ÝŽ(ËY˜&$ÜAÐ@Ý”œ@(Ê‹á&¡4AÐè@Ý›#€(ɉ&ûàAÐè@Ý¡ªÀ(ÇØ±%ÿͯAÐè@ݨ8`(ÄÏŒ%ûêñAÑ´@Ý®¿À( ä%øbkAÐì@ݵM`( }%ùXAÑ´@Ý»Û(Ħ +%ûµÏAÑ´@ÝÂhÀ(ÅoØ%ü¸AѸ@ÝÈüÀ(ÅN%üŒåAÒ€@ÝÏà(ÄÜF%ûû:AÒ„@ÝÖ%(ÄO%ûFxAÒ„@Ýܹ(ú)%ú‡âAÒ€@ÝãM (ÃÃ%ùÀùAÒ„@Ýéç (Ârâ%øäøAÓP@Ýð‚(Á²$%÷îBAÓL@Ý÷€(Àøm%÷ŒAÓP@Ýý·(ÀbÆ%ö@ýAÓP@ÞWà(¿Öß%õêAÔ@Þ +øÀ(¿BŽ%ôÐAÔ@Þ™ (¾«%ô,AÔ@Þ:€(¾Q%ó8¹AÔ@ÞÛ`(½e˜%òmAÔ@Þ%‚ (¼Ê_%ñ¦àAÔè@Þ,)à(¼'O%ðÖ'AÔè@Þ2Ñ@(»•Ü%ðûAÔì@Þ9x€(»-%ïpÝAÔè@Þ@& (ºs£%î¨~AÕ´@ÞFÓà(¹È%íÍoAÕ¸@ÞM€(¹2¡%í ›AÕ´@ÞT/ (¸§®%ì[ÀAÕ´@ÞZã@(¸T%ë—vAÖ„@Þa—`(·Z+%ê°ÚAÖ„@ÞhK`(¶„%éžÏAÖ€@Þnÿ€(µÕª%è¿’AÖ„@Þu³ (µz%èJ>AÖ„@Þ|n (µÎ%çÇmA×P@Þƒ( (´uÆ%æý&A×P@Þ‰ã (³Ã4%æ”A×P@Þ (³3(%å`3A×P@Þ—^€(²¸û%äÃÑAØ@Þž`(²/Ã%ä-AØ@Þ¤à@(±›%ãUâAØ@Þ«¡@(°ýÍ%⌋AØ @Þ²h€(°]`%á¿3AØè@Þ¹/À(¯ÌX%áAØè@Þ¿÷(¯(†%à3ÞAØè@ÞÆ¾@(®d%ß8mAØè@ÞÍ… (­ßl%ÞŽŸAØì@ÞÔS`(­„ù%ÞØAÙ¸@ÞÛ!(¬þ|%Ýn³AÙ´@ÞáîÀ(¬fa%ܬAÙ¸@ÞèÂÀ(«à¡%ÜÎAÚ€@Þï€(«[T%ÛV.AÙ¸@Þöd (ªÎ'%Ú¡yAÚ„@Þý8À(ªCÌ%Ùð`AÚ„@ß@(©¸•%Ù>/AÛP@ß +ç@(©!"%Ø|TAÚ€@ßÁà(¨ƒs%ײAÛT@ßœ`(§ü¯%×þAÛP@ß}@(§Ì%Öh³AÜ@ß&WÀ(¦ý%Õ¾ºAÛP@ß-8À(¦t2%ÕœAÜ @ß4 (¥êü%Ô_ûAÜ@ß:ú€(¥]ë%Ó«jAÜ@ßAáÀ(¤Æ'%Òé'AÜè@ßHÂÀ(¤,Ú%Ò$íAÜ @ßOª(£ª%Ñ}”AÜè@ßV—À(£3î%ÐæOAݸ@ß] (¢±ß%Ð?ÖAÜì@ßdlÀ(¢#¬%ωÑAÝ´@ßkZ€(¡•¿%ÎÔ'Aݸ@ßrH@(¡F%Î.nAݸ@ßy5à( “Ã%͉ïAÝ´@߀*( $%ÌÕñAÞ„@߇@(ŸwÒ%Ì}AÞˆ@ߎ@(žù%Ë|2AÞ€@ß•`(ž]%ÊàwAÞ„@ßœ(øe%Ê3´AßT@ߢû`(]ï%ÉmÿAßL@ß©ö(œÃº%Ȩ›AßT@ß°ð€(œFÆ%È«AßP@ß·ñ`(›Ô•%ÇvAà@ß¾ì(›X4%Æ×LAßT@ßÅìà(šÏä%Æ(ÑAà@ßÌô@(šO%ŃÛAàì@ßÓõ (™Ü¢%ÄñrAà@ßÚü`(™_]%ÄQAàè@ßâÀ(˜Ý6%ê‚Aàì@ßé (˜c®%ÃòAàì@ßðà(—æ~%Ân¶Aá¸@ß÷ (—_Æ%ÁÂDAàè@ßþ.(–Üç%ÁÁAá¼@à¡ (–^x%ÀxëAâˆ@à'à(•Ñ—%¿Ä˜Aá°@à ²(•;¢%¿¦Aâˆ@à <(”žu%¾;vAâ€@àÆ (“ǃ%½(VAâˆ@àP (’á%» Aâ€@àÝ`(%·¾ÁAãP@àjÀ(Ž.%¶‹¿AãX@àø(˜%¸V…AãP@à"ˆ`(‘!í%¹ÅAä@à&À(‘CØ%¹ðpAãX@à)¦@(÷|%¹Ž³Aä @à-6À(ƒa%¸úAä @à0Ê@(ë%¸7!Aäà@à4ZÀ(<³%·WðAä @à7î€(ŽÑ‚%¶Î»Aäð@à;‚ (ŽŸ%¶Ž8Aäè@à?(ŽJ %¶!UAå¸@àB¬ (Ù!%µÎAäè@àFC€(dÅ%´ûÝAå¸@àIÚ€(Œæ›%´Z_AåÀ@àMt€(Œf$%³µñAæ€@àQ `(‹ö3%³&¨Aå¸@àT¥`(‹Œw%²ŸPAæ€@àX?€(‹r%²îAæˆ@à[Üà(Ч8%±yáAçX@à_và(Š-5%°Ý´Aæ€@àc@(‰µÏ%°DßAçX@àf±`(‰B¥%¯±vAçH@àjQà(ˆÖB%¯&»Aè @àmï@(ˆi¦%®›µAçX@àqÀ(‡öR%®Aè @àu0@(‡€R%­q Aè @àxÓà(‡ +o%¬Ú(Aèè@à|t@(†š7%¬JƒAè@à€(†'¹%«·÷Aèð@àƒ» (…±¬%« ÛAèè@à‡b (…Hw%ªš1AéÀ@à‹@(„äø%ª×Aèè@àŽ­ („vÖ%©ßAé¸@à’T (ƒòv%¨änAéÀ@à•þ(ƒS%¨YAêx@à™¥(‚Ï %§ogAéÀ@àO(‚€ +%§ +JAê€@à ù (‚5,%¦ªuAêˆ@द€(ÓA%¦-AëX@à¨P€(l?%¥©FAê€@à«ýà(€ú—%¥ËAëX@௫ (€‡.%¤„AëP@à³[€(€(‰%¤ +íAì@à·à(ŠŽ%£‹àAëX@ູ`(~žî%¢õAì @à¾ià(}ºÃ%¢c Aì @à€(|ð¬%¡á¶Aìè@àÅÎ(|"0%¡]Aì @àÉÀ({T% Ù­Aìð@àÍ5`(zŒõ% Z6Aìè@àÐì`(yË~%ŸÞeAíÀ@àÔ (xû!%ŸY Aìè@àØVà(x"Ú%žÎ Aí¸@àÜà(w])%žPAî€@àßÇÀ(vE%Ë Aí¸@àãà(u£¼%5—Aîˆ@àç<(tɱ%œª +Aîˆ@àêö (t …%œ0UAîˆ@àî°@(sJn%›´ÁAîˆ@àòm€(r%›3ÚAïP@àö*À(q²ó%š¯÷AïP@àùè (p÷‘%š8 AïX@àý¨ (p=Ø%™Á.Að @ái (ová%™A×Að @á) (n¨Ì%˜½óAð @áê (mÒ%˜4ÖAð @á ª (m%—²›Að @án@(lK»%—:µAðè@á2(k‰y%–¾bAðð@áøà(jµa%–6¤Añ¸@á¼ (iÝê%•¬¿Aðð@Ⴠ(iz%•/ªAñ¸@á#J`(hi”%”¾sAñ¸@á'€(g³1%”I¹Aòˆ@á*Û`(fõF%“Ð-Añ¸@á.¥€(f3F%“TAòˆ@á2o (ec‹%’ÏAòˆ@á6<à(d’ %’HþAóP@á:(cÚž%‘Ó˜Aòˆ@á=Ô@(c-V%‘d²AóP@áA¡ (bvŒ%ï¶AóX@áEr (a»%w¸Aô @áI?`(aë%‚AóP@áMà(`O%ŽÇAô @áPã (_ˆï%õAôð@áT´ (^µ %ŽˆfAô @áX‡À(]üÅ%ŽiAôè@á\[€(]Wð%¨ëAôð@á`/@(\¢ù%5Aôð@ád ([ëü%Œ¿ýAõ¸@ágÝ([>~%ŒPôAõ¸@ák³à(ZŠž%‹ÝÕAõ¸@áoŠÀ(YË(%‹cMAõ¸@áse(Y ø%Šç¨Aö@áw? (XT[%ŠsmAöˆ@á{@(W¨w%ŠkAöˆ@á~ó`(Vü%‰—Aöˆ@á‚Р(VJ%‰% A÷P@ᆭà(U•G%ˆ±uA÷P@ኋ@(Tà}%ˆ=ÀA÷X@áŽh€(T"1%‡ÃöA÷P@á’I(SZö%‡DtAø @á–)€(RªH%†ÓaAø @áš +(R§%†oÇAø @áíà(Ql%†¼Aøø@á¡Ñ€(PÀz%…™èAøè@᥵@(P %…*CAøð@á©™(OfŽ%„¼ƒAøð@á­à(N¸”%„M,Aù¸@á±fÀ(Nx%ƒ×WAù¸@áµM (MC§%ƒ^Aù¸@á¹4€(LO%‚éÌAù¸@á½À(Kæ;%‚~ÞAú@áÁà(KBh%‚Aúˆ@áÄó(J‹£%¡ Aúˆ@áÈà@(IØ–%.tAûP@áÌÊ`(I72%€Ç*Aúˆ@áз (HŒß%€Z(AûP@áÔ¨ (GßÔ%ÖÑAü @áØ• (G?]% lAû`@á܆ (F‘§%~+Aü @áàv (Eég%}S·Aü @áäj@(ET3%|”»Aüè@áèZÀ(D³¤%{Ç7Aü @áìN€(D¯%zçGAüð@áðB`(CbI%zgAüø@áô9@(BÍC%yX§Aý¸@áø0 (B*Á%xˆ¥Aý¸@áü'(A…Ø%wµAý¸@âà(@ë‰%vð Aý¸@â (@N%v&‚Aþ@â(?¥’%uNÏAý¸@â `(>á6%tSxAÿX@â€(>æ%sVéAþˆ@âÀ(=†ê%r˜5AÿP@â (<ô‚%qÜÏAÿX@âþ€(<]¯%qÀAÿX@âûÀ(;ÑÉ%ph¯AÿP@â#ü@(;;S%o¨B@â'üà(: Í%nâNB@â+ý`(:%nøB@â0 (9bŒ%mJðBx@â4À(8¹%%lrBt@â8€(7òs%ksÆBx@â<€(6©:%iÎ_Bà@â@@(4%f…#Bx@âD (1ˆ›%c>7BÜ@âH! (1ï %cÁWBà@âL+@(3—ñ%eá5BD@âP5`(4°%f‰×BD@âT?€(3܃%f8ùBD@âXI (3jî%e§—BD@â\W(2Ùð%dîB¬@â`d@(259%d*B¨@âdq (1¤›%cbB¬@âh‚@(1# %b¼9B@âl€(0˜‚%b +äB¨@âp (0%aLñB@ât³à(/lÅ%`‹9B|@âxÄ`(.Ü +%_Ñ÷B@â|Ø(.NÅ%_%Bt@â€ëà(-¾o%^deB|@â…À(-+%]¨SBÜ@≠(,—+%\êuBÜ@â0 (+ÿ %\'½Bà@â‘G (+`&%[\YBà@â•^€(*Ç€%Z˜õBÜ@â™xÀ(*4À%YÝBH@â’À()’%Y ÕB@@â¡° ((ÑÂ%X»B¬@â¥Í€(( #%WB¬@â©êà('{c%V`B¬@â® ('p%UãB¨@â²%€(&Ķ%Uv«B¬@â¶F(&\Û%Tñ¼B@âºf€(%Ù°%TIÖB@⾊`(%P)%S™ÍB|@â® ($Ëu%RïòBx@âÆÑÀ($H[%RH"Bt@âÊõ (#ÀO%Q™ÿB|@âÏ@(#1ð%PãÂBt@âÓ@`("›„%P#8Bä@â×g@(!ýE%OXªBÜ@âÛ‘`(!ET%Nm8BD@â߸`( JÆ%M,ƒBà@âãâ€(Œ%L8YBD@âèà(X»%Kö²B¬@âì:((E%K¸ªBD@âðg@(ʳ%K@äB¨@âô”À(A¢%J‘sB°@âøÅ@(“´%I²ÒB@âüò (Òh%H»fB¬@ã# (C’%H‘B@ãW(Þ·%GƒyB|@ã ‡€(`„%FáñB@ã » (à %FcBt@ãï(÷ê%E^B|@ã%à(7¦%DEBÜ@ãYÀ(à_%C®B|@ã (ÃC%C‰KBÜ@ã"Êà(‰%C>ÙBH@ã'À(0‰%BÍ|BÜ@ã+<(ÁL%B?BH@ã/v(D%AžØB@@ã3³€(Ä %@úïB°@ã7ðÀ(I,%@]©B¨@ã<.@(Ó•%?Ç%B°@ã@k€(Y%?*TB¨@ãD¬ (×·%>„ÀB@ãHì (Qs%=ØåB@ãM-@(Ͱ%=0=B@ãQmÀ(Mä%<Œ©B@ãU± (Ëæ%;æEB|@ãYõ@(Td%;MLBt@ã^<@(Ïê%:£ºBà@ãbƒ@(>%9éBà@ãfÊ@(¼º%9C~Bà@ãk (?®%8£mBÜ@ãoX (ÂÉ%8Bà@ãs¢@([O%7B D@ãwì€(÷ó%6ÿïB H@ã|9À(…Ñ%6mØB ¨@〇@( %5нB °@ã„Ô€( г%5,jB ¨@ã‰!à( •%4’ªB ¬@ãr€( ¨(%4 +pB +@ã‘Ã( 4Q%3v*B +@ã– ( §o%2ÁÕB +@ãšg`( +ü‘%1çB +x@㞸( +6 %0éÃB +@ã£à( š%0?B +Ü@ã§bÀ( PG%/ÂêB +|@㫹À( *%/‘þB +à@ã° (Ϙ%/3B +Ü@ã´g (iü%.œ#B +à@ã¸ÁÀ(­%.NB D@ã½(~%-nB H@ãÁv@(Ü%,:³B H@ãÅÓ€(µº%)Þ^B ¨@ãÊ-À(©%'²ÄB H@ã΋(M%(bòB ¨@ãÒë (£ï%)ǘB @ã×L@(Ë„%)úBB @ãÛ¬À(„º%)Ÿ¦B @ãà `(#%)"²B @ãäq@(¾&%(¡xB |@ãèÕ(RÁ%(B x@ãí8À(Û%'B x@ãñŸ (dÞ%&ç‚B Ü@ãö€(ô™%&WÎB |@ãúmÀ(Œe%%ÒmB H@ãþÔ (*`%%TöB Ü@ä>à(Äê%$ÓB H@ä© (Z9%$J‡B H@ä  'ÿÊ %#´B @@䀠'þÐ/%#™B °@äî'ýì(%"‚©B ¬@ä[€'ý¦%!þ~B °@äÌ'übÙ%!†ñB@ä"< 'û¨ˆ%!³B@ä&­@'úÛ#% Œ?B@ä+À'ùúô%üÅB@ä/‘€'ù;%gÔBx@ä4`'ø;y%ÞbB|@ä8|@'÷cÍ%TZBÜ@ä<ó@'ö…%ÈBà@äAj@'õ¶X%ABà@äEá`'ôü²%ʯBä@äJ[`'ô8€%MB@@äNÕ 'ó]%ÀÿBH@äSOà'ò\Ï%­BH@äWÊ 'ñ ë%FYBH@ä\G`'ï‘›%RòB¨@ä`È'î¼4%Ê^B@äeE€'îœà%¶RB°@äiÆ 'îVÊ%‰wB@änF 'í±«%ÊB@ärÊ`'ìÔc%’+Bx@äwK'ëö/%õB@ä{Îà'ëLk%—NB|@ä€UÀ'êˆÅ%BÜ@ä„Ù 'é—´%ÏB|@ä‰` 'èÇ(%úWBà@äêà'è!Ó%‡BH@ä’qà'ç %1\Bà@ä–ü'æîI%˳BD@䛉`'æ;Š%YNB¬@ä  'å}q%ߤBH@䤡'伨%daB¬@ä©.€'ãû"%èhB°@ä­¿'ã8ð%lB@ä²O 'âxœ%ñB@ä¶à@'Ṍ%vÀB@ä»pà'àù%ûˆB@äÀ 'à;;%‚Bx@äĘ€'ß~% QB|@äÉ, 'Þ½R%¥Bt@äÍÃ@'Ýý…%äBä@äÒZ@'Ý:ˆ% –Bà@äÖô€'Ünƒ% ‡BH@äÛ‹€'Û±c% š}Bà@äà%À'ÚöÍ% #BH@ääà 'Ú;è% «vB¬@äé]@'ÙŒ% :óBD@äíú 'Øàp% +ÍB¬@äò˜ 'Ø2Ý% +]þB°@ä÷8À'×v¨% åŠB@äûÙ`'Ö´% hùB@åz'Õüw%óB@åÀ'ÕJ\%‚Bx@å ¾`'Ô“þ% ËB@åe`'Óܦ%—tBà@å @'Ó)î%%B|@å° 'Òr¼%¯ÔBÜ@åW 'Ѻp%9áBà@å þ@'Ñ%ÈBä@å%¨`'ÐS%SÙBD@å*R 'ϤC%äBH@å/ 'Îþ®%z B°@å3ª@'ÎP% +@BD@å8WÀ'ÍÂ%4B°@å=`'Ì»Ú%•B@åA¹'ËöÖ%‰~B@åFi 'ËOû%µB@åK@'ʦÅ%²iB@åOÎ'Éç%7®Bx@åTà'Éi%¦B|@åY5À'ÇÚŒ$ÿÐB|@å]ìÀ'ÆŒ $þ#äBà@åb£À'ÅûA$ýjBà@ågZÀ'Æ-$ý„Bà@ålÀ'Åà+$ýGåBà@åpÌ'Å`0$ü¤BH@åu‰€'ÄÉj$ûãB°@åzC 'İ$û ×BD@å 'Ãg·$ú[B°@僾€'¾F$ùExB¬@åˆ 'Â#=$øB@å?À'Á‡µ$÷·òB@å’`'Àé’$öí‡B@å–Ä@'ÀHi$ö>B|@囈'¿¥€$õN¸Bx@å Kà'¾ý$ôwB|@å¥À'¾Jw$ó’„B|@å©ÖÀ'½‘w$ò¥·Bà@å®À'¼ï—$ñÖƒBà@å³h'¼i\$ñ*³BH@å¸2@'»Ö'$ðnFBH@å¼ü`'»9J$ï¥}BD@åÁÆ 'ºš'$îÙÌBH@寔 '¹í»$íýB°@åËa '¹=($íB°@åÐ2@'¸¡$ìSHB@åÕà'¸2$ë›!B@åÙÓ€'·}q$êÞB@åÞ§`'¶è•$êwB|@åãx'¶Q$é]ŒB@åèO'µ¶5$è—NBà@åí"À'µt$çÏñBx@åñùà'´€Š$ç +îBä@åöÐà'³ä!$æB¹Bà@åû«@'³>$ånBL@æ‚@'²—%$ä˜Bà@æ_ '² +‘$ãäB¬@æ +9à'±†´$ã;ÇBH@æ@'°ñ +$â|6B¬@æôÀ'°O‚$á­sB°@æÕ`'¯²ô$àåB@æ²à'¯$à B°@æ"–À'®‚Ó$ß_ÆB|@æ'w`'­÷ê$Þ­øB@æ,[ '­l¹$ÝûÍBx@æ1?'¬Ü$ÝB³B|@æ6&'¬Jù$܈íBà@æ; '«¾ò$ÛÕ°Bä@æ?ô@'«3j$Û#Bä@æDÛ@'ªž:$Úd!Bà@æIÅ€'©þ3$Ù—KBH@æN¯ '©hË$ØØ BD@æS@'¨åv$Ø/ôB´@æXŠ '¨b4$ׇñB¬@æ]x '§Øj$Ö×’B°@æbhÀ'§Hd$Ö8B@ægY`'¦µõ$ÕcÈB@ælJ '¦'®$Ô­¬B@æq=à'¥Ÿ$ÓþÔBx@æv.€'¥$ÓP½B@æ{%€'¤ˆf$ÒšBà@怀'£õ$ÑÝwB€@æ…€'£[®$Ñ0Bà@æŠ +À'¢Àõ$ÐS%BH@æÀ'¢ÑB €@æ»÷À'š¶ë$ÆÛB x@æÀû '›’ø$Ç"…B |@æÅÿ€'œr$DZ6B |@æË '›HÆ$ÆÃB ä@æÐ  'š'É$ÅQ¥B à@æÕ'™Å$ÄÓKB!L@æÚ'™ûØ$ÅfB à@æß,`'™çÉ$Äÿ¹B!¬@æä6À'™‡$ăØB!L@æéD '™Õ$ÃêB!¬@æîQ '˜œ$ÃHvB!°@æób`'˜ +/$œeB"@æøs'—¡$Áë B"@æýƒ '—)$ÁK¹B"@ç”`'–«$À·åB"@ç¨ '–$À†B"x@ç ¿@'•˜V$¿{NB"ä@çÓ '•Ú$¾Ú±B"|@çê '”—g$¾2oB"à@ç€'”U$½…‹B#L@ç!€'“”$¼æƒB"à@ç&9'“¦$¼QxB#°@ç+S`'’¤,$»³kB#L@ç0pÀ'’)€$»gB#¬@ç5Ž@'‘°p$º{pB#°@ç:«À'‘5…$¹ÞB#°@ç?Ì`'º!$¹@*B$@çDí '?†$¸£;B$@çJà'ÆŒ$¸aB$x@çO4à'LI$·kâB$€@çTXÀ'ŽÓB$¶ÐùB$|@çYà'ŽW£$¶2»B$ä@ç^£ 'Öë$µùB$x@çcÍà'[¹$´ðIB%H@çhõ'Œåe$´XÓB$ä@çn@'ŒrŸ$³ÅêB%H@çsLà'‹ùÛ$³+VB%´@çxz@'‹:$²îB%¬@ç}§À'‹ó$²7B%°@ç‚Õ@'ŠžÁ$±o B%°@çˆ'Š+ö$°ÜB&@ç6 '‰µ²$°DºB&@ç’j€'‰Am$¯¯çB&|@ç—› 'ˆÌ $¯¥B&@çœÒ`'ˆT$®€¶B&è@ç¢ '‡Üà$­ç…B&x@ç§=@'‡bî$­KnB&ä@ç¬t`'†÷K$¬Á§B&ä@ç±® '†‹Y$¬7|B'H@ç¶èà'†{$«¥»B'H@ç¼&€'…©Ù$«×B'´@çÁ` '…4¾$ª€óB'D@çÆž@'„ÃB$©ï±B'´@çËß'„QÃ$©^jB(@çÑ 'ƒâ²$¨Ð@B(@çÖ``'ƒuö$¨EB(@çÛ¡'ƒÎ$§¯B(@çàäà'‚Ž$§,B(|@çæ,'‚Ú$¦+B(ä@çëoà'´}$¦¿B(|@çð¶à'CÜ$¥u”B(à@çö@'€ÇE$¤ÖB)L@çûH`'€W÷$¤G£B(ä@è’ 'í +$£ÊèB)H@èà@'#ð$£J3B)´@è - '~R×$¢ÄaB)¬@è{ '}zn$¢9àB)°@èËà'|¤ª$¡±B*@è`'{Í$¡'B)°@è m@'zö¯$ àB*|@è%¾'zA$ ]B*@è+à'yG$Ÿ‰¤B*|@è0i'xo $žÿdB*ä@è5À'wŠÝ$žmZB*à@è;@'v¹Í$çB*è@è@n`'u÷$jîB*ä@èEÈ 'u/=$œëB+H@èK"à'tfz$œj‹B+H@èP€€'s’$›â¢B+´@èUÝà'rÃê$›^ªB+¬@è[;€'qò$šØUB+´@è`œ@'q„$šM!B,@èeý'pT$™Ï¸B,@èk] 'oæ$™P“B,@èpÁ€'n¿f$˜ÌjB,|@èv%€'mó0$˜I¸B,€@è{Œ€'m#”$—ÄÙB,à@è€ó 'lWz$—B9B,ä@è†ZÀ'kŒù$–ÀŸB,ä@è‹Å'jÆ/$–AeB-H@è‘/`'iÿÎ$•ÂoB-L@è–™À'i9$•CCB-L@èœ@'hvp$”Æ®B-°@è¡tÀ'g¶³$”K÷B-°@è¦å€'fúá$“ÓÃB.@è¬V@'f0»$“RcB.@è±Ç'ei$’Ò™B.@è·:À'd¯6$’[¨B.x@è¼®À'cèC$‘ÜSB.€@èÂ" 'c'Ò$‘a*B.|@èÇ™à'bkB$è|B.è@èÍ'ašp$b×B.ä@èÒ‹@'`Ó5$ãUB/H@èØ€'`ê$nB/H@èÝà'_Z $ŽñòB/L@èâý€'^–M$Žt¬B/´@èè{']Ö_$ùÖB/°@èíø`']A$qB/¬@èóy '\gl$ýB0@èøùà'[©’$Œ•|B0@èþ}à'Z·­$‹ú¬B0€@éà'YU:$‹ÓB0€@é … 'W“Ý$‰øwË$s̉B6è@éï÷`'=͸$ròÖB6ä@éõ±À'=1$r*UB7L@éûl'<•4$qbÑB7H@ê&`';ó‡$p“àB7L@êä';T›$oÈtB7´@ê ¡€':±ö$nøEB7°@êb`':¸$n(™B8@ê# '9w$$meLB8@êãà'8Ù_$l›ZB8@ê#§à'82$kÅB8€@ê)kÀ'7–/$jý­B8|@ê/2à'7È$j>pB8ä@ê4ú '6`Þ$iqÀB8è@ê:Á@'5º<$hœuB8ä@ê@‹ '5 +Ù$g»÷B9L@êFUà'4a $fâ¸B9H@êL# '3Öh$f1)B9¸@êQñ '3Tã$e‹`B9°@êW¾À'2Å$dÓTB9´@ê]€'2-Þ$dÀB:@êc`@'1˜e$cRlB:@êi1'1³$b•`B:@êo'0qí$aÙ€B:€@êtÜ '/Þæ$aNB:ä@êz³`'/Eú$`Y’B:è@ꀊ€'.®´$_—ðB:ä@ê†a '.|$^ÜÈB:ä@êŒ<'-„]$^B;L@ê’ ',î $]Y§B;´@ê—ô',ba$\¦âB;L@êÔÀ'+Ð}$[ì%B<@ꣲ@'+*h$[B;°@ê©“'*w»$Z2ÚB<@ê¯w ')åg$YwB<„@êµWà')sû$Xæ_B<@ê»?'(÷$XF…B<ä@êÁ#'(ko$W“ÁB<€@êÇ +@''Üz$VÜÅB<è@êÌô ''N\$V&ÜB=L@êÒÛÀ'&½ç$UmõB<ä@êØÉ@'&*0$T°áB=°@êÞ³À'%šÿ$Sù˜B=P@êä¡`'%E$SHB=´@êê’ '$œ$RŽÜB>@êð‚à'#æö$QËxB>@êösÀ'#CÝ$Pú´B>@êüg '"¨T$P3žB>|@ë[ '"-ô$O–ûB>€@ëO '!½›$O,B>€@ëFà'!;€$N`£B>è@ëA ' ²|$M±BB?H@ë8€' 0ÿ$M „B>ì@ë 2À'®ë$LeB?H@ë&0`''s$K·B?´@ë,.'ŸÕ$K +B?´@ë2+ 'A$J_ B?´@ë8,`'“.$I²&B@@ë>-@'£$HúkB@@ëD1 'lg$H8ÕB@|@ëJ5 'èŒ$GB@€@ëP<`'sÔ$Fú©B@è@ëV@`'òÐ$FU…B@€@ë\J 'mï$E«oBAH@ëbR'î©$E†B@ì@ëh_€'nC$Dd,BA°@ënj'çq$C·šBAP@ëtw€'aÖ$C —BA°@ëz… 'àø$Bg¤BA´@뀖']$$A¾æBB@놦À'Ü\$ABB@댺À'aØ$@}=BB€@ë’ÎÀ'åÔ$?ÞBB€@ë˜æ'cë$?87BBè@ëžú'Þ÷$>ŽBB€@ë¥@'`æ$=ì¬BCH@ë«.À'ç¡$=QrBCP@ë±I 'jy$<±?BCL@ë·c 'éÉ$< †BCP@ë½ 'j$;i®BC°@ëâ'î}$:ÊÝBD@ëÉ¿ 'o$:(QBC´@ëÏã 'ìó$97BD€@ëÖ`'k]$8ÛWBD@ëÜ+ 'ÞK$8&ÆBDè@ëâO 'G©$7e÷BD€@ëèvà'Ëÿ$6ǬBDè@ëîž'n’$6PBDä@ëôÈ€' Q$5ÓšBEP@ëúòà' œ¢$5C_BEL@ì €' ${$4©“BE´@ìN ' ¬_$4ÕBE´@ì ' 4Â$3v»BF@쬀' ½[$2ÝåBE°@ìà ' D$2B²BF„@ì  ' +Í¿$1«1BF€@ì&H ' +\$1ŸBF€@ì,|À' ç§$0„¬BF„@ì2·' p"$/ë°BGH@ì8î`'ùÎ$/T:BFì@ì?( 'ƒ¿$.½BGH@ìEc ' Æ$.&BGP@ìK à'šX$-’\BG¸@ìQÞ`')š$- BG°@ìX@'¸„$,qMBH@ì^`'D $+Ü9BH@ìd à'Ï$+FBH@ìjå']$*´|BH„@ìq, 'ë%$*"¾BHä@ìws`'zl$)’uBHè@ì}º ' +E$)çBHè@ì„À'š»$(t#BHä@ìŠL@'+b$'åœBIP@ìš'¹$'S2BI¸@ì–ç€'F:$&ÀJBI°@ì5 'Øì$&4aBI´@죆'l~$%©—BJ@ì©ÖÀ'üƒ$%BBJ@ì°*à'Œú$$‹}BJ„@ì¶' %$$0BJ„@ì¼Ö &ÿdL$#sdBJä@ìÃ-`&þ|ö$"ßUBJè@ìÉ„ &ý€3$"=‘BJè@ìÏß&ü#ä$!^¦BKL@ìÖ< &ú'$ ¨BK´@ìÜ— &øÖ+$AcBKP@ìâôà&ùó$n BK¸@ìéU &ù2$|7BL@ìï¶€&ø›·$úBL@ìö€&÷Ñð$š×BL€@ìü~ &öþ6$UBL„@íâ€&ö"-$†ƒBL|@í Ià&õ3»$íèBLì@í± &ô(6$B²BLè@í &ó$@$œRBMP@í…à&òpU$),BMH@í"ó &ñçw$Ñ”BM¸@í)a@&ñ?Í$fEBM´@í/Ï&ð| $èûBM¸@í6?à&ï°ž$fËBN@í<°À&îä8$ãûBN@íC$ &î$aIBN|@íI›à&íK½$ÞŽBNè@íP&ì—$[æBN„@íV‡@&ë·$Û–BNè@í]À&êìì$Z1BOP@íc|@&ê",$ØnBOP@íiùÀ&éZ\$XŒBO°@ípt@&è–³$ÛSBOP@ívõ &çÔ*$^ÓBP@í}v&çÌ$à‚BP@íƒöà&æI–$bKBP@íŠ{&å…M$ä¬BP„@íÿ&伪$dDBP€@í—†@&ãï3$àÄBPè@íž €&ã,Ý$ddBPè@í¤”À&ât¦$îBPè@í«@&á·i$ubBQP@í±¬à&àó$øBQ´@í¸7`&à+Y$wçBQP@í¾È@&ßf„$ùîBR@íÅY &Þ¦’$BR@íËê&Ýå–$“BR@íÒzà&Ý+$ Œ-BR@íÙ &Üuý$ PBRè@íߦ@&Û¿$ £ŽBR„@íæ=€&Û»$ *µBRè@íìØ&ÚB>$ ¯„BSP@íór`&Ù‡›$ 8BSL@íú à&ØÒP$ +Ä +BSP@&ØÜ$ +OéBS¸@îH@&×dü$ Ú;BS´@î é &Ö¬¥$ dABT@îŠ&Õõ›$ïBT@î. &Õ?>$zeBT„@î!Ò &Ôˆg$`BT€@î(y`&ÓÑã$‘BTè@î/ À&Óô$ÅBTì@î5È&Òf®$¨BTè@îÞ#û1ÀBXì@îÂú &ÃÊ@#úœ{BXè@îÉÅ &ÃVí#úÝBYP@îР&ÂÄï#ùMþBYP@î×]`&Â%#øQBY¸@îÞ+&Á‚¸#÷±BY´@îäøÀ&Àß›#öàÆBY¸@îëÉ &À;>#ödBZ@îòÀ&¿—#õ<:BZ„@îùqà&¾ów#ôjÕBZ„@ïEà&¾OÏ#ó™[BZ€@ï@&½©#òÄzBZì@ï ÷À&¼ÿô#ñëvB[P@ïÒ@&¼]x#ñ{B[P@ï¬À&»ÃI#ðVB[P@ï"Š`&»&#ïŒãB[´@ï)h@&º„æ#î¾—B[¼@ï0I &¹ãj#íïäB\@ï7*&¹AË#í!B\@ï>&¸¡d#ìS³B\€@ïDò@&¸Û#ëŒB\ˆ@ïKÙ€&·k¾#êÇYB\è@ïRÀÀ&¶Ï#éþÎB\è@ïY¨@&¶1è#é5£B\ð@ï`•à&µ—I#èo¹B]´@ïg€`&´ýM#窠B]P@ïnn &´b²#æäºB]¸@ïu_&³Ç¶#æZB^@ï|Oà&³-/#åXŽB^@ïƒ@à&²”#ä”B^ @ïŠ5&±û^#ãÑB^„@ï‘,@&±`D#ã +”B^è@ï˜# &°À;#â=¼B^ì@ïŸà&°"÷#átoB^è@ï¦`&¯‰Z#à¯ÏB_P@ï­&®ï]#ßê´B_T@ï´  &®bÇ#ß6ÁB_´@ï» €&­Ø#Þ…$B_¼@ï `&­F #ÝÊLB`@ïÉ @&¬²o#Ý [B`@ïÐ`&¬ü#ÜPžB`„@ï×À&«‹Á#Û”*B`ì@ïÞà&ªøÄ#ÚØB`„@ïå$ &ªfJ#ÚˆB`è@ïì.À&©Ô‚#ÙaíBaT@ïó9@&©C #ا»BaP@ïúFà&¨±‡#×íyBa´@ðª`&¨ é#×4]Ba¼@ð2À&§‘Q#Ö|Bb@ð»@&§ô#ÕÅBb @ð E`&¦ræ#Õ ôBbˆ@ðÏ`&¥äe#ÔWŒBb€@ðY€&¥V^#Ó¡ÀBbˆ@ðæÀ&¤ÈÚ#ÒìœBcP@ðr€&¤;}#Ò7ªBbð@ðÿ &£­F#Ñ¡BcH@𠎀&£ß#ÐÊBc¸@ð$€&¢ð#ÐfBcÀ@ð'¬`&¢æ#Ïc¶Bc¸@ð+<À&¡}ã#εBd@ð.Îà& ô#Î$Bdˆ@ð2`à& hD#ÍRCBd€@ð5ó&ŸÞx#Ì¡áBdˆ@ð9†À&ŸWý#Ëõ¾Bdð@ð=à&žÑQ#ËI]BeH@ð@±@&žI #Ê›­BeX@ðDF€&Â#ÉîBeP@ðGÝ`&:¨#É@×Be¸@ðKuà&œ³Ø#È”GBf @ðO@&œ-¸#Çè™Bf@ðR¦À&›¨#Ç={Bf @ðV@à&›"y#Æ’†Bfˆ@ðYÜ &šœã#ÅçˆBfð@ð]x@&šÈ#Å=)Bfè@ðaà&™“q#Ä“ÃBfè@ðd± &™Ó#ÃëKBgP@ðhN€&˜Œ#ÃC1BgX@ðkí`&˜Ã#š’Bg¸@ðoà&—ƒÃ#ÁðVBh @ðs.`&—á#ÁHÎBh @ðvÎÀ&–´#À¦Bh@ðzpà&•ÿK#¿ÿBhˆ@ð~€&•wx#¿Q=Bhè@ð¶ &”æk#¾—“Bhˆ@ð…[à&”7v#½· BiP@ð‰@&“Šß#¼Ú¶BiX@ðŒ¦€&“*ˆ#¼_fBiP@ðM@&’å#¼ Bi°@ð“õÀ&’€¯#»…ÿBj @ð—ž@&’ >#ºíBj @ð›FÀ&‘(#ºNHBj @ðžðà&‘_#¹­FBjˆ@𢜠&’$#¹ ûBjð@ð¦H@&ˆ#¸nÂBjè@ð©óà&šY#·ÏÎBjè@ð­¡ &a#·2hBkP@ð±P &ަ$#¶—9BkÀ@ð´ÿ&Ž,B#µû5Bk¸@ð¸­à&²†#µ_cBk¸@ð¼^`&9Ï#´ÄßBl @ðÀ€&ŒÁ/#´*zBlˆ@ðà&ŒH#³rBlˆ@ðÇt &‹Î«#²ôBl€@ðË(`&‹V#²Y»Blð@ðÎÝ &Šß8#±ÁŽBmP@ðÒ’à&Ši#±*OBmP@ðÖH &‰ò¨#°’ÃBmP@ðÚ &‰|“#¯ûBn @ðÝ·€&‰Ù#¯díBm¸@ðáp&ˆ‘D#®ÎkBn @ðå* &ˆè#®83Bnˆ@ðèä@&‡¦±#­¢*Bnˆ@ðì &‡2#­ éBnð@ðð[ &†¾V#¬xÀBnè@ðô&†Jo#«äeBoX@ð÷Ö@&…Öµ#«PCBoP@ðû• &…dF#ª½ËBo¸@ðÿT&„òR#ª+îBo¸@ñ€&„€‹#©šKBp @ñÕ&„þ#©óBp @ñ +— &ƒ¯#¨wêBpˆ@ñY@&ƒ,ç#§çŽBpˆ@ñ&‚¼g#§WŽBpð@ñà &‚KÒ#¦ÇrBpè@ñ¦&Ú×#¦6ÖBqX@ñk@&i#¥¥)BqP@ñ!2 &€ö€#¥Bq¸@ñ$ú &€†6#¤‚ÔBr @ñ(à &€ð#£ù…Br @ñ,‹ &b5#£r Br @ñ0UÀ&~‰¤#¢çsBrˆ@ñ4!€&}®#¢ZñBrð@ñ7í &|Óü#¡ÏZBrè@ñ;¸à&{û=#¡D¢Brð@ñ?† &{ ;# ¸wBsP@ñCU&zF3# ,íBs¸@ñG$&yq¢#Ÿ¤âBsÀ@ñJô€&xž#ŸÃBt @ñNÅ&wÊ##ž•ÙBt @ñR•€&vñ›#ž EBt @ñVi &v +G#w7Btè@ñZ;@&u#œØcBtˆ@ñ^€&t;í#œOPBuP@ñaåà&sÚ#›ßèBuX@ñe» &rÌÇ#›dVBuP@ñi’&qùž#šÝ2Bu¸@ñmi&q+L#šY&BuÀ@ñqA€&pcß#™Ù„Bv @ñu€&oš5#™XtBv€@ñxõ &n͘#˜Õ€Bvˆ@ñ|ÏÀ&mÿb#˜Q†Bvˆ@ñ€« &m0Ô#—ÍTBvø@ñ„ˆà&lcÛ#—J%BwP@ñˆf &k—á#–ÇšBwP@ñŒC€&jÊ#–CäBwX@ñ$&iü#•ÀBx @ñ”à&i/Ó#•=TBw¸@ñ—å&he)#”»ŸBxˆ@ñ›Å€&gÌ#”<Bx @ñŸ© &fÚ…#“¿ Bxè@ñ£Œà&fo#“EeBxð@ñ§pÀ&e\#’ÊFBxø@ñ«V&d—á#’L¹ByP@ñ¯;@&cѬ#‘ÍÞByP@ñ³"@&cÌ#‘MOByÀ@ñ· +À&bC!#ÎÍBz @ñºó@&a‚›#S–Bz @ñ¾Ý@&`½I#ÕNBz€@ñÂÇ`&_ø#W Bzˆ@ñƱ &_="#ŽßqBz@ñÊžà&^x#ŽgWB{P@ñΊ &]À#ë‘Bzð@ñÒy€&]–#rKB{¸@ñÖh`&\FR#ŒùÎB{¸@ñÚW`&[‰_#Œ€àB{À@ñÞH&ZÏu#Œ äB|(@ñâ8€&Z}#‹’;B| @ñæ*€&YW•#‹UB|€@ñê@&X˜|#ŠŸB|ð@ñî&WÕì#Š"‚B|ð@ñò@&W#‰§]B}P@ñõü &VcV#‰5VB}X@ñùó &U¬…#ˆÀUB}À@ñýê€&TÐe#ˆ3tB}¸@òã&Sò9#‡¥CB~ @òÛ€&SGÕ#‡86B~ @ò ÕÀ&R¤N#†ÏŽB~@ò Ñ`&QóY#†^MB~è@òÍ &Q=Ü#…ê&B~ð@òÈÀ&P““#…}+B~è@òÇÀ&OúÞ#…oBÀ@òÅ &OV¦#„²UBX@ò!Ä&N¦˜#„A©B¸@ò%Ä€&MíF#ƒËB€@ò)Æ &M Q#ƒGâB€D@ò-Ç@&LFË#‚¼«B€@ò1Ë&KÃ#ü¦B€x@ò5Π&I‹;#€üóB€t@ò9Ò`&HøR#€žíB€x@ò=Ù`&I=Ñ#€ËgB€à@òAÞ &IF#€¥LB€¨@òEå &H[t#€:ˆB€à@òIî &G€í#]XB@òMø@&F #}•GBD@òRÀ&D˜·#{¤ÁB@òV €&D=ª#{05Bx@òZ`&D„#{ŠRB|@ò^$&DZ’#{U5Bt@òb2à&CÑ#z¥$BÜ@òf@@&C-#yÓUB¬@òjO@&Bƒó#xúÐBà@òn_À&AÜb#x$TB‚@òrqà&A8W#wRZB‚D@òv‚€&@”#v€B‚@òz– &?îÒ#u¬‘B‚t@ò~©à&?I‡#tØþB‚x@ò‚¿@&>¥#tŒB‚¬@ò†Ô &>Ž#s50B‚¬@òŠéà&=^/#rdB‚¨@ò`&<»l#q“½Bƒ@ò“&<2#pÄBƒ@ò—3€&;w#oôBƒ@ò›M &:Õ'#o%PBƒD@òŸgà&:3^#nV;BƒH@ò£… &9’#m‡²Bƒ¨@ò§¡&8òú#l¼!Bƒ|@ò«¾@&8Uã#kó Bƒ¨@ò¯Ý &7¸D#k)MBƒÜ@ò³ýÀ&7k#j_AB„@ò¸@&6}#i•ÅB„@ò¼>À&5à#hÌáB„@òÀa&5CŽ#hB„H@òÄ„À&4§¶#g=B„x@òȨ`&4 O#fv'B„t@òÌÍà&3qb#e¯ÙB„°@òÐó &2ÖV#dédB„¨@òÕ &2;Œ#d#BB„à@òÙB &1¢L#c_B…@òÝk &1 ê#bœ B…@òá“À&0r4#aÙÜB…@òå¿€&/Úé#a5B…x@òééÀ&/Cœ#`VŠB…H@òî&.¬¤#_•LB…¨@òòD`&.4#^Ô½B…¬@òöqÀ&-€Y#^íB…¬@òú  &,ë #]UÍB…Ü@òþÑ@&,V'#\— &#Ùy#Qº4B‡à@óBP€&#LA#QrB‡Ü@óF &"¿#PP¨B‡ä@óJÐ &"2£#OœúBˆ@óO@&!§¦#NëBˆD@óST`&!Û#N9jBˆD@óW˜@& ‘î#M‡–Bˆ|@ó[Ý€& ’#LÖ}Bˆ¨@ó`#&}ò#L&UBˆ°@ódià&ôÕ#KvÓBˆÜ@óh°à&l#JÇÄBˆà@ólù`&ãÑ#J^B‰@óqB&[Þ#IkYB‰@óuŒ &Ôd#H½ðB‰D@óy×à&M[#HB‰x@ó~# &ÆÆ#GdÔB‰x@ó‚q&@¥#F¹%B‰¬@ó†¾`&ºå#F òB‰¬@ó‹ `&5‹#EcAB‰à@ó^&°¢#D¹ BŠ@󓮀&+¢#DäBŠ@ó˜À&¦É#CdØBŠH@óœRà&#t#B¼½BŠD@ó ¦ &¡B#BBŠx@ó¤ü&7#Ao¢BЬ@ó©Q`&9#@É>BЬ@ó­¨`&8#@"ÖBŠà@ó±ÿ@&™ƒ#?|ÑBŠÜ@ó¶Wà&k#>דB‹@óº°`&˜o#>3ÁB‹@ó¿ @&Ü#=uB‹|@óÃf€&™X#<í>B‹H@óÇÃÀ&3# &!„#9ÄBŒ@óÝž &¤«#9$²BŒ@óâà&(#8…!BŒH@óædÀ&«Î#7æ&BŒ|@óêÈ`&0 #7G×BŒt@óï-à&´™#6©¹BŒ°@óó“@&8 #6 BŒ¬@ó÷ú & ¼È#5l…BŒÜ@óübÀ& B¢#4Ð+B@ôË`& É^#44òB@ô5€& Pe#3šBD@ô ŸÀ& Øw#3˜BH@ô €& `i#2fíBx@ôxà& +èz#1ÍiB¬@ôæ@& +p·#14B¬@ôU@& ù#0›Bà@ôÅÀ& ‚#0¥BŽ@ô$6`& º#/k+BŽ@ô(§&•Ò#.Ô@BŽ@ô-À& (#.=£BŽx@ô1Ž &ªÌ#-§lBŽ|@ô6`&5È#-£BŽx@ô:wà&Á##,|VBް@ô>îÀ&M #+ç¹BŽÜ@ôCeÀ&ÙI#+SBŽà@ôGÞ`&e¡#*¿†B@ôLX€&òQ#*+ìBD@ôPÒÀ&¯#)™2BH@ôUN€& ž#)0Bx@ôYÌ&›H#(t×B°@ô^I@&(`#'áÂB¨@ôbÆ &¶—#'PB¬@ôgG@&GL#&Á©B@ôkÇà&Ø#&33B@ôpH`&gÐ#%£™B@ôtÊ &÷«#%BH@ôyN€&ˆ #$…ëB|@ô}Óà&E##ø©B¬@ô‚Y`%ÿWê##kwB°@ô†Þ %þ{ÿ#"Þ·B¨@ô‹g@%ý ²#"R]B‘@ôïà%üÆ#!ÆrB‘@ô”x€%ûëð#!:×B‘@ô™À%ûê# ¯òB‘H@ôŽ`%ú:}# %oB‘t@ô¢@%ùb(#šûB‘|@ô¦©@%øŠN#ÖB‘à@ô«6À%÷´?#‡ÖB‘°@ô¯Ç`%öß>#ÿ„B’@ô´V@%ö +L#w;B‘Ü@ô¸è€%õ5¿#ï2B’H@ô½z %ôaÐ#gB’D@ô€%óŽŸ#àeB’|@ôÆ¢`%ò»Þ#Y„B’|@ôË9`%ñê2#ÓSB’à@ôÏΠ%ñÓ#MøB’¨@ôÔg@%ðJY#É/B“@ôØÿà%ïzy#D$B“@ôݘ€%#¿B“@ôâ2À%íÝ#;B“H@ôæÎ %í#¹B“|@ôël%ìCÇ#5žB“¬@ôð `%ëwÅ#³ B“¬@ôô¨`%ê­à#1×B“à@ôùG`%éä!#°¸B“à@ôýè%éP#/B”@õŠ@%èQ#®ºB”H@õ,`%燀#-ÂB”D@õ Ð@%æ¾.#¬êB”|@õu %åöì#-dB”¬@õ %å1 #®¾B”°@õ %äkc#0?B”à@õjÀ%ã¦[#²%B•@õ#`%ââ?#4£B•@õ'½€%âû#·«B•D@õ,gÀ%á\#:ðB•H@õ1€%à™c#¾SB•x@õ5Á%ß×q#B3B•°@õ:n`%ß=#ÆB•¬@õ?`%ÞU„#K5B•à@õCÎ%Ý•™# ÐaB–@õH~ %ÜÖW# UúB–@õM0à%Üð# ÛzB–H@õQäÀ%ÛV# ` B–|@õV˜€%Ú¸# á¾B–x@õ[N%Ù±O# RÂB–°@õ`%Ø‘Æ# +š¼B–à@õd¼%טe# û"B–à@õit %×3Ô# ºÅB—@õn-@%ÖÔŠ# }ÉB—@õré %Ö4q# RB—|@õw£@%Õ##£IB—D@õ|`À%ÔÇ#-B—°@õ %Ô^#·êB—¬@õ…Ý %ÓXW#BÇB—à@õŠœ@%Ò¢#ÎB—ä@õ\à%ÑìO#YÌB˜@õ”%Ñ6Ð#å¤B˜D@õ˜âà%ÐÑ#qÍB˜|@õ¦À%ÏÍZ#þNB˜|@õ¢j€%Ï'#ŠVB˜x@õ§1€%Î`[#µB˜à@õ«ø %Í«# ·B˜ä@õ°¿ %Ìû2#0 B˜à@õµ‰à%ÌN7#ÁkB™H@õºT%Ë —#RLB™D@õ¿`%Êñ·#â`B™L@õÃëà%ÊBr#r5B™°@õȹ@%É“R# B™¬@õ͆ %ÈäT#’!B™¬@õÒW@%È6>#"·Bš@õ×'à%ljú"ÿhîBš@õÛø€%ÆÞF"þ&Bš@õàÌ`%Æ2a"ý±Bš|@õå @%ņ"üÕ2Bš|@õêt%ÄÛ>"ûùéBšx@õïK %Ä0J"ûBšä@õô"@%Æ¢"úEîBšä@õøù@%ÂÞý"ùoXBšà@õýÓ€%Â7J"ø˜°B›H@ö¬ %Á*"÷Á}B›@ö‡à%Àç&"öênB›x@ö cÀ%À@9"öÃB›|@öA %¿šÃ"õ@ùB›¬@ö @%¾õ˜"ômB›ä@öÿ`%¾Pw"óš1B›ä@öà%½«×"òÇyBœ@ö$ %½Þ"ñõ—BœD@ö)¤`%¼cå"ñ#´BœH@ö.ˆ@%»¿j"ðQ+Bœ|@ö3mÀ%»Å"ï´Bœ°@ö8S@%º{ "î²Bœ°@ö=;à%¹Û["íå“B@öB"à%¹:ê"í5Bœà@öG %¸™'"ìI'BH@öK÷`%·÷‘"ëzSBH@öPá %·Y1"ꯛBH@öUÏ %¶¼‡"éçB°@öZ¼€%¶ñ"é¤B¬@ö_«€%µƒ"èUÌBà@ödš %´åë"猲Bä@öi‹@%´IT"æÄBBž@ön}€%³­·"åýBžH@ösq`%³ö"å6ýBž|@öxe %²x"äp·Bžx@ö}ZÀ%±Ý"ãªbBž´@ö‚P %±C"âå1Bž¬@ö‡HÀ%°ª6"â!BŸ@öŒ?À%°Ã"á^kBžà@ö‘: %¯y®"à›ÀBŸL@ö–4`%®áº"ßÙ@BŸH@ö›0@%®IÝ"ßÝBŸ|@ö -À%­²{"ÞUBŸ°@ö¥+ %­­"Ý•XBŸ¬@öª*@%¬‡"ÜÖzBŸä@ö¯*à%«òÜ"Ü#B @ö´- %«^"ÛYžB H@ö¹/`%ªÉ¾"Ú›ÔB H@ö¾1 %ª5™"ÙÞ4B H@öÃ7 %©¡ò"Ù!5B °@öÈ< %©†"Ød‚B °@öÍC %¨zÁ"×§^B à@öÒL`%§èM"ÖëèB¡@ö×U%§Xø"Ö4pB¡@öÜ_@%¦É›"Õ|ïB¡H@öái %¦9%"ÔÄB¡L@öæw%¥¨Ò"Ô KB¡¬@öë„`%¥#"ÓS_B¡¬@öð“ %¤Šœ"ÒœðB¡è@öõ¢ %£ý2"ÑçîB¡à@öú³@%£oÆ"Ñ2éB¢@öÿÅ %¢â§"Ð~FB¢L@÷×À%¢Uè"ÏÊB¢D@÷ í@%¡É["Ï6B¢°@÷À%¡=i"ÎcB¢°@÷@% ±Ù"ͰrB¢°@÷1% &"ÌýxB£@÷I %Ÿš§"ÌKB£@÷#b@%Ÿ²"Ëš~B£@÷(~ %žˆ$"Êë³B£|@÷-š%ÿƒ"Ê<ÐB£|@÷2·€%vÉ"ÉÎB£°@÷7Õ%œîb"Èß6B£°@÷<õ %œeæ"È0ƒB¤@÷BÀ%›Þ}"ǃ/B£ä@÷G7%›XV"Æ×xB¤H@÷LZà%šÒ¬"Æ,aB¤|@÷Q~À%šL"Å€ÉB¤|@÷V¢ %™ÆK"ÄÔÚB¤|@÷[ÉÀ%™@­"Ä)ÓB¤ä@÷`ðÀ%˜¼Ô"ÃB¤à@÷f€%˜9™"ÂÙB¥@÷kCÀ%—¶="Â0ñB¥H@÷pn%—2ð"ÁˆáB¥H@÷u™à%–°D"ÀáŸB¥|@÷zÇ`%–."À:ãB¥°@÷ôà%•¬&"¿”«B¥°@÷…% %•*ß"¾ï2B¦@÷ŠT %”©Ï"¾IþB¥à@÷‡%”)"½¥9B¦L@÷”¹@%“¨Y"½qB¦H@÷™í %“'¨"¼[¸B¦|@÷Ÿ" %’§æ"»¸0B¦°@÷¤YÀ%’*"»B¦ä@÷©À%‘¬ƒ"ºvkB¦à@÷®É€%‘.½"¹ÕmB§@÷´À%°Ò"¹4@B§H@÷¹> %1Ø"¸‘¸B§L@÷¾yà%³k"·ïäB§x@÷÷€%8;"·R7B§´@÷Èôà%޽˜"¶µ=B§¬@÷Î5 %ŽAë"¶ïB¨@÷Óv`%Çô"µzÒB¨@÷Ø·%NX"´ß)B¨@÷Ýû%ŒÓØ"´B[B¨€@÷ã>À%ŒXÏ"³¤àB¨x@÷è„`%‹Þû"³ïB¨´@÷íÉÀ%‹g "²o„B¨¬@÷ó€%Šï‡"±ÖoB©@÷ø[@%Šw¼"±=B©@÷ý¥€%ŠB"°¤,B©H@øïà%‰‰"° ¦B©L@ø; %‰E"¯s‹B©x@ø ‰@%ˆ›Ä"®ÛÜB©´@øØ`%ˆ%‰"®D†B©ä@ø'`%‡¯Ë"­­ÑB©à@øyÀ%‡:¹"­÷BªL@ø"Ì%†Æ "¬‚BªH@ø(@%†Q”"«íŠBªH@ø-sà%…Ý!"«X{Bª´@ø2É@%…h!"ªÂ¹Bª¬@ø8 `%„ód"ª-LBªä@ø=w %„€ß"©š·Bªè@øBÐ@%„à"© +B«@øH*€%ƒža"¨xÎB«H@øM†€%ƒ,‰"§çB«€@øRãà%‚»"§UÈB«¬@øXA€%‚J?"¦ÅoB«´@ø]  %Ú +"¦5ÐB«ä@øc@%j5"¥¦ªB¬@øhb%€ú‹"¥¼B¬@ømÊÀ%€‹"¤‰B­@øs+`%€ü"£úÜB¬@øxŒ %ZA"£löB¬@ø}ìà%~}2"¢ß|B¬@øƒ] %}¡y"¢RÝB®@øˆ¾@%|Åð"¡Æ\B¬@øŽ/%{èÑ"¡8ØB®@ø“ŸÀ%{ Ê" ¬B®@ø™`%z5”" "JB¬@øžq %y`¢"ŸšB®@ø£áà%xŠ_"ŸáB®@ø©R %w³V"ž‡AB®@ø®Ã@%vÝA"þ>B®@ø´4%vQ"uöB®@ø¹¤À%u3™"œíÒB®@ø¿€%t_k"œfB®@øÄ–@%sŒË"›ß:B°@øÊà%r»"›YB®@øÏ‡ %qé²"šÓB°@øÔø`%q¨"šM8B®@øÚy %pH>"™ÇÖB°@øßéÀ%oxr"™BØB®@øåj€%n©9"˜¾8B°@øêë@%mÚé"˜:.B°@øðl%m "—µÃB°@øõìÀ%l<"—0·B°@øûm€%ko="–­—B°@ùî %j¦R"–-B°@ùnà%iÝ—"•¬ŠB°@ù ÿ %ii"•+ÈB²@ù€`%hKÏ"”«fB°@ù %gƒ"”+2B²@ù‘à%f»u"“«,B°@ù""€%eôB"“+¯B²@ù'£@%e."’¬ÙB°@ù-4%dh^"’.QB²@ù2ÄÀ%c£@"‘°)B²@ù8U€%bÞµ"‘2_B²@ù=æ@%bƒ"´ÎB²@ùCw%aW"7½B²@ùIÀ%`”¸"»WB²@ùN˜`%_ÒÒ"?>B²@ùT9 %_å"ŽÃ"B´@ùYÉà%^O"ŽGB²@ù_Z %]Œ÷"ÊÛB²@ùdû`%\Êq"N]B´@ùjœ %\ +È"ŒÓ³B´@ùp,à%[P +"Œ\/B²@ùuÍ %Z•+"‹ä–B´@ù{n`%YÕu"‹iäB´@ù %Y™"Šï¾B´@ù†¯à%X^Ÿ"ŠyÿB´@ùŒP %W§)"Š•B´@ù‘ñ`%Vìz"‰B´@ù—’ %V."‰?B´@ùBà%Ua("ˆB¶@ù¢ã %Tƒº"ˆbB´@ù¨„`%SÇå"‡Š,B´@ù®5 %S5J"‡,XB¶@ù³åà%R•ä"†ÆTB¶@ù¹† %QåN"†UQB´@ù¿7`%Q1§"…âVB¶@ùÄè %P}¾"…o2B¶@ùʘà%OÉî"„üB¶@ùÐI %O‚"„‰HB¶@ùÕú`%Nb¤"„+B¶@ùÛ« %M­M"ƒ¢B¶@ùá[à%Lø2"ƒ.4B¶@ùç %LGO"‚¼ÿB¸@ùìÍ`%Kš¥"‚N~B¶@ùò~ %Jíå"ßîB¶@ùø>à%J?["p:B¸@ùýÿ %I{"NB¸@ú°`%Hâ"€¶B¶@ú q %H4¤"€!°B¸@ú1à%G‡¾"fB¸@úò %FÚq"~ˆ>B¸@ú³`%F-v"}ªÔB¸@ú t %E‚r"|ÏíB¸@ú&5%DÙ="{÷XB¸@ú,À%D0 "{áBº@ú1Æ€%C†å"zFDB¸@ú7‡@%BÝÿ"ynB¸@ú=X%B5­"x– Bº@úCÀ%AÅ"w¿´B¸@úHé€%@æB"véJBº@úNº@%@?€"vÖBº@úT‹ %?™Š"u?iBº@úZ[à%>ó¥"tkBº@ú`, %>L,"s”³Bº@úeý`%=£R"r¼‘Bº@úkÎ %<ýŠ"qè_Bº@úqžà%<]"qBº@úwo %;¾Á"pPRBº@ú}P€%;J"o‚îB¼@úƒ!@%:|3"n³uBº@ú‰%9ÙA"mâãB¼@úŽÒÀ%97B"m‡Bº@ú”³€%8˜"lGÃB¼@úš”`%7ù¸"k}B¼@ú u %7["j²B¼@ú¦Uà%6½+"içåB¼@ú¬6 %6Æ"imB¼@ú²`%5‚¼"hUlB¼@ú·ø@%4æ"gŒàB¼@ú½Ù%4It"fÄkB¼@úÃÉÀ%3¬&"eûB¾@úɪ€%3…"e2•B¼@úÏ›`%2uø"dn +B¾@úÕ| %1ÝS"cª§B¼@úÛlà%1Cþ"bæcB¾@úá] %0ª½"b"9B¾@úçN€%0o"a]þB¾@úí/@%/wÃ"`™KB¼@úó %.Ýó"_ÔjB¾@úù à%.CW"_ƒBÀ@úÿ %-ªN"^J¡B¾@û`%-;"]‹ÐB¾@û +ó %,ƒ"\ЩB¾@ûô%+ðŸ"\GBÀ@ûäÀ%+]Â"[YJB¾@ûå€%*Ê„"ZœÒBÀ@û"æ`%*6Ò"YßÅBÀ@û(× %)£"Y#XB¾@û.×à%)5"XgñBÀ@û4ØÀ%(~ú"W¬ÅBÀ@û:Ù€%'ëŸ"Vð'BÀ@û@Ú@%'W¤"V2½BÀ@ûFÛ %&Ǥ"UzkBÀ@ûLÛà%&9þ"TÅBÀ@ûRìÀ%%ªð"TBÂ@ûXí€%%£"SV“BÀ@û^þ@%$Œã"RŸÚBÂ@ûdÿ %#þº"QéãBÀ@ûkà%#q$"Q4©BÂ@ûq  %"ã²"PœBÂ@ûw1€%"V·"OË(BÂ@û}2@%!Éÿ"OBÀ@ûƒC %!;ç"Na'BÂ@û‰cà% ¬ª"M©ÏBÄ@ûtÀ% "LéBÂ@û•…€%Yt"K÷ŸBÂ@û›–@%‡,"JêuBÂ@û¡· %>"JSƒBÄ@û§Çà%Ôt"J²BÂ@û­èÀ%oU"I„CBÄ@û³ù€%îß"HßÕBÂ@ûº`%h6"H3xBÄ@ûÀ; %á%"G†–BÄ@ûÆ\%ZG"FÙôBÄ@ûÌ|À%Ó˜"F-BÄ@ûÒ %M`"EÃBÄ@ûؾ`%È"D×(BÄ@ûÞß@%C{"D-jBÄ@ûå%¿"CƒÙBÆ@ûë0à%:Í"BÚ BÄ@ûña %·"B2BÆ@û÷‚€%3Ç"A‰ôBÄ@ûý³@%°Ô"@âWBÆ@üä %."@;BÆ@ü +à%«¬"?”BÆ@üEÀ%*%">îDBÆ@üv€%¨™">HrBÆ@ü§`%#_"=êBÆ@ü"Ø %™Ù"<íâBÆ@ü) %a"¾BÊ@ü¿¬à%©­"-¥üBÌ@üÅýÀ%/õ"- +.BÊ@üÌ^ %·ž",p&BÌ@üÒ¯`%E$"+ÝžBÊ@üÙ@%ÓM"+KçBÌ@üßq %`³"*¹7BÌ@üåÒ%îî"*'—BÌ@üì2À%|þ")•ÀBÌ@üò“ % +„")8BÌ@üøô€%—ß"(pyBÌ@üÿU`%%"'݆BÌ@ý¶ %²½"'K0BÌ@ý '%@‘"&¹ BÎ@ý‡à%ÌÉ"&$×BÌ@ýøÀ%Xå"%BÎ@ýi %çú"$ÿùBÎ@ý%Ê`%{G"$tÕBÌ@ý,;@%Ã"#ë6BÎ@ý2¬ $ÿCá"#^¤BÎ@ý9$þfö""ÑABÎ@ý?à$ýŠ5""CùBÎ@ýEþ $ü­Â"!¶ãBÎ@ýL€$ûÔ©"!+ñBÐ@ýRð`$úüì" ¡ÞBÎ@ýYq@$ú#û" BÐ@ý_â $ùJä"ŒBÎ@ýfc$ørÍ"ÊBÐ@ýlãÀ$÷›"w¸BÐ@ýsT $öÃk"íµBÎ@ýyÕ€$õì{"d%BÐ@ý€V`$õ"ÚæBÐ@ý†×@$ô?š"QªBÐ@ýh $ói˜"ȳBÒ@ý“é$ò—e"B,BÐ@ýšià$ñÉ"¾$BÐ@ý úÀ$ðúæ":-BÒ@ý§{€$ð*è"µBÐ@ý® `$ïZ¶"/ÑBÒ@ý´@$îŠØ"ªÇBÒ@ý» $í»0"%áBÐ@ýÁ¯$ìë6" ÆBÒ@ýÈ?à$ìR"]BÒ@ýÎÐÀ$ëLZ"—CBÒ@ýÕq $êv<";BÔ@ýÜ€$é¨i"ŠBÒ@ýâ“`$èç"ÃBÒ@ýé4@$èD"ŒøBÔ@ýïÅ $çI¸"8BÒ@ýöf$æzÀ"ÂBÔ@ýýà$å´"£BÔ@þ—À$äð"… BÒ@þ +8 $äQ"þHBÔ@þÙ€$ãF<"t¡BÔ@þz`$â‚["÷DBÔ@þ+@$áÍz"ƒBÖ@þ$Ì $á1" BÔ@þ+m$à‘"m)BÔ@þ2à$ÞÑ"šABÖ@þ8¾À$ÝÓt" ÷øBÔ@þ?o $Ýo¾" ¸'BÖ@þF €$ݾ" €yBÖ@þLÁ`$Ü " (YBÔ@þSr@$ÛÜc" ¶BÖ@þZ# $Ûç" <½BÖ@þ`Ô$Úb¤" Ä@BÖ@þg•$Ù¨*" LçBØ @þnEà$Øíñ" +Õ¹BÖ@þtöÀ$Ø2±" +]âBÖ@þ{· $×wN" åõBØ@þ‚h€$Ö¼J" nDBÖ@þ‰)`$ÖÉ"öçBØ@þê@$ÕG="ƒBØ@þ–› $Ô‹"BÖ@þ\$Ó»%"‚BØ@þ¤$Ò’."ÃõBØ @þªíà$Ѹ"ÃBÚ@þ±®À$ϵu"ïBØ@þ¸o $ÏYI"´BØ@þ¿0€$Ï“"Ù BØ@þÆ`$Ïj"¾¹BÚ@þÌÒ`$Î×ò"a>BÚ @þÓ“@$Î&÷"ïúBØ@þÚd $Ím¶"yjBÚ@þá5$Ì´Å"BÚ@þèà$Ì:"%BÚ@þîÖà$ËU¯""[BÚ @þõ§À$Ê­ç"¶úBÚ@þüx $Ê2"IBÚ@ÿY€$ÉS«"ÙcBÜ@ÿ +*€$È¥"i¬BÚ @ÿ `$Çöû!ÿôtBÜ@ÿÜ@$ÇIf!ÿEBÚ@ÿ½ $Æœ­!þ9/BÜ@ÿ%ž $Åðm!ý\µBÜ @ÿ,$ÅCð!üìBÜ@ÿ3_à$Ä–“!û¢BÜ@ÿ:@À$Ãéô!úÅBÜ@ÿA!À$Ã?Ž!ùêòBÜ @ÿH $˜0!ù¸BÜ@ÿNó€$Áñß!ø?ÖBÞ@ÿUÔ€$ÁJo!÷i„BÜ @ÿ\Å`$À¢À!ö’áBÞ@ÿc¦@$¿û¤!õ¼úBÜ@ÿj—@$¿U*!ôçäBÞ @ÿqˆ $¾¯E!ô‹BÞ@ÿxy$¾ Õ!ó?ÉBÞ@ÿj$½dÝ!òl BÞ @ÿ†Zà$¼À!ñšµÀ$§™!Ö†‚Bæ ABF@$§¸!ÕÌpBä AEÞÀ$¦v•!Õ©Bæ AIw $¥å”!ÔYBæAM $¥TÒ!ÓŸÅBæ AP¨ $¤Äß!Òç„Bæ AT@ $¤6!Ò0«Bæ AWÙ $£¨4!Ñ{$Bæ A[y $£Ÿ!ÐÅéBè A_$¢!!ÐÎBæAb²€$¡ÿå!Ï\Bè AfK$¡s2!ΧíBæ Aië€$ æð!ÍôfBè AmŒ$ [!ÍAcBè Aq,`$ŸÏò!ÌJBèAtÌà$ŸE=!ËÝ¿Bè Axm`$žºí!Ë,´Bè A| à$ž0³!Ê{ÆBè A¶`$¤Ç!ÉÈ­Bê AƒVà$¶!ÉÔBè A†ÿ`$œ‰Û!È^‰Bê AŠŸÀ$œn!Ç®¡BèAŽH@$›|C!ÇtBê A‘ðÀ$šûQ!Æ`gBê A•™@$šx +!Ÿ^Bê A™AÀ$™ñÎ!Å Bê Aœê@$™jw!Ä_QBê A ’À$˜ã„!ò”Bê A¤; $˜^ +!úBêA§ë $—Ú¿!Â_­Bì A«” $—Y!Á¹´Bê A¯D $–× !Á@Bì A²õ $–TX!ÀkõBì A¶¥ $•ÑÁ!¿ÄÎBì AºV $•OŸ!¿!‡‹CACª $S!‡CAG² $RY^!†Ÿ˜CAK» $Q¢`!†*{CAOÃÀ$Pëî!…µ·CASÌ@$P5ø!…ABCAWÜÀ$O€Ö!„ÍVCA[å@$NÌN!„YÌCA_õà$NG!ƒæ”CAcþ`$Mdè!ƒsÇCAhà$L±þ!ƒFCAl€$KÿÐ!‚=CAp0$KN^!‚­CAt@€$J›!¬ŒCAxQ$Ií7!;¨CA|i $I=k!€Ë&CA€z $HŽ !€ZöCA„’ $G߸!Ö®CAˆ£@$G1÷!~øFCAŒ»À$F„®!~yCAÔ@$Eײ!}= CA”ìà$E*!|^ÔCA™`$D|M!{€cCAà$CÍð!z¡3CA¡>€$Ct!y¿MCA¥W$Bo¶!xàéCA©w€$AÄ!xBCA­˜ $A!w-•CA±° $@xÜ!v]BCAµÑ@$?Øs!uïCA¹ñÀ$?6h!tÀ…CA¾@$>‘€!síqCAÂ:à$=ëŸ!sCAÆ[`$=F!rE"CAʃà$<¡!qqðCAΤ€$;üŸ!pŸƒCAÒÍ$;Y7!oÎ[CAÖõ $:¶j!nýøCAÛ $:!n.CAßF $9r0!m^öCAão@$8н!lNCAç—À$8/Ø!kÂ\CAëÈ`$7‘!jõ4CAïðà$6ïº!j(›CAô!`$6Pq!i\ºCAøR$5±˜!h‘fCAü‚€$5u!gÆûCA³ $4u¨!füÿCAã $3Ø!f3êCA @$3;ì!ekkCA DÀ$2 !d£ØCA}@$2t!cܽCA­à$1i‹!ctCAæ`$0Îù!bP›CA$04ì!a‹kCA"W€$/›}!`ÇCA& $/’!`JCA*È $.j!_@%CA/@$-Ò)!^}¥CA39À$-:€!]»„CA7z`$,£‚!\ú@CA;²à$, j!\:!CA?ó€$+w÷![zÕCAD4$*â²!Z»ÅCAHt $*Mü!YýlCALµ $)¹¥!Y?‹CAPõÀ$)%¸!X‚3CAU>@$(’s!WűC AY~à$'ÿž!W ÀCA]Ç`$'m!VN(C Ab$&Út!U’CAfP€$&G]!TÖ9C Aj™ $%´ª!TsC Aná $%"ö!S_óC As*@$$’›!R§,C AwrÀ$$ò!QñÙC A{Ã`$#wæ!Q=OC +A€ à$"éc!P†äC A„\€$"XA!OÍ C +Aˆ­ $!Ès!OC +AŒõ $!8_!N\¢C A‘F@$ ª»!M§UC +A•žÀ$ "!LøuC A™ï`$šc!LJ»C +Až?à$£!KœùC +A¢˜€$‰~!JímC A¦é$ÿö!J=dC +A«A $v¶!IµC A¯š@$í€!HÞC A³êÀ$d!H.ÉC +A¸K`$Û…!GbC A¼£à$R}!FÏûC AÀü€$Ä~!F:C AÅU $#½!ELwC Aɵ $€v!D{xC AÎ@$ õ!CæXC AÒnà$¨!CfkC AÖÏ`$.”!BÊûC AÛ0$«v!B#&C A߀$'Y!Az C Aãù $£¼!@Ñ”C AèYÀ$ v!@)ŒC Aìº@$O!?¬C Añ"à$Ó!>Ú¨C Aõ‹€$˜{!>3ÑC Aùô$¬!=…úC Aþ\ $j!<°ºC AÅ@$’!;œàC A-À$ò!:ÏbC A –`$Á£!:‘tC A$ƒÂ!:B@CAo€$!9µêC Aà $™è!9ëCAPÀ$ô!8u³CA!Á@$ž`!7ÔöCA&1à$!$!74©CA*¢€$¤w!6•CA/$(b!5ö?CA3‹ $ ¬X!5W{CA7ü@$ 0®!4¹1CA†CAdÊ $rv!.¦þCAiJÀ$ü¼!.LCAmË`$‡!-y°CArL$Ï!,âPCAvÌ€$˜g!,H2CA{U $š!+­‘CAÕÀ$«!+jCA„^`$7„!*„€CAˆæà$Ã!!)ï‡CAg€$L‘!)WÄCA‘ø $Õ°!(¿šCA–€À$[õ!(#ÉCA› `$ߪ!'„°CAŸ‘à$tÈ!&ûâCA¤"€$ê!&}TCA¨³ $¦v!%óÊCA­;À$6h!%d\CA±Ì`$Åî!$ÔcCA¶]$U²!$D»CAºõ€#ÿË©!#µ‹CA¿† #þìû!#'CAÄÀ#þÕ!"˜ÚCAȯ`#ý1q!" )CAÍ@#üTÓ!!}÷CAÑØ #ûxÆ! ñ"CAÖq #úR! d¯CAÛ À#ùÂÖ!ØÛCAߢ`#øé„!MÅCAäC#ø²!ÃCAèÛ #÷8W!8‰CAí|@#ö`ö!®²CAòà#õŠR!%SCAöµ€#ô´a!œgCAûV #óÞß!ÁCAÿö #ó +3!‹¦CA—@#ò6\!CA ?à#ñct!}CA à€#ðú!öbCA‰ #ï¿?!p(CA)À#îî!êOCAÒ`#î!eCA {#íN !àCA%# #ì@![®CA)Ô@#ë°²!×|CA.|à#êâ§!SžCA3%€#êO!Ð2CA7Ö#éHï!MfCA<† #è}U!ËCAA7@#ç³!IœCAEçà#æé¾!ÈËCAJ˜€#æ!>!HzCAOI #åY*!ÈmCASùÀ#ä‘ !HfCAX²`#ãÈ’!È CA]k#ãc!GíCAb #â9ž!È·CAfÔ@#ár±!IgCAkŒà#à®O!˸CApE€#ßì !ObCAu #ß*;!ÓXCAy¾À#Þi\!WéCA~`#ݨ]! ÜeCAƒ8#Üçb! `âCA‡ø #Ü&Ö! å¨CAŒ¹@#Ûfç! jÑCA‘yà#Ú§¥! ðiCA–:€#Ùé! vpCA› #Ù*Þ! +ü·CAŸÃÀ#ØkÄ! +‚iCA¤Œ`#תÄ! +äCA©U #Öì´! @CA®À#Ö/Ø! aCA²Þ`#Õpð!š3CA·¯#Ô¸[!$CA¼w #Ô!¯jCAÁ@@#ÓLˆ!;8CAÆà#Ò˜Z!ÇèCAÊÙ€#Ñâ=!SZCAϪ #Ñ+n!Þ[CAÔzÀ#Ðu%!i±CAÙK`#Ï¿^!õZCAÞ#Ï ž! CAâô #ÎS6! KCAçÅ`#Ížp!˜™CAìž#ÌìÆ!&åCAñn #Ì;“!µ}CAöG@#ˉí!CËCAûà#ÊØˆ!ÒCCAÿø€#Ê'ª!aCAÙ #Éwc!ð?CA ±À#ÈǼ!ÔCA’€#È¡!ÃCAk #ÇiÚ ÿ?ÏCAKÀ#Æ» þ`CA,`#Æ N ý«CA" #Åa# ü¥KCA&í #ĵO ûÉZCA+Ö`#ľ úìwCA0·#Ã\ˆ ú +CA5Ÿ #Â²Û ù6ÚCA:€@# +ž ø_‚CA?hà#Áa¡ ÷‡4CADQ€#À¸v ö®«CAI:@#À< õ×WCAN*à#¿h| õžCAS€#¾Áz ô*ÚCAX #¾Ž óVwCA\ìÀ#½v2 ò‚ÏCAaÝ€#¼ÑŒ ñ°CAfÎ #¼-6 ðݶCAk¾À#»‰ ð £CAp¯`#ºå‚ ï:?CAu¨ #ºB“ îi±CAz˜À#¹ 5 í™ÜCA‘`#¸þ) ìÊrCA„Š#¸[ë ëúÆCA‰zÀ#·º ë+†CAŽ{`#· ê^)C A“t#¶xà éUCA˜l #µØ= èÂÝCAm`#µ:* çøˆC A¢f#´ ç/dCA§f #³ÿg æe¢C A¬g@#³_¥ å™$C A±h#²º äÅ#C A¶h #² ó ãèåC A»i@#±rR ã!±C AÀr#°é[ âr`C!AÅr #°Z á»C AÊ{@#¯Â¾ àùEC!AÏ„#¯)à à5uC!AÔŒ #®‘ ßqëC!AÙ•@#­ø² Þ®øC!AÞž#­`ø ÝìÂC!A㦠#¬É¿ Ý+2C!Aè·@#¬2. Üi0C"AíÈ#«™% Û¥NC"AòР#«> ÚâÞC!A÷á@#ªjÅ Ú"CC"Aüò#©Ñ« Ù^LC"A + #©<ÿ ØŸþC#A@#¨­J ×è C"A 4#¨ã ×-ïC#AD #§‹Q ÖtâC"A]`#¦ü Õ½‚C#Av#¦k® ÕµC#A Ž #¥Úq ÔJÍC#A%§`#¥GÍ ÓC#A*È#¤³· ÒÑC$A/àÀ#¤"Õ ÒC#A5`#£’Ü Ñ_ÒC$A:#¢û ГC#A?:À#¢Le ϽñC$AD[`#¡Œ ÎǺC$AI„ #¡ I Î%|C%AN¤À# ºH Í»=C$ASÅ€# F4 Í&©C$AXî #Ÿ½¯ ÌwéC%A^À#Ÿ2› ËÅåC%Ac?€#ž§Ö ËEC%Ahh #ž~ Êc0C%Amà#“– ɲ«C%Ar¹€# + ɦC%Awê@#œ€Â ÈRäC&A}à#›÷å Ç£µC%A‚C #›oÇ ÆõzC&A‡t@#šçû ÆG§C&AŒ¥#š`§ ÅšoC&A‘Õ #™Ú$ ÄîCC&A—`#™T ÄB²C'Aœ?#˜Îž ×ÔC&A¡wÀ#˜I Âí–C'A¦¨`#—ÄÝ ÂCªC&A«á #—@p Áš)C'A±À#–¼q Àñ4C'A¶Z€#–8ã ÀHÑC(A»“ #•µÍ ¿¡C'AÀËà#•3/ ¾ùÕC'AÆ €#”± ¾SAC(AËM@#”/G ½­'C(AÐà#“­æ ½ŒC(AÕΠ#“,Ñ ¼bSC(AÛ`#’«Ñ »½4C(AàP#’+ »iC(Aå˜À#‘«† ºu&C)AêÙ`#‘,+ ¹Ò"C(Að" #­ ¹/bC)AõjÀ#.î ¸þC)Aú³€#±j ·íTC)A@#4d ·MLC*ALà#ޏF ¶®nC)A +• #ŽŠ ‰ÉC6A Ø‚ #UƒŠ ˆ¦C6A Þ3`#TÉ ˆ.¿C6A ãì #T9 ‡·ÒC7A é¤à#SV ‡AIC7A ïU #RN †ËC6A õ€#Qå6 †UAC7A úÏ@#Q-å …ßïC8A +ˆ#Pw4 …kC7A +@À#OÁ „ötC7A + €#O ¢ „‚SC8A +Â@#NVÊ „–C8A +ƒ#M¢l ƒ›&C8A +CÀ#LíÜ ƒ'—C8A +#€#L85 ‚³UC8A +(Í@#K„s ‚@JC9A +.Ž#JÓJ ÎèC8A +4VÀ#J!` ] +C9A +: #IqÌ €ì¬C9A +?è`#HÂS €|^C9A +E± #Hp € )C9A +Kà#GbM 6%C:A +QJ #F´Â ~XC9A +W`#F Þ }}EC:A +\ì #E^ü |¢ŠC:A +b½#D³ {Æ‚C:A +hÀ#DJ zêœC:A +nf€#C\ z_C;A +t7@#B°ø y4pC:A +z#B xYªC;A +èÀ#A\" w€+C;A +…Á #@³” v¨kC;A +‹š`#@ ž uÑnC;A +‘s #?d túýC;A +—Sà#>¼è t%C<A +, #>@ sO­C;A +£ €#=p. r{C<A +¨î@#<Êæ q§ŒC<A +®Ï#<&A pÔÎC<A +´·À#;‚ p C=A +º˜€#:ÞA o0÷C<A +À`#:; n`C=A +Æb #9˜I m¹C<A +ÌJà#8ö& lÀ0C=A +Ò; #8TŠ kñUC>A +Ø$€#7³ k#1C=A +Þ @#7î jU«C=A +ãþ#6ró iˆåC>A +éîà#5Ó‹ h¼ÛC>A +ïß #54° gñ…C>A +õÐ`#4–j g&îC>A +ûÁ #3ø¥ f\üC>A ²#3[- e“lC>A ªÀ#2¼[ dÈ#C?A £€#2· c÷ôC?A œ`#1y– c*ýC?A • #0áÿ bhôC?A à#0Lô aª.C?A %†À#/¶ `éC?A +‡€#/ö `%C@A 1ˆ@#.‚Š __iC@A 7‰ #-äÏ ^•ƒC@A =‰à#-8å ]¹wC@A CŠ #,¶ \ÎýC@A I‹€#+î¥ \¿C@A O”@#+yõ [}bCAA U#*ô« ZÒÆCAA [à#*aõ ZüC@A a¦ #)Í\ YXÈCAA g·€#)9‘ X››CBA mÀ@#(¦y WßSCAA sÑ#(X W"ÿCBA yÙà#'€} VgCAA ê #&î U«¤CBA …û€#&\6 TðéCBA Œ@#%ÊÆ T6¿CCA ’%#%9è S}RCBA ˜=à#$©z RÄrCCA žN #$w R CBA ¤g€##Š QT‡CCA ª€@#"û P”CCA °¡ #"l± OçICDA ¶¹à#!Þà O1žCCA ¼ÚÀ#!QH N|…CDA Âó€# Ä7 MÇôCCA É`# 7³ MCDA Ï5 #«º L`íCDA Õ]à# C K®jCEA Û~À#•> JüxCDA á§€# +¥ JKCEA çÈ`#€ Iš{à# @)CGA D´ #žµ ?ƒwCGA Jõ€#L >܉CHA Q.@#˜1 >3rCGA Wo #ô =‹uCHA ]°#“m <åªCHA cðÀ#* dCKA Ï/# +Ç + 1¢œCKA Õ‡À# +M· 1QCKA Ûè # ÔÆ 0l‚CLA âA€# \3 /Ò-CKA è¢`#ä /8qCLA ï #ld .Ÿ8CLA õd#ôú ._CLA ûÌà#}Ô -mÜCMA -À#T ,Ö-CLA –€#‘y ,?RCMA ÿ`#Æ +¨«CMA h@#¥þ +éCMA Ñ #/ *yÃCMA "B#·ã )á"CNA (ªÀ#D‰ )M|CMA / #Óã (½KCNA 5Œ€#b (+›CNA ;ý`#ïw '˜ëCNA Bn@#|Û '6CNA Hç# +N &s—COA O_à#˜$ %ávCOA UÐÀ#&ó %P”CNA \I #µí $¿èCOA bÊ€#E $0CPA iC`"ÿ«Æ #¡"COA oÄ@"þÌz #9CPA v="ýìÑ "ƒCOA |½à"ý ô !ôsCPA ƒ>À"ü0w !f²CPA ‰Ç "ûT Ù§CQA H€"úy MuCPA –Ñ`"ùž§ Á²CQA R@"øÄa 6CPA £Û "÷êæ ªÑCQA ªl"÷;  &CRA °ôÀ"ö:$ •ÙCQA ·} "õb¥  îCQA ¾€"ôŒ ‚˜CRA ÄŸ`"ó¶ ù«CRA Ë0@"òàÿ qGCRA ÑÁ "ò ¹ élCRA ØZ"ñ9 aëCSA Þêà"ðeò ÚØCRA åƒÀ"ï“( SðCSA ì "îÀ} ÍCSA òµ€"íïd GJCSA ùV`"í v ÂÛCTA ÿï@"ìQ >CSA "ëƒ ºNCTA 1"ê´û 6cCTAÑà"éç¦ ²úCTArÀ"é 0 +CTA! "èO= ­—CUA'¼€"ç„ +“CTA.e`"æ¹v ©åCUA5@"åï­ (ÀCUA;· "å&Ž ¨ CUABh"ä^ 'µCVAIà"ã–? §ÖCUAOÁÀ"âÏ% (iCVAVr "â¿ ©pCVA]# "áC *çCV AcÔ€"à~ ¬ÍCVAj`"ß¹– /CWAq>@"ÞõÑ ±ÍCVAw÷ "Þ2² 4ìCWA~°"Ýp ¸VCWA…hà"Ü­C ;°CWAŒ)À"Ûéö ¾²CXA’â "Û(@ B¸CWA™£ "ÚiM ȃCX A d€"Ùª, N1CXA§%`"Øìº +ÔñCXA­æ@"Ø1 +\ÔCXA´¯ "×to äCYA»x"Ö·” k@CYAÂ@à"Õú) òCYAÉ à"Õ<¶ xÆCY AÏÒÀ"Ô€í —CYAÖ› "ÓÇ ‰CYAÝl€"Ó| ÊCZAä=`"ÒZ  CZAë`"Ñ¢ *™CZ Añß@"Ðë; µDCZAø° "Ð4g @ACZAÿ‰"Ï~J Ë´C[Ab"Îȯ WzC[ A :à"ÎÒ ã¹C[AÀ"Í_^ põyéC_A¥O"¿bô£ C_ A¬Oà"¾wÕóÌ•C`A³HÀ"½Ð òõìC_AºIÀ"½(Ÿò„C` AÁJ "¼ƒ—ñLEC`AÈK "»ßNðyýC` AÏL€"»;#ï§ÛC`AÖU`"º—PîÖ)CaAÝV`"¹óçîÿC` Aä_@"¹Qší5@CaAëh@"¸¯ïìfQCa Aòy "¸wë—¢CbAù‚ "·mgêÉyCa AI€"¶Ì{éûCbAÎ"¶+Úé-ãCa AZ€"µŒèalCc A +âà"´íç•æCbAk`"´OæËCb A÷à"³±ÄæBCc A„`"³»å9ACc AÀ"²x)äp×CcA@"±Ûôã¨æCc A )À"±@câáÆCc A#º@"°¥6â&Cd A'J "° +›áUACdA*Û "¯pXàÍCd A.k "®ÖaßʺCd A1ü "®<ïßQCd A5€"­¤·ÞCyCeA9%"­ 3݈Ce A<¹€"¬uÇÜ¿·Ce A@N"«ÞÑÛþ{Ce ACâ€"«HXÛ=áCe AGzà"ª²dÚ}ñCfAK`"ªòÙ¾¦Ce AN§à"©ˆÙCf ARD`"¨ó®ØB%Cg AUÜà"¨_ÅׄÒCf AYu@"§ÌJÖÈ CfA]À"§9WÖ ôCg A`®@"¦¦ðÕPCg AdJÀ"¦Ô•ãCg Agë@"¥ƒ¥ÓÛ´Ch Ak‡ "¤òÃÓ"ACgAo( "¤bZÒihCh ArÈ "£Ònѱ1Ch Avi "£BøÐùCh Az  "¢´ +ÐB›Ch A}® "¢% ÏŒRCi AR "¡—©ÎÖ›Ci A„÷"¡ +'Î!yCiAˆ›€" }ÍlÔCi AŒ@"ŸðW̸ÁCi Aè€"ŸdHÌ{Cj A“‘"žØ³ËRÑCj A—9€"žMŸÊ ËCj Ašâ"ÃÉïuCj AžŠ`"9É>ËCjA¢6à"œ¯mÈŽ Ck A¥ß`"œ&HÇßCj A©‹à"›|Ç/ûCk A­<`"›ÆPCl A°èà"šŒéÅÓCk A´•`"š¹Å$ÃCk A¸Eà"™|ÄÄv½Cl A»ö`"˜ö¦ÃËCl A¿¦À"˜pëÃåClAÃ[@"—ë*Ât±Cm AÇ À"—g@ÁËÖCl AÊÀ@"–ãÁ#FCm AÎtÀ"–_ƒÀzACm AÒ)@"•ÛӿѲCm AÕáÀ"•XŽ¿)«Cn AÙ–@"”Õ–¾‚Cm AÝNÀ"”Rr½Ú+Cn Aá@"“Ï ½1üCn AäÃÀ"“L/¼ŠyCo Aè|@"’ÊØ»äëCn Aì8À"’Jû@ùCo Aïñ@"‘Æ•º—ÉCn Aó± "‘4\¹ÜžCpA÷n "•6¹éCo Aû* "3¸r-Co Aþë "¾"·ýœCp A« "Q•·rªCp Al "ŽÖž¶ÕECp A +, "ŽY¦¶5OCp A ñ "ݵ•ÊCq A± "`Æ´öÀCp Av "Œä÷´XFCq A: "Œiˆ³ºHCq A "‹î¢³øCr A Ç "‹t ²€Cq A$ "Šùô±ãÇCr A(X "Š€#±GÛCr A,! "ŠÑ°¬‘Cr A/í "‰÷°àCs A3¶ "‰o¯w˜Cr A7‚ "ˆ_®ÝêCs A;O "ˆ%¯®D·Cs A? "‡®t­¬Cs ABì "‡7|­ÒCt AF¸ "†Á'¬|ZCs AJ‰ "†K«å8Cu AlýÀ"‚5ø¦«zCv ApÖ@"ĦµCv At®À"R¨¥ˆ„Cv Ax‹@"€áE¤÷cCw A|cÀ"€o‹¤eÑCv A€@@"üð£ÕCw A„À"R£F›Cw A‡ù@"~@F¢¸Cw A‹ÙÀ"}a{¢)èCx A¶@"|ð¡š×Cw A“–à"{ N¡ +oCx(A—w`"z»ñ xHCx A›Wà"yßzŸë/Cx AŸ<`"y ŸdCy A£ à"x8žÜ8Cy A§`"w_êžQÝCy Aªéà"v‡ÇCy A®Î`"u¯<áCy A²¶à"t×Òœ³Cz A¶›€"t>œ)ÁCy(Aº„"s+Y› ÜCz A¾p€"rV¢›¹C{ AÂY"q‚0šÂCz AÆE€"p® š \C{ AÊ2"oÛЙ‚pC{ A΀"o †˜ûÚC{ AÒ "n7ܘu«C{(AÕû "mgW—ð8C| AÙè "l—[—kC{ AÝØ "kÈ–ækC| AáÉ "jù›–bNC| Aå½ "j+•ÞnC} Aé®@"i^N•[C|(Aí¢À"h’”ØSC} Añ—@"gÆ ”UÈC} AõÀ"fú÷“ÓÑC~ Aù„@"f0”“RJC} Aý|à"efì’Ñ:C~(Au`"då’P’C~ Amà"cÕ‘Ð[C~ A f`"c È‘P€C~ A bà"bEƒÐTC A[€"az˜NvC~(A\"`±øÎC€AX€"_ðêRC AU"_0Ž×oC A!U€"^m¶ŽZ²C€A%V "]ªÊÝòC€A)V "\èŽa¢C€A-W "\$âŒägC€A1[ "[Y5Œb C€A5`@"Zƒù‹Ù•C€”A9dÀ"YÃe‹^UC€A=i@"YnŠñŽC€AAmÀ"Xg +ŠbC€AEv`"W«EŠ6CAI~à"Ví‰ÃCAM‡`"V.¬‰¡CAQà"UpŠˆ™òCAUœ€"T¶ßˆ#C”AY¥"SÿX‡­©CA]±€"SFÕ‡7’CAa "R½†ÁC‚AeΠ"QÕ[†KCAiß "Qh…ÕaC‚Amï "Peù…_ûC‚Ar@"O¯9„ëC‚AvÀ"Nøx„vC‚Az%@"NAÌ„&C‚A~5à"MŒÙƒWC‚A‚N`"LØñƒ4CƒA†bà"L$ø‚§C‚AŠw€"KrÒ‚5C‚”AŽ"JÁÃCƒA’¨€"JQíCƒA–Á "I^µ€àsCƒAšÙ "H®2€o|CƒAžö "GþMýÓCƒA£À"GOƒCƒ”A§/@"F |~>CƒA«KÀ"Eò;}_CƒA¯l`"ED‡|€¬C„A³ˆà"D–’{¢CƒA·©`"Cé%zÄC„A»Ê"C=VyèC„A¿î€"B’ky VC„AÄ "Aèìx4aC„AÈ3 "A?£w[²C„AÌX "@–Qv‚÷C„AЀÀ"?í‡uªéC…AÔ¥@"?E&tÓcC„AØÍà">dsü©C…AÜö`"=öFs&ÀC…Aáà"=O½rQ•C…AåK€"<©¥q|üC…”Aét"<8p©=C…Aí  ";_VoÖ0C…”AñÑ ":»Eo0C†Aõý ":mn2vC…Aú.@"9tIma¤C†AþZÀ"8Ñžl‘nC…A‹`"8/¤kÂC†A¿à"7ŽjóKC†A +ð€"6í%j%MC†A%"6LºiWøC†AY€"5¬Îh‹EC†AŽ "5 jg¿?C†”AÆ "4n¹fô C‡Aû@"3Ðff)wC†”A$3À"32Îe_ÀC‡A(p`"2•¯d–¢C‡”A,¨à"1ùcÎ)C‡A0å€"1\ècGC‡”A5"0Á b>ÈC‡A9^ "0%ØaxCˆA=› "/‹z`²ˆC‡AA×À".ñj_íTC‡”AF@".X _)CˆAJXà"-¿‰^eÎCˆAN`"-'Q]¢öCˆARÞ",{\àCˆAW"€"+ø#\åCˆA[g "+aS[]ÚCˆ”A_« "*ËZuCˆAcð@"*57YݶCˆ”Ah8À")ŸîY¡C‰Al`") )X`5C‰ApÉà"(vÛW¢_C‰Au€"'âÞVäóC‰” \ No newline at end of file diff --git a/tests/data/cache/astropy/download/url/2c303169e6bbbb2b9c683391733d2931/url b/tests/data/cache/astropy/download/url/2c303169e6bbbb2b9c683391733d2931/url new file mode 100644 index 000000000..8c1cb9c91 --- /dev/null +++ b/tests/data/cache/astropy/download/url/2c303169e6bbbb2b9c683391733d2931/url @@ -0,0 +1 @@ +https://archive.stsci.edu/hlsps/reference-atlases/cdbs/calspec/hd111980_stis_006.fits \ No newline at end of file From 97865648e6629d5508c2de207db5dcfccef0a17a Mon Sep 17 00:00:00 2001 From: Eli Rykoff Date: Sun, 14 Apr 2024 21:10:40 -0700 Subject: [PATCH 110/161] Fix scipy.signal.windows.gaussian import --- spectractor/simulation/image_simulation.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index 8db114bfe..f79c57cf9 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -15,7 +15,8 @@ import astropy.units as units from astropy.coordinates import SkyCoord from astropy.table import Table -from scipy.signal import fftconvolve, gaussian +from scipy.signal import fftconvolve +from scipy.signal.windows import gaussian import matplotlib.pyplot as plt from matplotlib.ticker import MaxNLocator import numpy as np From e66283695ccd81dc713e8e540d2f32c2dc72c491 Mon Sep 17 00:00:00 2001 From: Eli Rykoff Date: Sun, 14 Apr 2024 21:14:09 -0700 Subject: [PATCH 111/161] Fix deprecation warning for use_gaussian_derivatives. --- spectractor/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/tools.py b/spectractor/tools.py index d3b89ccb8..957b36097 100644 --- a/spectractor/tools.py +++ b/spectractor/tools.py @@ -1456,7 +1456,7 @@ def hessian_and_theta(data, margin_cut=1): # compute hessian matrices on the image order = "xy" if _SCIKIT_IMAGE_NEW_HESSIAN else "rc" - Hxx, Hxy, Hyy = hessian_matrix(data, sigma=3, order=order) + Hxx, Hxy, Hyy = hessian_matrix(data, sigma=3, order=order, use_gaussian_derivatives=False) lambda_plus = 0.5 * ((Hxx + Hyy) + np.sqrt((Hxx - Hyy) ** 2 + 4 * Hxy * Hxy)) lambda_minus = 0.5 * ((Hxx + Hyy) - np.sqrt((Hxx - Hyy) ** 2 + 4 * Hxy * Hxy)) theta = 0.5 * np.arctan2(2 * Hxy, Hxx - Hyy) * 180 / np.pi From 624f189501a870e127588d9925b269c835a57f31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 15 Apr 2024 09:41:17 +0000 Subject: [PATCH 112/161] pin pytest version <8.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e7ba982ac..c79c6959c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,7 +18,7 @@ configparser coveralls deprecated pyyaml -pytest +pytest<8.1 pytest-cov getCalspec>=2.0.0 lsst_utils From 8d72713847c05e1257b3c1495dd00a39e5f65601 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 15 Apr 2024 09:46:36 +0000 Subject: [PATCH 113/161] pin version of pytest<8.1 --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c61133373..a13a36ce3 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -26,7 +26,7 @@ jobs: # Might be quicker to install rubin-env plus any necessary additions. shell: bash -l {0} run: | - mamba install -y "numpy>1.15" scipy "matplotlib>3.1" pandas llvmlite numba "astropy>=3.2" "photutils>=1.7" astroquery coloredlogs scikit-image>=0.20 h5py emcee tqdm mpi4py schwimmbad "iminuit>=2" "coverage>=3.6" configparser coveralls deprecated pyyaml pytest pytest-cov rubin-libradtran "getCalspec>=2.0.0" + mamba install -y "numpy>1.15" scipy "matplotlib>3.1" pandas llvmlite numba "astropy>=3.2" "photutils>=1.7" astroquery coloredlogs scikit-image>=0.20 h5py emcee tqdm mpi4py schwimmbad "iminuit>=2" "coverage>=3.6" configparser coveralls deprecated pyyaml "pytest<8.1" pytest-cov rubin-libradtran "getCalspec>=2.0.0" # python -c "from getCalspec.rebuild import rebuild_tables; rebuild_tables()" pip install lsst.utils pip install git+https://github.com/LSSTDESC/getObsAtmo.git@main From cea30f10ad84a4a2285f79cba48acee9fdf11b8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 15 Apr 2024 09:53:26 +0000 Subject: [PATCH 114/161] pin version pytest=8.0.0 --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index a13a36ce3..bc87c0a88 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -26,7 +26,7 @@ jobs: # Might be quicker to install rubin-env plus any necessary additions. shell: bash -l {0} run: | - mamba install -y "numpy>1.15" scipy "matplotlib>3.1" pandas llvmlite numba "astropy>=3.2" "photutils>=1.7" astroquery coloredlogs scikit-image>=0.20 h5py emcee tqdm mpi4py schwimmbad "iminuit>=2" "coverage>=3.6" configparser coveralls deprecated pyyaml "pytest<8.1" pytest-cov rubin-libradtran "getCalspec>=2.0.0" + mamba install -y "numpy>1.15" scipy "matplotlib>3.1" pandas llvmlite numba "astropy>=3.2" "photutils>=1.7" astroquery coloredlogs scikit-image>=0.20 h5py emcee tqdm mpi4py schwimmbad "iminuit>=2" "coverage>=3.6" configparser coveralls deprecated pyyaml "pytest==8.0.0" pytest-cov rubin-libradtran "getCalspec>=2.0.0" # python -c "from getCalspec.rebuild import rebuild_tables; rebuild_tables()" pip install lsst.utils pip install git+https://github.com/LSSTDESC/getObsAtmo.git@main From be71913a28d40fcc2c6205a2ad00a174f8f319b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 15 Apr 2024 14:13:52 +0200 Subject: [PATCH 115/161] psf_fit_reg_param = 1 --- config/stardice.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/stardice.ini b/config/stardice.ini index de9db7f57..8d887b7dd 100644 --- a/config/stardice.ini +++ b/config/stardice.ini @@ -110,7 +110,7 @@ PSF_TYPE = Moffat # the order of the polynomials to model wavelength dependence of the PSF shape parameters PSF_POLY_ORDER = 2 # regularisation parameter for the chisq minimisation to extract the spectrum -PSF_FIT_REG_PARAM = 0.1 +PSF_FIT_REG_PARAM = 1 # step size in pixels for the first transverse PSF1D fit PSF_PIXEL_STEP_TRANSVERSE_FIT = 1 # PSF is not evaluated outside a region larger than max(PIXWIDTH_SIGNAL, PSF_FWHM_CLIP*fwhm) pixels From efa12f76797fbaeb893c814a4cf7907e5e5a5499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 15 Apr 2024 14:14:06 +0200 Subject: [PATCH 116/161] SPECTRACTOR_SIMULATE_STARFIELD = False --- config/stardice.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/stardice.ini b/config/stardice.ini index 8d887b7dd..0c62378a2 100644 --- a/config/stardice.ini +++ b/config/stardice.ini @@ -19,6 +19,8 @@ SPECTRACTOR_DECONVOLUTION_FFM = True SPECTRACTOR_DECONVOLUTION_SIGMA_CLIP = 100 # library to compute atmospheric transmission: none, libradtran, getobsatmo SPECTRACTOR_ATMOSPHERE_SIM = getobsatmo +# simulate star field with Gaia catalog: False, True +SPECTRACTOR_SIMULATE_STARFIELD = False [instrument] # instrument name From 5c5f03df5077dd5d8e419f669d0f6a5cdd689d68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 15 Apr 2024 14:15:59 +0200 Subject: [PATCH 117/161] plot spectrum at the end of psf1d --- spectractor/extractor/extractor.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 1eaddd7f9..4a508046f 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1532,6 +1532,8 @@ def bgd_model_func(x, y): plt.show() if parameters.LSST_SAVEFIGPATH: fig.savefig(os.path.join(parameters.LSST_SAVEFIGPATH, 'intermediate_spectrum.pdf')) + if parameters.DEBUG: + spectrum.plot_spectrum() return w, bgd_model_func From 4621f97ea7db54311f46db691186d7fada08748c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 7 Aug 2024 21:39:08 +0200 Subject: [PATCH 118/161] save trials to improve stardice reduction months after I have written them... not sure if they are relevant. --- spectractor/extractor/extractor.py | 10 ++++++++++ spectractor/extractor/spectrum.py | 5 ++++- spectractor/extractor/targets.py | 3 +++ spectractor/fit/fit_spectrum.py | 1 + spectractor/simulation/image_simulation.py | 3 ++- 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 4a508046f..3eecc11be 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -450,6 +450,7 @@ def simulate(self, *params): self.lambdas = self.spectrum.compute_lambdas_in_spectrogram(D2CCD, dx0, dy0, angle, niter=5, with_adr=True, order=self.diffraction_orders[0]) M = None + # distance = None for k, order in enumerate(self.diffraction_orders): if self.tr[k] is None or self.params[f"A{order}"] == 0: # diffraction order undefined self.psf_profile_params[order] = None @@ -470,6 +471,15 @@ def simulate(self, *params): self.psf_profile_params[order][:, 1] = dispersion_law.real + self.spectrum.spectrogram_x0 self.psf_profile_params[order][:, 2] += dispersion_law.imag - self.bgd_width + # if k == 0: + # distance = np.abs(dispersion_law) + # else: + # distance_order = np.abs(dispersion_law) + # for p in range(3, self.psf_profile_params[order].shape[1]): + # self.psf_profile_params[order][:, p] = np.copy(self.psf_profile_params[self.spectrum.order][:, p]) + # self.psf_profile_params[order][:, p] = interpolate.interp1d(distance, self.psf_profile_params[order][:, p], + # kind="cubic", fill_value="extrapolate")(distance_order) + # Matrix filling M_order = self.spectrum.chromatic_psf.build_sparse_M(self.pixels, self.psf_profile_params[order], dtype="float32", M_sparse_indices=self.M_sparse_indices[order], diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index ca0d1c1fe..7a3c15d86 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -691,7 +691,10 @@ def save_spectrum(self, output_file_name, overwrite=False): if extname == "SPEC_COV": hdus[extname].data = self.cov_matrix elif extname == "ORDER2": - hdus[extname].data = [self.lambdas, self.data_next_order, self.err_next_order] + if self.data_next_order is not None: + hdus[extname].data = [self.lambdas, self.data_next_order, self.err_next_order] + else: + hdus[extname].data = [self.lambdas, np.zeros_like(self.lambdas), np.zeros_like(self.lambdas)] elif extname == "ORDER0": hdus[extname].data = self.target.image hdus[extname].header["IM_X0"] = self.target.image_x0 diff --git a/spectractor/extractor/targets.py b/spectractor/extractor/targets.py index 589b258eb..6a29e8cd0 100644 --- a/spectractor/extractor/targets.py +++ b/spectractor/extractor/targets.py @@ -231,6 +231,9 @@ def __init__(self, label, verbose=False): """ Target.__init__(self, label, verbose=verbose) self.my_logger = set_logger(self.__class__.__name__) + self.lines = Lines(HYDROGEN_LINES + ATMOSPHERIC_LINES + STELLAR_LINES, + redshift=self.redshift, emission_spectrum=self.emission_spectrum, + hydrogen_only=self.hydrogen_only) self.simbad_table = None self.load() diff --git a/spectractor/fit/fit_spectrum.py b/spectractor/fit/fit_spectrum.py index 4bc6be3ca..595fdd8af 100644 --- a/spectractor/fit/fit_spectrum.py +++ b/spectractor/fit/fit_spectrum.py @@ -63,6 +63,7 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, p = np.array([1, 0, 0.05, 1.2, 400, 5, 1, self.spectrum.header['D2CCD'], self.spectrum.header['PIXSHIFT'], 0]) fixed = [False] * p.size # fixed[0] = True + # TODO: StarDICE data for HD93521 clearly needs to fit A2 and shift_x => find a better way to decontaminate from order 2 fixed[1] = "A2_T" not in self.spectrum.header # fit A2 only on sims to evaluate extraction biases fixed[5] = False # fixed[6:8] = [True, True] diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index 2066b146c..dcdf1f5fd 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -15,7 +15,8 @@ import astropy.units as units from astropy.coordinates import SkyCoord from astropy.table import Table -from scipy.signal import fftconvolve, gaussian +from scipy.signal import fftconvolve +from scipy.signal.windows import gaussian import matplotlib.pyplot as plt from matplotlib.ticker import MaxNLocator import numpy as np From 7231206e30db2443da67c83499a251dc865775fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 8 Aug 2024 03:33:31 +0200 Subject: [PATCH 119/161] default pst poly type to polynomial --- config/default.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/default.ini b/config/default.ini index 6db0988f9..6f34a1a89 100644 --- a/config/default.ini +++ b/config/default.ini @@ -122,7 +122,7 @@ PSF_POLY_ORDER = 2 # regularisation parameter for the chisq minimisation to extract the spectrum PSF_FIT_REG_PARAM = 0.01 # polynomial type: must be polynomial or legendre -PSF_POLY_TYPE = "polynomial" +PSF_POLY_TYPE = polynomial [detection line algorithm parameters] # order of the background polynome to fit From 43870ac77817919f168f4a8c7c72ea0af12a1250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 8 Aug 2024 03:34:08 +0200 Subject: [PATCH 120/161] repair fit_spectrum.plot_fit concerning outliers --- spectractor/fit/fit_spectrum.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/spectractor/fit/fit_spectrum.py b/spectractor/fit/fit_spectrum.py index 4bc6be3ca..d6e5feade 100644 --- a/spectractor/fit/fit_spectrum.py +++ b/spectractor/fit/fit_spectrum.py @@ -145,8 +145,15 @@ def plot_spectrum_comparison_simple(self, ax, title='', extent=None, size=0.4): sub = np.where((lambdas > parameters.LAMBDA_MIN) & (lambdas < parameters.LAMBDA_MAX)) if extent is not None: sub = np.where((lambdas > extent[0]) & (lambdas < extent[1])) + bad_indices = None + if len(self.outliers) > 0 or len(self.mask) > 0: + bad_indices = np.array(list(self.get_bad_indices()) + list(self.mask)).astype(int) + plot_spectrum_simple(ax, lambdas=lambdas, data=self.data, data_err=self.err, units=self.spectrum.units) + if bad_indices is not None: + plot_spectrum_simple(ax, lambdas=lambdas[bad_indices], data=self.data[bad_indices], data_err=self.err[bad_indices], + units=self.spectrum.units, color='gray') p0 = ax.plot(lambdas, self.model, label='model') ax.fill_between(lambdas, self.model - self.model_err, self.model + self.model_err, alpha=0.3, color=p0[0].get_color()) @@ -168,7 +175,7 @@ def plot_spectrum_comparison_simple(self, ax, title='', extent=None, size=0.4): ax2.axhline(0, color=p0[0].get_color()) ax2.grid(True) ylim = ax2.get_ylim() - residuals_model = self.model_err[sub][idx] / self.err[sub][idx] + residuals_model = self.model_err[sub][idx] / norm ax2.fill_between(lambdas[sub][idx], -residuals_model, residuals_model, alpha=0.3, color=p0[0].get_color()) std = np.nanstd(residuals) # max(np.std(residuals), np.std(residuals_model)) ax2.set_ylim(-5*std, 5*std) From 8df4e4b4d00c096de76bc70a56b35101abadc51c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 8 Aug 2024 03:34:42 +0200 Subject: [PATCH 121/161] include model err for outlier sigma clipping --- spectractor/fit/fitter.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spectractor/fit/fitter.py b/spectractor/fit/fitter.py index 5c156fe0c..307852702 100644 --- a/spectractor/fit/fitter.py +++ b/spectractor/fit/fitter.py @@ -1658,12 +1658,14 @@ def run_minimisation_sigma_clipping(fit_workspace, method="newton", epsilon=None data = np.concatenate(fit_workspace.data).ravel() # [indices_no_nan] model = np.concatenate(fit_workspace.model).ravel() # [indices_no_nan] err = np.concatenate(fit_workspace.err).ravel() # [indices_no_nan] + model_err = np.concatenate(fit_workspace.model_err).ravel() # [indices_no_nan] else: # indices_no_nan = ~np.isnan(fit_workspace.data.flatten()) data = fit_workspace.data.flatten() # [indices_no_nan] model = fit_workspace.model.flatten() # [indices_no_nan] err = fit_workspace.err.flatten() # [indices_no_nan] - residuals = np.abs(data - model) / err + model_err = fit_workspace.model_err.flatten() # [indices_no_nan] + residuals = np.abs(data - model) / np.sqrt(err**2 + model_err**2) outliers = residuals > sigma_clip outliers = [i for i in range(data.size) if outliers[i]] outliers.sort() From 030f0240ae4ac10af1cce235eb22f5a7edb5766f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 8 Aug 2024 03:43:54 +0200 Subject: [PATCH 122/161] use integrate.simpson instead of simps (deprecated) --- spectractor/extractor/spectrum.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index ca0d1c1fe..cf9cce046 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -1813,8 +1813,8 @@ def detect_lines(lines, lambdas, spec, spec_err=None, cov_matrix=None, fwhm_func Y = -Gauss / Continuum Ydata = 1 - spectr_data / Continuum - line.fit_eqwidth_mod = integrate.simps(Y, x_int) # sol1 - line.fit_eqwidth_data = integrate.simps(Ydata, x_int) # sol2 + line.fit_eqwidth_mod = integrate.simpson(Y, x_int) # sol1 + line.fit_eqwidth_data = integrate.simpson(Ydata, x_int) # sol2 line.fit_popt = popt line.fit_pcov = pcov From 844f599d764448f0f5e4d08efed0b204decf060d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 8 Aug 2024 03:45:03 +0200 Subject: [PATCH 123/161] use integrate.simpson instead of simps (deprecated) --- spectractor/extractor/spectrum.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index cf9cce046..88c3b87e8 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -1813,8 +1813,8 @@ def detect_lines(lines, lambdas, spec, spec_err=None, cov_matrix=None, fwhm_func Y = -Gauss / Continuum Ydata = 1 - spectr_data / Continuum - line.fit_eqwidth_mod = integrate.simpson(Y, x_int) # sol1 - line.fit_eqwidth_data = integrate.simpson(Ydata, x_int) # sol2 + line.fit_eqwidth_mod = integrate.simpson(Y, x=x_int) # sol1 + line.fit_eqwidth_data = integrate.simpson(Ydata, x=x_int) # sol2 line.fit_popt = popt line.fit_pcov = pcov From 10d1bd97a902fdc716db0ea14cb0848f9a303d6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 8 Aug 2024 03:47:11 +0200 Subject: [PATCH 124/161] use integrate.simpson instead of simps (deprecated) --- spectractor/extractor/spectrum.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index ca0d1c1fe..cf9cce046 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -1813,8 +1813,8 @@ def detect_lines(lines, lambdas, spec, spec_err=None, cov_matrix=None, fwhm_func Y = -Gauss / Continuum Ydata = 1 - spectr_data / Continuum - line.fit_eqwidth_mod = integrate.simps(Y, x_int) # sol1 - line.fit_eqwidth_data = integrate.simps(Ydata, x_int) # sol2 + line.fit_eqwidth_mod = integrate.simpson(Y, x_int) # sol1 + line.fit_eqwidth_data = integrate.simpson(Ydata, x_int) # sol2 line.fit_popt = popt line.fit_pcov = pcov From f4ad171c5360b2b4583cd93b727a367336ab9e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 8 Aug 2024 05:14:37 +0200 Subject: [PATCH 125/161] add DoubleMoffat PSF model --- spectractor/extractor/psf.py | 593 ++++++++++++++++++++++++++++++++++- 1 file changed, 589 insertions(+), 4 deletions(-) diff --git a/spectractor/extractor/psf.py b/spectractor/extractor/psf.py index 85bc2c58a..5eca6a5a0 100644 --- a/spectractor/extractor/psf.py +++ b/spectractor/extractor/psf.py @@ -319,6 +319,107 @@ def evaluate_moffatgauss1d(y, amplitude, y_c, gamma, alpha, eta_gauss, sigma, no return a +@njit(["float32[:](int64[:], float32, float32, float32, float32, float32, float32, float32, float32, float32)", + "float32[:](float32[:], float32, float32, float32, float32, float32, float32, float32, float32, float32)"], fastmath=True, cache=True) +def evaluate_doublemoffat1d(y, amplitude, y_c, gamma1, alpha1, eta, gamma2, alpha2, norm1, norm2): # pragma: no cover + r"""Compute a 1D DoubleMoffat function, whose integral is normalised to unity. + + .. math :: + + f(y) \propto A \left\lbrace + \frac{1}{\left[ 1 +\left(\frac{y-y_c}{\gamma}\right)^2 \right]^\alpha}+ \eta e^{-(y-y_c)^2/(2\sigma^2)}\right\rbrace + \quad\text{ and } \quad \eta < 0, \alpha > 1/2 + + Note that this function is defined only for :math:`\alpha > 1/2`. The normalisation factor for the Moffat+Gauss + :math:`\frac{\Gamma(\alpha)}{\gamma \sqrt{\pi} \Gamma(\alpha -1/2)} + \eta \sqrt{2\pi} \sigma` is not included as special functions + are not supproted by the numba library. + + Parameters + ---------- + y: array_like + 1D array of pixels :math:`y`, regularly spaced. + amplitude: float + Integral :math:`A` of the function. + y_c: float + Center :math:`y_c` of the function. + gamma1: float + Width :math:`\gamma_1` of the Moffat function. + alpha1: float + Exponent :math:`\alpha_1` of the Moffat function. + eta: float + Relative amplitude of the second Moffat function. + gamma2: float + Width :math:`\gamma_2` of the second Moffat function. + alpha2: float + Exponent :math:`\alpha_2` of the second Moffat function. + norm1: float + Normalisation :math:`\frac{\Gamma(\alpha_1)}{\gamma_1 \sqrt{\pi} \Gamma(\alpha_1 -1/2)}`. + norm2: float + Normalisation :math:`\frac{\Gamma(\alpha_2)}{\gamma_2 \sqrt{\pi} \Gamma(\alpha_2 -1/2)}`. + + Returns + ------- + output: array_like + 1D array of the function evaluated on the y pixel array. + + Examples + -------- + + >>> Ny = 50 + >>> y = np.arange(Ny) + >>> amplitude = 10 + >>> gamma1 = 5 + >>> alpha1 = 2 + >>> eta = 2 + >>> gamma2 = 4 + >>> alpha2 = 3 + >>> norm1 = evaluate_moffat1d_normalisation(gamma1, alpha1) + >>> norm2 = evaluate_moffat1d_normalisation(gamma2, alpha2) + >>> a = evaluate_doublemoffat1d(y, amplitude=amplitude, y_c=Ny/2, gamma1=gamma1, alpha1=alpha1, eta=eta, gamma2=gamma2, alpha2=alpha2, norm1=norm1, norm2=norm2) + >>> print(f"{np.sum(a):.6f}") + 9.985071 + >>> a.dtype + dtype('float32') + + .. doctest:: + :hide: + + >>> assert np.isclose(np.sum(a), amplitude, atol=0.5) + >>> assert np.isclose(np.argmax(a), Ny/2, atol=0.5) + + .. plot:: + + import numpy as np + import matplotlib.pyplot as plt + from spectractor.extractor.psf import * + Ny = 50 + y = np.arange(Ny) + amplitude = 10 + gamma1 = 5 + alpha1 = 2 + eta = 2 + gamma2 = 4 + alpha2 = 3 + norm1 = evaluate_moffat1d_normalisation(gamma1, alpha1) + norm2 = evaluate_moffat1d_normalisation(gamma2, alpha2) + a = evaluate_doublemoffat1d(y, amplitude=amplitude, y_c=Ny/2, gamma1=gamma1, alpha1=alpha1, eta=eta, gamma2=gamma2, alpha2=alpha2, norm1=norm1, norm2=norm2) + plt.plot(a) + plt.grid() + plt.xlabel("y") + plt.ylabel("DoubleMoffat") + plt.show() + + """ + yc = y - y_c + rr = yc * yc + rr_gg1 = rr / (gamma1 * gamma1) + rr_gg2 = rr / (gamma2 * gamma2) + norm = 1. / norm1 + eta / norm2 + a = (1 + rr_gg1) ** -alpha1 + eta * (1 + rr_gg2) ** -alpha2 + a *= (amplitude / norm) + return a + + @njit(["float32[:,:](int64[:], float32, float32, float32, float32, float32, float32, float32, float32, boolean[:])"], fastmath=True, cache=True) def evaluate_moffatgauss1d_jacobian(y, amplitude, y_c, gamma, alpha, eta_gauss, sigma, norm_moffat, dnormda, fixed): # pragma: no cover r"""Compute a 1D Moffat-Gaussian Jacobian, whose integral is normalised to unity. @@ -418,6 +519,118 @@ def evaluate_moffatgauss1d_jacobian(y, amplitude, y_c, gamma, alpha, eta_gauss, return J +@njit(["float32[:,:](int64[:], float32, float32, float32, float32, float32, float32, float32, float32, float32, float32, float32, boolean[:])"], fastmath=True, cache=True) +def evaluate_doublemoffat1d_jacobian(y, amplitude, y_c, gamma1, alpha1, eta, gamma2, alpha2, norm1, dnormda1, norm2, dnormda2, fixed): # pragma: no cover + r"""Compute a 1D DoubleMoffat Jacobian, whose integral is normalised to unity. + + .. math :: + + f(y) \propto A \left\lbrace + \frac{1}{\left[ 1 +\left(\frac{y-y_c}{\gamma}\right)^2 \right]^\alpha} \times \frac{\Gamma(\alpha)}{\gamma \sqrt{\pi} \Gamma(\alpha -1/2)} + - \eta e^{-(y-y_c)^2/(2\sigma^2)}\right\rbrace + \quad\text{ and } \quad \eta < 0, \alpha > 1/2 + + Note that this function is defined only for :math:`\alpha > 1/2`. The normalisation factor for the Moffat + :math:`\frac{\Gamma(\alpha)}{\gamma \sqrt{\pi} \Gamma(\alpha -1/2)} + \eta \sqrt{2\pi} \sigma` is not included as special functions + are not supproted by the numba library. + + Parameters + ---------- + y: array_like + 1D array of pixels :math:`y`, regularly spaced. + amplitude: float + Integral :math:`A` of the function. + y_c: float + Center :math:`y_c` of the function. + gamma1: float + Width :math:`\gamma_1` of the Moffat function. + alpha1: float + Exponent :math:`\alpha_1` of the Moffat function. + eta: float + Relative amplitude of the second Moffat function. + gamma2: float + Width :math:`\gamma_2` of the second Moffat function. + alpha2: float + Exponent :math:`\alpha_2` of the second Moffat function. + norm1: float + Normalisation :math:`\frac{\Gamma(\alpha_1)}{\gamma_1 \sqrt{\pi} \Gamma(\alpha_1 -1/2)}`. + dnormda1: float + Derivatives of the normalisation with respect to alpha1. + norm2: float + Normalisation :math:`\frac{\Gamma(\alpha_2)}{\gamma_2 \sqrt{\pi} \Gamma(\alpha_2 -1/2)}`. + dnormda2: float + Derivatives of the normalisation with respect to alpha2. + fixed: array_like + Array of booleans, with True values for fixed parameters. + + Returns + ------- + J: array_like + 2D array of the model Jacobian. + + Examples + -------- + + >>> Ny = 50 + >>> y = np.arange(Ny) + >>> amplitude = 10 + >>> gamma1 = 5 + >>> alpha1 = 2 + >>> gamma2 = 4 + >>> alpha2 = 3 + >>> eta = 2 + >>> norm1 = evaluate_moffat1d_normalisation(gamma1, alpha1) + >>> dnormda1 = evaluate_moffat1d_normalisation_dalpha(norm1, alpha1) + >>> norm2 = eta * evaluate_moffat1d_normalisation(gamma2, alpha2) + >>> dnormda2 = evaluate_moffat1d_normalisation_dalpha(norm2, alpha2) + >>> a = evaluate_doublemoffat1d(y, amplitude=amplitude, y_c=Ny/2, gamma1=gamma1, alpha1=alpha1, eta=eta, gamma2=gamma2, alpha2=alpha2, norm1=norm1, norm2=norm2) + >>> J = evaluate_doublemoffat1d_jacobian(y, amplitude=amplitude, y_c=Ny/2, gamma1=gamma1, alpha1=alpha1, + ... eta=eta, gamma2=gamma2, alpha2=alpha2, norm1=norm1, dnormda1=dnormda1, norm2=norm2, dnormda2=dnormda2, + ... fixed=np.array([False, False, True, False, False, False, False])) + >>> J.shape + (8, 50) + >>> J.dtype + dtype('float32') + >>> np.allclose(J[2], 0) + True + + .. doctest:: + :hide: + + >>> assert np.allclose(J[0], a.ravel()/amplitude) + + """ + yc = y - y_c + rr = yc * yc + rr_gg1 = rr / (gamma1 * gamma1) + rr_gg2 = rr / (gamma2 * gamma2) + inv_moffat1 = 1 / (1 + rr_gg1) + psf_moffat1 = inv_moffat1 ** alpha1 + dpsf_moffat1 = alpha1 * inv_moffat1 * psf_moffat1 + inv_moffat2 = 1 / (1 + rr_gg2) + psf_moffat2 = inv_moffat2 ** alpha2 + dpsf_moffat2 = alpha2 * inv_moffat2 * psf_moffat2 + psf = psf_moffat1 + eta * psf_moffat2 + norm = amplitude / (1/norm1 + eta/norm2) + J = np.zeros((8, y.size), dtype=np.float32) + if not fixed[0]: + J[0] = (norm / amplitude) * psf # amplitude + # fixed x_c so J[1] = 0 + if not fixed[2]: + J[2] = (2 * norm / (gamma1 * gamma1)) * yc * dpsf_moffat1 + eta * (2 * norm / (gamma2 * gamma2)) * yc * dpsf_moffat2 # y_c + if not fixed[3]: + J[3] = (2 * norm / gamma1) * rr_gg1 * dpsf_moffat1 - (norm * norm / (amplitude * norm1 * gamma1)) * psf # gamma1 + if not fixed[4]: + J[4] = -norm * psf_moffat1 * np.log(1 + rr_gg1) + psf * (norm * norm / amplitude) * (dnormda1 / (norm1 * norm1)) # alpha1 + if not fixed[5]: + J[5] = norm * psf_moffat2 - (1/norm2 * norm * norm / amplitude) * psf # eta + if not fixed[6]: + J[6] = eta * (2 * norm / gamma2) * rr_gg2 * dpsf_moffat2 - (eta * norm * norm / (amplitude * norm2 * gamma2)) * psf # gamma2 + if not fixed[7]: + J[7] = -eta * norm * psf_moffat2 * np.log(1 + rr_gg2) + psf * (norm * norm / amplitude) * (eta * dnormda2 / (norm2 * norm2)) # alpha2 + return J + + @njit(["float32[:,:](int64[:,:], int64[:,:], float32, float32, float32, float32, float32)", "float64[:,:](float64[:,:], float64[:,:], float32, float32, float32, float32, float32)"], fastmath=True, cache=True) def evaluate_moffat2d(x, y, amplitude, x_c, y_c, gamma, alpha): # pragma: no cover @@ -575,7 +788,7 @@ def evaluate_moffat2d_jacobian(x, y, amplitude, x_c, y_c, gamma, alpha, fixed): @njit(["float32[:,:](int64[:,:], int64[:,:], float32, float32, float32, float32, float32, float32, float32)"], fastmath=True, cache=True) def evaluate_moffatgauss2d(x, y, amplitude, x_c, y_c, gamma, alpha, eta_gauss, sigma): # pragma: no cover - r"""Compute a 2D Moffat-Gaussian function, whose integral is normalised to unity. + r"""Compute a 2D Moffat+Gauss function, whose integral is normalised to unity. .. math :: @@ -604,7 +817,7 @@ def evaluate_moffatgauss2d(x, y, amplitude, x_c, y_c, gamma, alpha, eta_gauss, s y_c: float Y axis center :math:`y_c` of the function. gamma: float - Width :math:`\gamma` of the function. + Width :math:`\gamma` of the Moffat function. alpha: float Exponent :math:`\alpha` of the Moffat function. eta_gauss: float @@ -665,6 +878,101 @@ def evaluate_moffatgauss2d(x, y, amplitude, x_c, y_c, gamma, alpha, eta_gauss, s return a +@njit(["float32[:,:](int64[:,:], int64[:,:], float32, float32, float32, float32, float32, float32, float32, float32)"], fastmath=True, cache=True) +def evaluate_doublemoffat2d(x, y, amplitude, x_c, y_c, gamma1, alpha1, eta, gamma2, alpha2): # pragma: no cover + r"""Compute a 2D Double Moffat function, whose integral is normalised to unity. + + .. math :: + + f(x, y) = \frac{A}{\frac{\pi \gamma_1^2}{\alpha_1-1} + \eta \frac{\pi \gamma_2^2}{\alpha_2-1}}\left\lbrace \frac{1}{ + \left[ 1 +\frac{\left(x-x_c\right)^2+\left(y-y_c\right)^2}{\gamma_1^2} \right]^\alpha_1} + + \eta \frac{1}{ + \left[ 1 +\frac{\left(x-x_c\right)^2+\left(y-y_c\right)^2}{\gamma_2^2} \right]^\alpha_2} + \right\rbrace + + .. math :: + \quad\text{with}\quad + \int_{-\infty}^{\infty}\int_{-\infty}^{\infty}f(x, y) \mathrm{d}x \mathrm{d}y = A + \quad\text{and} \quad \eta < 0 + + Note that this function is defined only for :math:`\alpha > 1`. + + Parameters + ---------- + x: array_like + 2D array of pixels :math:`x`, regularly spaced. + y: array_like + 2D array of pixels :math:`y`, regularly spaced. + amplitude: float + Integral :math:`A` of the function. + x_c: float + X axis center :math:`x_c` of the function. + y_c: float + Y axis center :math:`y_c` of the function. + gamma1: float + Width :math:`\gamma_1` of the Moffat function. + alpha1: float + Exponent :math:`\alpha_1` of the Moffat function. + eta: float + Relative amplitude of the second Moffat function. + gamma2: float + Width :math:`\gamma_2` of the second Moffat function. + alpha2: float + Exponent :math:`\alpha_2` of the second Moffat function. + + Returns + ------- + output: array_like + 2D array of the function evaluated on the y pixel array. + + Examples + -------- + + >>> Nx = 50 + >>> Ny = 50 + >>> yy, xx = np.mgrid[:Ny, :Nx] + >>> amplitude = 10 + >>> a = evaluate_doublemoffat2d(xx, yy, amplitude=amplitude, x_c=Nx/2, y_c=Ny/2, gamma1=5, alpha1=2, + ... eta=2, gamma2=4, alpha2=3) + >>> print(f"{np.sum(a):.6f}") + 9.805085 + >>> a.dtype + dtype('float32') + + .. doctest:: + :hide: + + >>> assert not np.isclose(np.sum(a), amplitude) + + .. plot:: + + import numpy as np + import matplotlib.pyplot as plt + from spectractor.extractor.psf import * + Nx = 50 + Ny = 50 + yy, xx = np.mgrid[:Nx, :Ny] + amplitude = 10 + a = evaluate_doublemoffat2d(xx, yy, amplitude=amplitude, x_c=Nx/2, y_c=Ny/2, gamma1=5, alpha1=2, eta=2, gamma2=4, alpha2=1.5) + im = plt.pcolor(xx, yy, a) + plt.grid() + plt.xlabel("x") + plt.ylabel("y") + plt.colorbar(im, label="Double Moffat 2D") + plt.show() + + """ + xc = x - x_c + yc = y - y_c + rr = xc * xc + yc * yc + rr_gg1 = rr / (gamma1 * gamma1) + rr_gg2 = rr / (gamma2 * gamma2) + a = (1 + rr_gg1) ** -alpha1 + eta * (1 + rr_gg2) ** -alpha2 + norm = (np.pi * gamma1 * gamma1) / (alpha1 - 1) + eta * (np.pi * gamma2 * gamma2) / (alpha2 - 1) + a *= amplitude / norm + return a + + @njit(["float32[:](int64[:], float32, float32, float32)", "float32[:](float32[:], float32, float32, float32)"], fastmath=True, cache=False) def evaluate_gauss1d(y, amplitude, y_c, sigma): # pragma: no cover @@ -949,7 +1257,7 @@ def evaluate_gauss2d_jacobian(x, y, amplitude, x_c, y_c, sigma, fixed): # pragm @njit(["float32[:,:](int64[:,:], int64[:,:], float32, float32, float32, float32, float32, float32, float32, boolean[:])"], fastmath=True, cache=True) def evaluate_moffatgauss2d_jacobian(x, y, amplitude, x_c, y_c, gamma, alpha, eta_gauss, sigma, fixed): # pragma: no cover - r"""Compute a 2D Moffat Jacobian, whose integral is normalised to unity. + r"""Compute a 2D Moffat+Gauss Jacobian, whose integral is normalised to unity. Parameters ---------- @@ -1021,7 +1329,7 @@ def evaluate_moffatgauss2d_jacobian(x, y, amplitude, x_c, y_c, gamma, alpha, eta if not fixed[1]: J[1] = (norm / (sigma * sigma)) * xc * eta_gauss * psf_gauss + (2 * norm / (gamma * gamma)) * xc * dpsf_moffat # x_c if not fixed[2]: - J[2] = (norm / (sigma * sigma)) * yc * eta_gauss * psf_gauss + (2 * norm / (gamma * gamma)) * yc * dpsf_moffat # x_c + J[2] = (norm / (sigma * sigma)) * yc * eta_gauss * psf_gauss + (2 * norm / (gamma * gamma)) * yc * dpsf_moffat # y_c if not fixed[3]: J[3] = (-2 * np.pi * gamma * norm * norm / (alpha-1) / amplitude) * psf + (2 * norm / gamma) * rr_gg * dpsf_moffat # gamma if not fixed[4]: @@ -1033,6 +1341,98 @@ def evaluate_moffatgauss2d_jacobian(x, y, amplitude, x_c, y_c, gamma, alpha, eta return J +@njit(["float32[:,:](int64[:,:], int64[:,:], float32, float32, float32, float32, float32, float32, float32, float32, boolean[:])"], fastmath=True, cache=True) +def evaluate_doublemoffat2d_jacobian(x, y, amplitude, x_c, y_c, gamma1, alpha1, eta, gamma2, alpha2, fixed): # pragma: no cover + r"""Compute a 2D Double Moffat Jacobian, whose integral is normalised to unity. + + Parameters + ---------- + x: array_like + 2D array of pixels :math:`x`, regularly spaced. + y: array_like + 2D array of pixels :math:`y`, regularly spaced. + amplitude: float + Integral :math:`A` of the function. + x_c: float + X axis center :math:`x_c` of the function. + y_c: float + Y axis center :math:`y_c` of the function. + gamma1: float + Width :math:`\gamma_1` of the Moffat function. + alpha1: float + Exponent :math:`\alpha_1` of the Moffat function. + eta: float + Relative amplitude of the second Moffat function. + gamma2: float + Width :math:`\gamma_2` of the second Moffat function. + alpha2: float + Exponent :math:`\alpha_2` of the second Moffat function. + fixed: array_like + Array of booleans, with True values for fixed parameters. + + + Returns + ------- + J: array_like + 2D array of the model Jacobian. + + Examples + -------- + + >>> Nx = 50 + >>> Ny = 50 + >>> yy, xx = np.mgrid[:Ny, :Nx] + >>> amplitude = 10 + >>> a = evaluate_doublemoffat2d(xx, yy, amplitude=amplitude, x_c=Nx/2, y_c=Ny/2, gamma1=5, alpha1=2, + ... eta=2, gamma2=1, alpha2=3) + >>> J = evaluate_doublemoffat2d_jacobian(xx, yy, amplitude=amplitude, x_c=Nx/2, y_c=Ny/2, gamma1=5, alpha1=2, + ... eta=2, gamma2=1, alpha2=3, fixed=np.array([False, False, True, False, False, False, False, False])) + >>> J.shape + (8, 2500) + >>> J.dtype + dtype('float32') + >>> np.allclose(J[2], 0) + True + + .. doctest:: + :hide: + + >>> assert np.allclose(J[0], a.ravel()/amplitude) + + """ + xc = (x - x_c).ravel() + yc = (y - y_c).ravel() + rr = xc * xc + yc * yc + rr_gg1 = rr / (gamma1 * gamma1) + rr_gg2 = rr / (gamma2 * gamma2) + inv_moffat1 = 1 / (1 + rr_gg1) + psf_moffat1 = inv_moffat1 ** alpha1 + inv_moffat2 = 1 / (1 + rr_gg2) + psf_moffat2 = inv_moffat2 ** alpha2 + dpsf_moffat1 = alpha1 * inv_moffat1 * psf_moffat1 + dpsf_moffat2 = alpha2 * inv_moffat2 * psf_moffat2 + psf = psf_moffat1 + eta * psf_moffat2 + norm = amplitude / ((np.pi * gamma1 * gamma1) / (alpha1 - 1) + eta * (np.pi * gamma2 * gamma2) / (alpha2 - 1)) + J = np.zeros((8, x.size), dtype=np.float32) + if not fixed[0]: + J[0] = (norm / amplitude) * psf # amplitude + if not fixed[1]: + J[1] = (2 * norm / (gamma1 * gamma1)) * xc * dpsf_moffat1 + eta * (2 * norm / (gamma2 * gamma2)) * xc * dpsf_moffat2 # x_c + if not fixed[2]: + J[2] = (2 * norm / (gamma1 * gamma1)) * yc * dpsf_moffat1 + eta * (2 * norm / (gamma2 * gamma2)) * yc * dpsf_moffat2 # y_c + if not fixed[3]: + J[3] = (-2 * np.pi * gamma1 * norm * norm / (alpha1-1) / amplitude) * psf + (2 * norm / gamma1) * rr_gg1 * dpsf_moffat1 # gamma1 + if not fixed[4]: + J[4] = (np.pi * gamma1 * gamma1) * norm * norm / (amplitude * (alpha1-1) * (alpha1-1)) * psf - norm * psf_moffat1 * np.log(1 + rr_gg1) # alpha1 + if not fixed[5]: + J[5] = norm * psf_moffat2 - ((np.pi * gamma2 * gamma2) / (alpha2 - 1) * norm * norm / amplitude) * psf + if not fixed[6]: + J[6] = eta * (-2 * np.pi * gamma2 * norm * norm / (alpha2-1) / amplitude) * psf + eta * (2 * norm / gamma2) * rr_gg2 * dpsf_moffat2 # gamma2 + if not fixed[7]: + J[7] = eta * (np.pi * gamma2 * gamma2) * norm * norm / (amplitude * (alpha2-1) * (alpha2-1)) * psf - eta * norm * psf_moffat2 * np.log(1 + rr_gg2) # alpha2 + return J + + class PSF: """Generic PSF model class. @@ -1729,6 +2129,191 @@ def jacobian(self, pixels, params, epsilon=None, model_input=None, analytical=Tr return J +class DoubleMoffat(PSF): + + def __init__(self, values=None, clip=False): + PSF.__init__(self, clip=clip) + self.values_default = np.array([1, 0, 0, 3, 2, 0.005, 3, 1.5]).astype(float) + if values is None: + values = np.copy(self.values_default) + labels = ["amplitude", "x_c", "y_c", "gamma1", "alpha1", "eta", "gamma2", "alpha2", "saturation"] + axis_names = ["$A$", r"$x_c$", r"$y_c$", r"$\gamma_1$", r"$\alpha_1$", r"$\eta$", r"$\gamma_2$", r"$\alpha_2$", "saturation"] + bounds = [(0, np.inf), (-np.inf, np.inf), (-np.inf, np.inf), (1, np.inf), (1.1, 10), + (0, np.inf), (1, np.inf), (1.1, 10), (0, np.inf)] + self.params = FitParameters(values=values, labels=labels, axis_names=axis_names, bounds=bounds) + + def apply_max_width_to_bounds(self, max_half_width=None): + if max_half_width is not None: + self.max_half_width = max_half_width + self.params.bounds[2] = (-2 * self.max_half_width, 2 * self.max_half_width) + self.params.bounds[3] = (1, self.max_half_width) + self.params.bounds[5] = (1, self.max_half_width) + + def evaluate(self, pixels, values=None): + r"""Evaluate the DoubleMoffat function. + + The function is normalized to have an integral equal to amplitude parameter, with normalisation factor: + + .. math:: + + f(y) \propto \frac{A}{ \frac{\Gamma(\alpha_1)}{\gamma_1 \sqrt{\pi} \Gamma(\alpha_1 -1/2)}+\eta\frac{\Gamma(\alpha_2)}{\gamma_2 \sqrt{\pi} \Gamma(\alpha_2 -1/2)}, + \quad \int_{y_{\text{min}}}^{y_{\text{max}}} f(y) \mathrm{d}y = A + + Parameters + ---------- + pixels: list + List containing the X abscisse 2D array and the Y abscisse 2D array. + values: array_like + The parameter array. If None, the array used to instanciate the class is taken. + If given, the class instance parameter array is updated. + + Returns + ------- + output: array_like + The PSF function evaluated. + + Examples + -------- + >>> p = [2,20,30,4,2,2,5,1.5,20] + >>> psf = DoubleMoffat(p) + >>> yy, xx = np.mgrid[:50, :60] + >>> out = psf.evaluate(pixels=np.array([xx, yy]), values=p) + + .. plot:: + + import matplotlib.pyplot as plt + import numpy as np + from spectractor.extractor.psf import DoubleMoffat + p = [2,20,30,4,2,2,5,1.5,20] + psf = DoubleMoffat(p) + yy, xx = np.mgrid[:50, :60] + out = psf.evaluate(pixels=np.array([xx, yy]), values=p) + fig = plt.figure(figsize=(5,5)) + plt.imshow(out, origin="lower") + plt.xlabel("X [pixels]") + plt.ylabel("Y [pixels]") + plt.show() + + """ + if values is not None: + self.params.values = np.asarray(values).astype(float) + amplitude, x_c, y_c, gamma1, alpha1, eta, gamma2, alpha2, saturation = self.params.values + if pixels.ndim == 3 and pixels.shape[0] == 2: + x, y = pixels # .astype(np.float32) # float32 to increase rapidity + out = evaluate_doublemoffat2d(x, y, amplitude, x_c, y_c, gamma1, alpha1, eta, gamma2, alpha2) + if self.clip: + out = np.clip(out, 0, saturation) + return out + elif pixels.ndim == 1: + y = np.array(pixels) + if alpha1 > 0.5 and alpha2 > 0.5: + norm1 = evaluate_moffat1d_normalisation(gamma1, alpha1) + norm2 = evaluate_moffat1d_normalisation(gamma2, alpha2) + out = evaluate_doublemoffat1d(y, amplitude, y_c, gamma1, alpha1, eta, gamma2, alpha2, norm1, norm2) + if self.clip: + out = np.clip(out, 0, saturation) + return out + else: + return np.zeros_like(y) + else: # pragma: no cover + raise ValueError(f"Pixels array must have dimension 1 or shape=(2,Nx,Ny). Here pixels.ndim={pixels.shape}.") + + def jacobian(self, pixels, params, epsilon=None, model_input=None, analytical=True): + r"""Evaluate the PSF DoubleMoffat Jacobian. + + The function is normalized to have an integral equal to amplitude parameter, with normalisation factor: + + Parameters + ---------- + pixels: array_like + List containing the X abscisse 2D array and the Y abscisse 2D array. + params: array_like + The parameter array. If None, the array used to instanciate the class is taken. + If given, the class instance parameter array is updated. + epsilon: array_like, optional + The array of small steps to compute the partial derivatives of the model if analytical=False (default: None). + model_input: array_like, optional + A model input as a list with (x, model, model_err) to avoid an additional call to simulate() if analytical=False (default: None). + analytical: bool, optional + If True, use analytical derivatives to compute Jacobian operator. Otherwise use numerical differenciations + with steps given by epsilon argument (default: True). + + Returns + ------- + jacobian: array_like + The PSF Jacobian. + + Examples + -------- + >>> p = [2,20,30,4,2,0.5,3,3,20] + >>> epsilon = [0.001] * len(p) + >>> psf = DoubleMoffat(p) + >>> psf.params.fixed = [True, True, False, False, False, False, False, False, True] # fix amplitude, x_c, saturation + + 2D case + + >>> yy, xx = np.mgrid[:50, :60] + >>> J_ana = psf.jacobian(pixels=np.array([xx, yy]), params=p, epsilon=epsilon, analytical=True) + >>> J_num = psf.jacobian(pixels=np.array([xx, yy]), params=p, epsilon=epsilon, analytical=False) + >>> np.allclose(J_num, J_ana, rtol=1e-4, atol=1e-4) + True + >>> np.allclose(J_ana[0:2], 0) + True + + .. doctest:: + :hide: + + >>> assert J_ana.shape == (len(p), xx.size) + >>> assert J_num.shape == (len(p), xx.size) + + 1D case + + >>> y = np.mgrid[:50] + >>> J_ana = psf.jacobian(pixels=y, params=p, epsilon=epsilon, analytical=True) + >>> J_num = psf.jacobian(pixels=y, params=p, epsilon=epsilon, analytical=False) + >>> np.allclose(J_num, J_ana, rtol=1e-3, atol=1e-3) + True + >>> np.allclose(J_ana[0:2], 0) + True + + .. doctest:: + :hide: + + >>> assert J_ana.shape == (len(p), y.size) + >>> assert J_num.shape == (len(p), y.size) + """ + if epsilon is None and not analytical: + raise ValueError(f"If analytical=False, must give epsilon values for numerical differentiation.") + amplitude, x_c, y_c, gamma1, alpha1, eta, gamma2, alpha2, saturation = self.params.values.astype(float) + J = super().jacobian(pixels, params, epsilon=epsilon, model_input=model_input, analytical=analytical) + if not analytical: + if model_input is None: + model = self.evaluate(pixels, values=params) + else: + x, model, model_err = model_input + for ip, p in enumerate(params): + if self.params.fixed[ip]: + continue + tmp_p = np.copy(params).astype(float) + if tmp_p[ip] + epsilon[ip] < self.params.bounds[ip][0] or tmp_p[ip] + epsilon[ip] > self.params.bounds[ip][1]: + epsilon[ip] = - epsilon[ip] + tmp_p[ip] += epsilon[ip] + tmp_model = self.evaluate(pixels, values=tmp_p) + J[ip] = (tmp_model.ravel() - model.ravel()) / epsilon[ip] + else: + fixed = np.array(self.params.fixed) + if pixels.ndim == 1: + norm1 = evaluate_moffat1d_normalisation(gamma1, alpha1) + norm2 = evaluate_moffat1d_normalisation(gamma2, alpha2) + dnormda1 = evaluate_moffat1d_normalisation_dalpha(norm1, alpha1) + dnormda2 = evaluate_moffat1d_normalisation_dalpha(norm2, alpha2) + J[:-1] = evaluate_doublemoffat1d_jacobian(pixels, amplitude, y_c, gamma1, alpha1, eta, gamma2, alpha2, norm1, dnormda1, norm2, dnormda2, fixed=fixed) # [:-1] assume saturation is fixed + else: + xx, yy = pixels + J[:-1] = evaluate_doublemoffat2d_jacobian(xx, yy, amplitude, x_c, y_c, gamma1, alpha1, eta, gamma2, alpha2, fixed=fixed) # [:-1] assume saturation is fixed + return J + + class Order0(PSF): def __init__(self, target, values=None, clip=False): From 326f7478838bf23264bdab1c284ebccf866130bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 8 Aug 2024 05:18:04 +0200 Subject: [PATCH 126/161] add DoubleMoffat PSF model --- spectractor/extractor/psf.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spectractor/extractor/psf.py b/spectractor/extractor/psf.py index 5eca6a5a0..a8759066f 100644 --- a/spectractor/extractor/psf.py +++ b/spectractor/extractor/psf.py @@ -2837,6 +2837,8 @@ def load_PSF(psf_type=parameters.PSF_TYPE, target=None, clip=False): psf = MoffatGauss(clip=clip) elif psf_type == "Gauss": psf = Gauss(clip=clip) + elif psf_type == "DoubleMoffat": + psf = DoubleMoffat(clip=clip) elif psf_type == "Order0": if target is None: raise ValueError(f"A Target instance must be given when PSF_TYPE='Order0'. I got target={target}.") From dd199aec6f18b6816350c7f4be6e6d47b02e8503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 8 Aug 2024 05:22:18 +0200 Subject: [PATCH 127/161] add DoubleMoffat PSF model --- config/auxtel.ini | 2 +- config/default.ini | 2 +- spectractor/extractor/psf.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/auxtel.ini b/config/auxtel.ini index f504aa97a..fd51aae13 100644 --- a/config/auxtel.ini +++ b/config/auxtel.ini @@ -109,7 +109,7 @@ PIXWIDTH_BACKGROUND = 40 PIXWIDTH_BOXSIZE = 20 [PSF] -# the PSF model: Gauss, Moffat or MoffatGauss +# the PSF model: Gauss, Moffat, DoubleMoffat or MoffatGauss PSF_TYPE = Moffat # the order of the polynomials to model wavelength dependence of the PSF shape parameters PSF_POLY_ORDER = 2 diff --git a/config/default.ini b/config/default.ini index 6f34a1a89..714e74dc6 100644 --- a/config/default.ini +++ b/config/default.ini @@ -115,7 +115,7 @@ PIXWIDTH_BACKGROUND = 40 PIXWIDTH_BOXSIZE = 20 [PSF] -# the PSF model: Gauss, Moffat or MoffatGauss +# the PSF model: Gauss, Moffat, DoubleMoffat or MoffatGauss PSF_TYPE = Moffat # the order of the polynomials to model wavelength dependence of the PSF shape parameters PSF_POLY_ORDER = 2 diff --git a/spectractor/extractor/psf.py b/spectractor/extractor/psf.py index a8759066f..3e66814b6 100644 --- a/spectractor/extractor/psf.py +++ b/spectractor/extractor/psf.py @@ -2133,7 +2133,7 @@ class DoubleMoffat(PSF): def __init__(self, values=None, clip=False): PSF.__init__(self, clip=clip) - self.values_default = np.array([1, 0, 0, 3, 2, 0.005, 3, 1.5]).astype(float) + self.values_default = np.array([1, 0, 0, 3, 2, 0.005, 3, 1.5, 10]).astype(float) if values is None: values = np.copy(self.values_default) labels = ["amplitude", "x_c", "y_c", "gamma1", "alpha1", "eta", "gamma2", "alpha2", "saturation"] From fe1a5ed4864f61d446c8cacb560daf5c8e590791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 14 Aug 2024 22:44:28 +0200 Subject: [PATCH 128/161] typos --- config/ctio.ini | 2 +- spectractor/extractor/chromaticpsf.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/ctio.ini b/config/ctio.ini index 98ba7bd59..35a285446 100644 --- a/config/ctio.ini +++ b/config/ctio.ini @@ -101,7 +101,7 @@ PIXWIDTH_BACKGROUND = 100 PIXWIDTH_BOXSIZE = 40 [PSF] -# the PSF model: Gauss, Moffat or MoffatGauss +# the PSF model: Gauss, Moffat, DoubleMoffat, or MoffatGauss PSF_TYPE = Moffat # the order of the polynomials to model wavelength dependence of the PSF shape parameters PSF_POLY_ORDER = 2 diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index a00d7e328..b995bf6e2 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -1838,7 +1838,7 @@ def fit_chromatic_psf(self, data, mask=None, bgd_model_func=None, data_errors=No f"below the trace of the prior covariance matrix " f"({np.trace(w.amplitude_priors_cov_matrix)}). This is probably due to a very " f"high regularisation parameter in case of a bad fit. Therefore the final " - f"covariance matrix is mulitiplied by the ratio of the traces and " + f"covariance matrix is multiplied by the ratio of the traces and " f"the amplitude parameters are very close the amplitude priors.") r = np.trace(w.amplitude_priors_cov_matrix) / np.trace(w.amplitude_cov_matrix) w.amplitude_cov_matrix *= r From 643db63926ea7b21780a9f2a54446e767e2c40df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 14 Aug 2024 22:45:37 +0200 Subject: [PATCH 129/161] debug set_mask() to not accumulate masked pixels iteration after iteration --- spectractor/extractor/chromaticpsf.py | 9 +++++---- spectractor/extractor/extractor.py | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index b995bf6e2..272a21cdf 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -1939,6 +1939,7 @@ def __init__(self, chromatic_psf, data, data_errors, mode, bgd_model_func=None, self.poly_params[self.Nx + self.y_c_0_index] -= self.bgd_width self.profile_params = self.chromatic_psf.from_poly_params_to_profile_params(self.poly_params) self.data_before_mask = np.copy(self.data) + self.mask_before_mask = list(np.copy(self.mask)) self.boundaries = None self.psf_cube_sparse_indices = None self.psf_cube_masked = None @@ -2074,19 +2075,19 @@ def set_mask(self, poly_params=None): self.psf_cube_masked = self.chromatic_psf.convolve_psf_cube_masked(psf_cube_masked) self.boundaries, self.psf_cube_masked = self.chromatic_psf.set_rectangular_boundaries(self.psf_cube_masked) self.psf_cube_sparse_indices, self.M_sparse_indices = self.chromatic_psf.get_sparse_indices(self.boundaries) - mask = np.sum(self.psf_cube_masked.reshape(psf_cube_masked.shape[0], psf_cube_masked[0].size), axis=0) == 0 + # mask = np.sum(self.psf_cube_masked.reshape(psf_cube_masked.shape[0], psf_cube_masked[0].size), axis=0) == 0 # cumulate the boolean values as int weight_mask = np.sum(self.psf_cube_masked, axis=0) # look for indices with maximum weight per column (all sheets of the psf cube have contributed) res = np.max(weight_mask, axis=0)[np.newaxis,:] * np.ones((weight_mask.shape[0],1)) # keep only the pixels where all psf_cube sheets have contributed per column mask = (weight_mask != res).ravel() + self.mask = list(self.mask_before_mask) + list(np.where(mask)[0]) + self.mask = list(set(self.mask)) W = np.copy(self.W_before_mask.data.ravel()) - W[mask] = 0 + W[self.mask] = 0 self.W = sparse.diags(W, dtype="float32", format="dia") self.sqrtW = self.W.sqrt() - self.mask += list(np.where(mask)[0]) - self.mask = list(set(self.mask)) def simulate(self, *shape_params): r""" diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 28c316089..915f85568 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -192,6 +192,7 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p # (which is not exactly true in rotated images) self.W = 1. / (self.err * self.err) self.data_before_mask = np.copy(self.data) + self.mask_before_mask = list(np.copy(self.mask)) self.W_before_mask = np.copy(self.W) self.sqrtW = sparse.diags(np.sqrt(self.W), format="dia", dtype="float32") @@ -311,18 +312,18 @@ def set_mask(self, params=None, fwhmx_clip=3*parameters.PSF_FWHM_CLIP, fwhmy_cli self.boundaries[order]["ymin"] = np.zeros_like(self.boundaries[order]["ymin"]) self.boundaries[order]["ymax"] = self.Ny * np.ones_like(self.boundaries[order]["ymax"]) self.psf_cube_sparse_indices[order], self.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(self.boundaries[order]) - mask = np.sum(self.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], psf_cube_masked[0].size), axis=0) == 0 + # mask = np.sum(self.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], psf_cube_masked[0].size), axis=0) == 0 # cumulate the boolean values as int weight_mask = np.sum(self.psf_cubes_masked[self.diffraction_orders[0]], axis=0) # look for indices with maximum weight per column (all sheets of the psf cube have contributed) res = np.max(weight_mask, axis=0)[np.newaxis,:] * np.ones((weight_mask.shape[0],1)) # keep only the pixels where all psf_cube sheets have contributed per column mask = (weight_mask != res).ravel() + self.mask = list(self.mask_before_mask) + list(np.where(mask)[0]) + self.mask = list(set(self.mask)) self.W = np.copy(self.W_before_mask) - self.W[mask] = 0 + self.W[self.mask] = 0 self.sqrtW = sparse.diags(np.sqrt(self.W), format="dia", dtype="float32") - self.mask += list(np.where(mask)[0]) - self.mask = list(set(self.mask)) def simulate(self, *params): r""" From b5bacb6ccfee64daf3ab3e04ce2668a145a68723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Wed, 14 Aug 2024 22:46:11 +0200 Subject: [PATCH 130/161] reshape spectrogram_fit and speectrogram_residuals as 2D array --- spectractor/extractor/extractor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 915f85568..50f2723fa 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -940,8 +940,8 @@ def run_ffm_minimisation(w, method="newton", niter=2): w.spectrum.chromatic_psf.table["amplitude"] = np.copy(w.amplitude_params) w.spectrum.chromatic_psf.from_profile_params_to_shape_params(w.psf_profile_params[w.diffraction_orders[0]]) w.spectrum.chromatic_psf.params.values = w.spectrum.chromatic_psf.from_table_to_poly_params() - w.spectrum.spectrogram_fit = w.model - w.spectrum.spectrogram_residuals = (w.data - w.spectrum.spectrogram_fit) / w.err + w.spectrum.spectrogram_fit = w.model.reshape((w.Ny, w.Nx)) + w.spectrum.spectrogram_residuals = (w.data.reshape((w.Ny, w.Nx)) - w.spectrum.spectrogram_fit) / w.err.reshape((w.Ny, w.Nx)) w.spectrum.header['CHI2_FIT'] = w.costs[-1] / (w.data.size - len(w.mask)) w.spectrum.header['PIXSHIFT'] = w.params[r"shift_x [pix]"] w.spectrum.header['D2CCD'] = w.params[r"D_CCD [mm]"] From df0dbfa51a8fcd5ac043c009e620b58bc1b6cc16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 15 Aug 2024 00:42:51 +0200 Subject: [PATCH 131/161] remove some unseen cosmics with FFM residuals --- spectractor/extractor/extractor.py | 10 +++++++ spectractor/tools.py | 48 ++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 50f2723fa..ac08651e4 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -960,6 +960,16 @@ def run_ffm_minimisation(w, method="newton", niter=2): w.params.set(r"shift_x [pix]", w.spectrum.header['PIXSHIFT']) w.spectrum.convert_from_flam_to_ADUrate() + # Mask forgotten cosmics + from spectractor.tools import mask_cosmics + cr_mask = mask_cosmics(w.spectrum.spectrogram_residuals, maxiter=3, sigma_clip=5, convolve_kernel_size=0) + if np.sum(cr_mask) > 0: + my_logger.info(f"\n\t{np.sum(cr_mask)} new pixels identified and masked as cosmics.") + cr_mask_flat = cr_mask.flatten() + w.mask += [i for i in range(cr_mask_flat.size) if cr_mask_flat[i]] + w.mask = list(set(w.mask)) + w.mask.sort() + if w.filename != "": parameters.SAVE = True w.params.plot_correlation_matrix() diff --git a/spectractor/tools.py b/spectractor/tools.py index 62dbdffc7..45f407a90 100644 --- a/spectractor/tools.py +++ b/spectractor/tools.py @@ -1521,6 +1521,54 @@ def fftconvolve_gaussian(array, reso): return array +def mask_cosmics(data, maxiter=3, sigma_clip=5, border_mode='mirror', convolve_kernel_size=3): + """Simple method to mask cosmic rays, inspired from L.A. Cosmic algorithm. + + Parameters + ---------- + data + maxiter + border_mode + + Returns + ------- + mask: np.ndarray + + Examples + -------- + >>> data = np.zeros((50, 100)) + >>> data[20, 50:60] = 1 + >>> cr_mask = mask_cosmics(data, maxiter=3, convolve_kernel_size=0) + >>> fig = plt.figure() + >>> _ = plt.imshow(cr_mask, cmap='gray', aspect='auto', origin='lower') + >>> plt.show() + >>> assert np.sum(data) == np.sum(cr_mask) + + """ + from astropy.nddata import block_reduce, block_replicate + from scipy import ndimage + block_size = 2.0 + kernel = np.array([[0.0, -1.0, 0.0], [-1.0, 4.0, -1.0], [0.0, -1.0, 0.0]]) + + clean_data = data.copy() + final_crmask = np.zeros(data.shape, dtype=bool) + + for iteration in range(maxiter): + sampled_img = block_replicate(clean_data, block_size) + convolved_img = ndimage.convolve(sampled_img, kernel, + mode=border_mode) #.clip(min=0.0) + laplacian_img = block_reduce(convolved_img, block_size) + + final_crmask[laplacian_img > 5*np.nanstd(laplacian_img)] = True + clean_data[final_crmask] = np.nan + + if convolve_kernel_size > 0: + final_crmask = fftconvolve(final_crmask, + np.ones((convolve_kernel_size, convolve_kernel_size), dtype=int), + mode='same').astype(int) + return final_crmask.astype(bool) + + def formatting_numbers(value, error_high, error_low, std=None, label=None): """Format a physical value and its uncertainties. Round the uncertainties to the first significant digit, and do the same for the physical value. From 889e31e025ebdd4fb37f77e6daf6fcdc7c5c05d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Aug 2024 15:26:20 +0000 Subject: [PATCH 132/161] add mask_cosmics function --- spectractor/tools.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/spectractor/tools.py b/spectractor/tools.py index 62dbdffc7..0681180c0 100644 --- a/spectractor/tools.py +++ b/spectractor/tools.py @@ -1521,6 +1521,50 @@ def fftconvolve_gaussian(array, reso): return array +def mask_cosmics(data, maxiter=3, sigma_clip=5, border_mode='mirror', convolve_kernel_size=3): + """Simple method to mask cosmic rays, inspired from L.A. Cosmic algorithm. + + Parameters + ---------- + data + maxiter + border_mode + + Returns + ------- + mask: np.ndarray + + Examples + -------- + >>> from spectractor.extractor.spectrum import Spectrum + >>> spec = Spectrum("/Users/jneveu/Downloads/test_auxtel_spectrum.fits") + >>> cr_mask = mask_cosmics(spec.spectrogram_residuals.reshape((-1,spec.spectrogram_Nx))) + + """ + from astropy.nddata import block_reduce, block_replicate + from scipy import ndimage + block_size = 2.0 + kernel = np.array([[0.0, -1.0, 0.0], [-1.0, 4.0, -1.0], [0.0, -1.0, 0.0]]) + + clean_data = data.copy() + final_crmask = np.zeros(data.shape, dtype=bool) + + for iteration in range(maxiter): + sampled_img = block_replicate(clean_data, block_size) + convolved_img = ndimage.convolve(sampled_img, kernel, + mode=border_mode) #.clip(min=0.0) + laplacian_img = block_reduce(convolved_img, block_size) + + final_crmask[laplacian_img > 5*np.nanstd(laplacian_img)] = True + clean_data[final_crmask] = np.nan + + if convolve_kernel_size > 0: + final_crmask = fftconvolve(final_crmask, + np.ones((convolve_kernel_size, convolve_kernel_size), dtype=int), + mode='same').astype(int) + return final_crmask.astype(bool) + + def formatting_numbers(value, error_high, error_low, std=None, label=None): """Format a physical value and its uncertainties. Round the uncertainties to the first significant digit, and do the same for the physical value. From eb5ebcb1c5f7696016c046b92f604f69d1626de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Aug 2024 15:27:19 +0000 Subject: [PATCH 133/161] for doublemoffat class change eta upper bound to 1 --- spectractor/extractor/psf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/extractor/psf.py b/spectractor/extractor/psf.py index 3e66814b6..4297cff0b 100644 --- a/spectractor/extractor/psf.py +++ b/spectractor/extractor/psf.py @@ -2139,7 +2139,7 @@ def __init__(self, values=None, clip=False): labels = ["amplitude", "x_c", "y_c", "gamma1", "alpha1", "eta", "gamma2", "alpha2", "saturation"] axis_names = ["$A$", r"$x_c$", r"$y_c$", r"$\gamma_1$", r"$\alpha_1$", r"$\eta$", r"$\gamma_2$", r"$\alpha_2$", "saturation"] bounds = [(0, np.inf), (-np.inf, np.inf), (-np.inf, np.inf), (1, np.inf), (1.1, 10), - (0, np.inf), (1, np.inf), (1.1, 10), (0, np.inf)] + (0, 1), (1, np.inf), (1.1, 10), (0, np.inf)] self.params = FitParameters(values=values, labels=labels, axis_names=axis_names, bounds=bounds) def apply_max_width_to_bounds(self, max_half_width=None): From e2ce07af2789fda915146757a961ee2c0422e563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Aug 2024 15:28:53 +0000 Subject: [PATCH 134/161] at the end transverse_fit_profile function outliers are detected using all psf parameters, not only gamma --- spectractor/extractor/chromaticpsf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index a00d7e328..6cdda08f7 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -1681,7 +1681,8 @@ def fit_transverse_PSF1D_profile(self, data, err, w, ws, pixel_step=1, bgd_model # keep only brightest transverse profiles selected_pixels = self.profile_params[:, 0] > 0.1 * np.max(self.profile_params[:, 0]) # then keep only profiles with first shape parameter (index=3) are not too deviant from its median value - selected_pixels = selected_pixels & (np.abs(self.profile_params[:, 3]) < 5 * np.median(self.profile_params[:, 3])) + for k in range(3, self.profile_params.shape[1]): + selected_pixels = selected_pixels & (np.abs(self.profile_params[:, k]) < 5 * np.median(self.profile_params[:, k])) self.params.values = self.from_profile_params_to_poly_params(self.profile_params, indices=selected_pixels) self.from_profile_params_to_shape_params(self.profile_params) self.cov_matrix = np.diag(1 / np.array(self.table['flux_err']) ** 2) From f3226e61718dafc50554a43333cd59d55719a063 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Aug 2024 15:32:10 +0000 Subject: [PATCH 135/161] use ratio 2/1 for holo4_003 where a hologram transmission model is fitted on ratio data where BG40 data are rescaled by a factor 1.09 --- .../extractor/dispersers/holo4_003/NOTES | 2 +- .../holo4_003/ratio_order_2over1.txt | 1600 ++++++++--------- 2 files changed, 801 insertions(+), 801 deletions(-) diff --git a/spectractor/extractor/dispersers/holo4_003/NOTES b/spectractor/extractor/dispersers/holo4_003/NOTES index 2b1ee98e9..0a041036b 100644 --- a/spectractor/extractor/dispersers/holo4_003/NOTES +++ b/spectractor/extractor/dispersers/holo4_003/NOTES @@ -1,5 +1,5 @@ - transmission.txt : prediction from the chimera built with LPNHE optical test bench measurements between 430 and 1000nm, then extrapolating with an hologram efficiency model fitted on data -- ratio_order_2over1.txt : computed using separated extraction of spectrum order 1 and 2 from BG40 exposures, nights 20220608, 20220628, 20220629 and 20220630 with ratio 3/2 model, CCD_REBIN=2 with Savitsky Golay filter, extrapolated fitting an hologram transmission model (see ratio_order_2over1_from_fit.txt) +- ratio_order_2over1.txt : computed using separated extraction of spectrum order 1 and 2 from BG40 exposures, nights 20220608, 20220628, 20220629 and 20220630 with ratio 3/2 model, CCD_REBIN=2 with Savitsky Golay filter, extrapolated fitting an hologram transmission model with BG40 data rescaled by a factor 1.09 (see ratio_order_2over1_from_fit_bg401.09.txt) - ratio_order_3over2.txt : prediction from the chimera built with LPNHE optical test bench measurements between 430 and 1000nm, rescaled with the estimate using SDSSg filter ratio of orders, extrapolated fitting an hologram transmission model (see ratio_order_2over1_from_fit.txt) #- ratio_order_2over1.txt : computed using separated extraction of spectrum order 1 and 2 from BG40 exposures, nights 20220608, 20220628, 20220629 and 20220630 with ratio 3/2 model, CCD_REBIN=2 with Savitsky Golay filter #- ratio_order_3over2.txt : prediction from the chimera built with LPNHE optical test bench measurements between 430 and 1000nm, rescaled with the estimate using SDSSg filter ratio of orders diff --git a/spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt b/spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt index 4b12af8f1..b6563b307 100644 --- a/spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt +++ b/spectractor/extractor/dispersers/holo4_003/ratio_order_2over1.txt @@ -1,800 +1,800 @@ -3.000000000000000000e+02 1.375196993384676658e-01 -3.010000000000000000e+02 1.148794318163027517e-01 -3.020000000000000000e+02 9.490222350357831183e-02 -3.030000000000000000e+02 7.735086209745876962e-02 -3.040000000000000000e+02 6.204249593194603035e-02 -3.050000000000000000e+02 4.884053055081664929e-02 -3.060000000000000000e+02 3.764863700539566871e-02 -3.070000000000000000e+02 2.840642566497900492e-02 -3.080000000000000000e+02 2.108646405197598522e-02 -3.090000000000000000e+02 1.569240891423372142e-02 -3.100000000000000000e+02 1.225809106846927933e-02 -3.110000000000000000e+02 1.084744315406127764e-02 -3.120000000000000000e+02 1.155519988046073768e-02 -3.130000000000000000e+02 1.450833065473079546e-02 -3.140000000000000000e+02 1.986818747794508871e-02 -3.150000000000000000e+02 2.783336754907148047e-02 -3.160000000000000000e+02 3.864330002388263741e-02 -3.170000000000000000e+02 5.258256875017554288e-02 -3.180000000000000000e+02 6.998597524809667403e-02 -3.190000000000000000e+02 9.124432491347865548e-02 -3.200000000000000000e+02 1.168108785874574784e-01 -3.210000000000000000e+02 1.472083428297892016e-01 -3.220000000000000000e+02 1.830361636383368018e-01 -3.230000000000000000e+02 2.249777239274205198e-01 -3.240000000000000000e+02 2.738068038371947455e-01 -3.250000000000000000e+02 3.303923188433796621e-01 -3.260000000000000000e+02 3.956998737968978608e-01 -3.270000000000000000e+02 4.707880318944210885e-01 -3.280000000000000000e+02 5.567963764265303483e-01 -3.290000000000000000e+02 6.549214486136448743e-01 -3.300000000000000000e+02 7.663755463830008718e-01 -3.310000000000000000e+02 8.923223478884041437e-01 -3.320000000000000000e+02 1.033782743649253488e+00 -3.330000000000000000e+02 1.191504747417050591e+00 -3.340000000000000000e+02 1.365793844438335514e+00 -3.350000000000000000e+02 1.556305812750571782e+00 -3.360000000000000000e+02 1.761814046349465590e+00 -3.370000000000000000e+02 1.979978076965569489e+00 -3.380000000000000000e+02 2.207157762071574769e+00 -3.390000000000000000e+02 2.438333688155275958e+00 -3.400000000000000000e+02 2.667200261324630173e+00 -3.410000000000000000e+02 2.886483478563668381e+00 -3.420000000000000000e+02 3.088493799912809479e+00 -3.430000000000000000e+02 3.265860129939112788e+00 -3.440000000000000000e+02 3.412323289469711529e+00 -3.450000000000000000e+02 3.523426536989169300e+00 -3.460000000000000000e+02 3.596951493602348560e+00 -3.470000000000000000e+02 3.633012480717904946e+00 -3.480000000000000000e+02 3.633815578688332160e+00 -3.490000000000000000e+02 3.603171672419537952e+00 -3.500000000000000000e+02 3.545895217416231038e+00 -3.510000000000000000e+02 3.467215628879384060e+00 -3.520000000000000000e+02 3.372290487892572575e+00 -3.530000000000000000e+02 3.265861698961923576e+00 -3.540000000000000000e+02 3.152055284182587069e+00 -3.550000000000000000e+02 3.034300699151680103e+00 -3.560000000000000000e+02 2.915335977922085764e+00 -3.570000000000000000e+02 2.797266005484678963e+00 -3.580000000000000000e+02 2.681647557543167082e+00 -3.590000000000000000e+02 2.569582530867592585e+00 -3.600000000000000000e+02 2.461807804650376852e+00 -3.610000000000000000e+02 2.358775552840453926e+00 -3.620000000000000000e+02 2.260721498246372807e+00 -3.630000000000000000e+02 2.167720853860855890e+00 -3.640000000000000000e+02 2.079732922657751892e+00 -3.650000000000000000e+02 1.996635874843193603e+00 -3.660000000000000000e+02 1.918253360365562710e+00 -3.670000000000000000e+02 1.844374530598193340e+00 -3.680000000000000000e+02 1.774768855344367013e+00 -3.690000000000000000e+02 1.709196900025830690e+00 -3.700000000000000000e+02 1.647418011294166762e+00 -3.710000000000000000e+02 1.589195665544876679e+00 -3.720000000000000000e+02 1.534301070485480034e+00 -3.730000000000000000e+02 1.482515475295091534e+00 -3.740000000000000000e+02 1.433631537264090428e+00 -3.750000000000000000e+02 1.387454008208677925e+00 -3.760000000000000000e+02 1.343799938341827538e+00 -3.770000000000000000e+02 1.302498544902949806e+00 -3.780000000000000000e+02 1.263390854475725300e+00 -3.790000000000000000e+02 1.226329198890880878e+00 -3.800000000000000000e+02 1.191176622770828697e+00 -3.810000000000000000e+02 1.157806244429178344e+00 -3.820000000000000000e+02 1.126100599671812530e+00 -3.830000000000000000e+02 1.095950989035169965e+00 -3.840000000000000000e+02 1.067256842364508573e+00 -3.850000000000000000e+02 1.039925109782515511e+00 -3.860000000000000000e+02 1.013869684581203190e+00 -3.870000000000000000e+02 9.890108610420870194e-01 -3.880000000000000000e+02 9.652748284003803692e-01 -3.890000000000000000e+02 9.425932009233340958e-01 -3.900000000000000000e+02 9.209025832257614619e-01 -3.910000000000000000e+02 9.001441693940476219e-01 -3.920000000000000000e+02 8.802633741475212048e-01 -3.930000000000000000e+02 8.612094940778729502e-01 -3.940000000000000000e+02 8.429353969263738700e-01 -3.950000000000000000e+02 8.253972368534254755e-01 -3.960000000000000000e+02 8.085541937005903401e-01 -3.970000000000000000e+02 7.923682343256113203e-01 -3.980000000000000000e+02 7.768038941903562256e-01 -3.990000000000000000e+02 7.618280774948955614e-01 -4.000000000000000000e+02 7.474098742678558782e-01 -4.010000000000000000e+02 7.335203929410564205e-01 -4.020000000000000000e+02 7.201326070526395950e-01 -4.030000000000000000e+02 7.072212148329793946e-01 -4.040000000000000000e+02 6.947625105339171325e-01 -4.050000000000000000e+02 6.827342664594757693e-01 -4.060000000000000000e+02 6.711156247489294957e-01 -4.070000000000000000e+02 6.598869980471987473e-01 -4.080000000000000000e+02 6.490299782761819181e-01 -4.090000000000000000e+02 6.385272527920262675e-01 -4.100000000000000000e+02 6.283625272786078630e-01 -4.110000000000000000e+02 6.185204547874053604e-01 -4.120000000000000000e+02 6.089865703880761316e-01 -4.130000000000000000e+02 5.997472309431893800e-01 -4.140000000000000000e+02 5.907895595655281440e-01 -4.150000000000000000e+02 5.821013943568177362e-01 -4.160000000000000000e+02 5.736712410634341452e-01 -4.170000000000000000e+02 5.654882293179414043e-01 -4.180000000000000000e+02 5.575420721653520095e-01 -4.190000000000000000e+02 5.498230286005463263e-01 -4.200000000000000000e+02 5.423218688674458221e-01 -4.210000000000000000e+02 5.350298422933366105e-01 -4.220000000000000000e+02 5.279386474518455996e-01 -4.230000000000000000e+02 5.210404044660734701e-01 -4.240000000000000000e+02 5.143276292804849215e-01 -4.250000000000000000e+02 5.077932097447476201e-01 -4.260000000000000000e+02 5.014303833665973986e-01 -4.270000000000000000e+02 4.952327166030171535e-01 -4.280000000000000000e+02 4.891940855703422741e-01 -4.290000000000000000e+02 4.833086580639807672e-01 -4.300000000000000000e+02 4.775708767877461236e-01 -4.310000000000000000e+02 4.719754437012009252e-01 -4.320000000000000000e+02 4.665173054010368081e-01 -4.330000000000000000e+02 4.611916394594177682e-01 -4.340000000000000000e+02 4.559938416486444823e-01 -4.350000000000000000e+02 4.509195139872385072e-01 -4.360000000000000000e+02 4.459644535476448013e-01 -4.370000000000000000e+02 4.411246419708694799e-01 -4.380000000000000000e+02 4.363962356373117801e-01 -4.390000000000000000e+02 4.317755564475641572e-01 -4.400000000000000000e+02 4.272590831700543434e-01 -4.410000000000000000e+02 4.228434433161886163e-01 -4.420000000000000000e+02 4.185254055065021350e-01 -4.430000000000000000e+02 4.143018722940978171e-01 -4.440000000000000000e+02 4.101698734143596203e-01 -4.450000000000000000e+02 4.061265594321264993e-01 -4.460000000000000000e+02 4.021691957597747780e-01 -4.470000000000000000e+02 3.982951570215663151e-01 -4.480000000000000000e+02 3.945019217415195456e-01 -4.490000000000000000e+02 3.907870673336293899e-01 -4.500000000000000000e+02 3.871482653748795633e-01 -4.510000000000000000e+02 3.835832771428268617e-01 -4.520000000000000000e+02 3.800899494009965518e-01 -4.530000000000000000e+02 3.766662104162896152e-01 -4.540000000000000000e+02 3.733100661939305898e-01 -4.550000000000000000e+02 3.700195969163551646e-01 -4.560000000000000000e+02 3.667929535734908431e-01 -4.570000000000000000e+02 3.636283547726303356e-01 -4.580000000000000000e+02 3.605240837170427537e-01 -4.590000000000000000e+02 3.574784853431044462e-01 -4.600000000000000000e+02 3.544899636064058335e-01 -4.610000000000000000e+02 3.515569789080635887e-01 -4.620000000000000000e+02 3.486780456529197103e-01 -4.630000000000000000e+02 3.458517299319014970e-01 -4.640000000000000000e+02 3.430766473212945589e-01 -4.650000000000000000e+02 3.403514607922722979e-01 -4.660000000000000000e+02 3.376748787242742078e-01 -4.670000000000000000e+02 3.350456530163856694e-01 -4.680000000000000000e+02 3.324625772911450339e-01 -4.690000000000000000e+02 3.299244851856524829e-01 -4.700000000000000000e+02 3.274302487250633220e-01 -4.710000000000000000e+02 3.249787767739680810e-01 -4.720000000000000000e+02 3.225690135613545895e-01 -4.730000000000000000e+02 3.201999372751603845e-01 -4.740000000000000000e+02 3.178705587226478002e-01 -4.750000000000000000e+02 3.155799200530782223e-01 -4.760000000000000000e+02 3.133270935393506207e-01 -4.770000000000000000e+02 3.111111804154868543e-01 -4.780000000000000000e+02 3.089313097670201014e-01 -4.790000000000000000e+02 3.067866374715769728e-01 -4.800000000000000000e+02 3.046763451869432537e-01 -4.810000000000000000e+02 3.025996393842827481e-01 -4.820000000000000000e+02 3.005557504241232469e-01 -4.830000000000000000e+02 2.985439316729701642e-01 -4.840000000000000000e+02 2.965634586584907639e-01 -4.850000000000000000e+02 2.946136282613167068e-01 -4.860000000000000000e+02 2.926937579416843960e-01 -4.870000000000000000e+02 2.908031849991328799e-01 -4.880000000000000000e+02 2.889412658636900111e-01 -4.890000000000000000e+02 2.871073754169614078e-01 -4.900000000000000000e+02 2.853009063417092928e-01 -4.910000000000000000e+02 2.835212684985126685e-01 -4.920000000000000000e+02 2.817678883282564439e-01 -4.930000000000000000e+02 2.800402082791625946e-01 -4.940000000000000000e+02 2.783376862572609078e-01 -4.950000000000000000e+02 2.766597950991546151e-01 -4.960000000000000000e+02 2.750060220660593413e-01 -4.970000000000000000e+02 2.733758683581199445e-01 -4.980000000000000000e+02 2.717688486480933086e-01 -4.990000000000000000e+02 2.701844906334607277e-01 -5.000000000000000000e+02 2.686223346061878958e-01 -5.010000000000000000e+02 2.670819330392825708e-01 -5.020000000000000000e+02 2.655628501894329307e-01 -5.030000000000000000e+02 2.640646617149829400e-01 -5.040000000000000000e+02 2.625869543085715407e-01 -5.050000000000000000e+02 2.611293253437843576e-01 -5.060000000000000000e+02 2.596913825352153982e-01 -5.070000000000000000e+02 2.582727436113309016e-01 -5.080000000000000000e+02 2.568730359995868850e-01 -5.090000000000000000e+02 2.554918965232875205e-01 -5.100000000000000000e+02 2.541289711096627602e-01 -5.110000000000000000e+02 2.527839145086937522e-01 -5.120000000000000000e+02 2.514563900222213100e-01 -5.130000000000000000e+02 2.501460692429048338e-01 -5.140000000000000000e+02 2.488526318026602346e-01 -5.150000000000000000e+02 2.475757651300865558e-01 -5.160000000000000000e+02 2.463151642166299671e-01 -5.170000000000000000e+02 2.450705313910027938e-01 -5.180000000000000000e+02 2.438415761016357597e-01 -5.190000000000000000e+02 2.426280147067272908e-01 -5.200000000000000000e+02 2.414295702716698078e-01 -5.210000000000000000e+02 2.402459723734994834e-01 -5.220000000000000000e+02 2.390769569121214688e-01 -5.230000000000000000e+02 2.379222659279945085e-01 -5.240000000000000000e+02 2.367816474261073556e-01 -5.250000000000000000e+02 2.356548552058783941e-01 -5.260000000000000000e+02 2.345416486968476544e-01 -5.270000000000000000e+02 2.334417927998909958e-01 -5.280000000000000000e+02 2.323550577337347989e-01 -5.290000000000000000e+02 2.312812188865958907e-01 -5.300000000000000000e+02 2.302200566727157782e-01 -5.310000000000000000e+02 2.291713563936337017e-01 -5.320000000000000000e+02 2.281349081040016658e-01 -5.330000000000000000e+02 2.271105064817594554e-01 -5.340000000000000000e+02 2.260979507025354940e-01 -5.350000000000000000e+02 2.250970443180893843e-01 -5.360000000000000000e+02 2.241075951386504728e-01 -5.370000000000000000e+02 2.231294151190162389e-01 -5.380000000000000000e+02 2.221623202482787551e-01 -5.390000000000000000e+02 2.212061304430074093e-01 -5.400000000000000000e+02 2.202606694438176416e-01 -5.410000000000000000e+02 2.193257647151560519e-01 -5.420000000000000000e+02 2.184012473482151162e-01 -5.430000000000000000e+02 2.174869519668403695e-01 -5.440000000000000000e+02 2.165827166363491763e-01 -5.450000000000000000e+02 2.156883827751495675e-01 -5.460000000000000000e+02 2.148037950690249442e-01 -5.470000000000000000e+02 2.139288013880628614e-01 -5.480000000000000000e+02 2.130632527060586923e-01 -5.490000000000000000e+02 2.122070030223569270e-01 -5.500000000000000000e+02 2.113599092860327378e-01 -5.510000000000000000e+02 2.105218313223237991e-01 -5.520000000000000000e+02 2.096926317612486379e-01 -5.530000000000000000e+02 2.088721759683206114e-01 -5.540000000000000000e+02 2.080603319772994231e-01 -5.550000000000000000e+02 2.072569704249176969e-01 -5.560000000000000000e+02 2.064619644874903792e-01 -5.570000000000000000e+02 2.056751898193578953e-01 -5.580000000000000000e+02 2.048965244931146568e-01 -5.590000000000000000e+02 2.041258489415463395e-01 -5.600000000000000000e+02 2.033630459012148728e-01 -5.610000000000000000e+02 2.026080003576562205e-01 -5.620000000000000000e+02 2.018605994921285063e-01 -5.630000000000000000e+02 2.011207326298440901e-01 -5.640000000000000000e+02 2.003882911896737729e-01 -5.650000000000000000e+02 1.996631686352361712e-01 -5.660000000000000000e+02 1.989452604273535263e-01 -5.670000000000000000e+02 1.982344639778164663e-01 -5.680000000000000000e+02 1.975306786044317420e-01 -5.690000000000000000e+02 1.968338054872833531e-01 -5.700000000000000000e+02 1.961437476262080093e-01 -5.710000000000000000e+02 1.954604097994022405e-01 -5.720000000000000000e+02 1.947836985231734819e-01 -5.730000000000000000e+02 1.941135220127536698e-01 -5.740000000000000000e+02 1.934497901441677992e-01 -5.750000000000000000e+02 1.927924144171384302e-01 -5.760000000000000000e+02 1.921413079189405460e-01 -5.770000000000000000e+02 1.914963852892475060e-01 -5.780000000000000000e+02 1.908575626858804164e-01 -5.790000000000000000e+02 1.902247577514702692e-01 -5.800000000000000000e+02 1.895978895809742881e-01 -5.810000000000000000e+02 1.889768786900545006e-01 -5.820000000000000000e+02 1.883616469842668839e-01 -5.830000000000000000e+02 1.877521177290443766e-01 -5.840000000000000000e+02 1.871482155204517717e-01 -5.850000000000000000e+02 1.865498662566866805e-01 -5.860000000000000000e+02 1.859569971103169073e-01 -5.870000000000000000e+02 1.853695365012026919e-01 -5.880000000000000000e+02 1.847874140701262768e-01 -5.890000000000000000e+02 1.842105606530616557e-01 -5.900000000000000000e+02 1.836389082561044050e-01 -5.910000000000000000e+02 1.830723900310256558e-01 -5.920000000000000000e+02 1.825109402514278889e-01 -5.930000000000000000e+02 1.819544942894908701e-01 -5.940000000000000000e+02 1.814029885932988695e-01 -5.950000000000000000e+02 1.808563606647166366e-01 -5.960000000000000000e+02 1.803145490378097460e-01 -5.970000000000000000e+02 1.797774932577902163e-01 -5.980000000000000000e+02 1.792451338604707789e-01 -5.990000000000000000e+02 1.787174123522242697e-01 -6.000000000000000000e+02 1.781942711904106469e-01 -6.010000000000000000e+02 1.776756537642888711e-01 -6.020000000000000000e+02 1.771615043435660064e-01 -6.030000000000000000e+02 1.766517681917462446e-01 -6.040000000000000000e+02 1.761463913827418515e-01 -6.050000000000000000e+02 1.756453207867278987e-01 -6.060000000000000000e+02 1.751485042140254467e-01 -6.070000000000000000e+02 1.746558902689490100e-01 -6.080000000000000000e+02 1.741674283661302780e-01 -6.090000000000000000e+02 1.736830687147430941e-01 -6.100000000000000000e+02 1.732027623030943653e-01 -6.110000000000000000e+02 1.727264608835598625e-01 -6.120000000000000000e+02 1.722541169578780673e-01 -6.130000000000000000e+02 1.717856837627745048e-01 -6.140000000000000000e+02 1.713211152559170058e-01 -6.150000000000000000e+02 1.708603661021853293e-01 -6.160000000000000000e+02 1.704033916602639420e-01 -6.170000000000000000e+02 1.699501479695191275e-01 -6.180000000000000000e+02 1.695005917371882054e-01 -6.190000000000000000e+02 1.690546803258453357e-01 -6.200000000000000000e+02 1.686123717411563694e-01 -6.210000000000000000e+02 1.681736246198889118e-01 -6.220000000000000000e+02 1.677383982182137079e-01 -6.230000000000000000e+02 1.673066524002369548e-01 -6.240000000000000000e+02 1.668783476268080046e-01 -6.250000000000000000e+02 1.664534449445581321e-01 -6.260000000000000000e+02 1.660319059751846904e-01 -6.270000000000000000e+02 1.656136929049655537e-01 -6.280000000000000000e+02 1.651987684745031826e-01 -6.290000000000000000e+02 1.647870959686940084e-01 -6.300000000000000000e+02 1.643786392069029323e-01 -6.310000000000000000e+02 1.639733625333615885e-01 -6.320000000000000000e+02 1.635712308077605370e-01 -6.330000000000000000e+02 1.631722093960533970e-01 -6.340000000000000000e+02 1.627762641614442785e-01 -6.350000000000000000e+02 1.623833614555767191e-01 -6.360000000000000000e+02 1.619934681099056972e-01 -6.370000000000000000e+02 1.616065514272382597e-01 -6.380000000000000000e+02 1.612225791734774594e-01 -6.390000000000000000e+02 1.608415195695130917e-01 -6.400000000000000000e+02 1.604633412832952855e-01 -6.410000000000000000e+02 1.600880134220697970e-01 -6.420000000000000000e+02 1.597155055247714561e-01 -6.430000000000000000e+02 1.593457875545740698e-01 -6.440000000000000000e+02 1.589788298916008091e-01 -6.450000000000000000e+02 1.586146033257733734e-01 -6.460000000000000000e+02 1.582530790498115625e-01 -6.470000000000000000e+02 1.578942286523798422e-01 -6.480000000000000000e+02 1.575380241113608637e-01 -6.490000000000000000e+02 1.571844377872793352e-01 -6.500000000000000000e+02 1.568334424168470187e-01 -6.510000000000000000e+02 1.564850111066434790e-01 -6.520000000000000000e+02 1.561391173269168764e-01 -6.530000000000000000e+02 1.557957349055201779e-01 -6.540000000000000000e+02 1.554548380219512305e-01 -6.550000000000000000e+02 1.551164012015274762e-01 -6.560000000000000000e+02 1.547803993096629471e-01 -6.570000000000000000e+02 1.544468075462648027e-01 -6.580000000000000000e+02 1.541156014402393082e-01 -6.590000000000000000e+02 1.537867568440994259e-01 -6.600000000000000000e+02 1.534602499286881194e-01 -6.610000000000000000e+02 1.531360571779925017e-01 -6.620000000000000000e+02 1.528141553840649813e-01 -6.630000000000000000e+02 1.524945216420463545e-01 -6.640000000000000000e+02 1.521771333452694164e-01 -6.650000000000000000e+02 1.518619681804810606e-01 -6.660000000000000000e+02 1.515490041231268015e-01 -6.670000000000000000e+02 1.512382194327490104e-01 -6.680000000000000000e+02 1.509295926484607586e-01 -6.690000000000000000e+02 1.506231025845105598e-01 -6.700000000000000000e+02 1.503187283259222740e-01 -6.710000000000000000e+02 1.500164492242310188e-01 -6.720000000000000000e+02 1.497162448932860546e-01 -6.730000000000000000e+02 1.494180952051416267e-01 -6.740000000000000000e+02 1.491219802860143107e-01 -6.750000000000000000e+02 1.488278805123304516e-01 -6.760000000000000000e+02 1.485357765068309466e-01 -6.770000000000000000e+02 1.482456491347580174e-01 -6.780000000000000000e+02 1.479574795001100673e-01 -6.790000000000000000e+02 1.476712489419663155e-01 -6.800000000000000000e+02 1.473869390308726324e-01 -6.810000000000000000e+02 1.471045315653030650e-01 -6.820000000000000000e+02 1.468240085681773444e-01 -6.830000000000000000e+02 1.465453522834480604e-01 -6.840000000000000000e+02 1.462685451727469277e-01 -6.850000000000000000e+02 1.459935699120862851e-01 -6.860000000000000000e+02 1.457204093886343144e-01 -6.870000000000000000e+02 1.454490466975295604e-01 -6.880000000000000000e+02 1.451794651387686153e-01 -6.890000000000000000e+02 1.449116482141396545e-01 -6.900000000000000000e+02 1.446455796242149261e-01 -6.910000000000000000e+02 1.443812432653953093e-01 -6.920000000000000000e+02 1.441186232270041945e-01 -6.930000000000000000e+02 1.438577037884403720e-01 -6.940000000000000000e+02 1.435984694163715825e-01 -6.950000000000000000e+02 1.433409047619862153e-01 -6.960000000000000000e+02 1.430849946582856691e-01 -6.970000000000000000e+02 1.428307241174262832e-01 -6.980000000000000000e+02 1.425780783281141439e-01 -6.990000000000000000e+02 1.423270426530306443e-01 -7.000000000000000000e+02 1.420776026263178560e-01 -7.010000000000000000e+02 1.418297439510987079e-01 -7.020000000000000000e+02 1.415834524970389086e-01 -7.030000000000000000e+02 1.413387142979579958e-01 -7.040000000000000000e+02 1.410955155494731383e-01 -7.050000000000000000e+02 1.408538426066892890e-01 -7.060000000000000000e+02 1.406136819819222561e-01 -7.070000000000000000e+02 1.403750203424682375e-01 -7.080000000000000000e+02 1.401378445084048019e-01 -7.090000000000000000e+02 1.399021414504308669e-01 -7.100000000000000000e+02 1.396678982877458952e-01 -7.110000000000000000e+02 1.394351022859569855e-01 -7.120000000000000000e+02 1.392037408550322874e-01 -7.130000000000000000e+02 1.389738015472771759e-01 -7.140000000000000000e+02 1.387452720553528640e-01 -7.150000000000000000e+02 1.385181402103203563e-01 -7.160000000000000000e+02 1.382923939797251200e-01 -7.170000000000000000e+02 1.380680214657072358e-01 -7.180000000000000000e+02 1.378450109031419957e-01 -7.190000000000000000e+02 1.376233506578171950e-01 -7.200000000000000000e+02 1.374030292246330165e-01 -7.210000000000000000e+02 1.371840352258389684e-01 -7.220000000000000000e+02 1.369663574092904734e-01 -7.230000000000000000e+02 1.367499846467421509e-01 -7.240000000000000000e+02 1.365349059321644964e-01 -7.250000000000000000e+02 1.363211103800867352e-01 -7.260000000000000000e+02 1.361085872239716776e-01 -7.270000000000000000e+02 1.358973258146107255e-01 -7.280000000000000000e+02 1.356873156185454399e-01 -7.290000000000000000e+02 1.354785462165191412e-01 -7.300000000000000000e+02 1.352710073019500470e-01 -7.310000000000000000e+02 1.350646886794264756e-01 -7.320000000000000000e+02 1.348595802632291674e-01 -7.330000000000000000e+02 1.346556720758768644e-01 -7.340000000000000000e+02 1.344529542466919025e-01 -7.350000000000000000e+02 1.342514170103931148e-01 -7.360000000000000000e+02 1.340510507057060263e-01 -7.370000000000000000e+02 1.338518457739976686e-01 -7.380000000000000000e+02 1.336537927579313778e-01 -7.390000000000000000e+02 1.334568823001454352e-01 -7.400000000000000000e+02 1.332611051419475001e-01 -7.410000000000000000e+02 1.330664521220330521e-01 -7.420000000000000000e+02 1.328729141752216514e-01 -7.430000000000000000e+02 1.326804823312139614e-01 -7.440000000000000000e+02 1.324891477133673112e-01 -7.450000000000000000e+02 1.322989015374920752e-01 -7.460000000000000000e+02 1.321097351106583495e-01 -7.470000000000000000e+02 1.319216398300366300e-01 -7.480000000000000000e+02 1.317346071817368236e-01 -7.490000000000000000e+02 1.315486287396825937e-01 -7.500000000000000000e+02 1.313636961644892853e-01 -7.510000000000000000e+02 1.311798012023666360e-01 -7.520000000000000000e+02 1.309969356840380017e-01 -7.530000000000000000e+02 1.308150915236682699e-01 -7.540000000000000000e+02 1.306342607178183901e-01 -7.550000000000000000e+02 1.304544353444075100e-01 -7.560000000000000000e+02 1.302756075616954834e-01 -7.570000000000000000e+02 1.300977696072762868e-01 -7.580000000000000000e+02 1.299209137970908645e-01 -7.590000000000000000e+02 1.297450325244504654e-01 -7.600000000000000000e+02 1.295701182590793532e-01 -7.610000000000000000e+02 1.293961635461650939e-01 -7.620000000000000000e+02 1.292231610054299651e-01 -7.630000000000000000e+02 1.290511033302104704e-01 -7.640000000000000000e+02 1.288799832865510919e-01 -7.650000000000000000e+02 1.287097937123174718e-01 -7.660000000000000000e+02 1.285405275163115646e-01 -7.670000000000000000e+02 1.283721776774102985e-01 -7.680000000000000000e+02 1.282047372437107036e-01 -7.690000000000000000e+02 1.280381993316879186e-01 -7.700000000000000000e+02 1.278725571253688242e-01 -7.710000000000000000e+02 1.277078038755122547e-01 -7.720000000000000000e+02 1.275439328988054732e-01 -7.730000000000000000e+02 1.273809375770720564e-01 -7.740000000000000000e+02 1.272188113564852174e-01 -7.750000000000000000e+02 1.270575477468026127e-01 -7.760000000000000000e+02 1.268971403206005655e-01 -7.770000000000000000e+02 1.267375827125301058e-01 -7.780000000000000000e+02 1.265788686185743694e-01 -7.790000000000000000e+02 1.264209917953211526e-01 -7.800000000000000000e+02 1.262639460592484830e-01 -7.810000000000000000e+02 1.261077252860119124e-01 -7.820000000000000000e+02 1.259523234097486566e-01 -7.830000000000000000e+02 1.257977344223920324e-01 -7.840000000000000000e+02 1.256439523729893926e-01 -7.850000000000000000e+02 1.254909713670352700e-01 -7.860000000000000000e+02 1.253387855658114891e-01 -7.870000000000000000e+02 1.251873891857347154e-01 -7.880000000000000000e+02 1.250367764977200480e-01 -7.890000000000000000e+02 1.248869418265423359e-01 -7.900000000000000000e+02 1.247378795502165627e-01 -7.910000000000000000e+02 1.245895840993819365e-01 -7.920000000000000000e+02 1.244420499566942090e-01 -7.930000000000000000e+02 1.242952716562259613e-01 -7.940000000000000000e+02 1.241492437828803086e-01 -7.950000000000000000e+02 1.240039609718049246e-01 -7.960000000000000000e+02 1.238594179078202906e-01 -7.970000000000000000e+02 1.237156093248517608e-01 -7.980000000000000000e+02 1.235725300053710229e-01 -7.990000000000000000e+02 1.234301747798454418e-01 -8.000000000000000000e+02 1.232885385261939526e-01 -8.010000000000000000e+02 1.231476161692508092e-01 -8.020000000000000000e+02 1.230074026802350229e-01 -8.030000000000000000e+02 1.228678930762312493e-01 -8.040000000000000000e+02 1.227290824196717867e-01 -8.050000000000000000e+02 1.225909658178292172e-01 -8.060000000000000000e+02 1.224535384223158357e-01 -8.070000000000000000e+02 1.223167954285864500e-01 -8.080000000000000000e+02 1.221807320754543513e-01 -8.090000000000000000e+02 1.220453436446048839e-01 -8.100000000000000000e+02 1.219106254601221018e-01 -8.110000000000000000e+02 1.217765728880213644e-01 -8.120000000000000000e+02 1.216431813357826131e-01 -8.130000000000000000e+02 1.215104462518972472e-01 -8.140000000000000000e+02 1.213783631254127249e-01 -8.150000000000000000e+02 1.212469274854940937e-01 -8.160000000000000000e+02 1.211161349009783755e-01 -8.170000000000000000e+02 1.209859809799447711e-01 -8.180000000000000000e+02 1.208564613692843792e-01 -8.190000000000000000e+02 1.207275717542811572e-01 -8.200000000000000000e+02 1.205993078581916039e-01 -8.210000000000000000e+02 1.204716654418368504e-01 -8.220000000000000000e+02 1.203446403031917661e-01 -8.230000000000000000e+02 1.202182282769889698e-01 -8.240000000000000000e+02 1.200924252343202325e-01 -8.250000000000000000e+02 1.199672270822458447e-01 -8.260000000000000000e+02 1.198426297634096749e-01 -8.270000000000000000e+02 1.197186292556593340e-01 -8.280000000000000000e+02 1.195952215716679506e-01 -8.290000000000000000e+02 1.194724027585634535e-01 -8.300000000000000000e+02 1.193501688975628638e-01 -8.310000000000000000e+02 1.192285161036113345e-01 -8.320000000000000000e+02 1.191074405250234086e-01 -8.330000000000000000e+02 1.189869383431292338e-01 -8.340000000000000000e+02 1.188670057719286438e-01 -8.350000000000000000e+02 1.187476390577470314e-01 -8.360000000000000000e+02 1.186288344788918869e-01 -8.370000000000000000e+02 1.185105883453243109e-01 -8.380000000000000000e+02 1.183928969983197715e-01 -8.390000000000000000e+02 1.182757568101472367e-01 -8.400000000000000000e+02 1.181591641837432677e-01 -8.410000000000000000e+02 1.180431155523922887e-01 -8.420000000000000000e+02 1.179276073794141844e-01 -8.430000000000000000e+02 1.178126361578502035e-01 -8.440000000000000000e+02 1.176981984101587025e-01 -8.450000000000000000e+02 1.175842906879083216e-01 -8.460000000000000000e+02 1.174709095714794732e-01 -8.470000000000000000e+02 1.173580516697685372e-01 -8.480000000000000000e+02 1.172457136198948729e-01 -8.490000000000000000e+02 1.171338920869120920e-01 -8.500000000000000000e+02 1.170225837635221894e-01 -8.510000000000000000e+02 1.169117853697922427e-01 -8.520000000000000000e+02 1.168014936528796455e-01 -8.530000000000000000e+02 1.166917053867518178e-01 -8.540000000000000000e+02 1.165824173719189477e-01 -8.550000000000000000e+02 1.164736264351621947e-01 -8.560000000000000000e+02 1.163653294292692486e-01 -8.570000000000000000e+02 1.162575232327723584e-01 -8.580000000000000000e+02 1.161502047496897339e-01 -8.590000000000000000e+02 1.160433709092682786e-01 -8.600000000000000000e+02 1.159370186657307233e-01 -8.610000000000000000e+02 1.158311449980273383e-01 -8.620000000000000000e+02 1.157257469095881036e-01 -8.630000000000000000e+02 1.156208214280777524e-01 -8.640000000000000000e+02 1.155163656051554077e-01 -8.650000000000000000e+02 1.154123765190639694e-01 -8.660000000000000000e+02 1.153088512630748436e-01 -8.670000000000000000e+02 1.152057869622507003e-01 -8.680000000000000000e+02 1.151031807618744379e-01 -8.690000000000000000e+02 1.150010298300601086e-01 -8.700000000000000000e+02 1.148993313575267239e-01 -8.710000000000000000e+02 1.147980825573793051e-01 -8.720000000000000000e+02 1.146972806648860199e-01 -8.730000000000000000e+02 1.145969229372656856e-01 -8.740000000000000000e+02 1.144970066534688052e-01 -8.750000000000000000e+02 1.143975291112577647e-01 -8.760000000000000000e+02 1.142984876378518588e-01 -8.770000000000000000e+02 1.141998795734209676e-01 -8.780000000000000000e+02 1.141017022817588239e-01 -8.790000000000000000e+02 1.140039531473567985e-01 -8.800000000000000000e+02 1.139066295752069607e-01 -8.810000000000000000e+02 1.138097289906028348e-01 -8.820000000000000000e+02 1.137132488389436674e-01 -8.830000000000000000e+02 1.136171865855429841e-01 -8.840000000000000000e+02 1.135215397154349798e-01 -8.850000000000000000e+02 1.134263057331900415e-01 -8.860000000000000000e+02 1.133314821627231100e-01 -8.870000000000000000e+02 1.132370665471139487e-01 -8.880000000000000000e+02 1.131430564484220691e-01 -8.890000000000000000e+02 1.130494494475066530e-01 -8.900000000000000000e+02 1.129562431438497910e-01 -8.910000000000000000e+02 1.128634351553777365e-01 -8.920000000000000000e+02 1.127710231182890571e-01 -8.930000000000000000e+02 1.126790046868823558e-01 -8.940000000000000000e+02 1.125873775333833121e-01 -8.950000000000000000e+02 1.124961393477777044e-01 -8.960000000000000000e+02 1.124052878376476799e-01 -8.970000000000000000e+02 1.123148207280011135e-01 -8.980000000000000000e+02 1.122247357611138863e-01 -8.990000000000000000e+02 1.121350306963663362e-01 -9.000000000000000000e+02 1.120457033100843575e-01 -9.010000000000000000e+02 1.119567513953821786e-01 -9.020000000000000000e+02 1.118681727620066818e-01 -9.030000000000000000e+02 1.117799652361824297e-01 -9.040000000000000000e+02 1.116921266604606888e-01 -9.050000000000000000e+02 1.116046548935675092e-01 -9.060000000000000000e+02 1.115175478102545109e-01 -9.070000000000000000e+02 1.114308033011527782e-01 -9.080000000000000000e+02 1.113444192726263104e-01 -9.090000000000000000e+02 1.112583936466275264e-01 -9.100000000000000000e+02 1.111727243605556553e-01 -9.110000000000000000e+02 1.110874093671137819e-01 -9.120000000000000000e+02 1.110024466341708316e-01 -9.130000000000000000e+02 1.109178341446235977e-01 -9.140000000000000000e+02 1.108335698962584909e-01 -9.150000000000000000e+02 1.107496519016191172e-01 -9.160000000000000000e+02 1.106660781878698319e-01 -9.170000000000000000e+02 1.105828467966657458e-01 -9.180000000000000000e+02 1.104999557840209007e-01 -9.190000000000000000e+02 1.104174032201786920e-01 -9.200000000000000000e+02 1.103351871894839020e-01 -9.210000000000000000e+02 1.102533057902584657e-01 -9.220000000000000000e+02 1.101717571346719354e-01 -9.230000000000000000e+02 1.100905393486206613e-01 -9.240000000000000000e+02 1.100096505716040840e-01 -9.250000000000000000e+02 1.099290889566041929e-01 -9.260000000000000000e+02 1.098488526699644974e-01 -9.270000000000000000e+02 1.097689398912720243e-01 -9.280000000000000000e+02 1.096893488132392597e-01 -9.290000000000000000e+02 1.096100776415877831e-01 -9.300000000000000000e+02 1.095311245949342899e-01 -9.310000000000000000e+02 1.094524879046762239e-01 -9.320000000000000000e+02 1.093741658148773138e-01 -9.330000000000000000e+02 1.092961565821597286e-01 -9.340000000000000000e+02 1.092184584755904742e-01 -9.350000000000000000e+02 1.091410697765749366e-01 -9.360000000000000000e+02 1.090639887787455964e-01 -9.370000000000000000e+02 1.089872137878586250e-01 -9.380000000000000000e+02 1.089107431216855965e-01 -9.390000000000000000e+02 1.088345751099099173e-01 -9.400000000000000000e+02 1.087587080940246032e-01 -9.410000000000000000e+02 1.086831404272250029e-01 -9.420000000000000000e+02 1.086078704743134171e-01 -9.430000000000000000e+02 1.085328966115946953e-01 -9.440000000000000000e+02 1.084582172267784250e-01 -9.450000000000000000e+02 1.083838307188786793e-01 -9.460000000000000000e+02 1.083097354981193278e-01 -9.470000000000000000e+02 1.082359299858364071e-01 -9.480000000000000000e+02 1.081624126143817394e-01 -9.490000000000000000e+02 1.080891818270307420e-01 -9.500000000000000000e+02 1.080162360778867542e-01 -9.510000000000000000e+02 1.079435738317899574e-01 -9.520000000000000000e+02 1.078711935642250597e-01 -9.530000000000000000e+02 1.077990937612315625e-01 -9.540000000000000000e+02 1.077272729193125556e-01 -9.550000000000000000e+02 1.076557295453476337e-01 -9.560000000000000000e+02 1.075844621565031217e-01 -9.570000000000000000e+02 1.075134692801473502e-01 -9.580000000000000000e+02 1.074427494537623234e-01 -9.590000000000000000e+02 1.073723012248589820e-01 -9.600000000000000000e+02 1.073021231508945322e-01 -9.610000000000000000e+02 1.072322137991859187e-01 -9.620000000000000000e+02 1.071625717468284444e-01 -9.630000000000000000e+02 1.070931955806155161e-01 -9.640000000000000000e+02 1.070240838969546970e-01 -9.650000000000000000e+02 1.069552353017884511e-01 -9.660000000000000000e+02 1.068866484105159831e-01 -9.670000000000000000e+02 1.068183218479119290e-01 -9.680000000000000000e+02 1.067502542480503469e-01 -9.690000000000000000e+02 1.066824442542275569e-01 -9.700000000000000000e+02 1.066148905188842033e-01 -9.710000000000000000e+02 1.065475917035315218e-01 -9.720000000000000000e+02 1.064805464786740541e-01 -9.730000000000000000e+02 1.064137535237385385e-01 -9.740000000000000000e+02 1.063472115269971374e-01 -9.750000000000000000e+02 1.062809191854974522e-01 -9.760000000000000000e+02 1.062148752049877493e-01 -9.770000000000000000e+02 1.061490782998490701e-01 -9.780000000000000000e+02 1.060835271930218177e-01 -9.790000000000000000e+02 1.060182206159362012e-01 -9.800000000000000000e+02 1.059531573084446648e-01 -9.810000000000000000e+02 1.058883360187504313e-01 -9.820000000000000000e+02 1.058237555033426230e-01 -9.830000000000000000e+02 1.057594145269267483e-01 -9.840000000000000000e+02 1.056953118623597948e-01 -9.850000000000000000e+02 1.056314462905811602e-01 -9.860000000000000000e+02 1.055678166005525470e-01 -9.870000000000000000e+02 1.055044215891875609e-01 -9.880000000000000000e+02 1.054412600612911616e-01 -9.890000000000000000e+02 1.053783308294948540e-01 -9.900000000000000000e+02 1.053156327141946957e-01 -9.910000000000000000e+02 1.052531645434879454e-01 -9.920000000000000000e+02 1.051909251531117362e-01 -9.930000000000000000e+02 1.051289133863819170e-01 -9.940000000000000000e+02 1.050671280941335023e-01 -9.950000000000000000e+02 1.050055681346592079e-01 -9.960000000000000000e+02 1.049442323736501925e-01 -9.970000000000000000e+02 1.048831196841388536e-01 -9.980000000000000000e+02 1.048222289464388335e-01 -9.990000000000000000e+02 1.047615590480883013e-01 -1.000000000000000000e+03 1.047011088837912635e-01 -1.001000000000000000e+03 1.046408773553645644e-01 -1.002000000000000000e+03 1.045808633716757835e-01 -1.003000000000000000e+03 1.045210658485939970e-01 -1.004000000000000000e+03 1.044614837089305054e-01 -1.005000000000000000e+03 1.044021158823859041e-01 -1.006000000000000000e+03 1.043429613054957100e-01 -1.007000000000000000e+03 1.042840189215769597e-01 -1.008000000000000000e+03 1.042252876806749745e-01 -1.009000000000000000e+03 1.041667665395101389e-01 -1.010000000000000000e+03 1.041084544614278573e-01 -1.011000000000000000e+03 1.040503504163457910e-01 -1.012000000000000000e+03 1.039924533807007057e-01 -1.013000000000000000e+03 1.039347623374024393e-01 -1.014000000000000000e+03 1.038772762757792512e-01 -1.015000000000000000e+03 1.038199941915297769e-01 -1.016000000000000000e+03 1.037629150866763994e-01 -1.017000000000000000e+03 1.037060379695105838e-01 -1.018000000000000000e+03 1.036493618545506062e-01 -1.019000000000000000e+03 1.035928857624903304e-01 -1.020000000000000000e+03 1.035366087201513852e-01 -1.021000000000000000e+03 1.034805297604388941e-01 -1.022000000000000000e+03 1.034246479222913767e-01 -1.023000000000000000e+03 1.033689622506376027e-01 -1.024000000000000000e+03 1.033134717963493238e-01 -1.025000000000000000e+03 1.032581756161953107e-01 -1.026000000000000000e+03 1.032030727727980546e-01 -1.027000000000000000e+03 1.031481623345881088e-01 -1.028000000000000000e+03 1.030934433757606239e-01 -1.029000000000000000e+03 1.030389149762310774e-01 -1.030000000000000000e+03 1.029845762215917393e-01 -1.031000000000000000e+03 1.029304262030692890e-01 -1.032000000000000000e+03 1.028764640174829326e-01 -1.033000000000000000e+03 1.028226887671999518e-01 -1.034000000000000000e+03 1.027690995600967772e-01 -1.035000000000000000e+03 1.027156955095145097e-01 -1.036000000000000000e+03 1.026624757342202710e-01 -1.037000000000000000e+03 1.026094393583663472e-01 -1.038000000000000000e+03 1.025565855114477232e-01 -1.039000000000000000e+03 1.025039133282645287e-01 -1.040000000000000000e+03 1.024514219488819045e-01 -1.041000000000000000e+03 1.023991105185886874e-01 -1.042000000000000000e+03 1.023469781878613150e-01 -1.043000000000000000e+03 1.022950241123237042e-01 -1.044000000000000000e+03 1.022432474527099205e-01 -1.045000000000000000e+03 1.021916473748243348e-01 -1.046000000000000000e+03 1.021402230495066232e-01 -1.047000000000000000e+03 1.020889736525931596e-01 -1.048000000000000000e+03 1.020378983648797117e-01 -1.049000000000000000e+03 1.019869963720854145e-01 -1.050000000000000000e+03 1.019362668648176734e-01 -1.051000000000000000e+03 1.018857090385330427e-01 -1.052000000000000000e+03 1.018353220935056258e-01 -1.053000000000000000e+03 1.017851052347886476e-01 -1.054000000000000000e+03 1.017350576721808841e-01 -1.055000000000000000e+03 1.016851786201908719e-01 -1.056000000000000000e+03 1.016354672980036983e-01 -1.057000000000000000e+03 1.015859229294466815e-01 -1.058000000000000000e+03 1.015365447429553009e-01 -1.059000000000000000e+03 1.014873319715386413e-01 -1.060000000000000000e+03 1.014382838527483482e-01 -1.061000000000000000e+03 1.013893996286432259e-01 -1.062000000000000000e+03 1.013406785457594550e-01 -1.063000000000000000e+03 1.012921198550748303e-01 -1.064000000000000000e+03 1.012437228119800470e-01 -1.065000000000000000e+03 1.011954866762433819e-01 -1.066000000000000000e+03 1.011474107119828131e-01 -1.067000000000000000e+03 1.010994941876316722e-01 -1.068000000000000000e+03 1.010517363759091680e-01 -1.069000000000000000e+03 1.010041365537898972e-01 -1.070000000000000000e+03 1.009566940024713977e-01 -1.071000000000000000e+03 1.009094080073463240e-01 -1.072000000000000000e+03 1.008622778579714996e-01 -1.073000000000000000e+03 1.008153028480373026e-01 -1.074000000000000000e+03 1.007684822753396048e-01 -1.075000000000000000e+03 1.007218154417496153e-01 -1.076000000000000000e+03 1.006753016531853756e-01 -1.077000000000000000e+03 1.006289402195831434e-01 -1.078000000000000000e+03 1.005827304548678608e-01 -1.079000000000000000e+03 1.005366716769261343e-01 -1.080000000000000000e+03 1.004907632075771329e-01 -1.081000000000000000e+03 1.004450043725472613e-01 -1.082000000000000000e+03 1.003993945014384631e-01 -1.083000000000000000e+03 1.003539329277049613e-01 -1.084000000000000000e+03 1.003086189886229079e-01 -1.085000000000000000e+03 1.002634520252660283e-01 -1.086000000000000000e+03 1.002184313824786566e-01 -1.087000000000000000e+03 1.001735564088459679e-01 -1.088000000000000000e+03 1.001288264566743968e-01 -1.089000000000000000e+03 1.000842408819575258e-01 -1.090000000000000000e+03 1.000397990443580853e-01 -1.091000000000000000e+03 9.999550030717636873e-02 -1.092000000000000000e+03 9.995134403732905404e-02 -1.093000000000000000e+03 9.990732960532092144e-02 -1.094000000000000000e+03 9.986345638522189927e-02 -1.095000000000000000e+03 9.981972375464288894e-02 -1.096000000000000000e+03 9.977613109470875874e-02 -1.097000000000000000e+03 9.973267779003605615e-02 -1.098000000000000000e+03 9.968936322870819433e-02 -1.099000000000000000e+03 9.964618680225158232e-02 +3.000000000000000000e+02 1.519544011494232405e-01 +3.010000000000000000e+02 1.272278051479444061e-01 +3.020000000000000000e+02 1.055417219638186549e-01 +3.030000000000000000e+02 8.661960635797485986e-02 +3.040000000000000000e+02 7.024835257570144487e-02 +3.050000000000000000e+02 5.626854495393492084e-02 +3.060000000000000000e+02 4.456723540542639056e-02 +3.070000000000000000e+02 3.507270016451729394e-02 +3.080000000000000000e+02 2.775078098537234195e-02 +3.090000000000000000e+02 2.260252762754767081e-02 +3.100000000000000000e+02 1.966294101990322118e-02 +3.110000000000000000e+02 1.900067827641053683e-02 +3.120000000000000000e+02 2.071862741732687432e-02 +3.130000000000000000e+02 2.495529499046067815e-02 +3.140000000000000000e+02 3.188697610621633177e-02 +3.150000000000000000e+02 4.173069482421434828e-02 +3.160000000000000000e+02 5.474791339295302650e-02 +3.170000000000000000e+02 7.124901044473196110e-02 +3.180000000000000000e+02 9.159851846801202180e-02 +3.190000000000000000e+02 1.162210856672341586e-01 +3.200000000000000000e+02 1.456080805253935351e-01 +3.210000000000000000e+02 1.803246801433725510e-01 +3.220000000000000000e+02 2.210171634332580015e-01 +3.230000000000000000e+02 2.684199509778198989e-01 +3.240000000000000000e+02 3.233616735687566690e-01 +3.250000000000000000e+02 3.867691852056251434e-01 +3.260000000000000000e+02 4.596679348412270327e-01 +3.270000000000000000e+02 5.431764474380907926e-01 +3.280000000000000000e+02 6.384918242740029726e-01 +3.290000000000000000e+02 7.468621721548418524e-01 +3.300000000000000000e+02 8.695407938360413258e-01 +3.310000000000000000e+02 1.007716016581050811e+00 +3.320000000000000000e+02 1.162410086440075707e+00 +3.330000000000000000e+02 1.334341254381509412e+00 +3.340000000000000000e+02 1.523745964418995902e+00 +3.350000000000000000e+02 1.730164077723588489e+00 +3.360000000000000000e+02 1.952200375863182513e+00 +3.370000000000000000e+02 2.187290404108467534e+00 +3.380000000000000000e+02 2.431516319395185199e+00 +3.390000000000000000e+02 2.679533928869020087e+00 +3.400000000000000000e+02 2.924677193028491828e+00 +3.410000000000000000e+02 3.159291235229362282e+00 +3.420000000000000000e+02 3.375303085889779453e+00 +3.430000000000000000e+02 3.564975378757617275e+00 +3.440000000000000000e+02 3.721721147326182422e+00 +3.450000000000000000e+02 3.840816879511077975e+00 +3.460000000000000000e+02 3.919860418653115630e+00 +3.470000000000000000e+02 3.958883060569799550e+00 +3.480000000000000000e+02 3.960117598236263081e+00 +3.490000000000000000e+02 3.927508255051261443e+00 +3.500000000000000000e+02 3.866093971272740681e+00 +3.510000000000000000e+02 3.781395022041457832e+00 +3.520000000000000000e+02 3.678897281578411338e+00 +3.530000000000000000e+02 3.563680497628093580e+00 +3.540000000000000000e+02 3.440195092886218831e+00 +3.550000000000000000e+02 3.312165229556018886e+00 +3.560000000000000000e+02 3.182584538669757990e+00 +3.570000000000000000e+02 3.053770772840744385e+00 +3.580000000000000000e+02 2.927451497272737235e+00 +3.590000000000000000e+02 2.804860708142703274e+00 +3.600000000000000000e+02 2.686833535928860428e+00 +3.610000000000000000e+02 2.573891911136587662e+00 +3.620000000000000000e+02 2.466318065667425508e+00 +3.630000000000000000e+02 2.364215259951348180e+00 +3.640000000000000000e+02 2.267556540547907673e+00 +3.650000000000000000e+02 2.176223004121589977e+00 +3.660000000000000000e+02 2.090033255519735178e+00 +3.670000000000000000e+02 2.008765701383618651e+00 +3.680000000000000000e+02 1.932175147632497980e+00 +3.690000000000000000e+02 1.860004948874272257e+00 +3.700000000000000000e+02 1.791995734828703446e+00 +3.710000000000000000e+02 1.727891535437269921e+00 +3.720000000000000000e+02 1.667443951461035301e+00 +3.730000000000000000e+02 1.610414872645969275e+00 +3.740000000000000000e+02 1.556578128854717580e+00 +3.750000000000000000e+02 1.505720367247634028e+00 +3.760000000000000000e+02 1.457641376572070158e+00 +3.770000000000000000e+02 1.412154024030392474e+00 +3.780000000000000000e+02 1.369083927656423727e+00 +3.790000000000000000e+02 1.328268954803502488e+00 +3.800000000000000000e+02 1.289558612928151993e+00 +3.810000000000000000e+02 1.252813380505723329e+00 +3.820000000000000000e+02 1.217904012201442843e+00 +3.830000000000000000e+02 1.184710842221927685e+00 +3.840000000000000000e+02 1.153123102233183817e+00 +3.850000000000000000e+02 1.123038264690024768e+00 +3.860000000000000000e+02 1.094361418384153462e+00 +3.870000000000000000e+02 1.067004680099121305e+00 +3.880000000000000000e+02 1.040886644179084497e+00 +3.890000000000000000e+02 1.015931870356303834e+00 +3.900000000000000000e+02 9.920704091761332055e-01 +3.910000000000000000e+02 9.692373636911130186e-01 +3.920000000000000000e+02 9.473724856708093389e-01 +3.930000000000000000e+02 9.264198043279028294e-01 +3.940000000000000000e+02 9.063272854407132817e-01 +3.950000000000000000e+02 8.870465187213678604e-01 +3.960000000000000000e+02 8.685324313088639281e-01 +3.970000000000000000e+02 8.507430253383891916e-01 +3.980000000000000000e+02 8.336391376347006554e-01 +3.990000000000000000e+02 8.171842196915386491e-01 +4.000000000000000000e+02 8.013441362193630679e-01 +4.010000000000000000e+02 7.860869806666920256e-01 +4.020000000000000000e+02 7.713829062427700611e-01 +4.030000000000000000e+02 7.572039710862791262e-01 +4.040000000000000000e+02 7.435239963380961825e-01 +4.050000000000000000e+02 7.303184359809510307e-01 +4.060000000000000000e+02 7.175642574086015246e-01 +4.070000000000000000e+02 7.052398317779527970e-01 +4.080000000000000000e+02 6.933248332827602889e-01 +4.090000000000000000e+02 6.818001465649761172e-01 +4.100000000000000000e+02 6.706477815507677631e-01 +4.110000000000000000e+02 6.598507950635820185e-01 +4.120000000000000000e+02 6.493932186255126915e-01 +4.130000000000000000e+02 6.392599919120716123e-01 +4.140000000000000000e+02 6.294369013744934849e-01 +4.150000000000000000e+02 6.199105235880709719e-01 +4.160000000000000000e+02 6.106681729251528523e-01 +4.170000000000000000e+02 6.016978531880048386e-01 +4.180000000000000000e+02 5.929882128696635224e-01 +4.190000000000000000e+02 5.845285037412005780e-01 +4.200000000000000000e+02 5.763085424903187093e-01 +4.210000000000000000e+02 5.683186751613055199e-01 +4.220000000000000000e+02 5.605497441684816895e-01 +4.230000000000000000e+02 5.529930576750755611e-01 +4.240000000000000000e+02 5.456403611483284788e-01 +4.250000000000000000e+02 5.384838109176316445e-01 +4.260000000000000000e+02 5.315159495778901677e-01 +4.270000000000000000e+02 5.247296830936811762e-01 +4.280000000000000000e+02 5.181182594723434676e-01 +4.290000000000000000e+02 5.116752488851749048e-01 +4.300000000000000000e+02 5.053945251262489391e-01 +4.310000000000000000e+02 4.992702483075807107e-01 +4.320000000000000000e+02 4.932968486978412948e-01 +4.330000000000000000e+02 4.874690116193976519e-01 +4.340000000000000000e+02 4.817816633255768699e-01 +4.350000000000000000e+02 4.762299577864015365e-01 +4.360000000000000000e+02 4.708092643166593705e-01 +4.370000000000000000e+02 4.655151559858394239e-01 +4.380000000000000000e+02 4.603433987538123606e-01 +4.390000000000000000e+02 4.552899412811343693e-01 +4.400000000000000000e+02 4.503509053662769768e-01 +4.410000000000000000e+02 4.455225769662541913e-01 +4.420000000000000000e+02 4.408013977603070233e-01 +4.430000000000000000e+02 4.361839572192996450e-01 +4.440000000000000000e+02 4.316669851465750329e-01 +4.450000000000000000e+02 4.272473446583576195e-01 +4.460000000000000000e+02 4.229220255743326717e-01 +4.470000000000000000e+02 4.186881381911624622e-01 +4.480000000000000000e+02 4.145429074137498282e-01 +4.490000000000000000e+02 4.104836672208575510e-01 +4.500000000000000000e+02 4.065078554434086167e-01 +4.510000000000000000e+02 4.026130088353485625e-01 +4.520000000000000000e+02 3.987967584185051484e-01 +4.530000000000000000e+02 3.950568250839721074e-01 +4.540000000000000000e+02 3.913910154340087821e-01 +4.550000000000000000e+02 3.877972178494073496e-01 +4.560000000000000000e+02 3.842733987684536778e-01 +4.570000000000000000e+02 3.808175991644199287e-01 +4.580000000000000000e+02 3.774279312095868977e-01 +4.590000000000000000e+02 3.741025751144873568e-01 +4.600000000000000000e+02 3.708397761318226182e-01 +4.610000000000000000e+02 3.676378417153406963e-01 +4.620000000000000000e+02 3.644951388244805912e-01 +4.630000000000000000e+02 3.614100913662351977e-01 +4.640000000000000000e+02 3.583811777662213038e-01 +4.650000000000000000e+02 3.554069286615802459e-01 +4.660000000000000000e+02 3.524859247086465364e-01 +4.670000000000000000e+02 3.496167944988867182e-01 +4.680000000000000000e+02 3.467982125769764057e-01 +4.690000000000000000e+02 3.440288975553217332e-01 +4.700000000000000000e+02 3.413076103195986089e-01 +4.710000000000000000e+02 3.386331523203358618e-01 +4.720000000000000000e+02 3.360043639457865883e-01 +4.730000000000000000e+02 3.334201229716566295e-01 +4.740000000000000000e+02 3.308793430835478833e-01 +4.750000000000000000e+02 3.283809724682056896e-01 +4.760000000000000000e+02 3.259239924698854041e-01 +4.770000000000000000e+02 3.235074163083958010e-01 +4.780000000000000000e+02 3.211302878555616913e-01 +4.790000000000000000e+02 3.187916804671113713e-01 +4.800000000000000000e+02 3.164906958669987946e-01 +4.810000000000000000e+02 3.142264630815674864e-01 +4.820000000000000000e+02 3.119981374209456204e-01 +4.830000000000000000e+02 3.098048995052826715e-01 +4.840000000000000000e+02 3.076459543335683389e-01 +4.850000000000000000e+02 3.055205303928711924e-01 +4.860000000000000000e+02 3.034278788060326137e-01 +4.870000000000000000e+02 3.013672725158438870e-01 +4.880000000000000000e+02 2.993380055039797094e-01 +4.890000000000000000e+02 2.973393920429255877e-01 +4.900000000000000000e+02 2.953707659793530227e-01 +4.910000000000000000e+02 2.934314800473701856e-01 +4.920000000000000000e+02 2.915209052102739062e-01 +4.930000000000000000e+02 2.896384300293861624e-01 +4.940000000000000000e+02 2.877834600587380609e-01 +4.950000000000000000e+02 2.859554172643604120e-01 +4.960000000000000000e+02 2.841537394670408667e-01 +4.970000000000000000e+02 2.823778798074393914e-01 +4.980000000000000000e+02 2.806273062325760348e-01 +4.990000000000000000e+02 2.789015010026386632e-01 +5.000000000000000000e+02 2.771999602172549038e-01 +5.010000000000000000e+02 2.755221933602918227e-01 +5.020000000000000000e+02 2.738677228623813131e-01 +5.030000000000000000e+02 2.722360836803672246e-01 +5.040000000000000000e+02 2.706268228929116226e-01 +5.050000000000000000e+02 2.690394993115591271e-01 +5.060000000000000000e+02 2.674736831065768761e-01 +5.070000000000000000e+02 2.659289554469145833e-01 +5.080000000000000000e+02 2.644049081536687940e-01 +5.090000000000000000e+02 2.629011433664922293e-01 +5.100000000000000000e+02 2.614172732223645212e-01 +5.110000000000000000e+02 2.599529195462153552e-01 +5.120000000000000000e+02 2.585077135528728864e-01 +5.130000000000000000e+02 2.570812955598743010e-01 +5.140000000000000000e+02 2.556733147107192461e-01 +5.150000000000000000e+02 2.542834287080265043e-01 +5.160000000000000000e+02 2.529113035563207434e-01 +5.170000000000000000e+02 2.515566133139139904e-01 +5.180000000000000000e+02 2.502190398536344174e-01 +5.190000000000000000e+02 2.488982726319293182e-01 +5.200000000000000000e+02 2.475940084660907536e-01 +5.210000000000000000e+02 2.463059513192199512e-01 +5.220000000000000000e+02 2.450338120926504326e-01 +5.230000000000000000e+02 2.437773084254953870e-01 +5.240000000000000000e+02 2.425361645011122891e-01 +5.250000000000000000e+02 2.413101108600975986e-01 +5.260000000000000000e+02 2.400988842196609130e-01 +5.270000000000000000e+02 2.389022272990763696e-01 +5.280000000000000000e+02 2.377198886509710729e-01 +5.290000000000000000e+02 2.365516224982603388e-01 +5.300000000000000000e+02 2.353971885764653271e-01 +5.310000000000000000e+02 2.342563519812536632e-01 +5.320000000000000000e+02 2.331288830209747587e-01 +5.330000000000000000e+02 2.320145570740007324e-01 +5.340000000000000000e+02 2.309131544507126987e-01 +5.350000000000000000e+02 2.298244602599377739e-01 +5.360000000000000000e+02 2.287482642796767607e-01 +5.370000000000000000e+02 2.276843608319671364e-01 +5.380000000000000000e+02 2.266325486617387641e-01 +5.390000000000000000e+02 2.255926308194716734e-01 +5.400000000000000000e+02 2.245644145475843012e-01 +5.410000000000000000e+02 2.235477111703565445e-01 +5.420000000000000000e+02 2.225423359872971130e-01 +5.430000000000000000e+02 2.215481081698050247e-01 +5.440000000000000000e+02 2.205648506610304593e-01 +5.450000000000000000e+02 2.195923900788210870e-01 +5.460000000000000000e+02 2.186305566215963059e-01 +5.470000000000000000e+02 2.176791839771309856e-01 +5.480000000000000000e+02 2.167381092340651683e-01 +5.490000000000000000e+02 2.158071727960883812e-01 +5.500000000000000000e+02 2.148862182987025804e-01 +5.510000000000000000e+02 2.139750925284588934e-01 +5.520000000000000000e+02 2.130736453445966627e-01 +5.530000000000000000e+02 2.121817296029893107e-01 +5.540000000000000000e+02 2.112992010823303290e-01 +5.550000000000000000e+02 2.104259184124893378e-01 +5.560000000000000000e+02 2.095617430049387386e-01 +5.570000000000000000e+02 2.087065389851995578e-01 +5.580000000000000000e+02 2.078601731272430586e-01 +5.590000000000000000e+02 2.070225147897792883e-01 +5.600000000000000000e+02 2.061934358543501267e-01 +5.610000000000000000e+02 2.053728106651965257e-01 +5.620000000000000000e+02 2.045605159708350496e-01 +5.630000000000000000e+02 2.037564308672568936e-01 +5.640000000000000000e+02 2.029604367427501888e-01 +5.650000000000000000e+02 2.021724172242450324e-01 +5.660000000000000000e+02 2.013922581251551547e-01 +5.670000000000000000e+02 2.006198473946657068e-01 +5.680000000000000000e+02 1.998550750684219834e-01 +5.690000000000000000e+02 1.990978332205584067e-01 +5.700000000000000000e+02 1.983480159170575297e-01 +5.710000000000000000e+02 1.976055191703548763e-01 +5.720000000000000000e+02 1.968702408951988336e-01 +5.730000000000000000e+02 1.961420808656780257e-01 +5.740000000000000000e+02 1.954209406734079835e-01 +5.750000000000000000e+02 1.947067236868569029e-01 +5.760000000000000000e+02 1.939993350117119320e-01 +5.770000000000000000e+02 1.932986814523377783e-01 +5.780000000000000000e+02 1.926046714742234711e-01 +5.790000000000000000e+02 1.919172151674372051e-01 +5.800000000000000000e+02 1.912362242110131616e-01 +5.810000000000000000e+02 1.905616118382887636e-01 +5.820000000000000000e+02 1.898932928031310807e-01 +5.830000000000000000e+02 1.892311833470363136e-01 +5.840000000000000000e+02 1.885752011670716044e-01 +5.850000000000000000e+02 1.879252653846457122e-01 +5.860000000000000000e+02 1.872812965150760511e-01 +5.870000000000000000e+02 1.866432164379183967e-01 +5.880000000000000000e+02 1.860109483680665587e-01 +5.890000000000000000e+02 1.853844168275569360e-01 +5.900000000000000000e+02 1.847635476180971847e-01 +5.910000000000000000e+02 1.841482677942816726e-01 +5.920000000000000000e+02 1.835385056374631840e-01 +5.930000000000000000e+02 1.829341906302785481e-01 +5.940000000000000000e+02 1.823352534318061768e-01 +5.950000000000000000e+02 1.817416258533297857e-01 +5.960000000000000000e+02 1.811532408346978318e-01 +5.970000000000000000e+02 1.805700324212591579e-01 +5.980000000000000000e+02 1.799919357413592436e-01 +5.990000000000000000e+02 1.794188869843861001e-01 +6.000000000000000000e+02 1.788508233793334734e-01 +6.010000000000000000e+02 1.782876831738952061e-01 +6.020000000000000000e+02 1.777294056140400202e-01 +6.030000000000000000e+02 1.771759309240992508e-01 +6.040000000000000000e+02 1.766272002873004454e-01 +6.050000000000000000e+02 1.760831558267779151e-01 +6.060000000000000000e+02 1.755437405870247658e-01 +6.070000000000000000e+02 1.750088985157867705e-01 +6.080000000000000000e+02 1.744785744463652200e-01 +6.090000000000000000e+02 1.739527140803479033e-01 +6.100000000000000000e+02 1.734312639707359660e-01 +6.110000000000000000e+02 1.729141715054524908e-01 +6.120000000000000000e+02 1.724013848912429314e-01 +6.130000000000000000e+02 1.718928531379365077e-01 +6.140000000000000000e+02 1.713885260430728641e-01 +6.150000000000000000e+02 1.708883541768713155e-01 +6.160000000000000000e+02 1.703922888675559466e-01 +6.170000000000000000e+02 1.699002821869912694e-01 +6.180000000000000000e+02 1.694122869327407965e-01 +6.190000000000000000e+02 1.689282566300690513e-01 +6.200000000000000000e+02 1.684481454948997536e-01 +6.210000000000000000e+02 1.679719084364943438e-01 +6.220000000000000000e+02 1.674995010406903351e-01 +6.230000000000000000e+02 1.670308795573495486e-01 +6.240000000000000000e+02 1.665660008881131304e-01 +6.250000000000000000e+02 1.661048225780647480e-01 +6.260000000000000000e+02 1.656473027893393124e-01 +6.270000000000000000e+02 1.651934003117023764e-01 +6.280000000000000000e+02 1.647430745365915661e-01 +6.290000000000000000e+02 1.642962854498361824e-01 +6.300000000000000000e+02 1.638529936209065230e-01 +6.310000000000000000e+02 1.634131601924124211e-01 +6.320000000000000000e+02 1.629767468698088140e-01 +6.330000000000000000e+02 1.625437159113371777e-01 +6.340000000000000000e+02 1.621140301181689392e-01 +6.350000000000000000e+02 1.616876528247640776e-01 +6.360000000000000000e+02 1.612645478894360052e-01 +6.370000000000000000e+02 1.608446796851005223e-01 +6.380000000000000000e+02 1.604280130902416557e-01 +6.390000000000000000e+02 1.600145134800477209e-01 +6.400000000000000000e+02 1.596041467177388706e-01 +6.410000000000000000e+02 1.591968791460780797e-01 +6.420000000000000000e+02 1.587926775790517164e-01 +6.430000000000000000e+02 1.583915092937226710e-01 +6.440000000000000000e+02 1.579933420222590090e-01 +6.450000000000000000e+02 1.575981439441165310e-01 +6.460000000000000000e+02 1.572058836783820635e-01 +6.470000000000000000e+02 1.568165302762816182e-01 +6.480000000000000000e+02 1.564300532138251931e-01 +6.490000000000000000e+02 1.560464223846183274e-01 +6.500000000000000000e+02 1.556656080928031649e-01 +6.510000000000000000e+02 1.552875810461513129e-01 +6.520000000000000000e+02 1.549123123492880394e-01 +6.530000000000000000e+02 1.545397734970589687e-01 +6.540000000000000000e+02 1.541699363680217316e-01 +6.550000000000000000e+02 1.538027732180725360e-01 +6.560000000000000000e+02 1.534382566741944176e-01 +6.570000000000000000e+02 1.530763597283312238e-01 +6.580000000000000000e+02 1.527170557313814181e-01 +6.590000000000000000e+02 1.523603183873068756e-01 +6.600000000000000000e+02 1.520061217473642479e-01 +6.610000000000000000e+02 1.516544402044379403e-01 +6.620000000000000000e+02 1.513052484874901904e-01 +6.630000000000000000e+02 1.509585216561210863e-01 +6.640000000000000000e+02 1.506142350952191233e-01 +6.650000000000000000e+02 1.502723645097387428e-01 +6.660000000000000000e+02 1.499328859195498964e-01 +6.670000000000000000e+02 1.495957756544075978e-01 +6.680000000000000000e+02 1.492610103490070728e-01 +6.690000000000000000e+02 1.489285669381387178e-01 +6.700000000000000000e+02 1.485984226519232176e-01 +6.710000000000000000e+02 1.482705550111535764e-01 +6.720000000000000000e+02 1.479449418227091750e-01 +6.730000000000000000e+02 1.476215611750666401e-01 +6.740000000000000000e+02 1.473003914338844866e-01 +6.750000000000000000e+02 1.469814112376836013e-01 +6.760000000000000000e+02 1.466645994935932562e-01 +6.770000000000000000e+02 1.463499353731858577e-01 +6.780000000000000000e+02 1.460373983083859128e-01 +6.790000000000000000e+02 1.457269679874542700e-01 +6.800000000000000000e+02 1.454186243510426635e-01 +6.810000000000000000e+02 1.451123475883279446e-01 +6.820000000000000000e+02 1.448081181332075973e-01 +6.830000000000000000e+02 1.445059166605739132e-01 +6.840000000000000000e+02 1.442057240826498110e-01 +6.850000000000000000e+02 1.439075215453885781e-01 +6.860000000000000000e+02 1.436112904249498001e-01 +6.870000000000000000e+02 1.433170123242230032e-01 +6.880000000000000000e+02 1.430246690694271516e-01 +6.890000000000000000e+02 1.427342427067628816e-01 +6.900000000000000000e+02 1.424457154991290164e-01 +6.910000000000000000e+02 1.421590699228942323e-01 +6.920000000000000000e+02 1.418742886647256507e-01 +6.930000000000000000e+02 1.415913546184777716e-01 +6.940000000000000000e+02 1.413102508821314218e-01 +6.950000000000000000e+02 1.410309607547904909e-01 +6.960000000000000000e+02 1.407534677337269335e-01 +6.970000000000000000e+02 1.404777555114792575e-01 +6.980000000000000000e+02 1.402038079730074938e-01 +6.990000000000000000e+02 1.399316091928840544e-01 +7.000000000000000000e+02 1.396611434325464030e-01 +7.010000000000000000e+02 1.393923951375929393e-01 +7.020000000000000000e+02 1.391253489351197969e-01 +7.030000000000000000e+02 1.388599896311129567e-01 +7.040000000000000000e+02 1.385963022078772755e-01 +7.050000000000000000e+02 1.383342718215153366e-01 +7.060000000000000000e+02 1.380738837994411883e-01 +7.070000000000000000e+02 1.378151236379476507e-01 +7.080000000000000000e+02 1.375579769998042379e-01 +7.090000000000000000e+02 1.373024297119013193e-01 +7.100000000000000000e+02 1.370484677629346948e-01 +7.110000000000000000e+02 1.367960773011219489e-01 +7.120000000000000000e+02 1.365452446319690427e-01 +7.130000000000000000e+02 1.362959562160615534e-01 +7.140000000000000000e+02 1.360481986669017929e-01 +7.150000000000000000e+02 1.358019587487767910e-01 +7.160000000000000000e+02 1.355572233746649147e-01 +7.170000000000000000e+02 1.353139796041763487e-01 +7.180000000000000000e+02 1.350722146415223590e-01 +7.190000000000000000e+02 1.348319158335284096e-01 +7.200000000000000000e+02 1.345930706676689015e-01 +7.210000000000000000e+02 1.343556667701437390e-01 +7.220000000000000000e+02 1.341196919039760183e-01 +7.230000000000000000e+02 1.338851339671501273e-01 +7.240000000000000000e+02 1.336519809907758538e-01 +7.250000000000000000e+02 1.334202211372801095e-01 +7.260000000000000000e+02 1.331898426986330708e-01 +7.270000000000000000e+02 1.329608340945988842e-01 +7.280000000000000000e+02 1.327331838710129885e-01 +7.290000000000000000e+02 1.325068806980934932e-01 +7.300000000000000000e+02 1.322819133687746507e-01 +7.310000000000000000e+02 1.320582707970656966e-01 +7.320000000000000000e+02 1.318359420164408602e-01 +7.330000000000000000e+02 1.316149161782498300e-01 +7.340000000000000000e+02 1.313951825501568083e-01 +7.350000000000000000e+02 1.311767305146015750e-01 +7.360000000000000000e+02 1.309595495672881138e-01 +7.370000000000000000e+02 1.307436293156920282e-01 +7.380000000000000000e+02 1.305289594775963513e-01 +7.390000000000000000e+02 1.303155298796469241e-01 +7.400000000000000000e+02 1.301033304559337800e-01 +7.410000000000000000e+02 1.298923512465875452e-01 +7.420000000000000000e+02 1.296825823964058988e-01 +7.430000000000000000e+02 1.294740141534961309e-01 +7.440000000000000000e+02 1.292666368679408484e-01 +7.450000000000000000e+02 1.290604409904832495e-01 +7.460000000000000000e+02 1.288554170712293556e-01 +7.470000000000000000e+02 1.286515557583814418e-01 +7.480000000000000000e+02 1.284488477969719933e-01 +7.490000000000000000e+02 1.282472840276382975e-01 +7.500000000000000000e+02 1.280468553853977565e-01 +7.510000000000000000e+02 1.278475528984504006e-01 +7.520000000000000000e+02 1.276493676870031346e-01 +7.530000000000000000e+02 1.274522909620988409e-01 +7.540000000000000000e+02 1.272563140244766244e-01 +7.550000000000000000e+02 1.270614282634428271e-01 +7.560000000000000000e+02 1.268676251557571411e-01 +7.570000000000000000e+02 1.266748962645403709e-01 +7.580000000000000000e+02 1.264832332381947422e-01 +7.590000000000000000e+02 1.262926278093404187e-01 +7.600000000000000000e+02 1.261030717937726697e-01 +7.610000000000000000e+02 1.259145570894250887e-01 +7.620000000000000000e+02 1.257270756753579577e-01 +7.630000000000000000e+02 1.255406196107561601e-01 +7.640000000000000000e+02 1.253551810339402772e-01 +7.650000000000000000e+02 1.251707521613982521e-01 +7.660000000000000000e+02 1.249873252868249629e-01 +7.670000000000000000e+02 1.248048927801794217e-01 +7.680000000000000000e+02 1.246234470867560867e-01 +7.690000000000000000e+02 1.244429807262655008e-01 +7.700000000000000000e+02 1.242634862919330951e-01 +7.710000000000000000e+02 1.240849564496079721e-01 +7.720000000000000000e+02 1.239073839368848573e-01 +7.730000000000000000e+02 1.237307615622426638e-01 +7.740000000000000000e+02 1.235550822041861507e-01 +7.750000000000000000e+02 1.233803388104123683e-01 +7.760000000000000000e+02 1.232065243969757695e-01 +7.770000000000000000e+02 1.230336320474778866e-01 +7.780000000000000000e+02 1.228616549122588664e-01 +7.790000000000000000e+02 1.226905862076028975e-01 +7.800000000000000000e+02 1.225204192149613597e-01 +7.810000000000000000e+02 1.223511472801756955e-01 +7.820000000000000000e+02 1.221827638127192250e-01 +7.830000000000000000e+02 1.220152622849496882e-01 +7.840000000000000000e+02 1.218486362313675742e-01 +7.850000000000000000e+02 1.216828792478871629e-01 +7.860000000000000000e+02 1.215179849911195015e-01 +7.870000000000000000e+02 1.213539471776616668e-01 +7.880000000000000000e+02 1.211907595834011836e-01 +7.890000000000000000e+02 1.210284160428230921e-01 +7.900000000000000000e+02 1.208669104483324902e-01 +7.910000000000000000e+02 1.207062367495855132e-01 +7.920000000000000000e+02 1.205463889528254201e-01 +7.930000000000000000e+02 1.203873611202309762e-01 +7.940000000000000000e+02 1.202291473692762708e-01 +7.950000000000000000e+02 1.200717418720945312e-01 +7.960000000000000000e+02 1.199151388548524572e-01 +7.970000000000000000e+02 1.197593325971329642e-01 +7.980000000000000000e+02 1.196043174313280305e-01 +7.990000000000000000e+02 1.194500877420371365e-01 +8.000000000000000000e+02 1.192966379654748221e-01 +8.010000000000000000e+02 1.191439625888867371e-01 +8.020000000000000000e+02 1.189920561499727136e-01 +8.030000000000000000e+02 1.188409132363200532e-01 +8.040000000000000000e+02 1.186905284848396303e-01 +8.050000000000000000e+02 1.185408965812142501e-01 +8.060000000000000000e+02 1.183920122593514201e-01 +8.070000000000000000e+02 1.182438703008451275e-01 +8.080000000000000000e+02 1.180964655344443059e-01 +8.090000000000000000e+02 1.179497928355271036e-01 +8.100000000000000000e+02 1.178038471255836162e-01 +8.110000000000000000e+02 1.176586233717062807e-01 +8.120000000000000000e+02 1.175141165860831421e-01 +8.130000000000000000e+02 1.173703218255024439e-01 +8.140000000000000000e+02 1.172272341908599247e-01 +8.150000000000000000e+02 1.170848488266762882e-01 +8.160000000000000000e+02 1.169431609206177669e-01 +8.170000000000000000e+02 1.168021657030236943e-01 +8.180000000000000000e+02 1.166618584464397534e-01 +8.190000000000000000e+02 1.165222344651619391e-01 +8.200000000000000000e+02 1.163832891147775356e-01 +8.210000000000000000e+02 1.162450177917229571e-01 +8.220000000000000000e+02 1.161074159328347594e-01 +8.230000000000000000e+02 1.159704790149192755e-01 +8.240000000000000000e+02 1.158342025543170895e-01 +8.250000000000000000e+02 1.156985821064803882e-01 +8.260000000000000000e+02 1.155636132655523951e-01 +8.270000000000000000e+02 1.154292916639526184e-01 +8.280000000000000000e+02 1.152956129719673040e-01 +8.290000000000000000e+02 1.151625728973443563e-01 +8.300000000000000000e+02 1.150301671848964896e-01 +8.310000000000000000e+02 1.148983916161063629e-01 +8.320000000000000000e+02 1.147672420087372941e-01 +8.330000000000000000e+02 1.146367142164489289e-01 +8.340000000000000000e+02 1.145068041284184601e-01 +8.350000000000000000e+02 1.143775076689678982e-01 +8.360000000000000000e+02 1.142488207971897735e-01 +8.370000000000000000e+02 1.141207395065878955e-01 +8.380000000000000000e+02 1.139932598247112433e-01 +8.390000000000000000e+02 1.138663778128013032e-01 +8.400000000000000000e+02 1.137400895654404193e-01 +8.410000000000000000e+02 1.136143912102010739e-01 +8.420000000000000000e+02 1.134892789073073532e-01 +8.430000000000000000e+02 1.133647488492936922e-01 +8.440000000000000000e+02 1.132407972606710028e-01 +8.450000000000000000e+02 1.131174203975956472e-01 +8.460000000000000000e+02 1.129946145475434344e-01 +8.470000000000000000e+02 1.128723760289872952e-01 +8.480000000000000000e+02 1.127507011910781759e-01 +8.490000000000000000e+02 1.126295864133319974e-01 +8.500000000000000000e+02 1.125090281053176683e-01 +8.510000000000000000e+02 1.123890227063491370e-01 +8.520000000000000000e+02 1.122695666851858121e-01 +8.530000000000000000e+02 1.121506565397278748e-01 +8.540000000000000000e+02 1.120322887967258041e-01 +8.550000000000000000e+02 1.119144600114834187e-01 +8.560000000000000000e+02 1.117971667675718705e-01 +8.570000000000000000e+02 1.116804056765431374e-01 +8.580000000000000000e+02 1.115641733776486511e-01 +8.590000000000000000e+02 1.114484665375603395e-01 +8.600000000000000000e+02 1.113332818500942789e-01 +8.610000000000000000e+02 1.112186160359419224e-01 +8.620000000000000000e+02 1.111044658423985948e-01 +8.630000000000000000e+02 1.109908280430981359e-01 +8.640000000000000000e+02 1.108776994377525110e-01 +8.650000000000000000e+02 1.107650768518904927e-01 +8.660000000000000000e+02 1.106529571366018511e-01 +8.670000000000000000e+02 1.105413371682854723e-01 +8.680000000000000000e+02 1.104302138483977264e-01 +8.690000000000000000e+02 1.103195841032066499e-01 +8.700000000000000000e+02 1.102094448835452545e-01 +8.710000000000000000e+02 1.100997931645726485e-01 +8.720000000000000000e+02 1.099906259455329660e-01 +8.730000000000000000e+02 1.098819402495228442e-01 +8.740000000000000000e+02 1.097737331232541552e-01 +8.750000000000000000e+02 1.096660016368270485e-01 +8.760000000000000000e+02 1.095587428834989135e-01 +8.770000000000000000e+02 1.094519539794629320e-01 +8.780000000000000000e+02 1.093456320636234935e-01 +8.790000000000000000e+02 1.092397742973746366e-01 +8.800000000000000000e+02 1.091343778643863588e-01 +8.810000000000000000e+02 1.090294399703874983e-01 +8.820000000000000000e+02 1.089249578432375659e-01 +8.830000000000000000e+02 1.088209287315776291e-01 +8.840000000000000000e+02 1.087173499063341653e-01 +8.850000000000000000e+02 1.086142186593721248e-01 +8.860000000000000000e+02 1.085115323035761581e-01 +8.870000000000000000e+02 1.084092881726523572e-01 +8.880000000000000000e+02 1.083074836209276387e-01 +8.890000000000000000e+02 1.082061160231549413e-01 +8.900000000000000000e+02 1.081051827743192001e-01 +8.910000000000000000e+02 1.080046812894456809e-01 +8.920000000000000000e+02 1.079046090034091465e-01 +8.930000000000000000e+02 1.078049633707496568e-01 +8.940000000000000000e+02 1.077057418654830817e-01 +8.950000000000000000e+02 1.076069419809209671e-01 +8.960000000000000000e+02 1.075085612294887083e-01 +8.970000000000000000e+02 1.074105971425451250e-01 +8.980000000000000000e+02 1.073130472702068655e-01 +8.990000000000000000e+02 1.072159091811721865e-01 +9.000000000000000000e+02 1.071191804625478694e-01 +9.010000000000000000e+02 1.070228587196792314e-01 +9.020000000000000000e+02 1.069269415759781655e-01 +9.030000000000000000e+02 1.068314266727576206e-01 +9.040000000000000000e+02 1.067363116690653729e-01 +9.050000000000000000e+02 1.066415942412631268e-01 +9.060000000000000000e+02 1.065472720838922943e-01 +9.070000000000000000e+02 1.064533429079696780e-01 +9.080000000000000000e+02 1.063598044418610777e-01 +9.090000000000000000e+02 1.062666544308643601e-01 +9.100000000000000000e+02 1.061738906370554847e-01 +9.110000000000000000e+02 1.060815108391354733e-01 +9.120000000000000000e+02 1.059895128322759505e-01 +9.130000000000000000e+02 1.058978944279736767e-01 +9.140000000000000000e+02 1.058066534538970177e-01 +9.150000000000000000e+02 1.057157877537720642e-01 +9.160000000000000000e+02 1.056252951871196888e-01 +9.170000000000000000e+02 1.055351736292845094e-01 +9.180000000000000000e+02 1.054454209711796486e-01 +9.190000000000000000e+02 1.053560351191724920e-01 +9.200000000000000000e+02 1.052670139949458822e-01 +9.210000000000000000e+02 1.051783555353630745e-01 +9.220000000000000000e+02 1.050900576923273072e-01 +9.230000000000000000e+02 1.050021184326503237e-01 +9.240000000000000000e+02 1.049145357379177579e-01 +9.250000000000000000e+02 1.048273076043576002e-01 +9.260000000000000000e+02 1.047404320427089558e-01 +9.270000000000000000e+02 1.046539070780948544e-01 +9.280000000000000000e+02 1.045677307498916603e-01 +9.290000000000000000e+02 1.044819011116046165e-01 +9.300000000000000000e+02 1.043964162307423199e-01 +9.310000000000000000e+02 1.043112741886936951e-01 +9.320000000000000000e+02 1.042264730806031631e-01 +9.330000000000000000e+02 1.041420110152528333e-01 +9.340000000000000000e+02 1.040578861149396989e-01 +9.350000000000000000e+02 1.039740965153587438e-01 +9.360000000000000000e+02 1.038906403654842880e-01 +9.370000000000000000e+02 1.038075158274544413e-01 +9.380000000000000000e+02 1.037247210764563748e-01 +9.390000000000000000e+02 1.036422543006128294e-01 +9.400000000000000000e+02 1.035601137008684558e-01 +9.410000000000000000e+02 1.034782974908774050e-01 +9.420000000000000000e+02 1.033968038968962194e-01 +9.430000000000000000e+02 1.033156311576721997e-01 +9.440000000000000000e+02 1.032347775243368515e-01 +9.450000000000000000e+02 1.031542412602959174e-01 +9.460000000000000000e+02 1.030740206411278059e-01 +9.470000000000000000e+02 1.029941139544764545e-01 +9.480000000000000000e+02 1.029145194999470103e-01 +9.490000000000000000e+02 1.028352355890054526e-01 +9.500000000000000000e+02 1.027562605448749944e-01 +9.510000000000000000e+02 1.026775927024359963e-01 +9.520000000000000000e+02 1.025992304081275036e-01 +9.530000000000000000e+02 1.025211720198473675e-01 +9.540000000000000000e+02 1.024434159068554478e-01 +9.550000000000000000e+02 1.023659604496773429e-01 +9.560000000000000000e+02 1.022888040400074389e-01 +9.570000000000000000e+02 1.022119450806165536e-01 +9.580000000000000000e+02 1.021353819852564293e-01 +9.590000000000000000e+02 1.020591131785672651e-01 +9.600000000000000000e+02 1.019831370959872197e-01 +9.610000000000000000e+02 1.019074521836598052e-01 +9.620000000000000000e+02 1.018320568983454300e-01 +9.630000000000000000e+02 1.017569497073313456e-01 +9.640000000000000000e+02 1.016821290883440504e-01 +9.650000000000000000e+02 1.016075935294612625e-01 +9.660000000000000000e+02 1.015333415290277097e-01 +9.670000000000000000e+02 1.014593715955653813e-01 +9.680000000000000000e+02 1.013856822476930375e-01 +9.690000000000000000e+02 1.013122720140201410e-01 +9.700000000000000000e+02 1.012391394331452615e-01 +9.710000000000000000e+02 1.011662830534516694e-01 +9.720000000000000000e+02 1.010937014331071138e-01 +9.730000000000000000e+02 1.010213931399633475e-01 +9.740000000000000000e+02 1.009493567514772594e-01 +9.750000000000000000e+02 1.008775908546286626e-01 +9.760000000000000000e+02 1.008060940458452709e-01 +9.770000000000000000e+02 1.007348649309243033e-01 +9.780000000000000000e+02 1.006639021249550736e-01 +9.790000000000000000e+02 1.005932042522420106e-01 +9.800000000000000000e+02 1.005227699462338670e-01 +9.810000000000000000e+02 1.004525978494415217e-01 +9.820000000000000000e+02 1.003826866133728235e-01 +9.830000000000000000e+02 1.003130348984518083e-01 +9.840000000000000000e+02 1.002436413739527382e-01 +9.850000000000000000e+02 1.001745047179232184e-01 +9.860000000000000000e+02 1.001056236171166819e-01 +9.870000000000000000e+02 1.000369967669191423e-01 +9.880000000000000000e+02 9.996862287128351066e-02 +9.890000000000000000e+02 9.990050064265547369e-02 +9.900000000000000000e+02 9.983262880191028088e-02 +9.910000000000000000e+02 9.976500607828095446e-02 +9.920000000000000000e+02 9.969763120929471534e-02 +9.930000000000000000e+02 9.963050294070267821e-02 +9.940000000000000000e+02 9.956362002641817865e-02 +9.950000000000000000e+02 9.949698122844877202e-02 +9.960000000000000000e+02 9.943058531683274248e-02 +9.970000000000000000e+02 9.936443106957509874e-02 +9.980000000000000000e+02 9.929851727258422189e-02 +9.990000000000000000e+02 9.923284271960974845e-02 +1.000000000000000000e+03 9.916740621217899621e-02 +1.001000000000000000e+03 9.910220655953728974e-02 +1.002000000000000000e+03 9.903724257858496915e-02 +1.003000000000000000e+03 9.897251309381864537e-02 +1.004000000000000000e+03 9.890801693727123423e-02 +1.005000000000000000e+03 9.884375294845113014e-02 +1.006000000000000000e+03 9.877971997428584838e-02 +1.007000000000000000e+03 9.871591686906150409e-02 +1.008000000000000000e+03 9.865234249436775904e-02 +1.009000000000000000e+03 9.858899571903689818e-02 +1.010000000000000000e+03 9.852587541909232915e-02 +1.011000000000000000e+03 9.846298047768844985e-02 +1.012000000000000000e+03 9.840030978505587278e-02 +1.013000000000000000e+03 9.833786223844970253e-02 +1.014000000000000000e+03 9.827563674208952826e-02 +1.015000000000000000e+03 9.821363220711037956e-02 +1.016000000000000000e+03 9.815184755150596629e-02 +1.017000000000000000e+03 9.809028170007774716e-02 +1.018000000000000000e+03 9.802893358438080629e-02 +1.019000000000000000e+03 9.796780214267399034e-02 +1.020000000000000000e+03 9.790688631986518842e-02 +1.021000000000000000e+03 9.784618506746343980e-02 +1.022000000000000000e+03 9.778569734352539344e-02 +1.023000000000000000e+03 9.772542211260881739e-02 +1.024000000000000000e+03 9.766535834571860031e-02 +1.025000000000000000e+03 9.760550502025987230e-02 +1.026000000000000000e+03 9.754586111999025144e-02 +1.027000000000000000e+03 9.748642563496903723e-02 +1.028000000000000000e+03 9.742719756151034527e-02 +1.029000000000000000e+03 9.736817590213657503e-02 +1.030000000000000000e+03 9.730935966552922700e-02 +1.031000000000000000e+03 9.725074786648370273e-02 +1.032000000000000000e+03 9.719233952586391057e-02 +1.033000000000000000e+03 9.713413367055327707e-02 +1.034000000000000000e+03 9.707612933341415451e-02 +1.035000000000000000e+03 9.701832555323749996e-02 +1.036000000000000000e+03 9.696072137470201913e-02 +1.037000000000000000e+03 9.690331584832893863e-02 +1.038000000000000000e+03 9.684610803043765259e-02 +1.039000000000000000e+03 9.678909698310296517e-02 +1.040000000000000000e+03 9.673228177411240247e-02 +1.041000000000000000e+03 9.667566147692130407e-02 +1.042000000000000000e+03 9.661923517061399291e-02 +1.043000000000000000e+03 9.656300193985919988e-02 +1.044000000000000000e+03 9.650696087487044272e-02 +1.045000000000000000e+03 9.645111107136196404e-02 +1.046000000000000000e+03 9.639545163051180254e-02 +1.047000000000000000e+03 9.633998165891942411e-02 +1.048000000000000000e+03 9.628470026856368602e-02 +1.049000000000000000e+03 9.622960657676665752e-02 +1.050000000000000000e+03 9.617469970615269426e-02 +1.051000000000000000e+03 9.611997878460853961e-02 +1.052000000000000000e+03 9.606544294524586858e-02 +1.053000000000000000e+03 9.601109132636267973e-02 +1.054000000000000000e+03 9.595692307140524235e-02 +1.055000000000000000e+03 9.590293732892923861e-02 +1.056000000000000000e+03 9.584913325256404215e-02 +1.057000000000000000e+03 9.579551000097519253e-02 +1.058000000000000000e+03 9.574206673782753585e-02 +1.059000000000000000e+03 9.568880263174839307e-02 +1.060000000000000000e+03 9.563571685629211616e-02 +1.061000000000000000e+03 9.558280858990413076e-02 +1.062000000000000000e+03 9.553007701588553391e-02 +1.063000000000000000e+03 9.547752132235758082e-02 +1.064000000000000000e+03 9.542514070222694877e-02 +1.065000000000000000e+03 9.537293435315112589e-02 +1.066000000000000000e+03 9.532090147750514608e-02 +1.067000000000000000e+03 9.526904128234559010e-02 +1.068000000000000000e+03 9.521735297937947151e-02 +1.069000000000000000e+03 9.516583578492819606e-02 +1.070000000000000000e+03 9.511448891989587873e-02 +1.071000000000000000e+03 9.506331160973686967e-02 +1.072000000000000000e+03 9.501230308442230876e-02 +1.073000000000000000e+03 9.496146257840799854e-02 +1.074000000000000000e+03 9.491078933060349831e-02 +1.075000000000000000e+03 9.486028258433819305e-02 +1.076000000000000000e+03 9.480994158733208055e-02 +1.077000000000000000e+03 9.475976559166374158e-02 +1.078000000000000000e+03 9.470975385373819888e-02 +1.079000000000000000e+03 9.465990563425860649e-02 +1.080000000000000000e+03 9.461022019819355366e-02 +1.081000000000000000e+03 9.456069681474867095e-02 +1.082000000000000000e+03 9.451133475733547451e-02 +1.083000000000000000e+03 9.446213330354294446e-02 +1.084000000000000000e+03 9.441309173510642472e-02 +1.085000000000000000e+03 9.436420933787949272e-02 +1.086000000000000000e+03 9.431548540180619000e-02 +1.087000000000000000e+03 9.426691922088922815e-02 +1.088000000000000000e+03 9.421851009316513370e-02 +1.089000000000000000e+03 9.417025732067331456e-02 +1.090000000000000000e+03 9.412216020942978933e-02 +1.091000000000000000e+03 9.407421806939772480e-02 +1.092000000000000000e+03 9.402643021446233096e-02 +1.093000000000000000e+03 9.397879596240130140e-02 +1.094000000000000000e+03 9.393131463485832056e-02 +1.095000000000000000e+03 9.388398555731815309e-02 +1.096000000000000000e+03 9.383680805907713973e-02 +1.097000000000000000e+03 9.378978147321842540e-02 +1.098000000000000000e+03 9.374290513658573021e-02 +1.099000000000000000e+03 9.369617838975655144e-02 From 3f533f16e40323507027324bf9a0110406be742c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Aug 2024 15:35:04 +0000 Subject: [PATCH 136/161] Free pressure parameter for ADR; y_c parameters fixed; only zeroth order PSF shape parameter is fitted for higher diffraction orders; reshape spectrum.spectrogram_fit spectrum.spectrogram_residuals as 2D arrays; mask cosmics on fit residuals after each ffm iterations --- spectractor/extractor/extractor.py | 31 ++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 28c316089..ac316ef8b 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -16,7 +16,7 @@ from spectractor.extractor.background import extract_spectrogram_background_sextractor from spectractor.extractor.chromaticpsf import ChromaticPSF from spectractor.extractor.psf import load_PSF -from spectractor.tools import ensure_dir, plot_image_simple, from_lambda_to_colormap, plot_spectrum_simple +from spectractor.tools import ensure_dir, plot_image_simple, from_lambda_to_colormap, plot_spectrum_simple, mask_cosmics from spectractor.fit.fitter import (run_minimisation, run_minimisation_sigma_clipping, write_fitparameter_json, RegFitWorkspace, FitWorkspace, FitParameters) @@ -86,7 +86,7 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p [D2CCD - 3 * parameters.DISTANCE2CCD_ERR, D2CCD + 3 * parameters.DISTANCE2CCD_ERR], [-parameters.PIXSHIFT_PRIOR, parameters.PIXSHIFT_PRIOR], [-10 * parameters.PIXSHIFT_PRIOR, 10 * parameters.PIXSHIFT_PRIOR], - [-90, 90], [0.2, 5], [0.5, 2], [-360, 360], [300, 1100], [-100, 100], [1.001, 3]] + [-90, 90], [0.2, 5], [0.5, 2], [-360, 360], [0, np.inf], [-100, 100], [1.001, 3]] bounds += list(psf_poly_params_bounds) * len(self.diffraction_orders) fixed = [False] * p.size for k, par in enumerate(input_labels): @@ -97,10 +97,16 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p fixed[k] = True p[k] = 0 for k, par in enumerate(input_labels): - if "y_c" in par and (("y_c_0" not in par and "y_c_1" not in par) or (par[-2:] == "_2" or par[-2:] == "_3")): - fixed[k] = False + #if "y_c" in par and (("y_c_0" not in par and "y_c_1" not in par)) and par[-2:] == f"_{spectrum.order}": # or (par[-2:] == "_2" or par[-2:] == "_3")): + # fixed[k] = False + # p[k] = 0 + #if k >= self.psf_params_start_index[0] and "y_c" in par and par[-2:] != f"_{spectrum.order}": # and (("y_c_0" in par or "y_c_1" in par)): # or (par[-2:] == "_2" or par[-2:] == "_3")): + # fixed[k] = False + # p[k] = 0 + if k >= self.psf_params_start_index[0] and "y_c" not in par and "x_c" not in par and par[-2:] != f"_{spectrum.order}" and "_0_" not in par: + fixed[k] = True p[k] = 0 - elif k >= self.psf_params_start_index[0] and "y_c" not in par and "x_c" not in par and par[-2:] != f"_{spectrum.order}" and "_0_" not in par: + if k >= self.psf_params_start_index[0] and "eta" in par and par[-2:] != f"_{spectrum.order}": fixed[k] = True p[k] = 0 @@ -121,7 +127,7 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p params.fixed[params.get_index("angle [deg]")] = False # angle params.fixed[params.get_index("B")] = True # B: not needed in simulations, to check with data params.fixed[params.get_index("R")] = True # camera rot - params.fixed[params.get_index("P [hPa]")] = True # pressure + params.fixed[params.get_index("P [hPa]")] = False # pressure params.fixed[params.get_index("T [Celsius]")] = True # temperature params.fixed[params.get_index("z")] = True # airmass @@ -939,8 +945,8 @@ def run_ffm_minimisation(w, method="newton", niter=2): w.spectrum.chromatic_psf.table["amplitude"] = np.copy(w.amplitude_params) w.spectrum.chromatic_psf.from_profile_params_to_shape_params(w.psf_profile_params[w.diffraction_orders[0]]) w.spectrum.chromatic_psf.params.values = w.spectrum.chromatic_psf.from_table_to_poly_params() - w.spectrum.spectrogram_fit = w.model - w.spectrum.spectrogram_residuals = (w.data - w.spectrum.spectrogram_fit) / w.err + w.spectrum.spectrogram_fit = w.model.reshape((w.Ny, w.Nx)) + w.spectrum.spectrogram_residuals = (w.data.reshape((w.Ny, w.Nx)) - w.spectrum.spectrogram_fit) / w.err.reshape((w.Ny, w.Nx)) w.spectrum.header['CHI2_FIT'] = w.costs[-1] / (w.data.size - len(w.mask)) w.spectrum.header['PIXSHIFT'] = w.params[r"shift_x [pix]"] w.spectrum.header['D2CCD'] = w.params[r"D_CCD [mm]"] @@ -959,6 +965,15 @@ def run_ffm_minimisation(w, method="newton", niter=2): w.params.set(r"shift_x [pix]", w.spectrum.header['PIXSHIFT']) w.spectrum.convert_from_flam_to_ADUrate() + # Mask forgotten cosmics + cr_mask = mask_cosmics(w.spectrum.spectrogram_residuals, maxiter=3, sigma_clip=5, convolve_kernel_size=0) + if np.sum(cr_mask) > 0: + my_logger.info(f"\n\t{np.sum(cr_mask)} new pixels identified and masked as cosmics.") + cr_mask_flat = cr_mask.flatten() + w.mask += [i for i in range(cr_mask_flat.size) if cr_mask_flat[i]] + w.mask = list(set(w.mask)) + w.mask.sort() + if w.filename != "": parameters.SAVE = True w.params.plot_correlation_matrix() From 4eeabcb07fe571354173f824b79fccb3c3e53a50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Aug 2024 15:51:52 +0000 Subject: [PATCH 137/161] Free pressure for ADR only (not for Rayleigh), free angle and shiftds but fixed y_c; fixed A1 but free A2; debug masking; only zeroth-order polynomial parameter for high diffraction order PSF shape parameters --- spectractor/fit/fit_spectrogram.py | 48 +++++++++++++++++++----------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index e7006c317..45cfb3853 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -69,7 +69,7 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, self.saturation = self.spectrum.spectrogram_saturation D2CCD = np.copy(spectrum.header['D2CCD']) p = np.array([1, 1, 0, 0.05, 1.2, 400, 5, 1, 1, D2CCD, self.spectrum.header['PIXSHIFT'], - 0, self.spectrum.rotation_angle]) + 0, self.spectrum.rotation_angle, self.spectrum.pressure]) # parameter indices for which we don't need to recompute the PSF cube for model evaluation # warning: they must be contiguous to preserve psf_cube in jacobian function loop self.fixed_psf_params = np.arange(0, 9, dtype=int) @@ -80,17 +80,18 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, p = np.concatenate([p] + [self.psf_poly_params] * len(self.diffraction_orders)) input_labels = [f"A{order}" for order in self.diffraction_orders] input_labels += ["VAOD", "angstrom_exp", "ozone [db]", "PWV [mm]", "B", "A_star", - r"D_CCD [mm]", r"shift_x [pix]", r"shift_y [pix]", r"angle [deg]"] + r"D_CCD [mm]", r"shift_x [pix]", r"shift_y [pix]", r"angle [deg]", "P [hPa]"] for order in self.diffraction_orders: input_labels += [label + f"_{order}" for label in psf_poly_params_labels] axis_names = [f"$A_{order}$" for order in self.diffraction_orders] axis_names += ["VAOD", r'$\"a$', "ozone [db]", "PWV [mm]", "$B$", r"$A_{star}$", r"$D_{CCD}$ [mm]", - r"$\Delta_{\mathrm{x}}$ [pix]", r"$\Delta_{\mathrm{y}}$ [pix]", r"$\theta$ [deg]"] + r"$\Delta_{\mathrm{x}}$ [pix]", r"$\Delta_{\mathrm{y}}$ [pix]", r"$\theta$ [deg]", + r"$P_{\mathrm{atm}}$ [hPa]"] for order in self.diffraction_orders: axis_names += [label+rf"$\!_{order}$" for label in psf_poly_params_names] - bounds = [[0, 2], [0, 2], [0, 2], [0, 0.1], [0, 3], [100, 700], [0, 20], [0.8, 1.2], [0, np.inf], + bounds = [[0, 2], [0, 2], [0, 2], [0, 1], [0, 3], [100, 700], [0, 20], [0.8, 1.2], [0, np.inf], [D2CCD - 5 * parameters.DISTANCE2CCD_ERR, D2CCD + 5 * parameters.DISTANCE2CCD_ERR], [-2, 2], - [-10, 10], [-90, 90]] + [-10, 10], [-90, 90], [0, np.inf]] bounds += list(psf_poly_params_bounds) * len(self.diffraction_orders) fixed = [False] * p.size for k, par in enumerate(input_labels): @@ -98,25 +99,34 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, fixed[k] = True for k, par in enumerate(input_labels): if "y_c" in par: - fixed[k] = False + fixed[k] = True p[k] = 0 for k, par in enumerate(input_labels): if k >= self.psf_params_start_index[0] and "y_c" not in par and "x_c" not in par and par[-2:] != f"_{spectrum.order}" and "_0_" not in par: fixed[k] = True p[k] = 0 + if k >= self.psf_params_start_index[0] and "eta" in par and par[-2:] != f"_{spectrum.order}": + fixed[k] = True + p[k] = 0 + # for k, par in enumerate(input_labels): + # if k >= self.psf_params_start_index[0] and "y_c" not in par and "x_c" not in par and par[-2:] != f"_{spectrum.order}" and "_0_" not in par: + # fixed[k] = True + # p[k] = 0 params = FitParameters(p, labels=input_labels, axis_names=axis_names, bounds=bounds, fixed=fixed, truth=truth, filename=self.filename) + params.fixed[params.get_index(f"A{self.diffraction_orders[0]}")] = True # A1 self.atm_params_indices = np.array([params.get_index(label) for label in ["VAOD", "angstrom_exp", "ozone [db]", "PWV [mm]"]]) # A2 is free only if spectrogram is a simulation or if the order 2/1 ratio is not known and flat if "A2" in params.labels: - params.fixed[params.get_index(f"A{self.diffraction_orders[1]}")] = "A2_T" not in self.spectrum.header + params.fixed[params.get_index(f"A{self.diffraction_orders[1]}")] = False #"A2_T" not in self.spectrum.header if "A3" in params.labels: params.fixed[params.get_index(f"A{self.diffraction_orders[2]}")] = "A3_T" not in self.spectrum.header params.fixed[params.get_index(r"shift_x [pix]")] = False # Delta x - params.fixed[params.get_index(r"shift_y [pix]")] = True # Delta y - params.fixed[params.get_index(r"angle [deg]")] = True # angle + params.fixed[params.get_index(r"shift_y [pix]")] = False # Delta y + params.fixed[params.get_index(r"angle [deg]")] = False # angle params.fixed[params.get_index("B")] = True # B + params.fixed[params.get_index("P [hPa]")] = False # pressure for ADR FitWorkspace.__init__(self, params, verbose=verbose, plot=plot, live_fit=live_fit, file_name=self.filename) self.my_logger = set_logger(self.__class__.__name__) @@ -172,6 +182,7 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, # flat data for fitworkspace self.data_before_mask = np.copy(self.data) self.W_before_mask = np.copy(self.W) + self.mask_before_mask = list(np.copy(self.mask)) # create mask self.set_mask() @@ -220,11 +231,12 @@ def set_mask(self, params=None): self.my_logger.info("\n\tReset spectrogram mask with current parameters.") if params is None: params = self.params.values - A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, B, Astar, D, shift_x, shift_y, angle, *psf_poly_params_all = params + A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, B, Astar, D, shift_x, shift_y, angle, pressure, *psf_poly_params_all = params poly_params = np.array(psf_poly_params_all).reshape((len(self.diffraction_orders), -1)) self.spectrogram_simulation.psf_cubes_masked = {} self.spectrogram_simulation.M_sparse_indices = {} self.spectrogram_simulation.psf_cube_sparse_indices = {} + self.spectrum.adr_params[3] = pressure for k, order in enumerate(self.diffraction_orders): profile_params = self.spectrum.chromatic_psf.from_poly_params_to_profile_params(poly_params[k], apply_bounds=True) @@ -247,17 +259,17 @@ def set_mask(self, params=None): self.spectrogram_simulation.boundaries[order]["ymin"] = np.zeros_like(self.spectrogram_simulation.boundaries[order]["ymin"]) self.spectrogram_simulation.boundaries[order]["ymax"] = self.Ny * np.ones_like(self.spectrogram_simulation.boundaries[order]["ymax"]) self.spectrogram_simulation.psf_cube_sparse_indices[order], self.spectrogram_simulation.M_sparse_indices[order] = self.spectrum.chromatic_psf.get_sparse_indices(self.spectrogram_simulation.boundaries[order]) - mask = np.sum(self.spectrogram_simulation.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], self.spectrogram_simulation.pixels[0].size), axis=0) == 0 + # mask = np.sum(self.spectrogram_simulation.psf_cubes_masked[self.diffraction_orders[0]].reshape(psf_cube_masked.shape[0], self.spectrogram_simulation.pixels[0].size), axis=0) == 0 # cumulate the boolean values as int weight_mask = np.sum(self.spectrogram_simulation.psf_cubes_masked[self.diffraction_orders[0]], axis=0) # look for indices with maximum weight per column (all sheets of the psf cube have contributed) res = np.max(weight_mask, axis=0)[np.newaxis,:] * np.ones((weight_mask.shape[0],1)) # keep only the pixels where all psf_cube sheets have contributed per column mask = (weight_mask != res).ravel() - self.W = np.copy(self.W_before_mask) - self.W[mask] = 0 - self.mask += list(np.where(mask)[0]) + self.mask = list(self.mask_before_mask) + list(np.where(mask)[0]) self.mask = list(set(self.mask)) + self.W = np.copy(self.W_before_mask) + self.W[self.mask] = 0 def get_spectrogram_truth(self): """Load the truth parameters (if provided) from the file header. @@ -279,9 +291,10 @@ def get_spectrogram_truth(self): rotation_angle = self.spectrum.header['ROT_T'] B = 1 Astar = 1 + pressure = self.spectrum.header["OUTPRESS"] poly_truth = np.fromstring(self.spectrum.header['PSF_P_T'][1:-1], sep=',', dtype=float) self.truth = (A1_truth, A2_truth, A3_truth, aerosols_truth, ozone_truth, pwv_truth, - D_truth, shiftx_truth, shifty_truth, rotation_angle, B, Astar, *poly_truth) + D_truth, shiftx_truth, shifty_truth, rotation_angle, B, Astar, pressure, *poly_truth) self.lambdas_truth = np.fromstring(self.spectrum.header['LBDAS_T'][1:-1], sep=',', dtype=float) self.amplitude_truth = np.fromstring(self.spectrum.header['AMPLIS_T'][1:-1], sep=',', dtype=float) else: @@ -387,8 +400,9 @@ def simulate(self, *params): >>> w.plot_fit() """ - A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, B, Astar, D, shift_x, shift_y, angle, *psf_poly_params = params + A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, B, Astar, D, shift_x, shift_y, angle, pressure, *psf_poly_params = params self.params.values = np.asarray(params) + self.spectrogram_simulation.adr_params[3] = pressure if not self.fit_angstrom_exponent: angstrom_exponent = None lambdas, model, model_err = self.spectrogram_simulation.simulate(A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, D, shift_x, shift_y, angle, psf_poly_params) @@ -587,7 +601,7 @@ def run_spectrogram_minimisation(fit_workspace, method="newton", verbose=False): fit_workspace.spectrogram_simulation.fast_sim = False fit_workspace.spectrogram_simulation.fix_psf_cube = False fit_workspace.params.fixed = [True] * len(fit_workspace.params.values) - fit_workspace.params.fixed[fit_workspace.params.get_index(r"A1")] = False # shift y + # fit_workspace.params.fixed[fit_workspace.params.get_index(r"A1")] = False # A1 fit_workspace.params.fixed[fit_workspace.params.get_index(r"shift_y [pix]")] = False # shift y fit_workspace.params.fixed[fit_workspace.params.get_index(r"angle [deg]")] = False # angle run_minimisation(fit_workspace, "newton", epsilon, xtol=1e-2, ftol=0.01, with_line_search=False) From c7c60793214f4860e8bbae608c4399a3ceb08389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Aug 2024 15:54:19 +0000 Subject: [PATCH 138/161] fix A1, higher upper bound for VAOD --- spectractor/fit/fit_spectrum.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/spectractor/fit/fit_spectrum.py b/spectractor/fit/fit_spectrum.py index d6e5feade..3a5ffb0e9 100644 --- a/spectractor/fit/fit_spectrum.py +++ b/spectractor/fit/fit_spectrum.py @@ -62,7 +62,7 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, self.spectrum = spectrum p = np.array([1, 0, 0.05, 1.2, 400, 5, 1, self.spectrum.header['D2CCD'], self.spectrum.header['PIXSHIFT'], 0]) fixed = [False] * p.size - # fixed[0] = True + fixed[0] = True fixed[1] = "A2_T" not in self.spectrum.header # fit A2 only on sims to evaluate extraction biases fixed[5] = False # fixed[6:8] = [True, True] @@ -71,7 +71,7 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, # fixed[-1] = True if not fit_angstrom_exponent: fixed[3] = True # angstrom_exponent - bounds = [(0, 2), (0, 2/parameters.GRATING_ORDER_2OVER1), (0, 0.1), (0, 3), (100, 700), (0, 20), + bounds = [(0, 2), (0, 2/parameters.GRATING_ORDER_2OVER1), (0, 1), (0, 3), (100, 700), (0, 20), (0.1, 10),(p[7] - 5 * parameters.DISTANCE2CCD_ERR, p[7] + 5 * parameters.DISTANCE2CCD_ERR), (-2, 2), (-np.inf, np.inf)] params = FitParameters(p, labels=["A1", "A2", "VAOD", "angstrom_exp", "ozone [db]", "PWV [mm]", @@ -330,7 +330,7 @@ def lnprob_spectrum(p): # pragma: no cover return lp + w.lnlike(p) -def run_spectrum_minimisation(fit_workspace, method="newton"): +def run_spectrum_minimisation(fit_workspace, method="newton", sigma_clip=20): """Interface function to fit spectrum simulation parameters to data. Parameters @@ -373,16 +373,14 @@ def run_spectrum_minimisation(fit_workspace, method="newton"): # verbose=False) fit_workspace.simulation.fast_sim = False - # fit_workspace.fixed[0] = True fixed = copy.copy(fit_workspace.params.fixed) - fit_workspace.params.fixed = [True] * len(fit_workspace.params.values) - fit_workspace.params.fixed[0] = False - run_minimisation(fit_workspace, method="newton", epsilon=epsilon, xtol=1e-3, ftol=100 / fit_workspace.data.size, - verbose=False) - # fit_workspace.fixed[0] = False + #fit_workspace.params.fixed = [True] * len(fit_workspace.params.values) + #fit_workspace.params.fixed[0] = False + #run_minimisation(fit_workspace, method="newton", epsilon=epsilon, xtol=1e-3, ftol=100 / fit_workspace.data.size, + # verbose=False) fit_workspace.params.fixed = fixed run_minimisation_sigma_clipping(fit_workspace, method="newton", epsilon=epsilon, xtol=1e-6, - ftol=1 / fit_workspace.data.size, sigma_clip=20, niter_clip=3, verbose=False) + ftol=1 / fit_workspace.data.size, sigma_clip=sigma_clip, niter_clip=3, verbose=False) fit_workspace.params.plot_correlation_matrix() fit_workspace.plot_fit() From 1a65d73cddf078472e7df082552cb75b6f39a9a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Aug 2024 15:55:22 +0000 Subject: [PATCH 139/161] new auxtel transmission using latest ratio 2/1 (BG40 data rescaled by 1.09), fixed A1s, free angstrom exponent with 20230802 data --- ...eePressure_BG40ReScaled1.09_throughput.txt | 800 ++++++++++++++++++ 1 file changed, 800 insertions(+) create mode 100644 spectractor/simulation/AuxTelThroughput/multispectra_holo4_003_HD142331_20230802_348-594_HD146233_AuxTel_v3.1.0_doSensorFlat_FreePressure_BG40ReScaled1.09_throughput.txt diff --git a/spectractor/simulation/AuxTelThroughput/multispectra_holo4_003_HD142331_20230802_348-594_HD146233_AuxTel_v3.1.0_doSensorFlat_FreePressure_BG40ReScaled1.09_throughput.txt b/spectractor/simulation/AuxTelThroughput/multispectra_holo4_003_HD142331_20230802_348-594_HD146233_AuxTel_v3.1.0_doSensorFlat_FreePressure_BG40ReScaled1.09_throughput.txt new file mode 100644 index 000000000..88b164ec3 --- /dev/null +++ b/spectractor/simulation/AuxTelThroughput/multispectra_holo4_003_HD142331_20230802_348-594_HD146233_AuxTel_v3.1.0_doSensorFlat_FreePressure_BG40ReScaled1.09_throughput.txt @@ -0,0 +1,800 @@ +3.000000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.010000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.020000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.030000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.040000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.050000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.060000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.070000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.080000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.090000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.100000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.110000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.120000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.130000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.140000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.150000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.160000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.170000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.180000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.190000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.200000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.210000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.220000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.230000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.240000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.250000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.260000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.270000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.280000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.290000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.300000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.310000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.320000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.330000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.340000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.350000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.360000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.370000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.380000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.390000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.400000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.410000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.420000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.430000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.440000000000000000e+02 0.000000000000000000e+00 1.000000000000000056e-01 +3.450000000000000000e+02 1.223475307796860825e-02 1.000000000000000056e-01 +3.460000000000000000e+02 2.267817761604837973e-02 1.000000000000000056e-01 +3.470000000000000000e+02 3.312160215412814773e-02 1.000000000000000056e-01 +3.480000000000000000e+02 4.356502669220792268e-02 1.000000000000000056e-01 +3.490000000000000000e+02 5.400845123028769068e-02 1.000000000000000056e-01 +3.500000000000000000e+02 6.445187576836745869e-02 1.000000000000000056e-01 +3.510000000000000000e+02 7.489530030644722669e-02 1.000000000000000056e-01 +3.520000000000000000e+02 8.533872484452699470e-02 1.000000000000000056e-01 +3.530000000000000000e+02 9.578214938260676270e-02 1.000000000000000056e-01 +3.540000000000000000e+02 1.062255739206865307e-01 1.000000000000000056e-01 +3.550000000000000000e+02 1.166689984587662432e-01 1.000000000000000056e-01 +3.560000000000000000e+02 1.258433118578039800e-01 1.000000000000000056e-01 +3.570000000000000000e+02 1.351655942470698923e-01 1.000000000000000056e-01 +3.580000000000000000e+02 1.446963595394460678e-01 1.000000000000000056e-01 +3.590000000000000000e+02 1.543121012644246282e-01 1.000000000000000056e-01 +3.600000000000000000e+02 1.638292566813799311e-01 1.000000000000000056e-01 +3.610000000000000000e+02 1.676123604874799611e-01 1.000000000000000056e-01 +3.620000000000000000e+02 1.713995253325571733e-01 1.000000000000000056e-01 +3.630000000000000000e+02 1.754984738903282437e-01 1.000000000000000056e-01 +3.640000000000000000e+02 1.807661122168339185e-01 1.000000000000000056e-01 +3.650000000000000000e+02 1.876604049544178254e-01 1.000000000000000056e-01 +3.660000000000000000e+02 1.951359236459879742e-01 1.000000000000000056e-01 +3.670000000000000000e+02 2.016312952204327158e-01 1.000000000000000056e-01 +3.680000000000000000e+02 2.067450189666832916e-01 1.000000000000000056e-01 +3.690000000000000000e+02 2.109705114453636066e-01 1.000000000000000056e-01 +3.700000000000000000e+02 2.148897137050483630e-01 1.000000000000000056e-01 +3.710000000000000000e+02 2.186371899760470860e-01 1.000000000000000056e-01 +3.720000000000000000e+02 2.229815454716516931e-01 1.000000000000000056e-01 +3.730000000000000000e+02 2.287356820529017065e-01 1.000000000000000056e-01 +3.740000000000000000e+02 2.352685223846567308e-01 1.000000000000000056e-01 +3.750000000000000000e+02 2.416338480108665143e-01 1.000000000000000056e-01 +3.760000000000000000e+02 2.481372508638984009e-01 1.000000000000000056e-01 +3.770000000000000000e+02 2.552802933831848087e-01 1.000000000000000056e-01 +3.780000000000000000e+02 2.627756140557480635e-01 1.000000000000000056e-01 +3.790000000000000000e+02 2.695614398811218559e-01 1.000000000000000056e-01 +3.800000000000000000e+02 2.749813623247027161e-01 1.000000000000000056e-01 +3.810000000000000000e+02 2.797526003104602865e-01 1.000000000000000056e-01 +3.820000000000000000e+02 2.851640038363633667e-01 1.000000000000000056e-01 +3.830000000000000000e+02 2.918303853715817908e-01 1.000000000000000056e-01 +3.840000000000000000e+02 2.986651662013793951e-01 1.000000000000000056e-01 +3.850000000000000000e+02 3.047945528129633597e-01 1.000000000000000056e-01 +3.860000000000000000e+02 3.114677874428814497e-01 1.000000000000000056e-01 +3.870000000000000000e+02 3.199004062687956784e-01 1.000000000000000056e-01 +3.880000000000000000e+02 3.288316856115037212e-01 1.000000000000000056e-01 +3.890000000000000000e+02 3.369233172212761085e-01 1.000000000000000056e-01 +3.900000000000000000e+02 3.441985819632605303e-01 1.000000000000000056e-01 +3.910000000000000000e+02 3.507826423901767576e-01 1.000000000000000056e-01 +3.920000000000000000e+02 3.568393040733134347e-01 1.000000000000000056e-01 +3.930000000000000000e+02 3.615153254638510116e-01 1.000000000000000056e-01 +3.940000000000000000e+02 3.666182166936797771e-01 1.000000000000000056e-01 +3.950000000000000000e+02 3.709747530042215025e-01 1.000000000000000056e-01 +3.960000000000000000e+02 3.756876351130540859e-01 1.000000000000000056e-01 +3.970000000000000000e+02 3.805317093841903420e-01 1.000000000000000056e-01 +3.980000000000000000e+02 3.847530203801270421e-01 1.000000000000000056e-01 +3.990000000000000000e+02 3.883384503296448687e-01 1.000000000000000056e-01 +4.000000000000000000e+02 3.926419413162932082e-01 1.000000000000000056e-01 +4.010000000000000000e+02 3.987587927522273090e-01 1.000000000000000056e-01 +4.020000000000000000e+02 4.059603518356337815e-01 1.000000000000000056e-01 +4.030000000000000000e+02 4.124322143613710634e-01 1.000000000000000056e-01 +4.040000000000000000e+02 4.127784403021699244e-01 1.000000000000000056e-01 +4.050000000000000000e+02 4.131246662429687855e-01 1.000000000000000056e-01 +4.060000000000000000e+02 4.134708921837676465e-01 1.000000000000000056e-01 +4.070000000000000000e+02 4.138171181245665076e-01 1.000000000000000056e-01 +4.080000000000000000e+02 4.141633440653653686e-01 1.000000000000000056e-01 +4.090000000000000000e+02 4.145095700061642296e-01 1.000000000000000056e-01 +4.100000000000000000e+02 4.148557959469630352e-01 5.029249523882932393e-02 +4.110000000000000000e+02 4.152020218877618962e-01 4.979212028563293618e-02 +4.120000000000000000e+02 4.155482478285607573e-01 5.033523890691534580e-02 +4.130000000000000000e+02 4.158944737693596183e-01 5.098481798228814144e-02 +4.140000000000000000e+02 4.162406997101584794e-01 5.119397964926036826e-02 +4.150000000000000000e+02 4.165869256509573404e-01 1.100208890563018904e-02 +4.160000000000000000e+02 4.169331515917562014e-01 4.172843952803257164e-03 +4.170000000000000000e+02 4.201476572030268253e-01 4.205006934103664926e-03 +4.180000000000000000e+02 4.249340802381921800e-01 4.252883223637959551e-03 +4.190000000000000000e+02 4.280188113783750525e-01 4.283730167682776868e-03 +4.200000000000000000e+02 4.286879080632951533e-01 4.290313034067984137e-03 +4.210000000000000000e+02 4.293150076756742095e-01 4.296626336865500342e-03 +4.220000000000000000e+02 4.313014837261373025e-01 4.316390181065279767e-03 +4.230000000000000000e+02 4.346350859614040996e-01 4.349801350499891625e-03 +4.240000000000000000e+02 4.392757012751298262e-01 4.396191570104283908e-03 +4.250000000000000000e+02 4.448376638086384283e-01 4.451813900534878216e-03 +4.260000000000000000e+02 4.508577239481564303e-01 4.512247093176297019e-03 +4.270000000000000000e+02 4.544436849421633062e-01 4.548350187844993515e-03 +4.280000000000000000e+02 4.546582934113062580e-01 1.177246297857255722e-02 +4.290000000000000000e+02 4.548729018804491542e-01 1.132689185043338903e-02 +4.300000000000000000e+02 4.550875103495921059e-01 1.051821792292651631e-02 +4.310000000000000000e+02 4.553021188187350021e-01 4.557416294075621738e-02 +4.320000000000000000e+02 4.555167272878779539e-01 4.641590659361816140e-02 +4.330000000000000000e+02 4.557313357570208501e-01 4.728834794470106878e-02 +4.340000000000000000e+02 4.559459442261638018e-01 4.751770815358592054e-02 +4.350000000000000000e+02 4.561605526953066980e-01 4.859657645925206937e-02 +4.360000000000000000e+02 4.563751611644496498e-01 5.044501663373460870e-02 +4.370000000000000000e+02 4.565897696335925460e-01 5.156585300808320949e-02 +4.380000000000000000e+02 4.568043781027354977e-01 1.115994087389753087e-02 +4.390000000000000000e+02 4.570189865718783939e-01 1.091955148739190244e-02 +4.400000000000000000e+02 4.572335950410213457e-01 4.575133350685178270e-03 +4.410000000000000000e+02 4.593424179027474907e-01 4.597582794496457570e-03 +4.420000000000000000e+02 4.611643412104051709e-01 4.614224361458047624e-03 +4.430000000000000000e+02 4.634004207207387815e-01 4.636596593496614474e-03 +4.440000000000000000e+02 4.660226538799314144e-01 4.663417887809844301e-03 +4.450000000000000000e+02 4.683602929260318737e-01 4.686855494389631852e-03 +4.460000000000000000e+02 4.699685418838324136e-01 4.702819065129988652e-03 +4.470000000000000000e+02 4.711205806130211449e-01 4.713574790718550421e-03 +4.480000000000000000e+02 4.724560647315612649e-01 4.727826648092229266e-03 +4.490000000000000000e+02 4.744333265487280515e-01 4.747869189228227753e-03 +4.500000000000000000e+02 4.770562964680041262e-01 4.772853410855701535e-03 +4.510000000000000000e+02 4.775422673663357598e-01 4.777736985029415115e-03 +4.520000000000000000e+02 4.776226657480584503e-01 4.779564096054667727e-03 +4.530000000000000000e+02 4.779458604442864966e-01 4.782406540955408403e-03 +4.540000000000000000e+02 4.786004991383688845e-01 4.788307042076046967e-03 +4.550000000000000000e+02 4.795282744204831804e-01 4.797574332737086777e-03 +4.560000000000000000e+02 4.803070797915804935e-01 4.805271100211465710e-03 +4.570000000000000000e+02 4.806895565392607650e-01 4.809156339228482305e-03 +4.580000000000000000e+02 4.807699014210154442e-01 4.809922931339558755e-03 +4.590000000000000000e+02 4.808261829648352026e-01 4.810414596561056466e-03 +4.600000000000000000e+02 4.812092492479576600e-01 4.814241906613567559e-03 +4.610000000000000000e+02 4.821904556976658318e-01 4.823998970929769224e-03 +4.620000000000000000e+02 4.834260069749135580e-01 4.836398616488656564e-03 +4.630000000000000000e+02 4.845893639708558909e-01 4.848072217680670509e-03 +4.640000000000000000e+02 4.852804608014892329e-01 4.854931074283178397e-03 +4.650000000000000000e+02 4.856612734849684587e-01 4.858777239136377255e-03 +4.660000000000000000e+02 4.861440107202211758e-01 4.863577597488185668e-03 +4.670000000000000000e+02 4.869184723119327485e-01 4.871340992140448835e-03 +4.680000000000000000e+02 4.879267077239729522e-01 4.881389425797375524e-03 +4.690000000000000000e+02 4.890196973753088705e-01 4.892317447504762606e-03 +4.700000000000000000e+02 4.903385319306727830e-01 4.905503975830223344e-03 +4.710000000000000000e+02 4.916239569832745460e-01 4.918297767457276842e-03 +4.720000000000000000e+02 4.928280443084688822e-01 4.930335786547976155e-03 +4.730000000000000000e+02 4.940788766374890617e-01 4.942804168163008986e-03 +4.740000000000000000e+02 4.952968538133055709e-01 4.955020482063005917e-03 +4.750000000000000000e+02 4.962184136908732168e-01 4.964222098280131334e-03 +4.760000000000000000e+02 4.967074536656028716e-01 4.969066781627252787e-03 +4.770000000000000000e+02 4.968480016367842200e-01 4.970474972918421941e-03 +4.780000000000000000e+02 4.969608770486850791e-01 4.971532106074917808e-03 +4.790000000000000000e+02 4.974284756809802532e-01 4.976215480327669978e-03 +4.800000000000000000e+02 4.974933545574509175e-01 1.110826397886455381e-02 +4.810000000000000000e+02 4.975582334339216373e-01 1.117177902080745619e-02 +4.820000000000000000e+02 4.976231123103923015e-01 1.134220703515260303e-02 +4.830000000000000000e+02 4.976879911868629658e-01 5.248101339437859225e-02 +4.840000000000000000e+02 4.977528700633336856e-01 5.313280887247989054e-02 +4.850000000000000000e+02 4.978177489398043498e-01 5.204703399830555577e-02 +4.860000000000000000e+02 4.978826278162750141e-01 4.980454075454329027e-02 +4.870000000000000000e+02 4.979475066927456783e-01 4.831925647280978231e-02 +4.880000000000000000e+02 4.980123855692163981e-01 4.817795679090828426e-02 +4.890000000000000000e+02 4.980772644456870624e-01 4.887346763059156191e-02 +4.900000000000000000e+02 4.981421433221577266e-01 4.972409746750065113e-02 +4.910000000000000000e+02 4.982070221986284464e-01 1.112235486208608057e-02 +4.920000000000000000e+02 4.982719010750991107e-01 4.984950430769013487e-03 +4.930000000000000000e+02 4.992048066171406173e-01 4.993954171907215994e-03 +4.940000000000000000e+02 5.000000227422936039e-01 5.001923183861674282e-03 +4.950000000000000000e+02 5.005273669326436581e-01 5.007138514868077379e-03 +4.960000000000000000e+02 5.008386557158515107e-01 5.010301061097611336e-03 +4.970000000000000000e+02 5.012116445898998629e-01 5.014046314729964614e-03 +4.980000000000000000e+02 5.017899081433867536e-01 5.019848800183517035e-03 +4.990000000000000000e+02 5.024669494083962018e-01 5.026934648789698444e-03 +5.000000000000000000e+02 5.030955673705070907e-01 5.033202993485150559e-03 +5.010000000000000000e+02 5.034755446388257116e-01 5.037011131560865593e-03 +5.020000000000000000e+02 5.035338975379153315e-01 5.037274159379768503e-03 +5.030000000000000000e+02 5.031298203207559272e-01 5.033204820573094172e-03 +5.040000000000000000e+02 5.025059961702391664e-01 5.026949480480900900e-03 +5.050000000000000000e+02 5.016609002673524387e-01 5.018427876573482854e-03 +5.060000000000000000e+02 5.008796548786990099e-01 5.010624421296835940e-03 +5.070000000000000000e+02 5.004380652084106096e-01 5.006181132710238804e-03 +5.080000000000000000e+02 5.005667090292056365e-01 5.007487495147164291e-03 +5.090000000000000000e+02 5.011254263795497099e-01 5.013066121967662582e-03 +5.100000000000000000e+02 5.021998780381657923e-01 5.023781538655232998e-03 +5.110000000000000000e+02 5.034015358407494256e-01 5.035832304738125861e-03 +5.120000000000000000e+02 5.040592416004637810e-01 5.042390001691708298e-03 +5.130000000000000000e+02 5.039994852279905402e-01 5.041876197054395194e-03 +5.140000000000000000e+02 5.032831944185803819e-01 5.034750899430740986e-03 +5.150000000000000000e+02 5.024565047127871331e-01 5.027506633909125874e-03 +5.160000000000000000e+02 5.024821473439543551e-01 5.028516233924794701e-03 +5.170000000000000000e+02 5.033094002070922501e-01 5.036995340985631064e-03 +5.180000000000000000e+02 5.041430436287881456e-01 5.043817368005526144e-03 +5.190000000000000000e+02 5.046038569260942186e-01 5.048096768531537201e-03 +5.200000000000000000e+02 5.047333794781851957e-01 5.050356323130619253e-03 +5.210000000000000000e+02 5.048901764435332895e-01 5.052506442181121590e-03 +5.220000000000000000e+02 5.054888614235059086e-01 5.057092046250441855e-03 +5.230000000000000000e+02 5.065660771217369573e-01 5.067953488484422224e-03 +5.240000000000000000e+02 5.076757771206529268e-01 5.079589744293773121e-03 +5.250000000000000000e+02 5.086649978468759103e-01 5.090604650618884598e-03 +5.260000000000000000e+02 5.097953407921750335e-01 5.100681155594905154e-03 +5.270000000000000000e+02 5.108584592725350371e-01 5.111004338096380474e-03 +5.280000000000000000e+02 5.116062671419202568e-01 5.118471972912733321e-03 +5.290000000000000000e+02 5.120537535569215093e-01 5.123226415267159023e-03 +5.300000000000000000e+02 5.126433992912818871e-01 5.128779887344613563e-03 +5.310000000000000000e+02 5.130922956338834773e-01 5.133237066297225218e-03 +5.320000000000000000e+02 5.132925919916923041e-01 5.135278340298256652e-03 +5.330000000000000000e+02 5.135595055089845484e-01 5.137947229950378530e-03 +5.340000000000000000e+02 5.141310076968457210e-01 5.143617305395793357e-03 +5.350000000000000000e+02 5.152876257437407626e-01 5.155212691785459808e-03 +5.360000000000000000e+02 5.167935301956370076e-01 5.170245464403136135e-03 +5.370000000000000000e+02 5.178744940034666344e-01 5.181117783276840798e-03 +5.380000000000000000e+02 5.184644349871330160e-01 5.187017155875122201e-03 +5.390000000000000000e+02 5.190265098835775692e-01 5.192961976022860901e-03 +5.400000000000000000e+02 5.197832538619863163e-01 5.200265104677206061e-03 +5.410000000000000000e+02 5.207597426866779067e-01 5.209936018568839255e-03 +5.420000000000000000e+02 5.217007136504210330e-01 5.219361290814002706e-03 +5.430000000000000000e+02 5.223172117212233623e-01 5.225464954596804358e-03 +5.440000000000000000e+02 5.225240195094537077e-01 5.227556444116982295e-03 +5.450000000000000000e+02 5.226699047837024548e-01 5.229007465061047757e-03 +5.460000000000000000e+02 5.231078532574365836e-01 5.233355884509140708e-03 +5.470000000000000000e+02 5.238650690191422044e-01 5.240967571198850393e-03 +5.480000000000000000e+02 5.248908138049552807e-01 5.251166713361460868e-03 +5.490000000000000000e+02 5.261397861140961751e-01 5.263697282513750582e-03 +5.500000000000000000e+02 5.273732380872914183e-01 5.275998798524110175e-03 +5.510000000000000000e+02 5.282907130778097260e-01 5.285177535698447684e-03 +5.520000000000000000e+02 5.289628302622857436e-01 5.291925274032398610e-03 +5.530000000000000000e+02 5.295980622310012542e-01 5.298203611876225495e-03 +5.540000000000000000e+02 5.303145910857475220e-01 5.305417773628554219e-03 +5.550000000000000000e+02 5.310713771173616315e-01 5.312971683852448293e-03 +5.560000000000000000e+02 5.317245349528092468e-01 5.319569268929063600e-03 +5.570000000000000000e+02 5.321674768136475109e-01 5.324026935729449586e-03 +5.580000000000000000e+02 5.324838110152334547e-01 5.327171734960563232e-03 +5.590000000000000000e+02 5.328810508755567055e-01 5.331183530894977041e-03 +5.600000000000000000e+02 5.335456888050558177e-01 5.337745671702273306e-03 +5.610000000000000000e+02 5.344236558352271071e-01 5.346539492209098979e-03 +5.620000000000000000e+02 5.352472949034803307e-01 5.354766562816607942e-03 +5.630000000000000000e+02 5.358774617049351097e-01 5.361067643357531054e-03 +5.640000000000000000e+02 5.364370689166464423e-01 5.366703624318723033e-03 +5.650000000000000000e+02 5.371336051201884842e-01 5.373602468251006438e-03 +5.660000000000000000e+02 5.380046371645885728e-01 5.382360305881250979e-03 +5.670000000000000000e+02 5.389438813516677085e-01 5.391726997051934402e-03 +5.680000000000000000e+02 5.399217597186514173e-01 5.401553410880358293e-03 +5.690000000000000000e+02 5.409055944870915233e-01 5.411390252144288385e-03 +5.700000000000000000e+02 5.418191881870311200e-01 5.420486956510842287e-03 +5.710000000000000000e+02 5.426181625303534428e-01 5.428511983252374065e-03 +5.720000000000000000e+02 5.433255075664572553e-01 5.435501442292212972e-03 +5.730000000000000000e+02 5.439738850968590667e-01 5.442004676740765275e-03 +5.740000000000000000e+02 5.446011421201142344e-01 5.448293524149537895e-03 +5.750000000000000000e+02 5.451829758762857248e-01 5.454120963059647456e-03 +5.760000000000000000e+02 5.456015846299467897e-01 5.458346286869115473e-03 +5.770000000000000000e+02 5.458554828436106288e-01 5.460825782414898376e-03 +5.780000000000000000e+02 5.462116740867872799e-01 5.464436445341656380e-03 +5.790000000000000000e+02 5.470008368487461192e-01 5.472255185671431876e-03 +5.800000000000000000e+02 5.479430483785660000e-01 5.481686655646031761e-03 +5.810000000000000000e+02 5.486274974220263223e-01 5.488490789421537203e-03 +5.820000000000000000e+02 5.490450938547033477e-01 5.492633421000493385e-03 +5.830000000000000000e+02 5.494543900248467505e-01 5.496789498307877789e-03 +5.840000000000000000e+02 5.499968225104375774e-01 5.502156245219657314e-03 +5.850000000000000000e+02 5.505834030380304389e-01 5.508074699633483916e-03 +5.860000000000000000e+02 5.510565201013652992e-01 5.512822232181126443e-03 +5.870000000000000000e+02 5.513883884925607770e-01 5.516511028910022797e-03 +5.880000000000000000e+02 5.516449881694237556e-01 5.519698796014759282e-03 +5.890000000000000000e+02 5.517701237427985461e-01 5.520296987712144769e-03 +5.900000000000000000e+02 5.518688939636078317e-01 5.521019099170303319e-03 +5.910000000000000000e+02 5.521555528594026541e-01 5.523787914583338371e-03 +5.920000000000000000e+02 5.527771754198902432e-01 5.530012271923681437e-03 +5.930000000000000000e+02 5.535880077747815653e-01 5.538091229643209157e-03 +5.940000000000000000e+02 5.544155965853019286e-01 5.546369225615100165e-03 +5.950000000000000000e+02 5.551743167103910803e-01 5.553996305598942265e-03 +5.960000000000000000e+02 5.559105802283614839e-01 5.561304317082828297e-03 +5.970000000000000000e+02 5.567680276327460209e-01 5.569943198993834374e-03 +5.980000000000000000e+02 5.577978654463593422e-01 5.580234406615910102e-03 +5.990000000000000000e+02 5.588093968180302129e-01 5.590660786037049586e-03 +6.000000000000000000e+02 5.594027079523624657e-01 5.596451761922464040e-03 +6.010000000000000000e+02 5.597013725674142570e-01 5.599277621164135479e-03 +6.020000000000000000e+02 5.600201108429182506e-01 5.602607800908767158e-03 +6.030000000000000000e+02 5.604606233431665974e-01 5.606919105612881427e-03 +6.040000000000000000e+02 5.609704907953856345e-01 5.612022076752559534e-03 +6.050000000000000000e+02 5.616280710654639741e-01 5.618604674550314176e-03 +6.060000000000000000e+02 5.625868161628415631e-01 5.628096369866953871e-03 +6.070000000000000000e+02 5.637852900111968157e-01 5.640111589669397248e-03 +6.080000000000000000e+02 5.650567861249805590e-01 5.652784672705707218e-03 +6.090000000000000000e+02 5.662402182775916337e-01 5.664691374787377692e-03 +6.100000000000000000e+02 5.673047848236657531e-01 5.675287461878020419e-03 +6.110000000000000000e+02 5.681105644374216945e-01 5.683392090646890819e-03 +6.120000000000000000e+02 5.685799104470401488e-01 5.688089206078165289e-03 +6.130000000000000000e+02 5.687887278817090886e-01 5.690185498369817151e-03 +6.140000000000000000e+02 5.689665643094353742e-01 5.692297658959788453e-03 +6.150000000000000000e+02 5.692867714644861410e-01 5.695429515799137025e-03 +6.160000000000000000e+02 5.697018538083410411e-01 5.699316109907750713e-03 +6.170000000000000000e+02 5.700781315679976924e-01 5.703024322328354226e-03 +6.180000000000000000e+02 5.703562300862925483e-01 5.705811907700390415e-03 +6.190000000000000000e+02 5.706028604042366892e-01 5.708255956152295980e-03 +6.200000000000000000e+02 5.709370613601142397e-01 5.711536127222527348e-03 +6.210000000000000000e+02 5.714859545561794540e-01 5.717132479923864308e-03 +6.220000000000000000e+02 5.722908596588464070e-01 5.725118078997484296e-03 +6.230000000000000000e+02 5.732483523642377676e-01 5.734750484951257367e-03 +6.240000000000000000e+02 5.742297576465283937e-01 5.744572880404253713e-03 +6.250000000000000000e+02 5.751921701617946914e-01 5.754224577058627936e-03 +6.260000000000000000e+02 5.760131687632354947e-01 5.762430606000824851e-03 +6.270000000000000000e+02 5.765187540227409979e-01 5.767442360391033217e-03 +6.280000000000000000e+02 5.767693530264501600e-01 5.770016515616106442e-03 +6.290000000000000000e+02 5.769939599031636002e-01 5.772192006814806306e-03 +6.300000000000000000e+02 5.774014237303616293e-01 5.776298365061414281e-03 +6.310000000000000000e+02 5.780292755817233452e-01 5.782551342912258842e-03 +6.320000000000000000e+02 5.788268191316080502e-01 5.790521288107757132e-03 +6.330000000000000000e+02 5.796979950599228104e-01 5.799243358438239092e-03 +6.340000000000000000e+02 5.805848938480829835e-01 5.808063909389159923e-03 +6.350000000000000000e+02 5.814391097861599800e-01 5.816596203413612609e-03 +6.360000000000000000e+02 5.821874815266925296e-01 5.824039140550052972e-03 +6.370000000000000000e+02 5.828734112799466294e-01 5.830947248492817855e-03 +6.380000000000000000e+02 5.836360928338621967e-01 5.838576167938276835e-03 +6.390000000000000000e+02 5.846186685404004546e-01 5.848362451413205605e-03 +6.400000000000000000e+02 5.860292783155507390e-01 5.862561486383821747e-03 +6.410000000000000000e+02 5.872946486272421218e-01 5.875143965578769924e-03 +6.420000000000000000e+02 5.884015297694015212e-01 5.886232737529139246e-03 +6.430000000000000000e+02 5.893487227166487319e-01 5.895693398208213393e-03 +6.440000000000000000e+02 5.901431133589596367e-01 5.903658825627078853e-03 +6.450000000000000000e+02 5.908681233988410941e-01 5.910900677023571935e-03 +6.460000000000000000e+02 5.915699701043165559e-01 5.917889957702006203e-03 +6.470000000000000000e+02 5.922627950989608481e-01 5.924899915264627073e-03 +6.480000000000000000e+02 5.930272223271495502e-01 5.932466003084010432e-03 +6.490000000000000000e+02 5.939776140423121964e-01 5.941998961681220319e-03 +6.500000000000000000e+02 5.940596023020850991e-01 1.163599764546288488e-02 +6.510000000000000000e+02 5.941415905618580018e-01 1.160922737004866506e-02 +6.520000000000000000e+02 5.942235788216309045e-01 1.167349243562955906e-02 +6.530000000000000000e+02 5.943055670814038072e-01 5.152786195850164730e-02 +6.540000000000000000e+02 5.943875553411767099e-01 5.255857013303814884e-02 +6.550000000000000000e+02 5.944695436009496126e-01 5.252213657339502295e-02 +6.560000000000000000e+02 5.945515318607225153e-01 5.103748098030048280e-02 +6.570000000000000000e+02 5.946335201204954179e-01 4.948510872177015046e-02 +6.580000000000000000e+02 5.947155083802683206e-01 4.895738775717421720e-02 +6.590000000000000000e+02 5.947974966400412233e-01 4.914525965331308088e-02 +6.600000000000000000e+02 5.948794848998141260e-01 4.949586949986977541e-02 +6.610000000000000000e+02 5.949614731595870287e-01 1.154950890209348324e-02 +6.620000000000000000e+02 5.950434614193599314e-01 5.952553302866181971e-03 +6.630000000000000000e+02 5.960384040799842076e-01 5.962827017990312770e-03 +6.640000000000000000e+02 5.968977239467008200e-01 5.971401854948100475e-03 +6.650000000000000000e+02 5.976922698916873333e-01 5.979078264912053749e-03 +6.660000000000000000e+02 5.984855639775849001e-01 5.987075868587513235e-03 +6.670000000000000000e+02 5.992811578320338395e-01 5.994962996687909669e-03 +6.680000000000000000e+02 6.001160432369694320e-01 6.003340265870438751e-03 +6.690000000000000000e+02 6.010940469366122807e-01 6.013122372698240410e-03 +6.700000000000000000e+02 6.022587092913339601e-01 6.024801616896289028e-03 +6.710000000000000000e+02 6.036016267263170088e-01 6.038228875501396725e-03 +6.720000000000000000e+02 6.048883831372682263e-01 6.051055703519278919e-03 +6.730000000000000000e+02 6.057362496528987394e-01 6.059627548447080875e-03 +6.740000000000000000e+02 6.065500753287890179e-01 6.067676275405125934e-03 +6.750000000000000000e+02 6.072132590585969103e-01 6.074346707305095135e-03 +6.760000000000000000e+02 6.076965005712926526e-01 6.079153884128151233e-03 +6.770000000000000000e+02 6.081005428793934131e-01 6.083221564365398799e-03 +6.780000000000000000e+02 6.085497946021791726e-01 6.087698508869093458e-03 +6.790000000000000000e+02 6.091668771676552741e-01 6.093817262632241112e-03 +6.800000000000000000e+02 6.099754721934742552e-01 6.101982783616372898e-03 +6.810000000000000000e+02 6.100453759554662625e-01 1.169356362483434802e-02 +6.820000000000000000e+02 6.101152797174581588e-01 1.170640798348219179e-02 +6.830000000000000000e+02 6.101851834794501661e-01 1.176351722901133705e-02 +6.840000000000000000e+02 6.102550872414420624e-01 1.189317333021930670e-02 +6.850000000000000000e+02 6.103249910034340697e-01 1.204576516500515532e-02 +6.860000000000000000e+02 6.103948947654259660e-01 1.207316573251182752e-02 +6.870000000000000000e+02 6.104647985274179733e-01 1.193395939730694695e-02 +6.880000000000000000e+02 6.105347022894098696e-01 1.179742244961136388e-02 +6.890000000000000000e+02 6.106046060514018770e-01 1.176416307890407360e-02 +6.900000000000000000e+02 6.106745098133937732e-01 1.176520546500505089e-02 +6.910000000000000000e+02 6.107444135753857806e-01 1.174122068671626905e-02 +6.920000000000000000e+02 6.108143173373776769e-01 1.170136748229359813e-02 +6.930000000000000000e+02 6.108842210993696842e-01 6.111075099658467777e-03 +6.940000000000000000e+02 6.117294527179227837e-01 6.119557883374477161e-03 +6.950000000000000000e+02 6.124556535976622973e-01 6.126768450696659998e-03 +6.960000000000000000e+02 6.131300574630795808e-01 6.133562411701733857e-03 +6.970000000000000000e+02 6.137922085955807017e-01 6.140185676517280824e-03 +6.980000000000000000e+02 6.144218337514237849e-01 6.146530381978499921e-03 +6.990000000000000000e+02 6.149933830082782160e-01 6.152289931730807113e-03 +7.000000000000000000e+02 6.155121929490919852e-01 6.157439198363633473e-03 +7.010000000000000000e+02 6.159934148496393203e-01 6.162313510756049426e-03 +7.020000000000000000e+02 6.164014252956906414e-01 6.166330507234564495e-03 +7.030000000000000000e+02 6.166783721372796068e-01 6.169120931341764286e-03 +7.040000000000000000e+02 6.166339777035890757e-01 6.168655041521853982e-03 +7.050000000000000000e+02 6.162287639354762092e-01 6.164585409466043740e-03 +7.060000000000000000e+02 6.155402127683279323e-01 6.157740411550622663e-03 +7.070000000000000000e+02 6.147272786138237022e-01 6.149550130625534849e-03 +7.080000000000000000e+02 6.141535458430902317e-01 6.143848879952605938e-03 +7.090000000000000000e+02 6.141058320870909082e-01 6.143352065071531858e-03 +7.100000000000000000e+02 6.143535108430741021e-01 6.145836877704449926e-03 +7.110000000000000000e+02 6.145400604957382829e-01 6.147718479453215777e-03 +7.120000000000000000e+02 6.145073912771688018e-01 6.147367766679501938e-03 +7.130000000000000000e+02 6.143444998419889114e-01 6.145939181808033475e-03 +7.140000000000000000e+02 6.141501315352091428e-01 6.143965238241187558e-03 +7.150000000000000000e+02 6.139256155085398570e-01 6.141808972298863287e-03 +7.160000000000000000e+02 6.136563159668735334e-01 6.139185585814509009e-03 +7.170000000000000000e+02 6.133681860385030715e-01 6.136945470874877705e-03 +7.180000000000000000e+02 6.132220009203870337e-01 6.135913222522449903e-03 +7.190000000000000000e+02 6.132725553775684180e-01 6.135623856404912035e-03 +7.200000000000000000e+02 6.135207522153017790e-01 6.137800202895407620e-03 +7.210000000000000000e+02 6.138713484506854723e-01 6.141183983611289351e-03 +7.220000000000000000e+02 6.142409828273931449e-01 6.144890232363463614e-03 +7.230000000000000000e+02 6.145605955273447663e-01 6.148058612108653342e-03 +7.240000000000000000e+02 6.148083499332714918e-01 6.150571795467503142e-03 +7.250000000000000000e+02 6.150983317276960127e-01 6.153483819726665409e-03 +7.260000000000000000e+02 6.155556681796506835e-01 6.158062921216841262e-03 +7.270000000000000000e+02 6.162072178638779985e-01 6.164961481378967989e-03 +7.280000000000000000e+02 6.170262975406589634e-01 6.173080643045885697e-03 +7.290000000000000000e+02 6.177460677330324224e-01 6.180335945250984599e-03 +7.300000000000000000e+02 6.181080853280402909e-01 6.183586536080913632e-03 +7.310000000000000000e+02 6.183218141876282159e-01 6.185711064252455774e-03 +7.320000000000000000e+02 6.186041380124399636e-01 6.188498608896910065e-03 +7.330000000000000000e+02 6.189617193418505137e-01 6.192043848040795946e-03 +7.340000000000000000e+02 6.192780561587364341e-01 6.195263002382891092e-03 +7.350000000000000000e+02 6.194978227269652971e-01 6.197406911152274211e-03 +7.360000000000000000e+02 6.196544178739592512e-01 6.199029302839305713e-03 +7.370000000000000000e+02 6.198177869052161615e-01 6.200663843308928252e-03 +7.380000000000000000e+02 6.200091724232504875e-01 6.202624646641379663e-03 +7.390000000000000000e+02 6.201061921281990630e-01 6.203606690742310102e-03 +7.400000000000000000e+02 6.200293434147486904e-01 6.202828334470550722e-03 +7.410000000000000000e+02 6.196612190013145449e-01 6.199196981106307007e-03 +7.420000000000000000e+02 6.192162593928038916e-01 6.194662261940305469e-03 +7.430000000000000000e+02 6.191072881865351540e-01 6.193590761489019964e-03 +7.440000000000000000e+02 6.190874160773827128e-01 6.193352713592541886e-03 +7.450000000000000000e+02 6.189272392184796967e-01 6.191763118185955247e-03 +7.460000000000000000e+02 6.186533434674453824e-01 6.189005778414306130e-03 +7.470000000000000000e+02 6.183976713124589297e-01 6.186461086598825203e-03 +7.480000000000000000e+02 6.182157570317060591e-01 6.184702156169985185e-03 +7.490000000000000000e+02 6.181123468884317518e-01 6.183777588453745477e-03 +7.500000000000000000e+02 6.180315425582647570e-01 6.183162459662621194e-03 +7.510000000000000000e+02 6.178844654399543446e-01 6.181650407444983474e-03 +7.520000000000000000e+02 6.176000015648049901e-01 6.179736372251176842e-03 +7.530000000000000000e+02 6.173560507300338562e-01 6.175937121716959695e-03 +7.540000000000000000e+02 6.173423539545176419e-01 1.163638405159305757e-02 +7.550000000000000000e+02 6.173286571790013166e-01 1.154475845344722640e-02 +7.560000000000000000e+02 6.173149604034851023e-01 9.859394758480953536e-02 +7.570000000000000000e+02 6.173012636279688881e-01 1.047130225914174179e-01 +7.580000000000000000e+02 6.172875668524526738e-01 1.177721745108219892e-01 +7.590000000000000000e+02 6.172738700769364595e-01 1.324788995216795440e-01 +7.600000000000000000e+02 6.172601733014201342e-01 1.326244542032908313e-01 +7.610000000000000000e+02 6.172464765259039199e-01 1.159592475305588483e-01 +7.620000000000000000e+02 6.172327797503877056e-01 1.043753305610231608e-01 +7.630000000000000000e+02 6.172190829748713803e-01 1.010733567511303832e-01 +7.640000000000000000e+02 6.172053861993551660e-01 9.940144981119973522e-02 +7.650000000000000000e+02 6.171916894238389517e-01 9.758861438142286959e-02 +7.660000000000000000e+02 6.171779926483227374e-01 9.653705250098869317e-02 +7.670000000000000000e+02 6.171642958728065231e-01 9.676459963670662467e-02 +7.680000000000000000e+02 6.171505990972901978e-01 9.801314138815997445e-02 +7.690000000000000000e+02 6.171369023217739835e-01 6.174425994892825988e-03 +7.700000000000000000e+02 6.169364608634579916e-01 6.172145985897763143e-03 +7.710000000000000000e+02 6.167036955060198888e-01 6.170364828430421715e-03 +7.720000000000000000e+02 6.164573881874404471e-01 6.167443715927372824e-03 +7.730000000000000000e+02 6.162311045596089443e-01 6.165255131902629138e-03 +7.740000000000000000e+02 6.159372073765363442e-01 6.162279226540657434e-03 +7.750000000000000000e+02 6.155681235356538217e-01 6.158665009031225220e-03 +7.760000000000000000e+02 6.151937490124377295e-01 6.154913328271320420e-03 +7.770000000000000000e+02 6.149411664390648236e-01 6.152747426812014628e-03 +7.780000000000000000e+02 6.147044606941322042e-01 6.149785070870473179e-03 +7.790000000000000000e+02 6.140657912367109006e-01 6.143298883102558255e-03 +7.800000000000000000e+02 6.132367003488229384e-01 6.135080117903955049e-03 +7.810000000000000000e+02 6.124606444335849442e-01 6.127272567783647803e-03 +7.820000000000000000e+02 6.116355891985958415e-01 6.119077749402706233e-03 +7.830000000000000000e+02 6.108799600892548254e-01 6.111516819996018132e-03 +7.840000000000000000e+02 6.104806522023792370e-01 6.108230335143345451e-03 +7.850000000000000000e+02 6.104244067550630426e-01 6.107753850392617923e-03 +7.860000000000000000e+02 6.103890711869373042e-01 6.106598833691487781e-03 +7.870000000000000000e+02 6.102369482200759032e-01 6.105134303604067142e-03 +7.880000000000000000e+02 6.099871710832099891e-01 6.102586627725685789e-03 +7.890000000000000000e+02 6.096004290178973495e-01 6.098769577163784192e-03 +7.900000000000000000e+02 6.091793761302328747e-01 6.094577143300563583e-03 +7.910000000000000000e+02 6.088072068877710130e-01 6.090905265646915680e-03 +7.920000000000000000e+02 6.084647967153142822e-01 6.088883296338891589e-03 +7.930000000000000000e+02 6.082090782148293906e-01 6.086720586350854480e-03 +7.940000000000000000e+02 6.080548133637452279e-01 6.084765654083172833e-03 +7.950000000000000000e+02 6.080471496121847563e-01 6.083337169070079410e-03 +7.960000000000000000e+02 6.080794510182301327e-01 6.083647533905368020e-03 +7.970000000000000000e+02 6.080679363885045374e-01 6.083483236464830128e-03 +7.980000000000000000e+02 6.080655042765442664e-01 6.083516665764135412e-03 +7.990000000000000000e+02 6.080761104404874828e-01 6.083674524624856431e-03 +8.000000000000000000e+02 6.080962391976499903e-01 6.084132860692992480e-03 +8.010000000000000000e+02 6.076744875165311921e-01 6.079716893842184930e-03 +8.020000000000000000e+02 6.074110424370096073e-01 6.077000212911429743e-03 +8.030000000000000000e+02 6.074471922856874428e-01 6.077438495370130443e-03 +8.040000000000000000e+02 6.075738367164221776e-01 6.078680163849782200e-03 +8.050000000000000000e+02 6.075699238366584209e-01 6.078659880611408592e-03 +8.060000000000000000e+02 6.072792289758435214e-01 6.075798636945857478e-03 +8.070000000000000000e+02 6.069116423129161664e-01 6.072050622425319462e-03 +8.080000000000000000e+02 6.066118256852561785e-01 6.069167629060588653e-03 +8.090000000000000000e+02 6.063909626022301325e-01 6.066851822242572481e-03 +8.100000000000000000e+02 6.061353628681479533e-01 6.064379380098899354e-03 +8.110000000000000000e+02 6.061200209392066940e-01 1.168447682344572053e-02 +8.120000000000000000e+02 6.061046790102655457e-01 1.176248188623205647e-02 +8.130000000000000000e+02 6.060893370813242864e-01 1.183222851000354132e-02 +8.140000000000000000e+02 6.060739951523830271e-01 1.189561930771176196e-02 +8.150000000000000000e+02 6.060586532234418788e-01 1.191950067110399483e-02 +8.160000000000000000e+02 6.060433112945006195e-01 1.190043646906926121e-02 +8.170000000000000000e+02 6.060279693655593602e-01 1.185437080157226639e-02 +8.180000000000000000e+02 6.060126274366182120e-01 1.180582988981531897e-02 +8.190000000000000000e+02 6.059972855076769527e-01 1.176915403605450529e-02 +8.200000000000000000e+02 6.059819435787356934e-01 1.177604281838092772e-02 +8.210000000000000000e+02 6.059666016497945451e-01 1.179929144105866350e-02 +8.220000000000000000e+02 6.059512597208532858e-01 1.178844826117525155e-02 +8.230000000000000000e+02 6.059359177919121375e-01 1.172195140499797741e-02 +8.240000000000000000e+02 6.059205758629708782e-01 1.168795508424322338e-02 +8.250000000000000000e+02 6.059052339340296189e-01 1.171902420965813436e-02 +8.260000000000000000e+02 6.058898920050884707e-01 1.176754237741387682e-02 +8.270000000000000000e+02 6.058745500761472114e-01 1.179332535986610947e-02 +8.280000000000000000e+02 6.058592081472059521e-01 1.179890646902640068e-02 +8.290000000000000000e+02 6.058438662182648038e-01 1.180085175120015005e-02 +8.300000000000000000e+02 6.058285242893235445e-01 6.061656661659091568e-03 +8.310000000000000000e+02 6.054245744407362739e-01 6.057696211893945533e-03 +8.320000000000000000e+02 6.050314999766095436e-01 6.053689422688576967e-03 +8.330000000000000000e+02 6.046670539839085201e-01 6.050558321937591320e-03 +8.340000000000000000e+02 6.043422434906411400e-01 6.046785359200735829e-03 +8.350000000000000000e+02 6.039970250335849888e-01 6.043341362058952948e-03 +8.360000000000000000e+02 6.035357274289562257e-01 6.038651824505625147e-03 +8.370000000000000000e+02 6.028825364895925576e-01 6.032160697864469290e-03 +8.380000000000000000e+02 6.019981250640128456e-01 6.023348467031571819e-03 +8.390000000000000000e+02 6.011921082228299795e-01 6.015182643520610925e-03 +8.400000000000000000e+02 6.006069679892781510e-01 6.009459378018548736e-03 +8.410000000000000000e+02 6.003743402788969119e-01 6.007043266613634053e-03 +8.420000000000000000e+02 5.995353642088494528e-01 5.998727063954156780e-03 +8.430000000000000000e+02 5.982501692849405694e-01 5.985846131149997508e-03 +8.440000000000000000e+02 5.972903913665257303e-01 5.976283797927479935e-03 +8.450000000000000000e+02 5.970406031631728672e-01 5.973790613248346724e-03 +8.460000000000000000e+02 5.971127896895532805e-01 5.974466752878266132e-03 +8.470000000000000000e+02 5.969602245103702298e-01 5.973079119989834970e-03 +8.480000000000000000e+02 5.963272630194342838e-01 5.967565691006044247e-03 +8.490000000000000000e+02 5.954863682150408621e-01 5.958802587400947350e-03 +8.500000000000000000e+02 5.945503787248633820e-01 5.949575428611644790e-03 +8.510000000000000000e+02 5.939475191411660582e-01 5.944004499612038500e-03 +8.520000000000000000e+02 5.936189130171823924e-01 5.939974239569098709e-03 +8.530000000000000000e+02 5.930494635253797941e-01 5.936249935730281667e-03 +8.540000000000000000e+02 5.920246182885829933e-01 5.927325426672437614e-03 +8.550000000000000000e+02 5.903631102212578696e-01 5.907765676229346542e-03 +8.560000000000000000e+02 5.889022949352215042e-01 5.893347369821114873e-03 +8.570000000000000000e+02 5.881714117567780065e-01 5.885790652170658742e-03 +8.580000000000000000e+02 5.881441758411619647e-01 5.885837080456628005e-03 +8.590000000000000000e+02 5.884251926284581602e-01 5.890158961182954782e-03 +8.600000000000000000e+02 5.885323266805149167e-01 5.893599696492057838e-03 +8.610000000000000000e+02 5.883140591070807890e-01 5.888139287288395030e-03 +8.620000000000000000e+02 5.881335485013164943e-01 5.885485075220591236e-03 +8.630000000000000000e+02 5.882283659554676802e-01 5.887119566190079749e-03 +8.640000000000000000e+02 5.885808080873384807e-01 5.890532994087809004e-03 +8.650000000000000000e+02 5.884651563638245708e-01 5.890496042786773530e-03 +8.660000000000000000e+02 5.874451605354760186e-01 5.881017028354018454e-03 +8.670000000000000000e+02 5.859801623340616938e-01 5.864959955727258069e-03 +8.680000000000000000e+02 5.846976804333030575e-01 5.850774756620828916e-03 +8.690000000000000000e+02 5.838787769617856949e-01 5.842470773114699645e-03 +8.700000000000000000e+02 5.833784624275644148e-01 5.837459450941843465e-03 +8.710000000000000000e+02 5.832023485672872543e-01 5.835571274736664309e-03 +8.720000000000000000e+02 5.827951672774579484e-01 5.831685818305693686e-03 +8.730000000000000000e+02 5.821183369149074416e-01 5.826388442152151750e-03 +8.740000000000000000e+02 5.815706938509661583e-01 5.820559950228536804e-03 +8.750000000000000000e+02 5.813082019824160618e-01 5.817280824450852400e-03 +8.760000000000000000e+02 5.814827910854140081e-01 5.818682167327032806e-03 +8.770000000000000000e+02 5.815606843466454290e-01 5.819406677204352549e-03 +8.780000000000000000e+02 5.810542781516467858e-01 5.814418288828060444e-03 +8.790000000000000000e+02 5.800317410578512689e-01 5.804742946286165634e-03 +8.800000000000000000e+02 5.788200766929769703e-01 5.792524137288443918e-03 +8.810000000000000000e+02 5.774934819022071730e-01 5.778881310239862047e-03 +8.820000000000000000e+02 5.761366612745832949e-01 5.765192163274182949e-03 +8.830000000000000000e+02 5.748272350055418922e-01 5.752148719337038182e-03 +8.840000000000000000e+02 5.737047754318040926e-01 5.740899797989305539e-03 +8.850000000000000000e+02 5.725400049177139516e-01 5.729323506002260633e-03 +8.860000000000000000e+02 5.711750985358761135e-01 5.716787286447711121e-03 +8.870000000000000000e+02 5.696238676436059523e-01 5.700157359507283285e-03 +8.880000000000000000e+02 5.680044997396266337e-01 5.684018031863411965e-03 +8.890000000000000000e+02 5.665911902922557974e-01 5.669787233167196405e-03 +8.900000000000000000e+02 5.656119966185710890e-01 5.660118069204949504e-03 +8.910000000000000000e+02 5.650238124192299427e-01 5.654179724459862388e-03 +8.920000000000000000e+02 5.645141179310245727e-01 5.649208242250935638e-03 +8.930000000000000000e+02 5.638664901928174267e-01 5.642694069007951445e-03 +8.940000000000000000e+02 5.628176247590407355e-01 5.632340320211454143e-03 +8.950000000000000000e+02 5.613754992605898275e-01 5.618312465307378871e-03 +8.960000000000000000e+02 5.596528143621353202e-01 5.602276657106902528e-03 +8.970000000000000000e+02 5.577424620994851923e-01 5.582739017634136096e-03 +8.980000000000000000e+02 5.557884106230021048e-01 5.562546819459202561e-03 +8.990000000000000000e+02 5.541594368292634964e-01 5.547114568179435483e-03 +9.000000000000000000e+02 5.528296048755674263e-01 5.533699882374630390e-03 +9.010000000000000000e+02 5.514897230609502321e-01 5.520265774718882690e-03 +9.020000000000000000e+02 5.500397366445592962e-01 5.505386568380061033e-03 +9.030000000000000000e+02 5.485580042653883659e-01 5.489902170624746600e-03 +9.040000000000000000e+02 5.471804942797864335e-01 5.476116880758385118e-03 +9.050000000000000000e+02 5.458778471723860770e-01 5.463080906040642185e-03 +9.060000000000000000e+02 5.446716807636740043e-01 5.451361163570108900e-03 +9.070000000000000000e+02 5.436759545625614587e-01 5.442690346316133784e-03 +9.080000000000000000e+02 5.428174166423322955e-01 5.434468565565296443e-03 +9.090000000000000000e+02 5.417749025491721548e-01 5.423207328667336603e-03 +9.100000000000000000e+02 5.402014951994978942e-01 5.406879230993828951e-03 +9.110000000000000000e+02 5.380016779194430887e-01 5.384731905755758830e-03 +9.120000000000000000e+02 5.352612812930818142e-01 5.357351493351927667e-03 +9.130000000000000000e+02 5.322290252670479616e-01 5.327117237211872677e-03 +9.140000000000000000e+02 5.293542966456545873e-01 5.298308400729151088e-03 +9.150000000000000000e+02 5.269589511330093901e-01 5.275211220274715271e-03 +9.160000000000000000e+02 5.249704681292468589e-01 5.255059451379993571e-03 +9.170000000000000000e+02 5.230499076938184277e-01 5.236014845210466492e-03 +9.180000000000000000e+02 5.208709603503873797e-01 5.213391906981953462e-03 +9.190000000000000000e+02 5.178707223504875889e-01 5.183412879078521870e-03 +9.200000000000000000e+02 5.139027192636547170e-01 5.143672722230476120e-03 +9.210000000000000000e+02 5.094100718521371585e-01 5.098851594536843099e-03 +9.220000000000000000e+02 5.050515353445206301e-01 5.055387626787523521e-03 +9.230000000000000000e+02 5.009341659380786016e-01 5.014656161035329317e-03 +9.240000000000000000e+02 4.970795987882178912e-01 4.975641406024694166e-03 +9.250000000000000000e+02 4.938709274606627453e-01 4.943292170745506448e-03 +9.260000000000000000e+02 4.918530002642909071e-01 4.923210878227047421e-03 +9.270000000000000000e+02 4.911778703401037394e-01 4.916429320749733135e-03 +9.280000000000000000e+02 4.909852448696899740e-01 4.915237908197927705e-03 +9.290000000000000000e+02 4.904108821268060581e-01 4.911010462287775276e-03 +9.300000000000000000e+02 4.887854657847843232e-01 4.896978602694013367e-03 +9.310000000000000000e+02 4.863809041395475430e-01 4.874556141819715201e-03 +9.320000000000000000e+02 4.833591805168604427e-01 4.845946105551898232e-03 +9.330000000000000000e+02 4.800013955992873393e-01 4.813717988507605107e-03 +9.340000000000000000e+02 4.764141364755156705e-01 4.778340105708758431e-03 +9.350000000000000000e+02 4.725337142901013809e-01 4.735258432873594610e-03 +9.360000000000000000e+02 4.687209612289795491e-01 4.698492629513694938e-03 +9.370000000000000000e+02 4.652594873596422875e-01 4.663791735349196929e-03 +9.380000000000000000e+02 4.621290077197935942e-01 4.631154830854128726e-03 +9.390000000000000000e+02 4.592023759291139484e-01 4.598411031388148322e-03 +9.400000000000000000e+02 4.567686690883495659e-01 4.573821230111622081e-03 +9.410000000000000000e+02 4.548558814410926243e-01 4.554954267400110682e-03 +9.420000000000000000e+02 4.529424004733237363e-01 4.539246953969871233e-03 +9.430000000000000000e+02 4.505800360513580460e-01 4.515379606697285213e-03 +9.440000000000000000e+02 4.479908685885618524e-01 4.487878775107125018e-03 +9.450000000000000000e+02 4.453419960864832827e-01 4.461048670260491650e-03 +9.460000000000000000e+02 4.420441232287021238e-01 4.427925401569727214e-03 +9.470000000000000000e+02 4.373970546414553406e-01 4.381012421537577514e-03 +9.480000000000000000e+02 4.312599112038008609e-01 4.319623918159576879e-03 +9.490000000000000000e+02 4.245668496598410391e-01 4.253571644675761820e-03 +9.500000000000000000e+02 4.181480848226274416e-01 4.189163132775073142e-03 +9.510000000000000000e+02 4.128377784527714756e-01 4.135453028770445967e-03 +9.520000000000000000e+02 4.084586076889037964e-01 4.091536352318768562e-03 +9.530000000000000000e+02 4.048801842702549614e-01 4.056039989437060928e-03 +9.540000000000000000e+02 4.018206150274700739e-01 4.025328457828238754e-03 +9.550000000000000000e+02 3.990444127625871196e-01 3.997706222117741910e-03 +9.560000000000000000e+02 3.964133263030448218e-01 3.971176043910774195e-03 +9.570000000000000000e+02 3.934403788826201787e-01 3.941437250624273830e-03 +9.580000000000000000e+02 3.899442997589530058e-01 3.906431517271465384e-03 +9.590000000000000000e+02 3.860867029620086988e-01 3.867679804415546062e-03 +9.600000000000000000e+02 3.820974599847587472e-01 3.827805017099819053e-03 +9.610000000000000000e+02 3.778631376225996541e-01 3.785239198980112473e-03 +9.620000000000000000e+02 3.733662525660725318e-01 3.740467934319256001e-03 +9.630000000000000000e+02 3.689671533402499870e-01 3.696280182482386979e-03 +9.640000000000000000e+02 3.649698295080780475e-01 3.656413388617010818e-03 +9.650000000000000000e+02 3.612337424987164813e-01 3.619641679690664693e-03 +9.660000000000000000e+02 3.573818916323118211e-01 3.580216093701374565e-03 +9.670000000000000000e+02 3.533818852434478242e-01 3.539896584091135109e-03 +9.680000000000000000e+02 3.494566359163692182e-01 3.500536896365816913e-03 +9.690000000000000000e+02 3.456142217024722463e-01 3.462161735473446092e-03 +9.700000000000000000e+02 3.416740752722713936e-01 3.422741473240824110e-03 +9.710000000000000000e+02 3.375499669029273786e-01 3.381912339455409467e-03 +9.720000000000000000e+02 3.333000287154199159e-01 3.339437155699763633e-03 +9.730000000000000000e+02 3.289672678238202419e-01 3.296480604019482504e-03 +9.740000000000000000e+02 3.244596182888406233e-01 3.251266219339206138e-03 +9.750000000000000000e+02 3.196647482783398497e-01 3.203464468865753565e-03 +9.760000000000000000e+02 3.146678114727977094e-01 3.153285180086820051e-03 +9.770000000000000000e+02 3.095334387444092505e-01 3.101985795663042209e-03 +9.780000000000000000e+02 3.043765124250011889e-01 3.050414722955998442e-03 +9.790000000000000000e+02 2.992591415933975596e-01 2.999045615422553726e-03 +9.800000000000000000e+02 2.942873881252527912e-01 2.949450707744354170e-03 +9.810000000000000000e+02 2.895896862004471717e-01 1.000000000000000056e-01 +9.820000000000000000e+02 2.851725039705181319e-01 1.000000000000000056e-01 +9.830000000000000000e+02 2.808876677979527670e-01 1.000000000000000056e-01 +9.840000000000000000e+02 2.765368883460332383e-01 1.000000000000000056e-01 +9.850000000000000000e+02 2.719297534472140954e-01 1.000000000000000056e-01 +9.860000000000000000e+02 2.670871439297765049e-01 1.000000000000000056e-01 +9.870000000000000000e+02 2.621311638556571011e-01 1.000000000000000056e-01 +9.880000000000000000e+02 2.571498797287008475e-01 1.000000000000000056e-01 +9.890000000000000000e+02 2.520821895472421525e-01 1.000000000000000056e-01 +9.900000000000000000e+02 2.468912706595203232e-01 1.000000000000000056e-01 +9.910000000000000000e+02 2.416148390186070305e-01 1.000000000000000056e-01 +9.920000000000000000e+02 2.363703111886830133e-01 1.000000000000000056e-01 +9.930000000000000000e+02 2.312475602917352102e-01 1.000000000000000056e-01 +9.940000000000000000e+02 2.262203793325666679e-01 1.000000000000000056e-01 +9.950000000000000000e+02 2.212683102080942321e-01 1.000000000000000056e-01 +9.960000000000000000e+02 2.163389281595638758e-01 1.000000000000000056e-01 +9.970000000000000000e+02 2.114020390398878846e-01 1.000000000000000056e-01 +9.980000000000000000e+02 2.064763076099080941e-01 1.000000000000000056e-01 +9.990000000000000000e+02 2.016184780833522316e-01 1.000000000000000056e-01 +1.000000000000000000e+03 1.968600179142609152e-01 1.000000000000000056e-01 +1.001000000000000000e+03 1.921583121981945974e-01 1.000000000000000056e-01 +1.002000000000000000e+03 1.874562670217378157e-01 1.000000000000000056e-01 +1.003000000000000000e+03 1.827181698820697087e-01 1.000000000000000056e-01 +1.004000000000000000e+03 1.780002829190756031e-01 1.000000000000000056e-01 +1.005000000000000000e+03 1.732766972233956149e-01 1.000000000000000056e-01 +1.006000000000000000e+03 1.686222715523199855e-01 1.000000000000000056e-01 +1.007000000000000000e+03 1.640166266529139993e-01 1.000000000000000056e-01 +1.008000000000000000e+03 1.594244872354226017e-01 1.000000000000000056e-01 +1.009000000000000000e+03 1.548420884323198909e-01 1.000000000000000056e-01 +1.010000000000000000e+03 1.503492279466194514e-01 1.000000000000000056e-01 +1.011000000000000000e+03 1.459756203855785694e-01 1.000000000000000056e-01 +1.012000000000000000e+03 1.417213825056695686e-01 1.000000000000000056e-01 +1.013000000000000000e+03 1.375672092700001570e-01 1.000000000000000056e-01 +1.014000000000000000e+03 1.333945150052509299e-01 1.000000000000000056e-01 +1.015000000000000000e+03 1.292208322830419587e-01 1.000000000000000056e-01 +1.016000000000000000e+03 1.250374031179704026e-01 1.000000000000000056e-01 +1.017000000000000000e+03 1.209263958029919706e-01 1.000000000000000056e-01 +1.018000000000000000e+03 1.169132138982437452e-01 1.000000000000000056e-01 +1.019000000000000000e+03 1.129912909370652252e-01 1.000000000000000056e-01 +1.020000000000000000e+03 1.090950336788828884e-01 1.000000000000000056e-01 +1.021000000000000000e+03 1.051734980339712883e-01 1.000000000000000056e-01 +1.022000000000000000e+03 1.012478665896077434e-01 1.000000000000000056e-01 +1.023000000000000000e+03 9.734549012875765017e-02 1.000000000000000056e-01 +1.024000000000000000e+03 9.347684967475322626e-02 1.000000000000000056e-01 +1.025000000000000000e+03 8.944322965331627517e-02 1.000000000000000056e-01 +1.026000000000000000e+03 8.542150646831871141e-02 1.000000000000000056e-01 +1.027000000000000000e+03 8.164755325937504693e-02 1.000000000000000056e-01 +1.028000000000000000e+03 7.856744053528684490e-02 1.000000000000000056e-01 +1.029000000000000000e+03 7.641211524243686493e-02 1.000000000000000056e-01 +1.030000000000000000e+03 7.590075261252499095e-02 1.000000000000000056e-01 +1.031000000000000000e+03 7.357170556047112897e-02 1.000000000000000056e-01 +1.032000000000000000e+03 7.124265850841729475e-02 1.000000000000000056e-01 +1.033000000000000000e+03 6.891361145636344665e-02 1.000000000000000056e-01 +1.034000000000000000e+03 6.658456440430961243e-02 1.000000000000000056e-01 +1.035000000000000000e+03 6.425551735225577821e-02 1.000000000000000056e-01 +1.036000000000000000e+03 6.192647030020193705e-02 1.000000000000000056e-01 +1.037000000000000000e+03 5.959742324814809589e-02 1.000000000000000056e-01 +1.038000000000000000e+03 5.726837619609426167e-02 1.000000000000000056e-01 +1.039000000000000000e+03 5.493932914404042051e-02 1.000000000000000056e-01 +1.040000000000000000e+03 5.261028209198658628e-02 1.000000000000000056e-01 +1.041000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.042000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.043000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.044000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.045000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.046000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.047000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.048000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.049000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.050000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.051000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.052000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.053000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.054000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.055000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.056000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.057000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.058000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.059000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.060000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.061000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.062000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.063000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.064000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.065000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.066000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.067000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.068000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.069000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.070000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.071000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.072000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.073000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.074000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.075000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.076000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.077000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.078000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.079000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.080000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.081000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.082000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.083000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.084000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.085000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.086000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.087000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.088000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.089000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.090000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.091000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.092000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.093000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.094000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.095000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.096000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.097000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.098000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 +1.099000000000000000e+03 0.000000000000000000e+00 1.000000000000000056e-01 From fc7e20cf9e05f1d0dac09ba764fca95091d645df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Aug 2024 16:01:13 +0000 Subject: [PATCH 140/161] new auxtel transmission using latest ratio 2/1 (BG40 data rescaled by 1.09), fixed A1s, free angstrom exponent with 20230802 data --- spectractor/simulation/AuxTelThroughput/NOTES | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spectractor/simulation/AuxTelThroughput/NOTES b/spectractor/simulation/AuxTelThroughput/NOTES index 2cf97eed1..400093047 100644 --- a/spectractor/simulation/AuxTelThroughput/NOTES +++ b/spectractor/simulation/AuxTelThroughput/NOTES @@ -1,3 +1,5 @@ FELH0600.txt from multispectra_FELH0600_holo4_003_HD142331_AuxTel_throughput.txt file, fit from 20220630 end of night Auxtel data BG40 is from vendor -BG40_65mm_1 and OG550_65mm_1 are copied from BG40.txt \ No newline at end of file +BG40_65mm_1 and OG550_65mm_1 are copied from BG40.txt + +- multispectra_holo4_003_HD142331_20230802_348-594_HD146233_AuxTel_v3.1.0_doSensorFlat_FreePressure_BG40ReScaled1.09_throughput.txt was created using v3.1.0 1a65d73cddf078472e7df082552cb75b6f39a9a4 commit, with 20230802 HD142331 data extracted with ratio 2/1 where BG40 data were rescaled by a factor 1.09, fixed A1s, binning=1, free angstrom exponent, free ozone, masking of curve edges and absorption lines \ No newline at end of file From 5570042e97011fce37feaaef024f236a671fd803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Aug 2024 18:26:11 +0200 Subject: [PATCH 141/161] loosen test on A2 for fit_spectrum --- tests/test_fullchain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index 6fa0ce439..543c75585 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -214,7 +214,7 @@ def test_ctio_fullchain(): f"{np.abs(w.params.values[i] - spectrum.header[l]) / np.sqrt(w.params.cov[icov, icov]) < nsigma}") assert np.abs(w.params.values[i] - spectrum.header[l]) / np.sqrt(w.params.cov[icov, icov]) < nsigma k += 1 - assert np.abs(w.params.values[1]) / np.sqrt(w.params.cov[1, 1]) < 2 * nsigma # A2 + assert np.abs(w.params.values[1]) / np.sqrt(w.params.cov[1, 1]) < 4 * nsigma # A2 assert np.isclose(np.abs(w.params.values[8]), 0, atol=parameters.PIXSHIFT_PRIOR) # pixshift assert np.isclose(np.abs(w.params.values[9]), 0, atol=1e-3) # B From d1558d8356ad1c176f9e6fc2962061bfbe838ac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Aug 2024 18:49:49 +0200 Subject: [PATCH 142/161] repair tests on A2 for fit_spectrum --- tests/test_fullchain.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index 543c75585..ed55c75f8 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -214,9 +214,10 @@ def test_ctio_fullchain(): f"{np.abs(w.params.values[i] - spectrum.header[l]) / np.sqrt(w.params.cov[icov, icov]) < nsigma}") assert np.abs(w.params.values[i] - spectrum.header[l]) / np.sqrt(w.params.cov[icov, icov]) < nsigma k += 1 - assert np.abs(w.params.values[1]) / np.sqrt(w.params.cov[1, 1]) < 4 * nsigma # A2 - assert np.isclose(np.abs(w.params.values[8]), 0, atol=parameters.PIXSHIFT_PRIOR) # pixshift - assert np.isclose(np.abs(w.params.values[9]), 0, atol=1e-3) # B + A2id = w.params.get_index("A2") + assert np.abs(w.params.values[A2id] / w.params.err[A2id]) < 3 * nsigma # A2 + assert np.isclose(np.abs(w.params.values[w.params.get_index("alpha_pix [pix]")]), 0, atol=parameters.PIXSHIFT_PRIOR) # pixshift + assert np.isclose(np.abs(w.params.values[w.params.get_index("B")]), 0, atol=1e-3) # B parameters.DEBUG = False parameters.SPECTRACTOR_ATMOSPHERE_SIM = "libradtran" @@ -224,9 +225,9 @@ def test_ctio_fullchain(): verbose=True, plot=True, live_fit=False) run_spectrogram_minimisation(w, method="newton") nsigma = 2 - labels = ["A1_T", "A2_T", "VAOD_T", "OZONE_T", "PWV_T"] - indices = [0, 1, 3, 5, 6] - A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, B, Astar, D, shift_x, shift_y, shift_t, *psf_poly_params = w.params.values + labels = ["A2_T", "VAOD_T", "OZONE_T", "PWV_T"] # "A1_T" fixed + indices = [1, 3, 5, 6] + A1, A2, A3, aerosols, angstrom_exponent, ozone, pwv, B, Astar, D, shift_x, shift_y, shift_t, pressure, *psf_poly_params = w.params.values ipar = w.params.get_free_parameters() # non fixed param indices cov_indices = [list(ipar).index(k) for k in indices] # non fixed param indices in cov matrix assert w.costs[-1] / w.data.size < 1e-3 @@ -238,6 +239,8 @@ def test_ctio_fullchain(): f"{np.abs(w.params.values[i] - spectrum.header[l]) / np.sqrt(w.params.cov[icov, icov]) < nsigma}") assert np.abs(w.params.values[i] - spectrum.header[l]) / np.sqrt(w.params.cov[icov, icov]) < nsigma k += 1 + A2id = w.params.get_index("A2") + assert np.abs((A2 - 1) / w.params.err[A2id]) < 2 * nsigma # A2 assert np.isclose(shift_y, 0, atol=parameters.PIXSHIFT_PRIOR) # shift_y assert np.isclose(D, spectrum.header["D2CCD_T"], atol=0.1) # D2CCD assert np.isclose(B, 1, atol=1e-3) # B From bdda67dffa4e05da841cb2190dd79c679c22e370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Aug 2024 21:42:09 +0200 Subject: [PATCH 143/161] repair extraction CTIO test with rebin=1 --- tests/test_extractor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_extractor.py b/tests/test_extractor.py index 8f4b457eb..fb9aaecbe 100644 --- a/tests/test_extractor.py +++ b/tests/test_extractor.py @@ -34,7 +34,7 @@ def test_extractor_ctio(): load_config("ctio.ini") parameters.VERBOSE = True parameters.DEBUG = False - parameters.CCD_REBIN = 2 # rebin=1 to build tests/data spectrum + parameters.CCD_REBIN = 1 # rebin=1 to build tests/data spectrum apply_rebinning_to_parameters() for file_name in file_names: From 7bb9af6a8f13674d90b8a92b9af33a807e7b1586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Aug 2024 23:39:39 +0200 Subject: [PATCH 144/161] debug --- config/auxtel.ini | 2 +- config/stardice.ini | 2 +- spectractor/extractor/spectrum.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/auxtel.ini b/config/auxtel.ini index ea488c2f4..492c79a91 100644 --- a/config/auxtel.ini +++ b/config/auxtel.ini @@ -20,7 +20,7 @@ SPECTRACTOR_FIT_TIMEOUT_PER_ITER = 1200 # maximum time per gradient descent before TimeoutError in seconds SPECTRACTOR_FIT_TIMEOUT = 7200 # library to compute atmospheric transmission: none, libradtran, getobsatmo -SPECTRACTOR_ATMOSPHERE_SIM = getobstamo +SPECTRACTOR_ATMOSPHERE_SIM = getobsatmo [instrument] # instrument name diff --git a/config/stardice.ini b/config/stardice.ini index 0054608f8..22987e448 100644 --- a/config/stardice.ini +++ b/config/stardice.ini @@ -18,7 +18,7 @@ SPECTRACTOR_DECONVOLUTION_FFM = False # value of sigma clip parameter for the spectractor deconvolution process PSF2D and FFM SPECTRACTOR_DECONVOLUTION_SIGMA_CLIP = 100 # library to compute atmospheric transmission: none, libradtran, getobsatmo -SPECTRACTOR_ATMOSPHERE_SIM = getobstamo +SPECTRACTOR_ATMOSPHERE_SIM = getobsatmo [instrument] # instrument name diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index c3641e06f..fec408a15 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -1787,8 +1787,8 @@ def detect_lines(lines, lambdas, spec, spec_err=None, cov_matrix=None, fwhm_func Y = -Gauss / Continuum Ydata = 1 - spectr_data / Continuum - line.fit_eqwidth_mod = integrate.simps(Y, x_int) # sol1 - line.fit_eqwidth_data = integrate.simps(Ydata, x_int) # sol2 + line.fit_eqwidth_mod = integrate.simpson(Y, x=x_int) # sol1 + line.fit_eqwidth_data = integrate.simpson(Ydata, x=x_int) # sol2 line.fit_popt = popt line.fit_pcov = pcov From 37fc9b3dd9706dc83145db84fd6538036ba697fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Fri, 23 Aug 2024 23:39:56 +0200 Subject: [PATCH 145/161] adapt to pytest>=8.3 suite --- requirements.txt | 2 +- setup.cfg | 3 ++- setup.py | 2 -- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index c79c6959c..e7ba982ac 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,7 +18,7 @@ configparser coveralls deprecated pyyaml -pytest<8.1 +pytest pytest-cov getCalspec>=2.0.0 lsst_utils diff --git a/setup.cfg b/setup.cfg index 532062ace..d70210960 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,6 @@ [tool:pytest] -exclude=test_(extractor_ctio_planetary_nebula|astrometry|mcmc|multispectra) +# exclude=test_(extractor_ctio_planetary_nebula|astrometry|mcmc|multispectra) +addopts = --ignore=tests/test_astrometry.py --ignore=tests/test_mcmc.py --ignore=tests/test_extractor_ctio_planetary_nebula.py [coverage:run] omit=spectractor/fit/mcmc.py diff --git a/setup.py b/setup.py index cc9386411..7b7c891bf 100644 --- a/setup.py +++ b/setup.py @@ -30,8 +30,6 @@ version=current_version, packages=['spectractor', 'spectractor.extractor', 'spectractor.simulation', 'spectractor.fit'], install_requires=reqs, - test_suite='nose.collector', - tests_require=['nose'], package_dir={'spectractor': './spectractor'}, package_data={'spectractor': ['../config/*.ini'], 'spectractor.extractor': ['dispersers/HoloPhAg/*.txt', 'dispersers/HoloPhP/*.txt', From a72f6e57889eea5b3f07c78c6c5265e6c0df2ffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Sat, 24 Aug 2024 00:12:52 +0200 Subject: [PATCH 146/161] cosmetics --- setup.cfg | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index d70210960..e115e8d7b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,5 @@ [tool:pytest] -# exclude=test_(extractor_ctio_planetary_nebula|astrometry|mcmc|multispectra) -addopts = --ignore=tests/test_astrometry.py --ignore=tests/test_mcmc.py --ignore=tests/test_extractor_ctio_planetary_nebula.py +addopts = --ignore=tests/test_astrometry.py --ignore=tests/test_mcmc.py --ignore=tests/test_extractor_ctio_planetary_nebula.py [coverage:run] omit=spectractor/fit/mcmc.py From e21056ecb6b631908a415a1522e34a41970d1ae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Mon, 26 Aug 2024 15:44:31 +0200 Subject: [PATCH 147/161] repair test_atmosphere test --- tests/test_simulator.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_simulator.py b/tests/test_simulator.py index dad952b9a..f00179bd1 100644 --- a/tests/test_simulator.py +++ b/tests/test_simulator.py @@ -30,9 +30,9 @@ def test_atmosphere(): ozone_grid=[400, 400, 1], aerosol_grid=[0.0, 0.1, 2]) atmospheric_grid = a.compute() assert np.sum(atmospheric_grid) > 0 - assert np.all(np.isclose(a.atmgrid[0, a.index_atm_data:], parameters.LAMBDAS)) - assert not np.any(np.isclose(a.atmgrid[1, a.index_atm_data:], np.zeros_like(parameters.LAMBDAS), rtol=1e-6)) - assert a.atmgrid.shape == (3, a.index_atm_data + len(parameters.LAMBDAS)) + assert np.all(np.isclose(a.atmgrid[0, a.index_atm_data:], a.lambdas)) + assert not np.any(np.isclose(a.atmgrid[1, a.index_atm_data:], np.zeros_like(a.lambdas), rtol=1e-6)) + assert a.atmgrid.shape == (3, a.index_atm_data + len(a.lambdas)) a.save_file(a.image_filename.replace('.fits', '_atmsim.fits')) assert os.path.isfile('tests/data/reduc_20170605_028_atmsim.fits') a.load_file(a.image_filename.replace('.fits', '_atmsim.fits')) From 085700dd74103773146dd9c5de3ebc42780d3b38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 5 Sep 2024 10:49:36 +0200 Subject: [PATCH 148/161] include masked data in get_bad_indices; better use of self.mask; reset with mask_before_mask; delete self.sqrtW becaues W is reset at each iteration with outliers and masked data --- spectractor/extractor/chromaticpsf.py | 10 ++--- spectractor/extractor/extractor.py | 12 +++--- spectractor/fit/fitter.py | 59 ++++++++++++++++++--------- tests/test_fullchain.py | 2 +- 4 files changed, 51 insertions(+), 32 deletions(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index da048ea25..9aa5ac3ea 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -1945,6 +1945,7 @@ def __init__(self, chromatic_psf, data, data_errors, mode, bgd_model_func=None, self.poly_params[self.Nx + self.y_c_0_index] -= self.bgd_width self.profile_params = self.chromatic_psf.from_poly_params_to_profile_params(self.poly_params) self.data_before_mask = np.copy(self.data) + self.mask_before_mask = list(np.copy(self.mask)) self.boundaries = None self.psf_cube_sparse_indices = None self.psf_cube_masked = None @@ -1959,7 +1960,6 @@ def __init__(self, chromatic_psf, data, data_errors, mode, bgd_model_func=None, # (which is not exactly true in rotated images) self.data_cov = sparse.diags(self.err * self.err, dtype="float32", format="dia") self.W = sparse.diags(1 / (self.err * self.err), dtype="float32", format="dia") - self.sqrtW = self.W.sqrt() self.W_before_mask = self.W.copy() # design matrix @@ -2088,11 +2088,11 @@ def set_mask(self, poly_params=None): # keep only the pixels where all psf_cube sheets have contributed per column mask = (weight_mask != res).ravel() W = np.copy(self.W_before_mask.data.ravel()) - W[mask] = 0 - self.W = sparse.diags(W, dtype="float32", format="dia") - self.sqrtW = self.W.sqrt() + self.mask = list(np.copy(self.mask_before_mask)) self.mask += list(np.where(mask)[0]) self.mask = list(set(self.mask)) + W[self.mask] = 0 + self.W = sparse.diags(W, dtype="float32", format="dia") def simulate(self, *shape_params): r""" @@ -2287,7 +2287,7 @@ def simulate(self, *shape_params): M = self.chromatic_psf.build_sparse_M(self.pixels, profile_params, dtype="float32", M_sparse_indices=self.M_sparse_indices, boundaries=self.boundaries) - M_dot_W = M.T @ self.sqrtW + M_dot_W = M.T @ self.W.sqrt() W_dot_data = self.W @ self.data # Compute the minimizing amplitudes if sparse_dot_mkl is None: diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 3eecc11be..ca3650876 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -191,8 +191,8 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p # (which is not exactly true in rotated images) self.W = 1. / (self.err * self.err) self.data_before_mask = np.copy(self.data) - self.W_before_mask = np.copy(self.W) - self.sqrtW = sparse.diags(np.sqrt(self.W), format="dia", dtype="float32") + self.W_before_mask = self.W.copy() + self.mask_before_mask = list(np.copy(self.mask)) # design matrix self.M = None @@ -317,11 +317,11 @@ def set_mask(self, params=None, fwhmx_clip=3*parameters.PSF_FWHM_CLIP, fwhmy_cli res = np.max(weight_mask, axis=0)[np.newaxis,:] * np.ones((weight_mask.shape[0],1)) # keep only the pixels where all psf_cube sheets have contributed per column mask = (weight_mask != res).ravel() - self.W = np.copy(self.W_before_mask) - self.W[mask] = 0 - self.sqrtW = sparse.diags(np.sqrt(self.W), format="dia", dtype="float32") + self.W = self.W_before_mask.copy() + self.mask = list(np.copy(self.mask_before_mask)) self.mask += list(np.where(mask)[0]) self.mask = list(set(self.mask)) + self.W[self.mask] = 0 def simulate(self, *params): r""" @@ -498,7 +498,7 @@ def simulate(self, *params): # Algebra to compute amplitude parameters if self.amplitude_priors_method != "fixed": - M_dot_W = M.T @ self.sqrtW + M_dot_W = M.T @ sparse.diags(np.sqrt(self.W), format="dia", dtype="float32") if sparse_dot_mkl is None: M_dot_W_dot_M = M_dot_W @ M_dot_W.T else: diff --git a/spectractor/fit/fitter.py b/spectractor/fit/fitter.py index 2468b9c21..ed83a14dc 100644 --- a/spectractor/fit/fitter.py +++ b/spectractor/fit/fitter.py @@ -687,6 +687,7 @@ def __init__(self, params=None, file_name="", verbose=False, plot=False, live_fi self.err = None self.data_cov = None self.W = None + self.W_before_mask = None self.x = None self.outliers = [] self.mask = [] @@ -707,22 +708,29 @@ def get_bad_indices(self): Examples -------- >>> w = FitWorkspace() + >>> w.data = np.array([1,2,3,4,5,6]) + >>> w.mask = [2, 4] + >>> w.outliers = [2, 6] + >>> w.get_bad_indices() + array([2, 4, 6]) >>> w.data = np.array([np.array([1,2,3]), np.array([1,2,3,4])], dtype=object) + >>> w.mask = [2, 4] >>> w.outliers = [2, 6] >>> w.get_bad_indices() - [array([2]), array([3])] + [array([2]), array([1, 3])] """ - bad_indices = np.asarray(self.outliers, dtype=int) + bad_indices = np.unique(np.concatenate([self.outliers, self.mask])).astype(int) if self.data.dtype == object: - if len(self.outliers) > 0: + if len(self.outliers) > 0 or len(self.mask) > 0: bad_indices = [] + bads = np.unique(np.concatenate([self.outliers, self.mask])).astype(int) start_index = 0 for k in range(self.data.shape[0]): mask = np.zeros(self.data[k].size, dtype=bool) - outliers = np.asarray(self.outliers)[np.logical_and(np.asarray(self.outliers) > start_index, - np.asarray(self.outliers) < start_index + + bad = np.asarray(bads)[np.logical_and(np.asarray(bads) > start_index, + np.asarray(bads) < start_index + self.data[k].size)] - mask[outliers - start_index] = True + mask[bad - start_index] = True bad_indices.append(np.arange(self.data[k].size)[mask]) start_index += self.data[k].size else: @@ -852,7 +860,8 @@ def weighted_residuals(self, p): # pragma: nocover def prepare_weight_matrices(self): r"""Compute weight matrix :math:`\mathbf{W}` `self.W` as the inverse of data covariance matrix `self.data_cov`. - Cancel weights of data outliers given by `self.outliers`. + Cancel weights of data outliers given by `self.outliers` or masked data given by `self.mask`. + It uses `self.W_before_mask` to reset the null weights at each computation. Examples -------- @@ -886,8 +895,8 @@ def prepare_weight_matrices(self): Use sparse matrix: - >>> w.W = scipy.sparse.diags(np.ones(3)) - >>> w.W.toarray() + >>> w.W_before_mask = scipy.sparse.diags(np.ones(3)) + >>> w.W_before_mask.toarray() array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) @@ -899,29 +908,39 @@ def prepare_weight_matrices(self): [0., 1., 0.], [0., 0., 0.]]) + Add mask but no outliers on same matrix: + + >>> w.outliers = [] + >>> w.mask = np.array([1]) + >>> w.prepare_weight_matrices() + >>> w.W.toarray() + array([[1., 0., 0.], + [0., 0., 0.], + [0., 0., 1.]]) """ # Prepare covariance matrix for data if self.data_cov is None: self.data_cov = np.asarray(self.err.flatten() ** 2) # Prepare inverse covariance matrix for data - if self.W is None: + if self.W_before_mask is None: if self.data_cov.ndim == 1 and self.data_cov.dtype != object: - self.W = 1 / self.data_cov + self.W_before_mask = 1 / self.data_cov elif self.data_cov.ndim == 2 and self.data_cov.dtype != object: - self.W = np.linalg.inv(self.data_cov) + self.W_before_mask = np.linalg.inv(self.data_cov) elif self.data_cov.dtype is object: if self.data_cov[0].ndim == 1: - self.W = np.array([1 / self.data_cov[k] for k in range(self.data_cov.shape[0])]) + self.W_before_mask = np.array([1 / self.data_cov[k] for k in range(self.data_cov.shape[0])]) else: - self.W = [] + self.W_before_mask = [] for k in range(len(self.data_cov)): L = np.linalg.inv(np.linalg.cholesky(self.data_cov[k])) - self.W[k] = L.T @ L - self.W = np.asarray(self.W) - if len(self.outliers) > 0: + self.W_before_mask[k] = L.T @ L + self.W_before_mask = np.asarray(self.W_before_mask) + self.W = self.W_before_mask.copy() + if len(self.outliers) > 0 or len(self.mask) > 0: bad_indices = self.get_bad_indices() - if not scipy.sparse.issparse(self.W): + if not scipy.sparse.issparse(self.W_before_mask): if self.W.ndim == 1 and self.W.dtype != object: self.W[bad_indices] = 0 elif self.W.ndim == 2 and self.W.dtype != object: @@ -1031,13 +1050,13 @@ def compute_W_with_model_error(self, model_err): elif self.W.ndim == 2 and self.W.dtype != object: cov = self.data_cov + np.diag(model_err * model_err) self.W = np.linalg.inv(cov) - # needs to reapply the mask of outliers + # needs to reapply the mask of outliers and masked data self.W[zeros] = 0 else: cov = self.data_cov + np.diag(model_err * model_err) L = np.linalg.inv(np.linalg.cholesky(cov)) W = L.T @ L - # needs to reapply the mask of outliers + # needs to reapply the mask of outliers and masked data rows, cols = self.W.nonzero() self.W = scipy.sparse.csr_matrix((W[rows, cols], (rows, cols)), dtype=self.W.dtype, shape=self.W.shape) return self.W diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index 11abf65c1..980e67464 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -466,7 +466,7 @@ def test_stardice_fullchain(): w = SpectrumFitWorkspace(spectrum, fit_angstrom_exponent=False, verbose=True, plot=True, live_fit=False) run_spectrum_minimisation(w, method="newton") - nsigma = 2 + nsigma = 3 labels = ["VAOD_T", "OZONE_T", "PWV_T"] indices = [2, 4, 5] ipar = w.params.get_free_parameters() # non fixed param indices From a61ef53506c52646bbf02959b05372c537162871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 5 Sep 2024 10:49:47 +0200 Subject: [PATCH 149/161] use scipy.simpsons --- spectractor/extractor/spectrum.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index 7a3c15d86..fb09fa5f2 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -1816,8 +1816,8 @@ def detect_lines(lines, lambdas, spec, spec_err=None, cov_matrix=None, fwhm_func Y = -Gauss / Continuum Ydata = 1 - spectr_data / Continuum - line.fit_eqwidth_mod = integrate.simps(Y, x_int) # sol1 - line.fit_eqwidth_data = integrate.simps(Ydata, x_int) # sol2 + line.fit_eqwidth_mod = integrate.simpson(Y, x=x_int) # sol1 + line.fit_eqwidth_data = integrate.simpson(Ydata, x=x_int) # sol2 line.fit_popt = popt line.fit_pcov = pcov From ce2e7af2906c1bd9a98ceff611aed18f7891729b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 5 Sep 2024 11:39:40 +0200 Subject: [PATCH 150/161] add mask in fit_transverse_PSF1D_profile --- spectractor/extractor/chromaticpsf.py | 11 ++++++++--- spectractor/extractor/psf.py | 12 +++++++----- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index 9aa5ac3ea..3101a7b4c 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -1480,7 +1480,7 @@ def plot_summary(self, truth=None): plt.show() def fit_transverse_PSF1D_profile(self, data, err, w, ws, pixel_step=1, bgd_model_func=None, saturation=None, - live_fit=False, sigma_clip=5): + live_fit=False, sigma_clip=5, mask=None): """ Fit the transverse profile of a 2D data image with a PSF profile. Loop is done on the x-axis direction. @@ -1525,6 +1525,7 @@ def fit_transverse_PSF1D_profile(self, data, err, w, ws, pixel_step=1, bgd_model >>> bgd += 1000*np.exp(-((xx-20)**2+(yy-10)**2)/(2*2)) >>> data += bgd >>> data_errors = np.sqrt(data+1) + >>> mask = bgd > np.median(bgd) Extract the background: @@ -1533,8 +1534,8 @@ def fit_transverse_PSF1D_profile(self, data, err, w, ws, pixel_step=1, bgd_model Fit the transverse profile: >>> s = ChromaticPSF(psf, Nx=100, Ny=100, deg=4, saturation=saturation) - >>> s.fit_transverse_PSF1D_profile(data, data_errors, w=20, ws=[30,50], pixel_step=5, - ... bgd_model_func=bgd_model_func, saturation=saturation, live_fit=False, sigma_clip=5) + >>> s.fit_transverse_PSF1D_profile(data, data_errors, w=20, ws=[30,50], pixel_step=5, mask=mask, + ... bgd_model_func=bgd_model_func, saturation=saturation, live_fit=False, sigma_clip=5,) >>> s.plot_summary(truth=s0) .. doctest:: @@ -1645,8 +1646,12 @@ def fit_transverse_PSF1D_profile(self, data, err, w, ws, pixel_step=1, bgd_model psf.params.bounds = bounds w = PSFFitWorkspace(psf, signal, data_errors=err[:, x], bgd_model_func=None, live_fit=False, verbose=False, jacobian_analytical=True) + if mask is not None: + w.mask = list(np.where(mask[:, x])[0]) try: run_minimisation_sigma_clipping(w, method="newton", sigma_clip=sigma_clip, niter_clip=1, verbose=False) + if x>10 and x<40: + w.plot_fit() except: pass best_fit = w.params.values diff --git a/spectractor/extractor/psf.py b/spectractor/extractor/psf.py index 85bc2c58a..cf397f648 100644 --- a/spectractor/extractor/psf.py +++ b/spectractor/extractor/psf.py @@ -2093,8 +2093,9 @@ def plot_fit(self): if self.bgd_model_func is not None: data = data + self.bgd_model_func(self.pixels) ax[0].errorbar(self.pixels, data, yerr=self.err, fmt='ro', label="Data") - if len(self.outliers) > 0: - ax[0].errorbar(self.outliers, data[self.outliers], yerr=self.err[self.outliers], fmt='go', + if len(self.outliers) > 0 or len(self.mask) > 0: + bads = list(np.unique(np.concatenate([self.mask, self.outliers])).astype(int)) + ax[0].errorbar(bads, data[bads], yerr=self.err[bads], fmt='go', label=rf"Outliers ({self.sigma_clip}$\sigma$)") if self.bgd_model_func is not None: ax[0].plot(self.pixels, self.bgd_model_func(self.pixels), 'b--', label="fitted bgd") @@ -2124,10 +2125,11 @@ def plot_fit(self): residuals = (data - model) / self.err residuals_err = np.ones_like(self.err) ax[1].errorbar(self.pixels, residuals, yerr=residuals_err, fmt='ro') - if len(self.outliers) > 0: - residuals_outliers = (data[self.outliers] - model[self.outliers]) / self.err[self.outliers] + if len(self.outliers) > 0 or len(self.mask) > 0: + bads = list(np.unique(np.concatenate([self.mask, self.outliers])).astype(int)) + residuals_outliers = (data[bads] - model[bads]) / self.err[bads] residuals_outliers_err = np.ones_like(residuals_outliers) - ax[1].errorbar(self.outliers, residuals_outliers, yerr=residuals_outliers_err, fmt='go') + ax[1].errorbar(bads, residuals_outliers, yerr=residuals_outliers_err, fmt='go') ax[1].axhline(0, color='b') ax[1].grid(True) std = np.std(residuals) From 7341b46aaa3ff5cf9e038c2ad98b1d98587cfb77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Neveu?= Date: Thu, 5 Sep 2024 11:40:08 +0200 Subject: [PATCH 151/161] add mask in fit_transverse_PSF1D_profile --- spectractor/extractor/chromaticpsf.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/spectractor/extractor/chromaticpsf.py b/spectractor/extractor/chromaticpsf.py index 3101a7b4c..7450806de 100644 --- a/spectractor/extractor/chromaticpsf.py +++ b/spectractor/extractor/chromaticpsf.py @@ -1650,8 +1650,6 @@ def fit_transverse_PSF1D_profile(self, data, err, w, ws, pixel_step=1, bgd_model w.mask = list(np.where(mask[:, x])[0]) try: run_minimisation_sigma_clipping(w, method="newton", sigma_clip=sigma_clip, niter_clip=1, verbose=False) - if x>10 and x<40: - w.plot_fit() except: pass best_fit = w.params.values From ff7ff7d651bd710807c9506a8eeedb456807df5f Mon Sep 17 00:00:00 2001 From: "jeremy.neveu" Date: Thu, 5 Sep 2024 11:49:56 +0200 Subject: [PATCH 152/161] adapt gaia catalogs to masked array --- spectractor/astrometry.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spectractor/astrometry.py b/spectractor/astrometry.py index 812502b1a..df90e6227 100644 --- a/spectractor/astrometry.py +++ b/spectractor/astrometry.py @@ -8,6 +8,7 @@ from astropy.io import fits, ascii import astropy.units as u from astropy.table import Table +from astropy.table.column import MaskedColumn from astropy.time import Time from astropy.coordinates import SkyCoord, Distance @@ -102,7 +103,7 @@ def load_gaia_catalog(coord, radius=5 * u.arcmin, gaia_mag_g_limit=23): job = Gaia.cone_search_async(coord, radius=radius, verbose=False, columns=['ra', 'dec', 'pmra', 'pmdec', 'ref_epoch', 'parallax', 'phot_g_mean_mag']) my_logger.debug(f"\n\t{job}") - gaia_catalog = job.get_results() + gaia_catalog = MaskedColumn(job.get_results()) my_logger.debug(f"\n\t{gaia_catalog}") gaia_catalog = gaia_catalog[gaia_catalog["phot_g_mean_mag"] Date: Thu, 5 Sep 2024 11:50:15 +0200 Subject: [PATCH 153/161] test masking of star fields for extraction --- spectractor/extractor/extractor.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index c61451416..16e84250d 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -85,7 +85,7 @@ def __init__(self, spectrum, amplitude_priors_method="noprior", verbose=False, p [D2CCD - 3 * parameters.DISTANCE2CCD_ERR, D2CCD + 3 * parameters.DISTANCE2CCD_ERR], [-parameters.PIXSHIFT_PRIOR, parameters.PIXSHIFT_PRIOR], [-10 * parameters.PIXSHIFT_PRIOR, 10 * parameters.PIXSHIFT_PRIOR], - [-90, 90], [0.2, 5], [0.5, 2], [-360, 360], [0, np.inf], [-100, 100], [1.001, 3]] + [-90, 90], [0.2, 5], [0., np.inf], [-360, 360], [0, np.inf], [-100, 100], [1.001, 3]] bounds += list(psf_poly_params_bounds) * len(self.diffraction_orders) fixed = [False] * p.size for k, par in enumerate(input_labels): @@ -1328,7 +1328,7 @@ def extract_spectrum_from_image(image, spectrum, signal_width=10, ws=(20, 30)): if image.mask_rotated is not None: mask = image.mask_rotated[ymin:ymax, xmin:xmax] else: - mask = None + mask = np.zeros_like(data).astype(bool) Ny, Nx = data.shape my_logger.info(f'\n\tExtract spectrogram: crop rotated image [{xmin}:{xmax},{ymin}:{ymax}] (size ({Nx}, {Ny}))') @@ -1357,6 +1357,14 @@ def bgd_model_func(x, y): # Fit the transverse profile my_logger.info('\n\t ======================= Fit the transverse profile =============================') my_logger.info(f'\n\tStart PSF1D transverse fit...') + # clean the data: this is truly a backward spectrum extraction to feed correctly the forward model + # if available, subtract starfield before 1D spectrum estimate + # it is important to have a clean 1D spectrum as it is used as a prior for regularisation + if image.starfield_rotated is not None: + # data -= image.starfield_rotated[ymin:ymax, xmin:xmax] + starfield = np.copy(image.starfield_rotated[ymin:ymax, xmin:xmax]) + mask += starfield > 2 * np.median(starfield) # + np.std(starfield) + psf = load_PSF(psf_type=parameters.PSF_TYPE, target=image.target, clip=False) s = ChromaticPSF(psf, Nx=Nx, Ny=Ny, x0=target_pixcoords_spectrogram[0], y0=target_pixcoords_spectrogram[1], deg=parameters.PSF_POLY_ORDER, saturation=image.saturation) @@ -1365,12 +1373,6 @@ def bgd_model_func(x, y): parameters.VERBOSE = False parameters.DEBUG = False - # clean the data: this is truly a backward spectrum extraction to feed correctly the forward model - # if available, subtract starfield before 1D spectrum estimate - # it is important to have a clean 1D spectrum as it is used as a prior for regularisation - if image.starfield_rotated is not None: - data -= image.starfield_rotated[ymin:ymax, xmin:xmax] - s.fit_transverse_PSF1D_profile(data, err, signal_width, ws, pixel_step=parameters.PSF_PIXEL_STEP_TRANSVERSE_FIT, sigma_clip=5, bgd_model_func=bgd_model_func, saturation=image.saturation, live_fit=False) @@ -1384,6 +1386,8 @@ def bgd_model_func(x, y): my_logger.debug(f'\n\tTransverse fit table:\n{s.table}') if parameters.DEBUG: s.plot_summary() + spectrum.lambdas = spectrum.pixels + spectrum.plot_spectrum(xlim=[xmin, xmax]) # Fit the data: method = "noprior" @@ -1416,6 +1420,8 @@ def bgd_model_func(x, y): spectrum.err = np.copy(w.amplitude_params_err[:new_Nx]) spectrum.cov_matrix = np.copy(w.amplitude_cov_matrix[:new_Nx, :new_Nx]) spectrum.chromatic_psf = s + spectrum.lambdas = np.arange(0, spectrum.data.size, 1) + spectrum.plot_spectrum(xlim=[0, spectrum.data.size]) # Extract the spectrogram edges Ny, Nx = image.data.shape @@ -1610,8 +1616,8 @@ def run_spectrogram_deconvolution_psf2d(spectrum, bgd_model_func): data /= spectrum.spectrogram_flat # if available, subtract starfield before 1D spectrum estimate # (important as it is used as a prior for regularisation) - if spectrum.spectrogram_starfield is not None: - data -= spectrum.spectrogram_starfield + #if spectrum.spectrogram_starfield is not None: + # data -= spectrum.spectrogram_starfield my_logger.info('\n\t ======================= ChromaticPSF2D polynomial fit =============================') w = s.fit_chromatic_psf(data, bgd_model_func=bgd_model_func, data_errors=err, live_fit=False, mask=spectrum.spectrogram_mask, @@ -1638,6 +1644,7 @@ def run_spectrogram_deconvolution_psf2d(spectrum, bgd_model_func): # Plot FHWM(lambda) if parameters.DEBUG: # pragma: no cover + spectrum.plot_spectrum() fig, ax = plt.subplots(2, 1, figsize=(10, 8), sharex="all") ax[0].plot(spectrum.lambdas, np.array(s.table['fwhm'])) ax[0].set_xlabel(r"$\lambda$ [nm]") From b2df62caf92606df15c98beea081ed4abffbd0bf Mon Sep 17 00:00:00 2001 From: "jeremy.neveu" Date: Wed, 19 Feb 2025 17:25:40 +0100 Subject: [PATCH 154/161] new config for g191b2b extraction --- config/stardice.ini | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/config/stardice.ini b/config/stardice.ini index 0c62378a2..179b2d4f3 100644 --- a/config/stardice.ini +++ b/config/stardice.ini @@ -61,9 +61,9 @@ CCD_REBIN = 1 [spectrograph] # distance between hologram and CCD in mm -DISTANCE2CCD = 33.3 +DISTANCE2CCD = 33.5 # uncertainty on distance between hologram and CCD in mm -DISTANCE2CCD_ERR = 0.1 +DISTANCE2CCD_ERR = 0.06 # default value for order 2 over order 1 transmission ratio GRATING_ORDER_2OVER1 = 0.1 @@ -77,7 +77,7 @@ XWINDOW_ROT = 30 # window y size to search for the targeted object YWINDOW_ROT = 30 # prior on the reliability of the centroid estimate in pixels -PIXSHIFT_PRIOR = 0.5 +PIXSHIFT_PRIOR = 0.2 [rotation parameters] # must be set to true, otherwise create residuals and correlated noise @@ -90,7 +90,7 @@ ROT_ANGLE_MAX = 30 [spectrum range] # minimum wavelength for spectrum extraction (in nm) -LAMBDA_MIN = 330 +LAMBDA_MIN = 350 # maximum wavelength for spectrum extraction (in nm) LAMBDA_MAX = 1000 # spectrum order to extract @@ -98,13 +98,13 @@ SPEC_ORDER = 1 [background subtraction parameters] # half transverse width of the signal rectangular window in pixels -PIXWIDTH_SIGNAL = 20 +PIXWIDTH_SIGNAL = 30 # distance from dispersion axis to analyse the background in pixels -PIXDIST_BACKGROUND = 20 +PIXDIST_BACKGROUND = 30 # transverse width of the background rectangular window in pixels PIXWIDTH_BACKGROUND = 80 # box size for sextractor evaluation of the background -PIXWIDTH_BOXSIZE = 40 +PIXWIDTH_BOXSIZE = 80 [PSF] # the PSF model: Gauss, Moffat or MoffatGauss @@ -122,9 +122,9 @@ PSF_FWHM_CLIP = 2 # order of the background polynome to fit CALIB_BGD_ORDER = 3 # half range to look for local extrema in pixels around tabulated line values -CALIB_PEAK_WIDTH = 7 +CALIB_PEAK_WIDTH = 3 # size of the peak sides to use to fit spectrum base line -CALIB_BGD_WIDTH = 15 +CALIB_BGD_WIDTH = 5 # window size for the savgol filter in pixels CALIB_SAVGOL_WINDOW = 5 # polynom order for the savgol filter From 58be1b7cb256596148ae2ab68436d62768590211 Mon Sep 17 00:00:00 2001 From: "jeremy.neveu" Date: Wed, 19 Feb 2025 17:25:51 +0100 Subject: [PATCH 155/161] repaired astrometry --- spectractor/astrometry.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spectractor/astrometry.py b/spectractor/astrometry.py index df90e6227..e5fe8b86e 100644 --- a/spectractor/astrometry.py +++ b/spectractor/astrometry.py @@ -8,7 +8,6 @@ from astropy.io import fits, ascii import astropy.units as u from astropy.table import Table -from astropy.table.column import MaskedColumn from astropy.time import Time from astropy.coordinates import SkyCoord, Distance @@ -103,7 +102,7 @@ def load_gaia_catalog(coord, radius=5 * u.arcmin, gaia_mag_g_limit=23): job = Gaia.cone_search_async(coord, radius=radius, verbose=False, columns=['ra', 'dec', 'pmra', 'pmdec', 'ref_epoch', 'parallax', 'phot_g_mean_mag']) my_logger.debug(f"\n\t{job}") - gaia_catalog = MaskedColumn(job.get_results()) + gaia_catalog = job.get_results() my_logger.debug(f"\n\t{gaia_catalog}") gaia_catalog = gaia_catalog[gaia_catalog["phot_g_mean_mag"] Date: Wed, 19 Feb 2025 17:28:32 +0100 Subject: [PATCH 156/161] deal with inner==0 case --- spectractor/fit/fitter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/fit/fitter.py b/spectractor/fit/fitter.py index e09846bc3..24eba6ec8 100644 --- a/spectractor/fit/fitter.py +++ b/spectractor/fit/fitter.py @@ -1327,7 +1327,7 @@ def gradient_descent(fit_workspace, epsilon, niter=10, xtol=1e-3, ftol=1e-3, wit if ip == jp or jp not in ipar: continue inner = np.abs(J_vectors[ip] @ J_vectors[jp]) - if np.abs(inner - J_norms[ip] * J_norms[jp]) < 1e-8 * inner: + if inner != 0 and np.abs(inner - J_norms[ip] * J_norms[jp]) < 1e-8 * inner: ipar = np.delete(ipar, list(ipar).index(jp)) fit_workspace.params.fixed[jp] = True my_logger.warning( From 830797f56c0a03a99b3f3710049e5c65aacff40a Mon Sep 17 00:00:00 2001 From: "jeremy.neveu" Date: Wed, 19 Feb 2025 17:29:17 +0100 Subject: [PATCH 157/161] exclude_percentile=80 for sextractor background when multiple sources are found --- spectractor/extractor/background.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/extractor/background.py b/spectractor/extractor/background.py index 4fa382998..0317040f1 100644 --- a/spectractor/extractor/background.py +++ b/spectractor/extractor/background.py @@ -275,7 +275,7 @@ def extract_spectrogram_background_sextractor(data, err, ws=(20, 30), mask_signa bkg = Background2D(data, (parameters.PIXWIDTH_BOXSIZE, parameters.PIXWIDTH_BOXSIZE), filter_size=(filter_size, filter_size), sigma_clip=sigma_clip, bkg_estimator=bkg_estimator, - mask=mask) + mask=mask, exclude_percentile=80) # reset at zero the edges bkg.background[data == 0] = 0 bgd_model_func_interp = RegularGridInterpolator((np.arange(Nx), np.arange(Ny)), bkg.background.T, method='linear', From d40495991ec257b55b895875618a00c4e7f8efc5 Mon Sep 17 00:00:00 2001 From: "jeremy.neveu" Date: Wed, 19 Feb 2025 17:30:26 +0100 Subject: [PATCH 158/161] cleaning --- spectractor/fit/fit_spectrum.py | 1 - 1 file changed, 1 deletion(-) diff --git a/spectractor/fit/fit_spectrum.py b/spectractor/fit/fit_spectrum.py index 2340e7b04..3a5ffb0e9 100644 --- a/spectractor/fit/fit_spectrum.py +++ b/spectractor/fit/fit_spectrum.py @@ -63,7 +63,6 @@ def __init__(self, spectrum, atmgrid_file_name="", fit_angstrom_exponent=False, p = np.array([1, 0, 0.05, 1.2, 400, 5, 1, self.spectrum.header['D2CCD'], self.spectrum.header['PIXSHIFT'], 0]) fixed = [False] * p.size fixed[0] = True - # TODO: StarDICE data for HD93521 clearly needs to fit A2 and shift_x => find a better way to decontaminate from order 2 fixed[1] = "A2_T" not in self.spectrum.header # fit A2 only on sims to evaluate extraction biases fixed[5] = False # fixed[6:8] = [True, True] From 1e385ad052d1338356dd09397ac6e0b315ba8a38 Mon Sep 17 00:00:00 2001 From: "jeremy.neveu" Date: Wed, 19 Feb 2025 17:31:59 +0100 Subject: [PATCH 159/161] add hgamma and hdelta to calibrte --- spectractor/extractor/spectroscopy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spectractor/extractor/spectroscopy.py b/spectractor/extractor/spectroscopy.py index c741b0eb1..618949068 100644 --- a/spectractor/extractor/spectroscopy.py +++ b/spectractor/extractor/spectroscopy.py @@ -501,8 +501,8 @@ def build_detected_line_table(self, amplitude_units="", calibration_only=False): # Hydrogen lines HALPHA = Line(656.3, atmospheric=False, label='$H\\alpha$', label_pos=[-0.02, 0.02], use_for_calibration=True) HBETA = Line(486.3, atmospheric=False, label='$H\\beta$', label_pos=[0.007, 0.02], use_for_calibration=True) -HGAMMA = Line(434.0, atmospheric=False, label='$H\\gamma$', label_pos=[0.007, 0.02], use_for_calibration=False) -HDELTA = Line(410.2, atmospheric=False, label='$H\\delta$', label_pos=[0.007, 0.02], use_for_calibration=False) +HGAMMA = Line(434.0, atmospheric=False, label='$H\\gamma$', label_pos=[0.007, 0.02], use_for_calibration=True) +HDELTA = Line(410.2, atmospheric=False, label='$H\\delta$', label_pos=[0.007, 0.02], use_for_calibration=True) HEPSILON = Line(397.0, atmospheric=False, label='$H\\epsilon$', label_pos=[-0.02, 0.02], use_for_calibration=False) HYDROGEN_LINES = [HALPHA, HBETA, HGAMMA, HDELTA, HEPSILON] From 56e1678c33a7c9e54ce166c5b1eb27b98cf1a7e6 Mon Sep 17 00:00:00 2001 From: "jeremy.neveu" Date: Mon, 24 Feb 2025 15:47:55 +0100 Subject: [PATCH 160/161] debug rotation --- spectractor/extractor/images.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index e2c7ee966..3956408b0 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -1063,7 +1063,7 @@ def find_target_init(image, guess, rotated=False, widths=[parameters.XWINDOW, pa Dx, Dy = widths if rotated: sub_image = np.copy(image.data_rotated[y0 - Dy:y0 + Dy, x0 - Dx:x0 + Dx]) - sub_errors = np.copy(image.err[y0 - Dy:y0 + Dy, x0 - Dx:x0 + Dx]) + sub_errors = np.copy(image.err_rotated[y0 - Dy:y0 + Dy, x0 - Dx:x0 + Dx]) else: sub_image = np.copy(image.data[y0 - Dy:y0 + Dy, x0 - Dx:x0 + Dx]) sub_errors = np.copy(image.err[y0 - Dy:y0 + Dy, x0 - Dx:x0 + Dx]) From 3d971672c58b07614e6b14d5dd06cb3a90226396 Mon Sep 17 00:00:00 2001 From: "jeremy.neveu" Date: Mon, 24 Feb 2025 15:50:16 +0100 Subject: [PATCH 161/161] set ymax excluding empty columns at the right edge of the spectrogram --- spectractor/extractor/extractor.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 0c2a72c60..3b0e5154e 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -1325,6 +1325,10 @@ def extract_spectrum_from_image(image, spectrum, signal_width=10, ws=(20, 30)): order=spectrum.order) xmin = int(np.argmin(np.abs(lambdas - parameters.LAMBDA_MIN))) xmax = int(np.argmin(np.abs(lambdas - parameters.LAMBDA_MAX))) + # remove last pixel column of rotated image if it is full of nan values in signal region + while np.all(data[max(0, y0 - ws[0]):min(Ny, y0 + ws[0]), xmax]==0) or np.all(np.isnan(data[max(0, y0 - ws[0]):min(Ny, y0 + ws[0]), xmax])): + image.my_logger.debug(f"Last data column is invalid (full of nan or zeros). Subtract 1 to {xmax=}->{xmax-1}") + xmax -= 1 # Create spectrogram data = data[ymin:ymax, xmin:xmax]