rawplot
Advanced tools
+3
-0
@@ -164,2 +164,3 @@ # Byte-compiled / optimized / DLL files | ||
| *.csv | ||
| *.ecsv | ||
| *.db | ||
@@ -174,1 +175,3 @@ *.txt | ||
| dataset/ | ||
| .rufff-cache/ | ||
| spectess/ |
+2
-3
| Metadata-Version: 2.1 | ||
| Name: rawplot | ||
| Version: 0.9.8 | ||
| Version: 0.9.9 | ||
| Summary: Plotting tools to analyze and characterize RGB imagers using Bayer raw images | ||
@@ -47,3 +47,3 @@ Author-email: Rafael González <rafael08@ucm.es>, Jaime Zamorano <jzamoran@ucm.es> | ||
| Requires-Dist: astropy | ||
| Requires-Dist: lica[raw] | ||
| Requires-Dist: lica[lica,raw] | ||
@@ -75,3 +75,2 @@ # rawplot | ||
| ls -1 .venv/bin/raw* | ||
| venv/bin/rawplot-filters | ||
| .venv/bin/rawplot-hv | ||
@@ -78,0 +77,0 @@ .venv/bin/rawplot-image |
+3
-3
@@ -30,3 +30,3 @@ | ||
| "astropy", | ||
| "lica[raw]", | ||
| "lica[raw,lica]", | ||
| ] | ||
@@ -50,4 +50,4 @@ | ||
| rawplot-photodiode = "rawplot.photodiode:main" | ||
| rawplot-filters = "rawplot.filters:main" | ||
| [build-system] | ||
@@ -79,2 +79,2 @@ requires = ["setuptools >= 45", "wheel", "setuptools_scm[toml]>=6.2"] | ||
| [tool.setuptools.package-data] | ||
| "rawplot.resources" = ["*.csv", "*.mplstyle"] | ||
| "rawplot.resources" = ["*.mplstyle"] |
+0
-1
@@ -26,3 +26,2 @@ # rawplot | ||
| ls -1 .venv/bin/raw* | ||
| venv/bin/rawplot-filters | ||
| .venv/bin/rawplot-hv | ||
@@ -29,0 +28,0 @@ .venv/bin/rawplot-image |
| [console_scripts] | ||
| rawplot-filters = rawplot.filters:main | ||
| rawplot-hv = rawplot.hv:main | ||
@@ -4,0 +3,0 @@ rawplot-image = rawplot.image:main |
| Metadata-Version: 2.1 | ||
| Name: rawplot | ||
| Version: 0.9.8 | ||
| Version: 0.9.9 | ||
| Summary: Plotting tools to analyze and characterize RGB imagers using Bayer raw images | ||
@@ -47,3 +47,3 @@ Author-email: Rafael González <rafael08@ucm.es>, Jaime Zamorano <jzamoran@ucm.es> | ||
| Requires-Dist: astropy | ||
| Requires-Dist: lica[raw] | ||
| Requires-Dist: lica[lica,raw] | ||
@@ -75,3 +75,2 @@ # rawplot | ||
| ls -1 .venv/bin/raw* | ||
| venv/bin/rawplot-filters | ||
| .venv/bin/rawplot-hv | ||
@@ -78,0 +77,0 @@ .venv/bin/rawplot-image |
@@ -5,2 +5,2 @@ matplotlib | ||
| astropy | ||
| lica[raw] | ||
| lica[lica,raw] |
@@ -19,3 +19,2 @@ .gitignore | ||
| src/rawplot/_version.py | ||
| src/rawplot/filters.py | ||
| src/rawplot/hv.py | ||
@@ -41,4 +40,2 @@ src/rawplot/image.py | ||
| src/rawplot/ptc/variance_curves.py | ||
| src/rawplot/resources/Ham-S2281-04.csv | ||
| src/rawplot/resources/OSI-11-01-004-10D.csv | ||
| src/rawplot/resources/__init__.py | ||
@@ -45,0 +42,0 @@ src/rawplot/resources/global.mplstyle |
@@ -1,3 +0,3 @@ | ||
| from ._version import __version__ | ||
| from ._version import __version__ as __version__ | ||
| __all__ = ["__version__"] |
@@ -15,3 +15,3 @@ # file generated by setuptools_scm | ||
| __version__ = version = '0.9.8' | ||
| __version_tuple__ = version_tuple = (0, 9, 8) | ||
| __version__ = version = '0.9.9' | ||
| __version_tuple__ = version_tuple = (0, 9, 9) |
+117
-91
@@ -13,7 +13,6 @@ # -*- coding: utf-8 -*- | ||
| import csv | ||
| from argparse import Namespace, ArgumentParser | ||
| import logging | ||
| from typing import Tuple | ||
| from importlib.resources import files | ||
| # --------------------- | ||
@@ -23,7 +22,12 @@ # Thrid-party libraries | ||
| import numpy as np | ||
| import matplotlib.pyplot as plt | ||
| from astropy.table import Table, Column | ||
| import astropy.units as u | ||
| import lica | ||
| from lica.cli import execute | ||
| from lica.photodiode import PhotodiodeModel, COL, BENCH | ||
| # ------------------------ | ||
@@ -33,3 +37,3 @@ # Own modules and packages | ||
| from ._version import __version__ | ||
| from . import __version__ | ||
@@ -40,5 +44,2 @@ # ---------------- | ||
| OSI_PHOTODIODE = "OSI-11-01-004-10D" | ||
| HAMAMATSU_PHOTODIODE = "Ham-S2281-04" | ||
| # ----------------------- | ||
@@ -61,12 +62,27 @@ # Module global variables | ||
| def vbench(x: str) -> float: | ||
| x = float(x) | ||
| if not (BENCH.WAVE_START <= x <= BENCH.WAVE_END): | ||
| raise ValueError(f"{x} outside LICA Optical Test Bench range") | ||
| return x | ||
| def mpl_photodiode_plot_loop(title, wavelength, responsivity, qe, xtitle, ytitle): | ||
| def get_labels(x: Column, y: Column) -> Tuple[str, str]: | ||
| """Get the labels for a table column, using units if necessary""" | ||
| xunit = x.unit | ||
| yunit = y.unit | ||
| xlabel = x.name + f" [{xunit}]" if xunit != u.dimensionless_unscaled else x.name | ||
| ylabel = y.name + f" [{yunit}]" if yunit != u.dimensionless_unscaled else y.name | ||
| return xlabel, ylabel | ||
| def plot_photodiode(table: Table, title: str, marker: str): | ||
| fig, axes = plt.subplots(nrows=1, ncols=1) | ||
| fig.suptitle(title) | ||
| axes.set_xlabel(xtitle) | ||
| axes.set_ylabel(f"{ytitle}") | ||
| xlabel, ylabel = get_labels(table[COL.WAVE], table[COL.RESP]) | ||
| axes.set_xlabel(xlabel) | ||
| axes.set_ylabel(ylabel + " & " + COL.QE) | ||
| axes.grid(True, which="major", color="silver", linestyle="solid") | ||
| axes.grid(True, which="minor", color="silver", linestyle=(0, (1, 10))) | ||
| axes.plot(wavelength, responsivity, marker="o", linewidth=0, label="Responsivity [A/W]") | ||
| axes.plot(wavelength, qe, marker="o", linewidth=0, label="Quantum Efficiency") | ||
| axes.plot(table[COL.WAVE], table[COL.RESP], marker=marker, linewidth=0, label=COL.RESP) | ||
| axes.plot(table[COL.WAVE], table[COL.QE], marker=marker, linewidth=0, label=COL.QE) | ||
| axes.minorticks_on() | ||
@@ -77,66 +93,52 @@ axes.legend() | ||
| def photodiode_export(model, resolution, path): | ||
| log.info("Exporting model %s, resolution %d nm to file %s", model, resolution, path) | ||
| f = files("rawplot.resources").joinpath(model + ".csv") | ||
| with f.open("r") as csvfile: | ||
| lines = csvfile.readlines() | ||
| with open(path, "w") as exportfile: | ||
| exportfile.writelines(lines[0:1]) | ||
| exportfile.writelines(lines[1::resolution]) | ||
| # --------------------------------- | ||
| # Exported non-CLI (i.e to Jupyter) | ||
| # --------------------------------- | ||
| def photodiode_load(model, resolution): | ||
| """Return dictionaries whose keys are the wavelengths""" | ||
| f = files("rawplot.resources").joinpath(model + ".csv") | ||
| with f.open("r") as csvfile: | ||
| reader = csv.DictReader(csvfile, delimiter=";") | ||
| responsivity = dict() | ||
| qe = dict() | ||
| for row in reader: | ||
| responsivity[int(row["Wavelength (nm)"])] = float(row["Responsivity (A/W)"]) | ||
| qe[int(row["Wavelength (nm)"])] = float(row["Quantum Efficiency"]) | ||
| # resample dictionaries if necessary for 5 nm resolution | ||
| responsivity = {key: val for key, val in responsivity.items() if key % resolution == 0} | ||
| qe = {key: val for key, val in qe.items() if key % resolution == 0} | ||
| return responsivity, qe | ||
| def plot( | ||
| model: str, | ||
| resolution: int, | ||
| wave_start: int = BENCH.WAVE_START, | ||
| wave_end: int = BENCH.WAVE_START, | ||
| marker: str = ".", | ||
| ) -> None: | ||
| log.info(" === PHOTODIODE RESPONSIVITY & QE PLOT === ") | ||
| table = lica.photodiode.load(model, resolution, wave_start, wave_end, cross_calibrated=True) | ||
| log.info("Table info is\n%s", table.info) | ||
| plot_photodiode( | ||
| title=f"{model} characteristics @ {resolution} nm", | ||
| table=table, | ||
| marker=marker, | ||
| ) | ||
| def export( | ||
| path: str, | ||
| model: str, | ||
| resolution: int, | ||
| wave_start: int = BENCH.WAVE_START, | ||
| wave_end: int = BENCH.WAVE_START, | ||
| ) -> None: | ||
| lica.photodiode.export(path, model, resolution, wave_start, wave_end) | ||
| # ----------------------- | ||
| # AUXILIARY MAIN FUNCTION | ||
| # ----------------------- | ||
| # ============= | ||
| # CLI INTERFACE | ||
| # ============= | ||
| def export(args): | ||
| def cli_export(args: Namespace) -> None: | ||
| log.info(" === PHOTODIODE RESPONSIVITY & QE EXPORT === ") | ||
| photodiode_export(args.model, args.resolution, args.csv_file) | ||
| export(args.ecsv_file, args.model, args.resolution, args.wave_start, args.wave_end) | ||
| def plot(args): | ||
| def cli_plot(args: Namespace) -> None: | ||
| log.info(" === PHOTODIODE RESPONSIVITY & QE PLOT === ") | ||
| responsivity, qe = photodiode_load(args.model, args.resolution) | ||
| wavelength = np.array([key for key, value in responsivity.items()]) | ||
| responsivity = np.array([value for key, value in responsivity.items()]) | ||
| qe = np.array([value for key, value in qe.items()]) | ||
| mpl_photodiode_plot_loop( | ||
| title=f"{args.model} characteristics", | ||
| wavelength=wavelength, | ||
| responsivity=responsivity, | ||
| qe=qe, | ||
| xtitle="Wavelengnth [nm]", | ||
| ytitle="Responsivity [A/W] & Quantum Efficiency", | ||
| ) | ||
| plot(args.model, args.resolution, args.wave_start, args.wave_end) | ||
| COMMAND_TABLE = { | ||
| "plot": plot, | ||
| "export": export, | ||
| } | ||
| def cli_photodiode(args: Namespace) -> None: | ||
| args.func(args) | ||
| def photodiode(args): | ||
| command = args.command | ||
| func = COMMAND_TABLE[command] | ||
| func(args) | ||
| # =================================== | ||
@@ -147,18 +149,13 @@ # MAIN ENTRY POINT SPECIFIC ARGUMENTS | ||
| def add_args(parser): | ||
| subparser = parser.add_subparsers(dest="command") | ||
| parser_plot = subparser.add_parser("plot", help="Plot Responsivity & Quantum Efficiency") | ||
| parser_expo = subparser.add_parser( | ||
| "export", help="Export Responsivity & Quantum Efficiency to CSV file" | ||
| ) | ||
| parser_plot.add_argument( | ||
| def common_parser() -> ArgumentParser: | ||
| """Common Options for subparsers""" | ||
| parser = ArgumentParser(add_help=False) | ||
| parser.add_argument( | ||
| "-m", | ||
| "--model", | ||
| default=OSI_PHOTODIODE, | ||
| choices=(HAMAMATSU_PHOTODIODE, OSI_PHOTODIODE), | ||
| default=PhotodiodeModel.OSI, | ||
| choices=[p for p in PhotodiodeModel], | ||
| help="Photodiode model. (default: %(default)s)", | ||
| ) | ||
| parser_plot.add_argument( | ||
| parser.add_argument( | ||
| "-r", | ||
@@ -168,23 +165,49 @@ "--resolution", | ||
| default=5, | ||
| choices=(1, 5), | ||
| choices=tuple(range(1, 11)), | ||
| help="Wavelength resolution (nm). (default: %(default)s nm)", | ||
| ) | ||
| parser.add_argument( | ||
| "-w1", | ||
| "--wave-start", | ||
| type=vbench, | ||
| metavar="<W1 nm>", | ||
| default=BENCH.WAVE_START, | ||
| help="Start wavelength in nm (defaults to %(default)d)", | ||
| ) | ||
| parser.add_argument( | ||
| "-w2", | ||
| "--wave-end", | ||
| type=vbench, | ||
| metavar="<W2 nm>", | ||
| default=BENCH.WAVE_END, | ||
| help="End wavelength in nm (defaults to %(default)d)", | ||
| ) | ||
| parser_expo.add_argument( | ||
| "-m", | ||
| "--model", | ||
| default=OSI_PHOTODIODE, | ||
| choices=(HAMAMATSU_PHOTODIODE, OSI_PHOTODIODE), | ||
| help="Photodiode model. (default: %(default)s)", | ||
| return parser | ||
| def add_args(parser) -> None: | ||
| subparser = parser.add_subparsers(dest="command") | ||
| parser_plot = subparser.add_parser( | ||
| "plot", parents=[common_parser()], help="Plot Responsivity & Quantum Efficiency" | ||
| ) | ||
| parser_expo.add_argument( | ||
| "-r", | ||
| "--resolution", | ||
| type=int, | ||
| default=5, | ||
| choices=(1, 5), | ||
| help="Wavelength resolution (nm). (default: %(default)s nm)", | ||
| parser_plot.set_defaults(func=cli_plot) | ||
| parser_expo = subparser.add_parser( | ||
| "export", | ||
| parents=[common_parser()], | ||
| help="Export Responsivity & Quantum Efficiency to CSV file", | ||
| ) | ||
| parser_expo.set_defaults(func=cli_export) | ||
| # ------------------------------------------------------------------------------------ | ||
| parser_plot.add_argument( | ||
| "--marker", | ||
| type=str, | ||
| choices=[".", "o", "+", "*"], | ||
| default=".", | ||
| help="Plot Marker", | ||
| ) | ||
| # ------------------------------------------------------------------------------------ | ||
| parser_expo.add_argument( | ||
| "-f", "--csv-file", type=str, required=True, help="CSV file name to export" | ||
| "-f", "--ecsv-file", type=str, required=True, help="ECSV file name to export" | ||
| ) | ||
@@ -200,3 +223,3 @@ | ||
| execute( | ||
| main_func=photodiode, | ||
| main_func=cli_photodiode, | ||
| add_args_func=add_args, | ||
@@ -207,1 +230,4 @@ name=__name__, | ||
| ) | ||
| __all__ = ["plot", "export"] |
+282
-231
@@ -14,4 +14,6 @@ # -*- coding: utf-8 -*- | ||
| import re | ||
| import math | ||
| import logging | ||
| from argparse import ArgumentParser | ||
| from enum import IntEnum | ||
| from typing import Union, Dict, Any, Sequence, Iterable | ||
@@ -25,7 +27,16 @@ # --------------------- | ||
| import astropy.io.ascii | ||
| import astropy.units as u | ||
| from astropy.table import Table | ||
| from astropy.constants import astropyconst20 as const | ||
| from lica import StrEnum | ||
| from lica.cli import execute | ||
| from lica.validators import vdir, vfile, vfloat, vfloat01, vflopath | ||
| from lica.raw.loader.roi import Roi, NormRoi | ||
| from lica.raw.analyzer.image import ImageStatistics | ||
| from lica.csv import read_csv | ||
| import lica.photodiode | ||
| from lica.photodiode import PhotodiodeModel, COL | ||
| # ------------------------ | ||
@@ -36,5 +47,28 @@ # Own modules and packages | ||
| from ._version import __version__ | ||
| from .util.common import common_list_info, make_plot_title_from, export_spectra_to_csv | ||
| from .photodiode import photodiode_load, OSI_PHOTODIODE, HAMAMATSU_PHOTODIODE | ||
| from .util.common import common_list_info, make_plot_title_from | ||
| # ----------------- | ||
| # Additiona classes | ||
| # ----------------- | ||
| BiasType = Union[float, str] | ||
| DarkType = Union[float, str] | ||
| class TBCOL(StrEnum): | ||
| """Additiona columns names for data produced by Scan.exe or TestBench""" | ||
| INDEX = "Index" # Index number 1, 2, etc produced in the CSV file | ||
| CURRENT = "Electrical Current" # | ||
| READ_NOISE = "Read Noise" | ||
| class PhDOption(IntEnum): | ||
| """Photodiode plot options""" | ||
| RAW = 1 | ||
| NORM = 2 | ||
| SNR = 3 | ||
| # ---------------- | ||
@@ -46,6 +80,6 @@ # Module constants | ||
| # Photodiode readings header columns | ||
| WAVELENGTH_CSV_HEADER = "wavelength (nm)" | ||
| CURRENT_CSV_HEADER = "current (A)" | ||
| READ_NOISE_CSV_HEADER = "read noise (A)" | ||
| MONOCROMATOR_FILTERS_LABELS = ( | ||
| {"label": r"$BG38 \Rightarrow OG570$", "wave": 570, "style": "--"}, | ||
| {"label": r"$OG570\Rightarrow RG830$", "wave": 860, "style": "-."}, | ||
| ) | ||
@@ -69,3 +103,27 @@ # ----------------------- | ||
| # Define electron as a unit of charge | ||
| e_ = u.def_unit('e-', 1 * const.e) | ||
| def qe_names(channels: Sequence[str]) -> Sequence[str]: | ||
| return list(map(lambda x: "QE " + x, channels)) | ||
| def qe_units(channels: Sequence[str]) -> Sequence[Any]: | ||
| return list(map(lambda x: u.dimensionless_unscaled, channels)) | ||
| def read_manual_csv(path: str) -> Table: | ||
| """Load CSV files produced by manually copying LICA TestBench.exe into a CSV file""" | ||
| table = astropy.io.ascii.read( | ||
| path, | ||
| delimiter=";", | ||
| data_start=1, | ||
| names=(COL.WAVE, TBCOL.CURRENT, TBCOL.READ_NOISE), | ||
| converters={COL.WAVE: np.float64, TBCOL.CURRENT: np.float64, TBCOL.READ_NOISE: np.float64}, | ||
| ) | ||
| table[COL.WAVE] = np.round(table[COL.WAVE], decimals=0) * u.nm | ||
| table[TBCOL.CURRENT] = np.abs(table[TBCOL.CURRENT]) * u.A | ||
| table[TBCOL.READ_NOISE] = table[TBCOL.READ_NOISE] * u.A | ||
| return table | ||
| def mpl_photodiode_plot_loop(title, x, y, xtitle, ytitle, **kwargs): | ||
@@ -149,3 +207,3 @@ fig, axes = plt.subplots(nrows=1, ncols=1) | ||
| def get_used_wavelengths(file_list, channels): | ||
| def get_used_wavelengths(file_list: Iterable[str], channels: Sequence[str]): | ||
| M = len(channels) | ||
@@ -170,26 +228,24 @@ data = list() | ||
| result = np.tile(result, M).reshape(M, len(data)) | ||
| log.info("Wavelengthss array shape is %s", result.shape) | ||
| log.info("Wavelength array shape is %s", result.shape) | ||
| return result | ||
| def photodiode_readings_to_arrays(csv_path): | ||
| response = read_csv(csv_path) | ||
| wavelength = np.array([int(entry[WAVELENGTH_CSV_HEADER]) for entry in response]) | ||
| current = np.array([math.fabs(float(entry[CURRENT_CSV_HEADER])) for entry in response]) | ||
| read_noise = np.array([float(entry[READ_NOISE_CSV_HEADER]) for entry in response]) | ||
| log.info("Got %d photodiode readings", wavelength.shape[0]) | ||
| return wavelength, current, read_noise | ||
| # --------------------- | ||
| # Exported, non-CLI API | ||
| # --------------------- | ||
| # ----------------------- | ||
| # AUXILIARY MAIN FUNCTION | ||
| # ----------------------- | ||
| def raw_spectrum(args): | ||
| log.info(" === DRAFT SPECTRAL RESPONSE PLOT === ") | ||
| file_list, roi, n_roi, channels, metadata = common_list_info(args) | ||
| def raw_spectrum( | ||
| file_list: Iterable[str], | ||
| roi: Roi, | ||
| n_roi: NormRoi, | ||
| channels=Sequence[str], | ||
| metadata=Dict[str, Any], | ||
| every: int = 1, | ||
| bias: BiasType = None, | ||
| dark: DarkType = None, | ||
| ): | ||
| title = make_plot_title_from("Draft Spectral Response plot", metadata, roi) | ||
| wavelength = get_used_wavelengths(file_list, channels) | ||
| exptime, signal = signal_from(file_list, n_roi, channels, args.bias, args.dark, args.every) | ||
| exptime, signal = signal_from(file_list, n_roi, channels, bias, dark, every) | ||
| mpl_spectra_plot_loop( | ||
@@ -205,67 +261,17 @@ title=title, | ||
| # Optional arguments to be handled by the plotting function | ||
| filters=[ | ||
| {"label": r"$BG38 \Rightarrow OG570$", "wave": 570, "style": "--"}, | ||
| {"label": r"$OG570\Rightarrow RG830$", "wave": 860, "style": "-."}, | ||
| ], # where filters were changesd | ||
| filters=MONOCROMATOR_FILTERS_LABELS, # where filters were changesd | ||
| ) | ||
| def corrected_spectrum(args): | ||
| log.info(" === COMPLETE SPECTRAL RESPONSE PLOT === ") | ||
| responsivity, qe = photodiode_load(args.model, args.resolution) | ||
| log.info( | ||
| "Read %s reference responsivity values at %d nm resolution from %s", | ||
| len(responsivity), | ||
| args.resolution, | ||
| args.model, | ||
| ) | ||
| file_list, roi, n_roi, channels, metadata = common_list_info(args) | ||
| wavelength, current, read_noise = photodiode_readings_to_arrays(args.csv_file) | ||
| qe = np.array( | ||
| [qe[w] for w in wavelength] | ||
| ) # Only use those wavelenghts actually used in the CSV sequence | ||
| current = current / np.max(current) # Normalize photodiode current | ||
| title = make_plot_title_from("Corrected Spectral Response plot", metadata, roi) | ||
| wavelength = np.tile(wavelength, len(channels)).reshape(len(channels), -1) | ||
| exptime, signal = signal_from(file_list, n_roi, channels, args.bias, args.dark, args.every) | ||
| signal = qe * signal / current | ||
| signal = signal / np.max(signal) # Normalize signal to its absolute maxímun for all channels | ||
| if args.export: | ||
| log.info("exporting to CSV file(s)") | ||
| export_spectra_to_csv( | ||
| labels=channels, | ||
| wavelength=wavelength[0], | ||
| signal=signal, | ||
| mode=args.export, | ||
| units=args.units, | ||
| wave_last=args.wavelength_last, | ||
| ) | ||
| mpl_spectra_plot_loop( | ||
| title=title, | ||
| channels=channels, | ||
| plot_func=plot_raw_spectral, | ||
| xtitle="Wavelength [nm]", | ||
| ytitle="Signal (normalized)", | ||
| ylabel="good", | ||
| x=wavelength, | ||
| y=signal, | ||
| # Optional arguments to be handled by the plotting function | ||
| ) | ||
| def photodiode_spectrum(args): | ||
| log.info(" === PHOTODIODE SPECTRAL RESPONSET PLOT === ") | ||
| wavelength, current, read_noise = photodiode_readings_to_arrays(args.csv_file) | ||
| responsivity, qe = photodiode_load(args.model, args.resolution) | ||
| qe = np.array( | ||
| [qe[w] for w in wavelength] | ||
| ) # Only use those wavelenghts actually used in the CSV sequence | ||
| if args.raw_readings: | ||
| def photodiode_spectrum(path: str, model: str, option: PhDOption, resolution: int) -> None: | ||
| readings = read_manual_csv(path) | ||
| reference = lica.photodiode.load(model=model, resolution=resolution) | ||
| if option == PhDOption.RAW: | ||
| title = "Raw Photodiode Signal vs Wavelength" | ||
| y = current | ||
| y = readings[TBCOL.CURRENT] | ||
| ytitle = "Current [A]" | ||
| ylogscale = False | ||
| elif args.normalized: | ||
| elif option == PhDOption.NORM: | ||
| title = "Raw Photodiode Signal vs Wavelength" | ||
| y = current / np.max(current) | ||
| y = readings[TBCOL.CURRENT] / np.max(readings[TBCOL.CURRENT]) | ||
| ytitle = "Current (normalized)" | ||
@@ -275,3 +281,3 @@ ylogscale = False | ||
| title = "Photodiode SNR vs Wavelength" | ||
| y = current / read_noise | ||
| y = readings[TBCOL.CURRENT] / readings[TBCOL.READ_NOISE] | ||
| ytitle = "SNR" | ||
@@ -283,96 +289,131 @@ ylogscale = True | ||
| ytitle=ytitle, | ||
| x=wavelength, | ||
| x=readings[COL.WAVE], | ||
| y=y, | ||
| # Optional arguments to be handled by the plotting function | ||
| ylogscale=ylogscale, | ||
| filters=[ | ||
| {"label": r"$BG38 \Rightarrow OG570$", "wave": 570, "style": "--"}, | ||
| {"label": r"$OG570\Rightarrow RG830$", "wave": 860, "style": "-."}, | ||
| ], # where filters were changesd | ||
| qe=qe if args.normalized else None, | ||
| photodiode=args.model if args.normalized else None, | ||
| filters=MONOCROMATOR_FILTERS_LABELS, # where filters were changesd | ||
| qe=reference[COL.QE] if option == PhDOption.NORM else None, | ||
| photodiode=model if option == PhDOption.NORM else None, | ||
| ) | ||
| COMMAND_TABLE = { | ||
| "raw": raw_spectrum, | ||
| "corrected": corrected_spectrum, | ||
| "photodiode": photodiode_spectrum, | ||
| } | ||
| def corrected_spectrum( | ||
| file_list: Iterable[str], | ||
| roi: Roi, | ||
| n_roi: NormRoi, | ||
| channels: Sequence[str], | ||
| metadata: Dict[str, Any], | ||
| photod_path: str, | ||
| model: str, | ||
| resolution: int, | ||
| every: int = 1, | ||
| bias: BiasType = None, | ||
| dark: DarkType = None, | ||
| normalize: bool = False, | ||
| gain: float = 1.0, | ||
| pixel_area: float = 1.0, | ||
| export_path: str = None, | ||
| ) -> None: | ||
| readings = read_manual_csv(photod_path) | ||
| reference = lica.photodiode.load(model=model, resolution=resolution) | ||
| # This quirk is because the reference photodiode data actaully goes until 1049 and not 1050 nm | ||
| file_list = file_list[:-1] | ||
| assert len(file_list) == len(readings) == len(reference) | ||
| title = make_plot_title_from("Corrected Spectral Response plot", metadata, roi) | ||
| photod_qe = reference[COL.QE] | ||
| wavelength = reference[COL.WAVE] | ||
| photod_current = readings[TBCOL.CURRENT] | ||
| wavelength = np.tile(wavelength, len(channels)).reshape(len(channels), -1) | ||
| exptime, signal = signal_from(file_list, n_roi, channels, bias, dark, every) | ||
| gain = gain * (e_ / u.adu) | ||
| detector_current = (((signal * u.adu * gain)) / (metadata["exposure"] * u.s)).decompose() | ||
| area_ratio = (reference.meta['Photosensitive area'] / (pixel_area * (u.um ** 2))).decompose() | ||
| log.info("AREA RATIO = %s / %s = %s", reference.meta['Photosensitive area'], (pixel_area * (u.um ** 2)), area_ratio) | ||
| detector_qe = photod_qe * area_ratio * (detector_current / photod_current) | ||
| if normalize: | ||
| normalization_factor = np.max(detector_qe) | ||
| detector_qe = detector_qe / normalization_factor # Normalize QE to its absolute maxímun for all channels | ||
| if export_path: | ||
| log.info("exporting to ECSV file(s)") | ||
| columns = [wavelength[0],] | ||
| columns.extend(np.unstack(detector_qe)) | ||
| table = Table( | ||
| data = columns, | ||
| names = [COL.WAVE,] + qe_names(channels), | ||
| units = [u.nm] + qe_units(channels) | ||
| ) | ||
| table.meta["Detector Gain"] = gain | ||
| table.meta["Diode Photosensitive area"] = reference.meta['Photosensitive area'] | ||
| table.meta["Dectector pixel area"] = pixel_area * (u.um ** 2) | ||
| table.meta["Integration time"] = metadata["exposure"] * u.s | ||
| if normalize: | ||
| table.meta["Normalized"] = True | ||
| table.meta["Normalization Factor"] = normalization_factor | ||
| table.write(export_path, delimiter=",", overwrite=True) | ||
| mpl_spectra_plot_loop( | ||
| title=title, | ||
| channels=channels, | ||
| plot_func=plot_raw_spectral, | ||
| xtitle="Wavelength [nm]", | ||
| ytitle="QE (normalized)" if normalize else "QE", | ||
| ylabel="good", | ||
| x=wavelength, | ||
| y=detector_qe, | ||
| # Optional arguments to be handled by the plotting function | ||
| ) | ||
| def spectral(args): | ||
| command = args.command | ||
| func = COMMAND_TABLE[command] | ||
| func(args) | ||
| # =================================== | ||
| # MAIN ENTRY POINT SPECIFIC ARGUMENTS | ||
| # Command Line Interface Entry Points | ||
| # =================================== | ||
| def add_args(parser): | ||
| subparser = parser.add_subparsers(dest="command") | ||
| def cli_raw_spectrum(args): | ||
| log.info(" === DRAFT SPECTRAL RESPONSE PLOT === ") | ||
| file_list, roi, n_roi, channels, metadata = common_list_info(args) | ||
| raw_spectrum( | ||
| file_list, | ||
| roi, | ||
| n_roi, | ||
| channels, | ||
| metadata, | ||
| ) | ||
| parser_raw = subparser.add_parser("raw", help="Raw spectrum") | ||
| parser_corr = subparser.add_parser("corrected", help="Correced spectrum") | ||
| parser_diode = subparser.add_parser("photodiode", help="Photodiode readings") | ||
| # --------------------------------------------------------------------------------------------------------------- | ||
| parser_raw.add_argument( | ||
| "-i", | ||
| "--input-dir", | ||
| type=vdir, | ||
| required=True, | ||
| help="Input directory with RAW files", | ||
| def cli_corrected_spectrum(args): | ||
| log.info(" === COMPLETE SPECTRAL RESPONSE PLOT === ") | ||
| file_list, roi, n_roi, channels, metadata = common_list_info(args) | ||
| corrected_spectrum( | ||
| file_list=file_list, | ||
| roi=roi, | ||
| n_roi=n_roi, | ||
| channels=channels, | ||
| metadata=metadata, | ||
| photod_path=args.photodiode_file, | ||
| model=args.model, | ||
| resolution=args.resolution, | ||
| every=args.every, | ||
| bias=args.bias, | ||
| dark=args.dark, | ||
| normalize=args.normalize, | ||
| gain=args.gain, | ||
| pixel_area=args.pixel_area, | ||
| export_path=args.export, | ||
| ) | ||
| parser_raw.add_argument( | ||
| "-f", | ||
| "--image-filter", | ||
| type=str, | ||
| required=True, | ||
| help="Images filter, glob-style (i.e. flat*, dark*)", | ||
| ) | ||
| parser_raw.add_argument( | ||
| "-x", | ||
| "--x0", | ||
| type=vfloat01, | ||
| help="Normalized ROI start point, x0 coordinate [0..1]", | ||
| ) | ||
| parser_raw.add_argument( | ||
| "-y", | ||
| "--y0", | ||
| type=vfloat01, | ||
| help="Normalized ROI start point, y0 coordinate [0..1]", | ||
| ) | ||
| parser_raw.add_argument( | ||
| "-wi", | ||
| "--width", | ||
| type=vfloat01, | ||
| default=1.0, | ||
| help="Normalized ROI width [0..1] (default: %(default)s)", | ||
| ) | ||
| parser_raw.add_argument( | ||
| "-he", | ||
| "--height", | ||
| type=vfloat01, | ||
| default=1.0, | ||
| help="Normalized ROI height [0..1] (default: %(default)s) ", | ||
| ) | ||
| parser_raw.add_argument( | ||
| "-c", | ||
| "--channels", | ||
| default=("R", "Gr", "Gb", "B"), | ||
| nargs="+", | ||
| choices=("R", "Gr", "Gb", "G", "B"), | ||
| help="color plane to plot. G is the average of G1 & G2. (default: %(default)s)", | ||
| ) | ||
| parser_raw.add_argument( | ||
| "--every", | ||
| type=int, | ||
| metavar="<N>", | ||
| default=1, | ||
| help="pick every n `file after sorting", | ||
| ) | ||
| parser_raw.add_argument( | ||
| def cli_photodiode_spectrum(args): | ||
| log.info(" === PHOTODIODE SPECTRAL RESPONSET PLOT === ") | ||
| if args.raw_readings: | ||
| option = PhDOption.RAW | ||
| elif args.normalized: | ||
| option = PhDOption.NORM | ||
| else: | ||
| option = PhDOption.SNR | ||
| photodiode_spectrum(args.photodiode_file, args.model, option, args.resolution) | ||
| def prs_aux_files() -> ArgumentParser: | ||
| parser = ArgumentParser(add_help=False) | ||
| parser.add_argument( | ||
| "-bi", | ||
@@ -383,3 +424,3 @@ "--bias", | ||
| ) | ||
| parser_raw.add_argument( | ||
| parser.add_argument( | ||
| "-dk", | ||
@@ -390,4 +431,8 @@ "--dark", | ||
| ) | ||
| # --------------------------------------------------------------------------------------------------------------- | ||
| parser_corr.add_argument( | ||
| return parser | ||
| def prs_images() -> ArgumentParser: | ||
| parser = ArgumentParser(add_help=False) | ||
| parser.add_argument( | ||
| "-i", | ||
@@ -399,3 +444,3 @@ "--input-dir", | ||
| ) | ||
| parser_corr.add_argument( | ||
| parser.add_argument( | ||
| "-f", | ||
@@ -407,3 +452,3 @@ "--image-filter", | ||
| ) | ||
| parser_corr.add_argument( | ||
| parser.add_argument( | ||
| "-x", | ||
@@ -414,3 +459,3 @@ "--x0", | ||
| ) | ||
| parser_corr.add_argument( | ||
| parser.add_argument( | ||
| "-y", | ||
@@ -421,3 +466,3 @@ "--y0", | ||
| ) | ||
| parser_corr.add_argument( | ||
| parser.add_argument( | ||
| "-wi", | ||
@@ -429,3 +474,3 @@ "--width", | ||
| ) | ||
| parser_corr.add_argument( | ||
| parser.add_argument( | ||
| "-he", | ||
@@ -437,3 +482,3 @@ "--height", | ||
| ) | ||
| parser_corr.add_argument( | ||
| parser.add_argument( | ||
| "-c", | ||
@@ -446,3 +491,3 @@ "--channels", | ||
| ) | ||
| parser_corr.add_argument( | ||
| parser.add_argument( | ||
| "--every", | ||
@@ -454,17 +499,10 @@ type=int, | ||
| ) | ||
| parser_corr.add_argument( | ||
| "-bi", | ||
| "--bias", | ||
| type=vflopath, | ||
| help="Bias, either a single value for all channels or else a 3D FITS cube file (default: %(default)s)", | ||
| ) | ||
| parser_corr.add_argument( | ||
| "-dk", | ||
| "--dark", | ||
| type=vfloat, | ||
| help="Dark count rate in DN/sec. (default: %(default)s)", | ||
| ) | ||
| parser_corr.add_argument( | ||
| "-cv", | ||
| "--csv-file", | ||
| return parser | ||
| def prs_photod() -> ArgumentParser: | ||
| parser = ArgumentParser(add_help=False) | ||
| parser.add_argument( | ||
| "-ph", | ||
| "--photodiode-file", | ||
| type=vfile, | ||
@@ -474,10 +512,10 @@ required=True, | ||
| ) | ||
| parser_corr.add_argument( | ||
| parser.add_argument( | ||
| "-m", | ||
| "--model", | ||
| default=OSI_PHOTODIODE, | ||
| choices=(HAMAMATSU_PHOTODIODE, OSI_PHOTODIODE), | ||
| default=PhotodiodeModel.OSI, | ||
| choices=[p for p in PhotodiodeModel], | ||
| help="Photodiode model. (default: %(default)s)", | ||
| ) | ||
| parser_corr.add_argument( | ||
| parser.add_argument( | ||
| "-r", | ||
@@ -487,33 +525,61 @@ "--resolution", | ||
| default=5, | ||
| choices=(1, 5), | ||
| choices=tuple(range(1, 11)), | ||
| help="Wavelength resolution (nm). (default: %(default)s nm)", | ||
| ) | ||
| return parser | ||
| def cli_main(args): | ||
| args.func(args) | ||
| def add_args(parser): | ||
| subparser = parser.add_subparsers(dest="command") | ||
| parser_raw = subparser.add_parser( | ||
| "raw", parents=[prs_images(), prs_aux_files()], help="Raw spectrum" | ||
| ) | ||
| parser_raw.set_defaults(func=cli_raw_spectrum) | ||
| parser_corr = subparser.add_parser( | ||
| "corrected", | ||
| parents=[prs_images(), prs_aux_files(), prs_photod()], | ||
| help="Corrected spectrum", | ||
| ) | ||
| parser_corr.set_defaults(func=cli_corrected_spectrum) | ||
| parser_diode = subparser.add_parser( | ||
| "photodiode", parents=[prs_photod()], help="Photodiode readings" | ||
| ) | ||
| parser_diode.set_defaults(func=cli_photodiode_spectrum) | ||
| # --------------------------------------------------------------------------------------------------------------- | ||
| parser_corr.add_argument( | ||
| "--export", | ||
| type=str, | ||
| choices=("combined", "individual"), | ||
| help="Export to CSV file(s)", | ||
| metavar="<FILE>", | ||
| help="Export to ECSV file", | ||
| ) | ||
| parser_corr.add_argument( | ||
| "-u", | ||
| "--units", | ||
| type=str, | ||
| choices=("nm", "angs"), | ||
| default="nm", | ||
| help="Exported wavelength units. (default: %(default)s)", | ||
| "-n", | ||
| "--normalize", | ||
| action="store_true", | ||
| help="Normalize spectrum with respect to its maximum", | ||
| ) | ||
| parser_corr.add_argument( | ||
| "-wl", | ||
| "--wavelength-last", | ||
| action="store_true", | ||
| help="Wavelength is last column in exported file", | ||
| "-g", | ||
| "--gain", | ||
| type=float, | ||
| default = 1.0, | ||
| help="Camera gain [e-/DN] (defaults to %(default)f)", | ||
| ) | ||
| parser_corr.add_argument( | ||
| "-pa", | ||
| "--pixel-area", | ||
| type=float, | ||
| default = 1.0, | ||
| help="Pixel area in \u03BCm^2 (defaults to %(default)f)", | ||
| ) | ||
| # --------------------------------------------------------------------------------------------------------------- | ||
| parser_diode.add_argument( | ||
| "-cv", | ||
| "--csv-file", | ||
| type=vfile, | ||
| required=True, | ||
| help="CSV file with photdiode readings", | ||
| ) | ||
| dioex1 = parser_diode.add_mutually_exclusive_group(required=True) | ||
@@ -534,21 +600,6 @@ dioex1.add_argument( | ||
| "-s", | ||
| "--signal-to-noise", | ||
| "--snr", | ||
| action="store_true", | ||
| help="Plot Raw Signal to Noise Ratio", | ||
| ) | ||
| parser_diode.add_argument( | ||
| "-m", | ||
| "--model", | ||
| default=OSI_PHOTODIODE, | ||
| choices=(HAMAMATSU_PHOTODIODE, OSI_PHOTODIODE), | ||
| help="Photodiode model. (default: %(default)s)", | ||
| ) | ||
| parser_diode.add_argument( | ||
| "-r", | ||
| "--resolution", | ||
| type=int, | ||
| default=5, | ||
| choices=(1, 5), | ||
| help="Wavelength resolution (nm). (default: %(default)s nm)", | ||
| ) | ||
@@ -563,3 +614,3 @@ | ||
| execute( | ||
| main_func=spectral, | ||
| main_func=cli_main, | ||
| add_args_func=add_args, | ||
@@ -566,0 +617,0 @@ name=__name__, |
@@ -187,41 +187,1 @@ # -*- coding: utf-8 -*- | ||
| return xc, yc | ||
| def export_spectra_to_csv(labels, wavelength, signal, mode, units, wave_last=False): | ||
| wave_exported = wavelength * 10 if units == "angs" else wavelength | ||
| COLS = len(labels) | ||
| if mode == "combined": | ||
| if not wave_last: | ||
| header = [ | ||
| f"Wavelength [{units}]", | ||
| ] + labels | ||
| else: | ||
| header = labels + [f"Wavelength [{units}]"] | ||
| path = "combined_" + "_".join(labels) + ".csv" | ||
| with open(path, "w", newline="") as csvfile: | ||
| writer = csv.writer(csvfile, delimiter=";") | ||
| writer.writerow(header) | ||
| for row in range(wave_exported.shape[0]): | ||
| data = [signal[lab][row] for lab in range(COLS)] | ||
| if not wave_last: | ||
| data = [wave_exported[row]] + data | ||
| else: | ||
| data = data + [wave_exported[row]] | ||
| writer.writerow(data) | ||
| else: | ||
| if not wave_last: | ||
| header = (f"Wavelength [{units}]", "Relative value") | ||
| else: | ||
| header = ("Relative value", f"Wavelength [{units}]") | ||
| for i, label in enumerate(labels): | ||
| path = label + ".csv" | ||
| selected_signal = signal[i] | ||
| with open(path, "w", newline="") as csvfile: | ||
| writer = csv.writer(csvfile, delimiter=";") | ||
| writer.writerow(header) | ||
| for j in range(wave_exported.shape[0]): | ||
| if not wave_last: | ||
| data = (wave_exported[j], selected_signal[j]) | ||
| else: | ||
| data = (selected_signal[j], wave_exported[j]) | ||
| writer.writerow(data) |
| # -*- coding: utf-8 -*- | ||
| # ---------------------------------------------------------------------- | ||
| # Copyright (c) 2021 | ||
| # | ||
| # See the LICENSE file for details | ||
| # see the AUTHORS file for authors | ||
| # ---------------------------------------------------------------------- | ||
| # -------------------- | ||
| # System wide imports | ||
| # ------------------- | ||
| import re | ||
| import csv | ||
| import logging | ||
| # --------------------- | ||
| # Thrid-party libraries | ||
| # --------------------- | ||
| import numpy as np | ||
| import matplotlib.pyplot as plt | ||
| from lica.cli import execute | ||
| from lica.validators import vfile | ||
| # ------------------------ | ||
| # Own modules and packages | ||
| # ------------------------ | ||
| from ._version import __version__ | ||
| from .util.common import export_spectra_to_csv | ||
| from .photodiode import photodiode_load, OSI_PHOTODIODE, HAMAMATSU_PHOTODIODE | ||
| # ---------------- | ||
| # Module constants | ||
| # ---------------- | ||
| WAVELENGTH_REG_EXP = re.compile(r"(\w+)_(\d+)nm_g(\d+)_(\d+)_(\d+)_(\w+).jpg") | ||
| # Photodiode readings header columns | ||
| WAVELENGTH_CSV_HEADER = "wavelength (nm)" | ||
| CURRENT_CSV_HEADER = "current (A)" | ||
| READ_NOISE_CSV_HEADER = "read noise (A)" | ||
| # ----------------------- | ||
| # Module global variables | ||
| # ----------------------- | ||
| log = logging.getLogger(__name__) | ||
| # ----------------- | ||
| # Matplotlib styles | ||
| # ----------------- | ||
| # Load global style sheets | ||
| plt.style.use("rawplot.resources.global") | ||
| # ------------------ | ||
| # Auxiliary fnctions | ||
| # ------------------ | ||
| def mpl_filters_plot_loop(title, x, y, xtitle, ytitle, plot_func, ylabels, **kwargs): | ||
| fig, axes = plt.subplots(nrows=1, ncols=1) | ||
| fig.suptitle(title) | ||
| axes.set_xlabel(xtitle) | ||
| axes.set_ylabel(ytitle) | ||
| filters = kwargs.get("filters") | ||
| diode = kwargs.get("diode") | ||
| model = kwargs.get("model") | ||
| # labels = kwargs.get('labels') | ||
| Z, _ = y.shape | ||
| for i in range(Z): | ||
| plot_func(axes, i, x, y, ylabels, **kwargs) | ||
| if filters is not None: | ||
| for filt in filters: | ||
| axes.axvline(filt["wave"], linestyle=filt["style"], label=filt["label"]) | ||
| if diode is not None: | ||
| axes.plot(x, diode, marker="o", linewidth=0, label=model) | ||
| axes.grid(True, which="major", color="silver", linestyle="solid") | ||
| axes.grid(True, which="minor", color="silver", linestyle=(0, (1, 10))) | ||
| axes.minorticks_on() | ||
| axes.legend() | ||
| plt.show() | ||
| # This is incomplete for 5 filter banks | ||
| def guess_color(label): | ||
| label = label.lower() | ||
| red = re.compile(r"red") | ||
| green = re.compile(r"green") | ||
| blue = re.compile(r"blue") | ||
| if red.search(label): | ||
| return "red" | ||
| if green.search(label): | ||
| return "green" | ||
| if blue.search(label): | ||
| return "blue" | ||
| return "magenta" | ||
| def plot_filter_spectrum(axes, i, x, y, ylabels, **kwargs): | ||
| wavelength = x | ||
| signal = y[i] | ||
| marker = "o" | ||
| color = guess_color(ylabels[i]) | ||
| axes.plot(wavelength, signal, marker=marker, color=color, linewidth=1, label=ylabels[i]) | ||
| def csv_readings_to_array(csv_path): | ||
| log.info("reading CSV file %s", csv_path) | ||
| with open(csv_path, newline="") as csvfile: | ||
| reader = csv.reader(csvfile, delimiter="\t") | ||
| contents = {int(round(float(row[1]), 0)): float(row[2]) for row in reader} | ||
| wavelength = np.array(sorted(contents.keys())) | ||
| signal = np.array(tuple(contents[key] for key in sorted(contents.keys()))) | ||
| return wavelength, signal | ||
| def validate_lists(args): | ||
| if len(args.filters) != len(args.labels): | ||
| raise ValueError("Number of labels must match number of filter files") | ||
| if len(args.filters) < 1: | ||
| raise ValueError("Missing filter CSV files") | ||
| if len(args.diodes) < 1: | ||
| raise ValueError("Missing calibration diode CSV files") | ||
| def get_info_from(args): | ||
| accum = list() | ||
| labels = list() | ||
| diodes = list() | ||
| for filt, label in zip(args.filters, args.labels): | ||
| wavelength, signal = csv_readings_to_array(filt) | ||
| accum.append(signal) | ||
| labels.append(label) | ||
| signal = np.vstack(accum) | ||
| for diode in args.diodes: | ||
| _, diode = csv_readings_to_array(diode) | ||
| diodes.append(diode) | ||
| # diode = np.vstack(diodes) | ||
| # log.info("Before: Diode shapes is %s", diode.shape) | ||
| diode = np.mean(np.vstack(diodes), axis=0) | ||
| log.info("Diode shapes is %s", diode.shape) | ||
| return wavelength, signal, labels, diode, args.model | ||
| # ----------------------- | ||
| # AUXILIARY MAIN FUNCTION | ||
| # ----------------------- | ||
| def raw_spectrum(args): | ||
| log.info(" === DRAFT SPECTRAL RESPONSE PLOT === ") | ||
| validate_lists(args) | ||
| wavelength, signal, labels, diode, model = get_info_from(args) | ||
| mpl_filters_plot_loop( | ||
| title=f"Raw response for {args.title}", | ||
| plot_func=plot_filter_spectrum, | ||
| xtitle="Wavelength [nm]", | ||
| ytitle="Signal [A]", | ||
| ylabels=labels, | ||
| x=wavelength, | ||
| y=signal, | ||
| # Optional arguments to be handled by the plotting function | ||
| diode=diode, | ||
| model=model, | ||
| filters=[ | ||
| {"label": r"$BG38 \Rightarrow OG570$", "wave": 570, "style": "--"}, | ||
| {"label": r"$OG570\Rightarrow RG830$", "wave": 860, "style": "-."}, | ||
| ], # where filters were changesd | ||
| ) | ||
| def corrected_spectrum(args): | ||
| log.info(" === COMPLETE SPECTRAL RESPONSE PLOT === ") | ||
| validate_lists(args) | ||
| wavelength, signal, labels, diode, model = get_info_from(args) | ||
| log.info | ||
| responsivity, qe = photodiode_load(args.model, args.resolution) | ||
| log.info( | ||
| "Read %s reference responsivity values at %d nm resolution from %s", | ||
| len(responsivity), | ||
| args.resolution, | ||
| args.model, | ||
| ) | ||
| qe = np.array( | ||
| [qe[w] for w in wavelength] | ||
| ) # Only use those wavelenghts actually used in the CSV sequence | ||
| diode = diode / np.max(diode) # Normalize photodiode current | ||
| signal = qe * signal / diode | ||
| signal = signal / np.max(signal) # Normalize signal to its absolute maxímun for all channels | ||
| if args.export: | ||
| log.info("exporting to CSV file(s)") | ||
| export_spectra_to_csv( | ||
| labels=labels, | ||
| wavelength=wavelength, | ||
| signal=signal, | ||
| mode=args.export, | ||
| units=args.units, | ||
| wave_last=args.wavelength_last, | ||
| ) | ||
| mpl_filters_plot_loop( | ||
| title=f"Corrected response for {args.title}", | ||
| plot_func=plot_filter_spectrum, | ||
| xtitle="Wavelength [nm]", | ||
| ytitle="Normalized signal level", | ||
| ylabels=labels, | ||
| x=wavelength, | ||
| y=signal, | ||
| filters=[ | ||
| {"label": r"$BG38 \Rightarrow OG570$", "wave": 570, "style": "--"}, | ||
| {"label": r"$OG570\Rightarrow RG830$", "wave": 860, "style": "-."}, | ||
| ], # where filters were changesd | ||
| ) | ||
| COMMAND_TABLE = { | ||
| "raw": raw_spectrum, | ||
| "corrected": corrected_spectrum, | ||
| } | ||
| def filters(args): | ||
| command = args.command | ||
| func = COMMAND_TABLE[command] | ||
| func(args) | ||
| # =================================== | ||
| # MAIN ENTRY POINT SPECIFIC ARGUMENTS | ||
| # =================================== | ||
| def add_args(parser): | ||
| subparser = parser.add_subparsers(dest="command") | ||
| parser_raw = subparser.add_parser("raw", help="Raw spectrum") | ||
| parser_corr = subparser.add_parser("corrected", help="Correced spectrum") | ||
| # --------------------------------------------------------------------------------------------------------------- | ||
| parser_raw.add_argument( | ||
| "-t", | ||
| "--title", | ||
| type=str, | ||
| help='Filters set model (ie. "Astronomik L-RGB Type 2c"', | ||
| ) | ||
| parser_raw.add_argument( | ||
| "-f", | ||
| "--filters", | ||
| required=True, | ||
| metavar="<CSV>", | ||
| nargs="+", | ||
| type=vfile, | ||
| help="Filter CSV files", | ||
| ) | ||
| parser_raw.add_argument( | ||
| "-l", | ||
| "--labels", | ||
| required=True, | ||
| metavar="<LABEL>", | ||
| nargs="+", | ||
| type=str, | ||
| help="CSV file labels", | ||
| ) | ||
| parser_raw.add_argument( | ||
| "-d", | ||
| "--diodes", | ||
| required=True, | ||
| metavar="<CSV>", | ||
| nargs="+", | ||
| type=vfile, | ||
| help="reference photodiode CSV files", | ||
| ) | ||
| parser_raw.add_argument( | ||
| "-m", | ||
| "--model", | ||
| default=OSI_PHOTODIODE, | ||
| choices=(HAMAMATSU_PHOTODIODE, OSI_PHOTODIODE), | ||
| help="Reference photodiode model. (default: %(default)s)", | ||
| ) | ||
| # --------------------------------------------------------------------------------------------------------------- | ||
| parser_corr.add_argument( | ||
| "-t", | ||
| "--title", | ||
| type=str, | ||
| help='Filters set model (ie. "Astronomik L-RGB Type 2c"', | ||
| ) | ||
| parser_corr.add_argument( | ||
| "-f", | ||
| "--filters", | ||
| required=True, | ||
| metavar="<CSV>", | ||
| nargs="+", | ||
| type=vfile, | ||
| help="Filter CSV files", | ||
| ) | ||
| parser_corr.add_argument( | ||
| "-l", | ||
| "--labels", | ||
| required=True, | ||
| metavar="<LABEL>", | ||
| nargs="+", | ||
| type=str, | ||
| help="CSV file labels", | ||
| ) | ||
| parser_corr.add_argument( | ||
| "-d", | ||
| "--diodes", | ||
| required=True, | ||
| metavar="<CSV>", | ||
| nargs="+", | ||
| type=vfile, | ||
| help="reference photodiode CSV files", | ||
| ) | ||
| parser_corr.add_argument( | ||
| "-m", | ||
| "--model", | ||
| default=OSI_PHOTODIODE, | ||
| choices=(HAMAMATSU_PHOTODIODE, OSI_PHOTODIODE), | ||
| help="Reference photodiode model. (default: %(default)s)", | ||
| ) | ||
| parser_corr.add_argument( | ||
| "-r", | ||
| "--resolution", | ||
| type=int, | ||
| default=5, | ||
| choices=(1, 5), | ||
| help="Wavelength resolution (nm). (default: %(default)s nm)", | ||
| ) | ||
| parser_corr.add_argument( | ||
| "-x", | ||
| "--export", | ||
| type=str, | ||
| choices=("combined", "individual"), | ||
| help="Export to CSV file(s)", | ||
| ) | ||
| parser_corr.add_argument( | ||
| "-u", | ||
| "--units", | ||
| type=str, | ||
| choices=("nm", "angs"), | ||
| default="nm", | ||
| help="Exported wavelength units. (default: %(default)s)", | ||
| ) | ||
| parser_corr.add_argument( | ||
| "-wl", | ||
| "--wavelength-last", | ||
| action="store_true", | ||
| help="Wavelength is last column in exported file", | ||
| ) | ||
| # --------------------------------------------------------------------------------------------------------------- | ||
| # ================ | ||
| # MAIN ENTRY POINT | ||
| # ================ | ||
| def main(): | ||
| execute( | ||
| main_func=filters, | ||
| add_args_func=add_args, | ||
| name=__name__, | ||
| version=__version__, | ||
| description="Filters spectral response", | ||
| ) |
| Wavelength (nm);Responsivity (A/W);Quantum Efficiency | ||
| 350;0.15060;0.53349 | ||
| 351;0.15044;0.53140 | ||
| 352;0.15028;0.52933 | ||
| 353;0.15012;0.52727 | ||
| 354;0.14996;0.52522 | ||
| 355;0.14980;0.52318 | ||
| 356;0.14964;0.52115 | ||
| 357;0.14948;0.51914 | ||
| 358;0.14932;0.51713 | ||
| 359;0.14916;0.51514 | ||
| 360;0.14900;0.51316 | ||
| 361;0.14884;0.51119 | ||
| 362;0.14868;0.50923 | ||
| 363;0.14852;0.50728 | ||
| 364;0.14836;0.50534 | ||
| 365;0.14820;0.50341 | ||
| 366;0.14804;0.50149 | ||
| 367;0.14788;0.49959 | ||
| 368;0.14772;0.49769 | ||
| 369;0.14756;0.49580 | ||
| 370;0.14740;0.49393 | ||
| 371;0.14862;0.49667 | ||
| 372;0.14984;0.49940 | ||
| 373;0.15106;0.50212 | ||
| 374;0.15228;0.50482 | ||
| 375;0.15350;0.50751 | ||
| 376;0.15472;0.51018 | ||
| 377;0.15594;0.51284 | ||
| 378;0.15716;0.51549 | ||
| 379;0.15838;0.51812 | ||
| 380;0.15960;0.52073 | ||
| 381;0.16082;0.52334 | ||
| 382;0.16204;0.52593 | ||
| 383;0.16326;0.52850 | ||
| 384;0.16448;0.53107 | ||
| 385;0.16570;0.53362 | ||
| 386;0.16692;0.53615 | ||
| 387;0.16814;0.53867 | ||
| 388;0.16936;0.54118 | ||
| 389;0.17058;0.54368 | ||
| 390;0.17180;0.54617 | ||
| 391;0.17282;0.54800 | ||
| 392;0.17384;0.54983 | ||
| 393;0.17486;0.55165 | ||
| 394;0.17588;0.55346 | ||
| 395;0.17690;0.55526 | ||
| 396;0.17792;0.55705 | ||
| 397;0.17894;0.55883 | ||
| 398;0.17996;0.56061 | ||
| 399;0.18098;0.56237 | ||
| 400;0.18200;0.56413 | ||
| 401;0.18302;0.56587 | ||
| 402;0.18404;0.56761 | ||
| 403;0.18506;0.56934 | ||
| 404;0.18608;0.57106 | ||
| 405;0.18710;0.57278 | ||
| 406;0.18812;0.57448 | ||
| 407;0.18914;0.57618 | ||
| 408;0.19016;0.57786 | ||
| 409;0.19118;0.57954 | ||
| 410;0.19220;0.58121 | ||
| 411;0.19303;0.58229 | ||
| 412;0.19385;0.58336 | ||
| 413;0.19468;0.58442 | ||
| 414;0.19550;0.58548 | ||
| 415;0.19633;0.58653 | ||
| 416;0.19715;0.58758 | ||
| 417;0.19798;0.58863 | ||
| 418;0.19880;0.58967 | ||
| 419;0.19963;0.59070 | ||
| 420;0.20045;0.59173 | ||
| 421;0.20128;0.59275 | ||
| 422;0.20210;0.59377 | ||
| 423;0.20293;0.59479 | ||
| 424;0.20375;0.59580 | ||
| 425;0.20458;0.59680 | ||
| 426;0.20540;0.59780 | ||
| 427;0.20623;0.59880 | ||
| 428;0.20705;0.59979 | ||
| 429;0.20788;0.60077 | ||
| 430;0.20870;0.60176 | ||
| 431;0.20943;0.60246 | ||
| 432;0.21016;0.60316 | ||
| 433;0.21089;0.60386 | ||
| 434;0.21162;0.60455 | ||
| 435;0.21235;0.60524 | ||
| 436;0.21308;0.60593 | ||
| 437;0.21381;0.60661 | ||
| 438;0.21454;0.60730 | ||
| 439;0.21527;0.60797 | ||
| 440;0.21600;0.60865 | ||
| 441;0.21673;0.60932 | ||
| 442;0.21746;0.60999 | ||
| 443;0.21819;0.61066 | ||
| 444;0.21892;0.61132 | ||
| 445;0.21965;0.61198 | ||
| 446;0.22038;0.61264 | ||
| 447;0.22111;0.61329 | ||
| 448;0.22184;0.61394 | ||
| 449;0.22257;0.61459 | ||
| 450;0.22330;0.61524 | ||
| 451;0.22398;0.61573 | ||
| 452;0.22465;0.61622 | ||
| 453;0.22533;0.61671 | ||
| 454;0.22600;0.61719 | ||
| 455;0.22668;0.61767 | ||
| 456;0.22735;0.61815 | ||
| 457;0.22803;0.61863 | ||
| 458;0.22870;0.61911 | ||
| 459;0.22938;0.61958 | ||
| 460;0.23005;0.62006 | ||
| 461;0.23073;0.62053 | ||
| 462;0.23140;0.62099 | ||
| 463;0.23208;0.62146 | ||
| 464;0.23275;0.62193 | ||
| 465;0.23343;0.62239 | ||
| 466;0.23410;0.62285 | ||
| 467;0.23478;0.62331 | ||
| 468;0.23545;0.62376 | ||
| 469;0.23613;0.62422 | ||
| 470;0.23680;0.62467 | ||
| 471;0.23745;0.62504 | ||
| 472;0.23809;0.62541 | ||
| 473;0.23874;0.62578 | ||
| 474;0.23938;0.62615 | ||
| 475;0.24003;0.62651 | ||
| 476;0.24067;0.62688 | ||
| 477;0.24132;0.62724 | ||
| 478;0.24196;0.62760 | ||
| 479;0.24261;0.62796 | ||
| 480;0.24325;0.62832 | ||
| 481;0.24390;0.62867 | ||
| 482;0.24454;0.62903 | ||
| 483;0.24519;0.62938 | ||
| 484;0.24583;0.62973 | ||
| 485;0.24648;0.63008 | ||
| 486;0.24712;0.63043 | ||
| 487;0.24777;0.63078 | ||
| 488;0.24841;0.63113 | ||
| 489;0.24906;0.63147 | ||
| 490;0.24970;0.63181 | ||
| 491;0.25032;0.63209 | ||
| 492;0.25094;0.63237 | ||
| 493;0.25156;0.63265 | ||
| 494;0.25218;0.63292 | ||
| 495;0.25280;0.63320 | ||
| 496;0.25342;0.63347 | ||
| 497;0.25404;0.63374 | ||
| 498;0.25466;0.63401 | ||
| 499;0.25528;0.63428 | ||
| 500;0.25590;0.63455 | ||
| 501;0.25652;0.63482 | ||
| 502;0.25714;0.63509 | ||
| 503;0.25776;0.63535 | ||
| 504;0.25838;0.63562 | ||
| 505;0.25900;0.63588 | ||
| 506;0.25962;0.63614 | ||
| 507;0.26024;0.63640 | ||
| 508;0.26086;0.63666 | ||
| 509;0.26148;0.63692 | ||
| 510;0.26210;0.63718 | ||
| 511;0.26271;0.63740 | ||
| 512;0.26331;0.63762 | ||
| 513;0.26392;0.63784 | ||
| 514;0.26452;0.63806 | ||
| 515;0.26513;0.63828 | ||
| 516;0.26573;0.63849 | ||
| 517;0.26634;0.63871 | ||
| 518;0.26694;0.63893 | ||
| 519;0.26755;0.63914 | ||
| 520;0.26815;0.63935 | ||
| 521;0.26876;0.63957 | ||
| 522;0.26936;0.63978 | ||
| 523;0.26997;0.63999 | ||
| 524;0.27057;0.64020 | ||
| 525;0.27118;0.64041 | ||
| 526;0.27178;0.64062 | ||
| 527;0.27239;0.64082 | ||
| 528;0.27299;0.64103 | ||
| 529;0.27360;0.64124 | ||
| 530;0.27420;0.64144 | ||
| 531;0.27479;0.64161 | ||
| 532;0.27538;0.64178 | ||
| 533;0.27597;0.64195 | ||
| 534;0.27656;0.64212 | ||
| 535;0.27715;0.64228 | ||
| 536;0.27774;0.64245 | ||
| 537;0.27833;0.64262 | ||
| 538;0.27892;0.64278 | ||
| 539;0.27951;0.64295 | ||
| 540;0.28010;0.64311 | ||
| 541;0.28069;0.64327 | ||
| 542;0.28128;0.64344 | ||
| 543;0.28187;0.64360 | ||
| 544;0.28246;0.64376 | ||
| 545;0.28305;0.64392 | ||
| 546;0.28364;0.64408 | ||
| 547;0.28423;0.64424 | ||
| 548;0.28482;0.64440 | ||
| 549;0.28541;0.64456 | ||
| 550;0.28600;0.64472 | ||
| 551;0.28659;0.64486 | ||
| 552;0.28717;0.64501 | ||
| 553;0.28776;0.64515 | ||
| 554;0.28834;0.64530 | ||
| 555;0.28893;0.64544 | ||
| 556;0.28951;0.64559 | ||
| 557;0.29010;0.64573 | ||
| 558;0.29068;0.64587 | ||
| 559;0.29127;0.64602 | ||
| 560;0.29185;0.64616 | ||
| 561;0.29244;0.64630 | ||
| 562;0.29302;0.64644 | ||
| 563;0.29361;0.64658 | ||
| 564;0.29419;0.64672 | ||
| 565;0.29478;0.64686 | ||
| 566;0.29536;0.64700 | ||
| 567;0.29595;0.64713 | ||
| 568;0.29653;0.64727 | ||
| 569;0.29712;0.64741 | ||
| 570;0.29770;0.64755 | ||
| 571;0.29828;0.64766 | ||
| 572;0.29885;0.64777 | ||
| 573;0.29943;0.64789 | ||
| 574;0.30000;0.64800 | ||
| 575;0.30058;0.64811 | ||
| 576;0.30115;0.64823 | ||
| 577;0.30173;0.64834 | ||
| 578;0.30230;0.64845 | ||
| 579;0.30288;0.64856 | ||
| 580;0.30345;0.64867 | ||
| 581;0.30403;0.64878 | ||
| 582;0.30460;0.64889 | ||
| 583;0.30518;0.64900 | ||
| 584;0.30575;0.64911 | ||
| 585;0.30633;0.64922 | ||
| 586;0.30690;0.64933 | ||
| 587;0.30748;0.64944 | ||
| 588;0.30805;0.64955 | ||
| 589;0.30863;0.64965 | ||
| 590;0.30920;0.64976 | ||
| 591;0.30977;0.64986 | ||
| 592;0.31034;0.64995 | ||
| 593;0.31091;0.65005 | ||
| 594;0.31148;0.65014 | ||
| 595;0.31205;0.65024 | ||
| 596;0.31262;0.65033 | ||
| 597;0.31319;0.65043 | ||
| 598;0.31376;0.65052 | ||
| 599;0.31433;0.65062 | ||
| 600;0.31490;0.65071 | ||
| 601;0.31547;0.65080 | ||
| 602;0.31604;0.65090 | ||
| 603;0.31661;0.65099 | ||
| 604;0.31718;0.65108 | ||
| 605;0.31775;0.65117 | ||
| 606;0.31832;0.65126 | ||
| 607;0.31889;0.65136 | ||
| 608;0.31946;0.65145 | ||
| 609;0.32003;0.65154 | ||
| 610;0.32060;0.65163 | ||
| 611;0.32117;0.65171 | ||
| 612;0.32173;0.65179 | ||
| 613;0.32230;0.65187 | ||
| 614;0.32286;0.65195 | ||
| 615;0.32343;0.65203 | ||
| 616;0.32399;0.65210 | ||
| 617;0.32456;0.65218 | ||
| 618;0.32512;0.65226 | ||
| 619;0.32569;0.65234 | ||
| 620;0.32625;0.65242 | ||
| 621;0.32682;0.65249 | ||
| 622;0.32738;0.65257 | ||
| 623;0.32795;0.65265 | ||
| 624;0.32851;0.65273 | ||
| 625;0.32908;0.65280 | ||
| 626;0.32964;0.65288 | ||
| 627;0.33021;0.65295 | ||
| 628;0.33077;0.65303 | ||
| 629;0.33134;0.65310 | ||
| 630;0.33190;0.65318 | ||
| 631;0.33246;0.65325 | ||
| 632;0.33302;0.65331 | ||
| 633;0.33358;0.65338 | ||
| 634;0.33414;0.65344 | ||
| 635;0.33470;0.65350 | ||
| 636;0.33526;0.65357 | ||
| 637;0.33582;0.65363 | ||
| 638;0.33638;0.65370 | ||
| 639;0.33694;0.65376 | ||
| 640;0.33750;0.65382 | ||
| 641;0.33806;0.65389 | ||
| 642;0.33862;0.65395 | ||
| 643;0.33918;0.65401 | ||
| 644;0.33974;0.65407 | ||
| 645;0.34030;0.65414 | ||
| 646;0.34086;0.65420 | ||
| 647;0.34142;0.65426 | ||
| 648;0.34198;0.65432 | ||
| 649;0.34254;0.65438 | ||
| 650;0.34310;0.65445 | ||
| 651;0.34366;0.65450 | ||
| 652;0.34421;0.65455 | ||
| 653;0.34477;0.65460 | ||
| 654;0.34532;0.65465 | ||
| 655;0.34588;0.65470 | ||
| 656;0.34643;0.65475 | ||
| 657;0.34699;0.65480 | ||
| 658;0.34754;0.65486 | ||
| 659;0.34810;0.65491 | ||
| 660;0.34865;0.65496 | ||
| 661;0.34921;0.65501 | ||
| 662;0.34976;0.65506 | ||
| 663;0.35032;0.65511 | ||
| 664;0.35087;0.65516 | ||
| 665;0.35143;0.65521 | ||
| 666;0.35198;0.65525 | ||
| 667;0.35254;0.65530 | ||
| 668;0.35309;0.65535 | ||
| 669;0.35365;0.65540 | ||
| 670;0.35420;0.65545 | ||
| 671;0.35476;0.65551 | ||
| 672;0.35532;0.65557 | ||
| 673;0.35588;0.65562 | ||
| 674;0.35644;0.65568 | ||
| 675;0.35700;0.65574 | ||
| 676;0.35756;0.65580 | ||
| 677;0.35812;0.65585 | ||
| 678;0.35868;0.65591 | ||
| 679;0.35924;0.65597 | ||
| 680;0.35980;0.65602 | ||
| 681;0.36036;0.65608 | ||
| 682;0.36092;0.65613 | ||
| 683;0.36148;0.65619 | ||
| 684;0.36204;0.65625 | ||
| 685;0.36260;0.65630 | ||
| 686;0.36316;0.65636 | ||
| 687;0.36372;0.65641 | ||
| 688;0.36428;0.65647 | ||
| 689;0.36484;0.65652 | ||
| 690;0.36540;0.65658 | ||
| 691;0.36595;0.65661 | ||
| 692;0.36650;0.65665 | ||
| 693;0.36705;0.65669 | ||
| 694;0.36760;0.65672 | ||
| 695;0.36815;0.65676 | ||
| 696;0.36870;0.65680 | ||
| 697;0.36925;0.65683 | ||
| 698;0.36980;0.65687 | ||
| 699;0.37035;0.65690 | ||
| 700;0.37090;0.65694 | ||
| 701;0.37145;0.65697 | ||
| 702;0.37200;0.65701 | ||
| 703;0.37255;0.65705 | ||
| 704;0.37310;0.65708 | ||
| 705;0.37365;0.65712 | ||
| 706;0.37420;0.65715 | ||
| 707;0.37475;0.65719 | ||
| 708;0.37530;0.65722 | ||
| 709;0.37585;0.65726 | ||
| 710;0.37640;0.65729 | ||
| 711;0.37695;0.65733 | ||
| 712;0.37750;0.65736 | ||
| 713;0.37805;0.65739 | ||
| 714;0.37860;0.65743 | ||
| 715;0.37915;0.65746 | ||
| 716;0.37970;0.65750 | ||
| 717;0.38025;0.65753 | ||
| 718;0.38080;0.65757 | ||
| 719;0.38135;0.65760 | ||
| 720;0.38190;0.65763 | ||
| 721;0.38245;0.65767 | ||
| 722;0.38300;0.65770 | ||
| 723;0.38355;0.65773 | ||
| 724;0.38410;0.65777 | ||
| 725;0.38465;0.65780 | ||
| 726;0.38520;0.65783 | ||
| 727;0.38575;0.65787 | ||
| 728;0.38630;0.65790 | ||
| 729;0.38685;0.65793 | ||
| 730;0.38740;0.65797 | ||
| 731;0.38796;0.65801 | ||
| 732;0.38851;0.65805 | ||
| 733;0.38907;0.65809 | ||
| 734;0.38962;0.65813 | ||
| 735;0.39018;0.65817 | ||
| 736;0.39073;0.65821 | ||
| 737;0.39129;0.65825 | ||
| 738;0.39184;0.65829 | ||
| 739;0.39240;0.65833 | ||
| 740;0.39295;0.65837 | ||
| 741;0.39351;0.65841 | ||
| 742;0.39406;0.65845 | ||
| 743;0.39462;0.65849 | ||
| 744;0.39517;0.65853 | ||
| 745;0.39573;0.65857 | ||
| 746;0.39628;0.65861 | ||
| 747;0.39684;0.65865 | ||
| 748;0.39739;0.65869 | ||
| 749;0.39795;0.65873 | ||
| 750;0.39850;0.65877 | ||
| 751;0.39905;0.65879 | ||
| 752;0.39959;0.65881 | ||
| 753;0.40014;0.65884 | ||
| 754;0.40068;0.65886 | ||
| 755;0.40123;0.65888 | ||
| 756;0.40177;0.65890 | ||
| 757;0.40232;0.65893 | ||
| 758;0.40286;0.65895 | ||
| 759;0.40341;0.65897 | ||
| 760;0.40395;0.65899 | ||
| 761;0.40450;0.65901 | ||
| 762;0.40504;0.65904 | ||
| 763;0.40559;0.65906 | ||
| 764;0.40613;0.65908 | ||
| 765;0.40668;0.65910 | ||
| 766;0.40722;0.65912 | ||
| 767;0.40777;0.65914 | ||
| 768;0.40831;0.65917 | ||
| 769;0.40886;0.65919 | ||
| 770;0.40940;0.65921 | ||
| 771;0.40996;0.65925 | ||
| 772;0.41051;0.65928 | ||
| 773;0.41107;0.65932 | ||
| 774;0.41162;0.65936 | ||
| 775;0.41218;0.65940 | ||
| 776;0.41273;0.65943 | ||
| 777;0.41329;0.65947 | ||
| 778;0.41384;0.65951 | ||
| 779;0.41440;0.65954 | ||
| 780;0.41495;0.65958 | ||
| 781;0.41551;0.65962 | ||
| 782;0.41606;0.65965 | ||
| 783;0.41662;0.65969 | ||
| 784;0.41717;0.65973 | ||
| 785;0.41773;0.65976 | ||
| 786;0.41828;0.65980 | ||
| 787;0.41884;0.65983 | ||
| 788;0.41939;0.65987 | ||
| 789;0.41995;0.65991 | ||
| 790;0.42050;0.65994 | ||
| 791;0.42105;0.65997 | ||
| 792;0.42160;0.66000 | ||
| 793;0.42215;0.66002 | ||
| 794;0.42270;0.66005 | ||
| 795;0.42325;0.66008 | ||
| 796;0.42380;0.66011 | ||
| 797;0.42435;0.66013 | ||
| 798;0.42490;0.66016 | ||
| 799;0.42545;0.66019 | ||
| 800;0.42600;0.66022 | ||
| 801;0.42655;0.66024 | ||
| 802;0.42710;0.66027 | ||
| 803;0.42765;0.66030 | ||
| 804;0.42820;0.66032 | ||
| 805;0.42875;0.66035 | ||
| 806;0.42930;0.66038 | ||
| 807;0.42985;0.66040 | ||
| 808;0.43040;0.66043 | ||
| 809;0.43095;0.66046 | ||
| 810;0.43150;0.66048 | ||
| 811;0.43205;0.66050 | ||
| 812;0.43259;0.66052 | ||
| 813;0.43314;0.66054 | ||
| 814;0.43368;0.66056 | ||
| 815;0.43423;0.66058 | ||
| 816;0.43477;0.66060 | ||
| 817;0.43532;0.66061 | ||
| 818;0.43586;0.66063 | ||
| 819;0.43641;0.66065 | ||
| 820;0.43695;0.66067 | ||
| 821;0.43750;0.66069 | ||
| 822;0.43804;0.66071 | ||
| 823;0.43859;0.66072 | ||
| 824;0.43913;0.66074 | ||
| 825;0.43968;0.66076 | ||
| 826;0.44022;0.66078 | ||
| 827;0.44077;0.66080 | ||
| 828;0.44131;0.66081 | ||
| 829;0.44186;0.66083 | ||
| 830;0.44240;0.66085 | ||
| 831;0.44295;0.66087 | ||
| 832;0.44349;0.66089 | ||
| 833;0.44404;0.66090 | ||
| 834;0.44458;0.66092 | ||
| 835;0.44513;0.66094 | ||
| 836;0.44567;0.66096 | ||
| 837;0.44622;0.66097 | ||
| 838;0.44676;0.66099 | ||
| 839;0.44731;0.66101 | ||
| 840;0.44785;0.66103 | ||
| 841;0.44840;0.66105 | ||
| 842;0.44894;0.66106 | ||
| 843;0.44949;0.66108 | ||
| 844;0.45003;0.66110 | ||
| 845;0.45058;0.66111 | ||
| 846;0.45112;0.66113 | ||
| 847;0.45167;0.66115 | ||
| 848;0.45221;0.66117 | ||
| 849;0.45276;0.66118 | ||
| 850;0.45330;0.66120 | ||
| 851;0.45384;0.66121 | ||
| 852;0.45438;0.66122 | ||
| 853;0.45492;0.66123 | ||
| 854;0.45546;0.66124 | ||
| 855;0.45600;0.66125 | ||
| 856;0.45654;0.66126 | ||
| 857;0.45708;0.66127 | ||
| 858;0.45762;0.66128 | ||
| 859;0.45816;0.66129 | ||
| 860;0.45870;0.66130 | ||
| 861;0.45924;0.66131 | ||
| 862;0.45978;0.66132 | ||
| 863;0.46032;0.66133 | ||
| 864;0.46086;0.66134 | ||
| 865;0.46140;0.66134 | ||
| 866;0.46194;0.66135 | ||
| 867;0.46248;0.66136 | ||
| 868;0.46302;0.66137 | ||
| 869;0.46356;0.66138 | ||
| 870;0.46410;0.66139 | ||
| 871;0.46464;0.66140 | ||
| 872;0.46518;0.66141 | ||
| 873;0.46572;0.66142 | ||
| 874;0.46626;0.66143 | ||
| 875;0.46680;0.66144 | ||
| 876;0.46734;0.66145 | ||
| 877;0.46788;0.66146 | ||
| 878;0.46842;0.66147 | ||
| 879;0.46896;0.66147 | ||
| 880;0.46950;0.66148 | ||
| 881;0.47004;0.66149 | ||
| 882;0.47058;0.66150 | ||
| 883;0.47112;0.66151 | ||
| 884;0.47166;0.66152 | ||
| 885;0.47220;0.66153 | ||
| 886;0.47274;0.66154 | ||
| 887;0.47328;0.66155 | ||
| 888;0.47382;0.66156 | ||
| 889;0.47436;0.66157 | ||
| 890;0.47490;0.66157 | ||
| 891;0.47544;0.66158 | ||
| 892;0.47598;0.66159 | ||
| 893;0.47652;0.66160 | ||
| 894;0.47706;0.66161 | ||
| 895;0.47760;0.66162 | ||
| 896;0.47814;0.66163 | ||
| 897;0.47868;0.66164 | ||
| 898;0.47922;0.66164 | ||
| 899;0.47976;0.66165 | ||
| 900;0.48030;0.66166 | ||
| 901;0.48084;0.66167 | ||
| 902;0.48138;0.66168 | ||
| 903;0.48192;0.66169 | ||
| 904;0.48246;0.66170 | ||
| 905;0.48300;0.66171 | ||
| 906;0.48354;0.66171 | ||
| 907;0.48408;0.66172 | ||
| 908;0.48462;0.66173 | ||
| 909;0.48516;0.66174 | ||
| 910;0.48570;0.66175 | ||
| 911;0.48625;0.66177 | ||
| 912;0.48680;0.66179 | ||
| 913;0.48735;0.66181 | ||
| 914;0.48790;0.66184 | ||
| 915;0.48845;0.66186 | ||
| 916;0.48900;0.66188 | ||
| 917;0.48955;0.66190 | ||
| 918;0.49010;0.66192 | ||
| 919;0.49065;0.66195 | ||
| 920;0.49120;0.66197 | ||
| 921;0.49175;0.66199 | ||
| 922;0.49230;0.66201 | ||
| 923;0.49285;0.66203 | ||
| 924;0.49340;0.66205 | ||
| 925;0.49395;0.66208 | ||
| 926;0.49450;0.66210 | ||
| 927;0.49505;0.66212 | ||
| 928;0.49560;0.66214 | ||
| 929;0.49615;0.66216 | ||
| 930;0.49670;0.66218 | ||
| 931;0.49712;0.66203 | ||
| 932;0.49754;0.66188 | ||
| 933;0.49796;0.66173 | ||
| 934;0.49838;0.66158 | ||
| 935;0.49880;0.66143 | ||
| 936;0.49922;0.66128 | ||
| 937;0.49964;0.66113 | ||
| 938;0.50006;0.66098 | ||
| 939;0.50048;0.66083 | ||
| 940;0.50090;0.66068 | ||
| 941;0.50132;0.66053 | ||
| 942;0.50174;0.66038 | ||
| 943;0.50216;0.66023 | ||
| 944;0.50258;0.66008 | ||
| 945;0.50300;0.65994 | ||
| 946;0.50342;0.65979 | ||
| 947;0.50384;0.65964 | ||
| 948;0.50426;0.65950 | ||
| 949;0.50468;0.65935 | ||
| 950;0.50510;0.65920 | ||
| 951;0.50526;0.65871 | ||
| 952;0.50541;0.65822 | ||
| 953;0.50557;0.65773 | ||
| 954;0.50572;0.65725 | ||
| 955;0.50588;0.65676 | ||
| 956;0.50603;0.65627 | ||
| 957;0.50619;0.65579 | ||
| 958;0.50634;0.65530 | ||
| 959;0.50650;0.65482 | ||
| 960;0.50665;0.65434 | ||
| 961;0.50681;0.65386 | ||
| 962;0.50696;0.65338 | ||
| 963;0.50712;0.65290 | ||
| 964;0.50727;0.65242 | ||
| 965;0.50743;0.65194 | ||
| 966;0.50758;0.65147 | ||
| 967;0.50774;0.65099 | ||
| 968;0.50789;0.65052 | ||
| 969;0.50805;0.65005 | ||
| 970;0.50820;0.64957 | ||
| 971;0.50780;0.64840 | ||
| 972;0.50740;0.64722 | ||
| 973;0.50700;0.64604 | ||
| 974;0.50660;0.64487 | ||
| 975;0.50620;0.64370 | ||
| 976;0.50580;0.64253 | ||
| 977;0.50540;0.64137 | ||
| 978;0.50500;0.64020 | ||
| 979;0.50460;0.63904 | ||
| 980;0.50420;0.63789 | ||
| 981;0.50380;0.63673 | ||
| 982;0.50340;0.63558 | ||
| 983;0.50300;0.63443 | ||
| 984;0.50260;0.63328 | ||
| 985;0.50220;0.63213 | ||
| 986;0.50180;0.63099 | ||
| 987;0.50140;0.62984 | ||
| 988;0.50100;0.62871 | ||
| 989;0.50060;0.62757 | ||
| 990;0.50020;0.62643 | ||
| 991;0.49908;0.62440 | ||
| 992;0.49796;0.62237 | ||
| 993;0.49684;0.62035 | ||
| 994;0.49572;0.61832 | ||
| 995;0.49460;0.61631 | ||
| 996;0.49348;0.61429 | ||
| 997;0.49236;0.61229 | ||
| 998;0.49124;0.61028 | ||
| 999;0.49012;0.60828 | ||
| 1000;0.48900;0.60628 | ||
| 1001;0.49054;0.60759 | ||
| 1002;0.48925;0.60538 | ||
| 1003;0.48795;0.60317 | ||
| 1004;0.48666;0.60097 | ||
| 1005;0.48536;0.59878 | ||
| 1006;0.48407;0.59659 | ||
| 1007;0.48277;0.59440 | ||
| 1008;0.48148;0.59222 | ||
| 1009;0.47994;0.58974 | ||
| 1010;0.47799;0.58677 | ||
| 1011;0.47605;0.58381 | ||
| 1012;0.47411;0.58085 | ||
| 1013;0.47216;0.57789 | ||
| 1014;0.47008;0.57478 | ||
| 1015;0.46801;0.57168 | ||
| 1016;0.46594;0.56859 | ||
| 1017;0.46398;0.56564 | ||
| 1018;0.46204;0.56272 | ||
| 1019;0.46009;0.55981 | ||
| 1020;0.45815;0.55690 | ||
| 1021;0.45587;0.55358 | ||
| 1022;0.45334;0.54997 | ||
| 1023;0.45081;0.54637 | ||
| 1024;0.44829;0.54278 | ||
| 1025;0.44535;0.53870 | ||
| 1026;0.44147;0.53348 | ||
| 1027;0.43778;0.52851 | ||
| 1028;0.43520;0.52488 | ||
| 1029;0.43261;0.52125 | ||
| 1030;0.43002;0.51762 | ||
| 1031;0.42742;0.51400 | ||
| 1032;0.42483;0.51039 | ||
| 1033;0.42224;0.50679 | ||
| 1034;0.41872;0.50208 | ||
| 1035;0.41484;0.49694 | ||
| 1036;0.41095;0.49181 | ||
| 1037;0.40707;0.48669 | ||
| 1038;0.40318;0.48158 | ||
| 1039;0.39929;0.47648 | ||
| 1040;0.39541;0.47139 | ||
| 1041;0.39152;0.46631 | ||
| 1042;0.38710;0.46059 | ||
| 1043;0.37959;0.45123 | ||
| 1044;0.37570;0.44618 | ||
| 1045;0.37181;0.44114 | ||
| 1046;0.36793;0.43611 | ||
| 1047;0.36404;0.43110 | ||
| 1048;0.36016;0.42609 | ||
| 1049;0.35628;0.42109 | ||
| 1050;0.35239;0.41610 |
| Wavelength (nm);Responsivity (A/W);Quantum Efficiency | ||
| 350;0.04196;0.14864 | ||
| 351;0.04120;0.14554 | ||
| 352;0.04047;0.14256 | ||
| 353;0.03987;0.14005 | ||
| 354;0.03919;0.13724 | ||
| 355;0.03842;0.13419 | ||
| 356;0.03814;0.13283 | ||
| 357;0.03771;0.13096 | ||
| 358;0.03720;0.12885 | ||
| 359;0.03689;0.12740 | ||
| 360;0.03646;0.12557 | ||
| 361;0.03609;0.12395 | ||
| 362;0.03593;0.12306 | ||
| 363;0.03557;0.12149 | ||
| 364;0.03531;0.12029 | ||
| 365;0.03514;0.11937 | ||
| 366;0.03497;0.11847 | ||
| 367;0.03478;0.11749 | ||
| 368;0.03458;0.11652 | ||
| 369;0.03455;0.11608 | ||
| 370;0.03442;0.11535 | ||
| 371;0.03472;0.11604 | ||
| 372;0.03499;0.11662 | ||
| 373;0.03532;0.11739 | ||
| 374;0.03578;0.11863 | ||
| 375;0.03619;0.11967 | ||
| 376;0.03663;0.12080 | ||
| 377;0.03717;0.12226 | ||
| 378;0.03765;0.12350 | ||
| 379;0.03830;0.12529 | ||
| 380;0.03887;0.12681 | ||
| 381;0.03954;0.12868 | ||
| 382;0.04023;0.13058 | ||
| 383;0.04094;0.13255 | ||
| 384;0.04171;0.13467 | ||
| 385;0.04253;0.13695 | ||
| 386;0.04337;0.13931 | ||
| 387;0.04424;0.14174 | ||
| 388;0.04515;0.14428 | ||
| 389;0.04606;0.14682 | ||
| 390;0.04708;0.14966 | ||
| 391;0.04799;0.15219 | ||
| 392;0.04895;0.15482 | ||
| 393;0.04996;0.15760 | ||
| 394;0.05098;0.16043 | ||
| 395;0.05206;0.16341 | ||
| 396;0.05312;0.16631 | ||
| 397;0.05421;0.16930 | ||
| 398;0.05531;0.17229 | ||
| 399;0.05636;0.17513 | ||
| 400;0.05757;0.17843 | ||
| 401;0.05875;0.18163 | ||
| 402;0.05997;0.18495 | ||
| 403;0.06119;0.18826 | ||
| 404;0.06240;0.19150 | ||
| 405;0.06363;0.19479 | ||
| 406;0.06497;0.19840 | ||
| 407;0.06618;0.20159 | ||
| 408;0.06745;0.20496 | ||
| 409;0.06872;0.20833 | ||
| 410;0.07005;0.21182 | ||
| 411;0.07131;0.21512 | ||
| 412;0.07252;0.21825 | ||
| 413;0.07380;0.22155 | ||
| 414;0.07512;0.22497 | ||
| 415;0.07635;0.22810 | ||
| 416;0.07767;0.23149 | ||
| 417;0.07886;0.23448 | ||
| 418;0.08022;0.23793 | ||
| 419;0.08150;0.24116 | ||
| 420;0.08281;0.24446 | ||
| 421;0.08407;0.24758 | ||
| 422;0.08552;0.25127 | ||
| 423;0.08678;0.25436 | ||
| 424;0.08813;0.25772 | ||
| 425;0.08942;0.26085 | ||
| 426;0.09082;0.26433 | ||
| 427;0.09218;0.26765 | ||
| 428;0.09341;0.27060 | ||
| 429;0.09482;0.27405 | ||
| 430;0.09617;0.27729 | ||
| 431;0.09746;0.28035 | ||
| 432;0.09879;0.28353 | ||
| 433;0.10014;0.28675 | ||
| 434;0.10138;0.28961 | ||
| 435;0.10273;0.29281 | ||
| 436;0.10403;0.29584 | ||
| 437;0.10530;0.29877 | ||
| 438;0.10664;0.30186 | ||
| 439;0.10793;0.30483 | ||
| 440;0.10920;0.30770 | ||
| 441;0.11052;0.31072 | ||
| 442;0.11183;0.31368 | ||
| 443;0.11308;0.31649 | ||
| 444;0.11443;0.31953 | ||
| 445;0.11568;0.32229 | ||
| 446;0.11703;0.32533 | ||
| 447;0.11834;0.32824 | ||
| 448;0.11961;0.33101 | ||
| 449;0.12092;0.33391 | ||
| 450;0.12226;0.33686 | ||
| 451;0.12348;0.33947 | ||
| 452;0.12476;0.34222 | ||
| 453;0.12604;0.34496 | ||
| 454;0.12725;0.34751 | ||
| 455;0.12855;0.35028 | ||
| 456;0.12991;0.35321 | ||
| 457;0.13110;0.35566 | ||
| 458;0.13240;0.35841 | ||
| 459;0.13371;0.36116 | ||
| 460;0.13501;0.36389 | ||
| 461;0.13623;0.36637 | ||
| 462;0.13757;0.36918 | ||
| 463;0.13880;0.37169 | ||
| 464;0.14007;0.37427 | ||
| 465;0.14138;0.37697 | ||
| 466;0.14262;0.37945 | ||
| 467;0.14387;0.38196 | ||
| 468;0.14517;0.38460 | ||
| 469;0.14642;0.38708 | ||
| 470;0.14765;0.38950 | ||
| 471;0.14894;0.39206 | ||
| 472;0.15017;0.39446 | ||
| 473;0.15141;0.39689 | ||
| 474;0.15269;0.39939 | ||
| 475;0.15390;0.40171 | ||
| 476;0.15516;0.40414 | ||
| 477;0.15638;0.40648 | ||
| 478;0.15758;0.40872 | ||
| 479;0.15876;0.41094 | ||
| 480;0.16005;0.41341 | ||
| 481;0.16127;0.41569 | ||
| 482;0.16253;0.41808 | ||
| 483;0.16375;0.42033 | ||
| 484;0.16499;0.42264 | ||
| 485;0.16618;0.42482 | ||
| 486;0.16750;0.42731 | ||
| 487;0.16868;0.42945 | ||
| 488;0.16994;0.43175 | ||
| 489;0.17113;0.43389 | ||
| 490;0.17242;0.43627 | ||
| 491;0.17362;0.43841 | ||
| 492;0.17483;0.44058 | ||
| 493;0.17609;0.44285 | ||
| 494;0.17728;0.44493 | ||
| 495;0.17847;0.44702 | ||
| 496;0.17972;0.44924 | ||
| 497;0.18090;0.45128 | ||
| 498;0.18214;0.45347 | ||
| 499;0.18341;0.45571 | ||
| 500;0.18460;0.45776 | ||
| 501;0.18578;0.45977 | ||
| 502;0.18702;0.46191 | ||
| 503;0.18821;0.46392 | ||
| 504;0.18946;0.46608 | ||
| 505;0.19070;0.46819 | ||
| 506;0.19197;0.47037 | ||
| 507;0.19312;0.47226 | ||
| 508;0.19439;0.47444 | ||
| 509;0.19557;0.47637 | ||
| 510;0.19683;0.47851 | ||
| 511;0.19797;0.48034 | ||
| 512;0.19919;0.48236 | ||
| 513;0.20036;0.48423 | ||
| 514;0.20158;0.48624 | ||
| 515;0.20278;0.48819 | ||
| 516;0.20404;0.49028 | ||
| 517;0.20520;0.49209 | ||
| 518;0.20639;0.49401 | ||
| 519;0.20767;0.49611 | ||
| 520;0.20889;0.49805 | ||
| 521;0.21014;0.50008 | ||
| 522;0.21136;0.50202 | ||
| 523;0.21253;0.50383 | ||
| 524;0.21378;0.50583 | ||
| 525;0.21498;0.50770 | ||
| 526;0.21625;0.50972 | ||
| 527;0.21744;0.51156 | ||
| 528;0.21864;0.51342 | ||
| 529;0.21987;0.51533 | ||
| 530;0.22102;0.51703 | ||
| 531;0.22220;0.51882 | ||
| 532;0.22342;0.52068 | ||
| 533;0.22466;0.52259 | ||
| 534;0.22583;0.52434 | ||
| 535;0.22705;0.52618 | ||
| 536;0.22821;0.52788 | ||
| 537;0.22941;0.52966 | ||
| 538;0.23064;0.53152 | ||
| 539;0.23176;0.53312 | ||
| 540;0.23304;0.53505 | ||
| 541;0.23421;0.53675 | ||
| 542;0.23548;0.53867 | ||
| 543;0.23663;0.54030 | ||
| 544;0.23782;0.54203 | ||
| 545;0.23898;0.54367 | ||
| 546;0.24017;0.54538 | ||
| 547;0.24141;0.54719 | ||
| 548;0.24256;0.54878 | ||
| 549;0.24373;0.55044 | ||
| 550;0.24489;0.55205 | ||
| 551;0.24610;0.55377 | ||
| 552;0.24721;0.55526 | ||
| 553;0.24845;0.55702 | ||
| 554;0.24961;0.55863 | ||
| 555;0.25088;0.56045 | ||
| 556;0.25202;0.56198 | ||
| 557;0.25325;0.56373 | ||
| 558;0.25439;0.56524 | ||
| 559;0.25552;0.56674 | ||
| 560;0.25671;0.56836 | ||
| 561;0.25795;0.57009 | ||
| 562;0.25908;0.57155 | ||
| 563;0.26025;0.57313 | ||
| 564;0.26144;0.57472 | ||
| 565;0.26267;0.57640 | ||
| 566;0.26387;0.57801 | ||
| 567;0.26500;0.57947 | ||
| 568;0.26616;0.58097 | ||
| 569;0.26734;0.58253 | ||
| 570;0.26850;0.58402 | ||
| 571;0.27159;0.58972 | ||
| 572;0.27260;0.59088 | ||
| 573;0.27366;0.59213 | ||
| 574;0.27468;0.59331 | ||
| 575;0.27583;0.59476 | ||
| 576;0.27664;0.59547 | ||
| 577;0.27785;0.59704 | ||
| 578;0.27910;0.59868 | ||
| 579;0.28010;0.59979 | ||
| 580;0.28122;0.60115 | ||
| 581;0.28235;0.60253 | ||
| 582;0.28353;0.60401 | ||
| 583;0.28461;0.60527 | ||
| 584;0.28569;0.60652 | ||
| 585;0.28689;0.60803 | ||
| 586;0.28804;0.60943 | ||
| 587;0.28932;0.61110 | ||
| 588;0.29031;0.61213 | ||
| 589;0.29149;0.61358 | ||
| 590;0.29265;0.61499 | ||
| 591;0.29376;0.61628 | ||
| 592;0.29485;0.61752 | ||
| 593;0.29604;0.61896 | ||
| 594;0.29717;0.62027 | ||
| 595;0.29833;0.62165 | ||
| 596;0.29961;0.62326 | ||
| 597;0.30066;0.62441 | ||
| 598;0.30182;0.62578 | ||
| 599;0.30294;0.62704 | ||
| 600;0.30407;0.62834 | ||
| 601;0.30519;0.62961 | ||
| 602;0.30637;0.63099 | ||
| 603;0.30753;0.63231 | ||
| 604;0.30875;0.63378 | ||
| 605;0.30990;0.63509 | ||
| 606;0.31108;0.63645 | ||
| 607;0.31223;0.63775 | ||
| 608;0.31338;0.63905 | ||
| 609;0.31453;0.64034 | ||
| 610;0.31571;0.64169 | ||
| 611;0.31680;0.64284 | ||
| 612;0.31799;0.64420 | ||
| 613;0.31913;0.64546 | ||
| 614;0.32029;0.64675 | ||
| 615;0.32150;0.64815 | ||
| 616;0.32264;0.64939 | ||
| 617;0.32380;0.65066 | ||
| 618;0.32489;0.65181 | ||
| 619;0.32613;0.65322 | ||
| 620;0.32716;0.65423 | ||
| 621;0.32832;0.65550 | ||
| 622;0.32949;0.65679 | ||
| 623;0.33069;0.65811 | ||
| 624;0.33185;0.65936 | ||
| 625;0.33303;0.66064 | ||
| 626;0.33425;0.66202 | ||
| 627;0.33532;0.66307 | ||
| 628;0.33651;0.66436 | ||
| 629;0.33759;0.66543 | ||
| 630;0.33874;0.66665 | ||
| 631;0.33991;0.66788 | ||
| 632;0.34103;0.66901 | ||
| 633;0.34226;0.67038 | ||
| 634;0.34339;0.67152 | ||
| 635;0.34467;0.67298 | ||
| 636;0.34578;0.67408 | ||
| 637;0.34686;0.67512 | ||
| 638;0.34805;0.67638 | ||
| 639;0.34912;0.67740 | ||
| 640;0.35022;0.67847 | ||
| 641;0.35136;0.67961 | ||
| 642;0.35249;0.68074 | ||
| 643;0.35368;0.68197 | ||
| 644;0.35481;0.68308 | ||
| 645;0.35599;0.68429 | ||
| 646;0.35705;0.68528 | ||
| 647;0.35819;0.68639 | ||
| 648;0.35932;0.68750 | ||
| 649;0.36046;0.68862 | ||
| 650;0.36157;0.68969 | ||
| 651;0.36270;0.69078 | ||
| 652;0.36389;0.69198 | ||
| 653;0.36489;0.69281 | ||
| 654;0.36603;0.69392 | ||
| 655;0.36718;0.69503 | ||
| 656;0.36841;0.69630 | ||
| 657;0.36956;0.69741 | ||
| 658;0.37074;0.69856 | ||
| 659;0.37189;0.69967 | ||
| 660;0.37302;0.70074 | ||
| 661;0.37409;0.70169 | ||
| 662;0.37514;0.70260 | ||
| 663;0.37623;0.70357 | ||
| 664;0.37732;0.70454 | ||
| 665;0.37846;0.70561 | ||
| 666;0.37957;0.70662 | ||
| 667;0.38071;0.70767 | ||
| 668;0.38179;0.70862 | ||
| 669;0.38298;0.70977 | ||
| 670;0.38414;0.71085 | ||
| 671;0.38501;0.71140 | ||
| 672;0.38618;0.71250 | ||
| 673;0.38737;0.71364 | ||
| 674;0.38844;0.71455 | ||
| 675;0.38953;0.71549 | ||
| 676;0.39063;0.71644 | ||
| 677;0.39179;0.71752 | ||
| 678;0.39293;0.71854 | ||
| 679;0.39402;0.71947 | ||
| 680;0.39511;0.72039 | ||
| 681;0.39619;0.72130 | ||
| 682;0.39728;0.72224 | ||
| 683;0.39844;0.72328 | ||
| 684;0.39949;0.72412 | ||
| 685;0.40057;0.72502 | ||
| 686;0.40179;0.72617 | ||
| 687;0.40284;0.72702 | ||
| 688;0.40394;0.72793 | ||
| 689;0.40500;0.72878 | ||
| 690;0.40609;0.72969 | ||
| 691;0.40715;0.73054 | ||
| 692;0.40818;0.73133 | ||
| 693;0.40922;0.73214 | ||
| 694;0.41030;0.73300 | ||
| 695;0.41143;0.73397 | ||
| 696;0.41244;0.73470 | ||
| 697;0.41345;0.73546 | ||
| 698;0.41450;0.73626 | ||
| 699;0.41560;0.73716 | ||
| 700;0.41663;0.73793 | ||
| 701;0.41770;0.73877 | ||
| 702;0.41873;0.73954 | ||
| 703;0.41969;0.74018 | ||
| 704;0.42084;0.74116 | ||
| 705;0.42186;0.74190 | ||
| 706;0.42291;0.74269 | ||
| 707;0.42389;0.74337 | ||
| 708;0.42499;0.74424 | ||
| 709;0.42601;0.74498 | ||
| 710;0.42701;0.74567 | ||
| 711;0.42811;0.74654 | ||
| 712;0.42911;0.74724 | ||
| 713;0.43012;0.74794 | ||
| 714;0.43113;0.74865 | ||
| 715;0.43212;0.74932 | ||
| 716;0.43306;0.74989 | ||
| 717;0.43420;0.75082 | ||
| 718;0.43513;0.75138 | ||
| 719;0.43619;0.75216 | ||
| 720;0.43727;0.75297 | ||
| 721;0.43812;0.75339 | ||
| 722;0.43923;0.75425 | ||
| 723;0.44027;0.75500 | ||
| 724;0.44127;0.75567 | ||
| 725;0.44239;0.75654 | ||
| 726;0.44340;0.75723 | ||
| 727;0.44435;0.75781 | ||
| 728;0.44538;0.75852 | ||
| 729;0.44644;0.75929 | ||
| 730;0.44741;0.75989 | ||
| 731;0.44840;0.76054 | ||
| 732;0.44948;0.76132 | ||
| 733;0.45041;0.76185 | ||
| 734;0.45144;0.76255 | ||
| 735;0.45242;0.76318 | ||
| 736;0.45346;0.76389 | ||
| 737;0.45441;0.76444 | ||
| 738;0.45539;0.76506 | ||
| 739;0.45643;0.76577 | ||
| 740;0.45737;0.76631 | ||
| 741;0.45842;0.76703 | ||
| 742;0.45933;0.76752 | ||
| 743;0.46027;0.76805 | ||
| 744;0.46129;0.76873 | ||
| 745;0.46224;0.76926 | ||
| 746;0.46313;0.76972 | ||
| 747;0.46416;0.77039 | ||
| 748;0.46519;0.77107 | ||
| 749;0.46615;0.77163 | ||
| 750;0.46701;0.77203 | ||
| 751;0.46802;0.77267 | ||
| 752;0.46890;0.77309 | ||
| 753;0.46978;0.77350 | ||
| 754;0.47069;0.77398 | ||
| 755;0.47173;0.77466 | ||
| 756;0.47259;0.77506 | ||
| 757;0.47355;0.77560 | ||
| 758;0.47441;0.77598 | ||
| 759;0.47532;0.77644 | ||
| 760;0.47636;0.77713 | ||
| 761;0.47724;0.77753 | ||
| 762;0.47820;0.77808 | ||
| 763;0.47903;0.77840 | ||
| 764;0.47994;0.77886 | ||
| 765;0.48086;0.77933 | ||
| 766;0.48172;0.77970 | ||
| 767;0.48260;0.78012 | ||
| 768;0.48346;0.78048 | ||
| 769;0.48440;0.78099 | ||
| 770;0.48524;0.78133 | ||
| 771;0.48609;0.78168 | ||
| 772;0.48697;0.78209 | ||
| 773;0.48790;0.78255 | ||
| 774;0.48881;0.78300 | ||
| 775;0.48960;0.78327 | ||
| 776;0.49050;0.78368 | ||
| 777;0.49126;0.78389 | ||
| 778;0.49214;0.78429 | ||
| 779;0.49300;0.78465 | ||
| 780;0.49394;0.78514 | ||
| 781;0.49478;0.78547 | ||
| 782;0.49561;0.78578 | ||
| 783;0.49645;0.78610 | ||
| 784;0.49727;0.78640 | ||
| 785;0.49810;0.78671 | ||
| 786;0.49894;0.78703 | ||
| 787;0.49984;0.78744 | ||
| 788;0.50071;0.78782 | ||
| 789;0.50153;0.78811 | ||
| 790;0.50229;0.78831 | ||
| 791;0.50316;0.78868 | ||
| 792;0.50391;0.78884 | ||
| 793;0.50470;0.78909 | ||
| 794;0.50556;0.78944 | ||
| 795;0.50631;0.78962 | ||
| 796;0.50710;0.78985 | ||
| 797;0.50800;0.79026 | ||
| 798;0.50882;0.79054 | ||
| 799;0.50970;0.79092 | ||
| 800;0.51052;0.79121 | ||
| 801;0.51130;0.79142 | ||
| 802;0.51213;0.79173 | ||
| 803;0.51288;0.79190 | ||
| 804;0.51375;0.79225 | ||
| 805;0.51451;0.79244 | ||
| 806;0.51536;0.79277 | ||
| 807;0.51623;0.79311 | ||
| 808;0.51691;0.79318 | ||
| 809;0.51766;0.79335 | ||
| 810;0.51868;0.79393 | ||
| 811;0.51940;0.79405 | ||
| 812;0.52007;0.79410 | ||
| 813;0.52092;0.79441 | ||
| 814;0.52164;0.79453 | ||
| 815;0.52244;0.79477 | ||
| 816;0.52325;0.79503 | ||
| 817;0.52405;0.79527 | ||
| 818;0.52478;0.79540 | ||
| 819;0.52553;0.79557 | ||
| 820;0.52633;0.79581 | ||
| 821;0.52711;0.79602 | ||
| 822;0.52794;0.79630 | ||
| 823;0.52873;0.79653 | ||
| 824;0.52942;0.79659 | ||
| 825;0.53015;0.79673 | ||
| 826;0.53102;0.79707 | ||
| 827;0.53188;0.79740 | ||
| 828;0.53264;0.79757 | ||
| 829;0.53340;0.79774 | ||
| 830;0.53418;0.79795 | ||
| 831;0.53491;0.79808 | ||
| 832;0.53565;0.79823 | ||
| 833;0.53637;0.79833 | ||
| 834;0.53708;0.79844 | ||
| 835;0.53790;0.79870 | ||
| 836;0.53865;0.79886 | ||
| 837;0.53940;0.79901 | ||
| 838;0.54025;0.79931 | ||
| 839;0.54087;0.79928 | ||
| 840;0.54167;0.79951 | ||
| 841;0.54235;0.79955 | ||
| 842;0.54322;0.79989 | ||
| 843;0.54385;0.79987 | ||
| 844;0.54455;0.79994 | ||
| 845;0.54534;0.80016 | ||
| 846;0.54608;0.80030 | ||
| 847;0.54671;0.80027 | ||
| 848;0.54761;0.80065 | ||
| 849;0.54827;0.80067 | ||
| 850;0.54906;0.80087 | ||
| 851;0.54971;0.80089 | ||
| 852;0.55038;0.80091 | ||
| 853;0.55107;0.80099 | ||
| 854;0.55165;0.80088 | ||
| 855;0.55252;0.80122 | ||
| 856;0.55313;0.80117 | ||
| 857;0.55388;0.80130 | ||
| 858;0.55460;0.80142 | ||
| 859;0.55526;0.80143 | ||
| 860;0.55588;0.80141 | ||
| 861;0.55690;0.80194 | ||
| 862;0.55761;0.80202 | ||
| 863;0.55827;0.80204 | ||
| 864;0.55899;0.80214 | ||
| 865;0.55965;0.80217 | ||
| 866;0.56026;0.80212 | ||
| 867;0.56088;0.80208 | ||
| 868;0.56160;0.80218 | ||
| 869;0.56222;0.80215 | ||
| 870;0.56291;0.80221 | ||
| 871;0.56347;0.80208 | ||
| 872;0.56431;0.80236 | ||
| 873;0.56484;0.80219 | ||
| 874;0.56543;0.80211 | ||
| 875;0.56622;0.80232 | ||
| 876;0.56690;0.80236 | ||
| 877;0.56749;0.80228 | ||
| 878;0.56820;0.80237 | ||
| 879;0.56877;0.80225 | ||
| 880;0.56942;0.80226 | ||
| 881;0.57004;0.80222 | ||
| 882;0.57062;0.80214 | ||
| 883;0.57126;0.80212 | ||
| 884;0.57183;0.80201 | ||
| 885;0.57267;0.80229 | ||
| 886;0.57321;0.80213 | ||
| 887;0.57382;0.80208 | ||
| 888;0.57443;0.80203 | ||
| 889;0.57514;0.80212 | ||
| 890;0.57566;0.80194 | ||
| 891;0.57632;0.80197 | ||
| 892;0.57690;0.80186 | ||
| 893;0.57751;0.80182 | ||
| 894;0.57809;0.80172 | ||
| 895;0.57875;0.80175 | ||
| 896;0.57939;0.80173 | ||
| 897;0.58000;0.80169 | ||
| 898;0.58066;0.80170 | ||
| 899;0.58125;0.80163 | ||
| 900;0.58180;0.80148 | ||
| 901;0.58234;0.80134 | ||
| 902;0.58293;0.80126 | ||
| 903;0.58360;0.80130 | ||
| 904;0.58411;0.80111 | ||
| 905;0.58481;0.80119 | ||
| 906;0.58539;0.80109 | ||
| 907;0.58605;0.80111 | ||
| 908;0.58655;0.80091 | ||
| 909;0.58711;0.80079 | ||
| 910;0.58772;0.80074 | ||
| 911;0.58830;0.80066 | ||
| 912;0.58888;0.80057 | ||
| 913;0.58963;0.80071 | ||
| 914;0.59019;0.80060 | ||
| 915;0.59080;0.80054 | ||
| 916;0.59137;0.80044 | ||
| 917;0.59206;0.80051 | ||
| 918;0.59273;0.80054 | ||
| 919;0.59316;0.80024 | ||
| 920;0.59379;0.80022 | ||
| 921;0.59448;0.80028 | ||
| 922;0.59511;0.80027 | ||
| 923;0.59555;0.79998 | ||
| 924;0.59613;0.79990 | ||
| 925;0.59676;0.79989 | ||
| 926;0.59732;0.79976 | ||
| 927;0.59781;0.79956 | ||
| 928;0.59837;0.79945 | ||
| 929;0.59890;0.79929 | ||
| 930;0.59955;0.79930 | ||
| 931;0.60001;0.79906 | ||
| 932;0.60050;0.79885 | ||
| 933;0.60088;0.79849 | ||
| 934;0.60136;0.79827 | ||
| 935;0.60165;0.79780 | ||
| 936;0.60214;0.79760 | ||
| 937;0.60243;0.79713 | ||
| 938;0.60292;0.79693 | ||
| 939;0.60350;0.79685 | ||
| 940;0.60378;0.79638 | ||
| 941;0.60428;0.79619 | ||
| 942;0.60468;0.79587 | ||
| 943;0.60513;0.79561 | ||
| 944;0.60564;0.79544 | ||
| 945;0.60599;0.79506 | ||
| 946;0.60643;0.79479 | ||
| 947;0.60688;0.79454 | ||
| 948;0.60732;0.79428 | ||
| 949;0.60764;0.79386 | ||
| 950;0.60814;0.79368 | ||
| 951;0.60813;0.79283 | ||
| 952;0.60826;0.79217 | ||
| 953;0.60845;0.79159 | ||
| 954;0.60857;0.79091 | ||
| 955;0.60861;0.79013 | ||
| 956;0.60880;0.78955 | ||
| 957;0.60889;0.78885 | ||
| 958;0.60903;0.78820 | ||
| 959;0.60917;0.78756 | ||
| 960;0.60925;0.78685 | ||
| 961;0.60941;0.78624 | ||
| 962;0.60959;0.78565 | ||
| 963;0.60967;0.78494 | ||
| 964;0.60989;0.78440 | ||
| 965;0.61002;0.78376 | ||
| 966;0.61008;0.78303 | ||
| 967;0.61026;0.78245 | ||
| 968;0.61032;0.78172 | ||
| 969;0.61043;0.78105 | ||
| 970;0.61046;0.78028 | ||
| 971;0.60985;0.77870 | ||
| 972;0.60938;0.77729 | ||
| 973;0.60880;0.77576 | ||
| 974;0.60833;0.77437 | ||
| 975;0.60777;0.77285 | ||
| 976;0.60720;0.77135 | ||
| 977;0.60672;0.76995 | ||
| 978;0.60603;0.76828 | ||
| 979;0.60551;0.76684 | ||
| 980;0.60492;0.76531 | ||
| 981;0.60429;0.76374 | ||
| 982;0.60368;0.76219 | ||
| 983;0.60318;0.76078 | ||
| 984;0.60247;0.75911 | ||
| 985;0.60181;0.75752 | ||
| 986;0.60120;0.75597 | ||
| 987;0.60053;0.75437 | ||
| 988;0.59972;0.75259 | ||
| 989;0.59906;0.75100 | ||
| 990;0.59840;0.74941 | ||
| 991;0.59681;0.74668 | ||
| 992;0.59529;0.74402 | ||
| 993;0.59358;0.74113 | ||
| 994;0.59193;0.73834 | ||
| 995;0.59032;0.73558 | ||
| 996;0.58862;0.73272 | ||
| 997;0.58686;0.72980 | ||
| 998;0.58509;0.72688 | ||
| 999;0.58334;0.72397 | ||
| 1000;0.58151;0.72098 | ||
| 1001;0.58285;0.72191 | ||
| 1002;0.58079;0.71865 | ||
| 1003;0.57875;0.71542 | ||
| 1004;0.57634;0.71173 | ||
| 1005;0.57430;0.70850 | ||
| 1006;0.57203;0.70499 | ||
| 1007;0.56986;0.70162 | ||
| 1008;0.56765;0.69822 | ||
| 1009;0.56514;0.69443 | ||
| 1010;0.56198;0.68987 | ||
| 1011;0.55874;0.68521 | ||
| 1012;0.55559;0.68068 | ||
| 1013;0.55242;0.67612 | ||
| 1014;0.54880;0.67104 | ||
| 1015;0.54541;0.66622 | ||
| 1016;0.54181;0.66118 | ||
| 1017;0.53856;0.65657 | ||
| 1018;0.53514;0.65176 | ||
| 1019;0.53158;0.64678 | ||
| 1020;0.52798;0.64178 | ||
| 1021;0.52405;0.63637 | ||
| 1022;0.51979;0.63059 | ||
| 1023;0.51542;0.62467 | ||
| 1024;0.51092;0.61861 | ||
| 1025;0.50622;0.61232 | ||
| 1026;0.50003;0.60425 | ||
| 1027;0.49422;0.59665 | ||
| 1028;0.48961;0.59051 | ||
| 1029;0.48485;0.58420 | ||
| 1030;0.48022;0.57806 | ||
| 1031;0.47540;0.57170 | ||
| 1032;0.47058;0.56535 | ||
| 1033;0.46592;0.55921 | ||
| 1034;0.45987;0.55142 | ||
| 1035;0.45371;0.54351 | ||
| 1036;0.44722;0.53521 | ||
| 1037;0.44109;0.52737 | ||
| 1038;0.43476;0.51930 | ||
| 1039;0.42843;0.51125 | ||
| 1040;0.42218;0.50330 | ||
| 1041;0.41566;0.49506 | ||
| 1042;0.40889;0.48653 | ||
| 1043;0.39868;0.47392 | ||
| 1044;0.39249;0.46611 | ||
| 1045;0.38634;0.45837 | ||
| 1046;0.38003;0.45045 | ||
| 1047;0.37392;0.44279 | ||
| 1048;0.36778;0.43510 | ||
| 1049;0.36164;0.42743 | ||
| 1050;0.35551;0.41978 |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Alert delta unavailable
Currently unable to show alert delta for PyPI packages.
1820152
-1.35%47
-6%4154
-7.03%