New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details →
Socket
Book a DemoSign in
Socket

rawplot

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

rawplot - pypi Package Compare versions

Comparing version
0.9.8
to
0.9.9
+3
-0
.gitignore

@@ -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

@@ -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"]

@@ -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)

@@ -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"]

@@ -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