diff --git a/config/auxtel.ini b/config/auxtel.ini index 7e7988cbf..f2ecccde1 100644 --- a/config/auxtel.ini +++ b/config/auxtel.ini @@ -29,7 +29,7 @@ OBS_QUANTUM_EFFICIENCY = calexp_2020031500162-EMPTY_ronchi90lpmm-det000_auxtel_t OBS_CAMERA_ROTATION = 0 # Camera (x,y) flip signs with respect to (north-up, east-left) system OBS_CAMERA_DEC_FLIP_SIGN = 1 -OBS_CAMERA_RA_FLIP_SIGN = 1 +OBS_CAMERA_RA_FLIP_SIGN = -1 [CCD] # size of the image in pixel @@ -43,17 +43,17 @@ CCD_MAXADU = 170000 # electronic gain : elec/ADU CCD_GAIN = 1.1 # rebinning of the image in pixel -CCD_REBIN = 4 +CCD_REBIN = 2 [dispersers] # distance between hologram and CCD in mm DISTANCE2CCD = 175 # uncertainty on distance between hologram and CCD in mm -DISTANCE2CCD_ERR = 0.5 +DISTANCE2CCD_ERR = 0.75 # constructor wavelength to make holograms in mm LAMBDA_CONSTRUCTOR = 639e-6 # approximate effective number of lines per millimeter of the hologram -GROOVES_PER_MM = 100 +GROOVES_PER_MM = 150 # plate center shift on x in mm in filter frame PLATE_CENTER_SHIFT_X = -6. # plate center shift on x in mm in filter frame diff --git a/config/auxtel_quicklook.ini b/config/auxtel_quicklook.ini index b690591d9..f447c16f7 100644 --- a/config/auxtel_quicklook.ini +++ b/config/auxtel_quicklook.ini @@ -29,7 +29,7 @@ OBS_QUANTUM_EFFICIENCY = calexp_2020031500162-EMPTY_ronchi90lpmm-det000_auxtel_t OBS_CAMERA_ROTATION = 0 # Camera (x,y) flip signs with respect to (north-up, east-left) system OBS_CAMERA_DEC_FLIP_SIGN = 1 -OBS_CAMERA_RA_FLIP_SIGN = 1 +OBS_CAMERA_RA_FLIP_SIGN = -1 [CCD] # size of the image in pixel @@ -49,11 +49,11 @@ CCD_REBIN = 1 # distance between hologram and CCD in mm DISTANCE2CCD = 175 # uncertainty on distance between hologram and CCD in mm -DISTANCE2CCD_ERR = 0.5 +DISTANCE2CCD_ERR = 0.75 # constructor wavelength to make holograms in mm LAMBDA_CONSTRUCTOR = 639e-6 # approximate effective number of lines per millimeter of the hologram -GROOVES_PER_MM = 100 +GROOVES_PER_MM = 150 # plate center shift on x in mm in filter frame PLATE_CENTER_SHIFT_X = -6. # plate center shift on x in mm in filter frame @@ -94,7 +94,7 @@ LAMBDA_MAX = 1100 [background subtraction parameters] # half transverse width of the signal rectangular window in pixels -PIXWIDTH_SIGNAL = 20 +PIXWIDTH_SIGNAL = 40 # distance from dispersion axis to analyse the background in pixels PIXDIST_BACKGROUND = 140 # transverse width of the background rectangular window in pixels diff --git a/config/lpnhe.ini b/config/lpnhe.ini index 2493ef7bf..9e03bc1a7 100644 --- a/config/lpnhe.ini +++ b/config/lpnhe.ini @@ -39,9 +39,9 @@ CCD_GAIN = 0.85 [dispersers] # distance between hologram and CCD in mm -DISTANCE2CCD = 198 +DISTANCE2CCD = 204.2 # uncertainty on distance between hologram and CCD in mm -DISTANCE2CCD_ERR = 1 +DISTANCE2CCD_ERR = 0.5 # constructor wavelength to make holograms in mm LAMBDA_CONSTRUCTOR = 639e-6 # approximate effective number of lines per millimeter of the hologram @@ -84,7 +84,7 @@ LAMBDA_MAX = 1000 [background subtraction parameters] # half transverse width of the signal rectangular window in pixels -PIXWIDTH_SIGNAL = 10 +PIXWIDTH_SIGNAL = 20 # distance from dispersion axis to analyse the background in pixels PIXDIST_BACKGROUND = 80 # transverse width of the background rectangular window in pixels @@ -104,15 +104,15 @@ PSF_PIXEL_STEP_TRANSVERSE_FIT = 10 [detection line algorithm parameters] # order of the background polynome to fit -CALIB_BGD_ORDER = 3 +CALIB_BGD_ORDER = 1 # half range to look for local extrema in pixels around tabulated line values -CALIB_PEAK_WIDTH = 3 +CALIB_PEAK_WIDTH = 25 # size of the peak sides to use to fit spectrum base line CALIB_BGD_WIDTH = 40 # window size for the savgol filter in pixels -CALIB_SAVGOL_WINDOW = 5 +CALIB_SAVGOL_WINDOW = 7 # polynom order for the savgol filter -CALIB_SAVGOL_ORDER = 2 +CALIB_SAVGOL_ORDER = 1 [plot settings] # paper plot style diff --git a/runExtractor.py b/runExtractor.py index 144cc98ad..732d2d2d6 100644 --- a/runExtractor.py +++ b/runExtractor.py @@ -1,6 +1,7 @@ from spectractor import parameters from spectractor.extractor.extractor import Spectractor from spectractor.logbook import LogBook +from spectractor.config import load_config import sys if __name__ == "__main__": @@ -35,21 +36,27 @@ file_names = args.input + load_config(args.config) + logbook = LogBook(logbook=args.logbook) for file_name in file_names: disperser_label = args.disperser_label - if args.target_xy == "0,0" and args.target_label == "": + if parameters.OBS_NAME == "CTIO": tag = file_name.split('/')[-1] tag = tag.replace('sim_', 'reduc_') disperser_label, target_label, xpos, ypos = logbook.search_for_image(tag) + guess = [xpos, ypos] if target_label is None or xpos is None or ypos is None: continue else: - xpos, ypos = args.target_xy.split(",") + guess = None + if args.target_xy != "0,0": + xpos, ypos = args.target_xy.split(",") + xpos = float(xpos) + ypos = float(ypos) + guess = [xpos, ypos] target_label = args.target_label - xpos = float(xpos) - ypos = float(ypos) - if target_label == "" or (xpos == 0 and ypos == 0): - sys.exit("Options --xy and --target must be used together, one of these seems not set.") - Spectractor(file_name, args.output_directory, target_label=target_label, guess=[xpos, ypos], + # if target_label == "" or (xpos == 0 and ypos == 0): + # sys.exit("Options --xy and --target must be used together, one of these seems not set.") + Spectractor(file_name, args.output_directory, target_label=target_label, guess=guess, disperser_label=disperser_label, config=args.config) diff --git a/spectractor/config.py b/spectractor/config.py index f820379e5..0d8c676a3 100644 --- a/spectractor/config.py +++ b/spectractor/config.py @@ -67,11 +67,12 @@ def load_config(config_filename): .. doctest: :hide: - >>> load_config("./config/unknown_file.ini") + >>> load_config("./config/ctio.ini") + >>> load_config("ctio.ini") + >>> load_config("./config/unknown_file.ini") #doctest: +ELLIPSIS Traceback (most recent call last): ... - SystemExit: Config file ./config/unknown_file.ini does not exist. - >>> load_config("./config/ctio.ini") + FileNotFoundError: Config file ./config/unknown_file.ini does not exist. """ if not os.path.isfile(os.path.join(parameters.CONFIG_DIR, "default.ini")): @@ -82,7 +83,10 @@ def load_config(config_filename): from_config_to_parameters(config) if not os.path.isfile(config_filename): - raise FileNotFoundError(f'Config file {config_filename} does not exist.') + if not os.path.isfile(os.path.join(parameters.CONFIG_DIR, config_filename)): + raise FileNotFoundError(f'Config file {config_filename} does not exist.') + else: + config_filename = os.path.join(parameters.CONFIG_DIR, config_filename) # Load the configuration file config = configparser.ConfigParser() config.read(config_filename) @@ -164,4 +168,3 @@ def set_logger(logger): import doctest doctest.testmod() - diff --git a/spectractor/extractor/dispersers/holo4_003/N.txt b/spectractor/extractor/dispersers/holo4_003/N.txt index 59a362849..023ee0ed2 100644 --- a/spectractor/extractor/dispersers/holo4_003/N.txt +++ b/spectractor/extractor/dispersers/holo4_003/N.txt @@ -1,2 +1,2 @@ -156.49452269170578 --0.275 +150 +1.0 diff --git a/spectractor/extractor/dispersers/holo4_003/hologram_center.txt b/spectractor/extractor/dispersers/holo4_003/hologram_center.txt index 8016fdedf..410566f3e 100644 --- a/spectractor/extractor/dispersers/holo4_003/hologram_center.txt +++ b/spectractor/extractor/dispersers/holo4_003/hologram_center.txt @@ -1,2 +1,2 @@ #x_star y_star grooves_per_mm grooves_per_mm_err -400.0 400.0 0.5 \ No newline at end of file +400.0 2750.0 -0.28 \ No newline at end of file diff --git a/spectractor/extractor/extractor.py b/spectractor/extractor/extractor.py index 7566052cc..cd3b8a022 100644 --- a/spectractor/extractor/extractor.py +++ b/spectractor/extractor/extractor.py @@ -500,8 +500,8 @@ def plot_spectrogram_comparison_simple(self, ax, title='', extent=None, dispersi ax[1, 1].get_yaxis().set_label_coords(3.5, 0.5) ax[2, 1].get_yaxis().set_label_coords(3.5, 0.5) ax[3, 1].remove() - ax[3, 0].plot(self.lambdas[sub], data.sum(axis=0)[sub], label='Data') - ax[3, 0].plot(self.lambdas[sub], model.sum(axis=0)[sub], label='Model') + ax[3, 0].plot(self.lambdas[sub], np.nansum(data, axis=0)[sub], label='Data') + ax[3, 0].plot(self.lambdas[sub], np.nansum(model, axis=0)[sub], label='Model') ax[3, 0].set_ylabel('Cross spectrum') ax[3, 0].set_xlabel(r'$\lambda$ [nm]') ax[3, 0].legend(fontsize=7) @@ -765,6 +765,12 @@ def Spectractor(file_name, output_directory, target_label, guess=None, disperser image = Image(file_name, target_label=target_label, disperser_label=disperser_label) if guess is not None and image.target_guess is None: image.target_guess = np.asarray(guess) + if image.target_guess is None: + from scipy.signal import medfilt2d + data = medfilt2d(image.data.T, kernel_size=9) + image.target_guess = np.unravel_index(np.argmax(data), data.shape) + 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', target_pixcoords=image.target_guess) diff --git a/spectractor/extractor/images.py b/spectractor/extractor/images.py index 373ac8612..ceb82fde5 100644 --- a/spectractor/extractor/images.py +++ b/spectractor/extractor/images.py @@ -14,6 +14,7 @@ from spectractor.extractor.dispersers import Hologram from spectractor.extractor.psf import Moffat from spectractor.simulation.adr import hadec2zdpar +from spectractor.simulation.throughput import TelescopeTransmission from spectractor.tools import (plot_image_simple, save_fits, load_fits, fit_poly1d, plot_compass_simple, fit_poly1d_outlier_removal, weighted_avg_and_std, fit_poly2d_outlier_removal, hessian_and_theta, @@ -68,7 +69,7 @@ def __init__(self, file_name, target_label="", disperser_label="", config=""): self.disperser_label = disperser_label self.target_label = target_label self.target_guess = None - self.filter = None + self.filter_label = "" self.filters = None self.header = None self.data = None @@ -111,6 +112,10 @@ def __init__(self, file_name, target_label="", disperser_label="", config=""): self.header['D2CCD'] = parameters.DISTANCE2CCD self.header.comments["D2CCD"] = "[mm] distance between disperser and CCD" + if self.filter_label != "" and "empty" not in self.filter_label.lower(): + t = TelescopeTransmission(filter_label=self.filter_label) + t.reset_lambda_range(transmission_threshold=1e-4) + if self.target_label != "": self.target = load_target(self.target_label, verbose=parameters.VERBOSE) self.header['REDSHIFT'] = str(self.target.redshift) @@ -440,7 +445,8 @@ def load_CTIO_image(image): image.airmass = float(image.header['AIRMASS']) image.expo = float(image.header['EXPTIME']) image.filters = image.header['FILTERS'] - image.filter = image.header['FILTER1'] + if "dia" not in image.header['FILTER1'].lower(): + image.filter_label = image.header['FILTER1'] image.disperser_label = image.header['FILTER2'] image.ra = Angle(image.header['RA'], unit="hourangle") image.dec = Angle(image.header['DEC'], unit="deg") @@ -556,6 +562,18 @@ def load_LPNHE_image(image): # pragma: no cover image.header.comments["ZPOS"] = hdus["XYZ"].header.comments["ZPOS"] image.my_logger.info('\n\tImage loaded') + if image.target_label == "HG-AR": + parameters.OBS_OBJECT_TYPE = "HG-AR" + elif "QTH" in image.target_label: + parameters.OBS_OBJECT_TYPE = "MONOCHROMATOR" + parameters.PIXWIDTH_SIGNAL = 30 + image.target_label += str(hdus["CORNERSTONE"].header["WVLGTH"]) + elif "LASER" in image.target_label: + parameters.OBS_OBJECT_TYPE = "LASER" + parameters.PIXWIDTH_SIGNAL = 30 + else: + raise ValueError(f"\nTarget label {image.target_label} unknown for LPNHE optical bench.") + def load_AUXTEL_image(image): # pragma: no cover """Specific routine to load AUXTEL fits files and load their data and properties for Spectractor. @@ -572,6 +590,8 @@ def load_AUXTEL_image(image): # pragma: no cover hdu_list.close() # need to free allocation for file descripto image.date_obs = image.header['DATE'] image.expo = float(image.header['EXPTIME']) + if "empty" not in image.header['FILTER'].lower(): + image.filter_label = image.header['FILTER'] # 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.T[::-1, ::-1] @@ -586,10 +606,19 @@ def load_AUXTEL_image(image): # pragma: no cover image.disperser_label = image.header['GRATING'] image.ra = Angle(image.header['RA'], unit="deg") image.dec = Angle(image.header['DEC'], unit="deg") - image.hour_angle = Angle(image.header['HA'], unit="deg") - image.temperature = 10 # image.header['OUTTEMP'] - image.pressure = 730 # image.header['OUTPRESS'] - image.humidity = 25 # image.header['OUTHUM'] + image.hour_angle = Angle(image.header['HASTART'], unit="hourangle") + if 'AIRTEMP' in image.header: + image.temperature = image.header['AIRTEMP'] + else: + image.temperature = 10 + if 'PRESSURE' in image.header: + image.pressure = image.header['PRESSURE'] + else: + image.pressure = 743 + if 'HUMIDITY' in image.header: + image.humidity = image.header['HUMIDITY'] + else: + image.humidity = 40 if 'adu' in image.header['BUNIT']: image.units = 'ADU' parameters.OBS_CAMERA_ROTATION = 90 - float(image.header["ROTPA"]) @@ -597,20 +626,21 @@ def load_AUXTEL_image(image): # pragma: no cover parameters.OBS_CAMERA_ROTATION -= 360 if parameters.OBS_CAMERA_ROTATION < -360: parameters.OBS_CAMERA_ROTATION += 360 - 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 " - f"parameters.OBS_CAMERA_ROTATION={parameters.OBS_CAMERA_ROTATION} degree. " - f"\nBoth differs by more than 2 degree... bug ?") + if "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 " + f"parameters.OBS_CAMERA_ROTATION={parameters.OBS_CAMERA_ROTATION} degree. " + f"\nBoth differs by more than 2 degree... bug ?") parameters.OBS_ALTITUDE = float(image.header['OBS-ELEV']) / 1000 parameters.OBS_LATITUDE = image.header['OBS-LAT'] image.read_out_noise = 8.5 * np.ones_like(image.data) image.target_label = image.header["OBJECT"].replace(" ", "") - image.target_guess = [parameters.CCD_IMSIZE - float(image.header["OBJECTY"]), - parameters.CCD_IMSIZE - float(image.header["OBJECTX"])] - image.disperser_label = image.header["GRATING"] + if "OBJECTX" in image.header: + image.target_guess = [parameters.CCD_IMSIZE - float(image.header["OBJECTY"]), + parameters.CCD_IMSIZE - float(image.header["OBJECTX"])] image.disperser_label = image.header["GRATING"] - parameters.DISTANCE2CCD = 116 + float(image.header["LINSPOS"]) # mm + parameters.DISTANCE2CCD = 115 + float(image.header["LINSPOS"]) # mm image.compute_parallactic_angle() @@ -705,13 +735,14 @@ def find_target(image, guess=None, rotated=False, use_wcs=True, widths=[paramete theX = x0 - Dx + sub_image_x0 theY = y0 - Dy + sub_image_y0 # crop for next iteration - if i < niter-1: + if i < niter - 1: Dx = Dx // (i + 2) Dy = Dy // (i + 2) x0 = int(theX) y0 = int(theY) NY, NX = sub_image_subtracted.shape - sub_image_subtracted = sub_image_subtracted[max(0, int(sub_image_y0) - Dy):min(NY, int(sub_image_y0) + Dy), + sub_image_subtracted = sub_image_subtracted[ + max(0, int(sub_image_y0) - Dy):min(NY, int(sub_image_y0) + Dy), max(0, int(sub_image_x0) - Dx):min(NX, int(sub_image_x0) + Dx)] sub_errors = sub_errors[max(0, int(sub_image_y0) - Dy):min(NY, int(sub_image_y0) + Dy), max(0, int(sub_image_x0) - Dx):min(NX, int(sub_image_x0) + Dx)] diff --git a/spectractor/extractor/psf.py b/spectractor/extractor/psf.py index 1c9274500..e26f45505 100644 --- a/spectractor/extractor/psf.py +++ b/spectractor/extractor/psf.py @@ -704,33 +704,24 @@ def evaluate(self, pixels, p=None): -------- >>> from spectractor.extractor.images import Image, find_target >>> im = Image('tests/data/reduc_20170605_028.fits', target_label="PNG321.0+3.9") - >>> im = Image("/Users/jneveu/20200207/10_CCD1_20200207115122.fz", config="config/lpnhe.ini", target_label="HG-AR") >>> im.plot_image() >>> guess = [820, 580] - >>> guess = [490,360] >>> parameters.VERBOSE = True >>> parameters.DEBUG = True >>> x0, y0 = find_target(im, guess) >>> p = [1,40,50,1,1e20] >>> psf = Order0(target=im.target, p=p) + + 2D evaluation: + >>> yy, xx = np.mgrid[:80, :100] >>> out = psf.evaluate(pixels=np.array([xx, yy])) - >>> fig = plt.figure(figsize=(5,5)) - >>> plt.imshow(out, origin="lower") - >>> plt.xlabel("X [pixels]") - >>> plt.ylabel("Y [pixels]") - >>> plt.show() + 1D evaluation: >>> out = psf.evaluate(pixels=np.arange(100)) - >>> fig = plt.figure(figsize=(5,5)) - >>> plt.plot(out) - >>> plt.xlabel("X [pixels]") - >>> plt.ylabel("Y [pixels]") - >>> plt.show() - .. plot:: import matplotlib.pyplot as plt @@ -743,7 +734,7 @@ def evaluate(self, pixels, p=None): parameters.VERBOSE = True parameters.DEBUG = True x0, y0 = find_target(im, guess) - p = [2,40,30,1,1e20] + p = [1,40,50,1,1e20] psf = Order0(target=im.target, p=p) yy, xx = np.mgrid[:80, :100] out = psf.evaluate(pixels=np.array([xx, yy])) diff --git a/spectractor/extractor/spectroscopy.py b/spectractor/extractor/spectroscopy.py index b5e718809..50881c727 100644 --- a/spectractor/extractor/spectroscopy.py +++ b/spectractor/extractor/spectroscopy.py @@ -198,7 +198,7 @@ def __init__(self, lines, redshift=0, atmospheric_lines=True, hydrogen_only=Fals if order > 1: if line.label[-1] == "$": tmp_line.label = tmp_line.label[:-1] - tmp_line.label += "^(2)" + tmp_line.label += "^{(2)}" if line.label[-1] == "$": tmp_line.label += "$" self.lines.append(tmp_line) @@ -582,7 +582,7 @@ def print_detected_lines(self, output_file_name="", overwrite=False, print_table HG6 = Line(365.015, atmospheric=False, label=r'$Hg$', label_pos=[0.007, 0.02], use_for_calibration=True) HG7 = Line(404.656, atmospheric=False, label=r'$Hg$', label_pos=[0.007, 0.02], use_for_calibration=True) HG8 = Line(407.783, atmospheric=False, label=r'$Hg$', label_pos=[0.007, 0.02], use_for_calibration=True) -HG9 = Line(435.833, atmospheric=False, label=r'$Hg$', label_pos=[0.007, 0.02]) +HG9 = Line(435.833, atmospheric=False, label=r'$Hg$', label_pos=[0.007, 0.02], use_for_calibration=True) HG10 = Line(546.074, atmospheric=False, label=r'$Hg$', label_pos=[0.007, 0.02], use_for_calibration=True) HG11 = Line(576.960, atmospheric=False, label=r'$Hg$', label_pos=[0.007, 0.02], use_for_calibration=True) HG12 = Line(579.066, atmospheric=False, label=r'$Hg$', label_pos=[0.007, 0.02], use_for_calibration=True) diff --git a/spectractor/extractor/spectrum.py b/spectractor/extractor/spectrum.py index d27933fff..92807ae05 100644 --- a/spectractor/extractor/spectrum.py +++ b/spectractor/extractor/spectrum.py @@ -17,6 +17,7 @@ from spectractor.extractor.psf import load_PSF from spectractor.extractor.chromaticpsf import ChromaticPSF from spectractor.simulation.adr import adr_calib, flip_and_rotate_adr_to_image_xy_coordinates +from spectractor.simulation.throughput import TelescopeTransmission class Spectrum: @@ -75,7 +76,7 @@ def __init__(self, file_name="", image=None, order=1, target=None, config="", fa self.lambda_ref = None self.order = order self.chromatic_psf = None - self.filter = None + self.filter_label = "" self.filters = None self.units = 'ADU/s' self.gain = parameters.CCD_GAIN @@ -111,7 +112,7 @@ def __init__(self, file_name="", image=None, order=1, target=None, config="", fa self.airmass = image.airmass self.expo = image.expo self.filters = image.filters - self.filter = image.filter + self.filter_label = image.filter_label self.disperser_label = image.disperser_label self.disperser = image.disperser self.target = image.target @@ -205,23 +206,19 @@ def load_filter(self): Examples -------- >>> s = Spectrum() - >>> s.filter = 'FGB37' + >>> s.filter_label = 'FGB37' >>> s.load_filter() .. doctest:: :hide: - >>> assert parameters.LAMBDA_MIN == parameters.FGB37['min'] - >>> assert parameters.LAMBDA_MAX == parameters.FGB37['max'] + >>> assert np.isclose(parameters.LAMBDA_MIN, 300) + >>> assert np.isclose(parameters.LAMBDA_MAX, 760) """ - for f in parameters.FILTERS: - if f['label'] == self.filter: - parameters.LAMBDA_MIN = f['min'] - parameters.LAMBDA_MAX = f['max'] - self.my_logger.info('\n\tLoad filter %s: lambda between %.1f and %.1f' % ( - f['label'], parameters.LAMBDA_MIN, parameters.LAMBDA_MAX)) - break + if self.filter_label != "" and "empty" not in self.filter_label.lower(): + t = TelescopeTransmission(filter_label=self.filter_label) + t.reset_lambda_range(transmission_threshold=1e-4) def plot_spectrum(self, ax=None, xlim=None, live_fit=False, label='', force_lines=False): """Plot spectrum with emission and absorption lines. @@ -269,7 +266,9 @@ def plot_spectrum(self, ax=None, xlim=None, live_fit=False, label='', force_line title=title, units=self.units) if len(self.target.spectra) > 0: for k in range(len(self.target.spectra)): - s = self.target.spectra[k] / np.max(self.target.spectra[k]) * np.max(self.data) + plot_indices = np.logical_and(self.target.wavelengths[k] > np.min(self.lambdas), + self.target.wavelengths[k] < np.max(self.lambdas)) + s = self.target.spectra[k] / np.max(self.target.spectra[k][plot_indices]) * np.max(self.data) ax.plot(self.target.wavelengths[k], s, lw=2, label='Tabulated spectra #%d' % k) if self.lambdas is not None: self.lines.plot_detected_lines(ax, print_table=parameters.VERBOSE) @@ -478,7 +477,7 @@ def load_spectrum(self, input_file_name): self.date_obs = self.header['DATE-OBS'] if self.header['EXPTIME'] != "": self.expo = self.header['EXPTIME'] - if self.header['AIRMASS'] != "": + if 'AIRMASS' in self.header and self.header['AIRMASS'] != "": self.airmass = self.header['AIRMASS'] if self.header['GRATING'] != "": self.disperser_label = self.header['GRATING'] @@ -503,7 +502,7 @@ def load_spectrum(self, input_file_name): self.pressure = self.header['OUTPRESS'] if 'OUTHUM' in self.header and self.header['OUTHUM'] != "": self.humidity = self.header['OUTHUM'] - if self.header['LBDA_REF'] != "": + if 'LBDA_REF' in self.header and self.header['LBDA_REF'] != "": self.lambda_ref = self.header['LBDA_REF'] if 'PARANGLE' in self.header and self.header['PARANGLE'] != "": self.parallactic_angle = self.header['PARANGLE'] @@ -1111,6 +1110,10 @@ def shift_minimizer(params): chisq = detect_lines(spectrum.lines, spectrum.lambdas, spectrum.data, spec_err=spectrum.err, fwhm_func=fwhm_func, ax=None, calibration_lines_only=True) chisq += ((shift) / parameters.PIXSHIFT_PRIOR) ** 2 + + #if spectrum.target.image is not None: + # spectrum.psf.fit_psf(spectrum.target.image, data_errors=np.sqrt(np.abs(spectrum.target.image)), + # bgd_model_func=None) if parameters.DEBUG and parameters.DISPLAY: if parameters.LIVE_FIT: spectrum.plot_spectrum(live_fit=True, label=f'Order {spectrum.order:d} spectrum\n' diff --git a/spectractor/extractor/targets.py b/spectractor/extractor/targets.py index 6f2bb7d7e..e687660b9 100644 --- a/spectractor/extractor/targets.py +++ b/spectractor/extractor/targets.py @@ -7,11 +7,13 @@ import matplotlib.pyplot as plt from scipy.interpolate import interp1d import os +import re import numpy as np from spectractor import parameters from spectractor.config import set_logger -from spectractor.extractor.spectroscopy import (Lines, HGAR_LINES, HYDROGEN_LINES, ATMOSPHERIC_LINES, +from spectractor.tools import reset_lambda_range +from spectractor.extractor.spectroscopy import (Lines, Line, HGAR_LINES, HYDROGEN_LINES, ATMOSPHERIC_LINES, ISM_LINES, STELLAR_LINES) if os.getenv("PYSYN_CDBS"): @@ -56,6 +58,8 @@ def load_target(label, verbose=False): return ArcLamp(label, verbose) elif parameters.OBS_OBJECT_TYPE == 'MONOCHROMATOR': return Monochromator(label, verbose) + elif parameters.OBS_OBJECT_TYPE == 'LASER': + return Laser(label, verbose) else: raise ValueError(f'Unknown parameters.OBS_OBJECT_TYPE: {parameters.OBS_OBJECT_TYPE}') @@ -138,18 +142,56 @@ def __init__(self, label, verbose=False): Examples -------- - - >>> t = Monochromator("XX", verbose=False) + >>> parameters.VERBOSE = True + >>> t = Monochromator("QTH500.50", verbose=False) >>> print(t.label) - XX + QTH500.50 >>> print(t.emission_spectrum) True + >>> print(t.lines.lines[0].wavelength) + 500.5 """ Target.__init__(self, label, verbose=verbose) self.my_logger = set_logger(self.__class__.__name__) self.emission_spectrum = True - self.lines = Lines([], emission_spectrum=True, orders=[1, 2]) + wl = float(re.findall(r"[-+]?\d*\.\d+|\d+", label)[0]) + line = Line(wl, label, atmospheric=False, emission=True, use_for_calibration=True) + self.lines = Lines([line], emission_spectrum=True, orders=[1, 2]) + reset_lambda_range(wl-20, wl+20) + self.my_logger.info(f"\n\tWith object {self.label}, set parameters.LAMBDA_MIN={parameters.LAMBDA_MIN} " + f"and parameters.LAMBDA_MAX={parameters.LAMBDA_MAX}.") + + def load(self): # pragma: no cover + pass + + +class Laser(Monochromator): + + def __init__(self, label, verbose=False): + """Initialize Monochromator class. + + Parameters + ---------- + label: str + String label to name the monochromator. + verbose: bool, optional + Set True to increase verbosity (default: False) + + Examples + -------- + >>> parameters.VERBOSE = True + >>> t = Laser("LASER980", verbose=False) + >>> print(t.label) + LASER980 + >>> print(t.emission_spectrum) + True + >>> print(f"{t.lines.lines[0].wavelength:.0f}") + 980 + + """ + Monochromator.__init__(self, label, verbose=verbose) + self.my_logger = set_logger(self.__class__.__name__) def load(self): # pragma: no cover pass diff --git a/spectractor/fit/fit_spectrogram.py b/spectractor/fit/fit_spectrogram.py index 09c8d0e4b..566b67622 100644 --- a/spectractor/fit/fit_spectrogram.py +++ b/spectractor/fit/fit_spectrogram.py @@ -247,8 +247,8 @@ def plot_spectrogram_comparison_simple(self, ax, title='', extent=None, dispersi ax[1, 1].get_yaxis().set_label_coords(3.5, 0.5) ax[2, 1].get_yaxis().set_label_coords(3.5, 0.5) ax[3, 1].remove() - ax[3, 0].plot(self.lambdas[sub], data.sum(axis=0)[sub], label='Data') - ax[3, 0].plot(self.lambdas[sub], model.sum(axis=0)[sub], label='Model') + ax[3, 0].plot(self.lambdas[sub], np.nansum(data, axis=0)[sub], label='Data') + ax[3, 0].plot(self.lambdas[sub], np.nansum(model, axis=0)[sub], label='Model') ax[3, 0].set_ylabel('Cross spectrum') ax[3, 0].set_xlabel(r'$\lambda$ [nm]') ax[3, 0].legend(fontsize=7) diff --git a/spectractor/simulation/AuxTelThroughput/BG40.txt b/spectractor/simulation/AuxTelThroughput/BG40.txt new file mode 100644 index 000000000..b774044e6 --- /dev/null +++ b/spectractor/simulation/AuxTelThroughput/BG40.txt @@ -0,0 +1,321 @@ + 1800 0.4719608 + 1795 0.4685318 + 1790 0.4655569 + 1785 0.462828 + 1780 0.4599354 + 1775 0.4574909 + 1770 0.4541282 + 1765 0.4507338 + 1760 0.4473603 + 1755 0.4436066 + 1750 0.4398461 + 1745 0.4362125 + 1740 0.4321902 + 1735 0.4283501 + 1730 0.4247571 + 1725 0.4205092 + 1720 0.4158573 + 1715 0.4114566 + 1710 0.406531 + 1705 0.4014299 + 1700 0.3969261 + 1695 0.3925579 + 1690 0.3877382 + 1685 0.3819101 + 1680 0.3765844 + 1675 0.3714089 + 1670 0.3657067 + 1665 0.3591677 + 1660 0.3534186 + 1655 0.3478048 + 1650 0.3423537 + 1645 0.3362662 + 1640 0.3300508 + 1635 0.3236415 + 1630 0.3171935 + 1625 0.3104163 + 1620 0.3041152 + 1615 0.2980127 + 1610 0.2914316 + 1605 0.2844215 + 1600 0.2781405 + 1595 0.2714082 + 1590 0.2644347 + 1585 0.257601 + 1580 0.2502525 + 1575 0.2436787 + 1570 0.2372798 + 1565 0.2307698 + 1560 0.2239456 + 1555 0.2171074 + 1550 0.2108049 + 1545 0.2038324 + 1540 0.1966559 + 1535 0.1906166 + 1530 0.1845357 + 1525 0.1784766 + 1520 0.1717931 + 1515 0.1652399 + 1510 0.1589053 + 1505 0.1528103 + 1500 0.1469769 + 1495 0.1416657 + 1490 0.1357191 + 1485 0.1299863 + 1480 0.1244997 + 1475 0.1195226 + 1470 0.1142315 + 1465 0.1088641 + 1460 0.1035662 + 1455 0.0986609 + 1450 0.0941065 + 1445 0.0897102 + 1440 0.0854982 + 1435 0.0816684 + 1430 0.0776523 + 1425 0.0732679 + 1420 0.0692576 + 1415 0.0658151 + 1410 0.0622996 + 1405 0.05897 + 1400 0.0555535 + 1395 0.0524206 + 1390 0.0496205 + 1385 0.0460898 + 1380 0.0432059 + 1375 0.0404009 + 1370 0.0378268 + 1365 0.0355574 + 1360 0.0333205 + 1355 0.0312167 + 1350 0.0290078 + 1345 0.0269968 + 1340 0.0249442 + 1335 0.0228614 + 1330 0.0213289 + 1325 0.0200166 + 1320 0.0187573 + 1315 0.016981 + 1310 0.0156239 + 1305 0.0144177 + 1300 0.0133634 + 1295 0.0121844 + 1290 0.0114553 + 1285 0.010532 + 1280 0.0096025 + 1275 0.0086232 + 1270 0.0079945 + 1265 0.0073882 + 1260 0.0065085 + 1255 0.0057424 + 1250 0.0055152 + 1245 0.0051132 + 1240 0.004696 + 1235 0.0043438 + 1230 0.0039844 + 1225 0.0033657 + 1220 0.0030282 + 1215 0.0025927 + 1210 0.0019934 + 1205 0.0017889 + 1200 0.0017142 + 1195 0.0019767 + 1190 0.0020419 + 1185 0.001624 + 1180 0.0012311 + 1175 0.0011327 + 1170 0.0010933 + 1165 0.0007566 + 1160 0.0004031 + 1155 0.0006541 + 1150 0.0007502 + 1145 0.0007426 + 1140 0.00064 + 1135 0.0002109 + 1130 0.0002531 + 1125 0.0004681 + 1120 0.0003394 + 1115 -0.000019 + 1110 0.0001612 + 1105 0.0002749 + 1100 0.0001432 + 1095 0.0003339 + 1090 0.0000148 + 1085 -0.0000527 + 1080 -0.0000769 + 1075 -0.0001295 + 1070 0.000158 + 1065 0.0004106 + 1060 0.0000526 + 1055 0.0001369 + 1050 0.0003684 + 1045 -0.0002169 + 1040 -0.0005414 + 1035 -0.0000695 + 1030 0.0002916 + 1025 0.00000105 + 1020 -0.0001727 + 1015 0.000119 + 1010 0.0001948 + 1005 0.0001158 + 1000 0.0000864 + 995 0.0001064 + 990 0.0000916 + 985 -0.0000853 + 980 -0.0002455 + 975 -0.0001823 + 970 -0.0001517 + 965 -0.0001243 + 960 0.0000211 + 955 0.0000632 + 950 0.000137 + 945 0.0001306 + 940 -0.0000843 + 935 -0.0001506 + 930 -0.00000526 + 925 0.0000337 + 920 -0.0000621 + 915 -0.0001916 + 910 -0.0002295 + 905 -0.000081 + 900 0.0001325 + 895 0.0002207 + 890 0.0000431 + 885 -0.0001966 + 880 -0.0002942 + 875 -0.0000504 + 870 0.000084 + 865 -0.0000283 + 860 0.0000504 + 855 0.000048 + 850 -0.00003 + 845 -0.00000723 + 840 -0.00000721 + 835 0.00000103 + 830 -0.00000922 + 825 -0.00000204 + 820 0.0000163 + 815 0.0000265 + 810 -0.00000918 + 805 -0.0000235 + 800 -0.0000123 + 795 0.00000102 + 790 0.0000429 + 785 0.0000501 + 780 0.0000174 + 775 0.0000215 + 770 0.0000748 + 765 0.0001138 + 760 0.000117 + 755 0.0001859 + 750 0.0003032 + 745 0.0004155 + 740 0.0005732 + 735 0.00087 + 730 0.0012704 + 725 0.0017682 + 720 0.002454 + 715 0.0034863 + 710 0.0049257 + 705 0.0068835 + 700 0.0095125 + 695 0.0130628 + 690 0.0178051 + 685 0.0239734 + 680 0.0318267 + 675 0.0417994 + 670 0.0542542 + 665 0.0693629 + 660 0.0874926 + 655 0.1090482 + 650 0.1341112 + 645 0.1626605 + 640 0.1947102 + 635 0.2301958 + 630 0.2686491 + 625 0.3094455 + 620 0.3525695 + 615 0.3971059 + 610 0.4416947 + 605 0.486349 + 600 0.530971 + 595 0.5743268 + 590 0.6157859 + 585 0.654584 + 580 0.6903039 + 575 0.7227839 + 570 0.7521816 + 565 0.7782553 + 560 0.8006373 + 555 0.8201374 + 550 0.8364771 + 545 0.8501499 + 540 0.8613834 + 535 0.8702341 + 530 0.8771514 + 525 0.8825867 + 520 0.886819 + 515 0.8897865 + 510 0.8914138 + 505 0.8927141 + 500 0.8938409 + 495 0.8944454 + 490 0.8939561 + 485 0.8932604 + 480 0.8929351 + 475 0.8918581 + 470 0.8902314 + 465 0.8889923 + 460 0.8876562 + 455 0.8859172 + 450 0.8841771 + 445 0.8825078 + 440 0.8806573 + 435 0.8784124 + 430 0.8757029 + 425 0.873291 + 420 0.8704174 + 415 0.8671738 + 410 0.8637243 + 405 0.8601098 + 400 0.8561338 + 395 0.8513137 + 390 0.8457721 + 385 0.8398498 + 380 0.8330849 + 375 0.8247079 + 370 0.8144708 + 365 0.8025435 + 360 0.7865333 + 355 0.7643982 + 350 0.7331282 + 345 0.6889365 + 340 0.6245648 + 335 0.5338557 + 330 0.4111246 + 325 0.2601397 + 320 0.1125929 + 315 0.0254327 + 310 0.0017156 + 305 0.0000187 + 300 -0.00000415 + 295 -0.000029 + 290 -0.0000155 + 285 -0.00000516 + 280 0.00000618 + 275 0 + 270 -0.00000102 + 265 -0.00000919 + 260 -0.0000264 + 255 -0.0000172 + 250 0 + 245 -0.000002 + 240 0.00000099 + 235 -0.0000195 + 230 -0.0000222 + 225 -0.00000766 + 220 -0.00000191 + 215 0.00000664 + 210 0.00000662 + 205 0.0000161 + 200 0.00000846 \ No newline at end of file diff --git a/spectractor/simulation/AuxTelThroughput/RG610.txt b/spectractor/simulation/AuxTelThroughput/RG610.txt new file mode 100644 index 000000000..ee192623f --- /dev/null +++ b/spectractor/simulation/AuxTelThroughput/RG610.txt @@ -0,0 +1,321 @@ + 1800 0.90835061 + 1795 0.90851058 + 1790 0.90841455 + 1785 0.90868678 + 1780 0.90851164 + 1775 0.90876905 + 1770 0.90853068 + 1765 0.90865577 + 1760 0.90888402 + 1755 0.90899632 + 1750 0.90914243 + 1745 0.90919319 + 1740 0.90903718 + 1735 0.90896846 + 1730 0.90957829 + 1725 0.90973457 + 1720 0.90931601 + 1715 0.9093266 + 1710 0.9094062 + 1705 0.90960157 + 1700 0.90954972 + 1695 0.90944327 + 1690 0.90938469 + 1685 0.90938746 + 1680 0.9096258 + 1675 0.90968946 + 1670 0.90940435 + 1665 0.9095081 + 1660 0.90939159 + 1655 0.90928956 + 1650 0.90891355 + 1645 0.90909533 + 1640 0.90935865 + 1635 0.90914284 + 1630 0.90918038 + 1625 0.90883757 + 1620 0.90884646 + 1615 0.90892664 + 1610 0.90893921 + 1605 0.90862166 + 1600 0.9087508 + 1595 0.90839236 + 1590 0.90840471 + 1585 0.90825624 + 1580 0.90795044 + 1575 0.90789042 + 1570 0.90748379 + 1565 0.90759356 + 1560 0.90717335 + 1555 0.90710311 + 1550 0.90713181 + 1545 0.9072115 + 1540 0.90683525 + 1535 0.90660354 + 1530 0.90633305 + 1525 0.90623451 + 1520 0.90610245 + 1515 0.90569759 + 1510 0.90543377 + 1505 0.90536557 + 1500 0.90549263 + 1495 0.90502916 + 1490 0.90469771 + 1485 0.90473703 + 1480 0.90452695 + 1475 0.90431023 + 1470 0.90410564 + 1465 0.9038276 + 1460 0.90361064 + 1455 0.90355886 + 1450 0.90345491 + 1445 0.90311548 + 1440 0.90263883 + 1435 0.90258198 + 1430 0.90235457 + 1425 0.90201579 + 1420 0.90171743 + 1415 0.90138778 + 1410 0.90101618 + 1405 0.90085296 + 1400 0.90106065 + 1395 0.90165344 + 1390 0.90109954 + 1385 0.90132657 + 1380 0.90075414 + 1375 0.90124817 + 1370 0.90109992 + 1365 0.9010815 + 1360 0.90104513 + 1355 0.90092601 + 1350 0.90055833 + 1345 0.90027859 + 1340 0.90024332 + 1335 0.90027956 + 1330 0.90031734 + 1325 0.90030214 + 1320 0.90016722 + 1315 0.89980884 + 1310 0.89960111 + 1305 0.89954366 + 1300 0.89946796 + 1295 0.89931536 + 1290 0.89927931 + 1285 0.89930968 + 1280 0.89900644 + 1275 0.89883202 + 1270 0.89876453 + 1265 0.89872815 + 1260 0.89860347 + 1255 0.89863179 + 1250 0.8986516 + 1245 0.89852823 + 1240 0.89842788 + 1235 0.89817735 + 1230 0.89798571 + 1225 0.89798522 + 1220 0.89788226 + 1215 0.89792923 + 1210 0.89809277 + 1205 0.89804655 + 1200 0.89779499 + 1195 0.89754242 + 1190 0.89741743 + 1185 0.89736106 + 1180 0.89751424 + 1175 0.89750827 + 1170 0.89747313 + 1165 0.89745695 + 1160 0.89739539 + 1155 0.89732145 + 1150 0.89712852 + 1145 0.89702223 + 1140 0.8970326 + 1135 0.89714342 + 1130 0.8972405 + 1125 0.8972781 + 1120 0.89731735 + 1115 0.89695375 + 1110 0.89689364 + 1105 0.89698249 + 1100 0.89716891 + 1095 0.89720214 + 1090 0.89694808 + 1085 0.89695913 + 1080 0.89700542 + 1075 0.896983 + 1070 0.89712931 + 1065 0.89714316 + 1060 0.89716455 + 1055 0.89711524 + 1050 0.89711961 + 1045 0.89705735 + 1040 0.8970532 + 1035 0.89710952 + 1030 0.89732189 + 1025 0.8973396 + 1020 0.89731879 + 1015 0.89739278 + 1010 0.89731657 + 1005 0.89748466 + 1000 0.89761623 + 995 0.89758489 + 990 0.89745015 + 985 0.89757081 + 980 0.89790412 + 975 0.89815999 + 970 0.89837603 + 965 0.89829223 + 960 0.89819324 + 955 0.89832484 + 950 0.89849503 + 945 0.89854436 + 940 0.89859939 + 935 0.89881671 + 930 0.89909223 + 925 0.89914877 + 920 0.89922447 + 915 0.89946201 + 910 0.89964524 + 905 0.89978341 + 900 0.90010334 + 895 0.90025011 + 890 0.90029424 + 885 0.90056715 + 880 0.90057067 + 875 0.90081442 + 870 0.90128315 + 865 0.90143817 + 860 0.90160826 + 855 0.90073938 + 850 0.89999865 + 845 0.90028823 + 840 0.90065582 + 835 0.90095444 + 830 0.90106997 + 825 0.90121684 + 820 0.90128317 + 815 0.90165328 + 810 0.90199997 + 805 0.90228702 + 800 0.90278946 + 795 0.90286248 + 790 0.90299866 + 785 0.90344318 + 780 0.90366215 + 775 0.90403948 + 770 0.9046538 + 765 0.90490871 + 760 0.90501351 + 755 0.90542482 + 750 0.90592167 + 745 0.90638396 + 740 0.90658409 + 735 0.90684309 + 730 0.907468 + 725 0.90782136 + 720 0.90769472 + 715 0.90796917 + 710 0.90846888 + 705 0.90876088 + 700 0.90874853 + 695 0.90874573 + 690 0.9091021 + 685 0.90874939 + 680 0.90815964 + 675 0.90786507 + 670 0.90767197 + 665 0.90721529 + 660 0.90666531 + 655 0.90613432 + 650 0.904817 + 645 0.90260527 + 640 0.89857382 + 635 0.89167716 + 630 0.87886574 + 625 0.85439907 + 620 0.81023197 + 615 0.73522987 + 610 0.61881525 + 605 0.46538858 + 600 0.30025114 + 595 0.16161293 + 590 0.07201021 + 585 0.02696986 + 580 0.00892592 + 575 0.00278777 + 570 0.00091109 + 565 0.00033555 + 560 0.00015788 + 555 0.00007994 + 550 0.00002905 + 545 0.000028 + 540 0.00002697 + 535 0.00001037 + 530 -0.00001555 + 525 -0.00001867 + 520 -0.00000726 + 515 0 + 510 -0.00002076 + 505 -0.00002075 + 500 -0.00000519 + 495 -0.00002282 + 490 -0.00001969 + 485 -0.0000145 + 480 -0.00000414 + 475 -0.00000725 + 470 -0.00001657 + 465 -0.0000259 + 460 -0.00001866 + 455 -0.00000518 + 450 0.00000518 + 445 -0.00000519 + 440 -0.00002282 + 435 -0.00001453 + 430 -0.00002076 + 425 -0.00002077 + 420 -0.00002493 + 415 -0.00001247 + 410 0.00000935 + 405 0.00000416 + 400 -0.00000416 + 395 -0.00001248 + 390 -0.0000104 + 385 -0.00000937 + 380 -0.00000937 + 375 -0.00000729 + 370 -0.00000521 + 365 -0.00002291 + 360 -0.00002603 + 355 0.0000052 + 350 -0.0000104 + 345 0.00000833 + 340 0.0000052 + 335 0.00001559 + 330 0.00000935 + 325 -0.0000083 + 320 0.00000104 + 315 -0.00001039 + 310 -0.00002599 + 305 -0.00001661 + 300 -0.00001763 + 295 -0.00004243 + 290 -0.00003202 + 285 -0.00002888 + 280 -0.00002781 + 275 -0.00000822 + 270 -0.00000615 + 265 -0.00001633 + 260 -0.00001424 + 255 -0.00002329 + 250 -0.00002216 + 245 -0.00002999 + 240 -0.00001976 + 235 -0.00002046 + 230 -0.00001543 + 225 -0.00000958 + 220 -0.00002192 + 215 -0.00001328 + 210 -0.00000852 + 205 0.00000567 + 200 -0.00000846 \ No newline at end of file diff --git a/spectractor/simulation/AuxTelThroughput/quadnotch1.txt b/spectractor/simulation/AuxTelThroughput/quadnotch1.txt new file mode 100644 index 000000000..190b2c954 --- /dev/null +++ b/spectractor/simulation/AuxTelThroughput/quadnotch1.txt @@ -0,0 +1,3801 @@ +340 0.011873 +340.2 0.01189 +340.4 0.011944 +340.6 0.012047 +340.8 0.012174 +341 0.012286 +341.2 0.012348 +341.4 0.01237 +341.6 0.012384 +341.8 0.012434 +342 0.012513 +342.2 0.012602 +342.4 0.012642 +342.6 0.01267 +342.8 0.012661 +343 0.012683 +343.2 0.012678 +343.4 0.012718 +343.6 0.012801 +343.8 0.012854 +344 0.012939 +344.2 0.013019 +344.4 0.013127 +344.6 0.013119 +344.8 0.013221 +345 0.013249 +345.2 0.013308 +345.4 0.013257 +345.6 0.013268 +345.8 0.013396 +346 0.013652 +346.2 0.014012 +346.4 0.014566 +346.6 0.017712 +346.8 0.067192 +347 0.21008 +347.2 0.42289 +347.4 0.62388 +347.6 0.72278 +347.8 0.75988 +348 0.77947 +348.2 0.79175 +348.4 0.79963 +348.6 0.80475 +348.8 0.80839 +349 0.81396 +349.2 0.81982 +349.4 0.82746 +349.6 0.83423 +349.8 0.84004 +350 0.84402 +350.2 0.84651 +350.4 0.84898 +350.6 0.85147 +350.8 0.85395 +351 0.85534 +351.2 0.85591 +351.4 0.85715 +351.6 0.85819 +351.8 0.85998 +352 0.86231 +352.2 0.86463 +352.4 0.86753 +352.6 0.86929 +352.8 0.87112 +353 0.87306 +353.2 0.87406 +353.4 0.8755 +353.6 0.87843 +353.8 0.88076 +354 0.88217 +354.2 0.88218 +354.4 0.88184 +354.6 0.88256 +354.8 0.88416 +355 0.88697 +355.2 0.8904 +355.4 0.89239 +355.6 0.89298 +355.8 0.89316 +356 0.89265 +356.2 0.89308 +356.4 0.89482 +356.6 0.89664 +356.8 0.89754 +357 0.89834 +357.2 0.89837 +357.4 0.89824 +357.6 0.89908 +357.8 0.89996 +358 0.89991 +358.2 0.89975 +358.4 0.90215 +358.6 0.90431 +358.8 0.90582 +359 0.90689 +359.2 0.90816 +359.4 0.90818 +359.6 0.9072 +359.8 0.90572 +360 0.90393 +360.2 0.90327 +360.4 0.90395 +360.6 0.90545 +360.8 0.90649 +361 0.90809 +361.2 0.90985 +361.4 0.91156 +361.6 0.91254 +361.8 0.91165 +362 0.91042 +362.2 0.90847 +362.4 0.90782 +362.6 0.90833 +362.8 0.90853 +363 0.90929 +363.2 0.91044 +363.4 0.91217 +363.6 0.91276 +363.8 0.91325 +364 0.91415 +364.2 0.91613 +364.4 0.91613 +364.6 0.91517 +364.8 0.91441 +365 0.91566 +365.2 0.91787 +365.4 0.91874 +365.6 0.9198 +365.8 0.9201 +366 0.92005 +366.2 0.91817 +366.4 0.91756 +366.6 0.91723 +366.8 0.91747 +367 0.91698 +367.2 0.91815 +367.4 0.91998 +367.6 0.92172 +367.8 0.92147 +368 0.92068 +368.2 0.9204 +368.4 0.92093 +368.6 0.92005 +368.8 0.91933 +369 0.91936 +369.2 0.91993 +369.4 0.91991 +369.6 0.91957 +369.8 0.92044 +370 0.92183 +370.2 0.92174 +370.4 0.92056 +370.6 0.92049 +370.8 0.92158 +371 0.9229 +371.2 0.92304 +371.4 0.92252 +371.6 0.9216 +371.8 0.92058 +372 0.91948 +372.2 0.91966 +372.4 0.92081 +372.6 0.92171 +372.8 0.9206 +373 0.9182 +373.2 0.91794 +373.4 0.92055 +373.6 0.92364 +373.8 0.92583 +374 0.92693 +374.2 0.92891 +374.4 0.92988 +374.6 0.9284 +374.8 0.92565 +375 0.92462 +375.2 0.92539 +375.4 0.92773 +375.6 0.92871 +375.8 0.92939 +376 0.9308 +376.2 0.93257 +376.4 0.93327 +376.6 0.93162 +376.8 0.93044 +377 0.93089 +377.2 0.93277 +377.4 0.93344 +377.6 0.93296 +377.8 0.93237 +378 0.93349 +378.2 0.93463 +378.4 0.93504 +378.6 0.93526 +378.8 0.93601 +379 0.93706 +379.2 0.93716 +379.4 0.93597 +379.6 0.93526 +379.8 0.93635 +380 0.93756 +380.2 0.93738 +380.4 0.93635 +380.6 0.9365 +380.8 0.93854 +381 0.93989 +381.2 0.93915 +381.4 0.93799 +381.6 0.93759 +381.8 0.93945 +382 0.94133 +382.2 0.9422 +382.4 0.94167 +382.6 0.94175 +382.8 0.94056 +383 0.93795 +383.2 0.93505 +383.4 0.93407 +383.6 0.93648 +383.8 0.94029 +384 0.94324 +384.2 0.94463 +384.4 0.94576 +384.6 0.94641 +384.8 0.94582 +385 0.94262 +385.2 0.9392 +385.4 0.93874 +385.6 0.94152 +385.8 0.94452 +386 0.94445 +386.2 0.94256 +386.4 0.94213 +386.6 0.94439 +386.8 0.94743 +387 0.94794 +387.2 0.94776 +387.4 0.94823 +387.6 0.95001 +387.8 0.95121 +388 0.95109 +388.2 0.94991 +388.4 0.94893 +388.6 0.94671 +388.8 0.94257 +389 0.93881 +389.2 0.93847 +389.4 0.94241 +389.6 0.94801 +389.8 0.95201 +390 0.95306 +390.2 0.95246 +390.4 0.94872 +390.6 0.94259 +390.8 0.93567 +391 0.93165 +391.2 0.93247 +391.4 0.93614 +391.6 0.93914 +391.8 0.94169 +392 0.94392 +392.2 0.94521 +392.4 0.94615 +392.6 0.94564 +392.8 0.94163 +393 0.935 +393.2 0.92919 +393.4 0.92525 +393.6 0.92066 +393.8 0.91476 +394 0.91024 +394.2 0.91218 +394.4 0.89569 +394.6 0.78076 +394.8 0.56079 +395 0.29574 +395.2 0.084962 +395.4 0.012411 +395.6 0.0026238 +395.8 0.00038734 +396 4.6279e-05 +396.2 3.0708e-05 +396.4 9.4133e-06 +396.6 7.313e-06 +396.8 4.1997e-06 +397 2.8432e-06 +397.2 1.1098e-06 +397.4 4.889e-07 +397.6 4.8261e-07 +397.8 6.3836e-07 +398 7.23e-07 +398.2 6.6561e-07 +398.4 5.0949e-07 +398.6 3.5634e-07 +398.8 3.1864e-07 +399 3.3574e-07 +399.2 3.2923e-07 +399.4 2.8883e-07 +399.6 2.3169e-07 +399.8 2.1902e-07 +400 2.1612e-07 +400.2 2.2364e-07 +400.4 2.6033e-07 +400.6 3.1482e-07 +400.8 3.7627e-07 +401 4.0407e-07 +401.2 3.7373e-07 +401.4 3.2151e-07 +401.6 2.5986e-07 +401.8 2.1735e-07 +402 1.991e-07 +402.2 1.9649e-07 +402.4 1.9478e-07 +402.6 1.9289e-07 +402.8 1.9121e-07 +403 1.8961e-07 +403.2 1.8826e-07 +403.4 1.861e-07 +403.6 1.9301e-07 +403.8 2.2736e-07 +404 2.9201e-07 +404.2 3.35e-07 +404.4 3.2911e-07 +404.6 2.7164e-07 +404.8 1.892e-07 +405 1.7291e-07 +405.2 1.7166e-07 +405.4 1.6968e-07 +405.6 1.7188e-07 +405.8 1.9516e-07 +406 2.7531e-07 +406.2 3.6642e-07 +406.4 4.1579e-07 +406.6 3.9241e-07 +406.8 3.3291e-07 +407 3.2978e-07 +407.2 3.54e-07 +407.4 3.6396e-07 +407.6 2.629e-07 +407.8 1.8294e-07 +408 1.5574e-07 +408.2 1.5369e-07 +408.4 1.5284e-07 +408.6 1.5169e-07 +408.8 1.5035e-07 +409 1.4931e-07 +409.2 1.4963e-07 +409.4 1.8622e-07 +409.6 2.345e-07 +409.8 2.6625e-07 +410 2.7331e-07 +410.2 2.1935e-07 +410.4 1.9128e-07 +410.6 2.5323e-07 +410.8 4.2789e-07 +411 5.5121e-07 +411.2 5.8138e-07 +411.4 4.8457e-07 +411.6 3.1819e-07 +411.8 4.0954e-07 +412 9.611e-07 +412.2 1.6982e-06 +412.4 2.679e-06 +412.6 2.6852e-06 +412.8 6.8457e-06 +413 3.7527e-06 +413.2 0.00015802 +413.4 0.00041332 +413.6 0.00099688 +413.8 0.0015782 +414 0.023207 +414.2 0.11293 +414.4 0.27769 +414.6 0.49446 +414.8 0.70192 +415 0.82847 +415.2 0.89236 +415.4 0.92767 +415.6 0.94745 +415.8 0.95413 +416 0.9545 +416.2 0.95323 +416.4 0.95065 +416.6 0.94927 +416.8 0.9499 +417 0.95226 +417.2 0.95563 +417.4 0.95756 +417.6 0.95774 +417.8 0.95749 +418 0.9557 +418.2 0.95042 +418.4 0.94159 +418.6 0.93406 +418.8 0.93295 +419 0.93915 +419.2 0.94707 +419.4 0.95262 +419.6 0.95518 +419.8 0.95692 +420 0.95916 +420.2 0.96027 +420.4 0.95854 +420.6 0.95393 +420.8 0.95009 +421 0.94867 +421.2 0.94956 +421.4 0.94934 +421.6 0.94619 +421.8 0.94143 +422 0.93836 +422.2 0.94047 +422.4 0.94668 +422.6 0.95418 +422.8 0.95904 +423 0.96009 +423.2 0.95918 +423.4 0.95823 +423.6 0.95831 +423.8 0.95856 +424 0.9582 +424.2 0.95713 +424.4 0.95635 +424.6 0.95697 +424.8 0.95922 +425 0.96132 +425.2 0.96113 +425.4 0.95806 +425.6 0.95232 +425.8 0.94553 +426 0.93999 +426.2 0.93629 +426.4 0.93473 +426.6 0.93544 +426.8 0.93826 +427 0.94245 +427.2 0.94823 +427.4 0.9544 +427.6 0.95929 +427.8 0.96258 +428 0.96345 +428.2 0.96242 +428.4 0.96059 +428.6 0.95779 +428.8 0.95497 +429 0.95199 +429.2 0.94958 +429.4 0.94894 +429.6 0.94991 +429.8 0.95241 +430 0.95508 +430.2 0.95686 +430.4 0.95746 +430.6 0.95745 +430.8 0.9578 +431 0.95889 +431.2 0.96067 +431.4 0.96207 +431.6 0.96212 +431.8 0.96113 +432 0.95946 +432.2 0.95821 +432.4 0.95787 +432.6 0.95755 +432.8 0.95604 +433 0.95259 +433.2 0.94732 +433.4 0.94192 +433.6 0.93866 +433.8 0.93887 +434 0.94283 +434.2 0.94855 +434.4 0.95319 +434.6 0.95522 +434.8 0.95382 +435 0.95047 +435.2 0.94807 +435.4 0.94785 +435.6 0.95069 +435.8 0.955 +436 0.95837 +436.2 0.95939 +436.4 0.95768 +436.6 0.95504 +436.8 0.95315 +437 0.95302 +437.2 0.95446 +437.4 0.95596 +437.6 0.95631 +437.8 0.95483 +438 0.95233 +438.2 0.9501 +438.4 0.94957 +438.6 0.95099 +438.8 0.95364 +439 0.95592 +439.2 0.95629 +439.4 0.9552 +439.6 0.95296 +439.8 0.95132 +440 0.95152 +440.2 0.95349 +440.4 0.95634 +440.6 0.95879 +440.8 0.95955 +441 0.95835 +441.2 0.95621 +441.4 0.95466 +441.6 0.95418 +441.8 0.95511 +442 0.95639 +442.2 0.95659 +442.4 0.9557 +442.6 0.9537 +442.8 0.95144 +443 0.95074 +443.2 0.95167 +443.4 0.95423 +443.6 0.95729 +443.8 0.95917 +444 0.95958 +444.2 0.95834 +444.4 0.95666 +444.6 0.95552 +444.8 0.95545 +445 0.95684 +445.2 0.95864 +445.4 0.96 +445.6 0.96055 +445.8 0.9602 +446 0.95956 +446.2 0.95929 +446.4 0.9597 +446.6 0.95998 +446.8 0.95926 +447 0.95764 +447.2 0.95494 +447.4 0.95231 +447.6 0.95075 +447.8 0.95078 +448 0.95232 +448.2 0.95489 +448.4 0.95735 +448.6 0.95867 +448.8 0.95881 +449 0.95798 +449.2 0.9575 +449.4 0.95812 +449.6 0.95985 +449.8 0.96236 +450 0.96415 +450.2 0.96434 +450.4 0.96251 +450.6 0.95924 +450.8 0.95595 +451 0.95405 +451.2 0.95426 +451.4 0.95594 +451.6 0.95819 +451.8 0.95972 +452 0.95982 +452.2 0.95871 +452.4 0.95747 +452.6 0.95714 +452.8 0.95841 +453 0.96116 +453.2 0.9637 +453.4 0.96473 +453.6 0.96311 +453.8 0.95865 +454 0.95318 +454.2 0.94853 +454.4 0.94655 +454.6 0.9479 +454.8 0.95208 +455 0.95725 +455.2 0.96133 +455.4 0.96303 +455.6 0.96229 +455.8 0.96026 +456 0.95861 +456.2 0.95876 +456.4 0.96075 +456.6 0.96378 +456.8 0.9662 +457 0.9664 +457.2 0.96429 +457.4 0.96053 +457.6 0.95643 +457.8 0.95431 +458 0.95466 +458.2 0.95707 +458.4 0.96044 +458.6 0.9624 +458.8 0.96182 +459 0.95854 +459.2 0.95374 +459.4 0.94966 +459.6 0.94813 +459.8 0.94989 +460 0.95451 +460.2 0.96024 +460.4 0.96501 +460.6 0.9674 +460.8 0.96675 +461 0.96396 +461.2 0.96088 +461.4 0.95914 +461.6 0.95964 +461.8 0.96194 +462 0.96475 +462.2 0.96654 +462.4 0.96633 +462.6 0.96428 +462.8 0.96125 +463 0.95884 +463.2 0.95824 +463.4 0.95985 +463.6 0.96303 +463.8 0.96629 +464 0.96804 +464.2 0.96747 +464.4 0.96504 +464.6 0.96148 +464.8 0.95856 +465 0.95765 +465.2 0.95898 +465.4 0.96201 +465.6 0.96568 +465.8 0.96848 +466 0.96944 +466.2 0.96899 +466.4 0.96779 +466.6 0.96673 +466.8 0.96684 +467 0.96757 +467.2 0.96802 +467.4 0.96758 +467.6 0.96603 +467.8 0.96381 +468 0.96278 +468.2 0.96326 +468.4 0.96533 +468.6 0.96838 +468.8 0.97103 +469 0.97241 +469.2 0.97232 +469.4 0.97094 +469.6 0.96945 +469.8 0.96914 +470 0.96982 +470.2 0.97139 +470.4 0.97293 +470.6 0.9728 +470.8 0.97091 +471 0.96779 +471.2 0.96433 +471.4 0.96209 +471.6 0.96185 +471.8 0.96367 +472 0.96674 +472.2 0.96937 +472.4 0.97046 +472.6 0.96931 +472.8 0.96671 +473 0.96408 +473.2 0.96285 +473.4 0.96376 +473.6 0.96666 +473.8 0.97011 +474 0.97247 +474.2 0.97298 +474.4 0.97164 +474.6 0.9697 +474.8 0.9686 +475 0.96878 +475.2 0.96971 +475.4 0.96977 +475.6 0.96753 +475.8 0.96317 +476 0.95814 +476.2 0.95487 +476.4 0.95518 +476.6 0.95893 +476.8 0.96349 +477 0.96527 +477.2 0.96194 +477.4 0.95449 +477.6 0.94685 +477.8 0.94383 +478 0.947 +478.2 0.95329 +478.4 0.95726 +478.6 0.956 +478.8 0.95139 +479 0.94829 +479.2 0.93612 +479.4 0.89145 +479.6 0.78946 +479.8 0.62144 +480 0.41753 +480.2 0.22952 +480.4 0.096003 +480.6 0.031909 +480.8 0.010712 +481 0.0038352 +481.2 0.0011597 +481.4 0.00030642 +481.6 0.00015175 +481.8 7.5662e-05 +482 4.2905e-05 +482.2 2.3984e-05 +482.4 1.2076e-05 +482.6 5.3514e-06 +482.8 3.4928e-06 +483 2.338e-06 +483.2 1.6836e-06 +483.4 1.2896e-06 +483.6 1.0234e-06 +483.8 8.2148e-07 +484 6.4084e-07 +484.2 5.1167e-07 +484.4 4.4235e-07 +484.6 3.9893e-07 +484.8 4.0732e-07 +485 4.016e-07 +485.2 3.3022e-07 +485.4 2.7379e-07 +485.6 2.1481e-07 +485.8 1.7567e-07 +486 2.0086e-07 +486.2 2.5636e-07 +486.4 2.7974e-07 +486.6 2.6914e-07 +486.8 2.5841e-07 +487 2.057e-07 +487.2 1.701e-07 +487.4 1.8409e-07 +487.6 1.8738e-07 +487.8 1.8369e-07 +488 2.0693e-07 +488.2 2.1331e-07 +488.4 2.2663e-07 +488.6 2.7976e-07 +488.8 2.9302e-07 +489 2.4452e-07 +489.2 2.5288e-07 +489.4 2.8997e-07 +489.6 2.8831e-07 +489.8 2.9219e-07 +490 3.4832e-07 +490.2 4.0933e-07 +490.4 4.7787e-07 +490.6 6.2903e-07 +490.8 8.674e-07 +491 1.0052e-06 +491.2 1.1411e-06 +491.4 1.5704e-06 +491.6 2.1547e-06 +491.8 3.1115e-06 +492 4.8035e-06 +492.2 7.9004e-06 +492.4 1.3232e-05 +492.6 2.2151e-05 +492.8 3.907e-05 +493 7.6363e-05 +493.2 0.00015602 +493.4 0.00042761 +493.6 0.001219 +493.8 0.0033558 +494 0.010117 +494.2 0.034896 +494.4 0.10334 +494.6 0.22084 +494.8 0.3615 +495 0.51768 +495.2 0.65992 +495.4 0.75352 +495.6 0.8239 +495.8 0.89053 +496 0.93165 +496.2 0.94985 +496.4 0.95397 +496.6 0.95648 +496.8 0.96112 +497 0.96593 +497.2 0.96891 +497.4 0.96988 +497.6 0.97033 +497.8 0.97123 +498 0.97216 +498.2 0.97212 +498.4 0.97029 +498.6 0.96698 +498.8 0.96384 +499 0.96272 +499.2 0.96368 +499.4 0.96621 +499.6 0.96876 +499.8 0.96955 +500 0.96821 +500.2 0.96582 +500.4 0.96371 +500.6 0.96311 +500.8 0.96416 +501 0.96653 +501.2 0.96928 +501.4 0.97114 +501.6 0.97157 +501.8 0.97069 +502 0.96926 +502.2 0.96798 +502.4 0.96757 +502.6 0.9683 +502.8 0.96949 +503 0.97039 +503.2 0.97009 +503.4 0.96809 +503.6 0.96442 +503.8 0.95989 +504 0.95574 +504.2 0.95321 +504.4 0.95269 +504.6 0.95433 +504.8 0.9575 +505 0.9611 +505.2 0.96407 +505.4 0.96583 +505.6 0.96628 +505.8 0.966 +506 0.96548 +506.2 0.96529 +506.4 0.96588 +506.6 0.96682 +506.8 0.96769 +507 0.96795 +507.2 0.96705 +507.4 0.96492 +507.6 0.9618 +507.8 0.95849 +508 0.9559 +508.2 0.95455 +508.4 0.95473 +508.6 0.95626 +508.8 0.95846 +509 0.96049 +509.2 0.96156 +509.4 0.9613 +509.6 0.95986 +509.8 0.95774 +510 0.95582 +510.2 0.95485 +510.4 0.95524 +510.6 0.95709 +510.8 0.96 +511 0.96307 +511.2 0.96569 +511.4 0.96714 +511.6 0.96723 +511.8 0.96635 +512 0.96511 +512.2 0.96417 +512.4 0.96378 +512.6 0.96411 +512.8 0.96481 +513 0.9652 +513.2 0.96498 +513.4 0.96372 +513.6 0.96153 +513.8 0.95917 +514 0.95715 +514.2 0.95619 +514.4 0.95673 +514.6 0.95858 +514.8 0.96122 +515 0.96392 +515.2 0.9658 +515.4 0.96644 +515.6 0.96579 +515.8 0.96428 +516 0.96261 +516.2 0.96151 +516.4 0.9614 +516.6 0.96219 +516.8 0.96323 +517 0.9639 +517.2 0.96372 +517.4 0.96266 +517.6 0.96096 +517.8 0.95955 +518 0.95919 +518.2 0.95979 +518.4 0.96113 +518.6 0.96247 +518.8 0.96234 +519 0.96038 +519.2 0.95671 +519.4 0.95226 +519.6 0.94892 +519.8 0.94775 +520 0.94915 +520.2 0.95238 +520.4 0.95541 +520.6 0.95714 +520.8 0.95742 +521 0.95651 +521.2 0.95533 +521.4 0.95165 +521.6 0.93771 +521.8 0.90154 +522 0.83132 +522.2 0.713 +522.4 0.55653 +522.6 0.38865 +522.8 0.23194 +523 0.11224 +523.2 0.046416 +523.4 0.01811 +523.6 0.0074385 +523.8 0.0030674 +524 0.0011907 +524.2 0.00050988 +524.4 0.00026982 +524.6 0.00014403 +524.8 8.2471e-05 +525 4.9407e-05 +525.2 2.992e-05 +525.4 1.8113e-05 +525.6 1.1571e-05 +525.8 7.5772e-06 +526 5.1103e-06 +526.2 3.5394e-06 +526.4 2.4953e-06 +526.6 1.8291e-06 +526.8 1.4132e-06 +527 1.1201e-06 +527.2 8.8875e-07 +527.4 7.1662e-07 +527.6 5.8794e-07 +527.8 4.9528e-07 +528 4.386e-07 +528.2 4.0452e-07 +528.4 3.756e-07 +528.6 3.5049e-07 +528.8 3.275e-07 +529 3.0723e-07 +529.2 2.9588e-07 +529.4 2.9478e-07 +529.6 2.9185e-07 +529.8 2.7862e-07 +530 2.6616e-07 +530.2 2.4727e-07 +530.4 2.1993e-07 +530.6 2.0776e-07 +530.8 2.1216e-07 +531 2.0964e-07 +531.2 2.0205e-07 +531.4 2.0387e-07 +531.6 2.206e-07 +531.8 2.3635e-07 +532 2.4572e-07 +532.2 2.4922e-07 +532.4 2.439e-07 +532.6 2.3618e-07 +532.8 2.4439e-07 +533 2.669e-07 +533.2 2.8389e-07 +533.4 2.8629e-07 +533.6 2.78e-07 +533.8 2.6276e-07 +534 2.4788e-07 +534.2 2.3555e-07 +534.4 2.3814e-07 +534.6 2.6653e-07 +534.8 3.1132e-07 +535 3.6718e-07 +535.2 4.4099e-07 +535.4 5.304e-07 +535.6 6.3322e-07 +535.8 7.5701e-07 +536 9.1336e-07 +536.2 1.1183e-06 +536.4 1.3965e-06 +536.6 1.7834e-06 +536.8 2.3583e-06 +537 3.2525e-06 +537.2 4.628e-06 +537.4 6.775e-06 +537.6 1.0222e-05 +537.8 1.5858e-05 +538 2.4786e-05 +538.2 4.0871e-05 +538.4 6.7574e-05 +538.6 0.00013035 +538.8 0.0002731 +539 0.00051962 +539.2 0.0010197 +539.4 0.0019965 +539.6 0.0048039 +539.8 0.011056 +540 0.040909 +540.2 0.12707 +540.4 0.25855 +540.6 0.40647 +540.8 0.56754 +541 0.70438 +541.2 0.77425 +541.4 0.80959 +541.6 0.85013 +541.8 0.89425 +542 0.92875 +542.2 0.94753 +542.4 0.95394 +542.6 0.95591 +542.8 0.95674 +543 0.95688 +543.2 0.95678 +543.4 0.95521 +543.6 0.95199 +543.8 0.94836 +544 0.94575 +544.2 0.94531 +544.4 0.94766 +544.6 0.95169 +544.8 0.9556 +545 0.95812 +545.2 0.95813 +545.4 0.95546 +545.6 0.95142 +545.8 0.94742 +546 0.94466 +546.2 0.94427 +546.4 0.94622 +546.6 0.94946 +546.8 0.95299 +547 0.95558 +547.2 0.95607 +547.4 0.95446 +547.6 0.95126 +547.8 0.94728 +548 0.94386 +548.2 0.94217 +548.4 0.94254 +548.6 0.94507 +548.8 0.94936 +549 0.9541 +549.2 0.95818 +549.4 0.96059 +549.6 0.96059 +549.8 0.95814 +550 0.95396 +550.2 0.9489 +550.4 0.944 +550.6 0.94053 +550.8 0.93908 +551 0.93964 +551.2 0.94233 +551.4 0.94638 +551.6 0.95066 +551.8 0.95473 +552 0.95772 +552.2 0.95899 +552.4 0.9588 +552.6 0.95746 +552.8 0.95531 +553 0.95316 +553.2 0.95146 +553.4 0.95028 +553.6 0.95001 +553.8 0.95042 +554 0.95097 +554.2 0.95165 +554.4 0.95214 +554.6 0.95204 +554.8 0.95172 +555 0.95137 +555.2 0.95096 +555.4 0.951 +555.6 0.95187 +555.8 0.95332 +556 0.95542 +556.2 0.95794 +556.4 0.96021 +556.6 0.96184 +556.8 0.96241 +557 0.96165 +557.2 0.95968 +557.4 0.95688 +557.6 0.95364 +557.8 0.95038 +558 0.94781 +558.2 0.94645 +558.4 0.94629 +558.6 0.94756 +558.8 0.94993 +559 0.95273 +559.2 0.95565 +559.4 0.95804 +559.6 0.95939 +559.8 0.95964 +560 0.95881 +560.2 0.95695 +560.4 0.95464 +560.6 0.95244 +560.8 0.95068 +561 0.94984 +561.2 0.95026 +561.4 0.95173 +561.6 0.954 +561.8 0.9568 +562 0.95946 +562.2 0.96155 +562.4 0.96275 +562.6 0.9628 +562.8 0.96172 +563 0.9598 +563.2 0.95746 +563.4 0.95499 +563.6 0.95303 +563.8 0.95199 +564 0.95169 +564.2 0.95225 +564.4 0.95371 +564.6 0.95546 +564.8 0.95718 +565 0.95882 +565.2 0.95981 +565.4 0.95994 +565.6 0.95953 +565.8 0.95862 +566 0.95728 +566.2 0.95607 +566.4 0.95533 +566.6 0.95502 +566.8 0.95532 +567 0.95636 +567.2 0.95773 +567.4 0.95919 +567.6 0.96061 +567.8 0.96166 +568 0.96197 +568.2 0.96168 +568.4 0.96088 +568.6 0.95952 +568.8 0.95794 +569 0.95655 +569.2 0.95547 +569.4 0.95478 +569.6 0.95482 +569.8 0.95535 +570 0.95627 +570.2 0.95746 +570.4 0.95862 +570.6 0.95938 +570.8 0.95974 +571 0.95972 +571.2 0.95912 +571.4 0.95823 +571.6 0.95752 +571.8 0.95693 +572 0.95665 +572.2 0.95713 +572.4 0.95819 +572.6 0.95961 +572.8 0.96145 +573 0.96338 +573.2 0.96488 +573.4 0.96583 +573.6 0.96613 +573.8 0.96551 +574 0.96392 +574.2 0.96178 +574.4 0.95936 +574.6 0.95678 +574.8 0.95457 +575 0.9532 +575.2 0.9524 +575.4 0.95236 +575.6 0.95325 +575.8 0.95466 +576 0.95613 +576.2 0.95779 +576.4 0.95937 +576.6 0.96032 +576.8 0.96063 +577 0.96063 +577.2 0.96 +577.4 0.95891 +577.6 0.95784 +577.8 0.95693 +578 0.95609 +578.2 0.95573 +578.4 0.9559 +578.6 0.95616 +578.8 0.9565 +579 0.95707 +579.2 0.95737 +579.4 0.95717 +579.6 0.9566 +579.8 0.9557 +580 0.95423 +580.2 0.95256 +580.4 0.95111 +580.6 0.94992 +580.8 0.94912 +581 0.9491 +581.2 0.94981 +581.4 0.95088 +581.6 0.95253 +581.8 0.95464 +582 0.95661 +582.2 0.95845 +582.4 0.96014 +582.6 0.96137 +582.8 0.96197 +583 0.96219 +583.2 0.96218 +583.4 0.96183 +583.6 0.96145 +583.8 0.9615 +584 0.96191 +584.2 0.96239 +584.4 0.96325 +584.6 0.96438 +584.8 0.96517 +585 0.96565 +585.2 0.96575 +585.4 0.9654 +585.6 0.96432 +585.8 0.96273 +586 0.96091 +586.2 0.95906 +586.4 0.95724 +586.6 0.95584 +586.8 0.95519 +587 0.95507 +587.2 0.9556 +587.4 0.957 +587.6 0.95885 +587.8 0.96073 +588 0.96269 +588.2 0.96448 +588.4 0.9655 +588.6 0.96591 +588.8 0.96593 +589 0.96539 +589.2 0.96438 +589.4 0.96338 +589.6 0.96259 +589.8 0.96197 +590 0.96171 +590.2 0.96203 +590.4 0.96278 +590.6 0.96373 +590.8 0.96478 +591 0.96587 +591.2 0.96652 +591.4 0.96663 +591.6 0.9662 +591.8 0.96533 +592 0.9639 +592.2 0.96214 +592.4 0.96058 +592.6 0.95929 +592.8 0.95828 +593 0.95801 +593.2 0.9586 +593.4 0.95978 +593.6 0.96139 +593.8 0.96359 +594 0.96591 +594.2 0.96799 +594.4 0.96961 +594.6 0.9708 +594.8 0.97136 +595 0.97126 +595.2 0.97057 +595.4 0.9697 +595.6 0.96875 +595.8 0.96769 +596 0.96694 +596.2 0.96674 +596.4 0.96694 +596.6 0.9673 +596.8 0.96808 +597 0.96899 +597.2 0.96962 +597.4 0.96986 +597.6 0.96988 +597.8 0.96948 +598 0.96848 +598.2 0.96714 +598.4 0.9657 +598.6 0.96429 +598.8 0.96307 +599 0.96213 +599.2 0.96181 +599.4 0.962 +599.6 0.9626 +599.8 0.9635 +600 0.96474 +600.2 0.96593 +600.4 0.96683 +600.6 0.96747 +600.8 0.96797 +601 0.96811 +601.2 0.96799 +601.4 0.96782 +601.6 0.96783 +601.8 0.96785 +602 0.96801 +602.2 0.96848 +602.4 0.96921 +602.6 0.96994 +602.8 0.97059 +603 0.97124 +603.2 0.97165 +603.4 0.97164 +603.6 0.97127 +603.8 0.97071 +604 0.96995 +604.2 0.96908 +604.4 0.96831 +604.6 0.96788 +604.8 0.96771 +605 0.96783 +605.2 0.96821 +605.4 0.96884 +605.6 0.96939 +605.8 0.96968 +606 0.96965 +606.2 0.96913 +606.4 0.96807 +606.6 0.96649 +606.8 0.96462 +607 0.96262 +607.2 0.96079 +607.4 0.9592 +607.6 0.9581 +607.8 0.95761 +608 0.95797 +608.2 0.95915 +608.4 0.96087 +608.6 0.96312 +608.8 0.96561 +609 0.96796 +609.2 0.96976 +609.4 0.97112 +609.6 0.97185 +609.8 0.9719 +610 0.97144 +610.2 0.97059 +610.4 0.9695 +610.6 0.96837 +610.8 0.96723 +611 0.966 +611.2 0.96476 +611.4 0.96354 +611.6 0.96217 +611.8 0.9606 +612 0.95906 +612.2 0.95775 +612.4 0.95669 +612.6 0.95599 +612.8 0.9558 +613 0.95639 +613.2 0.95752 +613.4 0.95886 +613.6 0.96023 +613.8 0.96156 +614 0.96253 +614.2 0.96282 +614.4 0.96261 +614.6 0.96228 +614.8 0.9619 +615 0.96142 +615.2 0.96096 +615.4 0.96036 +615.6 0.9594 +615.8 0.95802 +616 0.95633 +616.2 0.955 +616.4 0.9548 +616.6 0.95604 +616.8 0.95659 +617 0.94975 +617.2 0.92354 +617.4 0.8646 +617.6 0.76987 +617.8 0.64578 +618 0.49927 +618.2 0.34949 +618.4 0.2213 +618.6 0.13126 +618.8 0.070664 +619 0.034619 +619.2 0.016722 +619.4 0.0082127 +619.6 0.0041024 +619.8 0.0020564 +620 0.00098143 +620.2 0.00050866 +620.4 0.00028784 +620.6 0.00016351 +620.8 9.6556e-05 +621 5.8025e-05 +621.2 3.5203e-05 +621.4 2.1727e-05 +621.6 1.4085e-05 +621.8 9.2317e-06 +622 5.9841e-06 +622.2 3.8653e-06 +622.4 2.4966e-06 +622.6 1.6364e-06 +622.8 1.0904e-06 +623 7.3243e-07 +623.2 5.146e-07 +623.4 3.7718e-07 +623.6 2.5901e-07 +623.8 1.4682e-07 +624 1.0262e-07 +624.2 9.9889e-08 +624.4 1.0009e-07 +624.6 9.9984e-08 +624.8 1e-07 +625 9.9999e-08 +625.2 1e-07 +625.4 1e-07 +625.6 1e-07 +625.8 1e-07 +626 1e-07 +626.2 1e-07 +626.4 1e-07 +626.6 1e-07 +626.8 9.9999e-08 +627 1e-07 +627.2 9.9989e-08 +627.4 1.0018e-07 +627.6 1.0178e-07 +627.8 1.0672e-07 +628 1.1241e-07 +628.2 1.1497e-07 +628.4 1.1641e-07 +628.6 1.1746e-07 +628.8 1.1464e-07 +629 1.0621e-07 +629.2 1.0077e-07 +629.4 1.0583e-07 +629.6 1.1612e-07 +629.8 1.2273e-07 +630 1.2641e-07 +630.2 1.3136e-07 +630.4 1.3898e-07 +630.6 1.344e-07 +630.8 1.2508e-07 +631 1.2156e-07 +631.2 1.2238e-07 +631.4 1.1888e-07 +631.6 1.0782e-07 +631.8 1.0062e-07 +632 9.9901e-08 +632.2 1.0003e-07 +632.4 9.9988e-08 +632.6 1.0012e-07 +632.8 1.0111e-07 +633 1.038e-07 +633.2 1.0722e-07 +633.4 1.0999e-07 +633.6 1.1228e-07 +633.8 1.134e-07 +634 1.1403e-07 +634.2 1.1799e-07 +634.4 1.2802e-07 +634.6 1.3481e-07 +634.8 1.3666e-07 +635 1.4041e-07 +635.2 1.3895e-07 +635.4 1.2531e-07 +635.6 1.0553e-07 +635.8 9.9953e-08 +636 1.0004e-07 +636.2 9.9989e-08 +636.4 1e-07 +636.6 9.9999e-08 +636.8 1e-07 +637 1e-07 +637.2 9.9999e-08 +637.4 1e-07 +637.6 9.9992e-08 +637.8 1.002e-07 +638 1.0172e-07 +638.2 1.0587e-07 +638.4 1.0999e-07 +638.6 1.117e-07 +638.8 1.1281e-07 +639 1.1355e-07 +639.2 1.1114e-07 +639.4 1.045e-07 +639.6 1.0055e-07 +639.8 1.0221e-07 +640 1.0527e-07 +640.2 1.0722e-07 +640.4 1.0823e-07 +640.6 1.0911e-07 +640.8 1.0918e-07 +641 1.056e-07 +641.2 1.0186e-07 +641.4 1.0013e-07 +641.6 9.9978e-08 +641.8 1.0001e-07 +642 9.9998e-08 +642.2 1e-07 +642.4 1e-07 +642.6 1e-07 +642.8 1e-07 +643 1e-07 +643.2 1e-07 +643.4 1e-07 +643.6 1e-07 +643.8 1e-07 +644 1e-07 +644.2 1e-07 +644.4 1e-07 +644.6 9.9997e-08 +644.8 1.0001e-07 +645 9.9956e-08 +645.2 1.0098e-07 +645.4 1.0446e-07 +645.6 1.1074e-07 +645.8 1.1877e-07 +646 1.2844e-07 +646.2 1.3762e-07 +646.4 1.4367e-07 +646.6 1.5292e-07 +646.8 1.7408e-07 +647 2.0929e-07 +647.2 2.584e-07 +647.4 3.3176e-07 +647.6 4.4012e-07 +647.8 5.8347e-07 +648 7.6994e-07 +648.2 1.0329e-06 +648.4 1.4337e-06 +648.6 2.0473e-06 +648.8 2.9756e-06 +649 4.3892e-06 +649.2 6.5782e-06 +649.4 9.966e-06 +649.6 1.5292e-05 +649.8 2.3769e-05 +650 3.7873e-05 +650.2 6.2361e-05 +650.4 0.0001029 +650.6 0.00017193 +650.8 0.00029234 +651 0.00051521 +651.2 0.00094117 +651.4 0.0019547 +651.6 0.0043254 +651.8 0.0098644 +652 0.023646 +652.2 0.058553 +652.4 0.13245 +652.6 0.24546 +652.8 0.37825 +653 0.51877 +653.2 0.65985 +653.4 0.77971 +653.6 0.85018 +653.8 0.87868 +654 0.89829 +654.2 0.92039 +654.4 0.94123 +654.6 0.95636 +654.8 0.96472 +655 0.96799 +655.2 0.96867 +655.4 0.96873 +655.6 0.9693 +655.8 0.97035 +656 0.97136 +656.2 0.97187 +656.4 0.97172 +656.6 0.97108 +656.8 0.97016 +657 0.96938 +657.2 0.96907 +657.4 0.96925 +657.6 0.96979 +657.8 0.97045 +658 0.97097 +658.2 0.97108 +658.4 0.97057 +658.6 0.96955 +658.8 0.96811 +659 0.96657 +659.2 0.96527 +659.4 0.96437 +659.6 0.96389 +659.8 0.96392 +660 0.96452 +660.2 0.96539 +660.4 0.96615 +660.6 0.96655 +660.8 0.96654 +661 0.96596 +661.2 0.96479 +661.4 0.96307 +661.6 0.96102 +661.8 0.95888 +662 0.95692 +662.2 0.95551 +662.4 0.9548 +662.6 0.95486 +662.8 0.95572 +663 0.95726 +663.2 0.95952 +663.4 0.96209 +663.6 0.96455 +663.8 0.96674 +664 0.96847 +664.2 0.96972 +664.4 0.9702 +664.6 0.96992 +664.8 0.96912 +665 0.96788 +665.2 0.96638 +665.4 0.96496 +665.6 0.96371 +665.8 0.96275 +666 0.96221 +666.2 0.96223 +666.4 0.96275 +666.6 0.96349 +666.8 0.96438 +667 0.96536 +667.2 0.96635 +667.4 0.96713 +667.6 0.96747 +667.8 0.96734 +668 0.96697 +668.2 0.96629 +668.4 0.96548 +668.6 0.96454 +668.8 0.9636 +669 0.96282 +669.2 0.96233 +669.4 0.96218 +669.6 0.96221 +669.8 0.96245 +670 0.96283 +670.2 0.96346 +670.4 0.96404 +670.6 0.96445 +670.8 0.9646 +671 0.96458 +671.2 0.96431 +671.4 0.96368 +671.6 0.96286 +671.8 0.96194 +672 0.96127 +672.2 0.96076 +672.4 0.96076 +672.6 0.96113 +672.8 0.96201 +673 0.96324 +673.2 0.96473 +673.4 0.96641 +673.6 0.96807 +673.8 0.96965 +674 0.97089 +674.2 0.9717 +674.4 0.97194 +674.6 0.97168 +674.8 0.97086 +675 0.9695 +675.2 0.96778 +675.4 0.96574 +675.6 0.96359 +675.8 0.96147 +676 0.95951 +676.2 0.95784 +676.4 0.95661 +676.6 0.95607 +676.8 0.95603 +677 0.95647 +677.2 0.95738 +677.4 0.95875 +677.6 0.96032 +677.8 0.96191 +678 0.96343 +678.2 0.96476 +678.4 0.96575 +678.6 0.96637 +678.8 0.96659 +679 0.96628 +679.2 0.96551 +679.4 0.96439 +679.6 0.96309 +679.8 0.9616 +680 0.96009 +680.2 0.9587 +680.4 0.9577 +680.6 0.95701 +680.8 0.95676 +681 0.95695 +681.2 0.95753 +681.4 0.95847 +681.6 0.95955 +681.8 0.96084 +682 0.96208 +682.2 0.9632 +682.4 0.96425 +682.6 0.96497 +682.8 0.96545 +683 0.96553 +683.2 0.96539 +683.4 0.96499 +683.6 0.96435 +683.8 0.96366 +684 0.9629 +684.2 0.96225 +684.4 0.9616 +684.6 0.96117 +684.8 0.96104 +685 0.96118 +685.2 0.96156 +685.4 0.96219 +685.6 0.96295 +685.8 0.96374 +686 0.96455 +686.2 0.96526 +686.4 0.96591 +686.6 0.96627 +686.8 0.96638 +687 0.96626 +687.2 0.9658 +687.4 0.96503 +687.6 0.96399 +687.8 0.96286 +688 0.96168 +688.2 0.96042 +688.4 0.95934 +688.6 0.95854 +688.8 0.95799 +689 0.95778 +689.2 0.9578 +689.4 0.95826 +689.6 0.95891 +689.8 0.95984 +690 0.96088 +690.2 0.96194 +690.4 0.96308 +690.6 0.96416 +690.8 0.96504 +691 0.96562 +691.2 0.9659 +691.4 0.96588 +691.6 0.96548 +691.8 0.96478 +692 0.96379 +692.2 0.96264 +692.4 0.96141 +692.6 0.96014 +692.8 0.95885 +693 0.95775 +693.2 0.95692 +693.4 0.95628 +693.6 0.95591 +693.8 0.95579 +694 0.95603 +694.2 0.95646 +694.4 0.95701 +694.6 0.95771 +694.8 0.95851 +695 0.95935 +695.2 0.96011 +695.4 0.96087 +695.6 0.96144 +695.8 0.96184 +696 0.96202 +696.2 0.96207 +696.4 0.96202 +696.6 0.96179 +696.8 0.96145 +697 0.96106 +697.2 0.9608 +697.4 0.96062 +697.6 0.96046 +697.8 0.96048 +698 0.96072 +698.2 0.96107 +698.4 0.96147 +698.6 0.96196 +698.8 0.96249 +699 0.96299 +699.2 0.9635 +699.4 0.96385 +699.6 0.96403 +699.8 0.96413 +700 0.96407 +700.2 0.96385 +700.4 0.96336 +700.6 0.96262 +700.8 0.96188 +701 0.96103 +701.2 0.96017 +701.4 0.95936 +701.6 0.9586 +701.8 0.95807 +702 0.95771 +702.2 0.95751 +702.4 0.95736 +702.6 0.95739 +702.8 0.95768 +703 0.95812 +703.2 0.95867 +703.4 0.95922 +703.6 0.9598 +703.8 0.96036 +704 0.96073 +704.2 0.96101 +704.4 0.9611 +704.6 0.961 +704.8 0.96073 +705 0.96031 +705.2 0.95976 +705.4 0.95902 +705.6 0.95822 +705.8 0.95743 +706 0.95679 +706.2 0.9562 +706.4 0.95564 +706.6 0.95531 +706.8 0.95514 +707 0.95509 +707.2 0.95518 +707.4 0.9554 +707.6 0.95587 +707.8 0.95644 +708 0.95698 +708.2 0.95753 +708.4 0.95809 +708.6 0.95864 +708.8 0.959 +709 0.95912 +709.2 0.95922 +709.4 0.95919 +709.6 0.95897 +709.8 0.9587 +710 0.95831 +710.2 0.95794 +710.4 0.9576 +710.6 0.95732 +710.8 0.9572 +711 0.95723 +711.2 0.95737 +711.4 0.95771 +711.6 0.95819 +711.8 0.95885 +712 0.95968 +712.2 0.96055 +712.4 0.96152 +712.6 0.96255 +712.8 0.9634 +713 0.96418 +713.2 0.96475 +713.4 0.9651 +713.6 0.9652 +713.8 0.96504 +714 0.96462 +714.2 0.96389 +714.4 0.96294 +714.6 0.9617 +714.8 0.96043 +715 0.95912 +715.2 0.95783 +715.4 0.95666 +715.6 0.95552 +715.8 0.95461 +716 0.95386 +716.2 0.95332 +716.4 0.95306 +716.6 0.953 +716.8 0.95315 +717 0.95352 +717.2 0.95403 +717.4 0.95475 +717.6 0.95549 +717.8 0.95619 +718 0.95686 +718.2 0.95737 +718.4 0.95769 +718.6 0.95782 +718.8 0.95772 +719 0.95745 +719.2 0.95709 +719.4 0.95658 +719.6 0.95594 +719.8 0.95526 +720 0.95456 +720.2 0.95384 +720.4 0.95313 +720.6 0.95251 +720.8 0.9521 +721 0.95184 +721.2 0.95176 +721.4 0.95192 +721.6 0.9523 +721.8 0.95295 +722 0.95375 +722.2 0.95465 +722.4 0.95565 +722.6 0.95673 +722.8 0.95772 +723 0.95863 +723.2 0.95936 +723.4 0.95998 +723.6 0.96043 +723.8 0.96066 +724 0.96078 +724.2 0.96068 +724.4 0.96042 +724.6 0.96001 +724.8 0.95962 +725 0.95914 +725.2 0.95869 +725.4 0.95837 +725.6 0.95812 +725.8 0.95807 +726 0.95819 +726.2 0.95844 +726.4 0.95889 +726.6 0.95939 +726.8 0.96012 +727 0.96103 +727.2 0.96195 +727.4 0.96296 +727.6 0.96391 +727.8 0.96487 +728 0.96569 +728.2 0.9663 +728.4 0.9667 +728.6 0.96691 +728.8 0.96691 +729 0.96667 +729.2 0.96619 +729.4 0.96541 +729.6 0.96448 +729.8 0.96351 +730 0.9624 +730.2 0.96126 +730.4 0.96014 +730.6 0.95909 +730.8 0.9582 +731 0.95746 +731.2 0.95685 +731.4 0.95641 +731.6 0.95616 +731.8 0.95616 +732 0.95634 +732.2 0.95663 +732.4 0.95697 +732.6 0.95739 +732.8 0.95783 +733 0.9582 +733.2 0.9585 +733.4 0.95878 +733.6 0.95892 +733.8 0.95889 +734 0.9588 +734.2 0.95864 +734.4 0.95841 +734.6 0.95802 +734.8 0.95751 +735 0.95708 +735.2 0.95666 +735.4 0.95626 +735.6 0.95594 +735.8 0.95568 +736 0.95557 +736.2 0.95563 +736.4 0.95589 +736.6 0.95635 +736.8 0.95683 +737 0.9574 +737.2 0.95811 +737.4 0.95885 +737.6 0.95951 +737.8 0.96011 +738 0.96061 +738.2 0.96116 +738.4 0.96149 +738.6 0.96165 +738.8 0.96174 +739 0.96168 +739.2 0.9614 +739.4 0.96097 +739.6 0.96038 +739.8 0.95972 +740 0.95899 +740.2 0.95829 +740.4 0.95759 +740.6 0.95693 +740.8 0.9564 +741 0.95603 +741.2 0.95576 +741.4 0.95567 +741.6 0.95572 +741.8 0.95596 +742 0.95638 +742.2 0.95684 +742.4 0.95741 +742.6 0.95805 +742.8 0.95868 +743 0.95922 +743.2 0.95974 +743.4 0.96018 +743.6 0.96049 +743.8 0.96074 +744 0.96088 +744.2 0.96094 +744.4 0.96087 +744.6 0.96063 +744.8 0.96036 +745 0.95997 +745.2 0.9595 +745.4 0.959 +745.6 0.95853 +745.8 0.95819 +746 0.95793 +746.2 0.95769 +746.4 0.95766 +746.6 0.95777 +746.8 0.95801 +747 0.95832 +747.2 0.9587 +747.4 0.95914 +747.6 0.95973 +747.8 0.96029 +748 0.96083 +748.2 0.96138 +748.4 0.96182 +748.6 0.96211 +748.8 0.96232 +749 0.96232 +749.2 0.96221 +749.4 0.96192 +749.6 0.96145 +749.8 0.96085 +750 0.96017 +750.2 0.95936 +750.4 0.95846 +750.6 0.95762 +750.8 0.95682 +751 0.95609 +751.2 0.95549 +751.4 0.95507 +751.6 0.95482 +751.8 0.95479 +752 0.95495 +752.2 0.95529 +752.4 0.95585 +752.6 0.9566 +752.8 0.95752 +753 0.95857 +753.2 0.95966 +753.4 0.96086 +753.6 0.9621 +753.8 0.96322 +754 0.96422 +754.2 0.96507 +754.4 0.96578 +754.6 0.9663 +754.8 0.96652 +755 0.96645 +755.2 0.96625 +755.4 0.96588 +755.6 0.96528 +755.8 0.96449 +756 0.9636 +756.2 0.96266 +756.4 0.96174 +756.6 0.96075 +756.8 0.95973 +757 0.95884 +757.2 0.95809 +757.4 0.95751 +757.6 0.95713 +757.8 0.95684 +758 0.95669 +758.2 0.95681 +758.4 0.95708 +758.6 0.95748 +758.8 0.95801 +759 0.95863 +759.2 0.95929 +759.4 0.96003 +759.6 0.96084 +759.8 0.96161 +760 0.96227 +760.2 0.96277 +760.4 0.96307 +760.6 0.96332 +760.8 0.9634 +761 0.96321 +761.2 0.96293 +761.4 0.96265 +761.6 0.96231 +761.8 0.96193 +762 0.96145 +762.2 0.96095 +762.4 0.96055 +762.6 0.96017 +762.8 0.95979 +763 0.95951 +763.2 0.9593 +763.4 0.95928 +763.6 0.95932 +763.8 0.95944 +764 0.95961 +764.2 0.95982 +764.4 0.96012 +764.6 0.9605 +764.8 0.96093 +765 0.96127 +765.2 0.96156 +765.4 0.96189 +765.6 0.96209 +765.8 0.96225 +766 0.96233 +766.2 0.96231 +766.4 0.96223 +766.6 0.96205 +766.8 0.96177 +767 0.96146 +767.2 0.96108 +767.4 0.96073 +767.6 0.9603 +767.8 0.95989 +768 0.95958 +768.2 0.95932 +768.4 0.95916 +768.6 0.95915 +768.8 0.95923 +769 0.95941 +769.2 0.95966 +769.4 0.95993 +769.6 0.96026 +769.8 0.96066 +770 0.96104 +770.2 0.96133 +770.4 0.96165 +770.6 0.96192 +770.8 0.96216 +771 0.96232 +771.2 0.96236 +771.4 0.9624 +771.6 0.96235 +771.8 0.96219 +772 0.96203 +772.2 0.96178 +772.4 0.96148 +772.6 0.96114 +772.8 0.96074 +773 0.96035 +773.2 0.95997 +773.4 0.95959 +773.6 0.95937 +773.8 0.95929 +774 0.95925 +774.2 0.95933 +774.4 0.95955 +774.6 0.95997 +774.8 0.9605 +775 0.96102 +775.2 0.96169 +775.4 0.96244 +775.6 0.96322 +775.8 0.96402 +776 0.96468 +776.2 0.9654 +776.4 0.96613 +776.6 0.96666 +776.8 0.96709 +777 0.96751 +777.2 0.96779 +777.4 0.96791 +777.6 0.96782 +777.8 0.96762 +778 0.96742 +778.2 0.96708 +778.4 0.96656 +778.6 0.96604 +778.8 0.96557 +779 0.96509 +779.2 0.96453 +779.4 0.96407 +779.6 0.96367 +779.8 0.96334 +780 0.96315 +780.2 0.96301 +780.4 0.96298 +780.6 0.9631 +780.8 0.9633 +781 0.96357 +781.2 0.96382 +781.4 0.96423 +781.6 0.96471 +781.8 0.96516 +782 0.96565 +782.2 0.96608 +782.4 0.96643 +782.6 0.96668 +782.8 0.96676 +783 0.96673 +783.2 0.96663 +783.4 0.96642 +783.6 0.96603 +783.8 0.96552 +784 0.965 +784.2 0.96453 +784.4 0.96396 +784.6 0.96328 +784.8 0.96261 +785 0.96204 +785.2 0.96155 +785.4 0.96108 +785.6 0.96062 +785.8 0.96035 +786 0.96027 +786.2 0.9603 +786.4 0.96048 +786.6 0.96078 +786.8 0.96118 +787 0.96172 +787.2 0.96229 +787.4 0.96294 +787.6 0.96367 +787.8 0.9644 +788 0.96511 +788.2 0.96571 +788.4 0.96622 +788.6 0.96674 +788.8 0.96715 +789 0.96738 +789.2 0.96743 +789.4 0.96732 +789.6 0.96723 +789.8 0.96705 +790 0.9666 +790.2 0.96613 +790.4 0.9656 +790.6 0.96497 +790.8 0.96436 +791 0.9637 +791.2 0.96304 +791.4 0.96249 +791.6 0.962 +791.8 0.9616 +792 0.96127 +792.2 0.96105 +792.4 0.961 +792.6 0.96108 +792.8 0.96129 +793 0.96156 +793.2 0.96187 +793.4 0.9623 +793.6 0.96276 +793.8 0.96319 +794 0.96369 +794.2 0.96406 +794.4 0.96454 +794.6 0.96516 +794.8 0.96565 +795 0.96607 +795.2 0.96635 +795.4 0.96652 +795.6 0.96666 +795.8 0.96667 +796 0.96655 +796.2 0.96633 +796.4 0.96599 +796.6 0.96568 +796.8 0.96535 +797 0.96497 +797.2 0.96455 +797.4 0.96419 +797.6 0.96396 +797.8 0.96381 +798 0.9637 +798.2 0.96366 +798.4 0.96374 +798.6 0.96392 +798.8 0.96415 +799 0.9645 +799.2 0.96491 +799.4 0.96538 +799.6 0.96592 +799.8 0.96641 +800 0.96692 +800.2 0.96751 +800.4 0.96804 +800.6 0.96846 +800.8 0.96879 +801 0.96906 +801.2 0.96936 +801.4 0.96964 +801.6 0.96979 +801.8 0.96978 +802 0.96976 +802.2 0.96972 +802.4 0.96956 +802.6 0.96927 +802.8 0.96885 +803 0.96835 +803.2 0.96784 +803.4 0.96729 +803.6 0.96671 +803.8 0.96618 +804 0.96574 +804.2 0.96529 +804.4 0.96496 +804.6 0.96477 +804.8 0.96467 +805 0.96469 +805.2 0.96483 +805.4 0.96502 +805.6 0.96528 +805.8 0.96561 +806 0.96597 +806.2 0.96638 +806.4 0.96683 +806.6 0.96722 +806.8 0.96758 +807 0.96789 +807.2 0.96816 +807.4 0.96832 +807.6 0.96832 +807.8 0.96823 +808 0.96807 +808.2 0.96779 +808.4 0.96744 +808.6 0.967 +808.8 0.96645 +809 0.96585 +809.2 0.96522 +809.4 0.96456 +809.6 0.96389 +809.8 0.96323 +810 0.96263 +810.2 0.96211 +810.4 0.96162 +810.6 0.96123 +810.8 0.96099 +811 0.9609 +811.2 0.96097 +811.4 0.96121 +811.6 0.96159 +811.8 0.96207 +812 0.96268 +812.2 0.96339 +812.4 0.96417 +812.6 0.96508 +812.8 0.96606 +813 0.96698 +813.2 0.9679 +813.4 0.96882 +813.6 0.96967 +813.8 0.97041 +814 0.97101 +814.2 0.9715 +814.4 0.9719 +814.6 0.97219 +814.8 0.97233 +815 0.97228 +815.2 0.97209 +815.4 0.97183 +815.6 0.97142 +815.8 0.9709 +816 0.97029 +816.2 0.96963 +816.4 0.96901 +816.6 0.96842 +816.8 0.96782 +817 0.96734 +817.2 0.96696 +817.4 0.96659 +817.6 0.96634 +817.8 0.96621 +818 0.96616 +818.2 0.96617 +818.4 0.96622 +818.6 0.9664 +818.8 0.96673 +819 0.96709 +819.2 0.96745 +819.4 0.96783 +819.6 0.96822 +819.8 0.96863 +820 0.96901 +820.2 0.96929 +820.4 0.96952 +820.6 0.96969 +820.8 0.96975 +821 0.96969 +821.2 0.96958 +821.4 0.96931 +821.6 0.96895 +821.8 0.96848 +822 0.96796 +822.2 0.96736 +822.4 0.96667 +822.6 0.96592 +822.8 0.9652 +823 0.96449 +823.2 0.96388 +823.4 0.96333 +823.6 0.96291 +823.8 0.9626 +824 0.9624 +824.2 0.96227 +824.4 0.96231 +824.6 0.96249 +824.8 0.96275 +825 0.96314 +825.2 0.96365 +825.4 0.96425 +825.6 0.96494 +825.8 0.96564 +826 0.96632 +826.2 0.96703 +826.4 0.96768 +826.6 0.96825 +826.8 0.9688 +827 0.96922 +827.2 0.96954 +827.4 0.9698 +827.6 0.96995 +827.8 0.96998 +828 0.96989 +828.2 0.96965 +828.4 0.96926 +828.6 0.96887 +828.8 0.96835 +829 0.96773 +829.2 0.9671 +829.4 0.96642 +829.6 0.96571 +829.8 0.96507 +830 0.9644 +830.2 0.96383 +830.4 0.96343 +830.6 0.9631 +830.8 0.96289 +831 0.96281 +831.2 0.96288 +831.4 0.96318 +831.6 0.96356 +831.8 0.96403 +832 0.96464 +832.2 0.96533 +832.4 0.96611 +832.6 0.96694 +832.8 0.96778 +833 0.96864 +833.2 0.96953 +833.4 0.97042 +833.6 0.97122 +833.8 0.97197 +834 0.97265 +834.2 0.97315 +834.4 0.97352 +834.6 0.97373 +834.8 0.97381 +835 0.9738 +835.2 0.97369 +835.4 0.97338 +835.6 0.97295 +835.8 0.97252 +836 0.97202 +836.2 0.97141 +836.4 0.97081 +836.6 0.97012 +836.8 0.96943 +837 0.96885 +837.2 0.96832 +837.4 0.96781 +837.6 0.96746 +837.8 0.96717 +838 0.9669 +838.2 0.96676 +838.4 0.96677 +838.6 0.96687 +838.8 0.96707 +839 0.96732 +839.2 0.96766 +839.4 0.96804 +839.6 0.9685 +839.8 0.96901 +840 0.96948 +840.2 0.96996 +840.4 0.9705 +840.6 0.97096 +840.8 0.97137 +841 0.97174 +841.2 0.97201 +841.4 0.97226 +841.6 0.97242 +841.8 0.97244 +842 0.9723 +842.2 0.9721 +842.4 0.97188 +842.6 0.97163 +842.8 0.97132 +843 0.97094 +843.2 0.97061 +843.4 0.97026 +843.6 0.96987 +843.8 0.9696 +844 0.96937 +844.2 0.96915 +844.4 0.96899 +844.6 0.96888 +844.8 0.96882 +845 0.96892 +845.2 0.96905 +845.4 0.96923 +845.6 0.96958 +845.8 0.96994 +846 0.97037 +846.2 0.97081 +846.4 0.97126 +846.6 0.97178 +846.8 0.97231 +847 0.97275 +847.2 0.97318 +847.4 0.97358 +847.6 0.97395 +847.8 0.97429 +848 0.97447 +848.2 0.97448 +848.4 0.97439 +848.6 0.97416 +848.8 0.97384 +849 0.97339 +849.2 0.9728 +849.4 0.97209 +849.6 0.97135 +849.8 0.97059 +850 0.96981 +850.2 0.96896 +850.4 0.96812 +850.6 0.96734 +850.8 0.96655 +851 0.96587 +851.2 0.9653 +851.4 0.96473 +851.6 0.96426 +851.8 0.96395 +852 0.96372 +852.2 0.9636 +852.4 0.96358 +852.6 0.96364 +852.8 0.96382 +853 0.96409 +853.2 0.96446 +853.4 0.96498 +853.6 0.96556 +853.8 0.9662 +854 0.96681 +854.2 0.96748 +854.4 0.96818 +854.6 0.96886 +854.8 0.96945 +855 0.97004 +855.2 0.97057 +855.4 0.97105 +855.6 0.97149 +855.8 0.97184 +856 0.97208 +856.2 0.97222 +856.4 0.97231 +856.6 0.97236 +856.8 0.97225 +857 0.9721 +857.2 0.97193 +857.4 0.97171 +857.6 0.97148 +857.8 0.97127 +858 0.97097 +858.2 0.9707 +858.4 0.97054 +858.6 0.9704 +858.8 0.97022 +859 0.97011 +859.2 0.97002 +859.4 0.96998 +859.6 0.97001 +859.8 0.97012 +860 0.97025 +860.2 0.97044 +860.4 0.97071 +860.6 0.97102 +860.8 0.97134 +861 0.97167 +861.2 0.97197 +861.4 0.97231 +861.6 0.97262 +861.8 0.97292 +862 0.97321 +862.2 0.97346 +862.4 0.97363 +862.6 0.97371 +862.8 0.97374 +863 0.97364 +863.2 0.97347 +863.4 0.97328 +863.6 0.97301 +863.8 0.97262 +864 0.97221 +864.2 0.97181 +864.4 0.97139 +864.6 0.97097 +864.8 0.97055 +865 0.9701 +865.2 0.96964 +865.4 0.96925 +865.6 0.9689 +865.8 0.96857 +866 0.96833 +866.2 0.96818 +866.4 0.96812 +866.6 0.96815 +866.8 0.96827 +867 0.96842 +867.2 0.96865 +867.4 0.96894 +867.6 0.96926 +867.8 0.96957 +868 0.96994 +868.2 0.97028 +868.4 0.97064 +868.6 0.97102 +868.8 0.97137 +869 0.97166 +869.2 0.97196 +869.4 0.97227 +869.6 0.97258 +869.8 0.97282 +870 0.97299 +870.2 0.97307 +870.4 0.97313 +870.6 0.97313 +870.8 0.97305 +871 0.97286 +871.2 0.97254 +871.4 0.97217 +871.6 0.97181 +871.8 0.97146 +872 0.97106 +872.2 0.97071 +872.4 0.97033 +872.6 0.96998 +872.8 0.9697 +873 0.96943 +873.2 0.96917 +873.4 0.96901 +873.6 0.96895 +873.8 0.96891 +874 0.96895 +874.2 0.96909 +874.4 0.96925 +874.6 0.96948 +874.8 0.96977 +875 0.97008 +875.2 0.97037 +875.4 0.97071 +875.6 0.97107 +875.8 0.97147 +876 0.9719 +876.2 0.97228 +876.4 0.97265 +876.6 0.97308 +876.8 0.97347 +877 0.97373 +877.2 0.97387 +877.4 0.97395 +877.6 0.97397 +877.8 0.97397 +878 0.97383 +878.2 0.97356 +878.4 0.97324 +878.6 0.97299 +878.8 0.97268 +879 0.97233 +879.2 0.97194 +879.4 0.97152 +879.6 0.97111 +879.8 0.97068 +880 0.97027 +880.2 0.96987 +880.4 0.96954 +880.6 0.96923 +880.8 0.969 +881 0.96875 +881.2 0.96853 +881.4 0.96838 +881.6 0.9683 +881.8 0.96824 +882 0.96824 +882.2 0.96832 +882.4 0.96846 +882.6 0.96865 +882.8 0.96888 +883 0.96916 +883.2 0.96942 +883.4 0.96974 +883.6 0.97006 +883.8 0.97032 +884 0.97057 +884.2 0.97081 +884.4 0.97098 +884.6 0.97114 +884.8 0.97129 +885 0.97134 +885.2 0.97135 +885.4 0.97135 +885.6 0.97128 +885.8 0.97114 +886 0.97104 +886.2 0.97087 +886.4 0.97067 +886.6 0.97046 +886.8 0.97027 +887 0.97003 +887.2 0.9698 +887.4 0.96958 +887.6 0.96937 +887.8 0.96919 +888 0.96902 +888.2 0.96891 +888.4 0.96887 +888.6 0.9689 +888.8 0.96896 +889 0.9691 +889.2 0.96924 +889.4 0.96947 +889.6 0.9698 +889.8 0.97015 +890 0.9705 +890.2 0.97087 +890.4 0.97121 +890.6 0.97161 +890.8 0.97203 +891 0.9724 +891.2 0.97275 +891.4 0.97302 +891.6 0.97333 +891.8 0.97362 +892 0.97386 +892.2 0.97399 +892.4 0.97404 +892.6 0.974 +892.8 0.9739 +893 0.97377 +893.2 0.97344 +893.4 0.97309 +893.6 0.97264 +893.8 0.97211 +894 0.97163 +894.2 0.97111 +894.4 0.97056 +894.6 0.97 +894.8 0.96948 +895 0.96895 +895.2 0.96847 +895.4 0.96801 +895.6 0.96758 +895.8 0.9672 +896 0.96683 +896.2 0.96649 +896.4 0.96629 +896.6 0.96618 +896.8 0.96618 +897 0.96626 +897.2 0.9664 +897.4 0.96663 +897.6 0.96694 +897.8 0.96736 +898 0.96781 +898.2 0.96822 +898.4 0.96871 +898.6 0.96924 +898.8 0.96982 +899 0.9704 +899.2 0.97093 +899.4 0.97144 +899.6 0.97186 +899.8 0.97228 +900 0.97267 +900.2 0.97295 +900.4 0.97317 +900.6 0.97332 +900.8 0.9734 +901 0.97344 +901.2 0.9734 +901.4 0.97331 +901.6 0.97309 +901.8 0.97278 +902 0.97235 +902.2 0.97191 +902.4 0.97146 +902.6 0.97096 +902.8 0.97043 +903 0.96985 +903.2 0.96929 +903.4 0.96877 +903.6 0.96831 +903.8 0.96787 +904 0.96743 +904.2 0.96704 +904.4 0.96671 +904.6 0.96641 +904.8 0.96623 +905 0.96611 +905.2 0.96602 +905.4 0.96605 +905.6 0.96615 +905.8 0.9663 +906 0.96654 +906.2 0.96689 +906.4 0.96728 +906.6 0.96771 +906.8 0.96815 +907 0.96858 +907.2 0.969 +907.4 0.96946 +907.6 0.96993 +907.8 0.97035 +908 0.9707 +908.2 0.97102 +908.4 0.97133 +908.6 0.97161 +908.8 0.97179 +909 0.97193 +909.2 0.972 +909.4 0.97202 +909.6 0.97203 +909.8 0.97195 +910 0.97182 +910.2 0.97159 +910.4 0.97136 +910.6 0.97107 +910.8 0.97074 +911 0.97033 +911.2 0.96991 +911.4 0.96953 +911.6 0.96917 +911.8 0.96884 +912 0.96853 +912.2 0.96825 +912.4 0.96802 +912.6 0.96787 +912.8 0.96775 +913 0.96763 +913.2 0.96756 +913.4 0.9675 +913.6 0.96751 +913.8 0.96759 +914 0.96773 +914.2 0.96788 +914.4 0.96811 +914.6 0.96837 +914.8 0.96862 +915 0.96893 +915.2 0.96931 +915.4 0.96967 +915.6 0.96998 +915.8 0.97032 +916 0.97062 +916.2 0.97087 +916.4 0.97111 +916.6 0.97131 +916.8 0.97146 +917 0.97159 +917.2 0.97165 +917.4 0.97163 +917.6 0.97159 +917.8 0.97153 +918 0.97134 +918.2 0.97113 +918.4 0.97092 +918.6 0.97068 +918.8 0.97042 +919 0.97011 +919.2 0.96979 +919.4 0.96945 +919.6 0.9692 +919.8 0.96895 +920 0.96869 +920.2 0.96844 +920.4 0.96822 +920.6 0.96802 +920.8 0.96782 +921 0.96762 +921.2 0.96753 +921.4 0.96747 +921.6 0.96744 +921.8 0.96744 +922 0.96747 +922.2 0.96761 +922.4 0.96777 +922.6 0.96795 +922.8 0.96804 +923 0.96818 +923.2 0.96833 +923.4 0.96853 +923.6 0.96874 +923.8 0.96885 +924 0.96894 +924.2 0.96901 +924.4 0.96907 +924.6 0.96912 +924.8 0.96913 +925 0.96909 +925.2 0.96899 +925.4 0.96884 +925.6 0.96866 +925.8 0.96846 +926 0.96821 +926.2 0.96789 +926.4 0.96749 +926.6 0.9671 +926.8 0.96669 +927 0.96628 +927.2 0.96585 +927.4 0.9654 +927.6 0.96497 +927.8 0.96453 +928 0.96412 +928.2 0.9637 +928.4 0.96332 +928.6 0.96299 +928.8 0.96271 +929 0.9625 +929.2 0.96234 +929.4 0.96225 +929.6 0.96223 +929.8 0.9623 +930 0.96246 +930.2 0.9627 +930.4 0.96298 +930.6 0.96328 +930.8 0.96358 +931 0.96396 +931.2 0.9644 +931.4 0.96489 +931.6 0.96537 +931.8 0.96586 +932 0.96629 +932.2 0.96672 +932.4 0.9672 +932.6 0.96763 +932.8 0.96798 +933 0.96833 +933.2 0.96859 +933.4 0.96876 +933.6 0.96891 +933.8 0.96906 +934 0.96912 +934.2 0.96908 +934.4 0.96899 +934.6 0.9688 +934.8 0.96856 +935 0.96834 +935.2 0.96811 +935.4 0.9678 +935.6 0.96747 +935.8 0.96713 +936 0.96675 +936.2 0.96639 +936.4 0.96611 +936.6 0.96579 +936.8 0.9655 +937 0.9652 +937.2 0.96492 +937.4 0.96473 +937.6 0.9646 +937.8 0.96449 +938 0.96439 +938.2 0.96438 +938.4 0.9644 +938.6 0.96443 +938.8 0.96445 +939 0.96464 +939.2 0.96493 +939.4 0.96519 +939.6 0.96549 +939.8 0.96578 +940 0.96618 +940.2 0.96657 +940.4 0.96707 +940.6 0.96754 +940.8 0.96787 +941 0.96827 +941.2 0.96873 +941.4 0.96915 +941.6 0.96943 +941.8 0.96966 +942 0.96993 +942.2 0.97009 +942.4 0.97026 +942.6 0.97028 +942.8 0.97021 +943 0.97012 +943.2 0.97007 +943.4 0.96989 +943.6 0.96963 +943.8 0.96936 +944 0.96904 +944.2 0.9688 +944.4 0.9685 +944.6 0.96819 +944.8 0.9678 +945 0.9674 +945.2 0.96706 +945.4 0.96676 +945.6 0.96639 +945.8 0.96591 +946 0.96552 +946.2 0.96514 +946.4 0.96473 +946.6 0.96442 +946.8 0.96411 +947 0.96385 +947.2 0.96371 +947.4 0.96359 +947.6 0.96344 +947.8 0.96338 +948 0.96343 +948.2 0.96347 +948.4 0.96358 +948.6 0.9637 +948.8 0.96374 +949 0.96377 +949.2 0.96395 +949.4 0.96414 +949.6 0.96433 +949.8 0.96456 +950 0.96479 +950.2 0.96499 +950.4 0.96511 +950.6 0.96526 +950.8 0.96541 +951 0.96556 +951.2 0.96566 +951.4 0.96575 +951.6 0.96579 +951.8 0.96576 +952 0.96574 +952.2 0.9658 +952.4 0.96577 +952.6 0.96565 +952.8 0.96557 +953 0.96538 +953.2 0.9652 +953.4 0.96506 +953.6 0.96486 +953.8 0.96458 +954 0.96435 +954.2 0.96418 +954.4 0.96396 +954.6 0.96371 +954.8 0.9635 +955 0.96329 +955.2 0.96315 +955.4 0.9631 +955.6 0.96303 +955.8 0.96294 +956 0.96298 +956.2 0.96305 +956.4 0.96312 +956.6 0.96323 +956.8 0.96344 +957 0.96361 +957.2 0.96378 +957.4 0.96397 +957.6 0.96412 +957.8 0.96429 +958 0.96451 +958.2 0.96476 +958.4 0.96496 +958.6 0.9652 +958.8 0.96543 +959 0.96564 +959.2 0.96583 +959.4 0.96601 +959.6 0.96617 +959.8 0.96634 +960 0.96646 +960.2 0.96652 +960.4 0.96657 +960.6 0.96666 +960.8 0.96665 +961 0.96664 +961.2 0.96656 +961.4 0.96637 +961.6 0.96616 +961.8 0.96595 +962 0.96573 +962.2 0.96548 +962.4 0.96526 +962.6 0.96504 +962.8 0.9648 +963 0.96461 +963.2 0.96442 +963.4 0.9642 +963.6 0.96397 +963.8 0.96378 +964 0.96362 +964.2 0.96344 +964.4 0.96336 +964.6 0.96324 +964.8 0.96315 +965 0.96307 +965.2 0.96307 +965.4 0.96308 +965.6 0.96312 +965.8 0.96318 +966 0.96327 +966.2 0.96334 +966.4 0.96351 +966.6 0.9637 +966.8 0.96396 +967 0.9642 +967.2 0.96448 +967.4 0.96471 +967.6 0.96496 +967.8 0.96518 +968 0.96535 +968.2 0.96551 +968.4 0.96569 +968.6 0.96577 +968.8 0.96585 +969 0.96589 +969.2 0.96589 +969.4 0.96583 +969.6 0.96585 +969.8 0.96584 +970 0.96579 +970.2 0.96564 +970.4 0.96551 +970.6 0.96534 +970.8 0.96517 +971 0.96506 +971.2 0.96488 +971.4 0.96457 +971.6 0.96423 +971.8 0.96392 +972 0.9636 +972.2 0.96325 +972.4 0.96294 +972.6 0.96265 +972.8 0.96228 +973 0.96202 +973.2 0.96176 +973.4 0.96148 +973.6 0.96128 +973.8 0.96108 +974 0.96091 +974.2 0.96071 +974.4 0.96057 +974.6 0.96054 +974.8 0.9605 +975 0.96049 +975.2 0.96053 +975.4 0.96058 +975.6 0.96061 +975.8 0.96065 +976 0.96078 +976.2 0.96088 +976.4 0.96097 +976.6 0.96112 +976.8 0.9613 +977 0.96144 +977.2 0.96159 +977.4 0.96176 +977.6 0.96192 +977.8 0.96206 +978 0.96222 +978.2 0.96232 +978.4 0.96237 +978.6 0.96249 +978.8 0.96258 +979 0.96263 +979.2 0.96272 +979.4 0.96278 +979.6 0.96283 +979.8 0.96285 +980 0.96285 +980.2 0.96287 +980.4 0.96284 +980.6 0.96279 +980.8 0.96274 +981 0.96272 +981.2 0.96266 +981.4 0.96259 +981.6 0.96258 +981.8 0.96259 +982 0.96257 +982.2 0.96257 +982.4 0.96263 +982.6 0.96277 +982.8 0.96292 +983 0.96306 +983.2 0.96322 +983.4 0.9634 +983.6 0.96355 +983.8 0.96375 +984 0.96393 +984.2 0.96408 +984.4 0.96426 +984.6 0.96442 +984.8 0.96462 +985 0.96481 +985.2 0.96498 +985.4 0.9652 +985.6 0.96545 +985.8 0.96565 +986 0.96581 +986.2 0.96596 +986.4 0.96617 +986.6 0.96632 +986.8 0.96645 +987 0.96659 +987.2 0.96662 +987.4 0.96662 +987.6 0.96662 +987.8 0.96665 +988 0.96659 +988.2 0.96644 +988.4 0.96632 +988.6 0.96616 +988.8 0.96598 +989 0.96574 +989.2 0.96551 +989.4 0.96525 +989.6 0.965 +989.8 0.96471 +990 0.96437 +990.2 0.96398 +990.4 0.96363 +990.6 0.96322 +990.8 0.96289 +991 0.96259 +991.2 0.96223 +991.4 0.96185 +991.6 0.96153 +991.8 0.96131 +992 0.96119 +992.2 0.96103 +992.4 0.96094 +992.6 0.96082 +992.8 0.96067 +993 0.96063 +993.2 0.96064 +993.4 0.96074 +993.6 0.96075 +993.8 0.96076 +994 0.96085 +994.2 0.96098 +994.4 0.96119 +994.6 0.9614 +994.8 0.96156 +995 0.96175 +995.2 0.96199 +995.4 0.96227 +995.6 0.96252 +995.8 0.96277 +996 0.96301 +996.2 0.96322 +996.4 0.96342 +996.6 0.96366 +996.8 0.96386 +997 0.964 +997.2 0.96408 +997.4 0.96407 +997.6 0.96409 +997.8 0.96414 +998 0.96416 +998.2 0.96414 +998.4 0.96407 +998.6 0.96393 +998.8 0.96378 +999 0.96367 +999.2 0.96355 +999.4 0.96332 +999.6 0.96307 +999.8 0.96285 +1000 0.96262 +1000.2 0.96234 +1000.4 0.96222 +1000.6 0.96208 +1000.8 0.96181 +1001 0.96163 +1001.2 0.96147 +1001.4 0.96118 +1001.6 0.96095 +1001.8 0.96076 +1002 0.96059 +1002.2 0.96039 +1002.4 0.96021 +1002.6 0.96018 +1002.8 0.96014 +1003 0.96012 +1003.2 0.96009 +1003.4 0.96004 +1003.6 0.96 +1003.8 0.95998 +1004 0.96 +1004.2 0.9601 +1004.4 0.96021 +1004.6 0.96027 +1004.8 0.96028 +1005 0.96044 +1005.2 0.96061 +1005.4 0.96075 +1005.6 0.96086 +1005.8 0.96099 +1006 0.96114 +1006.2 0.96121 +1006.4 0.96128 +1006.6 0.96138 +1006.8 0.96131 +1007 0.9612 +1007.2 0.96115 +1007.4 0.96108 +1007.6 0.96096 +1007.8 0.96087 +1008 0.96077 +1008.2 0.96056 +1008.4 0.96028 +1008.6 0.9601 +1008.8 0.95994 +1009 0.95968 +1009.2 0.95941 +1009.4 0.95915 +1009.6 0.95886 +1009.8 0.95853 +1010 0.95828 +1010.2 0.95803 +1010.4 0.95773 +1010.6 0.95747 +1010.8 0.95721 +1011 0.95703 +1011.2 0.95698 +1011.4 0.95687 +1011.6 0.95669 +1011.8 0.95656 +1012 0.95646 +1012.2 0.95631 +1012.4 0.95623 +1012.6 0.95626 +1012.8 0.95621 +1013 0.95609 +1013.2 0.95612 +1013.4 0.95629 +1013.6 0.95646 +1013.8 0.95668 +1014 0.95699 +1014.2 0.95723 +1014.4 0.95742 +1014.6 0.95772 +1014.8 0.95811 +1015 0.95842 +1015.2 0.95869 +1015.4 0.95903 +1015.6 0.9594 +1015.8 0.95972 +1016 0.96 +1016.2 0.96029 +1016.4 0.96053 +1016.6 0.96072 +1016.8 0.96103 +1017 0.96124 +1017.2 0.96133 +1017.4 0.96145 +1017.6 0.96159 +1017.8 0.9617 +1018 0.96172 +1018.2 0.9617 +1018.4 0.96159 +1018.6 0.96141 +1018.8 0.96132 +1019 0.96123 +1019.2 0.9611 +1019.4 0.96087 +1019.6 0.96059 +1019.8 0.96042 +1020 0.96026 +1020.2 0.96006 +1020.4 0.95983 +1020.6 0.95959 +1020.8 0.95923 +1021 0.95886 +1021.2 0.95859 +1021.4 0.95827 +1021.6 0.95794 +1021.8 0.95773 +1022 0.95756 +1022.2 0.95735 +1022.4 0.95721 +1022.6 0.95718 +1022.8 0.95712 +1023 0.95711 +1023.2 0.95714 +1023.4 0.95706 +1023.6 0.95704 +1023.8 0.95709 +1024 0.95717 +1024.2 0.9573 +1024.4 0.95742 +1024.6 0.95758 +1024.8 0.95769 +1025 0.95785 +1025.2 0.95805 +1025.4 0.95821 +1025.6 0.95847 +1025.8 0.95875 +1026 0.9589 +1026.2 0.95909 +1026.4 0.9593 +1026.6 0.95953 +1026.8 0.95984 +1027 0.96016 +1027.2 0.96045 +1027.4 0.96059 +1027.6 0.96072 +1027.8 0.96086 +1028 0.961 +1028.2 0.96116 +1028.4 0.96125 +1028.6 0.96128 +1028.8 0.96124 +1029 0.96122 +1029.2 0.96122 +1029.4 0.96114 +1029.6 0.96092 +1029.8 0.96069 +1030 0.96048 +1030.2 0.9602 +1030.4 0.95994 +1030.6 0.95969 +1030.8 0.95937 +1031 0.95916 +1031.2 0.95889 +1031.4 0.95859 +1031.6 0.95841 +1031.8 0.95823 +1032 0.95795 +1032.2 0.95773 +1032.4 0.95761 +1032.6 0.9574 +1032.8 0.9571 +1033 0.95698 +1033.2 0.95694 +1033.4 0.9569 +1033.6 0.95684 +1033.8 0.95687 +1034 0.95699 +1034.2 0.95695 +1034.4 0.95702 +1034.6 0.95732 +1034.8 0.95761 +1035 0.95787 +1035.2 0.95806 +1035.4 0.95834 +1035.6 0.95857 +1035.8 0.95867 +1036 0.9589 +1036.2 0.95912 +1036.4 0.95933 +1036.6 0.95959 +1036.8 0.95978 +1037 0.96 +1037.2 0.96025 +1037.4 0.96055 +1037.6 0.96082 +1037.8 0.96103 +1038 0.9613 +1038.2 0.96152 +1038.4 0.96166 +1038.6 0.96174 +1038.8 0.96173 +1039 0.96177 +1039.2 0.96173 +1039.4 0.96167 +1039.6 0.96164 +1039.8 0.96147 +1040 0.96123 +1040.2 0.96101 +1040.4 0.96071 +1040.6 0.96048 +1040.8 0.96016 +1041 0.95972 +1041.2 0.95942 +1041.4 0.95912 +1041.6 0.95873 +1041.8 0.95854 +1042 0.9582 +1042.2 0.95773 +1042.4 0.95741 +1042.6 0.95706 +1042.8 0.95672 +1043 0.95647 +1043.2 0.95614 +1043.4 0.95583 +1043.6 0.95545 +1043.8 0.95501 +1044 0.95489 +1044.2 0.95485 +1044.4 0.95477 +1044.6 0.95471 +1044.8 0.95471 +1045 0.95485 +1045.2 0.95485 +1045.4 0.95492 +1045.6 0.95513 +1045.8 0.95521 +1046 0.95524 +1046.2 0.95536 +1046.4 0.95559 +1046.6 0.9558 +1046.8 0.95587 +1047 0.95604 +1047.2 0.95623 +1047.4 0.95634 +1047.6 0.95663 +1047.8 0.95696 +1048 0.95731 +1048.2 0.95755 +1048.4 0.95763 +1048.6 0.95776 +1048.8 0.95801 +1049 0.95814 +1049.2 0.95829 +1049.4 0.95849 +1049.6 0.95854 +1049.8 0.95853 +1050 0.95862 +1050.2 0.95866 +1050.4 0.95863 +1050.6 0.95855 +1050.8 0.95848 +1051 0.95832 +1051.2 0.95803 +1051.4 0.95783 +1051.6 0.95765 +1051.8 0.95738 +1052 0.9572 +1052.2 0.95704 +1052.4 0.95682 +1052.6 0.95658 +1052.8 0.9563 +1053 0.956 +1053.2 0.95579 +1053.4 0.95567 +1053.6 0.95542 +1053.8 0.9551 +1054 0.95477 +1054.2 0.95451 +1054.4 0.95433 +1054.6 0.95427 +1054.8 0.95407 +1055 0.95383 +1055.2 0.95366 +1055.4 0.95361 +1055.6 0.95369 +1055.8 0.95361 +1056 0.95356 +1056.2 0.95366 +1056.4 0.95374 +1056.6 0.95382 +1056.8 0.95402 +1057 0.95427 +1057.2 0.95454 +1057.4 0.9547 +1057.6 0.95489 +1057.8 0.95535 +1058 0.95588 +1058.2 0.9563 +1058.4 0.9566 +1058.6 0.95698 +1058.8 0.95739 +1059 0.95781 +1059.2 0.95828 +1059.4 0.9588 +1059.6 0.95915 +1059.8 0.95927 +1060 0.9594 +1060.2 0.95979 +1060.4 0.96007 +1060.6 0.96025 +1060.8 0.96038 +1061 0.9606 +1061.2 0.96064 +1061.4 0.96062 +1061.6 0.96078 +1061.8 0.96101 +1062 0.96111 +1062.2 0.96111 +1062.4 0.96101 +1062.6 0.96109 +1062.8 0.96095 +1063 0.96074 +1063.2 0.96068 +1063.4 0.96051 +1063.6 0.96029 +1063.8 0.96004 +1064 0.95972 +1064.2 0.95951 +1064.4 0.95911 +1064.6 0.95873 +1064.8 0.95832 +1065 0.95782 +1065.2 0.95746 +1065.4 0.95726 +1065.6 0.9571 +1065.8 0.95689 +1066 0.9566 +1066.2 0.9564 +1066.4 0.95618 +1066.6 0.95616 +1066.8 0.95627 +1067 0.95614 +1067.2 0.95617 +1067.4 0.95621 +1067.6 0.95621 +1067.8 0.95619 +1068 0.95619 +1068.2 0.9562 +1068.4 0.95631 +1068.6 0.95624 +1068.8 0.95635 +1069 0.95635 +1069.2 0.95635 +1069.4 0.95647 +1069.6 0.95653 +1069.8 0.95664 +1070 0.95672 +1070.2 0.95679 +1070.4 0.95709 +1070.6 0.95734 +1070.8 0.95749 +1071 0.95762 +1071.2 0.95764 +1071.4 0.95797 +1071.6 0.95817 +1071.8 0.95813 +1072 0.95819 +1072.2 0.95812 +1072.4 0.95814 +1072.6 0.95814 +1072.8 0.95808 +1073 0.95798 +1073.2 0.95767 +1073.4 0.95743 +1073.6 0.95762 +1073.8 0.95756 +1074 0.95747 +1074.2 0.95723 +1074.4 0.95686 +1074.6 0.95666 +1074.8 0.95629 +1075 0.95599 +1075.2 0.95576 +1075.4 0.9553 +1075.6 0.95493 +1075.8 0.95465 +1076 0.95422 +1076.2 0.95384 +1076.4 0.95353 +1076.6 0.95343 +1076.8 0.95353 +1077 0.95348 +1077.2 0.9532 +1077.4 0.95287 +1077.6 0.95263 +1077.8 0.9524 +1078 0.95248 +1078.2 0.95262 +1078.4 0.95255 +1078.6 0.95244 +1078.8 0.95237 +1079 0.95236 +1079.2 0.95265 +1079.4 0.95303 +1079.6 0.95336 +1079.8 0.95345 +1080 0.95352 +1080.2 0.9536 +1080.4 0.95377 +1080.6 0.954 +1080.8 0.95432 +1081 0.95478 +1081.2 0.95512 +1081.4 0.95536 +1081.6 0.95566 +1081.8 0.95598 +1082 0.95634 +1082.2 0.95655 +1082.4 0.95666 +1082.6 0.95674 +1082.8 0.95688 +1083 0.95711 +1083.2 0.95749 +1083.4 0.95765 +1083.6 0.95765 +1083.8 0.95777 +1084 0.95784 +1084.2 0.95809 +1084.4 0.95835 +1084.6 0.95831 +1084.8 0.95816 +1085 0.958 +1085.2 0.95776 +1085.4 0.95775 +1085.6 0.95755 +1085.8 0.95737 +1086 0.95722 +1086.2 0.95681 +1086.4 0.95669 +1086.6 0.95641 +1086.8 0.95599 +1087 0.95558 +1087.2 0.95519 +1087.4 0.95485 +1087.6 0.9545 +1087.8 0.95413 +1088 0.95374 +1088.2 0.95338 +1088.4 0.95322 +1088.6 0.95317 +1088.8 0.95284 +1089 0.95249 +1089.2 0.95236 +1089.4 0.95204 +1089.6 0.9518 +1089.8 0.95171 +1090 0.95147 +1090.2 0.95108 +1090.4 0.95093 +1090.6 0.95108 +1090.8 0.95113 +1091 0.95133 +1091.2 0.95153 +1091.4 0.95184 +1091.6 0.95197 +1091.8 0.95198 +1092 0.95215 +1092.2 0.95259 +1092.4 0.95274 +1092.6 0.95303 +1092.8 0.95366 +1093 0.95387 +1093.2 0.9542 +1093.4 0.95443 +1093.6 0.95453 +1093.8 0.95494 +1094 0.95515 +1094.2 0.95542 +1094.4 0.95586 +1094.6 0.9559 +1094.8 0.95605 +1095 0.9563 +1095.2 0.95647 +1095.4 0.95658 +1095.6 0.95716 +1095.8 0.9576 +1096 0.95787 +1096.2 0.9578 +1096.4 0.9581 +1096.6 0.95845 +1096.8 0.95851 +1097 0.95832 +1097.2 0.95861 +1097.4 0.95875 +1097.6 0.95794 +1097.8 0.9559 +1098 0.95211 +1098.2 0.94471 +1098.4 0.93199 +1098.6 0.91219 +1098.8 0.88293 +1099 0.84135 +1099.2 0.7841 +1099.4 0.70777 +1099.6 0.60897 +1099.8 0.48432 +1100 0.33041 diff --git a/spectractor/simulation/image_simulation.py b/spectractor/simulation/image_simulation.py index c31e69a5d..aa7484d03 100644 --- a/spectractor/simulation/image_simulation.py +++ b/spectractor/simulation/image_simulation.py @@ -419,7 +419,7 @@ def ImageSim(image_filename, spectrum_filename, outputdir, pwv=5, ozone=300, aer airmass = image.header['AIRMASS'] pressure = image.header['OUTPRESS'] temperature = image.header['OUTTEMP'] - telescope = TelescopeTransmission(image.filter) + telescope = TelescopeTransmission(image.filter_label) # Rotation: useful only to fill the Dy_disp_axis column in PSF table if not with_rotation: diff --git a/spectractor/simulation/simulator.py b/spectractor/simulation/simulator.py index 95fbf531a..a94cb6e6c 100644 --- a/spectractor/simulation/simulator.py +++ b/spectractor/simulation/simulator.py @@ -672,7 +672,7 @@ def SimulatorInit(filename, fast_load=False): # TELESCOPE TRANSMISSION # ------------------------ - telescope = TelescopeTransmission(spectrum.filter) + telescope = TelescopeTransmission(spectrum.filter_label) # DISPERSER TRANSMISSION # ------------------------ diff --git a/spectractor/simulation/throughput.py b/spectractor/simulation/throughput.py index 9dfe98448..52986fe22 100644 --- a/spectractor/simulation/throughput.py +++ b/spectractor/simulation/throughput.py @@ -1,16 +1,3 @@ -""" -throughput.py -=============---- - -author : Sylvie Dagoret-Campagne, Jérémy Neveu -affiliation : LAL/CNRS/IN2P3/FRANCE -Collaboration : DESC-LSST - -Purpose : Provide the various useful transmission functions -update : July 2018 - -""" - import os import numpy as np import matplotlib.pyplot as plt @@ -18,229 +5,10 @@ from scipy.interpolate import interp1d from spectractor.config import set_logger +from spectractor.tools import reset_lambda_range import spectractor.parameters as parameters -class Throughput: - - def __init__(self, input_directory=parameters.THROUGHPUT_DIR): - """Class to load the different instrument transmissions. - - Parameters - ---------- - input_directory: str - The directory where the input transmission files are. - """ - self.path_transmission = input_directory - self.filename_quantum_efficiency = os.path.join(self.path_transmission, parameters.OBS_QUANTUM_EFFICIENCY) - # RG715.txt and FGB37.txt are extracted from .gc files. - self.filename_FGB37 = os.path.join(self.path_transmission, "FGB37.txt") - self.filename_RG715 = os.path.join(self.path_transmission, "RG715.txt") - self.filename_telescope_throughput = os.path.join(self.path_transmission, parameters.OBS_TELESCOPE_TRANSMISSION) - self.filename_mirrors = os.path.join(self.path_transmission, 'lsst_mirrorthroughput.txt') - self.filename_total_throughput = os.path.join(self.path_transmission, - parameters.OBS_FULL_INSTRUMENT_TRANSMISSON) - # self.filename_total_throughput = os.path.join(self.path_transmission, - # '20171006_RONCHI400_clear_45_median_tpt.txt') - - def load_quantum_efficiency(self): - """Load the quantum efficiency file and crop in wavelength using LAMBDA_MIN and LAMBDA_MAX. - - The input file must have two or three columns: - 1. wavelengths in nm - 2. transmissions between 0 and 1. - 3. uncertainties on the transmissions (optional) - - Returns - ------- - lambdas: array_like - The wavelengths array in nm. - transmissions: array_like - The transmission array, values are between 0 and 1. - uncertainties: array_like - The uncertainty on the transmission array (0 if file does not contain the info). - - Examples - -------- - >>> t = Throughput() - >>> parameters.LAMBDA_MIN = 500 - >>> lambdas, transmissions, errors = t.load_quantum_efficiency() - >>> print(lambdas[:3]) - [500.81855389 508.18553888 519.23601637] - >>> print(transmissions[:3]) - [0.74355972 0.75526932 0.76932084] - >>> print(errors[:3]) - [0. 0. 0.] - - """ - lambdas, transmissions, errors = load_transmission(self.filename_quantum_efficiency) - return lambdas, transmissions, errors - - def load_RG715(self): - """Load the quantum efficiency file and crop in wavelength using LAMBDA_MIN and LAMBDA_MAX. - - The input file must have two or three columns: - 1. wavelengths in nm - 2. transmissions between 0 and 1. - 3. uncertainties on the transmissions (optional) - - Returns - ------- - lambdas: array_like - The wavelengths array in nm. - transmissions: array_like - The transmission array, values are between 0 and 1. - uncertainties: array_like - The uncertainty on the transmission array (0 if file does not contain the info). - - Examples - -------- - >>> t = Throughput() - >>> parameters.LAMBDA_MIN = 700 - >>> lambdas, transmissions, errors = t.load_RG715() - >>> print(lambdas[:3]) - [701.899 704.054 705.491] - >>> print(transmissions[:3]) - [0.09726 0.13538 0.16826] - >>> print(errors[:3]) - [0. 0. 0.] - - """ - lambdas, transmissions, errors = load_transmission(self.filename_RG715) - return lambdas, transmissions, errors - - def load_FGB37(self): - """Load the quantum efficiency file and crop in wavelength using LAMBDA_MIN and LAMBDA_MAX. - - The input file must have two or three columns: - 1. wavelengths in nm - 2. transmissions between 0 and 1. - 3. uncertainties on the transmissions (optional) - - Returns - ------- - lambdas: array_like - The wavelengths array in nm. - transmissions: array_like - The transmission array, values are between 0 and 1. - uncertainties: array_like - The uncertainty on the transmission array (0 if file does not contain the info). - - Examples - -------- - >>> t = Throughput() - >>> parameters.LAMBDA_MIN = 500 - >>> lambdas, transmissions, errors = t.load_FGB37() - >>> print(lambdas[:3]) - [515.171 534.679 545.315] - >>> print(transmissions[:3]) - [0.89064 0.87043 0.8391 ] - >>> print(errors[:3]) - [0. 0. 0.] - - """ - lambdas, transmissions, errors = load_transmission(self.filename_FGB37) - return lambdas, transmissions, errors - - def load_telescope_throughput(self): - """Load the telescope throughput file and crop in wavelength using LAMBDA_MIN and LAMBDA_MAX. - - The input file must have two or three columns: - 1. wavelengths in nm - 2. transmissions between 0 and 1. - 3. uncertainties on the transmissions (optional) - - Returns - ------- - lambdas: array_like - The wavelengths array in nm. - transmissions: array_like - The transmission array, values are between 0 and 1. - uncertainties: array_like - The uncertainty on the transmission array (0 if file does not contain the info). - - Examples - -------- - >>> t = Throughput() - >>> parameters.LAMBDA_MIN = 500 - >>> lambdas, transmissions, errors = t.load_telescope_throughput() - >>> print(lambdas[:3]) - [501. 502. 503.] - >>> print(transmissions[:3]) - [0.77987732 0.78065328 0.78097758] - >>> print(errors[:3]) - [0. 0. 0.] - - """ - lambdas, transmissions, errors = load_transmission(self.filename_telescope_throughput) - return lambdas, transmissions, errors - - def load_total_throughput(self): - """Load the telescope throughput file and crop in wavelength using LAMBDA_MIN and LAMBDA_MAX. - - The input file must have two or three columns: - 1. wavelengths in nm - 2. transmissions between 0 and 1. - 3. uncertainties on the transmissions (optional) - - Returns - ------- - lambdas: array_like - The wavelengths array in nm. - transmissions: array_like - The transmission array, values are between 0 and 1. - uncertainties: array_like - The uncertainty on the transmission array (0 if file does not contain the info). - - Examples - -------- - >>> t = Throughput() - >>> parameters.LAMBDA_MIN = 500 - >>> lambdas, transmissions, errors = t.load_total_throughput() - >>> print(lambdas[:3]) - [501. 502. 503.] - >>> print(transmissions[:3]) - [0.16189332 0.16211692 0.16234082] - >>> print(errors[:3]) - [0.001309 0.00130761 0.00130621] - - """ - lambdas, transmissions, errors = load_transmission(self.filename_total_throughput) - return lambdas, transmissions, errors - - def load_mirror_reflectivity(self): - """Load the telescope throughput file and crop in wavelength using LAMBDA_MIN and LAMBDA_MAX. - - The input file must have two or three columns: - 1. wavelengths in nm - 2. transmissions between 0 and 1. - 3. uncertainties on the transmissions (optional) - - Returns - ------- - lambdas: array_like - The wavelengths array in nm. - transmissions: array_like - The transmission array, values are between 0 and 1. - uncertainties: array_like - The uncertainty on the transmission array (0 if file does not contain the info). - - Examples - -------- - >>> t = Throughput() - >>> parameters.LAMBDA_MIN = 500 - >>> lambdas, transmissions, errors = t.load_mirror_reflectivity() - >>> print(lambdas[:3]) - [501. 502. 503.] - >>> print(transmissions[:3]) - [0.93501 0.93527 0.93532] - >>> print(errors[:3]) - [0. 0. 0.] - """ - lambdas, transmissions, errors = load_transmission(self.filename_mirrors) - return lambdas, transmissions, errors - - def load_transmission(file_name): """Load the transmission files and crop in wavelength using LAMBDA_MIN and LAMBDA_MAX. @@ -260,9 +28,8 @@ def load_transmission(file_name): Examples -------- - >>> t = Throughput() >>> parameters.LAMBDA_MIN = 500 - >>> lambdas, transmissions, errors = load_transmission(t.filename_quantum_efficiency) + >>> lambdas, transmissions, errors = load_transmission(os.path.join(parameters.THROUGHPUT_DIR, "qecurve.txt")) >>> print(lambdas[:3]) [500.81855389 508.18553888 519.23601637] >>> print(transmissions[:3]) @@ -272,13 +39,15 @@ def load_transmission(file_name): """ data = np.loadtxt(file_name).T - x = data[0] - y = data[1] + lambdas = data[0] + sorted_indices = lambdas.argsort() + lambdas = lambdas[sorted_indices] + y = data[1][sorted_indices] err = np.zeros_like(y) if data.shape[0] == 3: - err = data[2] - indexes = np.where(np.logical_and(x > parameters.LAMBDA_MIN, x < parameters.LAMBDA_MAX)) - return x[indexes], y[indexes], err[indexes] + err = data[2][sorted_indices] + indexes = np.logical_and(lambdas > parameters.LAMBDA_MIN, lambdas < parameters.LAMBDA_MAX) + return lambdas[indexes], y[indexes], err[indexes] def plot_transmission_simple(ax, lambdas, transmissions, uncertainties=None, label="", title="", lw=2): @@ -307,24 +76,23 @@ def plot_transmission_simple(ax, lambdas, transmissions, uncertainties=None, la .. plot:: :include-source: - >>> from spectractor.simulation.throughput import Throughput >>> from spectractor.simulation.atmosphere import plot_transmission_simple >>> from spectractor import parameters >>> fig = plt.figure() >>> ax = plt.gca() - >>> t = Throughput() >>> parameters.LAMBDA_MIN = 500 - >>> lambdas, transmissions, errors = t.load_quantum_efficiency() + >>> lambdas, transmissions, errors = load_transmission(os.path.join(parameters.THROUGHPUT_DIR, "qecurve.txt")) >>> plot_transmission_simple(ax, lambdas, transmissions, errors, title="CTIO", label="Quantum efficiency") - >>> lambdas, transmissions, errors = t.load_mirror_reflectivity() + >>> lambdas, transmissions, errors = load_transmission(os.path.join(parameters.THROUGHPUT_DIR, "lsst_mirrorthroughput.txt")) >>> plot_transmission_simple(ax, lambdas, transmissions, errors, title="CTIO", label="Mirror 1") - >>> lambdas, transmissions, errors = t.load_FGB37() + >>> lambdas, transmissions, errors = load_transmission(os.path.join(parameters.THROUGHPUT_DIR, "FGB37.txt")) >>> plot_transmission_simple(ax, lambdas, transmissions, errors, title="CTIO", label="FGB37") - >>> lambdas, transmissions, errors = t.load_RG715() + >>> lambdas, transmissions, errors = load_transmission(os.path.join(parameters.THROUGHPUT_DIR, "RG715.txt")) >>> plot_transmission_simple(ax, lambdas, transmissions, errors, title="CTIO", label="RG715") - >>> lambdas, transmissions, errors = t.load_telescope_throughput() + >>> lambdas, transmissions, errors = load_transmission(os.path.join(parameters.THROUGHPUT_DIR, parameters.OBS_TELESCOPE_TRANSMISSION)) >>> plot_transmission_simple(ax, lambdas, transmissions, errors, title="CTIO", label="Telescope") >>> if parameters.DISPLAY: plt.show() + """ if uncertainties is None or np.all(np.isclose(uncertainties, np.zeros_like(transmissions))): ax.plot(lambdas, transmissions, "-", label=label, lw=lw) @@ -332,7 +100,7 @@ def plot_transmission_simple(ax, lambdas, transmissions, uncertainties=None, la ax.errorbar(lambdas, transmissions, yerr=uncertainties, label=label, lw=lw) if title != "": ax.set_title(title) - ax.set_xlabel("$\lambda$ [nm]") + ax.set_xlabel(r"$\lambda$ [nm]") ax.set_ylabel("Transmission") ax.set_xlim(parameters.LAMBDA_MIN, parameters.LAMBDA_MAX) ax.grid() @@ -340,45 +108,9 @@ def plot_transmission_simple(ax, lambdas, transmissions, uncertainties=None, la ax.legend(loc="best") -def plot_all_transmissions(title="Telescope transmissions"): - """Plot the transmission files. - - Parameters - ---------- - title: str, optional - The title of the plot. - - Examples - -------- - >>> plot_all_transmissions(title="CTIO") - - """ - - plt.figure() - ax = plt.gca() - t = Throughput() - lambdas, transmissions, errors = t.load_quantum_efficiency() - plot_transmission_simple(ax, lambdas, transmissions, errors, label="Quantum efficiency") - lambdas, transmissions, errors = t.load_mirror_reflectivity() - plot_transmission_simple(ax, lambdas, transmissions, errors, label="Mirror") - lambdas, transmissions, errors = t.load_FGB37() - plot_transmission_simple(ax, lambdas, transmissions, errors, label="FGB37") - lambdas, transmissions, errors = t.load_RG715() - plot_transmission_simple(ax, lambdas, transmissions, errors, label="RG715") - lambdas, transmissions, errors = t.load_telescope_throughput() - plot_transmission_simple(ax, lambdas, transmissions, errors, label="Telescope") - lambdas, transmissions, errors = t.load_total_throughput() - plot_transmission_simple(ax, lambdas, transmissions, errors, label="Total throughput file", - title=title, lw=4) - if parameters.DISPLAY: - plt.show() - else: - plt.close('all') - - class TelescopeTransmission: - def __init__(self, filter_name=""): + def __init__(self, filter_label=""): """Transmission of the telescope as product of the following transmissions: - mirrors @@ -388,7 +120,7 @@ def __init__(self, filter_name=""): Parameters ---------- - filter_name: str, optional + filter_label: str, optional The filter string name. Examples @@ -398,7 +130,7 @@ def __init__(self, filter_name=""): """ self.my_logger = set_logger(self.__class__.__name__) - self.filter_name = filter_name + self.filter_label = filter_label self.transmission = None self.transmission_err = None self.load_transmission() @@ -414,48 +146,41 @@ def load_transmission(self): Examples -------- >>> t = TelescopeTransmission() - >>> assert t.transmission is not None - >>> assert t.transmission_err is not None >>> t.plot_transmission() - """ - ''' - # QE - wl,qe=ctio.load_quantum_efficiency(datapath) - self.qe=interp1d(wl,qe,kind='linear',bounds_error=False,fill_value=0.) - - # Throughput - wl,trt=ctio.load_telescope_throughput(datapath) - self.to=interp1d(wl,trt,kind='linear',bounds_error=False,fill_value=0.) - - # Mirrors - wl,trm=ctio.load_mirror_reflectivity(datapath) - self.tm=interp1d(wl,trm,kind='linear',bounds_error=False,fill_value=0.) - ''' - throughput = Throughput(input_directory=parameters.THROUGHPUT_DIR) - wl, trm, err = throughput.load_total_throughput() + >>> t2 = TelescopeTransmission(filter_label="RG715") + >>> t2.plot_transmission() + + .. doctest: + :hide: + + >>> assert t.transmission is not None + >>> assert t.transmission_err is not None + >>> assert t2.transmission is not None + >>> assert t2.transmission_err is not None + >>> assert np.sum(t.transmission(parameters.LAMBDAS)) > np.sum(t2.transmission(parameters.LAMBDAS)) + + """ + wl, trm, err = load_transmission(os.path.join(parameters.THROUGHPUT_DIR, + parameters.OBS_FULL_INSTRUMENT_TRANSMISSON)) to = interp1d(wl, trm, kind='linear', bounds_error=False, fill_value=0.) err = np.sqrt(err ** 2 + parameters.OBS_TRANSMISSION_SYSTEMATICS ** 2) to_err = interp1d(wl, err, kind='linear', bounds_error=False, fill_value=0.) - # Filter RG715 - # wl, trg, err = throughput.load_RG715() - # tfr = interp1d(wl, trg, kind='linear', bounds_error=False, fill_value=0.) - # - # Filter FGB37 - # wl, trb, err = throughput.load_FGB37() - # tfb = interp1d(wl, trb, kind='linear', bounds_error=False, fill_value=0.) - - # if self.filter_name == "RG715": - # TF = tfr - # elif self.filter_name == "FGB37": - # TF = tfb - # else: - TF = lambda x: np.ones_like(x).astype(float) + TF = lambda x: 1 + TF_err = lambda x: 0 + if self.filter_label != "" and "empty" not in self.filter_label.lower(): + if ".txt" in self.filter_label: + filter_filename = self.filter_label + else: + filter_filename = self.filter_label + ".txt" + wl, trb, err = load_transmission(os.path.join(parameters.THROUGHPUT_DIR, filter_filename)) + TF = interp1d(wl, trb, kind='linear', bounds_error=False, fill_value=0.) + TF_err = interp1d(wl, err, kind='linear', bounds_error=False, fill_value=0.) # self.transmission=lambda x: self.qe(x)*self.to(x)*(self.tm(x)**2)*self.tf(x) self.transmission = lambda x: to(x) * TF(x) - self.transmission_err = lambda x: to_err(x) + self.transmission_err = lambda x: np.sqrt(to_err(x)**2 + TF_err(x)**2) return self.transmission def plot_transmission(self): @@ -475,6 +200,31 @@ def plot_transmission(self): else: plt.close('all') + def reset_lambda_range(self, transmission_threshold=1e-4): + """Reset the wavelength range. + + Parameters + ---------- + transmission_threshold: float + Threshold to set the wavelength range using the transmission integral (default: 1e-4). + + Examples + -------- + >>> t = TelescopeTransmission(filter_label="FGB37") + >>> print(parameters.LAMBDA_MAX, parameters.LAMBDA_MIN) + 1100 300 + >>> t.reset_lambda_range() + >>> print(f'{parameters.LAMBDA_MAX:.0f}', f'{parameters.LAMBDA_MIN:.0f}') + 760 300 + + """ + integral = np.cumsum(self.transmission(parameters.LAMBDAS)) + lambda_min = parameters.LAMBDAS[np.argmin(np.abs(integral - transmission_threshold))] + lambda_max = parameters.LAMBDAS[np.argmin(np.abs(integral - (integral[-1] - transmission_threshold)))] + reset_lambda_range(lambda_min, lambda_max) + self.my_logger.info(f"\n\tWith filter {self.filter_label}, set parameters.LAMBDA_MIN={parameters.LAMBDA_MIN} " + f"and parameters.LAMBDA_MAX={parameters.LAMBDA_MAX}.") + if __name__ == "__main__": import doctest diff --git a/spectractor/tools.py b/spectractor/tools.py index a76f46686..6ef6ef51f 100644 --- a/spectractor/tools.py +++ b/spectractor/tools.py @@ -2398,6 +2398,30 @@ def flip_and_rotate_radec_to_image_xy_coordinates(ra, dec, camera_angle=0, flip_ return x, y +def reset_lambda_range(lambda_min, lambda_max): + """Reset the lambda range. + + Parameters + ---------- + lambda_min: float + Minimum wavelength. + lambda_max: float + Maximum wavelength. + + Examples + -------- + >>> print(parameters.LAMBDA_MAX, parameters.LAMBDA_MIN) + 1100 300 + >>> reset_lambda_range(500, 550) + >>> print(parameters.LAMBDA_MAX, parameters.LAMBDA_MIN) + 550 500 + + """ + parameters.LAMBDA_MIN = max(lambda_min, parameters.LAMBDA_MIN) + parameters.LAMBDA_MAX = min(lambda_max, parameters.LAMBDA_MAX) + parameters.LAMBDAS = np.arange(parameters.LAMBDA_MIN, parameters.LAMBDA_MAX, parameters.LAMBDA_STEP) + + if __name__ == "__main__": import doctest diff --git a/tests/test_extractor.py b/tests/test_extractor.py index e6c928213..79b4164ec 100644 --- a/tests/test_extractor.py +++ b/tests/test_extractor.py @@ -31,7 +31,7 @@ def test_extractor_ctio(): parameters.CCD_REBIN = 2 for file_name in file_names: - tag = file_name.split('/')[-1].replace("sim","reduc") + tag = file_name.split('/')[-1].replace("sim", "reduc") disperser_label, target_label, xpos, ypos = logbook.search_for_image(tag) if target_label is None or xpos is None or ypos is None: continue @@ -109,10 +109,10 @@ def test_extractor_ctio_planetary_nebula(): def extractor_auxtel(): file_names = ['tests/data/calexp_2020031500162-EMPTY_ronchi90lpmm-det000.fits'] # image 1 - #file_names = ['tests/data/calexp_2020031200313-EMPTY_ronchi90lpmm-det000.fits'] # image 2 - #file_names = ['tests/data/calexp_2020022100767-EMPTY_ronchi90lpmm-det000.fits'] # image 3 - #file_names = ['tests/data//calexp_2020021800154-EMPTY_ronchi90lpmm-det000.fits'] # image 4 - #tests/data/auxtel_first_light-1.fits'] + # file_names = ['tests/data/calexp_2020031200313-EMPTY_ronchi90lpmm-det000.fits'] # image 2 + # file_names = ['tests/data/calexp_2020022100767-EMPTY_ronchi90lpmm-det000.fits'] # image 3 + # file_names = ['tests/data//calexp_2020021800154-EMPTY_ronchi90lpmm-det000.fits'] # image 4 + # tests/data/auxtel_first_light-1.fits'] # logbook = LogBook(logbook='./ctiofulllogbook_jun2017_v5.csv') parameters.VERBOSE = True diff --git a/tests/test_fullchain.py b/tests/test_fullchain.py index 9490d66c6..be9beb24b 100644 --- a/tests/test_fullchain.py +++ b/tests/test_fullchain.py @@ -164,7 +164,7 @@ def fullchain_run(sim_image="./tests/data/sim_20170530_134.fits"): burnin=2, nbins=10, verbose=1, plot=True, live_fit=False) run_spectrogram_minimisation(w, method="newton") nsigma = 5 - labels = ["A1_T", "A2_T", "OZONE_T", "PWV_T", "VAOD_T", "D2CCD_T"] + labels = ["A1_T", "A2_T", "OZONE_T", "PWV_T", "VAOD_T"] indices = [0, 1, 2, 3, 4, 5] A1, A2, ozone, pwv, aerosols, D, shift_x, shift_y, shift_t, B, *psf_poly_params = w.p assert w.costs[-1]/w.data.size < 0.65