diff --git a/Cargo.toml b/Cargo.toml index 02d7ec85..578be356 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,8 @@ [workspace] resolver = "2" -members = [ - "clovers", - "clovers-cli", -] +members = ["clovers", "clovers-cli"] + +[profile.release] +codegen-units = 1 +lto = "fat" diff --git a/README.md b/README.md index 317fdba4..923a23be 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,15 @@ This repository has some example model files for demonstrating triangle-based ob - Stanford Bunny model `bunny.stl` CC Attribution 3.0 Unported [Wikipedia](https://commons.wikimedia.org/wiki/File:Stanford_Bunny.stl) - Stanford Dragon model `dragon.stl` (stl converted version) CC Attribution [Thingiverse](https://www.thingiverse.com/thing:27666) - Rubber Duck model `duck.stl` CC0 1.0 Universal Public Domain [Thingiverse](https://www.thingiverse.com/thing:139894) +- Triangular Prism model `prism.stl` Public Domain [Wikipedia](https://commons.wikimedia.org/wiki/File:Triangular_prism.stl) + +## Useful references + +Making this renderer would not have been possible without the availability of an abundance of great literature. Here are listed some of the sources that have been useful: + +- [Ray Tracing in One Weekend](https://raytracing.github.io/books/RayTracingInOneWeekend.html) +- [Ray Tracing: The Next Week](https://raytracing.github.io/books/RayTracingTheNextWeek.html) +- [Ray Tracing: The Rest of Your Life](https://raytracing.github.io/books/RayTracingTheRestOfYourLife.html) +- [Physically Meaningful Rendering using Tristimulus Colours](https://doi.org/10.1111/cgf.12676) +- [Hero Wavelength Spectral Sampling](https://doi.org/10.1111/cgf.12419) +- [How to interpret the sRGB color space](https://color.org/chardata/rgb/sRGB.pdf) diff --git a/clovers-cli/Cargo.toml b/clovers-cli/Cargo.toml index 958379f1..c8240161 100644 --- a/clovers-cli/Cargo.toml +++ b/clovers-cli/Cargo.toml @@ -10,16 +10,27 @@ path = "src/main.rs" [dependencies] # Internal -clovers = { path = "../clovers", features = ["serde-derive", "stl", "traces", "gl_tf"], default-features = false } +clovers = { path = "../clovers", features = [ + "serde-derive", + "stl", + "traces", + "gl_tf", +], default-features = false } # External clap = { version = "4.4.1", features = ["std", "derive"] } human_format = "1.0.3" humantime = "2.1.0" -image = { version = "0.24.7", features = ["png"], default-features = false } +image = { version = "0.24.7", features = ["png"], default-features = false } img-parts = "0.3.0" -indicatif = { version = "0.17.6", features = ["rayon"], default-features = false } -rand = { version = "0.8.5", features = ["small_rng", "getrandom"], default-features = false } +indicatif = { version = "0.17.6", features = [ + "rayon", +], default-features = false } +palette = { version = "0.7.3", features = ["serializing"] } +rand = { version = "0.8.5", features = [ + "small_rng", + "getrandom", +], default-features = false } rayon = "1.7.0" serde = { version = "1.0.188", features = ["derive"], default-features = false } serde_json = { version = "1.0", features = ["alloc"], default-features = false } diff --git a/clovers-cli/src/draw_cpu.rs b/clovers-cli/src/draw_cpu.rs index 9d32204f..389ab6d1 100644 --- a/clovers-cli/src/draw_cpu.rs +++ b/clovers-cli/src/draw_cpu.rs @@ -1,14 +1,18 @@ -use crate::{color::Color, colorize::colorize, normals::normal_map, ray::Ray, scenes, Float}; +use crate::{colorize::colorize, normals::normal_map, ray::Ray, scenes, Float}; use clovers::RenderOpts; use indicatif::{ProgressBar, ProgressDrawTarget, ProgressStyle}; +use palette::chromatic_adaptation::AdaptInto; +use palette::convert::IntoColorUnclamped; +use palette::white_point::E; +use palette::{IntoColor, LinSrgb, Srgb, Xyz}; use rand::rngs::SmallRng; use rand::{Rng, SeedableRng}; use rayon::prelude::*; use scenes::Scene; use std::time::Duration; -/// The main drawing function, returns a `Vec` as a pixelbuffer. -pub fn draw(opts: RenderOpts, scene: &Scene) -> Vec { +/// The main drawing function, returns a `Vec` as a pixelbuffer. +pub fn draw(opts: RenderOpts, scene: &Scene) -> Vec> { // Progress bar let pixels = (opts.width * opts.height) as u64; let bar = ProgressBar::new(pixels); @@ -22,7 +26,7 @@ pub fn draw(opts: RenderOpts, scene: &Scene) -> Vec { bar.enable_steady_tick(Duration::from_millis(100)); } - let black = Color::new(0.0, 0.0, 0.0); + let black: Srgb = Srgb::new(0, 0, 0); let mut pixelbuffer = vec![black; pixels as usize]; pixelbuffer @@ -40,7 +44,7 @@ pub fn draw(opts: RenderOpts, scene: &Scene) -> Vec { let mut rng = SmallRng::from_entropy(); // Initialize a mutable base color for the pixel - let mut color: Color = Color::new(0.0, 0.0, 0.0); + let mut color: LinSrgb = LinSrgb::new(0.0, 0.0, 0.0); if opts.normalmap { // If we are rendering just a normalmap, make it quick and early return @@ -48,7 +52,8 @@ pub fn draw(opts: RenderOpts, scene: &Scene) -> Vec { let v = y / height; let ray: Ray = scene.camera.get_ray(u, v, &mut rng); color = normal_map(&ray, scene, &mut rng); - *pixel = color; + let color: Srgb = color.into_color(); + *pixel = color.into_format(); return; } // Otherwise, do a regular render @@ -60,10 +65,9 @@ pub fn draw(opts: RenderOpts, scene: &Scene) -> Vec { } } color /= opts.samples as Float; - - // After multisampling, perform gamma correction and store final color into the pixel - color = color.gamma_correction(opts.gamma); - *pixel = color; + // Gamma / component transfer function + let color: Srgb = color.into_color(); + *pixel = color.into_format(); bar.inc(1); }); @@ -80,13 +84,14 @@ fn sample( height: Float, rng: &mut SmallRng, max_depth: u32, -) -> Option { +) -> Option { let u = (x + rng.gen::()) / width; let v = (y + rng.gen::()) / height; let ray: Ray = scene.camera.get_ray(u, v, rng); - let new_color = colorize(&ray, scene, 0, max_depth, rng); - // skip NaN and Infinity - if new_color.r.is_finite() && new_color.g.is_finite() && new_color.b.is_finite() { + let new_color: Xyz = colorize(&ray, scene, 0, max_depth, rng); + let new_color: Xyz = new_color.adapt_into(); + let new_color: LinSrgb = new_color.into_color_unclamped(); + if new_color.red.is_finite() && new_color.green.is_finite() && new_color.blue.is_finite() { return Some(new_color); } None diff --git a/clovers-cli/src/main.rs b/clovers-cli/src/main.rs index 4923b397..1db98d37 100644 --- a/clovers-cli/src/main.rs +++ b/clovers-cli/src/main.rs @@ -45,9 +45,6 @@ struct Opts { /// Maximum evaluated bounce depth for each ray #[clap(short = 'd', long, default_value = "100")] max_depth: u32, - /// Gamma correction value - #[clap(short, long, default_value = "2.0")] - gamma: Float, /// Suppress most of the text output #[clap(short, long)] quiet: bool, @@ -96,7 +93,6 @@ fn main() -> Result<(), Box> { height: opts.height, samples: opts.samples, max_depth: opts.max_depth, - gamma: opts.gamma, quiet: opts.quiet, normalmap: opts.normalmap, }; @@ -127,7 +123,7 @@ fn main() -> Result<(), Box> { let mut img: RgbImage = ImageBuffer::new(width, height); img.enumerate_pixels_mut().for_each(|(x, y, pixel)| { let index = y * width + x; - *pixel = Rgb(pixelbuffer[index as usize].to_rgb_u8()); + *pixel = Rgb(pixelbuffer[index as usize].into()); }); // Graphics assume origin at bottom left corner of the screen diff --git a/clovers/Cargo.toml b/clovers/Cargo.toml index f7dd7e5c..86ae4580 100644 --- a/clovers/Cargo.toml +++ b/clovers/Cargo.toml @@ -21,9 +21,12 @@ traces = ["tracing"] enum_dispatch = "0.3.12" gltf = { version = "1.3.0", optional = true } nalgebra = { version = "0.32.3", features = ["libm"], default-features = false } +palette = { version = "0.7.3", features = ["serializing"] } rand = { version = "0.8.5", features = ["small_rng"], default-features = false } rand_distr = "0.4.3" -serde = { version = "1.0.188", features = ["derive"], default-features = false, optional = true } +serde = { version = "1.0.188", features = [ + "derive", +], default-features = false, optional = true } stl_io = { version = "0.7.0", optional = true } tracing = { version = "0.1.37", optional = true } diff --git a/clovers/benches/random.rs b/clovers/benches/random.rs index d2af4de6..d4afc018 100644 --- a/clovers/benches/random.rs +++ b/clovers/benches/random.rs @@ -8,7 +8,7 @@ pub fn criterion_benchmark(c: &mut Criterion) { let mut rng = SmallRng::from_entropy(); c.bench_function("random in unit sphere", |b| { - b.iter(|| random_in_unit_sphere(black_box(&mut rng))) + b.iter(|| random_unit_vector(black_box(&mut rng))) }); c.bench_function("random in unit disk", |b| { @@ -25,7 +25,7 @@ pub fn criterion_benchmark(c: &mut Criterion) { let normal = Vec3::new(1.0, 0.0, 0.0); c.bench_function("random in hemisphere", |b| { - b.iter(|| random_in_hemisphere(normal, black_box(&mut rng))) + b.iter(|| random_on_hemisphere(normal, black_box(&mut rng))) }); } diff --git a/clovers/src/bvhnode.rs b/clovers/src/bvhnode.rs index 708bfcdb..5bc672da 100644 --- a/clovers/src/bvhnode.rs +++ b/clovers/src/bvhnode.rs @@ -8,6 +8,7 @@ use crate::{ aabb::AABB, hitable::{Empty, HitRecord, Hitable, HitableTrait}, ray::Ray, + wavelength::Wavelength, Box, Float, Vec, Vec3, }; @@ -184,13 +185,20 @@ impl<'scene> HitableTrait for BVHNode<'scene> { /// Returns a probability density function value based on the children #[must_use] - fn pdf_value(&self, origin: Vec3, vector: Vec3, time: f32, rng: &mut SmallRng) -> f32 { + fn pdf_value( + &self, + origin: Vec3, + vector: Vec3, + wavelength: Wavelength, + time: Float, + rng: &mut SmallRng, + ) -> Float { match (&*self.left, &*self.right) { - (_, Hitable::Empty(_)) => self.left.pdf_value(origin, vector, time, rng), - (Hitable::Empty(_), _) => self.right.pdf_value(origin, vector, time, rng), + (_, Hitable::Empty(_)) => self.left.pdf_value(origin, vector, wavelength, time, rng), + (Hitable::Empty(_), _) => self.right.pdf_value(origin, vector, wavelength, time, rng), (_, _) => { - (self.left.pdf_value(origin, vector, time, rng) - + self.right.pdf_value(origin, vector, time, rng)) + (self.left.pdf_value(origin, vector, wavelength, time, rng) + + self.right.pdf_value(origin, vector, wavelength, time, rng)) / 2.0 } } diff --git a/clovers/src/camera.rs b/clovers/src/camera.rs index 7670a65e..85414bd4 100644 --- a/clovers/src/camera.rs +++ b/clovers/src/camera.rs @@ -2,6 +2,7 @@ #![allow(clippy::too_many_arguments)] // TODO: Camera::new() has a lot of arguments. +use crate::wavelength::random_wavelength; use crate::{random::random_in_unit_disk, ray::Ray, Float, Vec3, PI}; use rand::rngs::SmallRng; use rand::Rng; @@ -106,10 +107,15 @@ impl Camera { let offset: Vec3 = self.u * rd.x + self.v * rd.y; // Randomized time used for motion blur let time: Float = rng.gen_range(self.time_0..self.time_1); - Ray::new( - self.origin + offset, - self.lower_left_corner + s * self.horizontal + t * self.vertical - self.origin - offset, + // Random wavelength for spectral rendering + let wavelength = random_wavelength(rng); + Ray { + origin: self.origin + offset, + direction: self.lower_left_corner + s * self.horizontal + t * self.vertical + - self.origin + - offset, time, - ) + wavelength, + } } } diff --git a/clovers/src/color.rs b/clovers/src/color.rs deleted file mode 100644 index d3501974..00000000 --- a/clovers/src/color.rs +++ /dev/null @@ -1,186 +0,0 @@ -//! Color utilities. - -// TODO: more flexible colors? - -use crate::{Float, Vec3}; -use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign}; -use rand::rngs::SmallRng; -use rand::Rng; - -/// RGB color based on three [Floats](crate::Float) values. -#[derive(Copy, Clone, Debug)] -#[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))] -pub struct Color { - /// The red component of the color, as a [Float] - pub r: Float, - /// The green component of the color, as a [Float] - pub g: Float, - /// The blue component of the color, as a [Float] - pub b: Float, -} - -impl Default for Color { - /// Default color: middle gray 18% - fn default() -> Self { - Color { - r: 0.18, - g: 0.18, - b: 0.18, - } - } -} - -impl Color { - /// Creates a new [Color] with the given parameters. - #[must_use] - pub fn new(r: Float, g: Float, b: Float) -> Color { - Color { r, g, b } - } - - /// Returns a new [Color] with the each channel limited to positive values. - #[must_use] - pub fn non_negative(&self) -> Color { - Color { - r: self.r.max(0.0), - g: self.g.max(0.0), - b: self.b.max(0.0), - } - } - - /// Creates a new [Color] with random parameters between `0.0..1.0`. - #[must_use] - pub fn random(mut rng: SmallRng) -> Color { - Color { - r: rng.gen::(), - g: rng.gen::(), - b: rng.gen::(), - } - } - - /// Component-wise multiplication of two [Colors](Color). - #[must_use] - pub fn component_mul(&self, other: &Color) -> Color { - Color { - r: self.r * other.r, - g: self.g * other.g, - b: self.b * other.b, - } - } - - // TODO: why did this misbehave when attempted as a mutable self? - /// Returns the gamma-corrected [Color]. - #[must_use] - pub fn gamma_correction(&self, gamma: Float) -> Color { - // Raise to the power of inverse of gamma number given - let power: Float = 1.0 / gamma; - Color { - r: self.r.powf(power), - g: self.g.powf(power), - b: self.b.powf(power), - } - } - - /// Transforms the [Float] based [Color] into a 24-bit, 3 x u8 RGB color. - #[must_use] - #[allow(clippy::cast_possible_truncation)] - #[allow(clippy::cast_sign_loss)] - pub fn to_rgb_u8(&self) -> [u8; 3] { - [self.r, self.g, self.b].map(|mut component| { - if component.is_nan() { - component = 0.0; - } - component = component.clamp(0.0, 1.0); - (255.99 * component).floor() as u8 - }) - } -} - -impl From<[u8; 3]> for Color { - fn from(rgb: [u8; 3]) -> Self { - #[allow(clippy::cast_lossless)] - Color::new( - (rgb[0] as Float) / 255.99, - (rgb[1] as Float) / 255.99, - (rgb[2] as Float) / 255.99, - ) - } -} - -impl From<[Float; 3]> for Color { - fn from(rgb: [Float; 3]) -> Self { - Color::new(rgb[0], rgb[1], rgb[2]) - } -} - -impl From<[Float; 4]> for Color { - // TODO: ignores alpha - fn from(rgb: [Float; 4]) -> Self { - Color::new(rgb[0], rgb[1], rgb[2]) - } -} - -impl From for Vec3 { - fn from(color: Color) -> Vec3 { - Vec3::new(color.r, color.g, color.b) - } -} - -impl Add for Color { - type Output = Color; - fn add(self, other: Color) -> Color { - Color::new(self.r + other.r, self.g + other.g, self.b + other.b) - } -} - -impl AddAssign for Color { - fn add_assign(&mut self, other: Color) { - self.r += other.r; - self.g += other.g; - self.b += other.b; - } -} - -impl Mul for Color { - type Output = Color; - fn mul(self, rhs: Float) -> Self::Output { - Color::new(self.r * rhs, self.g * rhs, self.b * rhs) - } -} - -impl MulAssign for Color { - fn mul_assign(&mut self, rhs: Float) { - self.r *= rhs; - self.g *= rhs; - self.b *= rhs; - } -} - -// Really? Do I really need to implement this manually both ways? -impl Mul for Float { - type Output = Color; - fn mul(self, rhs: Color) -> Self::Output { - Color::new(rhs.r * self, rhs.g * self, rhs.b * self) - } -} - -impl Mul for Color { - type Output = Color; - fn mul(self, rhs: Color) -> Self::Output { - Color::new(rhs.r * self.r, rhs.g * self.g, rhs.b * self.b) - } -} - -impl DivAssign for Color { - fn div_assign(&mut self, rhs: Float) { - self.r /= rhs; - self.g /= rhs; - self.b /= rhs; - } -} - -impl Div for Color { - type Output = Color; - fn div(self, rhs: Float) -> Color { - Color::new(self.r / rhs, self.g / rhs, self.b / rhs) - } -} diff --git a/clovers/src/colorize.rs b/clovers/src/colorize.rs index 6916c8f0..5771aaa1 100644 --- a/clovers/src/colorize.rs +++ b/clovers/src/colorize.rs @@ -1,62 +1,77 @@ -//! An opinionated colorize method. Given a [Ray](crate::ray::Ray) and a [Scene](crate::scenes::Scene), evaluates the ray's path and returns a color. +//! An opinionated colorize method. Given a [Ray] and a [Scene], evaluates the ray's path and returns a color. use crate::{ - color::Color, hitable::HitableTrait, materials::MaterialType, pdf::{HitablePDF, MixturePDF, PDFTrait, PDF}, ray::Ray, scenes::Scene, + spectrum::spectrum_xyz_to_p, + wavelength::{wavelength_into_xyz, Wavelength}, Float, EPSILON_SHADOW_ACNE, }; +use palette::{ + chromatic_adaptation::AdaptInto, convert::IntoColorUnclamped, white_point::E, Clamp, LinSrgb, + Xyz, +}; use rand::rngs::SmallRng; -/// The main coloring function. Sends a [Ray] to the [Scene], sees if it hits anything, and eventually returns a [Color]. Taking into account the [Material](crate::materials::Material) that is hit, the method recurses with various adjustments, with a new [Ray] started from the location that was hit. +/// The main coloring function. Sends a [`Ray`] to the [`Scene`], sees if it hits anything, and eventually returns a color. Taking into account the [Material](crate::materials::Material) that is hit, the method recurses with various adjustments, with a new [`Ray`] started from the location that was hit. #[must_use] -pub fn colorize(ray: &Ray, scene: &Scene, depth: u32, max_depth: u32, rng: &mut SmallRng) -> Color { +pub fn colorize( + ray: &Ray, + scene: &Scene, + depth: u32, + max_depth: u32, + rng: &mut SmallRng, +) -> Xyz { + let bg: Xyz = scene.background_color.into_color_unclamped(); + let bg: Xyz = bg.adapt_into(); // Have we reached the maximum recursion i.e. ray bounce depth? if depth > max_depth { // Ray bounce limit reached, early return background_color - // TODO: this weighs the colorization of any pixel with the background color quite heavily! - return scene.background_color; + return bg; } // Send the ray to the scene, and see if it hits anything. // distance_min is set to an epsilon to avoid "shadow acne" that can happen when set to zero let Some(hit_record) = scene.objects.hit(ray, EPSILON_SHADOW_ACNE, Float::MAX, rng) else { // If the ray hits nothing, early return the background color. - return scene.background_color; + return bg; }; // Get the emitted color from the surface that we just hit - let emitted: Color = hit_record.material.emit( + // TODO: spectral light sources! + let emitted = hit_record.material.emit( ray, &hit_record, hit_record.u, hit_record.v, hit_record.position, ); + let emitted = adjust_emitted(emitted, ray.wavelength); // Do we scatter? let Some(scatter_record) = hit_record.material.scatter(ray, &hit_record, rng) else { // No scatter, early return the emitted color only return emitted; }; + // We have scattered, and received an attenuation from the material. + let attenuation = adjust_attenuation(scatter_record.attenuation, ray.wavelength); - // We have scattered, check material type and recurse accordingly + // Check the material type and recurse accordingly: match scatter_record.material_type { MaterialType::Specular => { - // If we hit a specular material, generate a specular ray, and multiply it with the value of the scatter_record. - // Note that the `emitted` value from earlier is not used, as the scatter_record.attenuation has an appropriately adjusted color - scatter_record.attenuation - * colorize( - // a scatter_record from a specular material should always have this ray - &scatter_record.specular_ray.unwrap(), - scene, - depth + 1, - max_depth, - rng, - ) + // If we hit a specular material, generate a specular ray, and multiply it with the attenuation + let specular = colorize( + // a scatter_record from a specular material should always have this ray + &scatter_record.specular_ray.unwrap(), + scene, + depth + 1, + max_depth, + rng, + ); + specular * attenuation } MaterialType::Diffuse => { // Use a probability density function to figure out where to scatter a new ray @@ -66,8 +81,13 @@ pub fn colorize(ray: &Ray, scene: &Scene, depth: u32, max_depth: u32, rng: &mut hit_record.position, )); let mixture_pdf = MixturePDF::new(light_ptr, scatter_record.pdf_ptr); - let scatter_ray = Ray::new(hit_record.position, mixture_pdf.generate(rng), ray.time); - let pdf_val = mixture_pdf.value(scatter_ray.direction, ray.time, rng); + let scatter_ray = Ray { + origin: hit_record.position, + direction: mixture_pdf.generate(rng), + time: ray.time, + wavelength: ray.wavelength, + }; + let pdf_val = mixture_pdf.value(scatter_ray.direction, ray.wavelength, ray.time, rng); if pdf_val <= 0.0 { // scattering impossible, prevent division by zero below // for more ctx, see https://github.com/RayTracing/raytracing.github.io/issues/979#issuecomment-1034517236 @@ -86,12 +106,27 @@ pub fn colorize(ray: &Ray, scene: &Scene, depth: u32, max_depth: u32, rng: &mut // Recurse for the scattering ray let recurse = colorize(&scatter_ray, scene, depth + 1, max_depth, rng); - // Weight it according to the PDF - let scattered = scatter_record.attenuation * scattering_pdf * recurse / pdf_val; + // Tint and weight it according to the PDF + let scattered = attenuation * scattering_pdf * recurse / pdf_val; // Ensure positive color - let scattered = scattered.non_negative(); + // let scattered = scattered.non_negative(); // Blend it all together emitted + scattered } } } + +fn adjust_emitted(emitted: LinSrgb, wavelength: Wavelength) -> Xyz { + let tint: Xyz = wavelength_into_xyz(wavelength); + let emitted: Xyz = emitted.into_color_unclamped(); + let emitted: Xyz = emitted.adapt_into(); + tint * emitted +} + +fn adjust_attenuation(attenuation: LinSrgb, wavelength: Wavelength) -> Xyz { + let attenuation: Xyz = attenuation.into_color_unclamped(); + let attenuation: Xyz = attenuation.adapt_into(); + let attenuation_factor = spectrum_xyz_to_p(wavelength, attenuation); + let attenuation = attenuation * attenuation_factor; + attenuation.clamp() +} diff --git a/clovers/src/hitable.rs b/clovers/src/hitable.rs index 221d702e..fd5e38ae 100644 --- a/clovers/src/hitable.rs +++ b/clovers/src/hitable.rs @@ -11,10 +11,9 @@ use crate::{ aabb::AABB, bvhnode::BVHNode, materials::MaterialTrait, - objects::{ - Boxy, ConstantMedium, FlipFace, MovingSphere, Quad, RotateY, Sphere, Translate, Triangle, - }, + objects::{Boxy, ConstantMedium, MovingSphere, Quad, RotateY, Sphere, Translate, Triangle}, ray::Ray, + wavelength::Wavelength, Float, Vec3, }; @@ -59,7 +58,6 @@ pub enum Hitable<'scene> { Boxy(Boxy<'scene>), BVHNode(BVHNode<'scene>), ConstantMedium(ConstantMedium<'scene>), - FlipFace(FlipFace<'scene>), MovingSphere(MovingSphere<'scene>), Quad(Quad<'scene>), RotateY(RotateY<'scene>), @@ -94,7 +92,14 @@ impl HitableTrait for Empty { None } - fn pdf_value(&self, _origin: Vec3, _vector: Vec3, _time: Float, _rng: &mut SmallRng) -> Float { + fn pdf_value( + &self, + _origin: Vec3, + _vector: Vec3, + _wavelength: Wavelength, + _time: Float, + _rng: &mut SmallRng, + ) -> Float { 0.0 } @@ -118,7 +123,14 @@ pub(crate) trait HitableTrait { fn bounding_box(&self, t0: Float, t1: Float) -> Option<&AABB>; #[must_use] - fn pdf_value(&self, origin: Vec3, vector: Vec3, time: Float, rng: &mut SmallRng) -> Float; + fn pdf_value( + &self, + origin: Vec3, + vector: Vec3, + wavelength: Wavelength, + time: Float, + rng: &mut SmallRng, + ) -> Float; #[must_use] fn random(&self, origin: Vec3, rng: &mut SmallRng) -> Vec3; diff --git a/clovers/src/lib.rs b/clovers/src/lib.rs index f2b53787..4135577d 100644 --- a/clovers/src/lib.rs +++ b/clovers/src/lib.rs @@ -77,7 +77,6 @@ use nalgebra::base::{Vector2, Vector3, Vector4}; pub mod aabb; pub mod bvhnode; pub mod camera; -pub mod color; pub mod colorize; pub mod hitable; pub mod interval; @@ -89,7 +88,9 @@ pub mod pdf; pub mod random; pub mod ray; pub mod scenes; +pub mod spectrum; pub mod textures; +pub mod wavelength; /// Rendering options struct #[derive(Clone, Debug)] @@ -103,8 +104,6 @@ pub struct RenderOpts { pub samples: u32, /// Maximum ray bounce depth. Higher number implies higher quality. pub max_depth: u32, - /// Gamma correction value - pub gamma: Float, /// Optionally, suppress CLI output pub quiet: bool, /// Experimental render mode: return a normal map only instead of doing a full path trace render. @@ -117,11 +116,11 @@ pub struct RenderOpts { pub type Float = f32; /// Internal helper: re-exports the pi constant as our internal [Float] type. TODO: selectable at run time instead of build time? pub const PI: Float = core::f32::consts::PI; -/// Internal type alias: a nalgebra [Vector2](nalgebra::Vector2) which is a vector with two dimensions, containing two of our internal [Float] types +/// Internal type alias: a nalgebra [Vector2] which is a vector with two dimensions, containing two of our internal [Float] types pub type Vec2 = Vector2; -/// Internal type alias: a nalgebra [Vector3](nalgebra::Vector3) which is a vector with three dimensions, containing three of our internal [Float] types +/// Internal type alias: a nalgebra [Vector3] which is a vector with three dimensions, containing three of our internal [Float] types pub type Vec3 = Vector3; -/// Internal type alias: a nalgebra [Vector4](nalgebra::Vector4) which is a vector with four dimensions, containing four of our internal [Float] types +/// Internal type alias: a nalgebra [Vector4] which is a vector with four dimensions, containing four of our internal [Float] types pub type Vec4 = Vector4; /// Internal const: epsilon used for avoiding "shadow acne". This is mostly used for the initial minimum distance for ray hits after reflecting or scattering from a surface. pub const EPSILON_SHADOW_ACNE: Float = 0.001; diff --git a/clovers/src/materials.rs b/clovers/src/materials.rs index 7e504571..f4ce998d 100644 --- a/clovers/src/materials.rs +++ b/clovers/src/materials.rs @@ -2,21 +2,26 @@ use core::fmt::Debug; -use crate::{color::Color, hitable::HitRecord, pdf::PDF, ray::Ray, Float, Vec3}; +use crate::{hitable::HitRecord, pdf::PDF, ray::Ray, Float, Vec3}; +pub mod cone_light; pub mod dielectric; pub mod diffuse_light; +pub mod dispersive; #[cfg(feature = "gl_tf")] pub mod gltf; pub mod isotropic; pub mod lambertian; pub mod metal; +pub use cone_light::*; pub use dielectric::*; pub use diffuse_light::*; +pub use dispersive::*; use enum_dispatch::enum_dispatch; pub use isotropic::*; pub use lambertian::*; pub use metal::*; +use palette::LinSrgb; use rand::prelude::SmallRng; /// Initialization structure for a `Material`. Either contains a `Material` by itself, or a String `name` to be found in a shared material list. @@ -66,7 +71,7 @@ pub trait MaterialTrait: Debug { rng: &mut SmallRng, ) -> Option; - /// Returns the emissivity of the material at the given position. + /// Returns the emissivity of the material at the given position. Defaults to black as most materials don't emit - override when needed. fn emit( &self, _ray: &Ray, @@ -74,9 +79,8 @@ pub trait MaterialTrait: Debug { _u: Float, _v: Float, _position: Vec3, - ) -> Color { - // Most materials don't emit, override when needed - Color::new(0.0, 0.0, 0.0) + ) -> LinSrgb { + LinSrgb::new(0.0, 0.0, 0.0) } } @@ -88,8 +92,12 @@ pub trait MaterialTrait: Debug { pub enum Material { /// Dielectric material Dielectric(Dielectric), + /// Dispersive material + Dispersive(Dispersive), /// Lambertian material Lambertian(Lambertian), + /// ConeLight material + ConeLight(ConeLight), /// DiffuseLight material DiffuseLight(DiffuseLight), /// Metal material @@ -121,7 +129,7 @@ pub struct ScatterRecord<'ray> { /// Direction of a generated specular ray pub specular_ray: Option, /// Current color to take into account when following the scattered ray for futher iterations - pub attenuation: Color, + pub attenuation: LinSrgb, /// Probability density function to use with the [ScatterRecord]. // TODO: understand & explain pub pdf_ptr: PDF<'ray>, @@ -135,9 +143,10 @@ fn reflect(vector: Vec3, normal: Vec3) -> Vec3 { } #[must_use] -fn refract(uv: Vec3, normal: Vec3, etai_over_etat: Float) -> Vec3 { +fn refract(uv: Vec3, normal: Vec3, refraction_ratio: Float) -> Vec3 { let cos_theta: Float = -uv.dot(&normal); - let r_out_parallel: Vec3 = etai_over_etat * (uv + cos_theta * normal); + let cos_theta = cos_theta.min(1.0); // Clamp + let r_out_parallel: Vec3 = refraction_ratio * (uv + cos_theta * normal); let r_out_perp: Vec3 = -(1.0 - r_out_parallel.norm_squared()).sqrt() * normal; r_out_parallel + r_out_perp } diff --git a/clovers/src/materials/cone_light.rs b/clovers/src/materials/cone_light.rs new file mode 100644 index 00000000..df3556da --- /dev/null +++ b/clovers/src/materials/cone_light.rs @@ -0,0 +1,98 @@ +//! A cone light material. + +use super::{MaterialTrait, ScatterRecord}; +use crate::{ + hitable::HitRecord, + ray::Ray, + textures::{SolidColor, Texture, TextureTrait}, + Float, Vec3, +}; +use palette::{convert::IntoColorUnclamped, LinSrgb, Srgb}; +use rand::prelude::SmallRng; + +/// A cone light material. The material emits light if the incoming ray is within a certain amount of degrees from the surface normal. +#[derive(Clone, Debug)] +#[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))] +pub struct ConeLight { + spread: Float, + emit: Texture, +} + +impl Default for ConeLight { + /// Creates a new [`ConeLight`] with white light at intensity `100.0` and a spread of 10 degrees. + fn default() -> Self { + ConeLight { + spread: 10.0, + emit: Texture::SolidColor(SolidColor::new(Srgb::new(100.0, 100.0, 100.0))), + } + } +} + +impl MaterialTrait for ConeLight { + /// Scatter method for the [`ConeLight`] material. Always returns `None`, as diffuse light does not scatter. + #[must_use] + fn scatter( + &self, + _ray: &Ray, + _hit_record: &HitRecord, + _rng: &mut SmallRng, + ) -> Option { + None + } + + /// Scattering probability density function for the [`ConeLight`] material. Always returns 0, as diffuse light does not scatter. + #[must_use] + fn scattering_pdf( + &self, + _hit_record: &HitRecord, + _scattered: &Ray, + _rng: &mut SmallRng, + ) -> Option { + None + } + + /// Emission function for [`ConeLight`]. If the given [`HitRecord`] has been hit on the `front_face`, emit a color based on the texture and surface coordinates. Otherwise, emit pure black. + #[must_use] + fn emit( + &self, + ray: &Ray, + hit_record: &HitRecord, + u: Float, + v: Float, + position: Vec3, + ) -> LinSrgb { + // If we don't hit the front face, return black + if !hit_record.front_face { + return LinSrgb::new(0.0, 0.0, 0.0); + } + + // We have hit the front. Calculate the angle of incidence + let spread_radians = self.spread.to_radians(); + let angle = (-ray.direction.dot(&hit_record.normal) + / (ray.direction.magnitude() * hit_record.normal.magnitude())) + .acos(); + + let emit = self.emit.color(u, v, position); + let emit: LinSrgb = emit.into_color_unclamped(); + if angle <= spread_radians { + emit + } else { + // Make sure that the front face of the lamp is tinted, even outside the main lighting angle + let (r, g, b) = emit.into_components(); + let scaling_factor = r.max(g).max(b); + if scaling_factor > 1.0 { + emit / scaling_factor + } else { + emit + } + } + } +} + +impl ConeLight { + /// Creates a new [`ConeLight`] material with the given [Texture]. + #[must_use] + pub fn new(spread: Float, emit: Texture) -> Self { + ConeLight { spread, emit } + } +} diff --git a/clovers/src/materials/dielectric.rs b/clovers/src/materials/dielectric.rs index 477c2bc1..169fb34a 100644 --- a/clovers/src/materials/dielectric.rs +++ b/clovers/src/materials/dielectric.rs @@ -2,12 +2,12 @@ use super::{reflect, refract, schlick, MaterialTrait, MaterialType, ScatterRecord}; use crate::{ - color::Color, hitable::HitRecord, pdf::{ZeroPDF, PDF}, ray::Ray, Float, Vec3, }; +use palette::{convert::IntoColorUnclamped, Srgb}; use rand::rngs::SmallRng; use rand::Rng; @@ -18,17 +18,17 @@ pub struct Dielectric { /// Refractive index of the material. Used for calculating the new direction of a ray when entering the material at an angle. Follows Snell's law of refraction. Default value: 1.5, based on typical window glass. #[cfg_attr(feature = "serde-derive", serde(default = "default_index"))] pub refractive_index: Float, - /// Color of the material. Used for colorizing the rays. Default value: [`Color::new(1.0, 1.0, 1.0)`](crate::color::Color), producing a fully transparent, clear glass. + /// Color of the material. Used for colorizing the rays. Default value: [`(1.0, 1.0, 1.0)`], producing a fully transparent, clear glass. #[cfg_attr(feature = "serde-derive", serde(default = "default_color"))] - pub color: Color, + pub color: Srgb, } fn default_index() -> Float { 1.5 } -fn default_color() -> Color { - Color::new(1.0, 1.0, 1.0) +fn default_color() -> Srgb { + Srgb::new(1.0, 1.0, 1.0) } impl MaterialTrait for Dielectric { @@ -40,10 +40,7 @@ impl MaterialTrait for Dielectric { hit_record: &HitRecord, rng: &mut SmallRng, ) -> Option { - let albedo = self.color; - let specular_ray: Ray; - - let etai_over_etat: Float = if hit_record.front_face { + let refraction_ratio: Float = if hit_record.front_face { 1.0 / self.refractive_index } else { self.refractive_index @@ -52,29 +49,33 @@ impl MaterialTrait for Dielectric { let unit_direction: Vec3 = ray.direction.normalize(); let cos_theta: Float = (-unit_direction.dot(&hit_record.normal)).min(1.0); let sin_theta: Float = (1.0 - cos_theta * cos_theta).sqrt(); - if etai_over_etat * sin_theta > 1.0 { - let reflected: Vec3 = reflect(unit_direction, hit_record.normal); - specular_ray = Ray::new(hit_record.position, reflected, ray.time); + let specular_direction: Vec3 = if refraction_ratio * sin_theta > 1.0 { + reflect(unit_direction, hit_record.normal) } else { - let reflect_probability: Float = schlick(cos_theta, etai_over_etat); + let reflect_probability: Float = schlick(cos_theta, refraction_ratio); if rng.gen::() < reflect_probability { - let reflected: Vec3 = reflect(unit_direction, hit_record.normal); - specular_ray = Ray::new(hit_record.position, reflected, ray.time); + reflect(unit_direction, hit_record.normal) } else { - let refracted: Vec3 = refract(unit_direction, hit_record.normal, etai_over_etat); - specular_ray = Ray::new(hit_record.position, refracted, ray.time); + // Refracted + refract(unit_direction, hit_record.normal, refraction_ratio) } - } + }; + let specular_ray = Ray { + origin: hit_record.position, + direction: specular_direction, + time: ray.time, + wavelength: ray.wavelength, + }; + Some(ScatterRecord { material_type: MaterialType::Specular, specular_ray: Some(specular_ray), - attenuation: albedo, + attenuation: self.color.into_color_unclamped(), pdf_ptr: PDF::ZeroPDF(ZeroPDF::new()), //TODO: ugly hack due to nullptr in original tutorial }) } /// Scattering probability density function for Dielectric material. NOTE: not implemented! - #[allow(clippy::unused_self)] // TODO #[must_use] fn scattering_pdf( &self, @@ -89,7 +90,7 @@ impl MaterialTrait for Dielectric { impl Dielectric { /// Creates a new [Dielectric] material with the given refractive index and color. #[must_use] - pub fn new(refractive_index: Float, color: Color) -> Self { + pub fn new(refractive_index: Float, color: Srgb) -> Self { Dielectric { refractive_index, color, diff --git a/clovers/src/materials/diffuse_light.rs b/clovers/src/materials/diffuse_light.rs index 5e7ae829..82d867d9 100644 --- a/clovers/src/materials/diffuse_light.rs +++ b/clovers/src/materials/diffuse_light.rs @@ -2,12 +2,12 @@ use super::{MaterialTrait, ScatterRecord}; use crate::{ - color::Color, hitable::HitRecord, ray::Ray, textures::{SolidColor, Texture, TextureTrait}, Float, Vec3, }; +use palette::{convert::IntoColorUnclamped, LinSrgb, Srgb}; use rand::prelude::SmallRng; /// A diffuse light material. On this material, rays never scatter - the material always emits a color based on its texture. @@ -21,14 +21,13 @@ impl Default for DiffuseLight { /// Creates a new [`DiffuseLight`] with white light at intensity `100.0` fn default() -> Self { DiffuseLight { - emit: Texture::SolidColor(SolidColor::new(Color::new(100.0, 100.0, 100.0))), + emit: Texture::SolidColor(SolidColor::new(Srgb::new(100.0, 100.0, 100.0))), } } } impl MaterialTrait for DiffuseLight { /// Scatter method for the [`DiffuseLight`] material. Always returns `None`, as diffuse light does not scatter. - #[allow(clippy::unused_self)] #[must_use] fn scatter( &self, @@ -40,7 +39,6 @@ impl MaterialTrait for DiffuseLight { } /// Scattering probability density function for the [`DiffuseLight`] material. Always returns 0, as diffuse light does not scatter. - #[allow(clippy::unused_self)] // TODO: #[must_use] fn scattering_pdf( &self, @@ -60,11 +58,13 @@ impl MaterialTrait for DiffuseLight { u: Float, v: Float, position: Vec3, - ) -> Color { + ) -> LinSrgb { if hit_record.front_face { - self.emit.color(u, v, position) + let emit = self.emit.color(u, v, position); + let emit: LinSrgb = emit.into_color_unclamped(); + emit } else { - Color::new(0.0, 0.0, 0.0) + LinSrgb::new(0.0, 0.0, 0.0) } } } diff --git a/clovers/src/materials/dispersive.rs b/clovers/src/materials/dispersive.rs new file mode 100644 index 00000000..5aed2cc7 --- /dev/null +++ b/clovers/src/materials/dispersive.rs @@ -0,0 +1,128 @@ +//! Dispersive material. +//! Based on [Cauchy's equation](https://en.wikipedia.org/wiki/Cauchy%27s_equation) + +/* +Material A B (μm2) +Fused silica 1.4580 0.00354 +Borosilicate glass BK7 1.5046 0.00420 +Hard crown glass K5 1.5220 0.00459 +Barium crown glass BaK4 1.5690 0.00531 +Barium flint glass BaF10 1.6700 0.00743 +Dense flint glass SF10 1.7280 0.01342 +*/ + +// TODO: consider other options, e.g. Sellmeier https://en.wikipedia.org/wiki/Sellmeier_equation + +use palette::LinSrgb; +use rand::{rngs::SmallRng, Rng}; + +use crate::{ + hitable::HitRecord, + pdf::{ZeroPDF, PDF}, + ray::Ray, + wavelength::Wavelength, + Float, Vec3, +}; + +use super::{reflect, refract, schlick, MaterialTrait, MaterialType, ScatterRecord}; + +#[derive(Clone, Debug)] +#[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))] +/// A dispersive glass material. +pub struct Dispersive { + /// Cauchy coefficient A of the material + #[cfg_attr(feature = "serde-derive", serde(default = "default_a"))] + pub cauchy_a: Float, + /// Cauchy coefficient B of the material + #[cfg_attr(feature = "serde-derive", serde(default = "default_b"))] + pub cauchy_b: Float, +} + +fn default_a() -> Float { + 1.5046 +} + +fn default_b() -> Float { + 0.00420 +} + +// TODO: less precision loss? +#[allow(clippy::cast_precision_loss)] +impl Dispersive { + /// Creates a new [Dispersive] material with the given Cauchy equation constants. + #[must_use] + pub fn new(cauchy_a: Float, cauchy_b: Float) -> Self { + Dispersive { cauchy_a, cauchy_b } + } + + /// Calculates the refractive index of the material for the given wavelength + #[must_use] + pub fn refractive_index(&self, wavelength: Wavelength) -> Float { + let wave_micros = wavelength as Float / 1000.0; + self.cauchy_a + (self.cauchy_b / (wave_micros * wave_micros)) + } +} + +impl Default for Dispersive { + fn default() -> Self { + Dispersive::new(default_a(), default_b()) + } +} + +impl MaterialTrait for Dispersive { + fn scatter( + &self, + ray: &Ray, + hit_record: &HitRecord, + rng: &mut SmallRng, + ) -> Option { + // Calculate refractive index based on the wavelength of the incoming material + // TODO: colored dispersive glass? + let attenuation = LinSrgb::new(1.0, 1.0, 1.0); + let refractive_index = self.refractive_index(ray.wavelength); + let refraction_ratio: Float = if hit_record.front_face { + 1.0 / refractive_index + } else { + refractive_index + }; + + // Copied from Dielectric, is this correct? + let unit_direction: Vec3 = ray.direction.normalize(); + let cos_theta: Float = (-unit_direction.dot(&hit_record.normal)).min(1.0); + let sin_theta: Float = (1.0 - cos_theta * cos_theta).sqrt(); + let specular_direction: Vec3 = if refraction_ratio * sin_theta > 1.0 { + reflect(unit_direction, hit_record.normal) + } else { + let reflect_probability: Float = schlick(cos_theta, refraction_ratio); + if rng.gen::() < reflect_probability { + reflect(unit_direction, hit_record.normal) + } else { + // Refracted + refract(unit_direction, hit_record.normal, refraction_ratio) + } + }; + let specular_ray = Ray { + origin: hit_record.position, + direction: specular_direction, + time: ray.time, + wavelength: ray.wavelength, + }; + + Some(ScatterRecord { + material_type: MaterialType::Specular, + specular_ray: Some(specular_ray), + attenuation, + pdf_ptr: PDF::ZeroPDF(ZeroPDF::new()), //TODO: ugly hack due to nullptr in original tutorial + }) + // End copied + } + + fn scattering_pdf( + &self, + _hit_record: &HitRecord, + _scattered: &Ray, + _rng: &mut SmallRng, + ) -> Option { + None // TODO: should a dispersive material scatter? how much? + } +} diff --git a/clovers/src/materials/gltf.rs b/clovers/src/materials/gltf.rs index 4229114b..f78c88a1 100644 --- a/clovers/src/materials/gltf.rs +++ b/clovers/src/materials/gltf.rs @@ -4,13 +4,13 @@ #[cfg(feature = "gl_tf")] use gltf::{image::Data, Material}; +use palette::{convert::IntoColorUnclamped, LinSrgb, Srgb, Srgba}; use rand::rngs::SmallRng; use crate::{ - color::Color, hitable::HitRecord, pdf::{ZeroPDF, PDF}, - random::random_in_unit_sphere, + random::random_unit_vector, ray::Ray, Float, Vec2, Vec3, Vec4, PI, }; @@ -84,23 +84,28 @@ impl<'scene> MaterialTrait for GLTFMaterial<'scene> { hit_record: &HitRecord, rng: &mut SmallRng, ) -> Option { - let base_color = self.sample_base_color(hit_record); - let emissive = self.sample_emissive(hit_record); + let base_color: LinSrgb = self.sample_base_color(hit_record); + let emissive: LinSrgb = self.sample_emissive(hit_record).into_color_unclamped(); let (metalness, roughness) = self.sample_metalness_roughness(hit_record); - let normal = self.sample_normal(hit_record); - let occlusion = self.sample_occlusion(hit_record); + let normal: Vec3 = self.sample_normal(hit_record); + let occlusion: Float = self.sample_occlusion(hit_record); // TODO: full color model - let attenuation = emissive + base_color * occlusion; + let attenuation: LinSrgb = emissive + base_color * occlusion; // TODO: better metalness model if metalness > 0.0 { // TODO: borrowed from metal, should this be different? let reflected: Vec3 = reflect(ray.direction.normalize(), normal); - let direction = reflected + roughness * random_in_unit_sphere(rng); + let direction = reflected + roughness * random_unit_vector(rng); Some(ScatterRecord { - specular_ray: Some(Ray::new(hit_record.position, direction, ray.time)), + specular_ray: Some(Ray { + origin: hit_record.position, + direction, + time: ray.time, + wavelength: ray.wavelength, + }), attenuation, material_type: MaterialType::Specular, pdf_ptr: PDF::ZeroPDF(ZeroPDF::new()), @@ -133,7 +138,7 @@ impl<'scene> MaterialTrait for GLTFMaterial<'scene> { } impl<'scene> GLTFMaterial<'scene> { - fn sample_base_color(&self, hit_record: &HitRecord) -> Color { + fn sample_base_color(&self, hit_record: &HitRecord) -> LinSrgb { let base_color_texture = self .material .pbr_metallic_roughness() @@ -143,20 +148,21 @@ impl<'scene> GLTFMaterial<'scene> { let base_color = match &base_color_texture { Some(texture) => { let (x, y) = self.sample_texture_coords(hit_record, texture); - get_color_rgb(texture, x, y) + get_color_srgb(texture, x, y) } - None => Color::new(1.0, 1.0, 1.0), + None => Srgb::new(1.0, 1.0, 1.0), }; - let base_color_factor: Color = self + let base_color_factor: Srgba = self .material .pbr_metallic_roughness() .base_color_factor() .into(); + let base_color_factor: Srgb = base_color_factor.into_color_unclamped(); - base_color * base_color_factor + (base_color * base_color_factor).into_color_unclamped() } - fn sample_emissive(&self, hit_record: &HitRecord) -> Color { + fn sample_emissive(&self, hit_record: &HitRecord) -> Srgb { let emissive_texture = self .material .emissive_texture() @@ -165,13 +171,13 @@ impl<'scene> GLTFMaterial<'scene> { let emissive = match &emissive_texture { Some(texture) => { let (x, y) = self.sample_texture_coords(hit_record, texture); - get_color_rgb(texture, x, y) + get_color_srgb(texture, x, y) } - None => Color::new(1.0, 1.0, 1.0), + None => Srgb::new(1.0, 1.0, 1.0), }; - let emissive_factor: Color = self.material.emissive_factor().into(); + let emissive_factor: Srgb = self.material.emissive_factor().into(); - emissive * emissive_factor + (emissive * emissive_factor).into_color_unclamped() } fn sample_metalness_roughness(&self, hit_record: &HitRecord) -> (Float, Float) { @@ -183,9 +189,9 @@ impl<'scene> GLTFMaterial<'scene> { let (metalness, roughness) = match &metallic_roughness_texture { Some(texture) => { let (x, y) = self.sample_texture_coords(hit_record, texture); - let sampled_color = get_color_rgb(texture, x, y); - let roughness = sampled_color.g; - let metalness = sampled_color.b; + let sampled_color = get_color_linsrgb(texture, x, y); + let roughness = sampled_color.green; + let metalness = sampled_color.blue; (metalness, roughness) } None => (1.0, 1.0), @@ -204,9 +210,9 @@ impl<'scene> GLTFMaterial<'scene> { match &occlusion_texture { Some(texture) => { let (x, y) = self.sample_texture_coords(hit_record, texture); - let sampled_color = get_color_rgb(texture, x, y); + let sampled_color = get_color_linsrgb(texture, x, y); // Only the red channel is taken into account - sampled_color.r + sampled_color.red } None => 1.0, } @@ -235,9 +241,10 @@ impl<'scene> GLTFMaterial<'scene> { let texture_normal = match &normal_texture { Some(texture) => { let (x, y) = self.sample_texture_coords(hit_record, texture); - let sampled_color = get_color_rgb(texture, x, y); + let sampled_color = get_color_linsrgb(texture, x, y); // Convert from Color to Vec 0..1, scale and move to -1..1 - let normal: Vec3 = Vec3::from(sampled_color) * 2.0 - Vec3::new(1.0, 1.0, 1.0); + let (r, g, b) = sampled_color.into_components(); + let normal: Vec3 = Vec3::new(r, g, b) * 2.0 - Vec3::new(1.0, 1.0, 1.0); normal.normalize() } // If we don't have a normal texture, early return with the triangle normal @@ -292,8 +299,8 @@ impl<'scene> GLTFMaterial<'scene> { } } -/// Given a reference to a texture and pixel space coordinates, returns the color at that pixel -fn get_color_rgb(texture: &&Data, x: usize, y: usize) -> Color { +/// Given a reference to a texture and pixel space coordinates, returns the raw byte triple `(r,g,b)` +fn sample_texture_raw(texture: &&Data, x: usize, y: usize) -> (u8, u8, u8) { let index = match texture.format { gltf::image::Format::R8G8B8 => 3 * (x + texture.width as usize * y), gltf::image::Format::R8G8B8A8 => 4 * (x + texture.width as usize * y), @@ -302,5 +309,19 @@ fn get_color_rgb(texture: &&Data, x: usize, y: usize) -> Color { let r = texture.pixels[index]; let g = texture.pixels[index + 1]; let b = texture.pixels[index + 2]; - Color::from([r, g, b]) + (r, g, b) +} + +/// Given a reference to a texture and pixel space coordinates, returns the color at that pixel, sRGB with gamma. +fn get_color_srgb(texture: &&Data, x: usize, y: usize) -> Srgb { + let (r, g, b) = sample_texture_raw(texture, x, y); + let color: Srgb = Srgb::from_components((r, g, b)); + color.into_format() +} + +/// Given a reference to a texture and pixel space coordinates, returns the color at that pixel, linear sRGB +fn get_color_linsrgb(texture: &&Data, x: usize, y: usize) -> LinSrgb { + let (r, g, b) = sample_texture_raw(texture, x, y); + let color: LinSrgb = LinSrgb::from_components((r, g, b)); + color.into_format() } diff --git a/clovers/src/materials/isotropic.rs b/clovers/src/materials/isotropic.rs index 3341a03d..c5d1a98b 100644 --- a/clovers/src/materials/isotropic.rs +++ b/clovers/src/materials/isotropic.rs @@ -2,7 +2,6 @@ use super::{MaterialTrait, MaterialType, ScatterRecord}; use crate::{ - color::Color, hitable::HitRecord, pdf::{SpherePDF, PDF}, ray::Ray, @@ -28,7 +27,7 @@ impl MaterialTrait for Isotropic { hit_record: &HitRecord, _rng: &mut SmallRng, ) -> Option { - let albedo: Color = self + let albedo = self .albedo .color(hit_record.u, hit_record.v, hit_record.position); @@ -41,7 +40,6 @@ impl MaterialTrait for Isotropic { } /// Returns the scattering probability density function for the [Isotropic] material - #[allow(clippy::unused_self)] #[must_use] fn scattering_pdf( &self, diff --git a/clovers/src/materials/lambertian.rs b/clovers/src/materials/lambertian.rs index 41d1593b..7bdbba38 100644 --- a/clovers/src/materials/lambertian.rs +++ b/clovers/src/materials/lambertian.rs @@ -38,7 +38,6 @@ impl MaterialTrait for Lambertian { } /// Returns the scattering probability density function for the [Lambertian] material. TODO: explain the math - #[allow(clippy::unused_self)] // TODO: #[must_use] fn scattering_pdf( &self, diff --git a/clovers/src/materials/metal.rs b/clovers/src/materials/metal.rs index 721c8c1d..a6bcbceb 100644 --- a/clovers/src/materials/metal.rs +++ b/clovers/src/materials/metal.rs @@ -4,7 +4,7 @@ use super::{reflect, MaterialTrait, MaterialType, ScatterRecord}; use crate::{ hitable::HitRecord, pdf::{ZeroPDF, PDF}, - random::random_in_unit_sphere, + random::random_unit_vector, ray::Ray, textures::{Texture, TextureTrait}, Float, Vec3, @@ -32,11 +32,12 @@ impl MaterialTrait for Metal { ) -> Option { let reflected: Vec3 = reflect(ray.direction.normalize(), hit_record.normal); Some(ScatterRecord { - specular_ray: Some(Ray::new( - hit_record.position, - reflected + self.fuzz * random_in_unit_sphere(rng), - ray.time, - )), + specular_ray: Some(Ray { + origin: hit_record.position, + direction: reflected + self.fuzz * random_unit_vector(rng), + time: ray.time, + wavelength: ray.wavelength, + }), attenuation: self .albedo .color(hit_record.u, hit_record.v, hit_record.position), @@ -46,7 +47,6 @@ impl MaterialTrait for Metal { } /// Scattering probability density function for [Metal]. Always returns zero. TODO: why? - #[allow(clippy::unused_self)] // TODO: #[must_use] fn scattering_pdf( &self, diff --git a/clovers/src/normals.rs b/clovers/src/normals.rs index 4f0ca415..99f6e3c7 100644 --- a/clovers/src/normals.rs +++ b/clovers/src/normals.rs @@ -1,38 +1,34 @@ //! Alternative render method to [colorize](crate::colorize::colorize). -use crate::{ - color::Color, hitable::HitableTrait, ray::Ray, scenes::Scene, Float, Vec3, EPSILON_SHADOW_ACNE, -}; +use crate::{hitable::HitableTrait, ray::Ray, scenes::Scene, Float, Vec3, EPSILON_SHADOW_ACNE}; +use palette::LinSrgb; use rand::rngs::SmallRng; /// Rendering function for getting a normal map in tangent space. Sends a [Ray] to the [Scene], sees what it hits, gets the normal at that point, and returns a color based on the normal mapping colorization. Wikipedia: [Normal mapping](https://en.wikipedia.org/wiki/Normal_mapping). -// TODO: better name #[must_use] -pub fn normal_map(ray: &Ray, scene: &Scene, rng: &mut SmallRng) -> Color { +pub fn normal_map(ray: &Ray, scene: &Scene, rng: &mut SmallRng) -> LinSrgb { let Some(hit_record) = scene.objects.hit(ray, EPSILON_SHADOW_ACNE, Float::MAX, rng) else { // If the ray hits nothing, early return black - return Color::new(0.0, 0.0, 0.0); + return LinSrgb::new(0.0, 0.0, 0.0); }; let normal: Vec3 = hit_record.normal; - let color: Color = normal_to_color(normal); - - color + normal_to_color(normal) } /// Given a surface normal, return a color based on normal mapping colorization. #[must_use] -pub fn normal_to_color(normal: Vec3) -> Color { +pub fn normal_to_color(normal: Vec3) -> LinSrgb { // normalize just in case let normal: Vec3 = normal.normalize(); // flip the Z and X axes because the wikipedia example uses left-handed coordinate system and my renderer uses a right-handed one for some reason. // TODO: figure out a good coordinate system to use... See also https://twitter.com/FreyaHolmer/status/1325556229410861056 let normal: Vec3 = Vec3::new(-normal.x, normal.y, -normal.z); // TODO: verify correctness - let r: Float = 0.5 + 0.5 * normal.x; // X -1 to 1 = 0.0 to 1.0 - let g: Float = 0.5 + 0.5 * normal.y; // Y -1 to 1 = 0.0 to 1.0 - // Z 0 to 1 = 0.0 to 1.0 - let b: Float = if normal.z < 0.0 { 0.0 } else { normal.z }; + let r = 0.5 + 0.5 * normal.x; // X -1 to 1 = 0.0 to 1.0 + let g = 0.5 + 0.5 * normal.y; // Y -1 to 1 = 0.0 to 1.0 + // Z 0 to 1 = 0.0 to 1.0 + let b = if normal.z < 0.0 { 0.0 } else { normal.z }; - Color::new(r, g, b) + LinSrgb::new(r, g, b) } diff --git a/clovers/src/objects.rs b/clovers/src/objects.rs index 29c5a0d0..40e78aa7 100644 --- a/clovers/src/objects.rs +++ b/clovers/src/objects.rs @@ -9,7 +9,6 @@ use crate::{ pub mod boxy; // avoid keyword pub mod constant_medium; -pub mod flip_face; #[cfg(feature = "gl_tf")] pub mod gltf; pub mod moving_sphere; @@ -26,7 +25,6 @@ pub use self::gltf::*; use alloc::vec::Vec; pub use boxy::*; // avoid keyword pub use constant_medium::*; -pub use flip_face::*; pub use moving_sphere::*; pub use quad::*; pub use rotate::*; @@ -57,8 +55,6 @@ pub enum Object { Boxy(BoxyInit), /// ConstantMedium object initializer ConstantMedium(ConstantMediumInit), - /// FlipFace object initializer - FlipFace(FlipFaceInit), /// MovingSphere object initializer MovingSphere(MovingSphereInit), /// ObjectList object initializer @@ -96,11 +92,6 @@ pub fn object_to_hitable(obj: Object, materials: &[SharedMaterial]) -> Hitable<' let obj: Hitable = object_to_hitable(obj, materials); Hitable::ConstantMedium(ConstantMedium::new(Box::new(obj), x.density, x.texture)) } - Object::FlipFace(x) => { - let obj = *x.object; - let obj: Hitable = object_to_hitable(obj, materials); - Hitable::FlipFace(FlipFace::new(obj)) - } Object::MovingSphere(x) => { let material = initialize_material(x.material, materials); Hitable::MovingSphere(MovingSphere::new( diff --git a/clovers/src/objects/boxy.rs b/clovers/src/objects/boxy.rs index 2d67bd0e..eedebc8f 100644 --- a/clovers/src/objects/boxy.rs +++ b/clovers/src/objects/boxy.rs @@ -6,6 +6,7 @@ use crate::{ hitable::{HitRecord, Hitable, HitableTrait}, materials::{Material, MaterialInit}, ray::Ray, + wavelength::Wavelength, Box, Float, Vec3, }; use rand::{rngs::SmallRng, Rng}; @@ -108,11 +109,18 @@ impl<'scene> HitableTrait for Boxy<'scene> { /// Returns a probability density function value? // TODO: understand & explain #[must_use] - fn pdf_value(&self, origin: Vec3, vector: Vec3, time: Float, rng: &mut SmallRng) -> Float { + fn pdf_value( + &self, + origin: Vec3, + vector: Vec3, + wavelength: Wavelength, + time: Float, + rng: &mut SmallRng, + ) -> Float { let mut sum = 0.0; self.sides.iter().for_each(|object| { - sum += object.pdf_value(origin, vector, time, rng) / 6.0; + sum += object.pdf_value(origin, vector, wavelength, time, rng) / 6.0; }); sum diff --git a/clovers/src/objects/constant_medium.rs b/clovers/src/objects/constant_medium.rs index 699b1dd7..2e2b8cf3 100644 --- a/clovers/src/objects/constant_medium.rs +++ b/clovers/src/objects/constant_medium.rs @@ -7,6 +7,7 @@ use crate::{ random::random_unit_vector, ray::Ray, textures::Texture, + wavelength::Wavelength, Box, Float, Vec3, EPSILON_CONSTANT_MEDIUM, }; use rand::rngs::SmallRng; @@ -135,8 +136,16 @@ impl<'scene> HitableTrait for ConstantMedium<'scene> { /// Returns a probability density function value based on the boundary object #[must_use] - fn pdf_value(&self, origin: Vec3, vector: Vec3, time: Float, rng: &mut SmallRng) -> Float { - self.boundary.pdf_value(origin, vector, time, rng) + fn pdf_value( + &self, + origin: Vec3, + vector: Vec3, + wavelength: Wavelength, + time: Float, + rng: &mut SmallRng, + ) -> Float { + self.boundary + .pdf_value(origin, vector, wavelength, time, rng) } /// Returns a random point on the surface of the boundary of the fog diff --git a/clovers/src/objects/flip_face.rs b/clovers/src/objects/flip_face.rs deleted file mode 100644 index 3d6e53be..00000000 --- a/clovers/src/objects/flip_face.rs +++ /dev/null @@ -1,74 +0,0 @@ -//! An utility object that can be used to flip the face of the object. TODO: possibly deprecated? - -use crate::{ - aabb::AABB, - hitable::{HitRecord, Hitable, HitableTrait}, - ray::Ray, - Box, Float, Vec3, -}; -use rand::rngs::SmallRng; - -use super::Object; - -#[derive(Clone, Debug)] -#[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))] -/// `FlipFaceInit` structure describes the necessary data for constructing a [`FlipFace`]. Used with [serde] when importing [`SceneFile`](crate::scenes::SceneFile)s. -pub struct FlipFaceInit { - /// The object to wrap with the face flipping feature. - pub object: Box, -} - -#[derive(Debug, Clone)] -/// An utility object that can be used to flip the face of the object. TODO: possibly deprecated? -pub struct FlipFace<'scene> { - object: Box>, -} - -impl<'scene> FlipFace<'scene> { - // TODO: possibly deprecate / remove? - - /// Creates a new instance of a [`FlipFace`] - #[must_use] - pub fn new(object: Hitable<'scene>) -> Self { - FlipFace { - object: Box::new(object), - } - } -} - -impl<'scene> HitableTrait for FlipFace<'scene> { - /// Hit function for the [`FlipFace`] object. Considering this is a utility object that wraps an internal `object`, it returns a [`HitRecord`] with the `front_face` property flipped, if the given [Ray] hits the object. - #[must_use] - fn hit( - &self, - ray: &Ray, - distance_min: Float, - distance_max: Float, - rng: &mut SmallRng, - ) -> Option { - self.object - .hit(ray, distance_min, distance_max, rng) - .map(|hit_record| HitRecord { - front_face: !hit_record.front_face, - ..hit_record - }) - } - - /// Returns the axis-aligned bounding box [AABB] of the [`FlipFace`] object. Considering this is a utility object that wraps an internal `object`, it returns the bounding box of the internal object. - #[must_use] - fn bounding_box(&self, t0: Float, t1: Float) -> Option<&AABB> { - self.object.bounding_box(t0, t1) - } - - /// Returns a probability density function value based on the inner object - #[must_use] - fn pdf_value(&self, origin: Vec3, vector: Vec3, time: Float, rng: &mut SmallRng) -> Float { - self.object.pdf_value(origin, vector, time, rng) - } - - /// Returns a random point on the surface of the inner object - #[must_use] - fn random(&self, origin: Vec3, rng: &mut SmallRng) -> Vec3 { - self.object.random(origin, rng) - } -} diff --git a/clovers/src/objects/gltf.rs b/clovers/src/objects/gltf.rs index 59738ea5..75313fb2 100644 --- a/clovers/src/objects/gltf.rs +++ b/clovers/src/objects/gltf.rs @@ -16,6 +16,7 @@ use crate::{ interval::Interval, materials::gltf::GLTFMaterial, ray::Ray, + wavelength::Wavelength, Float, Vec3, EPSILON_RECT_THICKNESS, EPSILON_SHADOW_ACNE, }; @@ -94,8 +95,16 @@ impl<'scene> HitableTrait for GLTF<'scene> { /// Returns a probability density function value based on the object #[must_use] - fn pdf_value(&self, origin: Vec3, vector: Vec3, time: Float, rng: &mut SmallRng) -> Float { - self.bvhnode.pdf_value(origin, vector, time, rng) + fn pdf_value( + &self, + origin: Vec3, + vector: Vec3, + wavelength: Wavelength, + time: Float, + rng: &mut SmallRng, + ) -> Float { + self.bvhnode + .pdf_value(origin, vector, wavelength, time, rng) } /// Returns a random point on the ssurface of the object @@ -324,14 +333,22 @@ impl<'scene> HitableTrait for GLTFTriangle<'scene> { Some(&self.aabb) } - fn pdf_value(&self, origin: Vec3, vector: Vec3, time: Float, rng: &mut SmallRng) -> Float { + fn pdf_value( + &self, + origin: Vec3, + vector: Vec3, + wavelength: Wavelength, + time: Float, + rng: &mut SmallRng, + ) -> Float { + let ray = Ray { + origin, + direction: vector, + time, + wavelength, + }; // TODO: this is from quad and not updated! - match self.hit( - &Ray::new(origin, vector, time), - EPSILON_SHADOW_ACNE, - Float::INFINITY, - rng, - ) { + match self.hit(&ray, EPSILON_SHADOW_ACNE, Float::INFINITY, rng) { Some(hit_record) => { let distance_squared = hit_record.distance * hit_record.distance * vector.norm_squared(); diff --git a/clovers/src/objects/moving_sphere.rs b/clovers/src/objects/moving_sphere.rs index a74cbfb2..24882a13 100644 --- a/clovers/src/objects/moving_sphere.rs +++ b/clovers/src/objects/moving_sphere.rs @@ -4,8 +4,9 @@ use crate::{ aabb::AABB, hitable::{HitRecord, HitableTrait}, materials::{Material, MaterialInit}, - random::random_in_unit_sphere, + random::random_unit_vector, ray::Ray, + wavelength::Wavelength, Float, Vec3, PI, }; use rand::rngs::SmallRng; @@ -160,12 +161,19 @@ impl<'scene> HitableTrait for MovingSphere<'scene> { Some(&self.aabb) } - fn pdf_value(&self, _origin: Vec3, _vector: Vec3, _time: Float, _rng: &mut SmallRng) -> Float { + fn pdf_value( + &self, + _origin: Vec3, + _vector: Vec3, + _wavelength: Wavelength, + _time: Float, + _rng: &mut SmallRng, + ) -> Float { // TODO: fix 0.0 } fn random(&self, _origin: Vec3, rng: &mut SmallRng) -> Vec3 { - random_in_unit_sphere(rng) + random_unit_vector(rng) } } diff --git a/clovers/src/objects/quad.rs b/clovers/src/objects/quad.rs index 0205eba5..06a188da 100644 --- a/clovers/src/objects/quad.rs +++ b/clovers/src/objects/quad.rs @@ -3,6 +3,7 @@ use crate::hitable::HitableTrait; use crate::materials::MaterialInit; +use crate::wavelength::Wavelength; use crate::EPSILON_SHADOW_ACNE; use crate::{ aabb::AABB, hitable::get_orientation, hitable::HitRecord, materials::Material, ray::Ray, Float, @@ -134,13 +135,21 @@ impl<'scene> HitableTrait for Quad<'scene> { /// Returns a probability density function value? // TODO: understand & explain #[must_use] - fn pdf_value(&self, origin: Vec3, vector: Vec3, time: Float, rng: &mut SmallRng) -> Float { - match self.hit( - &Ray::new(origin, vector, time), - EPSILON_SHADOW_ACNE, - Float::INFINITY, - rng, - ) { + fn pdf_value( + &self, + origin: Vec3, + vector: Vec3, + wavelength: Wavelength, + time: Float, + rng: &mut SmallRng, + ) -> Float { + let ray = Ray { + origin, + direction: vector, + time, + wavelength, + }; + match self.hit(&ray, EPSILON_SHADOW_ACNE, Float::INFINITY, rng) { Some(hit_record) => { let distance_squared = hit_record.distance * hit_record.distance * vector.norm_squared(); diff --git a/clovers/src/objects/rotate.rs b/clovers/src/objects/rotate.rs index 9981a8ec..10bb01fd 100644 --- a/clovers/src/objects/rotate.rs +++ b/clovers/src/objects/rotate.rs @@ -4,6 +4,7 @@ use crate::{ aabb::AABB, hitable::{HitRecord, Hitable, HitableTrait}, ray::Ray, + wavelength::Wavelength, Box, Float, Vec3, }; use rand::rngs::SmallRng; @@ -113,7 +114,12 @@ impl<'scene> HitableTrait for RotateY<'scene> { direction[0] = self.cos_theta * ray.direction[0] - self.sin_theta * ray.direction[2]; direction[2] = self.sin_theta * ray.direction[0] + self.cos_theta * ray.direction[2]; - let rotated_r: Ray = Ray::new(origin, direction, ray.time); + let rotated_r: Ray = Ray { + origin, + direction, + time: ray.time, + wavelength: ray.wavelength, + }; let Some(hit_record) = self.object.hit(&rotated_r, distance_min, distance_max, rng) else { // Did not hit rotated object, early return None @@ -153,7 +159,14 @@ impl<'scene> HitableTrait for RotateY<'scene> { self.aabb.as_ref() } - fn pdf_value(&self, _origin: Vec3, _vector: Vec3, _time: Float, _rng: &mut SmallRng) -> Float { + fn pdf_value( + &self, + _origin: Vec3, + _vector: Vec3, + _wavelength: Wavelength, + _time: Float, + _rng: &mut SmallRng, + ) -> Float { // TODO: fix 0.0 } diff --git a/clovers/src/objects/sphere.rs b/clovers/src/objects/sphere.rs index f07ebde6..272d6c14 100644 --- a/clovers/src/objects/sphere.rs +++ b/clovers/src/objects/sphere.rs @@ -6,6 +6,7 @@ use crate::{ materials::{Material, MaterialInit}, onb::ONB, ray::Ray, + wavelength::Wavelength, Float, Vec3, EPSILON_SHADOW_ACNE, PI, }; use rand::{rngs::SmallRng, Rng}; @@ -126,13 +127,21 @@ impl<'scene> HitableTrait for Sphere<'scene> { /// Returns the probability density function for the sphere? TODO: what does this do again and how #[must_use] - fn pdf_value(&self, origin: Vec3, vector: Vec3, time: Float, rng: &mut SmallRng) -> Float { - match self.hit( - &Ray::new(origin, vector, time), - EPSILON_SHADOW_ACNE, - Float::INFINITY, - rng, - ) { + fn pdf_value( + &self, + origin: Vec3, + vector: Vec3, + wavelength: Wavelength, + time: Float, + rng: &mut SmallRng, + ) -> Float { + let ray = Ray { + origin, + direction: vector, + time, + wavelength, + }; + match self.hit(&ray, EPSILON_SHADOW_ACNE, Float::INFINITY, rng) { None => 0.0, Some(_hit_record) => { let cos_theta_max = (1.0 diff --git a/clovers/src/objects/stl.rs b/clovers/src/objects/stl.rs index a35d8cae..a88d49ea 100644 --- a/clovers/src/objects/stl.rs +++ b/clovers/src/objects/stl.rs @@ -1,5 +1,4 @@ //! STL utilities -// TODO: better docs use alloc::string::String; use nalgebra::Rotation3; @@ -13,6 +12,7 @@ use crate::{ materials::{Material, MaterialInit, SharedMaterial}, objects::Triangle, ray::Ray, + wavelength::Wavelength, Float, Vec3, }; @@ -48,8 +48,16 @@ impl<'scene> HitableTrait for STL<'scene> { /// Returns a probability density function value based on the object #[must_use] - fn pdf_value(&self, origin: Vec3, vector: Vec3, time: Float, rng: &mut SmallRng) -> Float { - self.bvhnode.pdf_value(origin, vector, time, rng) + fn pdf_value( + &self, + origin: Vec3, + vector: Vec3, + wavelength: Wavelength, + time: Float, + rng: &mut SmallRng, + ) -> Float { + self.bvhnode + .pdf_value(origin, vector, wavelength, time, rng) } /// Returns a random point on the ssurface of the object diff --git a/clovers/src/objects/translate.rs b/clovers/src/objects/translate.rs index b29354db..b13e1cad 100644 --- a/clovers/src/objects/translate.rs +++ b/clovers/src/objects/translate.rs @@ -4,6 +4,7 @@ use crate::{ aabb::AABB, hitable::{HitRecord, Hitable, HitableTrait}, ray::Ray, + wavelength::Wavelength, Box, Float, Vec3, }; use rand::rngs::SmallRng; @@ -52,7 +53,12 @@ impl<'scene> HitableTrait for Translate<'scene> { distance_max: Float, rng: &mut SmallRng, ) -> Option { - let moved_ray: Ray = Ray::new(ray.origin - self.offset, ray.direction, ray.time); + let moved_ray = Ray { + origin: ray.origin - self.offset, + direction: ray.direction, + time: ray.time, + wavelength: ray.wavelength, + }; match self.object.hit(&moved_ray, distance_min, distance_max, rng) { // Didn't hit anything, return None @@ -74,10 +80,17 @@ impl<'scene> HitableTrait for Translate<'scene> { /// Returns a probability density function value based on the inner object #[must_use] - fn pdf_value(&self, origin: Vec3, vector: Vec3, time: Float, rng: &mut SmallRng) -> Float { + fn pdf_value( + &self, + origin: Vec3, + vector: Vec3, + wavelength: Wavelength, + time: Float, + rng: &mut SmallRng, + ) -> Float { // TODO: is this correct? self.object - .pdf_value(origin + self.offset, vector, time, rng) + .pdf_value(origin + self.offset, vector, wavelength, time, rng) } /// Returns a random point on the surface of the moved object diff --git a/clovers/src/objects/triangle.rs b/clovers/src/objects/triangle.rs index c3b48809..aebb97cf 100644 --- a/clovers/src/objects/triangle.rs +++ b/clovers/src/objects/triangle.rs @@ -4,10 +4,11 @@ use crate::hitable::HitableTrait; use crate::interval::Interval; use crate::materials::MaterialInit; +use crate::wavelength::Wavelength; use crate::EPSILON_SHADOW_ACNE; use crate::{ - aabb::AABB, hitable::get_orientation, hitable::HitRecord, materials::Material, ray::Ray, Float, - Vec3, EPSILON_RECT_THICKNESS, + aabb::AABB, hitable::HitRecord, materials::Material, ray::Ray, Float, Vec3, + EPSILON_RECT_THICKNESS, }; use rand::rngs::SmallRng; use rand::Rng; @@ -146,18 +147,18 @@ impl<'scene> HitableTrait for Triangle<'scene> { } // Ray hits the 2D shape; set the rest of the hit record and return - - let (front_face, normal) = get_orientation(ray, self.normal); - - Some(HitRecord { + let mut record = HitRecord { distance: t, position: intersection, - normal, u: alpha, v: beta, material: self.material, - front_face, - }) + normal: self.normal, + front_face: false, + }; + record.set_face_normal(ray, self.normal); + + Some(record) } /// Returns the bounding box of the triangle @@ -170,14 +171,22 @@ impl<'scene> HitableTrait for Triangle<'scene> { /// Returns a probability density function value? // TODO: understand & explain #[must_use] - fn pdf_value(&self, origin: Vec3, vector: Vec3, time: Float, rng: &mut SmallRng) -> Float { + fn pdf_value( + &self, + origin: Vec3, + vector: Vec3, + wavelength: Wavelength, + time: Float, + rng: &mut SmallRng, + ) -> Float { + let ray = Ray { + origin, + direction: vector, + time, + wavelength, + }; // TODO: this is from quad and not updated! - match self.hit( - &Ray::new(origin, vector, time), - EPSILON_SHADOW_ACNE, - Float::INFINITY, - rng, - ) { + match self.hit(&ray, EPSILON_SHADOW_ACNE, Float::INFINITY, rng) { Some(hit_record) => { let distance_squared = hit_record.distance * hit_record.distance * vector.norm_squared(); @@ -222,30 +231,30 @@ mod tests { use super::*; + const TIME_0: Float = 0.0; + const TIME_1: Float = 1.0; + const RAY: Ray = Ray { + origin: Vec3::new(0.0, 0.0, -1.0), + direction: Vec3::new(0.0, 0.0, 1.0), + time: TIME_0, + wavelength: 600, + }; + #[test] fn xy_unit_triangle() { - let time_0 = 0.0; - let time_1 = 1.0; + let mut rng = SmallRng::from_entropy(); let material = Box::default(); // Unit triangle at origin - let xy_unit_triangle = Triangle::new( + let triangle = Triangle::new( Vec3::new(0.0, 0.0, 0.0), Vec3::new(1.0, 0.0, 0.0), Vec3::new(0.0, 1.0, 0.0), &material, ); - let ray = Ray::new( - Vec3::new(0.0, 0.0, -1.0).normalize(), - Vec3::new(0.0, 0.0, 1.0).normalize(), - time_0, - ); - - let mut rng = SmallRng::from_entropy(); - - let aabb = xy_unit_triangle - .bounding_box(time_0, time_1) + let aabb = triangle + .bounding_box(TIME_0, TIME_1) .expect("No AABB for the triangle"); let expected_aabb = AABB::new( @@ -256,42 +265,34 @@ mod tests { assert_eq!(aabb, &expected_aabb); - let boxhit = aabb.hit(&ray, time_0, time_1); + let boxhit = aabb.hit(&RAY, TIME_0, TIME_1); assert!(boxhit); - let hit_record = xy_unit_triangle - .hit(&ray, Float::NEG_INFINITY, Float::INFINITY, &mut rng) + let hit_record = triangle + .hit(&RAY, Float::NEG_INFINITY, Float::INFINITY, &mut rng) .expect("No hit record for triangle and ray"); assert!(hit_record.distance - 1.0 <= Float::EPSILON); assert_eq!(hit_record.position, Vec3::new(0.0, 0.0, 0.0)); assert_eq!(hit_record.normal, Vec3::new(0.0, 0.0, -1.0)); + assert!(!hit_record.front_face); } #[test] fn yx_unit_triangle() { - let time_0 = 0.0; - let time_1 = 1.0; + let mut rng = SmallRng::from_entropy(); let material = Box::default(); // Unit triangle at origin, u and v coords swapped - let xy_unit_triangle = Triangle::new( + let triangle = Triangle::new( Vec3::new(0.0, 0.0, 0.0), Vec3::new(0.0, 1.0, 0.0), Vec3::new(1.0, 0.0, 0.0), &material, ); - let ray = Ray::new( - Vec3::new(0.0, 0.0, -1.0).normalize(), - Vec3::new(0.0, 0.0, 1.0).normalize(), - time_0, - ); - - let mut rng = SmallRng::from_entropy(); - - let aabb = xy_unit_triangle - .bounding_box(time_0, time_1) + let aabb = triangle + .bounding_box(TIME_0, TIME_1) .expect("No AABB for the triangle"); let expected_aabb = AABB::new( @@ -302,42 +303,72 @@ mod tests { assert_eq!(aabb, &expected_aabb); - let boxhit = aabb.hit(&ray, time_0, time_1); + let boxhit = aabb.hit(&RAY, TIME_0, TIME_1); assert!(boxhit); - let hit_record = xy_unit_triangle - .hit(&ray, Float::NEG_INFINITY, Float::INFINITY, &mut rng) + let hit_record = triangle + .hit(&RAY, Float::NEG_INFINITY, Float::INFINITY, &mut rng) .expect("No hit record for triangle and ray"); assert!(hit_record.distance - 1.0 <= Float::EPSILON); assert_eq!(hit_record.position, Vec3::new(0.0, 0.0, 0.0)); assert_eq!(hit_record.normal, Vec3::new(0.0, 0.0, -1.0)); + assert!(hit_record.front_face); } #[test] fn neg_xy_unit_triangle() { - let time_0 = 0.0; - let time_1 = 1.0; + let mut rng = SmallRng::from_entropy(); let material: Box = Box::default(); // Unit triangle at origin, u and v coords swapped - let neg_xy_unit_triangle = Triangle::new( + let triangle = Triangle::new( Vec3::new(0.0, 0.0, 0.0), Vec3::new(-1.0, 0.0, 0.0), Vec3::new(0.0, -1.0, 0.0), &material, ); - let ray = Ray::new( - Vec3::new(0.0, 0.0, -1.0).normalize(), - Vec3::new(0.0, 0.0, 1.0).normalize(), - time_0, + let aabb = triangle + .bounding_box(TIME_0, TIME_1) + .expect("No AABB for the triangle"); + + let expected_aabb = AABB::new( + Interval::new(-1.0, 0.0), + Interval::new(-1.0, 0.0), + Interval::new(0.0, 0.0).expand(EPSILON_RECT_THICKNESS), ); + assert_eq!(aabb, &expected_aabb); + + let boxhit = aabb.hit(&RAY, TIME_0, TIME_1); + assert!(boxhit); + + let hit_record = triangle + .hit(&RAY, Float::NEG_INFINITY, Float::INFINITY, &mut rng) + .expect("No hit record for triangle and ray"); + + assert!(hit_record.distance - 1.0 <= Float::EPSILON); + assert_eq!(hit_record.position, Vec3::new(0.0, 0.0, 0.0)); + assert_eq!(hit_record.normal, Vec3::new(0.0, 0.0, -1.0)); + assert!(!hit_record.front_face); + } + + #[test] + fn neg_yx_unit_triangle() { let mut rng = SmallRng::from_entropy(); + let material: Box = Box::default(); + + // Unit triangle at origin, u and v coords swapped + let triangle = Triangle::new( + Vec3::new(0.0, 0.0, 0.0), + Vec3::new(0.0, -1.0, 0.0), + Vec3::new(-1.0, 0.0, 0.0), + &material, + ); - let aabb = neg_xy_unit_triangle - .bounding_box(time_0, time_1) + let aabb = triangle + .bounding_box(TIME_0, TIME_1) .expect("No AABB for the triangle"); let expected_aabb = AABB::new( @@ -348,15 +379,16 @@ mod tests { assert_eq!(aabb, &expected_aabb); - let boxhit = aabb.hit(&ray, time_0, time_1); + let boxhit = aabb.hit(&RAY, TIME_0, TIME_1); assert!(boxhit); - let hit_record = neg_xy_unit_triangle - .hit(&ray, Float::NEG_INFINITY, Float::INFINITY, &mut rng) + let hit_record = triangle + .hit(&RAY, Float::NEG_INFINITY, Float::INFINITY, &mut rng) .expect("No hit record for triangle and ray"); assert!(hit_record.distance - 1.0 <= Float::EPSILON); assert_eq!(hit_record.position, Vec3::new(0.0, 0.0, 0.0)); assert_eq!(hit_record.normal, Vec3::new(0.0, 0.0, -1.0)); + assert!(hit_record.front_face); } } diff --git a/clovers/src/pdf.rs b/clovers/src/pdf.rs index 7e44bdac..0ed7910e 100644 --- a/clovers/src/pdf.rs +++ b/clovers/src/pdf.rs @@ -5,7 +5,8 @@ use crate::{ hitable::{Hitable, HitableTrait}, onb::ONB, - random::{random_cosine_direction, random_in_unit_sphere}, + random::{random_cosine_direction, random_unit_vector}, + wavelength::Wavelength, Box, Float, Vec3, PI, }; use enum_dispatch::enum_dispatch; @@ -25,7 +26,13 @@ pub enum PDF<'scene> { #[enum_dispatch] pub(crate) trait PDFTrait { #[must_use] - fn value(&self, direction: Vec3, time: Float, rng: &mut SmallRng) -> Float; + fn value( + &self, + direction: Vec3, + wavelength: Wavelength, + time: Float, + rng: &mut SmallRng, + ) -> Float; #[must_use] fn generate(&self, rng: &mut SmallRng) -> Vec3; @@ -47,7 +54,13 @@ impl CosinePDF { impl PDFTrait for CosinePDF { #[must_use] - fn value(&self, direction: Vec3, _time: Float, _rng: &mut SmallRng) -> Float { + fn value( + &self, + direction: Vec3, + _wavelength: Wavelength, + _time: Float, + _rng: &mut SmallRng, + ) -> Float { let cosine = direction.normalize().dot(&self.uvw.w); if cosine <= 0.0 { 0.0 @@ -77,8 +90,15 @@ impl<'scene> HitablePDF<'scene> { impl<'scene> PDFTrait for HitablePDF<'scene> { #[must_use] - fn value(&self, direction: Vec3, time: Float, rng: &mut SmallRng) -> Float { - self.hitable.pdf_value(self.origin, direction, time, rng) + fn value( + &self, + direction: Vec3, + wavelength: Wavelength, + time: Float, + rng: &mut SmallRng, + ) -> Float { + self.hitable + .pdf_value(self.origin, direction, wavelength, time, rng) } #[must_use] @@ -106,8 +126,15 @@ impl<'scene> MixturePDF<'scene> { impl<'scene> PDFTrait for MixturePDF<'scene> { #[must_use] - fn value(&self, direction: Vec3, time: Float, rng: &mut SmallRng) -> Float { - 0.5 * self.pdf1.value(direction, time, rng) + 0.5 * self.pdf2.value(direction, time, rng) + fn value( + &self, + direction: Vec3, + wavelength: Wavelength, + time: Float, + rng: &mut SmallRng, + ) -> Float { + 0.5 * self.pdf1.value(direction, wavelength, time, rng) + + 0.5 * self.pdf2.value(direction, wavelength, time, rng) } #[must_use] @@ -132,13 +159,19 @@ impl SpherePDF { impl PDFTrait for SpherePDF { #[must_use] - fn value(&self, _direction: Vec3, _time: Float, _rng: &mut SmallRng) -> Float { + fn value( + &self, + _direction: Vec3, + _wavelength: Wavelength, + _time: Float, + _rng: &mut SmallRng, + ) -> Float { 1.0 / (4.0 * PI) } #[must_use] fn generate(&self, rng: &mut SmallRng) -> Vec3 { - random_in_unit_sphere(rng) + random_unit_vector(rng) } } @@ -155,13 +188,19 @@ impl ZeroPDF { impl PDFTrait for ZeroPDF { #[must_use] - fn value(&self, _direction: Vec3, _time: Float, _rng: &mut SmallRng) -> Float { + fn value( + &self, + _direction: Vec3, + _wavelength: Wavelength, + _time: Float, + _rng: &mut SmallRng, + ) -> Float { 0.0 } #[must_use] - fn generate(&self, _rng: &mut SmallRng) -> Vec3 { - Vec3::new(1.0, 0.0, 0.0) + fn generate(&self, rng: &mut SmallRng) -> Vec3 { + random_unit_vector(rng) } } diff --git a/clovers/src/random.rs b/clovers/src/random.rs index d147d5eb..22a09818 100644 --- a/clovers/src/random.rs +++ b/clovers/src/random.rs @@ -3,16 +3,9 @@ use crate::{Float, Vec3, PI}; use rand::rngs::SmallRng; use rand::Rng; -use rand_distr::{Distribution, UnitBall, UnitDisc, UnitSphere}; +use rand_distr::{Distribution, UnitDisc, UnitSphere}; -/// Internal helper. Originally used for lambertian reflection with flaws -#[must_use] -#[inline] -pub fn random_in_unit_sphere(rng: &mut SmallRng) -> Vec3 { - UnitBall.sample(rng).into() -} - -/// Internal helper. Use this for the more correct "True Lambertian" reflection +/// Internal helper. #[must_use] pub fn random_unit_vector(rng: &mut SmallRng) -> Vec3 { UnitSphere.sample(rng).into() @@ -42,8 +35,8 @@ pub fn random_cosine_direction(rng: &mut SmallRng) -> Vec3 { /// Internal helper. #[must_use] -pub fn random_in_hemisphere(normal: Vec3, rng: &mut SmallRng) -> Vec3 { - let in_unit_sphere: Vec3 = random_in_unit_sphere(rng); +pub fn random_on_hemisphere(normal: Vec3, rng: &mut SmallRng) -> Vec3 { + let in_unit_sphere: Vec3 = random_unit_vector(rng); if in_unit_sphere.dot(&normal) > 0.0 { // In the same hemisphere as the normal in_unit_sphere diff --git a/clovers/src/ray.rs b/clovers/src/ray.rs index d7130586..41c4a203 100644 --- a/clovers/src/ray.rs +++ b/clovers/src/ray.rs @@ -1,6 +1,6 @@ -//! The very core of the ray tracing rendering itself: the [Ray](crate::ray::Ray) +//! The very core of the ray tracing rendering itself: the [Ray] -use crate::{Float, Vec3}; +use crate::{wavelength::Wavelength, Float, Vec3}; /// A Ray has an origin and a direction, as well as an instant in time it exists in. Motion blur is achieved by creating multiple rays with slightly different times. #[derive(Clone, Debug, PartialEq)] @@ -11,19 +11,11 @@ pub struct Ray { pub direction: Vec3, /// The time instant at which the ray exists. pub time: Float, + /// Wavelength of the ray + pub wavelength: Wavelength, } impl Ray { - /// Creates a single Ray. A Ray has an origin and a direction, as well as an instant in time it exists in. Motion blur is achieved by creating multiple rays with slightly different times. - #[must_use] - pub fn new(origin: Vec3, direction: Vec3, time: Float) -> Ray { - Ray { - origin, - direction, - time, - } - } - /// Evaluates the position (coordinate) at which the ray is at the given parameter, considering the origin and direction. Considering a default unit speed of 1 per unit time, this function can be given either a time or a distance. #[must_use] pub fn evaluate(&self, parameter: Float) -> Vec3 { diff --git a/clovers/src/scenes.rs b/clovers/src/scenes.rs index f8d9bbc0..7e2bd03a 100644 --- a/clovers/src/scenes.rs +++ b/clovers/src/scenes.rs @@ -3,26 +3,26 @@ use crate::{ bvhnode::BVHNode, camera::{Camera, CameraInit}, - color::Color, hitable::Hitable, materials::SharedMaterial, objects::{object_to_hitable, Object}, Float, Vec, }; +use palette::Srgb; #[cfg(feature = "traces")] use tracing::info; #[derive(Debug)] /// A representation of the scene that is being rendered. pub struct Scene<'scene> { - /// Bounding-volume hierarchy of [Hitable] objects in the scene. This could, as currently written, be any [Hitable] - in practice, we place the root of the [BVHNode](crate::bvhnode::BVHNode) tree here. + /// Bounding-volume hierarchy of [Hitable] objects in the scene. This could, as currently written, be any [Hitable] - in practice, we place the root of the [BVHNode] tree here. pub objects: BVHNode<'scene>, /// The camera object used for rendering the scene. pub camera: Camera, /// The background color to use when the rays do not hit anything in the scene. - pub background_color: Color, // TODO: make into Texture or something? - /// A [BVHNode](crate::bvhnode::BVHNode) tree of prioritized objects - e.g. glass items or lights - that affect the biased sampling of the scene. Wrapped into a [Hitable] for convenience reasons (see various PDF functions). + pub background_color: Srgb, // TODO: make into Texture or something? + /// A [BVHNode] tree of prioritized objects - e.g. glass items or lights - that affect the biased sampling of the scene. Wrapped into a [Hitable] for convenience reasons (see various PDF functions). pub priority_objects: Hitable<'scene>, } @@ -35,7 +35,7 @@ impl<'scene> Scene<'scene> { camera: Camera, objects: Vec>, priority_objects: Vec>, - background_color: Color, + background_color: Srgb, ) -> Scene<'scene> { Scene { objects: BVHNode::from_list(objects, time_0, time_1), @@ -57,7 +57,7 @@ impl<'scene> Scene<'scene> { pub struct SceneFile { time_0: Float, time_1: Float, - background_color: Color, + background_color: Srgb, camera: CameraInit, objects: Vec, #[cfg_attr(feature = "serde-derive", serde(default))] diff --git a/clovers/src/spectrum.rs b/clovers/src/spectrum.rs new file mode 100644 index 00000000..3cdba552 --- /dev/null +++ b/clovers/src/spectrum.rs @@ -0,0 +1,26 @@ +//! Utilities for [Physically Meaningful Rendering using Tristimulus Colours](https://doi.org/10.1111/cgf.12676) + +#![allow(clippy::cast_precision_loss)] + +use palette::{white_point::E, Xyz}; + +use crate::{wavelength::Wavelength, Float}; + +use self::spectra_xyz_5nm_380_780_097::equal_energy_reflectance; + +pub mod spectra_xyz_5nm_380_780_097; +pub mod spectrum_grid; + +/// Evaluate the spectrum at the given wavelength for the given XYZ color +#[must_use] +pub fn spectrum_xyz_to_p(lambda: Wavelength, xyz: Xyz) -> Float { + // Currently, the data is only built for 5nm intervals + // TODO: generate a file with 1nm intervals? + let lambda: f64 = lambda as f64; + let xyz: [f64; 3] = [f64::from(xyz.x), f64::from(xyz.y), f64::from(xyz.z)]; + let p = spectrum_grid::spectrum_xyz_to_p(lambda, xyz) / equal_energy_reflectance; + + #[allow(clippy::cast_possible_truncation)] + let p = p as Float; + p +} diff --git a/clovers/src/spectrum/README.md b/clovers/src/spectrum/README.md new file mode 100644 index 00000000..993d985a --- /dev/null +++ b/clovers/src/spectrum/README.md @@ -0,0 +1 @@ +Files in this directory are adapted from the paper [Physically Meaningful Rendering using Tristimulus Colours](https://doi.org/10.1111/cgf.12676) diff --git a/clovers/src/spectrum/spectra_xyz_5nm_380_780_097.rs b/clovers/src/spectrum/spectra_xyz_5nm_380_780_097.rs new file mode 100644 index 00000000..fe112255 --- /dev/null +++ b/clovers/src/spectrum/spectra_xyz_5nm_380_780_097.rs @@ -0,0 +1,159 @@ +//! Hand-converted from `spectra_xyz_5nm_380_780_0.97.h` in the supplemental material from [Physically Meaningful Rendering using Tristimulus Colours](https://doi.org/10.1111/cgf.12676) + +#![allow(clippy::unreadable_literal)] +#![allow(missing_docs)] +#![allow(non_camel_case_types)] +#![allow(non_upper_case_globals)] +#![allow(non_snake_case)] + +// Basic info on the spectrum grid. +pub const spectrum_grid_width: usize = 12; +pub const spectrum_grid_height: usize = 14; +pub const spectrum_grid_width_f: f64 = 12.0; +pub const spectrum_grid_height_f: f64 = 14.0; + +// The spectra here have these properties. +pub const spectrum_sample_min: f64 = 380.0; +pub const spectrum_sample_max: f64 = 780.0; +pub const spectrum_bin_size: f64 = 5.0; +pub const spectrum_num_samples: usize = 81; +pub const spectrum_num_samples_f: f64 = 81.0; + +// xy* color space. +const spectrum_mat_xy_to_xystar: [f64; 6] = [ + 0.9088957044314135, + 0.4170234986977646, + -0.441973067709726, + -0.4170234986977646, + 0.9088957044314135, + -0.1639574019112163, +]; +const spectrum_mat_xystar_to_xy: [f64; 6] = [ + 0.9088957044314137, + -0.41702349869776467, + 0.33333333333333337, + 0.41702349869776467, + 0.9088957044314137, + 0.3333333333333333, +]; +// uv color space. +const spectrum_mat_xy_to_uv: [f64; 6] = [ + 16.642783858871084, + 7.636114813898141, + -2.0929662242564078, + -7.382929931517094, + 16.090971664254482, + 1.0973194224208704, +]; +const spectrum_mat_uv_to_xy: [f64; 6] = [ + 0.04963661179157505, + -0.023555498979304087, + 0.1297356585010993, + 0.022774487118711398, + 0.05133881401140044, + -0.008668845424536832, +]; + +// apply a 3x2 matrix to a 2D color. +pub fn spectrum_apply_3x2(matrix: [f64; 6], src: [f64; 2], tgt: &mut [f64; 2]) { + tgt[0] = matrix[0] * src[0] + matrix[1] * src[1] + matrix[2]; + tgt[1] = matrix[3] * src[0] + matrix[4] * src[1] + matrix[5]; +} + +// Concrete conversion routines. +pub fn spectrum_xy_to_xystar(xy: [f64; 2], xystar: &mut [f64; 2]) { + spectrum_apply_3x2(spectrum_mat_xy_to_xystar, xy, xystar); +} +pub fn spectrum_xystar_to_xy(xystar: [f64; 2], xy: &mut [f64; 2]) { + spectrum_apply_3x2(spectrum_mat_xystar_to_xy, xystar, xy); +} +pub fn spectrum_xy_to_uv(xy: [f64; 2], uv: &mut [f64; 2]) { + spectrum_apply_3x2(spectrum_mat_xy_to_uv, xy, uv); +} +pub fn spectrum_uv_to_xy(uv: [f64; 2], xy: &mut [f64; 2]) { + spectrum_apply_3x2(spectrum_mat_uv_to_xy, uv, xy); +} + +// Grid cells. Laid out in row-major format. +// num_points = 0 for cells without data points. +#[derive(Debug)] +pub struct spectrum_grid_cell_t { + pub inside: usize, + pub num_points: usize, + pub idx: [isize; 6], +} + +#[rustfmt::skip] +pub const spectrum_grid: [spectrum_grid_cell_t; 168] = [ + spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [148, 110, 0, 12, 111, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [0, 1, 12, 13, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [1, 2, 13, 14, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [2, 3, 14, 15, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [3, 4, 15, 16, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [4, 5, 16, 17, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [5, 6, 17, 18, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [6, 7, 18, 19, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [7, 8, 19, 20, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [8, 9, 20, 21, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [9, 10, 21, 22, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [149, 10, 11, 145, 22, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [150, 111, 12, 23, 112, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [12, 13, 23, 24, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [13, 14, 24, 25, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [14, 15, 25, 26, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [15, 16, 26, 27, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [16, 17, 27, 28, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [17, 18, 28, 29, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [18, 19, 29, 30, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [19, 20, 30, 31, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [20, 21, 31, 32, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [21, 22, 32, 33, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [151, 22, 145, 146, 33, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [152, 112, 23, 34, 113, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [23, 24, 34, 35, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [24, 25, 35, 36, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [25, 26, 36, 37, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [26, 27, 37, 38, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [27, 28, 38, 39, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [28, 29, 39, 40, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [29, 30, 40, 41, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [30, 31, 41, 42, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [31, 32, 42, 43, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 6, idx: [153, 32, 33, 147, 141, 43], }, spectrum_grid_cell_t { inside: 0, num_points: 4, idx: [154, 33, 146, 147, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [155, 113, 34, 44, 114, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [34, 35, 44, 45, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [35, 36, 45, 46, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [36, 37, 46, 47, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [37, 38, 47, 48, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [38, 39, 48, 49, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [39, 40, 49, 50, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [40, 41, 50, 51, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [41, 42, 51, 52, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [42, 43, 52, 53, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [156, 43, 141, 142, 53, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [157, 114, 44, 54, 115, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [44, 45, 54, 55, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [45, 46, 55, 56, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [46, 47, 56, 57, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [47, 48, 57, 58, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [48, 49, 58, 59, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [49, 50, 59, 60, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [50, 51, 60, 61, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [51, 52, 61, 62, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [52, 53, 62, 63, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [158, 53, 142, 143, 63, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 4, idx: [159, 115, 54, 116, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 6, idx: [160, 116, 54, 55, 64, 117], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [55, 56, 64, 65, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [56, 57, 65, 66, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [57, 58, 66, 67, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [58, 59, 67, 68, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [59, 60, 68, 69, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [60, 61, 69, 70, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [61, 62, 70, 71, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 6, idx: [161, 62, 63, 144, 138, 71], }, spectrum_grid_cell_t { inside: 0, num_points: 4, idx: [162, 63, 143, 144, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [163, 117, 64, 72, 118, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [64, 65, 72, 73, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [65, 66, 73, 74, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [66, 67, 74, 75, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [67, 68, 75, 76, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [68, 69, 76, 77, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [69, 70, 77, 78, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [70, 71, 78, 79, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [164, 71, 138, 139, 79, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [165, 118, 72, 80, 119, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [72, 73, 80, 81, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [73, 74, 81, 82, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [74, 75, 82, 83, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [75, 76, 83, 84, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [76, 77, 84, 85, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [77, 78, 85, 86, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 6, idx: [166, 78, 79, 140, 134, 86], }, spectrum_grid_cell_t { inside: 0, num_points: 4, idx: [167, 79, 139, 140, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 4, idx: [168, 119, 80, 120, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 6, idx: [169, 80, 81, 87, 121, 120], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [81, 82, 87, 88, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [82, 83, 88, 89, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [83, 84, 89, 90, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [84, 85, 90, 91, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [85, 86, 91, 92, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [170, 86, 134, 135, 92, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [171, 121, 87, 93, 122, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [87, 88, 93, 94, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [88, 89, 94, 95, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [89, 90, 95, 96, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [90, 91, 96, 97, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [91, 92, 97, 98, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [172, 92, 135, 136, 98, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [173, 122, 93, 99, 123, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [93, 94, 99, 100, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [94, 95, 100, 101, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [95, 96, 101, 102, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [96, 97, 102, 103, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 6, idx: [174, 97, 98, 137, 131, 103], }, spectrum_grid_cell_t { inside: 0, num_points: 4, idx: [175, 98, 136, 137, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 4, idx: [176, 123, 99, 124, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 6, idx: [177, 124, 99, 100, 104, 125], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [100, 101, 104, 105, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [101, 102, 105, 106, -1, -1], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [102, 103, 106, 107, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [178, 103, 131, 132, 107, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 4, idx: [179, 125, 104, 126, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 6, idx: [180, 104, 105, 108, 127, 126], }, spectrum_grid_cell_t { inside: 1, num_points: 4, idx: [105, 106, 108, 109, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 6, idx: [181, 106, 107, 133, 129, 109], }, spectrum_grid_cell_t { inside: 0, num_points: 4, idx: [182, 107, 132, 133, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 4, idx: [183, 127, 108, 128, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 5, idx: [184, 108, 109, 130, 128, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 4, idx: [185, 109, 129, 130, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, spectrum_grid_cell_t { inside: 0, num_points: 0, idx: [-1, -1, -1, -1, -1, -1], }, +]; + +// Grid data points. +#[derive(Debug)] +pub struct spectrum_data_point_t { + pub xystar: [f64; 2], + pub uv: [f64; 2], + pub spectrum: [f64; 81], // X+Y+Z = 1 +} + +#[rustfmt::skip] +pub const spectrum_data_points: [spectrum_data_point_t; 186] = [ + spectrum_data_point_t { xystar: [-0.2730599976959221, -0.22593929649394454], uv: [1.0, 0.0], spectrum: [ 0.0254585661435, 0.0254522837222, 0.0254350677521, 0.0253976483946, 0.025323907854, 0.0251819538591, 0.0249304383689, 0.0244765987892, 0.0236680837374, 0.0222722024021, 0.020026196415, 0.0168335337637, 0.0128503686647, 0.00847600843427, 0.00430773842015, 0.00115019839385, 0.0, 0.0, 0.0, 0.0, 0.0, 6.110194812e-19, 0.0, 0.0, 0.0, 0.0, 4.96529841167e-18, 0.0, 0.0, 4.97688472401e-17, 6.42158160797e-18, 0.0, 2.70243428816e-17, 0.0, 8.66880413823e-18, 0.0, 5.94822166417e-18, 1.49646918938e-17, 0.0, 0.0, 0.0, 2.66043174773e-17, 4.07611299633e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.3067101609e-19, 6.10705373879e-19, 1.22579462575e-18, 0.000222158936213, 0.000780519255798, 0.00142595962105, 0.00203306327779, 0.00254859436028, 0.00295991785315, 0.0032784444078, 0.00351968511024, 0.00369934230045, 0.00382942826596, 0.00392212358524, 0.00398812362781, 0.00403503310349, 0.00406829810979, 0.00409198942868, 0.00410836277454, 0.0041198306567, 0.00412794441995, 0.00413346398971, 0.00413715864266, 0.00413970729069, 0.0041413984228, 0.00414251331383, 0.00414349789867, 0.00414389409983, 0.00414406911746, 0.00414408142048, 0.00414403637657, 0.004143986692 ] }, spectrum_data_point_t { xystar: [-0.2184479981567377, -0.22593929649394454], uv: [1.9999999999999991, 0.0], spectrum: [ 0.025703212686, 0.0256958123579, 0.0256754714378, 0.0256307574533, 0.0255433019159, 0.0253755794002, 0.025079069654, 0.0245453008523, 0.0235953544541, 0.0219602062429, 0.0193528399602, 0.0157020705667, 0.01125698102, 0.00657370479699, 0.0024618841587, 4.91278504304e-18, 0.0, 9.89913688466e-19, 0.0, 9.56279823772e-18, 0.0, 1.07761566206e-17, 0.0, 0.0, 0.0, 7.27442750244e-18, 0.0, 0.0, 0.0, 0.0, 3.50560885187e-17, 1.61118947862e-17, 0.0, 0.0, 9.23262376455e-17, 1.24122622978e-16, 1.10157773429e-16, 6.82656157849e-17, 0.0, 0.0, 0.0, 0.0, 1.77980795897e-17, 0.0, 0.0, 5.39515326386e-18, 0.0, 1.60374413182e-17, 1.26174957953e-17, 0.0, 0.00017801467656, 0.00166387500998, 0.00367423897568, 0.00573129520175, 0.00758006831586, 0.00912366609602, 0.0103482843063, 0.0112851181961, 0.0119877454231, 0.0125087134888, 0.0128904161959, 0.0131640314008, 0.0133579452518, 0.0134954912424, 0.0135935314476, 0.0136630487119, 0.0137120620992, 0.0137469335741, 0.0137712316315, 0.0137888561752, 0.0138011448892, 0.013809269721, 0.0138151723777, 0.0138187163145, 0.013821109359, 0.013823076674, 0.0138240636589, 0.0138246033642, 0.0138249160415, 0.0138250323546, 0.0138253404443 ] }, spectrum_data_point_t { xystar: [-0.16383599861755327, -0.22593929649394454], uv: [3.0, 0.0], spectrum: [ 0.0273015839617, 0.0272909016632, 0.0272627783319, 0.0272015940763, 0.0270826032284, 0.0268558259227, 0.0264557392346, 0.025736895219, 0.024459762729, 0.0222800642963, 0.018865035797, 0.0142191998826, 0.00884394451225, 0.00370682062664, 0.000162135082284, 1.65416834651e-17, 0.0, 1.91531797173e-18, 4.72427753235e-18, 0.0, 0.0, 3.04313213571e-17, 1.47708145718e-16, 1.4051315342e-16, 6.58767975115e-17, 0.0, 1.18960958141e-17, 1.15255889085e-16, 1.94853795902e-17, 0.0, 8.20141019166e-17, 0.0, 7.14866463642e-17, 0.0, 1.5632540932e-17, 0.0, 0.0, 0.0, 8.67480062718e-17, 0.0, 3.2299737916e-17, 1.30821128916e-16, 2.3444717416e-17, 1.15555448214e-17, 8.47684298339e-18, 4.02980464871e-18, 0.0, 3.60264171961e-17, 0.0, 2.03455285038e-17, 0.000590829809805, 0.00329081860838, 0.00680772730724, 0.0103587914006, 0.0135302271332, 0.016168601135, 0.0182562261668, 0.0198507331248, 0.0210470817991, 0.0219334156928, 0.0225818078691, 0.0230462024419, 0.0233761741504, 0.0236110816736, 0.0237775682178, 0.0238950208618, 0.023977210895, 0.0240350583992, 0.0240759151433, 0.0241043225528, 0.0241245482236, 0.0241384367901, 0.0241488837023, 0.0241559834645, 0.0241605593132, 0.024163017671, 0.0241633909172, 0.0241633173015, 0.0241646004231, 0.0241653268645, 0.0241654545742 ] }, spectrum_data_point_t { xystar: [-0.10922399907836886, -0.22593929649394454], uv: [3.9999999999999996, 0.0], spectrum: [ 0.0292172476514, 0.0292027005593, 0.0291648304843, 0.0290818838268, 0.0289171082704, 0.0286001877055, 0.0280378658396, 0.0270325685501, 0.0252674921324, 0.0222951298899, 0.0177550175831, 0.0118621347373, 0.00564140013975, 0.000880464827564, 0.0, 1.57043123017e-17, 1.6981481375e-18, 4.22789382289e-18, 0.0, 0.0, 2.16794680928e-17, 3.00401396716e-16, 1.40402888474e-16, 3.01340296417e-16, 1.85195273035e-16, 0.0, 7.39734400528e-17, 2.1707461176e-17, 1.36248306826e-16, 0.0, 0.0, 0.0, 5.16258776681e-17, 1.0911751589e-16, 0.0, 0.0, 2.53016676934e-16, 6.72967183504e-17, 8.94333998676e-17, 1.96842991909e-16, 0.0, 4.50481408826e-17, 0.0, 2.73593181097e-17, 0.0, 0.0, 1.99208945611e-17, 2.18188898375e-17, 7.02509560632e-17, 1.85246672914e-17, 0.0, 0.00375570918052, 0.00918013002447, 0.0148501874848, 0.0200006195184, 0.0243293419706, 0.027777160142, 0.0304215752458, 0.0324069334709, 0.0338789644763, 0.0349594246855, 0.0357382450642, 0.036292085401, 0.0366848202854, 0.0369627375642, 0.0371601771328, 0.0372997698954, 0.0373982391711, 0.0374665364183, 0.0375132822485, 0.03754637491, 0.0375676160202, 0.0375830896076, 0.0375932316943, 0.0375989076926, 0.037603775793, 0.0376085150451, 0.0376112268996, 0.0376136199132, 0.0376140835345, 0.0376138615994 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, -0.22593929649394454], uv: [5.0, 0.0], spectrum: [ 0.0319947912671, 0.031972888111, 0.0319152568658, 0.0317897922402, 0.0315444972706, 0.0310746312805, 0.0302486329565, 0.0287810136446, 0.0262224685696, 0.021987133602, 0.0157758902291, 0.0083486497378, 0.00190729060743, 0.0, 9.76878844319e-18, 1.4986393037e-17, 0.0, 0.0, 1.61872055124e-16, 4.07318009966e-17, 5.36629917985e-17, 1.41458964372e-16, 4.25041849411e-16, 4.02050909309e-16, 1.77833338239e-16, 0.0, 0.0, 0.0, 6.86380086555e-16, 1.39376513197e-15, 0.0, 0.0, 0.0, 4.51089755673e-16, 2.03497527304e-16, 1.54646019859e-16, 0.0, 1.53567443985e-16, 5.43288144149e-17, 0.0, 0.0, 1.03660823127e-16, 2.13836674987e-16, 0.0, 4.42389221806e-17, 0.0, 7.46715833319e-17, 7.05983931598e-17, 0.0, 4.23684949094e-17, 0.0, 0.00287282413321, 0.00993014942054, 0.0182601682041, 0.0262270604094, 0.0331101202341, 0.0386847489274, 0.0430092686054, 0.0462871140152, 0.0487359656759, 0.0505383093944, 0.0518345635124, 0.0527559334459, 0.0534116340728, 0.0538789261771, 0.0542101932192, 0.0544441754576, 0.0546084283259, 0.0547231882103, 0.0548032329068, 0.0548589410642, 0.0548975595968, 0.0549239138902, 0.054942222879, 0.0549548412603, 0.0549633351862, 0.0549691836946, 0.0549732634794, 0.0549758439358, 0.0549772782421, 0.0549778984077 ] }, spectrum_data_point_t { xystar: [0.0, -0.22593929649394454], uv: [6.0, 0.0], spectrum: [ 0.0337362695207, 0.033705308509, 0.0336251723538, 0.0334531844717, 0.0331193435471, 0.0324812154317, 0.0313626944383, 0.0293893129373, 0.0259821353036, 0.0204589636198, 0.0127665325009, 0.00460238343076, 0.0, 0.0, 0.0, 4.20650140412e-18, 1.03527382291e-17, 2.64577265852e-17, 9.25797438713e-17, 0.0, 2.18413763557e-17, 0.0, 2.05484725171e-16, 0.0, 8.94262649139e-17, 6.78032255625e-16, 0.0, 0.0, 0.0, 1.04902065121e-15, 0.0, 0.0, 0.0, 0.0, 0.0, 2.77995325641e-16, 6.39398236268e-16, 2.53631080707e-16, 6.25087313364e-16, 6.56056301013e-17, 5.43916149375e-16, 0.0, 0.0, 0.0, 1.73048817161e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.000526513917857, 0.00918548463373, 0.0208260903052, 0.0324928378915, 0.0428135326211, 0.0512862826491, 0.0579153676656, 0.0629708317891, 0.0667648306009, 0.0695674330034, 0.0715886773735, 0.073026736204, 0.0740499144551, 0.0747790771392, 0.0752958034878, 0.0756606902402, 0.0759180521534, 0.0760989817872, 0.0762253916593, 0.0763136492823, 0.0763744388629, 0.0764160807809, 0.0764449691519, 0.0764646375783, 0.0764780046467, 0.0764869198009, 0.07649281644, 0.0764962580195, 0.0764982582092, 0.0764990008958 ] }, spectrum_data_point_t { xystar: [0.054611999539184386, -0.22593929649394454], uv: [6.999999999999999, 0.0], spectrum: [ 0.0370491213617, 0.037004149959, 0.0368868972596, 0.0366335576836, 0.0361428474736, 0.0352051748469, 0.033568022512, 0.0307046415968, 0.0258289749619, 0.0181566041349, 0.00828519947133, 0.0, 1.53653396174e-17, 3.16741138109e-17, 3.69846185468e-17, 3.07206552056e-18, 0.0, 8.90048364299e-17, 1.42228760564e-16, 0.0, 0.0, 8.04628132715e-16, 3.13650321597e-16, 0.0, 0.0, 2.08116080254e-15, 0.0, 3.89656550142e-16, 0.0, 0.0, 1.60741184505e-15, 2.70875538529e-16, 8.84032301654e-16, 0.0, 0.0, 0.0, 2.3496653485e-16, 0.0, 5.74876693894e-16, 9.72389342015e-16, 9.52322863699e-16, 0.0, 1.84349104556e-17, 0.0, 0.0, 0.0, 1.68507755794e-16, 0.0, 6.08222805419e-17, 0.0, 3.95636337354e-16, 0.0, 0.00635088634917, 0.0205951683775, 0.036752365582, 0.0518577483115, 0.0646384529837, 0.07482136171, 0.0826866403387, 0.0886437476255, 0.0930744866946, 0.0962854923306, 0.0985766256666, 0.100209959852, 0.101374703855, 0.102200019116, 0.102782706242, 0.103192387509, 0.103479347871, 0.103679721738, 0.103818911072, 0.1039151256, 0.103981482892, 0.104027090038, 0.104058853557, 0.104080846412, 0.104096017301, 0.104106200336, 0.104112476501, 0.104116343443, 0.104117862769 ] }, spectrum_data_point_t { xystar: [0.10922399907836883, -0.22593929649394454], uv: [8.0, 0.0], spectrum: [ 0.0368902744869, 0.0368311764427, 0.0366777048889, 0.0363467253374, 0.035708402853, 0.034490469283, 0.0323767859305, 0.0287332344481, 0.022662677267, 0.0135697877335, 0.00354554029151, 1.30773152593e-16, 5.50232492303e-17, 0.0, 2.08036560891e-17, 9.54413790121e-17, 0.0, 6.57732655147e-17, 4.55702302408e-18, 0.0, 0.0, 0.0, 0.0, 1.52610131497e-15, 7.68127598397e-16, 3.1262333067e-15, 1.671401742e-15, 0.0, 3.83081903592e-16, 0.0, 8.33499909446e-16, 0.0, 3.59755453296e-16, 2.12056514795e-15, 6.70993224202e-16, 9.92000637553e-16, 0.0, 0.0, 6.77800203463e-16, 0.0, 2.06611543271e-15, 0.0, 1.70897605594e-17, 0.0, 8.16479017786e-16, 3.09366292851e-16, 0.0, 0.0, 0.0, 1.02695967386e-15, 0.0, 0.0, 0.00082766716114, 0.0175268405932, 0.0394028724852, 0.0609734613779, 0.0797181612257, 0.0948858791009, 0.106726058786, 0.115761237854, 0.122518498379, 0.12743345782, 0.130946320139, 0.133452401185, 0.13523960252, 0.136505742022, 0.137399229712, 0.138027451439, 0.138467577476, 0.138774907132, 0.138988605889, 0.139136835604, 0.13923917277, 0.139309793909, 0.139358870555, 0.139393268018, 0.139416476003, 0.139432544604, 0.139442391365, 0.139448338262, 0.139450688188 ] }, spectrum_data_point_t { xystar: [0.1638359986175532, -0.22593929649394454], uv: [9.0, 0.0], spectrum: [ 0.0376545905526, 0.0375706477456, 0.0373530820132, 0.0368857493298, 0.035993830402, 0.0342994172816, 0.0313883735902, 0.0264818832246, 0.0186008746124, 0.00784310233523, 1.56174190013e-15, 1.49224846955e-16, 9.36567550174e-17, 5.68558706208e-16, 0.0, 0.0, 0.0, 2.05644240937e-16, 0.0, 0.0, 0.0, 5.85735861979e-16, 1.96049678331e-15, 0.0, 0.0, 0.0, 0.0, 7.46683287634e-15, 6.84582101646e-15, 0.0, 0.0, 0.0, 1.7550705372e-14, 6.3398082955e-16, 0.0, 0.0, 0.0, 2.86817664347e-15, 1.43672284961e-15, 5.68360808523e-15, 0.0, 0.0, 0.0, 7.92305345273e-16, 0.0, 1.02303322823e-15, 1.62569068191e-15, 3.79466967881e-16, 7.96620907545e-16, 1.95081046084e-16, 0.0, 3.00204424391e-16, 0.0, 0.0105393478538, 0.0363868311364, 0.0658479497484, 0.0931122030506, 0.115937677903, 0.134154871709, 0.148268814268, 0.158941591396, 0.166762934991, 0.172374320597, 0.176385140371, 0.179247298845, 0.1812752709, 0.182707124043, 0.183713843687, 0.184419374896, 0.184912516252, 0.185256539999, 0.185495022472, 0.185659747444, 0.18577292787, 0.185851039807, 0.185905212542, 0.185942085542, 0.185967296164, 0.185982914932, 0.185992780157, 0.185996762263 ] }, spectrum_data_point_t { xystar: [0.21844799815673765, -0.22593929649394454], uv: [10.0, 0.0], spectrum: [ 0.034665808729, 0.034559476579, 0.0342862436974, 0.0337026255603, 0.0326010258466, 0.0305164278605, 0.0269724021235, 0.021152685968, 0.0122112864061, 0.00150315541515, 0.0, 2.6589560777e-15, 0.0, 1.60467374511e-15, 7.28676221146e-15, 0.0, 8.31303920914e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 7.87494091259e-15, 0.0, 0.0, 0.0, 0.0, 0.0, 1.34778218395e-14, 3.81624185694e-16, 8.48792256724e-15, 1.4232738218e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 2.57433238906e-15, 1.86807910948e-15, 0.0, 0.0, 4.45921928876e-16, 0.0, 0.0, 1.10482105732e-15, 1.44595029353e-15, 0.0, 0.0, 1.08601118934e-15, 2.60261014912e-15, 0.0, 4.30941871895e-15, 3.19037661838e-15, 0.00127700838243, 0.0308826120767, 0.0692949175984, 0.106532631729, 0.138434836145, 0.164265518471, 0.184469345282, 0.199851701892, 0.211174539744, 0.219317070603, 0.225142288622, 0.229301016522, 0.232248712346, 0.234329947954, 0.235794023955, 0.236820629944, 0.237539755271, 0.238039289358, 0.238386628905, 0.238625310364, 0.238787412261, 0.238902012036, 0.238980896507, 0.239036086903, 0.239074586444, 0.239096715389, 0.239112697578, 0.239118807577 ] }, spectrum_data_point_t { xystar: [0.2730599976959221, -0.22593929649394454], uv: [11.0, 0.0], spectrum: [ 0.026622521527, 0.0264912261276, 0.0261578057518, 0.0254529121405, 0.0241594371452, 0.0217390020646, 0.017752842583, 0.011728629248, 0.00389292549461, 1.90772987891e-15, 0.0, 0.0, 0.0, 0.0, 2.26098780708e-14, 6.14914267782e-16, 0.0, 0.0, 5.45391070788e-15, 4.59497071466e-15, 0.0, 1.88391341712e-14, 6.36089223653e-15, 1.43083445864e-14, 0.0, 5.45291480142e-15, 0.0, 5.39111472265e-15, 0.0, 0.0, 0.0, 1.15995672037e-14, 0.0, 2.57001523924e-15, 2.16730327545e-14, 0.0, 7.87503366771e-15, 1.30896553583e-14, 3.37987402433e-15, 0.0, 5.14764764659e-15, 0.0, 0.0, 0.0, 1.34483723995e-15, 0.0, 4.73527625937e-16, 0.0, 4.63983547971e-16, 1.18431240908e-15, 5.90099797345e-15, 3.55253585192e-15, 7.5467478642e-15, 0.0, 0.0172179777888, 0.0619424979483, 0.112416189458, 0.158586433302, 0.19741889671, 0.228537471812, 0.252630721358, 0.270560614202, 0.283523078009, 0.292821209495, 0.299465568261, 0.304173621676, 0.307498378409, 0.309837912709, 0.311479295109, 0.312628481015, 0.313429671212, 0.313984894403, 0.314367857731, 0.314630402115, 0.314813455872, 0.31494164252, 0.315031841959, 0.315094810867, 0.3151337249, 0.315159022787, 0.315168914674 ] }, spectrum_data_point_t { xystar: [0.32767199723510654, -0.22593929649394454], uv: [12.0, 0.0], spectrum: [ 0.00813094897749, 0.00802437302395, 0.00776438303151, 0.00723588848047, 0.00634729938504, 0.00473860672718, 0.00237392534919, 1.22370313877e-15, 0.0, 0.0, 0.0, 0.0, 1.04774520779e-15, 0.0, 3.08795470432e-15, 1.25389829762e-14, 1.02987703315e-14, 0.0, 1.1204606546e-15, 1.24574397704e-14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.79280167586e-15, 0.0, 0.0, 3.22221180153e-14, 0.0, 0.0, 2.92350630152e-14, 3.57764356753e-15, 0.0, 1.20422318725e-14, 0.0, 3.68533388834e-15, 0.0, 0.0, 0.0, 2.99102352474e-15, 1.30776870422e-14, 4.16255456584e-15, 1.38005915147e-15, 0.0, 2.99699137135e-15, 0.0, 0.0, 5.17263166272e-17, 0.0, 0.0, 0.0, 0.0, 0.00141517143732, 0.0521087392278, 0.116784137086, 0.178583733526, 0.231785220136, 0.275022768402, 0.308815996415, 0.334116183907, 0.352463161006, 0.365642909281, 0.375065324925, 0.38174109052, 0.386455597068, 0.389773836843, 0.392102007165, 0.393733062495, 0.394870597351, 0.395658546784, 0.39620342768, 0.396576433186, 0.396836852782, 0.397018854809, 0.397147391827, 0.397238722798, 0.39729439021, 0.397330819675, 0.397345809825 ] }, spectrum_data_point_t { xystar: [-0.2730599976959221, -0.1694544723704584], uv: [1.0, 1.0], spectrum: [ 0.0091653433919, 0.00916498698908, 0.00916469134351, 0.0091634582558, 0.00916100358378, 0.00915667695405, 0.00914836144249, 0.00913288486691, 0.00910466758446, 0.00905390137782, 0.00896534153466, 0.00882926798736, 0.0086360622584, 0.00838305090033, 0.00807033414915, 0.00769922813107, 0.0072729224796, 0.00679476685394, 0.00627242780753, 0.00571624280945, 0.00513759245271, 0.00454835849645, 0.00395711147733, 0.00337464154654, 0.00280749740456, 0.00226682876686, 0.00176310907453, 0.00130547471702, 0.000905779759447, 0.000571855092001, 0.000311208875046, 0.000127002966088, 2.27290703342e-5, 0.0, 4.78273447194e-20, 2.08894233235e-20, 0.0, 0.0, 0.0, 4.22264438881e-21, 2.13855148983e-20, 9.51864157305e-21, 1.19983930184e-5, 4.60782307405e-5, 9.53880869555e-5, 0.000152298212592, 0.000211118272231, 0.000269189597303, 0.000323096365829, 0.000370094033468, 0.000408679255951, 0.00044053743596, 0.000465518193849, 0.000484648753775, 0.000500103078853, 0.000512722774307, 0.000521401761115, 0.000527616921397, 0.000532543346179, 0.000536659517574, 0.000539778041574, 0.000541540251261, 0.000542524937145, 0.000543291291334, 0.000543586141659, 0.000543507179099, 0.000542980324501, 0.00054312233015, 0.000543037271523, 0.000542917430232, 0.000542865224303, 0.000542777005272, 0.000542616042571, 0.000542808861172, 0.000543012894916, 0.00054314869738, 0.00054318880014, 0.000543195645874, 0.000542803873351, 0.000542632005164, 0.000542519585918 ] }, spectrum_data_point_t { xystar: [-0.2184479981567377, -0.1694544723704584], uv: [1.9999999999999991, 1.0], spectrum: [ 0.00839492804249, 0.00839499038748, 0.00839468362032, 0.00839368052039, 0.00839127535537, 0.00838666836435, 0.00837748085054, 0.00836141803414, 0.00833258711089, 0.00828324081127, 0.00819776042453, 0.00806692381432, 0.00788190770521, 0.00764092973918, 0.00734291154708, 0.00699038325809, 0.00658437708841, 0.00613143437739, 0.00563855984548, 0.0051140905654, 0.00456996990388, 0.00401793568637, 0.00346663658146, 0.00292618641689, 0.00240268838536, 0.00190810043077, 0.00144920753665, 0.00103909243282, 0.000686575774405, 0.00040214387125, 0.000189962126253, 5.50465245159e-5, 0.0, 8.85573359543e-23, 1.79084072014e-20, 0.0, 0.0, 4.14777285739e-21, 4.54079455467e-5, 0.000137448200226, 0.000265371643783, 0.000420176813866, 0.000590957746775, 0.000769874255758, 0.000948583809085, 0.00111984232434, 0.00127902828812, 0.00142175246388, 0.00154554078944, 0.00164945007676, 0.00173568080995, 0.00180526058114, 0.00186065007927, 0.00190420681578, 0.00193641969961, 0.00196031899743, 0.00197813589321, 0.00199052602258, 0.00199898312215, 0.00200530138527, 0.00200999558568, 0.00201261850619, 0.00201418704115, 0.00201526559776, 0.00201612026596, 0.00201705295963, 0.00201683028133, 0.00201685125805, 0.00201702650973, 0.00201676165219, 0.0020164595663, 0.00201633912206, 0.00201599119367, 0.0020155289953, 0.00201528129426, 0.00201538017063, 0.00201580106315, 0.00201537016576, 0.00201530490518, 0.00201554875076, 0.00201565565895 ] }, spectrum_data_point_t { xystar: [-0.16383599861755327, -0.1694544723704584], uv: [3.0, 1.0], spectrum: [ 0.00767811432245, 0.00767775377923, 0.00767714311449, 0.00767546684836, 0.0076722593789, 0.00766780138506, 0.00766150430755, 0.00764828248498, 0.00762166738982, 0.0075738938148, 0.00749056138353, 0.00736093257103, 0.0071783716266, 0.0069374300444, 0.00664018978972, 0.0062895737139, 0.00588711608196, 0.00544003627112, 0.0049551008379, 0.00444392072753, 0.00391644861239, 0.00338467794526, 0.00286021683149, 0.0023497886131, 0.00186216964569, 0.00140699594211, 0.0009980116798, 0.000645114334099, 0.000360137326434, 0.000154606351326, 3.40069959193e-5, 0.0, 0.0, 0.0, 0.0, 4.11831751021e-20, 2.3293744841e-5, 0.00011774364124, 0.000269648291546, 0.000471126901272, 0.000708688760511, 0.000971352220509, 0.0012493322688, 0.00152724310317, 0.00179738511587, 0.00204985611134, 0.00227993169894, 0.00248244222316, 0.00265779981318, 0.00280613873506, 0.00292867383738, 0.00302734024171, 0.00310528119219, 0.0031664478888, 0.00321279685767, 0.00324754440086, 0.00327383073593, 0.00329186086353, 0.00330535947096, 0.00331425243951, 0.00332027332125, 0.00332467981801, 0.00332762575118, 0.00332924644811, 0.00332981654218, 0.00333080994195, 0.00333221998209, 0.00333308507448, 0.00333387213126, 0.00333453735507, 0.00333510572326, 0.00333528664867, 0.00333522087215, 0.00333538115091, 0.00333545507987, 0.00333474934044, 0.00333418806291, 0.00333356184059, 0.00333272153693, 0.00333151737397, 0.00333131345192 ] }, spectrum_data_point_t { xystar: [-0.10922399907836886, -0.1694544723704584], uv: [3.9999999999999996, 1.0], spectrum: [ 0.00701596130472, 0.00701615415616, 0.00701520291077, 0.00701365007873, 0.00701151900927, 0.00700656018327, 0.00699769732651, 0.00698236975156, 0.00695331835866, 0.00690170977653, 0.00681519504633, 0.00668042997879, 0.00649214546345, 0.00624638748619, 0.00594293025738, 0.00558583732045, 0.00517938439134, 0.0047301947648, 0.0042468853195, 0.00373756607593, 0.00321703724609, 0.00269892143381, 0.00219307531026, 0.00171064759491, 0.00126169830645, 0.000859042307779, 0.000517381398865, 0.000250823796011, 7.42390516803e-5, 2.88024063323e-20, 0.0, 0.0, 0.0, 0.0, 1.80661823869e-20, 6.09936392273e-21, 7.11254531393e-5, 0.000228904242077, 0.000462607717281, 0.00075660552303, 0.00109667030956, 0.0014663572739, 0.00185211946331, 0.00223874346944, 0.00261182802274, 0.00296124145658, 0.00327807878431, 0.00355861454368, 0.00379977853116, 0.00400309245177, 0.00417116137415, 0.00430510770107, 0.00441165167943, 0.00449322998461, 0.00455505130234, 0.00460122730021, 0.00463531798527, 0.00466055430637, 0.0046781403112, 0.0046901410586, 0.00469912334416, 0.00470527245142, 0.00470990760806, 0.00471264051839, 0.00471429030676, 0.00471528393711, 0.00471681540732, 0.00471732577771, 0.00471748287811, 0.00471813591174, 0.00471780920218, 0.00471799963079, 0.00471819929994, 0.004718295843, 0.00471788677538, 0.0047178142311, 0.00471782325458, 0.00471805237195, 0.00471782590236, 0.00471758618461, 0.00471732328234 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, -0.1694544723704584], uv: [5.0, 1.0], spectrum: [ 0.0063983829998, 0.00639824022135, 0.00639814664179, 0.00639703533916, 0.00639498579412, 0.00638900730293, 0.00637881551576, 0.00636117588553, 0.00632917364181, 0.00627261703232, 0.00617735237015, 0.00603133866201, 0.00582926242079, 0.00556626221656, 0.0052453337476, 0.00487084602802, 0.00444820946359, 0.00398421524471, 0.00348948610414, 0.00297830556106, 0.00246423106059, 0.00196192907654, 0.0014849937282, 0.00104671893395, 0.000661719420598, 0.00034672961837, 0.00011904303773, 0.0, 0.0, 6.4193715954e-21, 4.66917717797e-20, 0.0, 5.5746165655e-20, 0.0, 0.0, 3.01751628849e-20, 6.35453725244e-5, 0.000250440824636, 0.000544541567449, 0.000926112836636, 0.00137352044499, 0.00186545218134, 0.00238059634178, 0.00289797502087, 0.00339973741487, 0.00387211010452, 0.00430143230946, 0.00468237626283, 0.00500999466586, 0.00528371224713, 0.00551021407344, 0.00569394345884, 0.00583914504863, 0.00595321839944, 0.00604004769673, 0.00610332636849, 0.00614988380176, 0.00618322784567, 0.00620707436507, 0.00622507508064, 0.00623823358947, 0.00624734775927, 0.00625303500551, 0.00625757555353, 0.00626049018215, 0.0062625474724, 0.00626421788803, 0.00626468044102, 0.00626495370045, 0.0062647024066, 0.00626408139647, 0.00626403343904, 0.00626391572191, 0.00626362994517, 0.00626319260155, 0.0062633416368, 0.0062640053027, 0.00626483076247, 0.00626538367444, 0.00626597157241, 0.00626609233573 ] }, spectrum_data_point_t { xystar: [0.0, -0.1694544723704584], uv: [6.0, 1.0], spectrum: [ 0.00574815383247, 0.00574711318398, 0.00574654793152, 0.00574416020215, 0.0057405919086, 0.00573435004394, 0.00572410290025, 0.00570378811122, 0.00566951088376, 0.00561081453014, 0.00551005456041, 0.00535716638995, 0.00514574715664, 0.00486996203721, 0.00453529318348, 0.00414597230657, 0.00370809226859, 0.00323519610087, 0.0027373241048, 0.00223081867748, 0.0017356432862, 0.00126739887037, 0.000844719587227, 0.000485691282014, 0.000209115970882, 3.80557806793e-5, 0.0, 0.0, 2.9854374757e-20, 1.18164771316e-19, 0.0, 4.94199797966e-20, 8.73204412191e-20, 5.92009699475e-20, 2.212439525e-20, 3.94875394705e-20, 0.0, 0.000153418225016, 0.000470814227253, 0.000923055466247, 0.00148281896968, 0.00211475708442, 0.00278790091735, 0.00347610670683, 0.00414999743195, 0.00478505750385, 0.00536628115509, 0.00588437352019, 0.00633158984448, 0.00670869251448, 0.00702125802586, 0.00727308104844, 0.00747297468173, 0.00762773580549, 0.00774498557903, 0.0078334245293, 0.00789919729784, 0.00794672474799, 0.00797941404259, 0.00800407830442, 0.00802011871726, 0.00803078717453, 0.00803816695784, 0.00804369722261, 0.0080470622045, 0.00804812446762, 0.00804959970669, 0.00805148048789, 0.00805249249339, 0.0080530805998, 0.00805431642253, 0.00805491575006, 0.00805560812885, 0.00805658755203, 0.00805761492105, 0.00805836525355, 0.0080588678243, 0.00805921722062, 0.00806026167895, 0.00806121051464, 0.00806114439675 ] }, spectrum_data_point_t { xystar: [0.054611999539184386, -0.1694544723704584], uv: [6.999999999999999, 1.0], spectrum: [ 0.00508160879249, 0.00508183030739, 0.00508015531729, 0.00507808188463, 0.00507481215783, 0.00506868702619, 0.00505858993497, 0.00503890282052, 0.00500360359643, 0.0049408680199, 0.00483448298606, 0.00467110726279, 0.00444365189686, 0.00415143121523, 0.00379819582199, 0.00339124237903, 0.00294184807132, 0.0024632382464, 0.00197130411849, 0.00148832180799, 0.00103552357841, 0.000636357494857, 0.000314749653172, 9.33592760653e-5, 0.0, 8.44354950505e-22, 0.0, 0.0, 6.06592675176e-20, 1.37237159172e-20, 1.23853500272e-19, 1.09508371483e-19, 9.52242884934e-20, 0.0, 0.0, 2.9585828203e-20, 0.0, 2.17588212669e-5, 0.000296697194983, 0.000783737662041, 0.00143957978926, 0.00221725678764, 0.00307187310033, 0.00395933084543, 0.00483854732085, 0.00567774858431, 0.00645186384277, 0.00714397512038, 0.0077457578688, 0.00825518509633, 0.008676187242, 0.00901741662513, 0.00928849387571, 0.00949838890916, 0.00965800908498, 0.00977747409673, 0.00986514521251, 0.00992869553314, 0.00997479440317, 0.0100066665578, 0.0100282914455, 0.0100440070232, 0.0100553558932, 0.0100629796566, 0.0100685526281, 0.0100723663023, 0.0100748482899, 0.0100770992771, 0.0100793677269, 0.0100808864307, 0.01008184652, 0.0100827169856, 0.0100833819215, 0.0100833731468, 0.0100834147128, 0.010083659439, 0.0100838858128, 0.0100841550653, 0.01008423477, 0.0100841416358, 0.0100838509531 ] }, spectrum_data_point_t { xystar: [0.10922399907836883, -0.1694544723704584], uv: [8.0, 1.0], spectrum: [ 0.00439659935982, 0.00439572751779, 0.00439437888518, 0.00439243803779, 0.00438872060303, 0.00438189564819, 0.00437011494404, 0.00434769869393, 0.00430714098325, 0.00423716318288, 0.00412069999124, 0.00394358643042, 0.0036995670256, 0.00339042976313, 0.00302149477749, 0.00260382061543, 0.0021535385106, 0.00168633340098, 0.00122459340136, 0.000795725910538, 0.000428888518445, 0.000154446633593, 1.51869202371e-6, 7.99497423011e-20, 0.0, 0.0, 1.28991729604e-20, 1.1214553828e-19, 0.0, 1.11033432409e-19, 0.0, 1.12490572532e-19, 0.0, 0.0, 5.69632689538e-20, 4.84539192727e-20, 7.81041591058e-20, 0.0, 0.000100894785792, 0.000536865313025, 0.00124202932118, 0.0021499297251, 0.0031930646226, 0.00430765490662, 0.00543435421855, 0.00652462129938, 0.00754004596388, 0.00845383204517, 0.00925156920511, 0.00992793350983, 0.0104888188705, 0.0109435910911, 0.0113048089352, 0.0115853126805, 0.0117981732322, 0.0119571645275, 0.0120745323223, 0.0121595010308, 0.0122207722825, 0.0122651282019, 0.0122964475346, 0.0123182533916, 0.0123327512964, 0.0123431166505, 0.0123503273104, 0.0123557200631, 0.0123601109927, 0.0123629523273, 0.0123651897024, 0.0123666200533, 0.0123675240875, 0.0123682704381, 0.0123690980221, 0.012369207189, 0.0123694695014, 0.0123697816943, 0.0123698369295, 0.0123696653438, 0.0123699474002, 0.0123698922088, 0.0123699916741 ] }, spectrum_data_point_t { xystar: [0.1638359986175532, -0.1694544723704584], uv: [9.0, 1.0], spectrum: [ 0.00360493902558, 0.00360521307732, 0.00360506106578, 0.00360370835813, 0.00360054054931, 0.0035941163166, 0.00358238570302, 0.00356080084339, 0.00351964439419, 0.0034446315539, 0.0033195728984, 0.00313336720427, 0.00288150066021, 0.00256428729402, 0.00219351252505, 0.00178646617367, 0.00136156976967, 0.000944044427957, 0.000562478701042, 0.000252144135337, 5.16374996654e-5, 0.0, 0.0, 8.01131136633e-20, 0.0, 0.0, 0.0, 1.61499890876e-19, 0.0, 0.0, 2.79156887484e-19, 2.79507129142e-19, 6.98141267987e-19, 0.0, 0.0, 0.0, 2.80992890826e-19, 0.0, 0.0, 0.000249212200087, 0.000921346610147, 0.00191827757901, 0.00314190203944, 0.00450055303035, 0.00590858024271, 0.00729421609238, 0.00860000992484, 0.00978647457442, 0.0108298112598, 0.0117205941288, 0.0124626885491, 0.0130659508819, 0.0135448598969, 0.0139170955653, 0.0142006456007, 0.0144119354121, 0.0145658619418, 0.0146768161242, 0.0147573648936, 0.0148154847328, 0.0148571483909, 0.01488722853, 0.0149092060423, 0.0149252082663, 0.0149365468809, 0.0149440248419, 0.0149490795296, 0.0149529490277, 0.0149547964257, 0.014955329918, 0.0149554700491, 0.0149560229653, 0.0149562588585, 0.0149563683591, 0.0149566257204, 0.0149571567335, 0.0149582771645, 0.0149592873147, 0.0149598225096, 0.0149602200942, 0.0149604291109 ] }, spectrum_data_point_t { xystar: [0.21844799815673765, -0.1694544723704584], uv: [10.0, 1.0], spectrum: [ 0.0026796856922, 0.00267946889169, 0.00267897840498, 0.00267755073063, 0.00267403906866, 0.00266644466302, 0.0026525481375, 0.00262768883646, 0.0025848838816, 0.00251008187093, 0.00238720399438, 0.00220445839216, 0.00195895232804, 0.00165907150637, 0.0013190318517, 0.000961608195904, 0.000614835572719, 0.000312005987011, 9.2133858297e-5, 0.0, 0.0, 0.0, 0.0, 0.0, 6.98289250013e-20, 1.75972233435e-19, 0.0, 0.0, 4.08407281595e-19, 2.74941590235e-19, 7.68295468369e-19, 0.0, 0.0, 0.0, 0.0, 2.14268501292e-19, 3.36778764522e-19, 5.23784744878e-20, 7.3355919185e-20, 0.0, 0.000523546674898, 0.00154641251956, 0.0029308724895, 0.00454335258808, 0.00626272603527, 0.00798619486697, 0.00963055848517, 0.0111371920679, 0.0124700587701, 0.0136127126513, 0.0145673472416, 0.0153466853377, 0.0159675827123, 0.0164512804688, 0.0168197815852, 0.017095702706, 0.0172992444383, 0.0174473122575, 0.0175543757826, 0.0176312319831, 0.017686383902, 0.017724860799, 0.0177520517818, 0.0177711203571, 0.0177846790961, 0.0177934891329, 0.017800182937, 0.0178041077657, 0.0178073190917, 0.01780948718, 0.0178107807746, 0.0178117734908, 0.0178127791518, 0.0178132074325, 0.0178135346059, 0.0178140085655, 0.017814437519, 0.0178150568949, 0.0178157925943, 0.0178162766986, 0.0178166354888 ] }, spectrum_data_point_t { xystar: [0.2730599976959221, -0.1694544723704584], uv: [11.0, 1.0], spectrum: [ 0.00150001049456, 0.00149922715985, 0.00149874751096, 0.00149715381062, 0.00149380433665, 0.00148710488357, 0.00147402718844, 0.00145296303512, 0.0014142068518, 0.0013464484812, 0.00123950985326, 0.00108453350833, 0.000884357078099, 0.000654970529247, 0.000417409140197, 0.000201799313398, 4.77128434536e-5, 1.69897632368e-19, 0.0, 9.13567593428e-20, 0.0, 3.34227125935e-19, 1.39671230268e-19, 0.0, 5.04428015115e-19, 3.16488164263e-19, 5.20278671406e-20, 6.86421490334e-19, 0.0, 7.90541007511e-21, 0.0, 2.19264683817e-20, 1.9625747786e-19, 7.22720043988e-20, 6.64502163632e-19, 2.1386511653e-18, 0.0, 0.0, 0.0, 2.78804996031e-19, 0.000140383624207, 0.00104340098905, 0.00251361744502, 0.0043617154796, 0.0064131265141, 0.00852259516693, 0.0105688973614, 0.0124647711012, 0.014155373332, 0.0156138787943, 0.0168382044585, 0.0178414290057, 0.0186431260282, 0.0192688366489, 0.0197462441196, 0.0201039014816, 0.0203681417731, 0.0205608946265, 0.0206998206181, 0.0207999559632, 0.0208712043532, 0.0209210775364, 0.0209565110781, 0.0209815313598, 0.0209991480071, 0.0210112718921, 0.0210201806193, 0.0210263021828, 0.0210302695507, 0.0210334298039, 0.0210356295413, 0.0210371800133, 0.0210383472363, 0.0210390390254, 0.0210399758961, 0.0210406611907, 0.0210410230866, 0.0210412931925, 0.0210411720895, 0.0210409118326, 0.0210406700292 ] }, spectrum_data_point_t { xystar: [-0.2730599976959221, -0.11296964824697227], uv: [1.0, 2.0], spectrum: [ 0.00657459797733, 0.00657497516789, 0.00657523969135, 0.00657625161468, 0.00657890910456, 0.00658387150984, 0.0065916897665, 0.00660532749878, 0.00662911207909, 0.00666943092088, 0.00673444565286, 0.00683151735784, 0.00695439640797, 0.00710063838987, 0.00725903660535, 0.00741506184612, 0.00754991728178, 0.00764301149465, 0.00767418301077, 0.00762683998849, 0.00748885432828, 0.00725469937676, 0.00691987579626, 0.00648429199114, 0.00594714633425, 0.0053119729627, 0.00458005900719, 0.00376928407591, 0.00290892315132, 0.00204584578196, 0.00124285467109, 0.000575632029241, 0.000131717403769, 2.05994803339e-19, 2.65669565665e-19, 4.56648452889e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 1.15855745367e-18, 0.0, 0.0, 5.57697449056e-19, 1.36398480437e-18, 0.0, 7.16300867474e-19, 0.0, 8.98488950143e-19, 3.24649313193e-19, 2.31449584162e-19, 4.39683047971e-19, 9.04141152178e-19, 1.5961855464e-19, 2.51366148605e-19, 0.0, 0.0, 1.90454934407e-19, 2.82972234862e-19, 3.04523064889e-19, 5.75478082499e-20, 1.51610204509e-19, 1.13889121868e-19, 1.43480022427e-19, 1.458654729e-19, 1.75104416305e-19, 0.0, 3.0907113298e-19, 5.29395592034e-22, 0.0, 2.70909405429e-20, 0.0, 0.0, 1.18478733497e-19, 0.0, 0.0, 0.0, 2.27664984616e-20, 5.15643724855e-8, 4.92226953473e-8 ] }, spectrum_data_point_t { xystar: [-0.2184479981567377, -0.11296964824697227], uv: [1.9999999999999991, 2.0], spectrum: [ 0.0075068708971, 0.00750633553593, 0.00750629299254, 0.00750549452998, 0.00750324430209, 0.00750023141704, 0.00749548483957, 0.00748474792303, 0.00746675898835, 0.00743513618121, 0.00738059222107, 0.00729920526366, 0.00718338555975, 0.00703218905267, 0.00684403495748, 0.00661968360696, 0.00636139740633, 0.0060702606978, 0.00575038945691, 0.00540677859821, 0.00504746041909, 0.00467721361608, 0.00430050982905, 0.00392277121769, 0.00354720221626, 0.00318012815255, 0.00282401024935, 0.00248338222285, 0.00216563104152, 0.00187208063118, 0.00160622478472, 0.00136972190724, 0.00115942209385, 0.000981168360501, 0.000834669342213, 0.000715892595743, 0.000625704619285, 0.000561135026679, 0.000518384118201, 0.000497154132093, 0.00049485974625, 0.00050603684916, 0.000529468261048, 0.000559895999445, 0.000594729220336, 0.00063145181566, 0.00066699407372, 0.000700058730272, 0.000729740218875, 0.000755102633028, 0.000775648134965, 0.000792860373073, 0.000805555706541, 0.000814418854392, 0.000820995702936, 0.00082439800314, 0.000826939512146, 0.000829399497687, 0.000830852878206, 0.000831597666629, 0.000831875712611, 0.000832234222349, 0.000832344261244, 0.0008322928163, 0.000832881013893, 0.000832670033687, 0.000832377529489, 0.000832190817177, 0.000831500810692, 0.00083094359621, 0.000830603541969, 0.000830218188216, 0.000829829238413, 0.000829874665364, 0.000829540489098, 0.000829529056337, 0.000829974337199, 0.000830068936063, 0.000829918521374, 0.000830124203625, 0.000830172388724 ] }, spectrum_data_point_t { xystar: [-0.16383599861755327, -0.11296964824697227], uv: [3.0, 2.0], spectrum: [ 0.00680057676561, 0.00680006916227, 0.00679932392527, 0.00679836628328, 0.00679709007247, 0.00679337669888, 0.0067874378209, 0.00677662332176, 0.00675747597901, 0.00672496028737, 0.00667030408209, 0.00658924828157, 0.00647484420004, 0.0063258441237, 0.00614107303534, 0.00592108418806, 0.00566896359807, 0.00538623720302, 0.00507683496944, 0.00474752610753, 0.0044045560556, 0.00405160162348, 0.00369570131621, 0.00334223617761, 0.00299466137712, 0.00265675491507, 0.00233707258136, 0.00203937640733, 0.00176886936566, 0.00152922443576, 0.00132264823861, 0.00115043678091, 0.00101589290025, 0.000916193760366, 0.000849887778772, 0.000816855706273, 0.000812952759201, 0.000837766191215, 0.00088699168548, 0.000956150343635, 0.00104016502775, 0.00113520891918, 0.001234776515, 0.00133790095601, 0.00144014593183, 0.00153686158816, 0.00162551452141, 0.0017036995962, 0.00177150227938, 0.00182849899708, 0.00187618798137, 0.00191512950153, 0.0019454369797, 0.00196575438814, 0.00197966453347, 0.00199025973617, 0.00199801497935, 0.00200438416756, 0.00200773772291, 0.00201039831049, 0.00201347085389, 0.00201603207422, 0.00201727478225, 0.00201839753984, 0.00201878787023, 0.00201898434987, 0.00201880917913, 0.0020177800029, 0.00201673566427, 0.00201647198415, 0.00201654820434, 0.002016366092, 0.00201598382868, 0.00201594238778, 0.00201573419244, 0.00201633788366, 0.00201652356978, 0.00201670439058, 0.00201653167254, 0.00201704228868, 0.0020171706637 ] }, spectrum_data_point_t { xystar: [-0.10922399907836886, -0.11296964824697227], uv: [3.9999999999999996, 2.0], spectrum: [ 0.00607402140199, 0.00607419025768, 0.00607365995433, 0.00607294056836, 0.00607152803151, 0.006069072098, 0.00606473659214, 0.00605646981441, 0.00603978133068, 0.00600920749828, 0.00595847522352, 0.00587930259179, 0.00576671952365, 0.00562020927988, 0.00543840685687, 0.00522373954771, 0.00497821993875, 0.00470423756951, 0.00440578037004, 0.00408934146815, 0.00376090462498, 0.00342671058458, 0.00309336940951, 0.0027660309595, 0.00244788472683, 0.00214502297595, 0.00186238416835, 0.00160485920406, 0.0013800648237, 0.0011925066083, 0.00104347329559, 0.000936131666758, 0.000869496467266, 0.000843031301802, 0.000857230609298, 0.00090804839954, 0.000993212254669, 0.00110836616662, 0.00124791618879, 0.00140778886299, 0.00158070299557, 0.00176160688756, 0.00194469127098, 0.0021231508127, 0.00229229344043, 0.00244846927282, 0.00258844788389, 0.00271140032767, 0.00281676014768, 0.00290370091398, 0.0029752637467, 0.00303314043032, 0.0030791881438, 0.00311543235958, 0.00314202239332, 0.00316225685483, 0.00317657406379, 0.00318640073083, 0.00319394346287, 0.00319882263424, 0.00320232498161, 0.00320444138614, 0.00320620425667, 0.00320764682252, 0.00320866876492, 0.00320972017638, 0.00321099509007, 0.00321139379773, 0.00321155291438, 0.00321154215497, 0.00321130137532, 0.00321114959025, 0.00321061866201, 0.00321032667814, 0.00320989570491, 0.0032094755909, 0.00320944726689, 0.00320928202574, 0.00320903090043, 0.00320944056757, 0.00320948643808 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, -0.11296964824697227], uv: [5.0, 2.0], spectrum: [ 0.00534955144175, 0.00534930395637, 0.00534882900068, 0.00534796544221, 0.00534703648261, 0.00534443153644, 0.00533982098548, 0.00533167188887, 0.00531576530997, 0.00528725607651, 0.00523811264196, 0.00516156348388, 0.00505402575999, 0.00491278956136, 0.00473816051605, 0.00453120816016, 0.00429390018079, 0.00402907066297, 0.00374117612319, 0.00343641035811, 0.00312202121628, 0.0028058678798, 0.00249319043783, 0.00218802531598, 0.00189610271641, 0.00162435800179, 0.00137762522538, 0.00116366823822, 0.000986453256786, 0.000850938945514, 0.000762417192113, 0.000719869897221, 0.000725091695971, 0.000777821139175, 0.000872769029309, 0.0010079473664, 0.001180650069, 0.00138452512878, 0.00161344963566, 0.00186049860275, 0.00211914911843, 0.00238267429869, 0.0026442643415, 0.00289656856916, 0.003133245178, 0.00335131440556, 0.00354611689231, 0.00371718151295, 0.00386417531173, 0.00398585203263, 0.0040851574681, 0.00416447484352, 0.00422708774504, 0.00427624002387, 0.00431248100506, 0.00433976832185, 0.00435944124968, 0.00437343217009, 0.00438309344167, 0.00438999242829, 0.00439462787592, 0.00439829165636, 0.00440094364871, 0.00440291918815, 0.00440432127641, 0.00440533008395, 0.00440594432052, 0.0044063561076, 0.00440695389436, 0.0044071895311, 0.00440730632018, 0.0044072437867, 0.00440687541419, 0.00440673200816, 0.00440652484214, 0.00440619992355, 0.00440628042674, 0.00440607883061, 0.00440572293917, 0.00440540393501, 0.00440525305976 ] }, spectrum_data_point_t { xystar: [0.0, -0.11296964824697227], uv: [6.0, 2.0], spectrum: [ 0.00464276374014, 0.00464263592165, 0.00464187405482, 0.00464063680532, 0.00463904202136, 0.00463608074625, 0.00463036219555, 0.00461984409946, 0.00460218076812, 0.00457188213153, 0.00452211522235, 0.00444778301325, 0.00434264734067, 0.00420278580249, 0.00403251573238, 0.00383218733209, 0.00360156838377, 0.00334701195383, 0.00307262204116, 0.00278307721742, 0.00248527830985, 0.00218851066491, 0.00189602917645, 0.00161577182805, 0.00135271977937, 0.00111265181201, 0.000902164684452, 0.0007286154272, 0.000597991208932, 0.000515330435303, 0.000483616087781, 0.000505847949909, 0.000580316814711, 0.000705889191258, 0.000880864496031, 0.00110050525808, 0.00135970708924, 0.00165148658752, 0.00197117991215, 0.00230909615231, 0.00265780568366, 0.00300771689321, 0.00335017495716, 0.00367747050817, 0.00398270661293, 0.00426269380635, 0.00451132507313, 0.00472775173022, 0.00491139290682, 0.00506462869955, 0.00519058405364, 0.00529113372622, 0.00536991235657, 0.00543027785674, 0.00547583326855, 0.00550988855591, 0.00553584942373, 0.0055541988507, 0.00556747057935, 0.00557674634602, 0.00558281667906, 0.00558725256673, 0.00559037627113, 0.00559198510155, 0.00559282275304, 0.00559332673652, 0.00559332646161, 0.00559355835089, 0.00559382185818, 0.00559395718574, 0.00559394133549, 0.00559407891146, 0.00559471767796, 0.00559528283683, 0.00559540841205, 0.0055959556412, 0.00559595781589, 0.00559592570662, 0.00559630766549, 0.00559619534873, 0.00559604259506 ] }, spectrum_data_point_t { xystar: [0.054611999539184386, -0.11296964824697227], uv: [6.999999999999999, 2.0], spectrum: [ 0.00391286636201, 0.00391314334244, 0.0039120933558, 0.00390890371173, 0.00390610197383, 0.00390382378503, 0.00390002240267, 0.00389190214025, 0.00387702162423, 0.00384903530555, 0.00380285799922, 0.00373059893013, 0.00362737505632, 0.00349710043184, 0.00333166240246, 0.00313726128758, 0.0029150699683, 0.00266762883028, 0.00240777953647, 0.00213300855017, 0.00185351906824, 0.0015725853396, 0.00130151934802, 0.00104576933365, 0.000807439524692, 0.000597258458401, 0.000420853399247, 0.000286689976975, 0.000204485316192, 0.000175167899681, 0.000199526259907, 0.000287762922171, 0.000433783434349, 0.000638838698422, 0.00089447112966, 0.0011969303016, 0.00154692247868, 0.00192838937491, 0.00233636366365, 0.002761160992, 0.00319728492108, 0.0036286856325, 0.00404821821862, 0.00445011872421, 0.00482488227973, 0.0051636563628, 0.00546804652424, 0.00573458128675, 0.00595939071209, 0.00614843420656, 0.00630046788225, 0.00642386254648, 0.0065217596258, 0.0065947023785, 0.00665101031192, 0.00669137714234, 0.00672376431673, 0.00674566257388, 0.00675979880432, 0.00676958568069, 0.00677575348051, 0.00677946716627, 0.00678164083367, 0.00678250799987, 0.00678278495189, 0.00678451914112, 0.00678595266774, 0.00678686430471, 0.00678910874587, 0.00679129029023, 0.00679279782522, 0.00679381779886, 0.00679504256569, 0.0067962226041, 0.00679621167108, 0.00679592173177, 0.00679569364897, 0.00679660683226, 0.00679789845594, 0.00679794671715, 0.00679858292589 ] }, spectrum_data_point_t { xystar: [0.10922399907836883, -0.11296964824697227], uv: [8.0, 2.0], spectrum: [ 0.00319376958325, 0.00319372111247, 0.00319380847994, 0.00319290676229, 0.00319112728527, 0.00318773857552, 0.00318141411055, 0.0031708152922, 0.00315339376798, 0.00312421793586, 0.00307799777621, 0.00300562444374, 0.00290364166467, 0.00277347355471, 0.00261449464582, 0.0024278762021, 0.00221667210594, 0.00198533415724, 0.00173790348345, 0.00148170698715, 0.00122512559226, 0.000975285853349, 0.000738959033566, 0.00052151689557, 0.000330531601578, 0.000173125674288, 6.00873117117e-5, 5.89712282303e-7, 4.37547740415e-8, 2.68262131582e-20, 1.74707686962e-5, 0.000108516283191, 0.000274593996735, 0.000512313106111, 0.0008183218823, 0.00118647641017, 0.00160885079331, 0.00207696940387, 0.00258123153266, 0.00310906125621, 0.0036496130078, 0.00418872846006, 0.00471385706798, 0.00521395567019, 0.00567994042039, 0.00610469011529, 0.0064811744402, 0.00680801513227, 0.00708478655996, 0.00731412455838, 0.00750057644708, 0.00764867864575, 0.00776570012403, 0.00785700163927, 0.00792462615785, 0.00797625225651, 0.00801509293263, 0.00804340182954, 0.00806352611106, 0.00807877471266, 0.00808940004263, 0.0080958472978, 0.00810026180248, 0.00810272681504, 0.00810356806126, 0.00810433855506, 0.00810452638041, 0.00810416800344, 0.00810459979494, 0.0081044746693, 0.00810481304857, 0.00810478253974, 0.00810468419974, 0.00810424428878, 0.00810354026186, 0.00810359002128, 0.00810309210883, 0.00810287024481, 0.00810300658597, 0.00810311040118, 0.00810305655429 ] }, spectrum_data_point_t { xystar: [0.1638359986175532, -0.11296964824697227], uv: [9.0, 2.0], spectrum: [ 0.00242272835128, 0.00242238613717, 0.00242198852002, 0.00242097418961, 0.002419471157, 0.00241733661108, 0.0024127197374, 0.00240438812716, 0.00238922618733, 0.00236236394225, 0.00231641283358, 0.00224584791359, 0.00214857331076, 0.00202373454706, 0.00187261524043, 0.0016981216874, 0.00150302201679, 0.00129318987903, 0.00107543256408, 0.000857011834563, 0.00064625792258, 0.000450663343156, 0.000279102578382, 0.00014132247013, 4.42684636607e-5, 5.64793676357e-21, 0.0, 0.0, 0.0, 4.79479247204e-20, 1.14758208832e-20, 0.0, 9.46099358769e-5, 0.000295622805923, 0.000598372215271, 0.000994533945497, 0.00147367771232, 0.0020236501247, 0.00262960974454, 0.00327531162619, 0.00394483412109, 0.00462069907725, 0.00528622765178, 0.00592532953147, 0.00652394472042, 0.00707104270856, 0.00755926803897, 0.00798508966619, 0.00834755330342, 0.00864901076776, 0.00889493838738, 0.0090920725291, 0.00924738038568, 0.0093666560527, 0.00945664941828, 0.00952396528788, 0.00957301912108, 0.00960830309865, 0.00963419511165, 0.00965214389769, 0.00966447280453, 0.00967334959719, 0.00967970416419, 0.00968377123959, 0.00968698415831, 0.00968926627539, 0.00969083924164, 0.0096922418898, 0.00969289719267, 0.00969342325491, 0.00969369810947, 0.00969383066099, 0.00969428343856, 0.00969432838931, 0.00969429528188, 0.00969443331557, 0.00969414822827, 0.00969397666862, 0.00969389131663, 0.00969363797103, 0.00969353143494 ] }, spectrum_data_point_t { xystar: [0.21844799815673765, -0.11296964824697227], uv: [10.0, 2.0], spectrum: [ 0.00158365153312, 0.00158299175173, 0.00158222014893, 0.00158014961785, 0.00157599062625, 0.00157206354742, 0.00156577806453, 0.00155683797928, 0.00154300755404, 0.0015205068312, 0.00148169319526, 0.00142236308814, 0.00133806539727, 0.00123101204234, 0.0011027146001, 0.000953832475481, 0.000793433129427, 0.000626066211454, 0.000460662182153, 0.000307568536479, 0.000174927249185, 7.44545808063e-5, 1.29809277217e-5, 0.0, 1.43941877952e-20, 0.0, 0.0, 3.32993299319e-22, 7.76973970202e-20, 1.9923187181e-20, 0.0, 4.654263628e-20, 3.21810078283e-20, 9.29853525356e-5, 0.000335749720549, 0.000717128169107, 0.00122409248442, 0.00184048006794, 0.00254517415889, 0.00331648787933, 0.00413308339077, 0.00496869649505, 0.00580042646404, 0.00660586844948, 0.0073644809186, 0.00806253034517, 0.00868788658349, 0.00923402878204, 0.00969974557007, 0.0100869747711, 0.0104036564687, 0.0106584440928, 0.0108594335694, 0.0110139528976, 0.0111321647085, 0.0112204932528, 0.0112866324326, 0.011335491018, 0.0113712037683, 0.0113966326557, 0.0114137512999, 0.0114250805373, 0.0114324647377, 0.0114370965785, 0.0114394565373, 0.0114414107599, 0.0114428058207, 0.0114433582715, 0.0114434406972, 0.0114441399962, 0.0114440899311, 0.0114439859929, 0.0114443804177, 0.0114438427978, 0.0114437458109, 0.0114431495845, 0.0114430186644, 0.0114431159561, 0.0114426826591, 0.0114431134052, 0.011442821454 ] }, spectrum_data_point_t { xystar: [0.2730599976959221, -0.11296964824697227], uv: [11.0, 2.0], spectrum: [ 0.000567425227685, 0.000568323083189, 0.000569869182485, 0.00057177447853, 0.000573302855024, 0.000573288204346, 0.0005732347917, 0.000569788579197, 0.000560096505801, 0.000542862219994, 0.000512786146878, 0.00047042650045, 0.000413520837123, 0.000344076318742, 0.000267006277607, 0.000188822887701, 0.00011399070588, 5.28895598499e-5, 1.01477361057e-5, 0.0, 1.92585639129e-20, 1.38297511107e-20, 4.7962629998e-20, 3.27958849831e-20, 5.6595615619e-20, 0.0, 6.22056661722e-20, 7.16831510448e-20, 1.00471025132e-19, 0.0, 7.92499764939e-20, 4.85791582168e-20, 0.0, 0.0, 9.97659976206e-5, 0.00040398624498, 0.000893837113635, 0.00154667829226, 0.00233640400006, 0.00323176993496, 0.00420099769501, 0.00521298761491, 0.00623365147996, 0.00723240615371, 0.00818203429856, 0.0090606207645, 0.00985258807255, 0.0105467197727, 0.0111401446501, 0.0116366442129, 0.0120438508103, 0.012370628584, 0.0126279497356, 0.0128260427855, 0.0129759923849, 0.013087358482, 0.0131690297966, 0.0132292136389, 0.0132729510059, 0.0133048361058, 0.0133275470415, 0.013343757872, 0.0133549134038, 0.0133622071808, 0.0133666163172, 0.0133694894637, 0.0133710531446, 0.0133721606236, 0.0133728200561, 0.0133735699317, 0.0133735265731, 0.0133734364488, 0.0133733834544, 0.0133736584553, 0.0133736986293, 0.0133738499843, 0.0133741321744, 0.0133743872194, 0.0133740485714, 0.0133738857807, 0.0133736721899 ] }, spectrum_data_point_t { xystar: [-0.2730599976959221, -0.056484824123486134], uv: [1.0, 3.0], spectrum: [ 7.39272681924e-6, 9.88589425456e-6, 1.34053842214e-5, 2.39212322117e-5, 4.30674801746e-5, 7.82180302187e-5, 0.000140112872956, 0.000249166128882, 0.000441251753038, 0.000775065057139, 0.00132372125819, 0.00213623568183, 0.00322517113799, 0.00456540094306, 0.00609997344814, 0.00774751686262, 0.00940231847301, 0.010946525476, 0.0122586848734, 0.013235538963, 0.0138061037606, 0.0139253592007, 0.01357320212, 0.0127574470022, 0.0114948243108, 0.00981808737438, 0.00778727868416, 0.00552618441809, 0.00325517241671, 0.00129556146454, 5.13112007262e-5, 0.0, 0.0, 1.89240393223e-18, 0.0, 0.0, 6.56972440746e-18, 0.0, 0.0, 5.92491490825e-18, 3.58094200082e-18, 1.42320660909e-18, 2.31914134795e-18, 0.0, 0.0, 3.10297888934e-18, 0.0, 0.0, 0.0, 2.28179064446e-18, 2.63529844906e-18, 2.89551881087e-19, 2.63184909893e-20, 8.22358832285e-19, 1.27581188899e-18, 0.0, 0.0, 2.97855675018e-19, 4.58448540155e-19, 2.9237012697e-19, 0.0, 1.56304104388e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.59284284161e-8, 0.0, 2.10687607001e-7, 5.96713466262e-8 ] }, spectrum_data_point_t { xystar: [-0.2184479981567377, -0.056484824123486134], uv: [1.9999999999999991, 3.0], spectrum: [ 0.00666714889846, 0.00666721004471, 0.00666724733729, 0.00666687610048, 0.00666627700021, 0.0066648612728, 0.00666232669208, 0.00665780418187, 0.00665042889485, 0.00663665446958, 0.00661263728283, 0.00657574303646, 0.00652267644151, 0.0064518164528, 0.0063634936218, 0.00625684167588, 0.00613087721445, 0.00598639966099, 0.0058239290139, 0.0056457823479, 0.00545302845562, 0.00524897706746, 0.00503454579931, 0.00481078578476, 0.00457902830681, 0.00433887943579, 0.00409153102439, 0.00383649782783, 0.00357450352472, 0.00330647151698, 0.00303302509746, 0.00275626022534, 0.0024781470992, 0.00220044317677, 0.00192585953986, 0.00165767242686, 0.00139859102278, 0.00115116860143, 0.000919792697792, 0.000707593853209, 0.000518156763583, 0.000354325283481, 0.000218994062135, 0.000114651962298, 4.29108285402e-5, 4.68297604933e-6, 3.01080635779e-20, 6.78567342435e-21, 2.41691195925e-21, 0.0, 3.21047877981e-20, 0.0, 0.0, 2.04004549378e-20, 2.48819058218e-20, 1.0584807119e-20, 7.93175258574e-21, 0.0, 1.69672242707e-20, 0.0, 0.0, 5.85956073872e-7, 6.20237426128e-7, 5.01095169004e-7, 5.94964102165e-7, 6.56673481904e-7, 8.13457670864e-7, 7.90884919598e-7, 6.72257159206e-7, 8.09555645166e-7, 1.11675404872e-6, 1.18497727211e-6, 1.28065370123e-6, 1.43371247875e-6, 1.4489556084e-6, 1.50298802118e-6, 1.55046363513e-6, 1.49705909003e-6, 1.71077381992e-6, 2.07893291163e-6, 1.85908428586e-6 ] }, spectrum_data_point_t { xystar: [-0.16383599861755327, -0.056484824123486134], uv: [3.0, 3.0], spectrum: [ 0.00603574035349, 0.0060352435093, 0.00603450340475, 0.00603259269304, 0.00603065769774, 0.0060305752104, 0.00602999993492, 0.00602426818172, 0.00601499865553, 0.00600057366325, 0.00597353875501, 0.00592962207811, 0.00586786781162, 0.00578844776546, 0.00568783098092, 0.00556590987364, 0.00542655489852, 0.00526941879998, 0.0050963211811, 0.00491082990584, 0.00471510532315, 0.00451025364024, 0.00429963383446, 0.00408551467612, 0.00387072396544, 0.00365678020306, 0.00344454834765, 0.00323409535326, 0.00302790325092, 0.00282923387614, 0.00263921236128, 0.00245732459577, 0.00228471322739, 0.00212323225967, 0.00197106571378, 0.00182763958111, 0.00169468471743, 0.00157443843745, 0.00146456261442, 0.00136571361205, 0.00127575720415, 0.00119386467779, 0.00112375182321, 0.00106407944822, 0.00101067437892, 0.000963676736619, 0.000927255782433, 0.000897186189383, 0.000870582832092, 0.000849791394067, 0.000833078633231, 0.000819998617153, 0.000810891491724, 0.000804435983203, 0.000797590260622, 0.000791213277149, 0.000789221169983, 0.000788619874428, 0.000785381459968, 0.000783123493354, 0.000782869086795, 0.00078339756614, 0.000782433960735, 0.000780542716405, 0.000779780356445, 0.000779481044835, 0.000779954753851, 0.000779781598603, 0.000778533163201, 0.000778666857058, 0.000779095411229, 0.000778727865732, 0.000779460062165, 0.000779899309631, 0.000778937257051, 0.000779393261438, 0.000779727760254, 0.00077891584195, 0.00077782295813, 0.000777893270236, 0.000777962609729 ] }, spectrum_data_point_t { xystar: [-0.10922399907836886, -0.056484824123486134], uv: [3.9999999999999996, 3.0], spectrum: [ 0.00531254948408, 0.00531217037528, 0.00531175501081, 0.00531149948422, 0.00531099661964, 0.00530880082248, 0.00530552828476, 0.005300775058, 0.00529231193258, 0.00527670513296, 0.00525110899887, 0.00521036940838, 0.00515282452036, 0.00507585898869, 0.0049817877157, 0.00486966894897, 0.0047406142978, 0.00459514072829, 0.00443534734366, 0.00426293650422, 0.0040827667122, 0.00389733329542, 0.00370886074778, 0.00351940592667, 0.00333164718406, 0.0031466893306, 0.00296739152614, 0.00279662632769, 0.00263741020922, 0.00249203120747, 0.00236027637243, 0.00224311498544, 0.00214053665815, 0.00205197775233, 0.00197988263919, 0.00192152455548, 0.00187609400559, 0.00184351575851, 0.00182184212534, 0.00181134725433, 0.00180831191121, 0.00181407239534, 0.00182591824056, 0.00184037221382, 0.00185707975915, 0.00187437019328, 0.00189172284401, 0.00190732601855, 0.00192181657848, 0.00193484557572, 0.00194528966854, 0.00195306770439, 0.00195973329347, 0.00196435780386, 0.00196743901938, 0.00196980663885, 0.0019707372224, 0.00197160880586, 0.00197270503319, 0.00197305191288, 0.00197345555156, 0.00197362509687, 0.00197391771794, 0.00197331830039, 0.00197280013519, 0.00197213487375, 0.00197105781538, 0.00197061051046, 0.00197064624013, 0.00197106861305, 0.00197116685645, 0.00197134980416, 0.00197156556992, 0.00197192729331, 0.00197195975536, 0.0019714203292, 0.00197117336872, 0.00197094212193, 0.00197014296989, 0.00196938380053, 0.00196946765212 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, -0.056484824123486134], uv: [5.0, 3.0], spectrum: [ 0.00459639437541, 0.00459710992884, 0.00459676307971, 0.00459595363054, 0.00459521928536, 0.004593514887, 0.00458968644814, 0.00458339513557, 0.0045742872902, 0.00455809113369, 0.00453106140229, 0.00449021401849, 0.00443362926162, 0.00436151322519, 0.00427328444087, 0.00417009945864, 0.00405126733866, 0.0039180727404, 0.00377252774658, 0.00361657998661, 0.00345465240043, 0.00328916623173, 0.00312284051452, 0.00295797989812, 0.00279675963124, 0.00264251368648, 0.00249864127128, 0.00236875517004, 0.00225484055058, 0.00215819198936, 0.00208210617771, 0.00202600124235, 0.00198983064192, 0.00197468996557, 0.00198113806998, 0.00200739759285, 0.00205028262753, 0.00210741488471, 0.00217738179885, 0.00225757177364, 0.00234615611922, 0.00243803959034, 0.00253166443316, 0.00262273767195, 0.00270785377092, 0.00278786347255, 0.00286020003846, 0.00292351572779, 0.00297616685915, 0.00301875977858, 0.00305467041317, 0.00308218015638, 0.00310361538224, 0.00311941159952, 0.00312995287037, 0.00313818349298, 0.00314399112784, 0.00314857534847, 0.00315204541434, 0.00315469474046, 0.00315616031941, 0.0031564594051, 0.00315723116261, 0.00315793280775, 0.0031575484154, 0.00315746932358, 0.0031577681266, 0.00315719329992, 0.00315634782921, 0.00315676644375, 0.00315695966287, 0.00315639851765, 0.00315668532226, 0.00315723651577, 0.00315727608705, 0.0031570384566, 0.00315677622086, 0.00315685614379, 0.00315682322074, 0.00315687001233, 0.00315692977572 ] }, spectrum_data_point_t { xystar: [0.0, -0.056484824123486134], uv: [6.0, 3.0], spectrum: [ 0.00393061128765, 0.00393015204309, 0.00392602139435, 0.00392381216193, 0.00392150849447, 0.00391726141708, 0.00391090846804, 0.00390097367815, 0.00388643818206, 0.00386753180586, 0.00384055679577, 0.00379588542058, 0.00373867574634, 0.00366725849013, 0.00357765171778, 0.00346937354498, 0.00334960361697, 0.00322235406519, 0.00308126353323, 0.00293418545807, 0.0027780002437, 0.00262759102448, 0.0024857855331, 0.0023481730074, 0.00221999173469, 0.00210208229272, 0.00200441521187, 0.00192227538174, 0.00185753572925, 0.00181889169911, 0.001807231056, 0.00181508871018, 0.00185896941018, 0.00192229591425, 0.00200523325957, 0.00211533822181, 0.00224557649699, 0.00239115988518, 0.00255225877031, 0.00272060249933, 0.00289310631273, 0.0030657331214, 0.00323058147807, 0.00339195851958, 0.00354308156314, 0.00367899255909, 0.00380180377391, 0.00391332529309, 0.00400513862491, 0.00408282155861, 0.00415154121793, 0.00420415478297, 0.00425220836406, 0.00428704483905, 0.00431422686818, 0.00433368848828, 0.00434576272821, 0.00435382572986, 0.00435992284346, 0.00436342967654, 0.00436526906208, 0.00436816811466, 0.00436647795583, 0.00436418010608, 0.00436280155202, 0.00436243917703, 0.00436237759614, 0.00436150054786, 0.00436082729711, 0.0043622305523, 0.00436391444554, 0.00436456041716, 0.00436513668501, 0.00436791445276, 0.00437045725046, 0.00437207814499, 0.00437465138395, 0.00437709512096, 0.00437787247127, 0.00437845343911, 0.00437863417119 ] }, spectrum_data_point_t { xystar: [0.054611999539184386, -0.056484824123486134], uv: [6.999999999999999, 3.0], spectrum: [ 0.00315625371272, 0.00315606964643, 0.00315503417792, 0.00315425864744, 0.00315330636532, 0.00315194609843, 0.00314918156101, 0.00314578659348, 0.00313973377083, 0.00312792028666, 0.00310500959599, 0.0030704263246, 0.00302061609733, 0.00295467566719, 0.00287393127619, 0.00277858835306, 0.00267063759051, 0.00255200930136, 0.00242686936608, 0.00229707009486, 0.00216461601972, 0.00203410119135, 0.00190996324241, 0.00179431296109, 0.00169163283302, 0.00160441792138, 0.0015350617766, 0.00148996870116, 0.0014704047751, 0.0014801840155, 0.00152319500139, 0.00159854032637, 0.00170620967788, 0.00184419747217, 0.00201089010616, 0.00220465828838, 0.00242039474739, 0.00265473266721, 0.00290462752568, 0.00316305303841, 0.00342421930477, 0.00368306189706, 0.00393409833917, 0.00417343798497, 0.0043956005232, 0.00459721017843, 0.00477593135646, 0.00493170194002, 0.005064910656, 0.00517519341098, 0.00526670512845, 0.00533974939944, 0.00539618656533, 0.00544012115741, 0.00547383908853, 0.00549801056722, 0.00551445412923, 0.00552563095085, 0.00553294916322, 0.00553713752937, 0.00553951145115, 0.00554064112295, 0.00554144226995, 0.00554196372988, 0.00554179217471, 0.00554239107708, 0.00554388270608, 0.00554536535364, 0.00554693525123, 0.00554822433636, 0.00554974017029, 0.0055513165446, 0.00555245731041, 0.00555404808789, 0.00555531809237, 0.00555630076429, 0.00555742884806, 0.0055578486979, 0.00555840473838, 0.00555910237882, 0.00555910151016 ] }, spectrum_data_point_t { xystar: [0.10922399907836883, -0.056484824123486134], uv: [8.0, 3.0], spectrum: [ 0.00244245242755, 0.00244260645252, 0.00244287841899, 0.00244237210085, 0.00244051565323, 0.00243744055582, 0.00243369234713, 0.00242870706689, 0.00242019914808, 0.00240784212081, 0.00238511158952, 0.00234983617145, 0.00230378180714, 0.00224398459268, 0.00217076558271, 0.00208336729175, 0.0019842454745, 0.00187642839306, 0.00176196891131, 0.00164530033608, 0.001529910705, 0.00141996243401, 0.00131663625599, 0.00122484623367, 0.00114777899286, 0.00108980090742, 0.00105539283108, 0.00104878482934, 0.00107590000433, 0.00113968048787, 0.00124093397457, 0.00138125173281, 0.00155934618513, 0.00177342074415, 0.00202100226914, 0.00229902866706, 0.00260237304152, 0.00292585475281, 0.0032657492211, 0.00361356758758, 0.00396336999779, 0.00430996381645, 0.00464349362923, 0.00495798619372, 0.00524871769621, 0.00551203107098, 0.00574453941117, 0.00594448146811, 0.00611391614456, 0.00625380176911, 0.00636637135735, 0.00645619046559, 0.00652671062058, 0.00658119533683, 0.00662304026727, 0.00665442966498, 0.00667804847309, 0.00669592697835, 0.00670981925304, 0.0067199003272, 0.00672664024839, 0.00673059838508, 0.00673295183594, 0.00673417355808, 0.00673404844003, 0.00673370294516, 0.0067330721698, 0.00673240221114, 0.00673278683395, 0.00673350927803, 0.00673378538953, 0.00673376488808, 0.00673329651546, 0.00673316664283, 0.00673273970257, 0.00673225106716, 0.00673180592486, 0.00673149994812, 0.00673135472592, 0.00673118822262, 0.0067312337202 ] }, spectrum_data_point_t { xystar: [0.1638359986175532, -0.056484824123486134], uv: [9.0, 3.0], spectrum: [ 0.00172080149781, 0.00172020640998, 0.00171975225391, 0.00171962329779, 0.0017192845796, 0.00171776994193, 0.00171452632813, 0.00170890084926, 0.00170101091071, 0.00168873681602, 0.0016676707614, 0.00163568748578, 0.00159125035757, 0.00153431105432, 0.00146518805967, 0.0013853274161, 0.00129519257452, 0.00119748876587, 0.00109598254733, 0.00099396043034, 0.000895215010063, 0.000802999741659, 0.000721572889693, 0.00065427631373, 0.000604653536297, 0.000577621377919, 0.000577859201212, 0.000612350791838, 0.000685326985215, 0.000800050475538, 0.000959394951715, 0.00116323286984, 0.00141116124623, 0.00170180114163, 0.0020304096578, 0.00239363250686, 0.00278531177128, 0.00319882148113, 0.00362911476138, 0.00406675155026, 0.00450492308039, 0.00493430979168, 0.00534620343903, 0.00573519922576, 0.0060934463446, 0.00641752560069, 0.00670360373041, 0.00695019076046, 0.00715928764724, 0.007332540019, 0.00747395154535, 0.0075868673746, 0.00767462149801, 0.00774272770115, 0.00779468110157, 0.00783388815622, 0.00786303475491, 0.00788381365238, 0.00789872185956, 0.00790951751076, 0.00791696811372, 0.00792170981711, 0.00792451701423, 0.00792640488086, 0.00792823198613, 0.00792938760199, 0.00792942308841, 0.00792928010311, 0.00792967918448, 0.0079299017576, 0.00793021670115, 0.00793025425097, 0.00793028404725, 0.00793048624509, 0.00793010851222, 0.00792998261994, 0.00792942803491, 0.00792890461874, 0.00792857051087, 0.00792815304605, 0.00792815295643 ] }, spectrum_data_point_t { xystar: [0.21844799815673765, -0.056484824123486134], uv: [10.0, 3.0], spectrum: [ 0.00100096294693, 0.00100182548072, 0.00100211292297, 0.00100100572591, 0.00100096723868, 0.000999787581884, 0.000998203171022, 0.000992590817659, 0.000984585951298, 0.000971593584882, 0.000950055015715, 0.000919914354842, 0.000878832053144, 0.000825343931605, 0.000759766146604, 0.000685260492545, 0.000604587141212, 0.00051861601157, 0.000431189626245, 0.000343443769176, 0.000260059405153, 0.00018586357365, 0.000126574514387, 8.3124172198e-5, 6.02415637378e-5, 6.44260407239e-5, 0.000100563509042, 0.000174324914975, 0.000291869582702, 0.000458824878455, 0.000676777868181, 0.000945881295666, 0.00126458135947, 0.00163183703549, 0.00204143474323, 0.0024884320181, 0.00296783814768, 0.00347141620573, 0.00399161511726, 0.00451936676256, 0.00504464654522, 0.0055589193243, 0.00605155871109, 0.00651409352131, 0.0069413952258, 0.00732659746625, 0.00766530523083, 0.00795939813547, 0.00820740319142, 0.00841182614975, 0.00857842531627, 0.00871200941073, 0.00881674393624, 0.0088975009236, 0.00895807326527, 0.00900439656065, 0.00903863867402, 0.00906278591225, 0.00907984860632, 0.00909248249778, 0.00910150418769, 0.00910717965638, 0.00911080800811, 0.00911356320777, 0.00911553387799, 0.00911690210187, 0.00911772336507, 0.0091187852523, 0.00911929490021, 0.00911908986892, 0.00911917993919, 0.00911928838455, 0.0091191010821, 0.00911820906827, 0.00911787651327, 0.00911782306086, 0.00911763389396, 0.0091173496952, 0.00911748838504, 0.00911718873298, 0.00911721769789 ] }, spectrum_data_point_t { xystar: [-0.2730599976959221, 0.0], uv: [1.0, 4.0], spectrum: [ 0.0, 7.34970943041e-19, 5.45503065922e-18, 0.0, 0.0, 0.0, 9.75623841823e-19, 0.0, 1.88576745316e-18, 0.0, 2.7977886011e-19, 7.25113687654e-19, 1.04041861011e-18, 2.50167481476e-17, 0.00067195117861, 0.0031395113783, 0.00689741118884, 0.0113358891872, 0.0158146944665, 0.0197105971371, 0.0225415507409, 0.0239953045536, 0.0239009037508, 0.0222682881531, 0.019210086771, 0.0149540353254, 0.00990407874367, 0.00482110462061, 0.000943643692416, 0.0, 0.0, 0.0, 0.0, 8.05758374867e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 1.77485641151e-18, 0.0, 5.55100914606e-18, 1.76040199416e-17, 0.0, 1.2323224417e-17, 5.96943765875e-18, 3.67299810624e-17, 1.24275746475e-17, 1.16607094585e-17, 0.0, 0.0, 0.0, 0.0, 5.86249108776e-18, 9.36481197e-18, 1.06156308151e-17, 9.29702613401e-18, 1.06375612436e-17, 2.07334287139e-18, 4.97512651402e-18, 1.78291373045e-18, 1.45101418679e-18, 2.4699695361e-18, 2.06945072518e-19, 3.74036665317e-19, 0.0, 5.7360861104e-19, 2.45866517923e-18, 7.2090070054e-20, 5.04845466993e-18, 5.58158043335e-18, 2.62562652335e-18, 3.75061575006e-18, 0.0, 0.0, 0.0, 0.0, 1.8038214061e-18, 3.76285401269e-19, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.2184479981567377, 0.0], uv: [1.9999999999999991, 4.0], spectrum: [ 0.0047111122482, 0.00471097654301, 0.00471199494176, 0.00471263403933, 0.00471474736159, 0.00471963914107, 0.00472850154286, 0.00474244345159, 0.00476901147566, 0.00481552097018, 0.00489192410948, 0.00500598574501, 0.00516270108874, 0.00536105169139, 0.00559489221057, 0.00585491044911, 0.0061327604702, 0.00641489538161, 0.00668943563591, 0.0069401241346, 0.00715260636924, 0.00731504575244, 0.00741765438149, 0.00745153631072, 0.0074068558056, 0.00727085472306, 0.0070335172244, 0.00668323595037, 0.00621708269667, 0.00563805708196, 0.00496295322676, 0.00421501647291, 0.00342282762472, 0.00262037325374, 0.00184647238977, 0.00114539354285, 0.000567666739966, 0.000166995201203, 1.67108245467e-19, 0.0, 1.76021325916e-19, 0.0, 4.78299785589e-20, 0.0, 0.0, 1.10374932892e-19, 9.64585822128e-20, 1.48850577813e-19, 1.44176091827e-19, 1.10962149306e-19, 0.0, 0.0, 2.60051259087e-19, 1.51409265984e-19, 0.0, 1.40592573089e-19, 0.0, 1.81860741026e-19, 2.86607091755e-19, 2.75522710518e-19, 0.0, 4.78610473046e-20, 0.0, 6.92693897926e-20, 1.97297744438e-19, 0.0, 6.86415642387e-20, 2.55371036069e-19, 1.53410538288e-19, 1.26057679943e-19, 1.95440799414e-7, 1.71950764079e-7, 6.13812443287e-8, 9.55826799821e-8, 4.82483756235e-7, 1.10014569165e-6, 1.77482476218e-7, 3.13075577495e-7, 5.16356407315e-7, 4.69158614298e-7, 1.27336333149e-7 ] }, spectrum_data_point_t { xystar: [-0.16383599861755327, 0.0], uv: [3.0, 4.0], spectrum: [ 0.00522780422835, 0.00522780976156, 0.00522906500383, 0.00522878998589, 0.00522649942294, 0.00522539887765, 0.00522428617914, 0.00522363013027, 0.00522494603157, 0.00522251551035, 0.00522021561275, 0.00521940192811, 0.00521761134955, 0.00521474296461, 0.0052143314855, 0.00520724849121, 0.00519533292074, 0.00518013111474, 0.0051600715153, 0.00513318388079, 0.0050959233612, 0.00505179416361, 0.00499954148174, 0.00493145272949, 0.00485417934339, 0.00476768298563, 0.00466251087821, 0.00453519012639, 0.00438835465804, 0.00422049153168, 0.00403271429804, 0.00382292425035, 0.00359080815733, 0.00334176637949, 0.00307785408642, 0.00279928942049, 0.002512506439, 0.00222281217713, 0.00193181911421, 0.0016416407816, 0.00136431168334, 0.00110312223536, 0.000862946254159, 0.000644981027984, 0.000454825627491, 0.000302830398902, 0.000184858880548, 9.0913133883e-5, 3.1225729491e-5, 4.7643348223e-6, 0.0, 1.97094378929e-20, 2.88982141311e-20, 8.22679629879e-20, 0.0, 4.84807968812e-20, 7.58129119221e-20, 6.10836553228e-20, 1.16467030247e-20, 2.7581510345e-20, 0.0, 1.43138948914e-8, 5.6751207466e-20, 1.02195495672e-6, 1.0812368607e-6, 2.37777121163e-7, 3.01152423184e-7, 1.28360511258e-6, 0.0, 0.0, 1.63600436894e-6, 1.49027016449e-7, 0.0, 2.50276831198e-6, 2.56667587891e-6, 1.21011871554e-6, 1.93741406675e-6, 3.04101083657e-6, 2.41309712546e-6, 2.31479218271e-6, 2.50070681774e-6 ] }, spectrum_data_point_t { xystar: [-0.10922399907836886, 0.0], uv: [3.9999999999999996, 4.0], spectrum: [ 0.00456361922635, 0.00456339763694, 0.00456281443906, 0.00456290597464, 0.0045626360729, 0.00456187600007, 0.0045607587863, 0.00455937956918, 0.00455767825376, 0.00455502668218, 0.00455154171887, 0.00454698846633, 0.00454188946384, 0.00453515906997, 0.00452571339776, 0.00451409899251, 0.00449842739848, 0.00447942718446, 0.00445586274256, 0.00442786000764, 0.00439560319887, 0.00435801541358, 0.0043144769202, 0.00426537840237, 0.00420921799419, 0.00414526042925, 0.0040724545436, 0.00399017272705, 0.0038976979278, 0.00379346302725, 0.00367732847978, 0.00354950582284, 0.00341068100482, 0.00326069373626, 0.00310075989828, 0.00293305081485, 0.00275874083094, 0.00258001680424, 0.00239977503092, 0.00221926219835, 0.00204205699795, 0.00187187013837, 0.00171052834463, 0.00156078181184, 0.00142412169924, 0.00130167150716, 0.00119437906465, 0.00110174530961, 0.0010238187969, 0.000959945641219, 0.000907439060184, 0.000865393123514, 0.000832325176084, 0.000805950795877, 0.000785595613989, 0.00077054016766, 0.000759134164045, 0.000750636254094, 0.000744366816568, 0.00073973384067, 0.000737230103908, 0.000735490256825, 0.000734305878382, 0.000733098289542, 0.000732243891888, 0.000730845525057, 0.000729315802119, 0.000727827082801, 0.000727295499174, 0.000726797684323, 0.000726789459451, 0.000726824997815, 0.000726482636827, 0.000726979343669, 0.00072719156914, 0.000727124533341, 0.000727125785832, 0.000726945373683, 0.000726596993193, 0.000725934256068, 0.000725640939597 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, 0.0], uv: [5.0, 4.0], spectrum: [ 0.00385154747171, 0.00385139717529, 0.00385159157077, 0.00385214114018, 0.00385246908587, 0.00385119298808, 0.00384906348993, 0.00384613758634, 0.00384363947472, 0.00384051768098, 0.00383852187679, 0.00383459037204, 0.00383288350061, 0.00382889423259, 0.00382459737421, 0.00381761809856, 0.00380922418757, 0.00379754230315, 0.00378470787736, 0.00377021103245, 0.00375275670102, 0.00373299721526, 0.00370896268526, 0.00368323790968, 0.00365371862835, 0.00362242516022, 0.003586816978, 0.00354714256297, 0.00350154957619, 0.00345061347157, 0.00339429612314, 0.00333275180989, 0.00326645931411, 0.00319481601207, 0.0031176590355, 0.00303425223244, 0.00294670904685, 0.00285779019579, 0.00276693820455, 0.00267619011913, 0.00258518112416, 0.00249731617789, 0.00241465214837, 0.00233857656348, 0.00226952663651, 0.00220595948876, 0.00215148599341, 0.00210574604909, 0.00206738699869, 0.0020370353472, 0.00200978301984, 0.00198767293787, 0.00197030891442, 0.00195760063231, 0.00194763723274, 0.001939912577, 0.00193482086212, 0.0019315172632, 0.00192947881271, 0.00192840955996, 0.00192741982832, 0.00192706792456, 0.00192742474457, 0.00192709043554, 0.0019259085001, 0.00192445624474, 0.00192249182727, 0.00192091557326, 0.00191942486978, 0.00191785840517, 0.00191635941035, 0.0019151171566, 0.00191449354501, 0.00191477161504, 0.00191501631454, 0.00191561692223, 0.00191621597999, 0.00191727665316, 0.00191793401367, 0.00191859751273, 0.00191919200403 ] }, spectrum_data_point_t { xystar: [0.0, 0.0], uv: [6.0, 4.0], spectrum: [ 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108, 0.00311941566108 ] }, spectrum_data_point_t { xystar: [0.054611999539184386, 0.0], uv: [6.999999999999999, 4.0], spectrum: [ 0.00239438477804, 0.00239432495366, 0.00239404693311, 0.00239434535352, 0.00239460005516, 0.00239549662376, 0.00239622233678, 0.00239690262653, 0.00239898315315, 0.00240023707386, 0.00240284409441, 0.00240603527935, 0.00240903685689, 0.00241303245372, 0.00241805513267, 0.00242357284352, 0.00243067097412, 0.00243979863872, 0.00245069880366, 0.00246340131083, 0.00247884623546, 0.00249726952549, 0.00251908605816, 0.00254536976296, 0.00257463140537, 0.00260699034481, 0.00264406189366, 0.00268523500016, 0.00273135621277, 0.00278309832948, 0.00284095829688, 0.00290456640647, 0.00297377105491, 0.00304885344578, 0.00312869389208, 0.00321261903734, 0.00330024006258, 0.00338967292438, 0.00348028583292, 0.00357049645765, 0.00365883192957, 0.00374301463642, 0.0038219374236, 0.00389630467267, 0.00396342301787, 0.00402492323675, 0.00407935057238, 0.00412659447834, 0.00416768384286, 0.00420082268876, 0.00422864462602, 0.00425129410551, 0.00426847848918, 0.00428205891935, 0.00429192718536, 0.00429812048385, 0.0043015273519, 0.00430363561007, 0.00430492935484, 0.00430550085979, 0.00430599703053, 0.00430601141027, 0.00430623723837, 0.00430650280706, 0.00430658332484, 0.00430681194503, 0.00430685089432, 0.00430736301456, 0.00430765002507, 0.00430776906572, 0.004308020915, 0.00430817936541, 0.00430902095077, 0.00430976686988, 0.00431059221643, 0.00431163432133, 0.00431204409082, 0.00431274146112, 0.00431341587713, 0.00431386571606, 0.0043142158751 ] }, spectrum_data_point_t { xystar: [0.10922399907836883, 0.0], uv: [8.0, 4.0], spectrum: [ 0.00168151964593, 0.00168166497133, 0.00168142913432, 0.00168171725571, 0.0016823939839, 0.00168260864625, 0.00168223202137, 0.00168120435028, 0.00168089011601, 0.00168122457362, 0.00168348581048, 0.00168648888748, 0.00169270181671, 0.00170135621271, 0.00171231611666, 0.00172546442073, 0.00174262182991, 0.00176393443627, 0.00178765239225, 0.00181585709001, 0.00184710668882, 0.00188304782377, 0.00192497072787, 0.00197357556517, 0.00202935693408, 0.00209282593097, 0.00216442770466, 0.00224581540078, 0.00233896540542, 0.0024437223774, 0.00256016961383, 0.00268851480645, 0.00282792468748, 0.00297733089646, 0.00313700248684, 0.00330608123809, 0.00348093252582, 0.00366010702991, 0.00384190835411, 0.00402179643114, 0.00419842893575, 0.00436862826911, 0.00452970525098, 0.00467907815769, 0.00481527380496, 0.00493769311235, 0.00504542698645, 0.00513761291551, 0.00521439755734, 0.00527834030758, 0.00533082897643, 0.00537243513974, 0.00540454710997, 0.005429494443, 0.00544845757789, 0.00546257379381, 0.0054733948279, 0.00548070253144, 0.00548625427693, 0.00549074027774, 0.00549421467806, 0.00549650563841, 0.00549746400292, 0.00549793760269, 0.00549837443061, 0.00549847213651, 0.00549825343908, 0.00549795135771, 0.00549727943386, 0.00549620965684, 0.00549595497732, 0.00549607155778, 0.00549616681442, 0.00549607265627, 0.00549616375305, 0.00549611058095, 0.00549607050569, 0.00549571992612, 0.00549552543932, 0.0054952132659, 0.00549529104192 ] }, spectrum_data_point_t { xystar: [0.1638359986175532, 0.0], uv: [9.0, 4.0], spectrum: [ 0.000961796447815, 0.000961438586324, 0.000961548949336, 0.000960869548428, 0.000960301499152, 0.000959892509604, 0.000960179070233, 0.000961515599434, 0.000962653834818, 0.000964033300623, 0.000967556817925, 0.000973000090996, 0.000981450458787, 0.000993275998974, 0.00100843682413, 0.00102942505193, 0.00105478171408, 0.00108369528891, 0.00111847772831, 0.00115988808096, 0.00120816672384, 0.00126392738783, 0.00132747072268, 0.00140057647202, 0.00148408635097, 0.0015787929821, 0.00168662533925, 0.00180917052219, 0.00194811227535, 0.00210445470526, 0.00227963919406, 0.00247144017509, 0.00268105648075, 0.00290727145927, 0.00314840214443, 0.00340239503191, 0.00366552797318, 0.0039340107633, 0.0042043805217, 0.00447297091332, 0.00473650563211, 0.00498994467376, 0.00523052938627, 0.00545567185141, 0.00566123626946, 0.00584531668676, 0.00600706642097, 0.00614652664093, 0.00626362295172, 0.00636053160723, 0.00643915343459, 0.0065010281726, 0.00654937689891, 0.00658666803006, 0.00661476994524, 0.00663598781598, 0.0066513015516, 0.00666286493956, 0.00667079700346, 0.00667580629407, 0.00667954560854, 0.00668183979808, 0.00668315534328, 0.00668381519406, 0.00668509763138, 0.00668595727897, 0.00668666944548, 0.00668717512676, 0.00668740525774, 0.00668730813239, 0.00668707575391, 0.00668709691761, 0.00668684137864, 0.00668650245038, 0.00668660813628, 0.00668668676056, 0.00668680954768, 0.00668695893347, 0.00668691369629, 0.00668730491888, 0.00668735244817 ] }, spectrum_data_point_t { xystar: [0.21844799815673765, 0.0], uv: [10.0, 4.0], spectrum: [ 0.00024739191151, 0.000246986597168, 0.000245920885842, 0.00024375918344, 0.000241626523433, 0.00023831740756, 0.000237461577668, 0.000236953490834, 0.000236346937166, 0.000238018047384, 0.000243952724016, 0.000253873296527, 0.000266627523068, 0.000284685353492, 0.000306557965747, 0.000334206756875, 0.00036758129978, 0.000407887281203, 0.000455983575801, 0.00051214946085, 0.000576341683264, 0.000650388317591, 0.000735257437693, 0.000831033603429, 0.000941683413645, 0.00106598502816, 0.00120755486908, 0.00136849479048, 0.00155338720609, 0.00176150448873, 0.00199455114954, 0.00225344820204, 0.00253510344724, 0.00283843503124, 0.00315943000955, 0.00349778492625, 0.00384741989183, 0.00420597904008, 0.00456745722975, 0.0049266015182, 0.00527770743539, 0.00561532279009, 0.00593673888476, 0.00623471929802, 0.00650837463726, 0.00675278601872, 0.00696876216717, 0.00715355692307, 0.00730958922917, 0.00743811367082, 0.00754268125846, 0.00762714608393, 0.00769237304323, 0.00774232339771, 0.00778081241705, 0.00781035177792, 0.00783188525038, 0.00784806950592, 0.00785893386194, 0.00786597326943, 0.00787068329028, 0.00787445259861, 0.00787607308465, 0.00787699704094, 0.00787782997311, 0.00787776711718, 0.00787824406096, 0.0078787775357, 0.00787954848701, 0.00787917104757, 0.00787894085046, 0.00787866324289, 0.00787821345775, 0.00787758172517, 0.00787706607528, 0.00787706637962, 0.00787710704867, 0.00787767670104, 0.00787710545435, 0.00787795160569, 0.00787790807527 ] }, spectrum_data_point_t { xystar: [-0.2730599976959221, 0.056484824123486106], uv: [1.0, 4.999999999999999], spectrum: [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.85237060658e-17, 4.18099983294e-17, 0.0, 0.0, 4.82153413681e-18, 2.68506736141e-17, 6.0177867623e-17, 0.0, 2.19126714725e-17, 0.0, 0.0, 0.0067266335743, 0.0202098412247, 0.0340744334966, 0.0438085417018, 0.0466386326056, 0.0420824711269, 0.0311873831919, 0.0166307586267, 0.00335384314773, 3.30892090639e-16, 0.0, 1.79141742449e-16, 1.92647677192e-17, 0.0, 5.89433168697e-17, 1.45581734823e-16, 0.0, 8.43241996102e-17, 0.0, 0.0, 8.47957736444e-17, 0.0, 0.0, 3.18169543125e-16, 3.63106333836e-16, 4.20567076156e-16, 0.0, 1.72108854926e-17, 1.39089143551e-16, 4.98184849966e-17, 0.0, 1.94574073657e-16, 3.4508733992e-16, 3.3473492278e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.92620839966e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.2184479981567377, 0.056484824123486106], uv: [1.9999999999999991, 4.999999999999999], spectrum: [ 0.00129107923288, 0.00129047703083, 0.00129245279151, 0.00129713352878, 0.00130631555156, 0.00132340898607, 0.00135410819668, 0.00140841030044, 0.00150714801137, 0.00167755349863, 0.00196023327236, 0.00238737393316, 0.00297170067044, 0.00370800044038, 0.00457695581511, 0.00554964849544, 0.00658930353455, 0.00765046235515, 0.0086827182255, 0.00963323396617, 0.0104604106838, 0.0111243345935, 0.0115926467624, 0.0118426727456, 0.0118488002624, 0.0115872341063, 0.0110301847432, 0.0101648250334, 0.00900358274553, 0.0075889480961, 0.00600773746559, 0.00436706622789, 0.00279316018551, 0.00142752736096, 0.000435939965155, 8.63941841197e-20, 0.0, 3.93501148297e-19, 3.68025316263e-19, 0.0, 4.8066524196e-19, 0.0, 1.10941050142e-18, 8.06554960317e-19, 6.9848389505e-19, 0.0, 3.68065384467e-19, 0.0, 1.08201693935e-18, 1.46233628452e-18, 0.0, 0.0, 0.0, 2.04720640446e-19, 2.57243340993e-19, 0.0, 0.0, 0.0, 5.74903945475e-19, 6.1638895931e-19, 5.37364997354e-20, 0.0, 6.00484871252e-19, 2.67214161652e-19, 0.0, 5.8884713061e-19, 0.0, 0.0, 7.89080673539e-20, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.70913021719e-7, 6.75195129323e-7, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.16383599861755327, 0.056484824123486106], uv: [3.0, 4.999999999999999], spectrum: [ 0.00394914483256, 0.00394901346557, 0.00394978062204, 0.00395158066983, 0.00395360384565, 0.00395561489703, 0.00396054336989, 0.00397227436417, 0.00399103436988, 0.00402425045599, 0.00407846378912, 0.00416117049222, 0.0042772673491, 0.0044251129034, 0.00460342220623, 0.00480982418143, 0.0050370291405, 0.00527798471542, 0.00552676615083, 0.0057747307465, 0.00601070736282, 0.00622668131906, 0.00641510266503, 0.00656681677141, 0.00667603538159, 0.0067306201198, 0.0067229953394, 0.00664418763842, 0.00648366693805, 0.00623338777265, 0.00589980048742, 0.00548804418047, 0.0050054964408, 0.0044647998467, 0.0038763455879, 0.00325714512181, 0.00263332855056, 0.0020224042872, 0.00144684281845, 0.000933424141857, 0.000507063280928, 0.00019312325851, 1.78224243016e-5, 0.0, 0.0, 1.53248703848e-19, 0.0, 0.0, 6.81708689641e-20, 3.37259226504e-19, 0.0, 0.0, 0.0, 1.29384849287e-19, 0.0, 2.31255180324e-19, 3.18616453759e-19, 1.89325168066e-19, 1.42701348634e-19, 1.23037451739e-19, 0.0, 3.22978799606e-19, 0.0, 7.67888306245e-20, 0.0, 0.0, 3.56283233439e-19, 1.39866315415e-19, 3.03240536019e-7, 4.24936059448e-7, 3.79866125731e-7, 4.24575264811e-20, 5.48217955941e-7, 3.09475112561e-7, 8.35079464777e-7, 7.81259630246e-7, 3.72059222081e-19, 2.67044169078e-7, 5.35193882e-7, 6.01222641095e-7, 2.31120990028e-8 ] }, spectrum_data_point_t { xystar: [-0.10922399907836886, 0.056484824123486106], uv: [3.9999999999999996, 4.999999999999999], spectrum: [ 0.00375571080025, 0.00375562996312, 0.00375618417943, 0.00375550596142, 0.00375630507335, 0.0037583224569, 0.00376091076677, 0.00376428906255, 0.00377152583874, 0.00378592706995, 0.00381069163626, 0.00384874867626, 0.00390212359679, 0.00397110969114, 0.00405506576673, 0.00415250322712, 0.00426221602141, 0.00438241690639, 0.00450893557115, 0.00463798255329, 0.00476515081565, 0.00488599181464, 0.00499835529711, 0.00509812331119, 0.00518031342489, 0.00524189700063, 0.00527746947784, 0.00528092848041, 0.00524885500596, 0.00517671999976, 0.0050638855301, 0.00491049060937, 0.00471632761407, 0.00448263732318, 0.00421264887837, 0.00391166098995, 0.00358473262695, 0.00323730138801, 0.00287668241959, 0.00251095651274, 0.00214727124604, 0.0017956574309, 0.00146267760685, 0.00115499093476, 0.000880427708607, 0.000641250378439, 0.000440896540554, 0.000281225942953, 0.000159614098133, 7.46793966478e-5, 2.31568718448e-5, 0.0, 1.13686565366e-20, 0.0, 1.0519432823e-20, 5.21249455664e-20, 9.65643071233e-21, 0.0, 4.61904315613e-20, 0.0, 1.95792471034e-20, 0.0, 0.0, 5.19540424989e-7, 3.22216144777e-7, 3.98041097298e-7, 9.35727425867e-7, 1.09525398858e-6, 7.41912643343e-7, 1.11452959576e-6, 1.37316151998e-6, 1.14899955984e-6, 1.03179785652e-6, 1.08558720525e-6, 6.84134826494e-7, 7.22125925451e-7, 9.36173770132e-7, 1.06476281226e-6, 1.30807547629e-6, 1.55335609635e-6, 1.54549140859e-6 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, 0.056484824123486106], uv: [5.0, 4.999999999999999], spectrum: [ 0.00306831535751, 0.00306816417356, 0.00306889286396, 0.00306981336722, 0.00307095108822, 0.00307266896186, 0.00307744084702, 0.00308287986109, 0.00309259374462, 0.00310751600647, 0.00313351503369, 0.00317068780008, 0.00322125690902, 0.0032880187649, 0.00336678408051, 0.00345915352035, 0.00356562585802, 0.00368391352753, 0.00381098458484, 0.00394244262917, 0.00407556068704, 0.00420703382845, 0.00433239703439, 0.00444707355824, 0.00455141889007, 0.00464107289129, 0.00471016165756, 0.00475497957256, 0.00477273404837, 0.0047615454848, 0.00471801113441, 0.00464318787835, 0.00453507911784, 0.00439419864066, 0.00422489273236, 0.00402938476063, 0.00381191131641, 0.00357664090238, 0.00332829044026, 0.00307117725682, 0.00281169285477, 0.00255418513679, 0.00230470456786, 0.00206722497792, 0.00184651485486, 0.00164493705024, 0.00146515203579, 0.00130967505521, 0.00117574219618, 0.00106400864034, 0.000973749042299, 0.000902376017481, 0.00084737757163, 0.000804787764687, 0.00077234614347, 0.000747251030533, 0.000728109664737, 0.000714346281301, 0.000703620310904, 0.00069590430287, 0.000690466295825, 0.00068725139835, 0.000684770161693, 0.000682645833429, 0.000681281115655, 0.000680870603331, 0.000679992164812, 0.000680380087715, 0.000681510370349, 0.000681181328598, 0.000680047038844, 0.000679125644796, 0.000677905748199, 0.000677413668657, 0.000677115338526, 0.000677595481073, 0.000677730867656, 0.000677604120123, 0.000677375344955, 0.000677097093364, 0.00067702115062 ] }, spectrum_data_point_t { xystar: [0.0, 0.056484824123486106], uv: [6.0, 4.999999999999999], spectrum: [ 0.00235213438702, 0.00235265948988, 0.00235382772128, 0.00235484489216, 0.00235632646404, 0.00235929683999, 0.00236392463197, 0.00237007500814, 0.00237917440915, 0.00239566082626, 0.00242187159191, 0.00246053995227, 0.00251380919143, 0.00258326633886, 0.00266715345575, 0.00276673143901, 0.00287875751682, 0.00300165763988, 0.00313707933093, 0.00328009433915, 0.00342726013728, 0.0035750900858, 0.00371970538538, 0.00385889689933, 0.00399098448078, 0.00411224535857, 0.00421888514676, 0.00430849971081, 0.00437681107144, 0.00441959406407, 0.00443706229616, 0.00442822548326, 0.00439394942875, 0.00433437522273, 0.00424701730467, 0.00413737576545, 0.00400815078487, 0.00385964243551, 0.00369716835388, 0.00352479627566, 0.00334924261693, 0.00317320665147, 0.00299939148291, 0.00283411471357, 0.00268152501153, 0.00254347550684, 0.00241920971519, 0.00231179793878, 0.00222124832083, 0.0021468260241, 0.00208540686005, 0.00203538653323, 0.00199655475654, 0.00196692780348, 0.00194338681373, 0.00192551211147, 0.00191272716803, 0.001902832915, 0.00189546922533, 0.00188991480947, 0.00188674429609, 0.00188485911368, 0.00188381115312, 0.00188300242205, 0.00188308503211, 0.00188355376617, 0.00188323873731, 0.00188289208729, 0.0018822028972, 0.0018815904869, 0.00188053398409, 0.00187969344382, 0.00187884504801, 0.00187815386496, 0.00187791032921, 0.00187773212108, 0.0018774415505, 0.00187700959805, 0.00187626135945, 0.00187590285437, 0.00187576927877 ] }, spectrum_data_point_t { xystar: [0.054611999539184386, 0.056484824123486106], uv: [6.999999999999999, 4.999999999999999], spectrum: [ 0.00165777522963, 0.001656525778, 0.00165593611864, 0.00165511109416, 0.00165470643693, 0.00165478945993, 0.00165660377194, 0.00165980509329, 0.00166764588984, 0.00168238770536, 0.00170739016494, 0.00174415808846, 0.00179758980823, 0.00186905135196, 0.00195705524194, 0.00206300327231, 0.00218531401422, 0.00232298074709, 0.00247234548606, 0.00262985720938, 0.00279403299192, 0.00296089603906, 0.00312930631638, 0.00329487078212, 0.00345576565975, 0.0036077944776, 0.00374993401874, 0.00387926219479, 0.0039916903305, 0.00408688497433, 0.00416145173041, 0.0042151967398, 0.00424786032728, 0.00425912682197, 0.00425095064673, 0.0042239566837, 0.0041807623104, 0.00412324663942, 0.00405335611041, 0.00397333318045, 0.00388553184001, 0.00379422849694, 0.00370265347298, 0.00361315758125, 0.00352876243993, 0.00345094978266, 0.00338215450527, 0.00332239069275, 0.00327140084643, 0.00323084825143, 0.00319731215625, 0.00317078470113, 0.00315046382848, 0.00313414791567, 0.00311962253712, 0.00310841596364, 0.00309994115588, 0.00309255086322, 0.00308526303144, 0.00307915458666, 0.0030740100993, 0.0030698146508, 0.00306768581233, 0.00306622878064, 0.00306430201927, 0.00306446696012, 0.00306482725386, 0.00306506691514, 0.00306578825, 0.00306658864747, 0.00306776803171, 0.00306902701361, 0.00307063528288, 0.00307259052644, 0.00307424593331, 0.00307589484245, 0.0030778182551, 0.00307924699596, 0.0030799818391, 0.00308044876128, 0.00308071074913 ] }, spectrum_data_point_t { xystar: [0.10922399907836883, 0.056484824123486106], uv: [8.0, 4.999999999999999], spectrum: [ 0.000905383547515, 0.000905747696491, 0.000905264577302, 0.000905702679382, 0.000907487011437, 0.000911778812856, 0.000917598221972, 0.000924308380533, 0.000934303143024, 0.000951424067209, 0.000981562795743, 0.0010263771701, 0.00108670094492, 0.00116363704921, 0.0012602320375, 0.00137220271357, 0.00150366469274, 0.00164942238931, 0.00180834327855, 0.00197915532718, 0.00215817487604, 0.0023421971812, 0.00252961146654, 0.00271894466694, 0.00290713886638, 0.00309266594821, 0.00327314568368, 0.00344390339776, 0.00360368238701, 0.00375121585332, 0.0038834928459, 0.00400177814501, 0.00410348988691, 0.00419112484866, 0.00426282104683, 0.00431936314882, 0.00436235782145, 0.00439209705064, 0.00441131216098, 0.00442011253807, 0.004419750869, 0.00441281536001, 0.00440186377865, 0.00438797949772, 0.00437418092426, 0.00435986859341, 0.00434637818574, 0.00433482036157, 0.00432363629345, 0.00431366052174, 0.00430628052834, 0.00429990799492, 0.00429518231373, 0.00429203274399, 0.00428918391482, 0.00428685704247, 0.00428511457041, 0.0042836443852, 0.00428236320381, 0.00428089608249, 0.00428003673737, 0.00427949188901, 0.00427918972251, 0.00427997144231, 0.0042812285868, 0.00428225838757, 0.00428315017992, 0.00428264286945, 0.0042831701661, 0.00428248665587, 0.00428110423914, 0.0042803550837, 0.00427922666412, 0.00427881952925, 0.0042775554499, 0.0042773552462, 0.00427780803932, 0.00427689146418, 0.00427695533535, 0.00427661587444, 0.00427652879209 ] }, spectrum_data_point_t { xystar: [0.1638359986175532, 0.056484824123486106], uv: [9.0, 4.999999999999999], spectrum: [ 0.000201458296072, 0.000201259401349, 0.000201430023599, 0.000201736772141, 0.000201983085725, 0.000203042652675, 0.000205339570811, 0.000210561401801, 0.000219561935994, 0.00023525290151, 0.000262993538742, 0.000307683269754, 0.000370507445664, 0.000453140961103, 0.000554139713855, 0.000673865699715, 0.000813497531867, 0.00096993538239, 0.00114267147581, 0.00132964039245, 0.00152578674005, 0.00172907660719, 0.00193845065896, 0.00215121074533, 0.00236568028265, 0.00257994094478, 0.00279327769184, 0.00300347359388, 0.00320757307985, 0.00340571717795, 0.0035968214302, 0.0037786303484, 0.00395185204283, 0.00411592054115, 0.00426964462452, 0.00441294720115, 0.00454506315122, 0.00466617172538, 0.00477709211401, 0.00487743220089, 0.00496795710661, 0.00504819547675, 0.00511822346822, 0.00517861185971, 0.00523023795334, 0.00527430271769, 0.00531128872292, 0.00534133470817, 0.0053655299078, 0.00538466438133, 0.00540035173943, 0.00541324257988, 0.00542281281688, 0.0054299125453, 0.00543568364028, 0.00544033582313, 0.00544350668884, 0.00544653421249, 0.00544864298621, 0.00544956449157, 0.00545024017474, 0.00545047088216, 0.0054502091305, 0.00545010632812, 0.0054497136449, 0.00544930627879, 0.00544886001995, 0.00544877153702, 0.00544868855019, 0.00544845762105, 0.00544824813646, 0.00544794352807, 0.00544773459553, 0.00544743473349, 0.0054472189396, 0.00544679384257, 0.00544679026659, 0.00544662240018, 0.00544626606821, 0.0054465642138, 0.00544625099672 ] }, spectrum_data_point_t { xystar: [0.21844799815673765, 0.056484824123486106], uv: [10.0, 4.999999999999999], spectrum: [ 1.92769335555e-6, 1.37360513351e-6, 8.71790612511e-7, 1.79955584192e-7, 5.34021427589e-20, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.09268516026e-20, 1.62677904939e-19, 0.0, 6.54152757036e-20, 2.73290434806e-19, 1.12593212447e-20, 0.0, 2.92449053213e-5, 0.000157340453052, 0.000360608604748, 0.000620949978232, 0.000920848294074, 0.00124918850638, 0.00159602116369, 0.001955410364, 0.00231824765963, 0.00267687269206, 0.00302799591741, 0.0033660515505, 0.00368727267715, 0.00398985604878, 0.00427186279908, 0.0045329454216, 0.00477256585964, 0.00499013185653, 0.00518717429914, 0.0053626416973, 0.00551670146383, 0.00565312371109, 0.00577126511647, 0.00587300866495, 0.00595918290972, 0.00603071544765, 0.00609051371103, 0.00613894871351, 0.00617886257874, 0.00621111258979, 0.00623610455212, 0.00625502830803, 0.00626955299347, 0.00628030342276, 0.00628802500874, 0.0062956340952, 0.00630138434623, 0.00630467402934, 0.00630663083975, 0.00630810824094, 0.00630894391625, 0.00630911033534, 0.00630942712143, 0.00630933127776, 0.00630946841462, 0.0063094029945, 0.0063091919095, 0.00630926518525, 0.00630978362664, 0.00631044192253, 0.00631085664534, 0.00631094414133, 0.00631098205033, 0.00631074942486, 0.00631035757024, 0.00630996662911, 0.006309738591, 0.00630957988118, 0.00630955124689, 0.00630951117535, 0.00631005903714, 0.00631012577622 ] }, spectrum_data_point_t { xystar: [-0.2184479981567377, 0.11296964824697227], uv: [1.9999999999999991, 6.0], spectrum: [ 0.0, 2.1352544766e-18, 1.15721348301e-18, 4.97865859685e-19, 0.0, 0.0, 0.0, 3.18378374817e-19, 1.90790444059e-18, 0.0, 0.0, 1.00359216809e-18, 0.00021699481259, 0.000999400716976, 0.00229699033323, 0.00402745384529, 0.0060786702822, 0.0083164191158, 0.0105926874383, 0.0127486185162, 0.0146468692817, 0.0161757052815, 0.0172477979987, 0.0178030842649, 0.0177865347557, 0.0171509500654, 0.0158548216626, 0.013910924974, 0.0114104976727, 0.00853812103564, 0.00557506735269, 0.00288507830299, 0.00087729637637, 1.20930452995e-18, 0.0, 0.0, 4.93270500484e-19, 2.69843558616e-18, 0.0, 4.0373965693e-18, 0.0, 0.0, 0.0, 0.0, 6.1507295012e-18, 0.0, 7.28393606997e-18, 2.28406581297e-18, 4.13196120664e-18, 0.0, 6.12811278368e-18, 2.33730854174e-18, 1.7310770908e-18, 9.94624228027e-19, 1.4248512339e-18, 1.73165261796e-18, 7.51822360409e-19, 0.0, 5.74837749165e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.44045035743e-19, 1.45979239035e-18, 1.0246925209e-18, 1.0650655192e-18, 3.9753966372e-19, 4.8252077173e-19, 4.17702104545e-19, 0.0, 0.0, 0.0, 0.0, 2.04876094117e-19, 4.95302515907e-19, 2.02421238299e-7, 4.59727132122e-19 ] }, spectrum_data_point_t { xystar: [-0.16383599861755327, 0.11296964824697227], uv: [3.0, 6.0], spectrum: [ 0.00198748905677, 0.00198795988863, 0.00198905701, 0.00199139753607, 0.00199626841049, 0.00200524163139, 0.0020214612418, 0.00205135097116, 0.00210350660477, 0.00219605336277, 0.00235072824535, 0.00258626173639, 0.00291148973663, 0.00332729412851, 0.00382779596523, 0.00440179929899, 0.00503423996835, 0.00570590438603, 0.00639436322126, 0.00707269670381, 0.00771798437081, 0.00830726556172, 0.00881944223714, 0.0092361374907, 0.00953924359265, 0.00970811160498, 0.00971800710684, 0.0095479442521, 0.00918637682873, 0.00863206760331, 0.00789630220062, 0.00700493352175, 0.00599387489393, 0.00490527293229, 0.00378676772686, 0.00269616304312, 0.00169939099519, 0.00086680490808, 0.000273698830734, 0.0, 2.46041822463e-19, 2.04463913231e-19, 1.78201708691e-19, 0.0, 1.54164929862e-19, 1.81463923939e-19, 4.00030119035e-19, 0.0, 5.85299177945e-20, 0.0, 9.31782101984e-20, 0.0, 0.0, 0.0, 9.96222103271e-20, 0.0, 1.3745688206e-19, 5.21841632779e-20, 1.70504213453e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.68058309424e-8, 1.63791735401e-7, 0.0, 7.00747417016e-8, 4.24525579494e-7, 2.70157185847e-7, 6.9493400322e-7, 8.76207407963e-7, 4.25890222851e-7, 4.47661280186e-7, 5.30160906003e-7, 4.19235863366e-7, 2.79212864207e-7 ] }, spectrum_data_point_t { xystar: [-0.10922399907836886, 0.11296964824697227], uv: [3.9999999999999996, 6.0], spectrum: [ 0.00262927878119, 0.00263001325013, 0.00262965078328, 0.00263105216766, 0.00263365004897, 0.00263810287821, 0.00264663897094, 0.00266234177351, 0.00268545211246, 0.00273382672703, 0.00280651555404, 0.00291336718575, 0.00306626377037, 0.00326110113109, 0.00349805045516, 0.00377117930361, 0.00407693895865, 0.00441228453599, 0.00476664071786, 0.00512800093172, 0.00548517236295, 0.00583178696348, 0.00615695962558, 0.00645224725252, 0.00670886557543, 0.00691261064299, 0.00705483138293, 0.00712570216733, 0.0071121061889, 0.00700858042627, 0.00680912322123, 0.006518288525, 0.00614469989507, 0.00569420912738, 0.00517646478696, 0.00460274655016, 0.0039908183025, 0.00335931840011, 0.00272847806822, 0.00211790082099, 0.00154628023143, 0.00103746375879, 0.000611348860169, 0.000288408873156, 8.10244116455e-5, 3.99375895093e-20, 0.0, 1.12748181582e-19, 1.48623874871e-19, 5.07656531098e-20, 2.23006069104e-19, 2.10965887916e-19, 7.4197188647e-20, 2.02530672574e-19, 1.14494233647e-20, 0.0, 9.94740170483e-21, 0.0, 0.0, 3.47816299462e-19, 4.45381502754e-22, 2.17321196857e-19, 1.40476046753e-19, 0.0, 1.99681742091e-19, 6.75041334532e-20, 5.32756361759e-20, 2.71630441448e-7, 0.0, 0.0, 6.14444764316e-7, 1.13657006912e-6, 8.46653924712e-8, 0.0, 1.02912041671e-6, 8.23053666693e-7, 4.21840856958e-8, 0.0, 7.88040365724e-8, 0.0, 5.50571415715e-21 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, 0.11296964824697227], uv: [5.0, 6.0], spectrum: [ 0.00225414649188, 0.00225393204463, 0.00225356635707, 0.00225483333669, 0.0022579583522, 0.00226151327277, 0.00226680731867, 0.00227813923991, 0.00229635503756, 0.00232846537743, 0.00238412108243, 0.00246252616622, 0.0025715004516, 0.0027173193105, 0.00289692496542, 0.00310317452929, 0.0033360692436, 0.00359421859803, 0.00387311736703, 0.00416308287017, 0.00445575566297, 0.00474450040415, 0.00502365860022, 0.00528758749779, 0.005530829797, 0.0057447851193, 0.00591978643527, 0.00604932357462, 0.00612827829032, 0.00614823403118, 0.0061048048623, 0.00599815303584, 0.00583542150129, 0.00561031696457, 0.00533104581421, 0.00500301990676, 0.00463334415746, 0.00423014763966, 0.0038033516419, 0.00336515646968, 0.00291992725192, 0.00247969967736, 0.0020575977827, 0.00166223181664, 0.00130372043484, 0.000986532947471, 0.00071201480831, 0.000486726711618, 0.000310938461599, 0.000174392275519, 8.10211799422e-5, 2.86447119124e-5, 0.0, 8.30048139007e-20, 1.85351298645e-19, 1.79647647315e-19, 5.21352171678e-20, 1.48586011312e-19, 5.61825871117e-20, 1.30042152484e-19, 0.0, 9.28640194261e-20, 9.56264753312e-20, 6.00334601366e-20, 8.99972506458e-20, 1.10262405327e-19, 1.21337469694e-19, 3.02444473606e-7, 1.30075391988e-6, 2.22537671325e-6, 1.85079964919e-6, 1.17364088918e-6, 1.37859829839e-6, 2.00183311872e-6, 1.20402499058e-6, 3.1122989287e-7, 4.02187186643e-7, 3.84853747502e-7, 1.45290354886e-7, 1.16043513774e-19, 1.46907276789e-19 ] }, spectrum_data_point_t { xystar: [0.0, 0.11296964824697227], uv: [6.0, 6.0], spectrum: [ 0.00161820540752, 0.00161861221842, 0.00161847474526, 0.00161932507098, 0.00162109394845, 0.00162332860202, 0.00162770472117, 0.00163633807548, 0.00165298575559, 0.00168062667003, 0.00172729280498, 0.00180075071072, 0.00190330028589, 0.00203984605965, 0.0022068264401, 0.0024051788726, 0.0026317608521, 0.00288345848041, 0.00315647555887, 0.00344534815993, 0.00374129105277, 0.00403700363526, 0.00432731683862, 0.00460584594723, 0.00486957670298, 0.00510946925661, 0.00532151661864, 0.00549961093426, 0.0056330180178, 0.00571949651007, 0.00575483664973, 0.005738868099, 0.00566795679979, 0.00554452360873, 0.00536983396914, 0.00514893747959, 0.00488852278959, 0.00459348475746, 0.00427333526484, 0.00393243498596, 0.00358188644017, 0.00322945510136, 0.0028865804626, 0.00255852010844, 0.00225269459647, 0.00197259722519, 0.0017227862845, 0.00150561663224, 0.00131991079874, 0.00116788309546, 0.00104351669536, 0.000944024135699, 0.000866526870846, 0.000807271726222, 0.000761697771237, 0.000727847210657, 0.00070272942851, 0.000684737507003, 0.000672321431001, 0.000663199444457, 0.000656232100349, 0.000649658255272, 0.000645278308165, 0.000642093880398, 0.000639350796459, 0.000637278149328, 0.000635212611648, 0.000633883921856, 0.00063324321748, 0.000632343354473, 0.000632595180188, 0.000632750662456, 0.000632891504076, 0.000632754050132, 0.000631619471173, 0.000631045978761, 0.000631577625447, 0.000631061770993, 0.000631154240244, 0.00063165085361, 0.000631459605078 ] }, spectrum_data_point_t { xystar: [0.054611999539184386, 0.11296964824697227], uv: [6.999999999999999, 6.0], spectrum: [ 0.000882493777461, 0.000881705278857, 0.000882602183772, 0.000883409980422, 0.000884756224786, 0.000888376377698, 0.000893675769878, 0.000903455701221, 0.000921105729404, 0.000951138169817, 0.00100195236053, 0.00107833093428, 0.00118622983748, 0.00132683698536, 0.00150204459779, 0.00170972960208, 0.00194667628475, 0.00221101684444, 0.00249735813735, 0.00280078664911, 0.00311395207575, 0.00343026091326, 0.00374278601684, 0.0040471865385, 0.00433801345009, 0.00460953016285, 0.00485602300237, 0.00507182555464, 0.00525029922473, 0.00538574427431, 0.00547491277416, 0.00551770393462, 0.00551326718183, 0.00546294367959, 0.00536853389381, 0.00523334969729, 0.00506214509627, 0.00485974624109, 0.00463072341496, 0.00438212804714, 0.00412163801792, 0.00385713870389, 0.00359551172963, 0.00334131813335, 0.00310264851378, 0.00288429659739, 0.0026883534835, 0.00251735271588, 0.00237220688175, 0.00225221341279, 0.00215322214657, 0.00207435856748, 0.00201160680469, 0.0019639546382, 0.0019274565918, 0.00189920505731, 0.00187886198183, 0.00186367787351, 0.00185223893691, 0.00184391457655, 0.00183701292948, 0.00183276541422, 0.00182995569392, 0.00182808730412, 0.00182662005211, 0.0018259220627, 0.00182559170935, 0.00182493371959, 0.00182447614855, 0.00182435761227, 0.00182400159488, 0.00182408440876, 0.00182384844699, 0.00182347322961, 0.00182325891488, 0.00182301969513, 0.00182304253017, 0.00182311723576, 0.00182302931489, 0.00182359408429, 0.00182370657821 ] }, spectrum_data_point_t { xystar: [0.10922399907836883, 0.11296964824697227], uv: [8.0, 6.0], spectrum: [ 0.00016488961411, 0.000164102352059, 0.000165801979055, 0.000167874232366, 0.000170313081751, 0.000172031427297, 0.000178858261908, 0.000188937302795, 0.000206355159034, 0.000239092822234, 0.000291178821009, 0.000369927492607, 0.000480309359486, 0.00062500866921, 0.00080001869199, 0.00100811867362, 0.00125648073207, 0.00153013148141, 0.00182375433065, 0.00213953216841, 0.00246578952273, 0.00280235815495, 0.00313748808963, 0.00346564643398, 0.0037849192405, 0.00408770792591, 0.00437139774911, 0.00462916148962, 0.00485496553953, 0.00504214130417, 0.00519119864458, 0.0052972021616, 0.00536407200572, 0.00539328179037, 0.00538228464542, 0.00533363238693, 0.00524731403538, 0.00513355839821, 0.00499856151071, 0.00484015337325, 0.0046685850846, 0.0044892027732, 0.00430951873824, 0.00413123581832, 0.00395892546847, 0.00379762203604, 0.00365484150858, 0.00352927397233, 0.0034201051603, 0.00332956714422, 0.00325095654926, 0.00318561903807, 0.00313544563458, 0.00309428976861, 0.00306033854408, 0.00303455666855, 0.00301595948436, 0.00300241854872, 0.00298748758715, 0.00297673004049, 0.00297059081424, 0.00296690615978, 0.00296372534142, 0.00296244493857, 0.00296102145707, 0.00296186235101, 0.00296449094466, 0.00296198307317, 0.00296245828049, 0.00296430662036, 0.0029656846385, 0.0029685722772, 0.00297009753231, 0.00297156094345, 0.00297281649209, 0.00297369231323, 0.00297409370313, 0.0029758009901, 0.00297467073241, 0.00297567638229, 0.00297584332186 ] }, spectrum_data_point_t { xystar: [0.1638359986175532, 0.11296964824697227], uv: [9.0, 6.0], spectrum: [ 1.72895767792e-8, 8.08524299853e-8, 5.48817661668e-8, 2.05892750533e-20, 0.0, 5.49441061985e-20, 0.0, 2.83072186135e-20, 0.0, 0.0, 0.0, 0.0, 7.46798798285e-20, 3.33754935221e-20, 3.2590496735e-5, 0.000133780473526, 0.000300376979773, 0.000527801488319, 0.000808837599054, 0.0011318868907, 0.00148717597586, 0.00186410993522, 0.00225389817958, 0.0026479948129, 0.00303784312699, 0.00341820404614, 0.00378182528557, 0.00412262181891, 0.00443534511463, 0.00471289483633, 0.00495105319878, 0.00514942557844, 0.0053059366488, 0.00542029096026, 0.00549357832563, 0.00552876423123, 0.00552876998317, 0.00549729426051, 0.00543762858095, 0.00535335634115, 0.00525101513815, 0.00513663836408, 0.00501605309479, 0.00489400443295, 0.0047741285448, 0.00466021076982, 0.00455629434294, 0.00446353698641, 0.00438325351486, 0.00431593306967, 0.00425996484556, 0.00421493576159, 0.00418019176743, 0.00415269824786, 0.00413171277582, 0.00411670941757, 0.00410590577836, 0.00409823647104, 0.0040931396611, 0.00408872023732, 0.0040850724277, 0.00408223409946, 0.00408056064816, 0.00407909356647, 0.00407737171798, 0.00407604611186, 0.00407563002539, 0.00407498373302, 0.00407456175032, 0.00407455409576, 0.00407372837359, 0.00407329693058, 0.0040734896966, 0.00407253201456, 0.00407212461703, 0.00407202925703, 0.00407109825312, 0.00407100159636, 0.00407094512658, 0.00407021206718, 0.00407027181173 ] }, spectrum_data_point_t { xystar: [-0.2184479981567377, 0.16945447237045844], uv: [1.9999999999999991, 7.0], spectrum: [ 1.00324917886e-18, 5.53108447967e-18, 3.11828901548e-18, 5.5057087059e-18, 1.92405961356e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 1.51345380295e-18, 0.0, 6.46228592287e-18, 1.82967724254e-18, 0.0, 0.0, 0.00175837508494, 0.0051086555725, 0.00947521898763, 0.0142054824268, 0.0187229839026, 0.0225588346612, 0.0253530132414, 0.0268756875729, 0.026957301587, 0.0254889539137, 0.0224342364451, 0.0179589818298, 0.012523321047, 0.00692834668445, 0.00229306075975, 0.0, 0.0, 0.0, 0.0, 2.45915935639e-17, 1.22937186245e-17, 0.0, 0.0, 3.68312639482e-18, 0.0, 0.0, 2.53711087387e-17, 7.50598252114e-18, 3.30745532888e-18, 4.68630883914e-18, 8.52146487664e-18, 0.0, 7.60091114649e-19, 1.26943925342e-17, 0.0, 0.0, 0.0, 0.0, 1.57356106699e-18, 0.0, 0.0, 0.0, 2.25913004989e-19, 0.0, 1.18458906935e-18, 0.0, 5.4866327814e-19, 1.72597898863e-18, 0.0, 1.12498243732e-18, 2.79005988202e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.47232364546e-18, 6.54676033147e-20, 5.03136649389e-19, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.16383599861755327, 0.16945447237045844], uv: [3.0, 7.0], spectrum: [ 1.15743165544e-19, 0.0, 1.09770033088e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.69617148166e-5, 0.000193544207676, 0.000538786613928, 0.00108473856172, 0.00183256735001, 0.00276601122186, 0.00385705562488, 0.00507139088168, 0.00636538053708, 0.0076883401117, 0.00898364366252, 0.0101977581165, 0.0112828691563, 0.0121990688182, 0.0129136312579, 0.0133902476701, 0.0135914773209, 0.0134751722763, 0.0130109019999, 0.0121876844141, 0.0110231415145, 0.00956624270525, 0.00789557784145, 0.00610982029053, 0.00432140911166, 0.00266031746231, 0.00127517971551, 0.000329470675459, 4.55768191655e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.18035687855e-19, 2.78953862625e-18, 3.77527808635e-19, 1.21159999337e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 2.530707565e-19, 6.5751162674e-19, 0.0, 0.0, 2.32307425394e-19, 0.0, 0.0, 9.14953171361e-20, 0.0, 1.0499651231e-19, 4.81498546498e-19, 0.0, 1.95808790488e-20, 1.49106968617e-19, 1.41126886319e-19, 1.66448601873e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.35633978014e-19, 1.70646856102e-19, 1.52944808236e-7, 1.92712471547e-7 ] }, spectrum_data_point_t { xystar: [-0.10922399907836886, 0.16945447237045844], uv: [3.9999999999999996, 7.0], spectrum: [ 0.00115873621413, 0.00115929670516, 0.00116045356524, 0.00116271987518, 0.00116701528728, 0.00117553931187, 0.00119072326331, 0.00121727852919, 0.00126534199166, 0.00134850164349, 0.00148740569878, 0.00169916267577, 0.00199330178565, 0.00237176561652, 0.00283117088615, 0.00336335048895, 0.00395899279681, 0.00460242401727, 0.00527740010213, 0.00596309467986, 0.00663912819498, 0.00728560151263, 0.007882938979, 0.0084168846055, 0.00886939618161, 0.00921968461558, 0.00944793988847, 0.00953313638189, 0.00945740721202, 0.00921093395605, 0.00879530471792, 0.00822067831597, 0.00750401662751, 0.00666808391263, 0.00574106582812, 0.00475622918955, 0.0037537579058, 0.00277649694128, 0.00187275481428, 0.0010929847855, 0.000488320385958, 0.000108187095042, 0.0, 0.0, 0.0, 5.61286719647e-20, 5.8876416571e-20, 0.0, 7.99871652998e-20, 0.0, 1.28234817948e-19, 0.0, 0.0, 6.98755120264e-20, 2.38723851719e-19, 2.91013251543e-19, 0.0, 1.3169907363e-19, 0.0, 1.88601006723e-19, 1.5349857474e-19, 4.21442245785e-19, 3.17180082928e-19, 5.35320536919e-19, 4.06940372797e-8, 2.78507644942e-19, 4.0508948797e-7, 5.73694327217e-7, 7.15507203868e-7, 8.07934753441e-7, 1.63843722886e-6, 2.30697905025e-6, 1.79772365321e-6, 1.46131034262e-6, 1.28547133647e-6, 1.35481174738e-6, 1.18220603741e-6, 1.21040725936e-6, 1.38067866522e-6, 1.20124384248e-6, 1.37276378593e-6 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, 0.16945447237045844], uv: [5.0, 7.0], spectrum: [ 0.0012537484039, 0.00125332419504, 0.0012544515174, 0.00125726779142, 0.00125967512714, 0.00126438915539, 0.00127452008628, 0.00129118247446, 0.00132213044587, 0.00137502264339, 0.00146418515679, 0.00160219515685, 0.00179456881183, 0.00204606628439, 0.0023546197472, 0.00271633186239, 0.00312694529195, 0.00357800423002, 0.0040613507904, 0.00456254882731, 0.00506835176514, 0.00556727188032, 0.00604801968309, 0.00649767185926, 0.00690583656437, 0.00725977532605, 0.00754758883539, 0.00775380493596, 0.00786706496354, 0.00787591929892, 0.00777760337144, 0.00757054254782, 0.00726154661542, 0.00685625739552, 0.00636495030494, 0.00580005133705, 0.00517629459866, 0.00451071224441, 0.00382452333013, 0.00313697713328, 0.00247141066386, 0.00184711720303, 0.00128808066868, 0.000812575381552, 0.000436550378989, 0.000173348294329, 2.73253250975e-5, 1.82538537761e-20, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.58391461091e-20, 0.0, 0.0, 6.34473049936e-8, 7.82280219055e-8, 2.27227947472e-20, 1.13518481073e-20, 3.32422836006e-7, 3.19746063258e-7, 4.20048425851e-7, 4.92256952386e-7, 5.25267650336e-7, 7.56897833923e-7, 3.26520965927e-7, 3.07709840257e-8, 2.94720740877e-7, 1.84154202342e-7, 3.12041358615e-7, 4.48603512631e-7, 2.32232115726e-7, 4.33291170677e-7 ] }, spectrum_data_point_t { xystar: [0.0, 0.16945447237045844], uv: [6.0, 7.0], spectrum: [ 0.000817431207442, 0.000817701931495, 0.000817489702638, 0.000818393403807, 0.000820701557474, 0.000824733596875, 0.000832335086187, 0.000845363905191, 0.000868053702417, 0.000911100880877, 0.000985532765366, 0.00110164594974, 0.00126422658346, 0.00147631479187, 0.00173797993504, 0.00204557368986, 0.00239770310187, 0.00278857025075, 0.00320943461199, 0.0036503447432, 0.00410277460106, 0.00455777715179, 0.00500636355515, 0.00543628551199, 0.00583952786326, 0.00620758682913, 0.00652988348664, 0.00679559185874, 0.0069924099607, 0.00711142479481, 0.00714799719819, 0.00710091361259, 0.00697079790649, 0.00676151798533, 0.00647623143203, 0.00612373310143, 0.00571115083682, 0.00525013977948, 0.00474941350686, 0.00422451895564, 0.00368868061711, 0.00315585374832, 0.0026409925672, 0.00215382392821, 0.00170677194807, 0.0013077526039, 0.000964731647765, 0.000677709106011, 0.000447782874199, 0.000271393366789, 0.000145943560148, 6.23864492186e-5, 1.50541172303e-5, 9.49633637992e-21, 0.0, 0.0, 0.0, 4.43760612514e-20, 5.09081419119e-20, 0.0, 0.0, 3.70128308284e-20, 3.23762984869e-20, 1.23283242811e-20, 0.0, 4.05851737477e-8, 5.75398975948e-7, 2.51598044213e-7, 3.27723957156e-7, 4.04111272838e-7, 3.44466201599e-7, 3.74078735681e-7, 4.98015323176e-7, 7.45340069726e-7, 1.07096958757e-6, 1.26980426947e-6, 1.35816214948e-6, 1.7764146569e-6, 2.32577381875e-6, 2.21033579737e-6, 2.57002465945e-6 ] }, spectrum_data_point_t { xystar: [0.054611999539184386, 0.16945447237045844], uv: [6.999999999999999, 7.0], spectrum: [ 0.000123470784956, 0.000125795322865, 0.000124841881045, 0.00012464217155, 0.000125497661553, 0.000130410215895, 0.000138568671191, 0.000152379097111, 0.00017805118245, 0.000221104619245, 0.000296551039953, 0.000411434392809, 0.000575274436747, 0.0007864524321, 0.0010486048463, 0.00135447234652, 0.00170610450676, 0.00209909944064, 0.00252181591418, 0.00297131083764, 0.00343038831909, 0.00389435188675, 0.00435144401306, 0.0047956959147, 0.0052182378245, 0.00561180604206, 0.00596698198893, 0.00627046410867, 0.00651346100632, 0.0066913165508, 0.00679552467609, 0.00682935070607, 0.00678889563497, 0.00667327642512, 0.0064899027481, 0.00624256014001, 0.00594111004332, 0.00558938791173, 0.00519893120257, 0.00478257801236, 0.00434609774803, 0.00390645764436, 0.00347370093354, 0.00305683260711, 0.0026673651643, 0.00231140233792, 0.00199351090092, 0.00171588983599, 0.00148333655333, 0.00128537365315, 0.00112682509748, 0.000997968433538, 0.000896017214386, 0.000817180100542, 0.000756407372833, 0.000709098674681, 0.000675048876521, 0.000649098503623, 0.000627867738875, 0.00061305216602, 0.000603226830062, 0.00059422761148, 0.000587716867816, 0.000583695810775, 0.00058247439678, 0.000580864504859, 0.000579218126224, 0.000578621039087, 0.0005792580081, 0.00057968991984, 0.000580490922012, 0.000581668119013, 0.000581669918877, 0.00058416354397, 0.000586748817985, 0.000586771860098, 0.000588154413673, 0.000589072991631, 0.000590133761552, 0.000590204912664, 0.000590050022171 ] }, spectrum_data_point_t { xystar: [0.10922399907836883, 0.16945447237045844], uv: [8.0, 7.0], spectrum: [ 1.17780477003e-7, 4.30972465934e-8, 2.06847476991e-8, 5.12658028331e-8, 8.51983875354e-8, 0.0, 0.0, 0.0, 2.78620628933e-20, 4.32669317324e-20, 6.52961307177e-20, 2.6178249261e-20, 9.32141316482e-6, 8.97942738923e-5, 0.000246058816506, 0.000476471830472, 0.000773480339697, 0.00113694390684, 0.00155629872122, 0.00201696700795, 0.0025066446994, 0.00300971545155, 0.00351736074581, 0.00402008837596, 0.00450515506443, 0.00496755979101, 0.0053943725039, 0.00577318126165, 0.00609607379467, 0.00635477421165, 0.00654363933453, 0.00666046774664, 0.00670647248332, 0.00667915397174, 0.00658368568603, 0.0064245287692, 0.00620749962606, 0.00594117425656, 0.00563362993809, 0.00529437697032, 0.00493440933484, 0.00456394596578, 0.00419526265977, 0.00383744308036, 0.00349821075282, 0.00318602652359, 0.00290672764276, 0.00266246430095, 0.00245405382357, 0.00227894953773, 0.00213735221361, 0.00202320582689, 0.00193234227451, 0.0018641914668, 0.0018120293016, 0.00177227778131, 0.00174323366202, 0.00172109690904, 0.00170580065178, 0.00169409496648, 0.00168572357589, 0.00168044025397, 0.00167690364494, 0.00167499898635, 0.00167283135787, 0.0016712557074, 0.00167073597055, 0.00166995119061, 0.00166883069575, 0.00166790842941, 0.00166776530537, 0.00166728594735, 0.00166702413312, 0.0016671533362, 0.00166670217763, 0.0016671916947, 0.00166730764897, 0.00166727637584, 0.00166755352906, 0.00166731484089, 0.00166739542715 ] }, spectrum_data_point_t { xystar: [0.1638359986175532, 0.16945447237045844], uv: [9.0, 7.0], spectrum: [ 0.0, 0.0, 4.29651284701e-20, 0.0, 0.0, 0.0, 0.0, 1.45247848932e-19, 0.0, 0.0, 8.70021509786e-20, 1.60702609378e-19, 0.0, 2.17581417559e-19, 3.7981715774e-20, 0.0, 4.50866365081e-19, 0.0, 1.88826734862e-20, 6.4352110369e-5, 0.000353785894203, 0.000810838603668, 0.00138456298171, 0.00203504198293, 0.00272791763533, 0.00343433633662, 0.00412857431135, 0.00478732075364, 0.00538972825105, 0.0059165593689, 0.00635429982966, 0.00669688565158, 0.00694041990745, 0.00708387764299, 0.00713051824326, 0.00708438293872, 0.00695393765734, 0.00674777154317, 0.00647633909568, 0.00615357372261, 0.00579269504551, 0.00540824455041, 0.00501478357961, 0.00462527057032, 0.00425198091749, 0.00390361181486, 0.0035883880797, 0.00331033905461, 0.00307054305261, 0.00286938946847, 0.00270509423268, 0.00257294376162, 0.00246786339579, 0.0023869542821, 0.00232506237735, 0.0022793413613, 0.00224560509447, 0.00222034241994, 0.0022028985343, 0.00218988577368, 0.00218081398682, 0.00217426546123, 0.00216992294849, 0.00216705364262, 0.00216444825874, 0.00216246507797, 0.00216111254753, 0.00215986516774, 0.00215951878429, 0.00215901137028, 0.00215863926745, 0.00215841604998, 0.00215801444528, 0.00215837915499, 0.00215855489475, 0.00215860019113, 0.00215857137368, 0.00215855050682, 0.00215849173016, 0.00215850957937, 0.00215842200504 ] }, spectrum_data_point_t { xystar: [-0.2184479981567377, 0.22593929649394454], uv: [1.9999999999999991, 8.0], spectrum: [ 0.0, 0.0, 0.0, 0.0, 7.56462927966e-18, 4.4197680874e-18, 0.0, 0.0, 3.38215562424e-18, 0.0, 0.0, 1.52668283426e-17, 1.69321187674e-17, 0.0, 1.3666063215e-18, 0.0, 1.54936459218e-17, 4.37354254198e-18, 0.000509586877105, 0.00789037250479, 0.0184608381156, 0.0292084626302, 0.0378245912223, 0.0428910195784, 0.0435345681236, 0.0394004640909, 0.0307300456435, 0.0189395915214, 0.00707923296529, 7.94242154775e-17, 0.0, 1.59737460554e-16, 1.62437176154e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 5.50004537727e-17, 0.0, 4.46463919619e-17, 0.0, 0.0, 1.40523725316e-16, 1.90882266375e-16, 0.0, 1.3892505383e-16, 0.0, 2.92978030348e-17, 1.49594699025e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.99301249534e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.45344071248e-18, 5.06908663547e-18, 8.15141519915e-19, 2.93252662558e-19, 0.0, 9.64334535637e-19, 0.0, 2.17742806627e-18, 4.97533478236e-18, 5.07921139064e-18, 2.12467440537e-18, 4.54252930488e-19, 7.81374479164e-18, 1.02859849585e-17, 1.24055491983e-17, 1.92537506713e-17, 1.71398989735e-17, 2.40413233157e-17 ] }, spectrum_data_point_t { xystar: [-0.16383599861755327, 0.22593929649394454], uv: [3.0, 8.0], spectrum: [ 0.0, 0.0, 1.46142178274e-18, 5.43425955348e-19, 5.99280560586e-19, 2.27730061452e-18, 0.0, 3.44746124243e-19, 7.97171769262e-19, 0.0, 9.58958877852e-19, 0.0, 5.9392790888e-19, 0.0, 0.000524416374598, 0.00166387920113, 0.00332545007305, 0.00538702058481, 0.00770385415052, 0.0101077751071, 0.0124414410895, 0.0145680700899, 0.0163735136852, 0.0177658336642, 0.0186595381864, 0.018973705745, 0.0186292357661, 0.0175795802956, 0.0158336103919, 0.013476980118, 0.0106820988557, 0.00768986886325, 0.00478207355017, 0.0022812953904, 0.000552385559844, 0.0, 0.0, 0.0, 3.56778726115e-18, 2.18845101785e-19, 8.27745488259e-19, 6.29225575521e-20, 0.0, 1.18246360023e-18, 0.0, 5.77384841248e-18, 7.65251353963e-18, 0.0, 0.0, 0.0, 6.15483568748e-19, 0.0, 0.0, 3.84967027766e-19, 5.64791080255e-20, 0.0, 0.0, 8.47627713942e-19, 5.86819219654e-19, 7.59324383674e-19, 5.10483278518e-19, 9.25482652137e-20, 8.02411063435e-19, 8.08437795217e-19, 1.38463195432e-18, 9.15995169758e-19, 1.87736083037e-18, 2.26585366544e-19, 0.0, 0.0, 1.46626293557e-18, 1.96030846926e-19, 2.97185314575e-19, 9.0844283593e-20, 9.64452889567e-19, 1.38384007758e-18, 9.02090088826e-19, 1.41115689013e-18, 1.7658432489e-7, 2.37042170289e-18, 7.43368528019e-8 ] }, spectrum_data_point_t { xystar: [-0.10922399907836886, 0.22593929649394454], uv: [3.9999999999999996, 8.0], spectrum: [ 2.92540044307e-19, 1.82277245419e-7, 0.0, 3.26901989366e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.85714991694e-5, 0.0002827584854, 0.0006597045278, 0.00120372025123, 0.00190804536803, 0.00275566970226, 0.00372480594099, 0.00478791485685, 0.00591177430212, 0.00705420182253, 0.00817297709187, 0.00923025811061, 0.0101940296102, 0.0110345355522, 0.0117211235176, 0.0122205037945, 0.0124952011026, 0.0125144053664, 0.0122530998602, 0.0117039094885, 0.0108808075687, 0.00981453587461, 0.00854924678279, 0.00713928314459, 0.00565027768456, 0.00415979066991, 0.00275512920101, 0.00153211324164, 0.0005930245744, 4.55396567845e-5, 5.71045304426e-20, 0.0, 1.36505005611e-19, 0.0, 1.72209004881e-19, 6.10266414079e-20, 6.94017844189e-19, 0.0, 2.67765376456e-19, 1.33670610948e-19, 0.0, 3.47574921219e-19, 4.96620483579e-20, 1.37994522527e-19, 5.41780634636e-19, 2.6637211968e-19, 0.0, 0.0, 1.29016747737e-19, 1.5113599984e-19, 4.01665153867e-19, 1.78348438348e-19, 2.16946019026e-19, 2.70277890388e-19, 2.01884624346e-19, 1.93141133839e-20, 0.0, 2.49124134832e-19, 0.0, 0.0, 5.4039744943e-7, 2.95648672441e-7, 0.0, 4.25358339875e-7, 3.81835189631e-7, 4.2767387722e-7, 4.1641820813e-7, 1.64692885726e-7, 2.47245726962e-7, 1.73016942183e-7, 1.89414024977e-7 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, 0.22593929649394454], uv: [5.0, 8.0], spectrum: [ 1.57971644663e-19, 4.32833836047e-19, 6.62665532281e-7, 2.60039114807e-19, 1.17204908541e-6, 6.70846769028e-6, 1.54953175903e-5, 3.88644742553e-5, 8.52533294443e-5, 0.000168261847351, 0.000316868727693, 0.000537517589908, 0.000847936530438, 0.00125249198377, 0.00174572761575, 0.00232029601632, 0.00297233070499, 0.00367966930581, 0.00443013015852, 0.00521043136583, 0.00598503437016, 0.00674263382228, 0.00746762900978, 0.00813394580271, 0.00872816241882, 0.00923172752883, 0.00962213514035, 0.00987998925188, 0.00997597519707, 0.0099089475088, 0.00967148628256, 0.00926732537248, 0.0087041251558, 0.00800144191385, 0.0071809988305, 0.00626870037961, 0.00529318556188, 0.00429642334327, 0.00330714703195, 0.0023718347551, 0.0015422154332, 0.000853006625022, 0.00033838584431, 4.53334709259e-5, 0.0, 0.0, 1.04492363518e-19, 3.28855402727e-19, 0.0, 0.0, 4.63798358987e-20, 0.0, 3.97323363439e-20, 2.90325801671e-19, 3.95149936606e-20, 0.0, 0.0, 2.93643160178e-19, 1.58026893759e-19, 2.63497306809e-19, 4.88643757594e-19, 4.00524800711e-19, 3.1208486352e-19, 0.0, 6.9945730853e-19, 5.19050215671e-8, 1.13078898458e-18, 1.36457007803e-18, 3.14882675709e-7, 6.92872950854e-19, 1.18584612616e-18, 1.12239079082e-6, 6.46467213784e-7, 6.74139450422e-7, 9.13799582086e-7, 1.62291512694e-18, 1.23968986092e-6, 1.62628826088e-6, 1.6362240113e-6, 1.3526102775e-6, 1.54244699695e-18 ] }, spectrum_data_point_t { xystar: [0.0, 0.22593929649394454], uv: [6.0, 8.0], spectrum: [ 2.0174225742e-7, 2.10170050037e-19, 0.0, 0.0, 0.0, 0.0, 1.01345040333e-19, 0.0, 1.04855463874e-5, 4.75432124484e-5, 0.000133854793248, 0.000284729339352, 0.00050835374287, 0.000811565295193, 0.00119126405086, 0.00164120829995, 0.00215448081606, 0.00272677187185, 0.00334556613741, 0.00399234227173, 0.00465280313812, 0.00531299122071, 0.00595516127301, 0.00656735544283, 0.00713569512836, 0.00764767442951, 0.00808646741561, 0.00843093852623, 0.00866849036413, 0.00878891817632, 0.00878385210506, 0.00865010843429, 0.0083936771503, 0.00802185615773, 0.00754307903531, 0.00696764185712, 0.006315594587, 0.00560298700222, 0.00485206981614, 0.00408594963247, 0.00332646750341, 0.0026014567884, 0.00193277899591, 0.00133911907324, 0.000841454425851, 0.000453472615449, 0.000183134835826, 3.36503715519e-5, 1.27111135889e-19, 3.36453542162e-19, 2.12407130248e-19, 1.25702482569e-19, 1.63268240341e-19, 2.52425420786e-19, 0.0, 0.0, 0.0, 2.46046557496e-19, 0.0, 1.80364384735e-19, 3.61355478585e-20, 5.18457890325e-20, 0.0, 1.77570716277e-19, 2.01461492549e-19, 1.15514118182e-19, 2.05776066624e-19, 1.50983622848e-19, 4.25475237318e-19, 1.63821465955e-19, 2.69568235464e-19, 2.03261437561e-19, 5.12534342428e-19, 2.11042695934e-7, 5.61726396997e-7, 8.89593672483e-7, 6.75405968361e-7, 2.06071201368e-7, 1.49289556954e-19, 3.56489734831e-7, 2.59927364839e-7 ] }, spectrum_data_point_t { xystar: [0.054611999539184386, 0.22593929649394454], uv: [6.999999999999999, 8.0], spectrum: [ 0.0, 5.83091007189e-8, 5.69914544676e-8, 8.7235589821e-20, 0.0, 0.0, 4.23357394871e-20, 0.0, 1.00537321473e-19, 5.02892080112e-20, 0.0, 0.0, 6.16443087267e-5, 0.000214315452984, 0.000460525268129, 0.000795713167534, 0.00121389026471, 0.00170817467884, 0.00226707644361, 0.00287285096673, 0.00350849467369, 0.00415757932591, 0.00480395283437, 0.00543400231228, 0.00603566234513, 0.00659412814279, 0.00709425696147, 0.00752205285692, 0.00786211724197, 0.00810186530231, 0.00823547306457, 0.00826013736684, 0.00817483811063, 0.00798327906626, 0.00769162757206, 0.00730792982269, 0.00684335211094, 0.0063116930062, 0.00572686975508, 0.00510494512726, 0.00446473261873, 0.00382472528017, 0.00320113821107, 0.00261164259528, 0.00206926822009, 0.00158422944231, 0.00116527315423, 0.000816420471355, 0.000536374474073, 0.000322696989904, 0.000169202964233, 6.89552234426e-5, 1.5061518083e-5, 0.0, 0.0, 1.23870075954e-20, 0.0, 0.0, 1.11455074081e-21, 0.0, 0.0, 0.0, 0.0, 0.0, 1.80740200243e-7, 2.22954811986e-7, 4.5923834441e-7, 3.3021904364e-7, 2.30808678761e-7, 1.47242438181e-19, 2.47411409963e-7, 2.52651567253e-7, 1.42392710292e-7, 3.39141587398e-7, 4.30851077412e-7, 5.42002570397e-7, 6.52034766829e-7, 6.94074271936e-7, 7.96149183052e-7, 8.92049300998e-7, 8.77709473785e-7 ] }, spectrum_data_point_t { xystar: [0.10922399907836883, 0.22593929649394454], uv: [8.0, 8.0], spectrum: [ 4.21913394903e-7, 8.79041152544e-20, 0.0, 0.0, 2.4144528837e-20, 4.97948677704e-20, 1.19987056653e-19, 4.78983607297e-20, 5.63441270706e-20, 7.87222405715e-21, 1.17523488322e-19, 3.83649875941e-20, 0.0, 1.02536512303e-19, 0.0, 6.69712522937e-20, 8.42538462995e-5, 0.000344006772946, 0.000760732391116, 0.00130100742756, 0.00193265668681, 0.00262566420455, 0.00335169917482, 0.0040886612954, 0.00481602344963, 0.00551399884053, 0.00616495549284, 0.00674894610307, 0.00724776951998, 0.00764671494755, 0.00793786197634, 0.00811648666365, 0.00818042435392, 0.00813045928736, 0.00797198851748, 0.00771301144021, 0.00736247007926, 0.00693203695087, 0.00643612729762, 0.00589079426802, 0.00531276681393, 0.00471939405306, 0.00412776589215, 0.00355370296618, 0.00301131856906, 0.00251236590789, 0.00206468802983, 0.00167231616182, 0.00133673201072, 0.00105621366663, 0.000826819959571, 0.000642489299627, 0.000496990482907, 0.000384843300765, 0.000300220947743, 0.000237891283879, 0.000192459475052, 0.000159783145323, 0.000136303331131, 0.000119535743113, 0.000107922024361, 9.955889446e-5, 9.33646234974e-5, 8.84645387886e-5, 8.4933966917e-5, 8.23834535006e-5, 8.04261181935e-5, 7.88317554134e-5, 7.76549578168e-5, 7.68614403582e-5, 7.6554756699e-5, 7.61124919678e-5, 7.56917457626e-5, 7.54689339133e-5, 7.51054863267e-5, 7.51715335682e-5, 7.48603764359e-5, 7.46748410058e-5, 7.46553682777e-5, 7.45513109309e-5, 7.46236061547e-5 ] }, spectrum_data_point_t { xystar: [-0.16383599861755327, 0.28242412061743066], uv: [3.0, 9.0], spectrum: [ 0.0, 5.40638980202e-18, 3.79097030517e-18, 0.0, 0.0, 3.65588574062e-18, 2.3450752937e-18, 0.0, 5.42328368498e-19, 6.10413390233e-19, 0.0, 1.15231008677e-17, 0.0, 0.0, 0.0, 1.5401123701e-18, 1.13526070435e-18, 0.0018606310292, 0.00512513077078, 0.00922286536706, 0.0136229039882, 0.0178599480328, 0.0215558946223, 0.0244275897182, 0.0262363240179, 0.0267812216293, 0.0258902242939, 0.0235101219185, 0.0197662916631, 0.0150087208629, 0.00982081324337, 0.00498247433139, 0.00137654737518, 0.0, 0.0, 2.99706351585e-18, 2.03187410024e-17, 0.0, 0.0, 1.08794156507e-17, 0.0, 0.0, 0.0, 0.0, 6.418695001e-18, 6.03369843634e-18, 0.0, 1.71562159006e-17, 3.67661954042e-18, 5.83616717755e-19, 0.0, 0.0, 8.30479377815e-18, 0.0, 4.13420703492e-18, 0.0, 1.75549242947e-18, 0.0, 1.53168382422e-18, 1.90830344867e-18, 8.09184631019e-19, 1.39554076469e-18, 3.50007817028e-18, 1.24540691789e-18, 1.44565913256e-18, 1.06289088685e-18, 0.0, 6.22511144003e-20, 2.43432973759e-18, 9.71706264603e-20, 0.0, 4.036897289e-18, 4.84159427198e-18, 4.66578111812e-18, 2.4261294153e-18, 5.62126981846e-18, 5.24272312429e-18, 1.16833724037e-18, 3.62953617898e-18, 3.37182640478e-18, 5.08072347351e-18 ] }, spectrum_data_point_t { xystar: [-0.10922399907836886, 0.28242412061743066], uv: [3.9999999999999996, 9.0], spectrum: [ 3.00730998403e-19, 3.56316982458e-19, 0.0, 0.0, 6.2306507841e-19, 3.03152447431e-20, 1.01060290001e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 4.13327465058e-19, 1.72716093828e-18, 0.000346748749437, 0.00113167041717, 0.00230652058811, 0.00380395453246, 0.00553762644701, 0.00740094236316, 0.00928913530358, 0.011108095069, 0.012774127102, 0.0142208738771, 0.0153818611128, 0.0161921692042, 0.0165770370065, 0.0164806687389, 0.0158702788937, 0.0147497987897, 0.0131732037987, 0.0112318399265, 0.00903955455708, 0.00673395619958, 0.00448018982043, 0.00246596200363, 0.000897292801075, 0.0, 1.53257526022e-19, 9.43386752759e-19, 0.0, 7.42309769397e-20, 1.15394705913e-18, 1.24826575038e-18, 7.46302667942e-19, 1.95379559107e-18, 0.0, 0.0, 4.4543038961e-19, 0.0, 0.0, 0.0, 3.39128315882e-19, 4.75979961655e-19, 8.02652414021e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.04751369663e-7, 0.0, 0.0, 1.98870157e-8, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, 0.28242412061743066], uv: [5.0, 9.0], spectrum: [ 7.57292035957e-20, 7.52732853788e-19, 7.97589038632e-19, 6.46994361399e-19, 1.25684377956e-19, 0.0, 0.0, 0.0, 0.0, 3.02751471778e-19, 3.43912812892e-19, 3.959604922e-19, 1.07197340187e-5, 0.000241266822017, 0.000687017135726, 0.00133431730834, 0.00216544913264, 0.00315329058162, 0.00426148328263, 0.00544253416929, 0.00665093925688, 0.00784258176773, 0.00897972796072, 0.0100272998072, 0.0109495752545, 0.0117130871756, 0.0122774734626, 0.0126064672917, 0.0126689409387, 0.0124483462418, 0.011947142067, 0.0111854112849, 0.0101872768478, 0.00899557179493, 0.00765465714475, 0.00622610003527, 0.00477475247047, 0.00337709904641, 0.00211562615352, 0.00107271225829, 0.000338602579869, 0.0, 0.0, 9.12999645599e-19, 0.0, 0.0, 0.0, 0.0, 1.38891275596e-19, 1.62481575619e-19, 3.41771366047e-19, 2.57024136795e-19, 2.50369411189e-19, 0.0, 5.55890333807e-19, 0.0, 0.0, 9.96045949746e-20, 0.0, 0.0, 0.0, 0.0, 0.0, 1.07380144796e-19, 8.17901585076e-20, 1.57700536083e-19, 1.78249812563e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 4.92974990947e-8, 1.97811105507e-8, 1.43130866538e-7, 2.02299362634e-7, 3.32008864541e-7, 3.67843259317e-7, 1.94264526291e-7, 2.73354161192e-7, 3.44352074641e-7 ] }, spectrum_data_point_t { xystar: [0.0, 0.28242412061743066], uv: [6.0, 9.0], spectrum: [ 6.61802184708e-7, 5.04394836815e-7, 1.97825146718e-7, 2.04709059976e-19, 0.0, 1.31747845215e-19, 5.84153580382e-20, 2.63684222702e-20, 0.0, 0.0, 1.66740417461e-19, 0.0, 6.24380370148e-20, 9.72825240113e-5, 0.000368960775949, 0.000804378840019, 0.00139467084639, 0.00212189887813, 0.00296314078482, 0.00388408305091, 0.00485081788101, 0.00582947634265, 0.00679183106046, 0.00771297677575, 0.00856579473681, 0.00932556115362, 0.00996306836228, 0.0104491902937, 0.010761027937, 0.010877430418, 0.0107947060676, 0.0105144387864, 0.0100441697627, 0.00940098717996, 0.00860399784966, 0.00768053586801, 0.00666266070611, 0.00558732781591, 0.00449459632889, 0.00342712866052, 0.00243157161341, 0.00155327329938, 0.000835892703292, 0.000318100346174, 3.21223634966e-5, 0.0, 1.12025785602e-19, 3.11973652159e-19, 3.70677934067e-21, 0.0, 0.0, 0.0, 0.0, 0.0, 1.92853228667e-20, 0.0, 1.52285321399e-19, 1.13246756002e-19, 4.93733266858e-8, 2.9996040988e-8, 1.00945172233e-8, 4.48220966647e-19, 1.1994679198e-7, 3.43658449481e-7, 6.19571013753e-7, 5.21767412854e-7, 7.19963942128e-7, 5.58733038417e-7, 7.76789618379e-7, 1.08680622914e-6, 1.1854628502e-6, 8.62655066776e-7, 9.13978055399e-7, 1.24120563238e-6, 1.0036158403e-6, 7.25423478913e-7, 8.21699323118e-7, 6.02373072106e-7, 4.3804428522e-7, 5.13608489352e-7, 2.70489580131e-7 ] }, spectrum_data_point_t { xystar: [0.054611999539184386, 0.28242412061743066], uv: [6.999999999999999, 9.0], spectrum: [ 0.0, 1.92083412172e-7, 1.16904795978e-19, 0.0, 0.0, 1.86548263929e-19, 0.0, 1.10840212376e-19, 0.0, 4.34548951496e-20, 1.21355802834e-19, 1.63899055637e-20, 0.0, 0.0, 9.86781430993e-20, 8.17420396487e-5, 0.000375187486363, 0.000861530992309, 0.00151436064773, 0.00229570571201, 0.003167027381, 0.00408992367622, 0.00503341585342, 0.00596603994654, 0.006862672521, 0.00769753742515, 0.00844292109482, 0.00907278018588, 0.00956264619838, 0.00989276776823, 0.0100549896741, 0.0100443006402, 0.0098623185847, 0.00951801126762, 0.00902368250213, 0.00839529809601, 0.0076528301214, 0.00682085434301, 0.00592686236388, 0.0050015328825, 0.00407719705132, 0.00318600033, 0.00235978948548, 0.00162605166628, 0.00101111191809, 0.000533865495508, 0.000204017858382, 2.64017136096e-5, 0.0, 3.55357225353e-20, 0.0, 1.74393975263e-19, 6.13011692302e-20, 0.0, 1.13297607006e-19, 1.56171251367e-19, 3.76401262564e-19, 0.0, 1.47133706754e-19, 2.98408802344e-19, 1.47477843245e-19, 2.62978663448e-19, 5.37678322758e-19, 3.5757798749e-19, 3.64146290475e-19, 2.10774353314e-8, 5.29199431901e-19, 3.30887055813e-19, 4.50749083595e-19, 1.20279392449e-7, 4.09135916891e-19, 1.77867097494e-7, 4.46630189094e-7, 2.06868628067e-7, 3.01304981596e-7, 5.63581992211e-7, 6.13185061189e-7, 6.1752419189e-7, 7.90241956453e-7, 8.5779437675e-7, 1.07451267222e-6 ] }, spectrum_data_point_t { xystar: [0.10922399907836883, 0.28242412061743066], uv: [8.0, 9.0], spectrum: [ 2.31373773206e-19, 2.66034702223e-20, 1.23690456243e-20, 6.12492627809e-20, 8.50070507806e-20, 1.13277060005e-19, 4.43637521591e-19, 0.0, 1.26152539765e-18, 2.27943504313e-19, 0.0, 4.7545973389e-19, 1.05018533903e-20, 0.0, 0.0, 4.63799339497e-20, 4.46258545057e-19, 1.58757139277e-19, 0.0, 6.28210262341e-6, 0.000435425900031, 0.00117048473427, 0.00211522586906, 0.00318936658476, 0.00432978507354, 0.00548081971868, 0.00659071361738, 0.0076104493537, 0.00849686555039, 0.00921423312209, 0.00974130214451, 0.0100659830518, 0.0101866339112, 0.0101072343857, 0.00983383232542, 0.00938257076723, 0.00877472861586, 0.00803644177781, 0.00719442024366, 0.00628093862922, 0.00533077602033, 0.00438267327784, 0.00346954276415, 0.0026200001667, 0.00186498119347, 0.00122502048207, 0.000714338096734, 0.000339775721961, 0.000103327523389, 0.0, 6.74941725571e-20, 8.11994368614e-20, 1.18480520166e-19, 0.0, 0.0, 0.0, 0.0, 1.058220135e-19, 0.0, 3.49256066233e-20, 0.0, 2.16949958168e-20, 1.84696076612e-20, 6.52788491424e-20, 0.0, 3.32376845878e-7, 4.02241202854e-20, 3.14300694718e-7, 4.18608498743e-7, 0.0, 5.61781809452e-7, 1.97118008289e-7, 0.0, 1.07065410249e-6, 1.10072072249e-6, 2.34758903268e-7, 5.93297878948e-7, 6.46293368442e-7, 7.103818921e-7, 9.49057756177e-7, 1.08387246588e-6 ] }, spectrum_data_point_t { xystar: [-0.16383599861755327, 0.33890894474091676], uv: [3.0, 10.0], spectrum: [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.10183188095e-19, 0.0, 6.22878967624e-18, 0.0, 2.00214405627e-17, 2.45445828631e-17, 3.10288828689e-18, 0.0, 0.0, 0.0, 1.12193710768e-17, 1.31700199555e-18, 5.77682426923e-18, 0.00262253007048, 0.00941019242549, 0.0180367507612, 0.0266018315085, 0.0337382268519, 0.0384038300368, 0.0398322782868, 0.037513974516, 0.0314746549639, 0.0225172017541, 0.0123904818394, 0.00375536797553, 1.0115913883e-17, 0.0, 0.0, 0.0, 0.0, 3.17397014961e-17, 1.86758059803e-17, 7.82615951541e-18, 6.85444090872e-17, 1.31489674273e-17, 1.21334795842e-17, 0.0, 3.85456080126e-17, 1.0974458023e-16, 8.25675454905e-19, 0.0, 0.0, 0.0, 4.2195969464e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.02181226917e-18, 2.73609295482e-18, 0.0, 3.75341702877e-19, 2.36618906657e-18, 1.13537378421e-17, 4.34387619627e-18, 4.47297747457e-18, 4.60108792392e-18, 8.59598487671e-18, 8.2335530463e-18, 1.04012657485e-18, 1.8120935944e-18, 3.89843803535e-18, 1.01677589344e-17, 5.61735790949e-18, 2.39972500764e-18, 4.23796082009e-18, 5.84601175326e-18, 2.30392644615e-18, 8.37371893909e-18, 8.46429436279e-18 ] }, spectrum_data_point_t { xystar: [-0.10922399907836886, 0.33890894474091676], uv: [3.9999999999999996, 10.0], spectrum: [ 0.0, 0.0, 3.64421863289e-19, 1.5768013001e-18, 0.0, 3.89771418036e-19, 3.82470574833e-19, 0.0, 0.0, 0.0, 2.39068910148e-18, 4.65822589427e-19, 0.0, 2.56490204354e-18, 0.0, 7.55391667828e-19, 7.92993153796e-5, 0.00132833222928, 0.0035085800684, 0.00630580197011, 0.00942252857371, 0.012587067184, 0.01557084108, 0.0181871202621, 0.0202729729598, 0.0216735231307, 0.0222404122576, 0.0218654759367, 0.0205106620591, 0.0182370048605, 0.0152160051788, 0.0117092907724, 0.00803489253651, 0.00457015046398, 0.00174641090244, 4.72299288342e-5, 2.07049116066e-18, 0.0, 0.0, 0.0, 4.66152984291e-18, 0.0, 0.0, 2.11326176984e-18, 6.71206928174e-18, 2.50974857456e-18, 6.53738361899e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.07448841641e-19, 2.37207416489e-18, 5.79605911622e-19, 0.0, 9.34505169046e-19, 3.1597856761e-19, 6.18681265312e-19, 1.03311744307e-18, 1.45725593136e-18, 2.8405812309e-18, 2.33566914545e-18, 1.0075931809e-18, 1.61488308474e-18, 1.52449599038e-18, 8.97894975302e-19, 6.22891202293e-19, 2.05299908473e-18, 1.96048615229e-18, 2.25425598364e-18, 1.80905466007e-18, 2.80883021965e-18, 1.83996731967e-18, 2.8576774058e-18, 3.25775231221e-18, 2.41997313031e-18, 2.39456214189e-18, 2.69880913684e-18, 1.88676589001e-18 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, 0.33890894474091676], uv: [5.0, 10.0], spectrum: [ 8.54200800672e-19, 4.7405807764e-19, 6.58905854975e-19, 0.0, 9.95394892463e-19, 4.92281795371e-19, 0.0, 4.94243113564e-19, 5.22311249785e-20, 0.0, 0.0, 0.0, 1.7501375963e-18, 1.69532453474e-18, 0.0, 6.19277927485e-5, 0.00066087425909, 0.00172476096042, 0.00316799709797, 0.00487646531872, 0.00673155423252, 0.00862954715367, 0.0104715574683, 0.0121798537796, 0.0136801805622, 0.0149013133731, 0.0157669380774, 0.0162094774248, 0.0161771545314, 0.0156531846534, 0.0146597088809, 0.0132480749759, 0.0114937718101, 0.00949413315908, 0.007359969543, 0.00522641183257, 0.00325034789156, 0.00159794878128, 0.000452717804744, 4.23039648486e-19, 0.0, 0.0, 2.67559407185e-19, 1.55215689656e-20, 0.0, 1.43727943682e-18, 1.34648832452e-18, 5.42156233234e-19, 0.0, 1.32815360831e-19, 0.0, 0.0, 1.4052557702e-18, 0.0, 0.0, 0.0, 3.38122472378e-20, 0.0, 0.0, 5.35569612127e-19, 5.5714886613e-19, 3.50950846698e-19, 0.0, 6.73844693076e-19, 7.93191941813e-19, 2.3683129416e-19, 0.0, 1.30253994965e-19, 0.0, 7.09834254458e-19, 1.27222481653e-18, 0.0, 0.0, 0.0, 5.27860344817e-19, 0.0, 5.44789528737e-8, 6.7455586337e-19, 4.940525233e-7, 5.61291881634e-8, 2.24420297752e-7 ] }, spectrum_data_point_t { xystar: [0.0, 0.33890894474091676], uv: [6.0, 10.0], spectrum: [ 7.07092679493e-19, 7.45260839054e-19, 5.07916211955e-19, 1.39767069705e-20, 2.54565896015e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 1.40225062424e-19, 0.0, 0.0, 8.39781976816e-19, 0.0, 3.12167343192e-19, 0.000270989836599, 0.00092002311246, 0.00189258944265, 0.00311076320993, 0.00448441976452, 0.00593897874236, 0.00740905055683, 0.00883462550218, 0.0101642915605, 0.0113443029013, 0.0123209865309, 0.0130399666995, 0.0134613713304, 0.0135565922827, 0.0133193902438, 0.0127631905995, 0.0119106732058, 0.0108008973017, 0.00947420322866, 0.00799638086706, 0.00643658937707, 0.00486658835213, 0.00337511539639, 0.00204863699656, 0.000985694279395, 0.000275575557673, 0.0, 8.32875048698e-20, 2.92849117256e-20, 7.37719684244e-19, 2.67673588013e-19, 2.68209590434e-20, 0.0, 0.0, 1.00070800105e-18, 2.63275824935e-19, 0.0, 4.10847826905e-19, 3.33986398028e-20, 2.5158626774e-19, 0.0, 8.13896677264e-21, 0.0, 0.0, 6.52929181465e-19, 8.24188394269e-19, 8.80644424712e-19, 4.46952023249e-19, 8.08219235543e-19, 5.02611119771e-19, 4.17928574007e-19, 0.0, 6.68972540215e-19, 6.47444304939e-19, 1.02118189983e-18, 7.32026153592e-7, 1.92406322534e-7, 4.78573615199e-19, 8.74832009928e-7, 2.11466891187e-7, 1.03909766804e-18, 1.84674576273e-7, 2.00002016713e-7, 1.40205128594e-18, 6.82087376686e-7 ] }, spectrum_data_point_t { xystar: [0.054611999539184386, 0.33890894474091676], uv: [6.999999999999999, 10.0], spectrum: [ 0.0, 0.0, 0.0, 4.48229998564e-20, 0.0, 1.46988330187e-19, 0.0, 0.0, 0.0, 7.1793064613e-19, 0.0, 0.0, 4.66323447543e-20, 1.36478489986e-18, 1.15650076291e-18, 2.20644485762e-19, 0.0, 0.0, 0.000241205142551, 0.000928416094249, 0.0019437484852, 0.00318339028338, 0.00455226082949, 0.00597853190677, 0.00738805963278, 0.0087272065947, 0.00993469771355, 0.0109533740172, 0.0117383374258, 0.0122469061049, 0.0124627239684, 0.0123887966016, 0.0120268867795, 0.0113988711276, 0.0105348687458, 0.00947057774119, 0.00824896163386, 0.00692104210966, 0.00555557648967, 0.00420364168517, 0.00293358324211, 0.00182755351608, 0.000925562922255, 0.000304854814874, 1.42593018648e-19, 7.07122753194e-19, 0.0, 0.0, 0.0, 6.41488694753e-19, 9.537859504e-19, 0.0, 0.0, 1.06270404557e-19, 0.0, 8.31690363523e-20, 2.4806442944e-19, 8.67507768151e-19, 2.83242974598e-19, 4.22016079989e-19, 0.0, 5.92740648049e-19, 1.05953974567e-18, 7.73756907064e-19, 1.30019972476e-18, 8.4111405583e-19, 1.27054942088e-18, 1.07942044097e-18, 1.12265072601e-18, 1.83446670137e-18, 7.86308812203e-7, 5.47186382558e-7, 1.54555422535e-18, 1.76983610722e-6, 1.61059921815e-6, 1.06311103203e-18, 1.84378810307e-6, 1.16369049393e-6, 7.7964998179e-9, 1.56342212404e-6, 5.64836426902e-7 ] }, spectrum_data_point_t { xystar: [0.10922399907836883, 0.33890894474091676], uv: [8.0, 10.0], spectrum: [ 4.54795448894e-18, 4.05613172572e-18, 1.76599797167e-17, 5.73050971753e-19, 6.88291149196e-19, 0.0, 0.0, 4.21117137951e-18, 0.0, 0.0, 1.40145252626e-17, 0.0, 4.31357694498e-18, 3.12568417858e-17, 8.42784101866e-19, 4.57534365956e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.59357581974e-17, 0.000966451398451, 0.00303382650674, 0.00565997155596, 0.00836767094471, 0.0108097051031, 0.0127848008516, 0.0141731704053, 0.0149066053916, 0.014966449472, 0.0143798754193, 0.0132145658759, 0.011571953371, 0.00958570395488, 0.00741162879427, 0.00522295681663, 0.00320503350913, 0.00154689356277, 0.000425090444686, 0.0, 7.98683409882e-18, 0.0, 0.0, 1.07509763987e-18, 5.94542792644e-18, 0.0, 1.25345488663e-17, 7.08773566664e-18, 8.4783253258e-18, 1.11143243148e-18, 0.0, 1.2187549346e-18, 6.59186575997e-19, 1.34425633436e-18, 1.33849349353e-18, 1.68850485519e-18, 3.05575695107e-18, 1.84835719544e-18, 1.05964892456e-18, 1.07799228883e-18, 1.65487384637e-18, 1.87819921196e-18, 3.31047481185e-18, 3.53579836876e-18, 3.72556853938e-18, 4.10221488321e-18, 4.38174695662e-18, 3.15753648725e-18, 4.73625792585e-18, 2.69499539836e-18, 3.87491103589e-19, 4.15140920517e-19, 8.92560968169e-20, 1.33337148412e-7, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.16383599861755327, 0.395393768864403], uv: [3.0, 11.0], spectrum: [ 1.09257509883e-16, 4.81642433672e-16, 2.86958382618e-16, 0.0, 0.0, 5.08822773798e-18, 1.21906079306e-17, 1.64463469709e-16, 3.32697772125e-17, 0.0, 0.0, 0.0, 2.07274335622e-16, 2.27895275643e-16, 0.0, 0.0, 2.20088402543e-16, 0.0, 0.0, 0.0, 5.9350642001e-17, 3.09535737057e-18, 0.0179615829772, 0.0437873594427, 0.064545914329, 0.0718821518494, 0.0617961871737, 0.0368302305873, 0.00874221859225, 1.68970462155e-16, 9.06189439253e-16, 0.0, 0.0, 0.0, 0.0, 1.05659083048e-15, 0.0, 0.0, 4.02748449369e-16, 0.0, 0.0, 5.26448992742e-16, 0.0, 1.93369511633e-16, 0.0, 9.58855916149e-16, 9.05892281937e-16, 1.82351096149e-16, 5.75174985315e-16, 0.0, 0.0, 1.2784221253e-16, 1.65546091859e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 9.39769974228e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 1.239056335e-17, 6.38299507721e-18, 0.0, 9.16347098997e-19, 1.36179624017e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.02969697325e-17, 1.2554405157e-17 ] }, spectrum_data_point_t { xystar: [-0.10922399907836886, 0.395393768864403], uv: [3.9999999999999996, 11.0], spectrum: [ 0.0, 1.11933150362e-18, 0.0, 0.0, 0.0, 0.0, 5.34012333426e-19, 0.0, 0.0, 4.15702695384e-18, 0.0, 1.65258441434e-17, 9.68357512311e-18, 0.0, 0.0, 3.78711436039e-19, 5.47878978392e-18, 0.0, 8.07957272606e-18, 0.00206379606169, 0.00629951649421, 0.0116780401358, 0.0173306927649, 0.0225871556217, 0.0268930441435, 0.0297844249851, 0.0308565857834, 0.0298544594983, 0.0267550283348, 0.0218485937014, 0.0157668525926, 0.00940687834093, 0.00382627658408, 0.000234888614935, 5.44771073058e-18, 0.0, 0.0, 6.37913742661e-18, 1.0243374251e-17, 9.51702909189e-18, 0.0, 2.14720955539e-17, 2.25412999684e-17, 1.11611209012e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 4.90403175879e-18, 0.0, 1.31368340164e-17, 0.0, 2.04055390252e-18, 2.28859272905e-18, 7.43206505809e-18, 0.0, 1.4643908319e-18, 2.5526348031e-18, 1.45279903727e-18, 8.44821047427e-19, 6.89150125706e-19, 0.0, 1.88781055972e-19, 0.0, 2.41226356749e-19, 0.0, 1.00480919216e-18, 1.82633385178e-18, 1.01467373899e-18, 1.44804428099e-18, 3.46128775899e-18, 5.40158581683e-18, 1.72687683335e-18, 3.48223925237e-18, 1.80801333832e-18, 3.32389074202e-18, 8.13522206279e-19, 3.96436392418e-18, 0.0, 3.44766232334e-18 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, 0.395393768864403], uv: [5.0, 11.0], spectrum: [ 2.92092847556e-18, 2.33171391612e-18, 0.0, 0.0, 1.79832861724e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0183779081e-18, 0.0, 3.42014616844e-18, 0.0, 7.22555359434e-19, 0.0, 1.22310081882e-18, 0.0, 0.000814426861543, 0.00269109895638, 0.00527793692024, 0.00825160418219, 0.011333179011, 0.014295573569, 0.0169404659571, 0.019088527838, 0.0205686839214, 0.0212383936378, 0.0210032906842, 0.0198508632315, 0.0178638065047, 0.0152012419632, 0.0120727297687, 0.00873509689335, 0.00549277880905, 0.00269093710335, 0.000717842671042, 0.0, 0.0, 2.80597530456e-18, 5.23127904473e-19, 0.0, 1.49337571699e-18, 0.0, 2.62183688851e-18, 2.17586367255e-18, 0.0, 0.0, 0.0, 1.72297262818e-18, 0.0, 7.90249769121e-19, 4.06358539891e-19, 1.80338595195e-18, 0.0, 1.40978714958e-18, 1.15571286057e-18, 8.52076463783e-20, 0.0, 3.20049836474e-19, 8.52084651253e-19, 3.79104056633e-19, 2.35937427845e-19, 7.57625057054e-19, 1.59516365301e-19, 1.15330432346e-18, 8.88128029202e-19, 6.6370816837e-19, 1.41679355031e-18, 1.76647505334e-18, 1.68873889186e-18, 1.89227452954e-18, 1.88793056031e-18, 1.96010284319e-18, 9.69998385563e-19, 1.51195381085e-19, 2.31932343683e-18, 2.01255028268e-18, 1.47862322356e-7, 1.32772414482e-18, 4.3181739651e-18 ] }, spectrum_data_point_t { xystar: [0.0, 0.395393768864403], uv: [6.0, 11.0], spectrum: [ 1.69417341016e-19, 1.52064615538e-18, 4.58485220328e-19, 3.21420042668e-19, 2.19331256233e-19, 1.46246863133e-19, 1.72702597469e-19, 5.39367386263e-19, 7.6283144781e-20, 0.0, 1.58185682857e-20, 4.07851688047e-19, 2.35256766751e-18, 0.0, 1.21143275761e-18, 1.0371116701e-18, 2.4144155246e-19, 0.0, 0.000134516504783, 0.00115233960685, 0.00280659710099, 0.0048701534114, 0.00714011578665, 0.00945614539795, 0.0116749820078, 0.0136729068322, 0.01532604901, 0.0165228051303, 0.017172667355, 0.0172239058363, 0.0166796489067, 0.0155830060386, 0.0140017171368, 0.0120291144533, 0.00978544796488, 0.00741519990991, 0.0050802544822, 0.00296644078672, 0.00127352744436, 0.000213812923643, 1.7471716129e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 2.31371115364e-19, 6.55545181469e-19, 5.38267060664e-19, 9.50658531625e-19, 0.0, 3.94788360428e-19, 3.12351109861e-19, 0.0, 3.92247940242e-19, 4.80012922916e-20, 8.82313723023e-19, 6.5004371025e-19, 1.54934030612e-19, 0.0, 1.10579060567e-18, 1.52039265105e-19, 8.36876025323e-19, 5.79766221322e-19, 5.11675871171e-19, 4.68514989512e-19, 0.0, 0.0, 9.03198727406e-19, 0.0, 4.97044413327e-19, 9.53388201323e-20, 9.55444185584e-8, 7.21744646467e-19, 1.16801164876e-7, 2.73232259582e-8, 0.0, 1.03202943675e-7, 1.67561990597e-7, 3.23471550501e-7, 0.0 ] }, spectrum_data_point_t { xystar: [0.054611999539184386, 0.395393768864403], uv: [6.999999999999999, 11.0], spectrum: [ 0.0, 3.20212887661e-19, 5.12427074349e-19, 0.0, 0.0, 0.0, 0.0, 1.66280801278e-19, 0.0, 3.87435299857e-18, 0.0, 0.0, 6.31310213024e-18, 0.0, 0.0, 0.0, 0.0, 3.00536596386e-18, 4.51338586286e-18, 0.0, 1.65889016729e-18, 0.00046552066355, 0.00188449268829, 0.00391437036935, 0.00627397159803, 0.00873387446399, 0.0110923196571, 0.0131608389518, 0.0147754701081, 0.015824455953, 0.0162643953515, 0.0160960803895, 0.0153469731751, 0.0140747120851, 0.0123658505069, 0.0103304436406, 0.00810380572284, 0.00584120420266, 0.00371310265504, 0.00190508545341, 0.000605329015392, 2.2400604973e-18, 7.40136092994e-19, 1.43630600416e-18, 1.96042678627e-18, 2.38168975948e-19, 2.35821603619e-18, 0.0, 0.0, 0.0, 6.06544434873e-20, 1.50660900227e-18, 4.27499715313e-19, 0.0, 4.30784291968e-19, 2.16708041448e-18, 6.25424725459e-19, 0.0, 9.42866430381e-19, 1.19176670244e-18, 1.71421688143e-18, 6.94815021938e-19, 1.83927211833e-18, 0.0, 1.48074270026e-18, 1.92254591163e-18, 1.60140499952e-18, 1.61166218776e-18, 1.52379298145e-18, 1.13580084567e-18, 3.90852765599e-19, 2.69189607791e-18, 1.89401860962e-18, 1.42642995296e-18, 6.13809783872e-8, 2.07523072077e-18, 1.72964127829e-18, 1.48442524006e-18, 2.24040214549e-19, 2.47545378835e-18, 2.76250179057e-7 ] }, spectrum_data_point_t { xystar: [-0.10922399907836886, 0.45187859298788907], uv: [3.9999999999999996, 12.0], spectrum: [ 5.10322970972e-17, 3.1984680414e-17, 1.91897358802e-17, 0.0, 0.0, 5.52073557066e-19, 2.7450854699e-18, 0.0, 1.04299935282e-17, 0.0, 0.0, 0.0, 9.16460814286e-17, 1.51102358421e-18, 4.6606734707e-17, 3.0214816869e-17, 4.18892236822e-17, 0.0, 0.0, 2.13301176864e-17, 0.0, 0.00252483673143, 0.0118795873382, 0.0238817562668, 0.0352896620212, 0.043603741295, 0.0469031352686, 0.0441111771058, 0.0354091975219, 0.0226228177266, 0.00923491481519, 2.61196274884e-17, 0.0, 0.0, 0.0, 4.38109436461e-17, 0.0, 0.0, 5.54953583576e-17, 0.0, 9.62209437669e-17, 0.0, 8.22890849435e-18, 6.57706458566e-17, 4.43511251827e-18, 0.0, 2.07220838685e-16, 0.0, 0.0, 0.0, 3.54345406497e-17, 0.0, 0.0, 0.0, 0.0, 1.63760748034e-17, 1.87411566267e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.58910925116e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, 0.45187859298788907], uv: [5.0, 12.0], spectrum: [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.44263588095e-17, 0.0, 1.77618821449e-17, 3.80908320661e-19, 0.0, 2.20379367851e-17, 0.0, 7.20337814011e-18, 0.0, 0.0, 0.0, 0.000839749208003, 0.00433354066664, 0.00930758170203, 0.0148398802156, 0.0201793740441, 0.0247007954971, 0.0278550431796, 0.0292079418147, 0.0285127028067, 0.0258024849227, 0.0214240512226, 0.0159591917684, 0.0101409022829, 0.00484315492935, 0.00108071967134, 1.03104584515e-17, 2.06295782595e-18, 7.69259049884e-18, 3.89110874029e-18, 0.0, 0.0, 2.3273966035e-17, 7.35550816628e-18, 2.86305568038e-18, 0.0, 0.0, 1.32062980688e-17, 1.15161925698e-18, 0.0, 1.76259135678e-18, 7.49525654088e-18, 8.66079097807e-19, 0.0, 0.0, 0.0, 3.6435991575e-18, 0.0, 1.09602476123e-18, 5.24498323065e-19, 9.41977752923e-19, 0.0, 2.38431961276e-18, 1.5365994542e-18, 0.0, 1.77164491291e-18, 0.0, 0.0, 6.8905346627e-20, 2.77843773007e-18, 1.34067495594e-21, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [0.0, 0.45187859298788907], uv: [6.0, 12.0], spectrum: [ 7.79420686093e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.68025853611e-19, 7.13831323523e-18, 1.16525706401e-17, 4.53180319521e-18, 0.0, 0.0, 0.0, 0.0, 7.46660056019e-18, 5.61188616576e-18, 0.0, 3.41019890177e-18, 0.0, 0.00101647261779, 0.00376169787902, 0.00749827415762, 0.011629608743, 0.0156626925376, 0.0191662503232, 0.0217579959148, 0.0231437971625, 0.0231801100955, 0.0219042040229, 0.0194794239739, 0.0161476187929, 0.0122432891689, 0.0081642289982, 0.00439253257591, 0.0014696600049, 1.8855009376e-18, 2.7578266753e-18, 0.0, 6.40655431208e-18, 0.0, 4.89518270812e-18, 6.04047466445e-18, 6.61583022459e-18, 0.0, 5.17446932132e-19, 0.0, 3.92074657769e-19, 3.17162627728e-19, 1.65630662746e-18, 0.0, 5.7363840438e-20, 3.34625311211e-18, 4.33676537014e-20, 0.0, 0.0, 0.0, 0.0, 3.02743416246e-19, 0.0, 0.0, 8.25390715111e-19, 3.31068583769e-19, 0.0, 2.63469399605e-19, 0.0, 3.55531626399e-19, 6.49407294855e-19, 1.10525238382e-18, 0.0, 0.0, 2.31388480138e-19, 8.53005580957e-19, 0.0, 5.61371085793e-19, 0.0, 7.37269117283e-7, 4.78926105395e-20, 8.65773551212e-19, 4.83468217328e-8 ] }, spectrum_data_point_t { xystar: [0.054611999539184386, 0.45187859298788907], uv: [6.999999999999999, 12.0], spectrum: [ 3.7958994134e-17, 0.0, 7.2630274982e-17, 1.94925070461e-18, 0.0, 9.68649352526e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.55909024599e-18, 6.6269167129e-17, 2.39739407069e-17, 6.04932177904e-17, 0.0, 1.09027955613e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 7.50769328961e-18, 0.0, 4.38175547014e-18, 0.00445918711721, 0.0116867338701, 0.0189096373051, 0.0242917448172, 0.0270258549444, 0.0269164158114, 0.0241343122798, 0.0192118370937, 0.0130236312018, 0.00674793245384, 0.00184392689362, 0.0, 1.91021660042e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.36634970812e-17, 3.30036116925e-17, 5.17844649204e-17, 4.9153623329e-17, 1.74795681383e-17, 1.28452118759e-17, 1.23611223692e-17, 0.0, 2.17853035095e-18, 0.0, 0.0, 0.0, 1.00524584904e-17, 2.53690721039e-17, 6.60832304822e-18, 1.58076654468e-17, 2.89521272058e-17, 0.0, 0.0, 9.30896479455e-18, 1.13613317492e-17, 1.51272881431e-18, 8.37949976152e-19, 7.06947046093e-18, 2.94859994909e-18, 5.00455310754e-18, 2.77909824869e-18, 0.0, 0.0, 8.05634211957e-18, 9.67656612816e-18, 4.4270529574e-18, 1.06617730828e-17, 1.20765722455e-17, 7.37935355514e-7 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, 0.5083634171113752], uv: [5.0, 13.0], spectrum: [ 2.29702870014e-17, 3.55320953493e-17, 2.45080012414e-17, 0.0, 2.18682930421e-18, 0.0, 1.67525845147e-18, 3.58576205696e-18, 0.0, 1.44199618562e-16, 0.0, 7.94324710254e-17, 9.27992243121e-17, 5.30470243548e-17, 0.0, 0.0, 0.0, 0.0, 3.07116532335e-17, 4.55861893302e-17, 0.0, 0.0, 8.10764913042e-17, 0.00522146233622, 0.0169092359245, 0.0301108996308, 0.0408532671093, 0.0460865281035, 0.0441569949205, 0.0354247623204, 0.0223496658039, 0.00890932080935, 0.0, 0.0, 0.0, 1.52099701664e-17, 6.52015259592e-18, 0.0, 3.05216737775e-17, 4.94566049892e-17, 0.0, 0.0, 8.58733946611e-17, 0.0, 0.0, 0.0, 1.86897584401e-17, 0.0, 7.05265306253e-17, 0.0, 8.33336025788e-18, 1.12087957608e-16, 1.89176398544e-17, 2.06702315231e-17, 4.65906462632e-17, 0.0, 3.60073953035e-17, 8.72187984542e-18, 6.9710400256e-18, 4.81459031089e-18, 0.0, 0.0, 5.26319179545e-18, 0.0, 0.0, 1.03141402209e-17, 0.0, 0.0, 0.0, 0.0, 1.04234387508e-17, 1.34459834792e-17, 1.18885690388e-17, 0.0, 0.0, 4.40695822989e-18, 1.1207638957e-17, 1.72388860734e-17, 1.1130864521e-17, 1.27644491506e-17, 1.00120341893e-17 ] }, spectrum_data_point_t { xystar: [0.0, 0.5083634171113752], uv: [6.0, 13.0], spectrum: [ 0.0, 6.65246068751e-17, 1.10391230502e-16, 1.31295745213e-17, 4.43770580676e-18, 1.39674343078e-17, 5.11932721054e-18, 2.73715249786e-17, 1.54559946027e-17, 4.75678167839e-17, 5.61720819121e-17, 0.0, 0.0, 0.0, 5.37186817957e-18, 0.0, 0.0, 1.32590768238e-16, 8.34550416772e-17, 0.0, 5.3241113977e-17, 5.35860970029e-17, 2.81223517282e-17, 1.44983149141e-18, 0.000823075389301, 0.00943263596448, 0.0210265313527, 0.0314666711465, 0.0376453141446, 0.0381046284009, 0.0331557426235, 0.024294707718, 0.0137564470958, 0.0044595663871, 2.3481998511e-17, 0.0, 3.3454817154e-18, 1.96931117254e-18, 0.0, 0.0, 3.89114544572e-17, 0.0, 8.26657997198e-17, 0.0, 6.80120453366e-17, 0.0, 0.0, 0.0, 0.0, 3.27682143299e-17, 0.0, 0.0, 3.29232181995e-17, 4.85073244613e-17, 0.0, 1.89181923757e-17, 1.37686296634e-17, 3.57540377825e-17, 1.2925834341e-17, 3.10551809457e-18, 2.50155389724e-18, 0.0, 7.22474978301e-19, 1.369944539e-17, 0.0, 0.0, 6.66321719372e-18, 9.05921427072e-18, 1.45769800638e-19, 0.0, 1.08879187166e-17, 5.3844328188e-18, 7.68845376826e-18, 9.88221941605e-18, 6.41882379988e-18, 4.1640139687e-18, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.2730601043599837, -0.22593929649394454], uv: [0.9999980468750005, 0.0], spectrum: [ 0.025458568698, 0.0254522907037, 0.0254350759272, 0.0253976554885, 0.0253239131175, 0.025181959663, 0.024930444763, 0.0244766041004, 0.0236680861767, 0.0222722028285, 0.0200261960681, 0.0168335355523, 0.0128503726222, 0.00847601270268, 0.00430773971387, 0.0011501996693, 0.0, 3.49224861096e-19, 2.83282269904e-18, 3.64589712698e-18, 1.05629785327e-18, 7.33857384866e-18, 0.0, 3.20616251913e-17, 0.0, 1.78543677294e-18, 8.34074991691e-17, 1.38565681533e-18, 0.0, 0.0, 2.73379727277e-17, 0.0, 1.35763670728e-17, 4.06451502046e-17, 0.0, 1.09428735223e-17, 0.0, 0.0, 4.54273212192e-18, 0.0, 4.59320784997e-18, 3.24804040306e-18, 0.0, 1.45719641965e-18, 1.18925375581e-17, 3.79347085933e-18, 8.10744949464e-18, 9.4911197767e-18, 9.58634869442e-18, 9.80058091678e-18, 9.29623971271e-18, 4.49946261274e-18, 0.000222156168043, 0.000780511862472, 0.00142594745134, 0.00203304525644, 0.00254857679431, 0.00295989797031, 0.00327842431908, 0.00351965880673, 0.00369931535729, 0.00382939945648, 0.00392209274448, 0.00398808765363, 0.00403499242544, 0.00406825696207, 0.00409195119678, 0.00410832738755, 0.00411979507489, 0.00412790912725, 0.00413342988336, 0.0041371254824, 0.0041396717457, 0.00414136171983, 0.00414247669735, 0.0041434630639, 0.00414385912547, 0.00414403175741, 0.00414404302662, 0.0041439979421, 0.00414394822128 ] }, spectrum_data_point_t { xystar: [-0.29433958464917753, -0.1694544723704584], uv: [0.6103496093750023, 1.0], spectrum: [ 0.00280771860646, 0.00280906543723, 0.00281342940028, 0.00282571779213, 0.00284916782655, 0.00289029215394, 0.00296006720587, 0.00308489676504, 0.00330181647043, 0.00366577522555, 0.00424577784394, 0.00507815252025, 0.00614802103695, 0.00740142066712, 0.00873800288285, 0.0100213719543, 0.0110836680854, 0.011738379582, 0.0118360730956, 0.0113001874502, 0.0101379189077, 0.00843758082973, 0.00635027929827, 0.00411031486384, 0.00202172151668, 0.000474489247833, 0.0, 1.76972626909e-18, 0.0, 0.0, 9.64072922949e-19, 6.95599799609e-18, 1.02606950418e-17, 3.06295173928e-18, 5.66153456149e-19, 0.0, 0.0, 5.99261203803e-18, 0.0, 1.09222234244e-17, 0.0, 8.27231846708e-18, 6.37859817249e-18, 0.0, 0.0, 6.78342993486e-18, 0.0, 1.07361500509e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.03079075276e-18, 0.0, 0.0, 0.0, 1.84976792439e-20, 0.0, 0.0, 0.0, 0.0, 0.0, 1.97854308871e-20, 0.0, 1.32184899746e-19, 0.0, 0.0, 3.87757938731e-7, 0.0, 0.0, 0.0, 3.17456176347e-19, 1.77622189228e-7 ] }, spectrum_data_point_t { xystar: [-0.29625953775797703, -0.11296964824697227], uv: [0.5751933593750014, 2.0], spectrum: [ 8.40054425038e-18, 0.0, 7.99007468102e-19, 1.93292552458e-18, 2.59882484002e-17, 3.48110434946e-19, 0.0, 4.6688644902e-18, 2.64328639104e-19, 2.55809861366e-19, 0.0, 0.0, 1.96249466248e-17, 0.000553304367836, 0.00318802839749, 0.00728062875434, 0.0120562361625, 0.0166262431958, 0.0201495723771, 0.0219829551186, 0.02179739411, 0.0196038845158, 0.0156787350543, 0.0106622256279, 0.0054653805916, 0.00132773345356, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.86091636623e-17, 0.0, 3.69986205597e-17, 0.0, 0.0, 8.77326349187e-17, 0.0, 3.70282900141e-17, 7.70760446269e-17, 0.0, 0.0, 0.0, 0.0, 8.31657390006e-17, 0.0, 0.0, 1.93563147604e-17, 4.30166712105e-17, 0.0, 1.43699504269e-17, 0.0, 0.0, 0.0, 0.0, 8.21058955597e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 3.1732409973e-18, 0.0, 1.25780440695e-18, 0.0, 0.0, 0.0, 0.0, 5.72087471549e-19, 5.48920920802e-19, 0.0, 3.2298674589e-18, 6.75856130536e-18, 1.02918517601e-17, 1.31663110293e-17, 1.26992544264e-17, 1.42465572408e-17, 1.07196472306e-17, 1.25547469676e-17 ] }, spectrum_data_point_t { xystar: [-0.29204630732477826, -0.056484824123486134], uv: [0.6523417968750005, 3.0], spectrum: [ 1.77581253401e-16, 2.66794698842e-17, 0.0, 8.0070909039e-18, 0.0, 4.15316822345e-18, 1.01715765886e-18, 3.46144629307e-18, 0.0, 0.0, 0.0, 0.0, 3.18373955135e-17, 2.0986803773e-17, 0.0, 5.36199523164e-18, 0.00431971649893, 0.0120226971156, 0.0205647438168, 0.0275905007363, 0.0314816634358, 0.0314572903172, 0.0274419820826, 0.0203124041528, 0.0116175863781, 0.00368153420424, 8.05545806103e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.68426495543e-17, 1.24755207593e-16, 2.75024044355e-16, 1.11389614129e-16, 0.0, 0.0, 3.07627251388e-17, 0.0, 4.8071840656e-17, 3.11009065187e-16, 0.0, 0.0, 0.0, 1.65160514468e-16, 0.0, 0.0, 0.0, 0.0, 6.98479287935e-17, 4.35951071902e-17, 0.0, 0.0, 3.87842906573e-17, 2.69076180977e-17, 0.0, 0.0, 3.4736566476e-17, 0.0, 0.0, 0.0, 0.0, 5.90283252621e-18, 9.80608434088e-19, 7.74136614574e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.80750683432e-19, 2.9339936105e-18, 2.65848857561e-18, 6.0973518583e-18, 3.50403360065e-18, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.2850598112899802, 0.0], uv: [0.7802714843750014, 4.0], spectrum: [ 2.94036137591e-16, 9.84635495295e-18, 2.77266848334e-17, 0.0, 3.00249380115e-18, 5.57906428508e-17, 1.39881372722e-17, 1.36576867161e-17, 0.0, 0.0, 2.03810921274e-17, 0.0, 0.0, 0.0, 4.45972984724e-17, 1.93267533048e-17, 6.86338611475e-17, 0.00188553214198, 0.0130308296741, 0.0267427664856, 0.0378640943973, 0.0431697516961, 0.0411320435819, 0.0325052716484, 0.0196231323092, 0.00658553750943, 0.0, 0.0, 0.0, 7.04948464729e-17, 0.0, 0.0, 2.7023526489e-16, 0.0, 2.15866396723e-16, 8.15619001767e-17, 1.308148876e-16, 4.07930168068e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.98115894452e-16, 0.0, 3.37442800726e-16, 1.24168563895e-16, 3.46849948298e-16, 2.53499045085e-16, 9.92188499734e-17, 3.60879583755e-16, 2.00922877964e-16, 2.04961568081e-16, 1.72235508061e-17, 1.40334218578e-16, 3.52838684191e-18, 2.95594862186e-18, 7.85115428164e-18, 2.05662348852e-18, 1.9660527093e-17, 2.3777270106e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 9.32019306398e-18, 3.9539506093e-18, 3.36054236435e-18, 0.0, 1.54445722694e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 5.19192028345e-18, 1.09436656785e-18, 0.0 ] }, spectrum_data_point_t { xystar: [-0.2743400730991833, 0.056484824123486106], uv: [0.9765605468750005, 4.999999999999999], spectrum: [ 1.21364952901e-16, 2.40858997747e-16, 0.0, 1.52652901729e-18, 0.0, 1.54527033622e-16, 1.88240116904e-17, 1.63222808603e-17, 1.9766318292e-18, 5.78102942309e-17, 0.0, 3.49476065621e-17, 1.41050169496e-17, 4.52696453405e-17, 9.10649253577e-17, 0.0, 5.65097797859e-17, 0.0, 0.00448508610633, 0.018972690031, 0.0350262814425, 0.0466488334421, 0.050128390313, 0.0447633454348, 0.031892616638, 0.0150262220377, 0.000629810286052, 1.45161516834e-15, 0.0, 0.0, 0.0, 1.55628882578e-17, 0.0, 0.0, 2.31871675062e-16, 0.0, 1.39624732435e-16, 5.3699567593e-16, 5.659734614e-17, 0.0, 0.0, 0.0, 0.0, 5.32773873869e-16, 0.0, 0.0, 1.68996001376e-17, 5.8280122873e-16, 1.55142006009e-16, 6.5703318439e-16, 8.22097287972e-17, 6.24066366442e-16, 1.27681801549e-16, 9.61594479649e-17, 4.16354867674e-16, 3.95505255287e-16, 1.37891398561e-16, 1.38462465031e-16, 1.23624475486e-16, 8.9864392715e-17, 4.89174005783e-17, 5.28698146418e-17, 5.8322103397e-17, 4.7432791578e-17, 7.27766817318e-17, 0.0, 1.44963038571e-17, 1.21318446683e-17, 1.9911787308e-17, 1.49610085674e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.18913526271e-18, 9.20738760271e-18, 1.37887779093e-18 ] }, spectrum_data_point_t { xystar: [-0.2730599976959221, 0.06321457169449544], uv: [1.0, 5.1191425781249995], spectrum: [ 0.0, 0.0, 0.0, 0.0, 0.0, 1.93242012001e-17, 5.66281194976e-18, 0.0, 5.30690629092e-19, 0.0, 1.60621306643e-17, 0.0, 8.86779604881e-17, 1.88646488152e-17, 0.0, 0.0, 6.39905619239e-18, 2.01736753549e-17, 0.00325112740521, 0.0178470919398, 0.0346775821044, 0.0472163214706, 0.0513800755825, 0.0462909047611, 0.0332454237249, 0.0158465902763, 0.000818687659331, 1.48188268012e-16, 7.89562668533e-17, 0.0, 0.0, 2.95293921991e-16, 1.19657941454e-16, 0.0, 0.0, 0.0, 3.15756888825e-16, 0.0, 0.0, 0.0, 9.4766789851e-16, 0.0, 7.8270663917e-16, 6.10384428787e-16, 0.0, 1.20301443884e-16, 0.0, 0.0, 0.0, 0.0, 4.47268365457e-17, 1.13547153462e-16, 5.27341548924e-17, 0.0, 2.67727232785e-17, 7.35922219196e-18, 7.20838895175e-17, 0.0, 0.0, 1.89331168714e-17, 5.08470702839e-17, 1.98445986793e-17, 4.79920778439e-17, 8.55750966633e-18, 3.14903932277e-17, 3.6868408198e-18, 0.0, 0.0, 0.0, 2.33358870515e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.15154283953e-17 ] }, spectrum_data_point_t { xystar: [-0.26175371383038687, 0.11296964824697227], uv: [1.2070292968750014, 6.0], spectrum: [ 0.0, 0.0, 0.0, 7.3898005543e-18, 0.0, 0.0, 3.44730118886e-18, 7.39136644662e-18, 1.3866307553e-16, 1.25587868214e-16, 1.37730567829e-16, 5.79762030103e-17, 0.0, 5.55955784696e-17, 0.0, 9.72501691515e-17, 0.0, 3.08368437077e-17, 1.53114942159e-16, 0.00926192045301, 0.0283524688373, 0.0465230329428, 0.0564626987463, 0.05537299185, 0.0435026496726, 0.0242315190807, 0.00501833116112, 3.06451519274e-17, 0.0, 1.9174775142e-16, 1.12165668991e-16, 0.0, 4.28416190915e-16, 0.0, 4.7169481508e-16, 0.0, 3.19328141396e-16, 2.53337984749e-16, 4.12789303943e-16, 0.0, 0.0, 3.38508990617e-16, 0.0, 0.0, 8.35470086493e-16, 0.0, 6.72661873414e-16, 0.0, 0.0, 0.0, 3.90611991936e-16, 0.0, 3.83995021112e-16, 3.69350336521e-16, 1.45107125077e-16, 0.0, 0.0, 2.69244257834e-17, 6.63958692767e-17, 4.85912983659e-18, 5.23029253722e-17, 0.0, 1.166195788e-17, 1.97222726093e-17, 0.0, 7.22033808563e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.06830712825e-17, 2.67696219838e-17, 7.74319509267e-18, 5.39398863526e-18, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.24756739363759098, 0.16945447237045844], uv: [1.4667949218749996, 7.0], spectrum: [ 9.46423366347e-17, 0.0, 0.0, 0.0, 8.16378990522e-18, 2.00856791204e-18, 2.79025772457e-16, 0.0, 2.69932179232e-17, 9.97460570545e-18, 0.0, 1.63012658611e-16, 1.53789299641e-17, 0.0, 6.96301966375e-17, 0.0, 0.0, 0.0, 1.02316899201e-16, 0.0, 0.018771300452, 0.0421575895222, 0.0589637924345, 0.0638040533495, 0.055176301103, 0.03548305091, 0.0119984824187, 0.0, 2.71533578726e-17, 1.42854319535e-15, 0.0, 1.26294233342e-15, 1.78925571147e-16, 7.90531646738e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.66216607832e-15, 2.73271332788e-16, 1.37362023519e-15, 0.0, 1.76664694973e-16, 0.0, 0.0, 1.11831885389e-15, 0.0, 1.72449657079e-16, 1.54865145445e-16, 0.0, 0.0, 2.46723035875e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.94426571403e-17, 0.0, 0.0, 0.0, 0.0, 5.98547889343e-17, 5.5213102402e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.66000532753e-18 ] }, spectrum_data_point_t { xystar: [-0.23130112424359567, 0.22593929649394454], uv: [1.7646464843749987, 8.0], spectrum: [ 0.0, 0.0, 0.0, 5.7766226827e-19, 0.0, 2.05735188166e-17, 0.0, 0.0, 0.0, 1.51475621159e-16, 0.0, 0.0, 3.87187969921e-17, 0.0, 5.91875358968e-18, 1.89152318308e-16, 1.67280072672e-16, 7.18199641588e-17, 2.0556244397e-16, 0.0, 0.00636533334136, 0.0303921698653, 0.0544368033805, 0.0683211349906, 0.0669270497601, 0.0499587691537, 0.0227800814372, 2.80935186836e-16, 0.0, 3.43202138067e-16, 3.75055708872e-16, 6.52294740564e-16, 2.12968102832e-16, 1.3993946272e-16, 0.0, 0.0, 6.1302699193e-16, 0.0, 0.0, 0.0, 1.51350337969e-15, 2.43452855133e-16, 4.00162487331e-16, 0.0, 8.40448003637e-16, 0.0, 1.13707644254e-15, 2.89272609661e-16, 1.59126039235e-16, 0.0, 1.16767893974e-15, 4.22558346818e-17, 0.0, 0.0, 0.0, 3.10707114057e-16, 0.0, 0.0, 1.68326605247e-17, 0.0, 9.57678671557e-17, 2.77896981457e-18, 0.0, 0.0, 0.0, 0.0, 5.87315809708e-17, 0.0, 1.11787206613e-17, 4.80485763267e-17, 7.4016851366e-17, 9.42977449306e-17, 0.0, 0.0, 1.02797227588e-17, 6.72221015034e-18, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.2184479981567377, 0.2662069083882738], uv: [1.9999999999999991, 8.712892578125], spectrum: [ 0.0, 0.0, 2.4614774312e-16, 1.48208774955e-17, 3.47634625238e-17, 6.28204367129e-17, 1.25854276666e-16, 0.0, 3.38207578091e-16, 0.0, 4.34798575082e-17, 0.0, 0.0, 7.36573974655e-17, 0.0, 6.92823913035e-17, 2.01881626825e-16, 1.49407722696e-16, 0.0, 6.37930032245e-17, 0.0, 0.0222148245648, 0.0493658327136, 0.0685730097922, 0.0724769778849, 0.0588780897662, 0.031398459148, 0.00310814642272, 1.29475692305e-15, 7.45516471629e-16, 3.71836506459e-16, 0.0, 0.0, 0.0, 0.0, 1.41671699528e-16, 2.28281371612e-16, 0.0, 0.0, 5.03581464361e-16, 0.0, 0.0, 5.65019568747e-16, 1.22161775617e-15, 4.76194061813e-16, 2.14930843579e-16, 0.0, 9.36346582503e-16, 2.17392007073e-16, 0.0, 0.0, 0.0, 1.9349585372e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.52689904524e-17, 0.0, 1.78123012597e-17, 0.0, 0.0, 0.0, 8.95634968285e-18, 8.49384392692e-18, 0.0, 0.0, 5.22015858384e-17, 8.83051505993e-17, 8.7936924452e-17, 5.28946618602e-17, 6.30650487366e-17, 8.45275547396e-17, 6.49183533893e-17, 4.15764967743e-17, 2.0931479236e-17, 1.00222632972e-17 ] }, spectrum_data_point_t { xystar: [-0.2132215658024008, 0.28242412061743066], uv: [2.0957011718749996, 9.0], spectrum: [ 1.45003753505e-16, 0.0, 0.0, 2.94762948228e-17, 0.0, 4.13015924695e-18, 0.0, 3.05754188446e-17, 2.34913373218e-16, 2.62079876099e-16, 3.77746674352e-16, 9.84109231799e-17, 0.0, 0.0, 0.0, 0.0, 4.29353347665e-17, 0.0, 0.0, 2.26336728862e-16, 2.09818867176e-16, 0.0163483970256, 0.0450455039511, 0.0684887150875, 0.0761275461676, 0.0639116947297, 0.0349177955991, 0.00359813724513, 6.51722048717e-16, 2.26829325135e-15, 0.0, 1.41546125026e-16, 0.0, 2.26400609763e-16, 0.0, 3.1818158734e-16, 1.10494105493e-16, 1.23517759837e-15, 0.0, 0.0, 5.24706965576e-16, 0.0, 5.62344201973e-16, 2.77288397786e-16, 0.0, 0.0, 9.5371381841e-16, 1.16184432997e-15, 0.0, 2.05139016913e-15, 0.0, 0.0, 1.40485180037e-15, 6.52350048446e-16, 0.0, 5.30141216643e-16, 2.42894472331e-16, 2.98893834318e-17, 0.0, 2.88594003531e-16, 1.26192663363e-16, 1.40988908747e-16, 1.75286325157e-16, 9.66517991928e-17, 1.31327559461e-16, 7.44634187829e-17, 6.0847824074e-17, 9.2752842199e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 1.90385791025e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.19268873394440664, 0.33890894474091676], uv: [2.471677734375, 10.0], spectrum: [ 1.88294649365e-16, 0.0, 4.32530248926e-16, 4.87645534882e-17, 9.94475971335e-18, 2.71290582087e-17, 2.09228664434e-16, 0.0, 1.23456160018e-16, 4.90167597368e-17, 3.71715789731e-16, 0.0, 0.0, 2.65486227089e-16, 0.0, 1.46556102031e-16, 9.36288167135e-17, 0.0, 0.0, 9.72776848234e-17, 5.26490718925e-17, 0.00108992252072, 0.0307013796994, 0.0628523911901, 0.0807890520478, 0.0760413697979, 0.0488186311697, 0.0127510013556, 2.58017896231e-16, 0.0, 0.0, 2.66409978841e-15, 0.0, 0.0, 1.77336168856e-15, 0.0, 0.0, 4.2465635743e-16, 0.0, 2.06867491976e-15, 0.0, 0.0, 2.60848859431e-15, 0.0, 0.0, 2.82753271716e-15, 0.0, 3.69847680302e-16, 2.86213835567e-16, 0.0, 9.49658970156e-16, 0.0, 2.77989429166e-16, 0.0, 9.08762696307e-16, 6.5231190274e-16, 3.89202650096e-16, 6.77196961758e-16, 1.41546435973e-16, 1.17371882176e-16, 2.3141219704e-16, 1.51946983497e-16, 1.4337808553e-16, 1.65472302249e-16, 1.1855435559e-16, 7.24897775444e-17, 0.0, 2.57886853636e-18, 6.99635242439e-18, 4.80436212021e-17, 1.26099468772e-16, 1.65765750845e-16, 1.56383072063e-17, 0.0, 0.0, 0.0, 6.92300201492e-18, 6.62440336256e-17, 3.94626350784e-17, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.16922264039241333, 0.395393768864403], uv: [2.901365234375, 11.0], spectrum: [ 0.0, 4.50147706485e-16, 9.73827943658e-17, 0.0, 0.0, 0.0, 8.25311707159e-17, 0.0, 0.0, 0.0, 7.43184267785e-16, 0.0, 8.98493132502e-16, 0.0, 6.80149404892e-16, 6.82216224251e-17, 6.4699181244e-16, 0.0, 2.85588830445e-16, 0.0, 1.03917007884e-16, 3.37482203252e-16, 0.00805623578478, 0.0441632315596, 0.0770019286002, 0.0873600151687, 0.067754824668, 0.0276168020359, 5.24604360716e-16, 0.0, 0.0, 8.15076392354e-17, 0.0, 8.71311069122e-18, 2.76197684488e-15, 0.0, 0.0, 0.0, 0.0, 1.11134746524e-15, 1.60837331105e-15, 0.0, 0.0, 6.11361137695e-16, 0.0, 8.44872578576e-16, 0.0, 0.0, 4.36657946866e-16, 0.0, 6.89863891225e-16, 7.5367198601e-16, 0.0, 1.21459396589e-15, 0.0, 0.0, 0.0, 0.0, 0.0, 1.98469083681e-16, 0.0, 0.0, 0.0, 0.0, 5.88953899449e-18, 0.0, 7.77710452546e-18, 0.0, 1.76521362725e-17, 0.0, 0.0, 0.0, 0.0, 9.06876297561e-18, 6.07751921827e-18, 4.70502463889e-18, 2.87241579507e-17, 2.47073879411e-17, 1.34477706586e-17, 3.37724961567e-17, 3.58917387095e-17 ] }, spectrum_data_point_t { xystar: [-0.16383599861755327, 0.40846702695709286], uv: [3.0, 11.231447265625], spectrum: [ 0.0, 0.0, 0.0, 0.0, 0.0, 2.83259094598e-16, 0.0, 0.0, 0.0, 5.43414747194e-16, 0.0, 8.060038466e-16, 0.0, 3.90376170477e-16, 5.6322280581e-17, 0.0, 3.11262762276e-16, 6.91734764714e-16, 0.0, 0.0, 0.0, 1.87306638686e-16, 0.00237972722479, 0.0396489133272, 0.0763584088976, 0.0903601332827, 0.0722383549714, 0.0307484032911, 8.43888351473e-16, 0.0, 0.0, 0.0, 9.36032083766e-16, 0.0, 0.0, 2.41242470149e-15, 1.37609877002e-15, 0.0, 2.57090414216e-15, 1.0285722206e-15, 5.49562909392e-16, 0.0, 1.39209961924e-15, 0.0, 0.0, 0.0, 0.0, 3.70386108365e-16, 0.0, 2.11446836599e-15, 0.0, 1.03247747115e-15, 0.0, 0.0, 3.05004953815e-17, 4.82857444269e-16, 0.0, 2.28333214469e-16, 1.23535991222e-16, 1.01337508173e-16, 1.44267523701e-16, 2.21184033712e-17, 0.0, 2.82160122469e-17, 1.58780503713e-16, 2.52046086171e-17, 2.17610049559e-16, 0.0, 1.14666955452e-17, 2.28925893654e-17, 2.29523305711e-17, 4.65581888637e-17, 0.0, 1.1005229769e-17, 8.81885391306e-17, 8.75422470641e-17, 5.93807684387e-17, 3.36977674886e-17, 5.22559542724e-17, 1.00906177132e-16, 1.19243376534e-16 ] }, spectrum_data_point_t { xystar: [-0.13957003126762177, 0.45187859298788907], uv: [3.4443339843750005, 12.0], spectrum: [ 0.0, 0.0, 7.5483218602e-16, 0.0, 1.72341034265e-17, 1.46366915346e-16, 0.0, 1.12450263853e-15, 0.0, 0.0, 7.63047156379e-16, 0.0, 3.33295929163e-16, 0.0, 9.75805056865e-16, 0.0, 0.0, 3.21366173872e-16, 2.32610540087e-16, 0.0, 0.0, 1.80219848073e-16, 0.0, 0.0180429021861, 0.0560997781373, 0.0840209682896, 0.0835900299159, 0.0521420631349, 0.00901622740845, 9.23926255859e-16, 2.08483547913e-15, 4.58375645352e-16, 1.06716742432e-15, 0.0, 0.0, 7.74007764343e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 2.56588010924e-15, 2.88766101094e-15, 1.24692208895e-15, 3.76928348522e-16, 1.1929861541e-15, 0.0, 0.0, 0.0, 3.07258427078e-15, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.14350887484e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 4.20669812313e-17, 0.0, 0.0, 0.0, 5.57218194638e-18, 0.0, 1.46276524092e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.10922399907836886, 0.5003100271188159], uv: [3.9999999999999996, 12.857423828124999], spectrum: [ 7.33695763444e-16, 1.56037786376e-16, 0.0, 0.0, 0.0, 0.0, 4.39110119942e-17, 3.12793482673e-15, 0.0, 0.0, 0.0, 3.05568863523e-15, 0.0, 1.11296710399e-15, 0.0, 0.0, 0.0, 0.0, 2.23350993789e-15, 0.0, 1.41017567231e-15, 1.30625126069e-15, 1.58668953668e-17, 2.54962939272e-16, 0.0227485854853, 0.0691546296174, 0.0942323477709, 0.0762934209453, 0.0270250639761, 1.00462287358e-16, 0.0, 0.0, 6.5305325525e-17, 0.0, 0.0, 5.17939625312e-16, 0.0, 5.88881153928e-16, 0.0, 2.84129490082e-15, 0.0, 0.0, 0.0, 0.0, 1.61973891173e-15, 0.0, 4.04710669048e-15, 0.0, 5.04725361618e-16, 5.88725382792e-16, 1.03629965792e-15, 8.03836708282e-16, 1.19981229601e-15, 0.0, 2.77116641121e-16, 0.0, 0.0, 0.0, 5.73020715044e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.50112998668e-17, 0.0, 2.33231992598e-17, 0.0, 7.20131268396e-18, 6.02645778257e-17, 3.52062265269e-17, 0.0, 2.87050906795e-17, 3.1675279995e-17, 4.78399496723e-17, 4.24895684556e-17, 4.65454177752e-17, 5.99684629833e-17, 6.71354666085e-17, 1.19842611601e-16 ] }, spectrum_data_point_t { xystar: [-0.1006909808144329, 0.5083634171113752], uv: [4.156248046875, 13.0], spectrum: [ 7.90052596911e-16, 4.58770605494e-16, 2.6836369942e-15, 8.27830937588e-17, 8.97750072757e-17, 1.17189275731e-16, 1.57086299504e-16, 5.30936386322e-16, 1.54844260788e-15, 1.08224117044e-15, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.65284582822e-17, 1.73181492394e-15, 0.0, 0.0, 5.01230461346e-16, 3.57442184861e-16, 4.10426755787e-16, 7.81845865646e-16, 0.0196105488732, 0.0588771325627, 0.0849834187504, 0.0789353110393, 0.0417020446218, 5.50902335347e-18, 1.24712586833e-16, 0.0, 1.38996138835e-16, 5.97014324018e-16, 1.87186423712e-16, 0.0, 0.0, 0.0, 0.0, 4.64397163158e-17, 0.0, 5.7068795194e-16, 1.97229712642e-15, 2.16328843969e-16, 1.33181041332e-15, 0.0, 0.0, 0.0, 2.17227366923e-15, 3.83460726607e-16, 5.06124342319e-16, 0.0, 0.0, 9.43770281494e-17, 0.0, 0.0, 0.0, 7.26340362459e-18, 0.0, 2.37892219763e-17, 0.0, 1.85834640928e-16, 2.43967524442e-17, 6.11294866121e-17, 1.54882729435e-18, 4.3406933944e-17, 4.26064956721e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 7.17168901551e-18, 7.48451353429e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.05461199953918444, 0.5425081623282562], uv: [5.0, 13.604494140624999], spectrum: [ 1.7509171881e-16, 5.52363246205e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.67566165382e-16, 0.0, 9.67078810562e-17, 1.87583899594e-15, 2.25880005837e-15, 0.0, 1.70921626479e-15, 1.87509955645e-16, 2.58511165502e-16, 0.0, 1.04949901853e-16, 0.0, 0.0139761562766, 0.0521687402921, 0.0782974458149, 0.0723952436192, 0.0375364883789, 0.0, 3.94488695626e-16, 0.0, 1.10255501821e-16, 0.0, 8.7215356e-18, 0.0, 0.0, 0.0, 5.62781883961e-16, 4.00471472326e-16, 0.0, 5.01119699859e-16, 8.35852105057e-16, 1.48001921374e-15, 7.96077893328e-17, 6.16368931941e-16, 9.99725472714e-17, 4.40616213003e-16, 0.0, 9.75802600664e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.10042356181e-16, 1.2296300719e-16, 7.91156971432e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 1.06200185319e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.6619593928e-18 ] }, spectrum_data_point_t { xystar: [0.018026333074456447, 0.5083634171113752], uv: [6.3300800781249995, 13.0], spectrum: [ 5.29530767441e-16, 0.0, 3.98958315409e-16, 3.11518847462e-17, 7.2455611149e-18, 1.81627434234e-17, 8.08045823881e-17, 0.0, 1.6724435972e-16, 6.51852500559e-16, 2.07625369103e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 2.17758760012e-16, 3.88817377271e-16, 3.01461402165e-16, 2.80575931726e-16, 1.15873181895e-16, 1.79275282083e-16, 4.55175115275e-16, 1.2513229913e-16, 0.0, 1.61010029021e-16, 0.00552329641193, 0.0221443445367, 0.037521441276, 0.0445579362778, 0.041685363425, 0.0308227500077, 0.0159593308467, 0.00305401227779, 1.67882870467e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.73268940634e-16, 7.22423344817e-16, 2.71338291654e-17, 0.0, 1.72846471868e-16, 9.78860892802e-17, 8.57498943604e-17, 0.0, 0.0, 4.88959454605e-17, 0.0, 0.0, 2.73452823513e-17, 0.0, 0.0, 0.0, 2.73561867227e-17, 2.17785418013e-17, 2.6840145458e-17, 0.0, 0.0, 2.67205474176e-17, 9.75927665541e-18, 0.0, 8.26362270983e-18, 3.39930457927e-17, 5.17523247617e-17, 3.60414181345e-17, 9.8500821035e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.30781887056e-18, 8.85795882233e-18, 1.85415512154e-17, 0.0 ] }, spectrum_data_point_t { xystar: [0.0, 0.5275595418815132], uv: [6.0, 13.339845703124999], spectrum: [ 3.58119409508e-16, 1.91517822224e-17, 0.0, 0.0, 0.0, 0.0, 2.34653067444e-17, 1.37895557215e-16, 0.0, 4.27384324412e-16, 0.0, 9.5334090719e-16, 1.2737331372e-15, 0.0, 0.0, 1.12587680606e-15, 8.37653051334e-17, 0.0, 0.0, 0.0, 0.0, 4.65298983935e-16, 2.50460910758e-17, 7.09715798075e-17, 1.04834502465e-17, 0.0, 0.00900421884556, 0.0330953976524, 0.0518374945718, 0.0548536928508, 0.0422730320255, 0.0210198440676, 0.00201710247202, 0.0, 7.78833020354e-18, 1.92059104053e-17, 1.23564516236e-17, 0.0, 0.0, 1.06453905302e-16, 0.0, 0.0, 1.11473694024e-15, 9.34839324062e-16, 0.0, 0.0, 0.0, 4.42292569184e-16, 0.0, 0.0, 1.94082281799e-16, 1.33968680564e-16, 2.35194830576e-16, 1.58370430992e-16, 0.0, 0.0, 0.0, 0.0, 4.02803964421e-17, 0.0, 0.0, 7.2054024174e-18, 1.45512935298e-17, 0.0, 4.62296569577e-17, 2.23022582286e-18, 4.57272274242e-17, 1.77964836222e-17, 5.41432907383e-17, 2.34466602096e-17, 8.09603993913e-18, 2.05055550505e-17, 1.56496264061e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [0.08735797311443666, 0.395393768864403], uv: [7.5996113281249995, 11.0], spectrum: [ 1.7951152072e-18, 2.42687023766e-17, 7.14389135811e-18, 0.0, 0.0, 0.0, 3.09872804226e-18, 5.661115257e-18, 0.0, 0.0, 0.0, 5.26731860507e-17, 7.05349197427e-17, 4.65808469994e-17, 2.10411838842e-17, 0.0, 0.0, 0.0, 1.14389718659e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.000577535707165, 0.00451834456686, 0.00970474988625, 0.0146464738623, 0.0185243176133, 0.0208978174603, 0.0215474897364, 0.0204671678441, 0.0178543393759, 0.0140914972665, 0.00971450250153, 0.00538665544921, 0.00187077254129, 2.09364314515e-17, 0.0, 0.0, 0.0, 3.06062186962e-17, 9.33704564276e-19, 0.0, 1.35575214695e-17, 3.07190118131e-17, 0.0, 0.0, 0.0, 0.0, 2.59749865897e-18, 0.0, 6.16471649602e-18, 4.95856840741e-18, 1.90399820513e-18, 0.0, 1.65714840202e-18, 1.41216969578e-18, 6.9100371601e-18, 3.98637220123e-18, 4.46696780318e-18, 1.99076889199e-18, 4.75378201856e-18, 3.14920427226e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.97224568824e-18, 0.0, 3.95960551484e-7, 0.0, 1.99735241309e-7, 7.81919533145e-8, 3.30226189524e-7, 2.60399587908e-7 ] }, spectrum_data_point_t { xystar: [0.05759869992804513, 0.45187859298788907], uv: [7.0546894531249995, 12.0], spectrum: [ 4.39555449169e-17, 0.0, 0.0, 0.0, 6.74220016775e-18, 0.0, 0.0, 1.11369225153e-17, 0.0, 0.0, 3.99795798807e-17, 0.0, 0.0, 0.0, 2.70536194249e-17, 0.0, 1.09208348957e-16, 1.34409432186e-16, 3.90741960306e-17, 1.34452370998e-16, 0.0, 1.39533027894e-17, 3.50845090222e-17, 2.89565430931e-17, 2.15089453962e-17, 4.73535118338e-17, 0.00121322613622, 0.0085356793802, 0.0173307438099, 0.0245055847268, 0.0286050788056, 0.029148617648, 0.0262354367599, 0.0205143512251, 0.0131664089603, 0.0058529724634, 0.000655832646077, 0.0, 0.0, 2.96971044205e-17, 1.26124940592e-16, 2.32900368463e-17, 0.0, 2.86436795492e-17, 0.0, 1.60331797995e-18, 1.23281954051e-17, 0.0, 9.5233505498e-17, 5.73097635986e-17, 0.0, 0.0, 6.35063605741e-17, 0.0, 3.39959770196e-18, 4.68422542756e-18, 5.82433847127e-18, 1.09573051875e-17, 3.88463750905e-18, 7.86632989919e-18, 1.11040091737e-18, 1.645604969e-18, 3.7380054529e-18, 8.72430519799e-19, 0.0, 0.0, 2.48680014875e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.39291046226e-18, 1.57668835266e-18, 0.0, 3.76207209619e-19 ] }, spectrum_data_point_t { xystar: [0.054611999539184386, 0.45651222403869096], uv: [6.999999999999999, 12.082033203125], spectrum: [ 1.45407359517e-17, 0.0, 1.01501793124e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.79500683767e-17, 0.0, 4.40854328985e-16, 2.15811070814e-16, 0.0, 0.0, 9.00457713593e-17, 1.07114364291e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00168787882254, 0.00938336739884, 0.0183724452714, 0.0255291334158, 0.0294143971596, 0.0295930742348, 0.0262290249989, 0.0200565523879, 0.0123654048854, 0.00494053005172, 1.12284351985e-18, 0.0, 2.59354527487e-17, 0.0, 0.0, 1.76418862381e-16, 4.8011627064e-17, 0.0, 0.0, 0.0, 0.0, 2.52087415078e-17, 1.45550670118e-17, 0.0, 5.11009593131e-17, 0.0, 5.73822397676e-17, 0.0, 2.73832947487e-17, 0.0, 5.63941670123e-18, 0.0, 1.1213158193e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.69612257625e-18, 5.28564626656e-18, 1.31757257059e-17, 9.98122167698e-18, 1.16619915263e-17, 1.73185303161e-17, 1.30773292026e-17, 1.75234176128e-17, 1.59066309398e-17, 1.85632291472e-17, 1.98273472293e-17 ] }, spectrum_data_point_t { xystar: [0.15839623814001638, 0.22593929649394454], uv: [8.900392578125, 8.0], spectrum: [ 3.6525513374e-18, 3.67597672557e-18, 1.19943205309e-17, 2.51766576114e-19, 9.53829040571e-19, 5.15312908686e-19, 7.42046888094e-19, 1.41829532638e-18, 9.11749207457e-18, 0.0, 0.0, 0.0, 0.0, 1.21189895418e-17, 4.6207900054e-18, 1.0001357954e-17, 0.0, 0.0, 9.68634257443e-18, 3.27814388636e-18, 0.0, 1.41866760671e-18, 0.0, 4.32732386021e-18, 0.0, 0.000379209093989, 0.00138898384087, 0.00277173505094, 0.0043014897429, 0.00580734901758, 0.00718454786774, 0.00836139883294, 0.00928631672964, 0.00992806593486, 0.0102744418708, 0.0103281628571, 0.0101060222873, 0.00963566777399, 0.00895343667686, 0.00810300594928, 0.00713289737019, 0.00609439336644, 0.00503791331937, 0.00400987863608, 0.00305372210016, 0.00220154593093, 0.00147785599604, 0.000897224926751, 0.000466178629771, 0.000181090220948, 3.0462022939e-5, 1.96516133425e-19, 1.94743855685e-19, 5.21595279568e-19, 5.97748474506e-19, 6.31782603606e-19, 8.96008980765e-19, 4.2237229001e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.69457559449e-8, 1.04760770219e-19, 2.27348936999e-19, 1.61942111603e-19, 1.35489884052e-19, 1.13894550664e-19, 6.87034323163e-8 ] }, spectrum_data_point_t { xystar: [0.1363701094196227, 0.28242412061743066], uv: [8.497072265625, 9.0], spectrum: [ 0.0, 0.0, 0.0, 1.9454655954e-20, 0.0, 2.20678978126e-19, 0.0, 0.0, 0.0, 7.21226120623e-18, 0.0, 4.67194561352e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 3.92941001063e-18, 1.87380519621e-18, 2.86447749352e-18, 4.76954445784e-19, 4.15648336554e-18, 0.0, 6.55775379551e-18, 0.0, 0.0, 0.000980124266585, 0.00280882636852, 0.00500556456938, 0.00721425141125, 0.00921887168185, 0.0108770473237, 0.0120895064135, 0.0127986133767, 0.0129882616993, 0.0126755066206, 0.0119065831697, 0.0107526227224, 0.00930242850147, 0.00766007946214, 0.0059407280515, 0.0042578955928, 0.00272958426083, 0.00145984977787, 0.000541205538607, 3.92842598682e-5, 0.0, 8.29787739345e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.96461822484e-7, 0.0, 0.0, 6.9811365538e-8, 0.0, 1.87503503055e-7, 7.38725178644e-7, 7.45053115182e-7, 8.69296053337e-7, 1.12757480718e-6, 4.85230486268e-7, 9.16556248703e-7 ] }, spectrum_data_point_t { xystar: [0.11301067992922935, 0.33890894474091676], uv: [8.069337890625, 10.0], spectrum: [ 1.37657460266e-18, 0.0, 0.0, 1.65614860674e-18, 1.19846525505e-18, 1.51829481315e-18, 0.0, 2.16085981077e-18, 5.69728029177e-18, 2.6161217258e-17, 0.0, 0.0, 0.0, 4.1254249919e-17, 0.0, 2.11275929725e-17, 0.0, 7.47953292923e-18, 0.0, 9.14256678283e-18, 3.65036327947e-17, 0.0, 3.86018284473e-17, 0.0, 0.0, 5.16537735245e-19, 0.000631607151995, 0.00310909256591, 0.00638278034158, 0.00969769445106, 0.0126048315821, 0.0148269329226, 0.0161871923598, 0.0166030587316, 0.0160832707935, 0.0147173604194, 0.0126619050926, 0.0101281912443, 0.00736944482321, 0.00467156618174, 0.00234128917625, 0.000685346299466, 9.25692530305e-18, 0.0, 0.0, 2.47878311548e-17, 5.80402990391e-19, 0.0, 0.0, 8.24956597665e-18, 0.0, 2.23006100445e-17, 0.0, 1.17320394179e-17, 0.0, 0.0, 3.50172794004e-19, 3.70574334459e-19, 1.38332877979e-18, 2.10999111455e-18, 0.0, 0.0, 2.05504189628e-18, 1.53270394923e-18, 1.70897461145e-18, 1.90716147304e-18, 3.79339370079e-18, 1.86317663427e-18, 1.87602714301e-18, 3.79022922965e-18, 1.77119608813e-18, 1.41429354576e-18, 4.12194447801e-18, 5.23540476786e-18, 4.28850134217e-18, 4.3434817178e-18, 5.35605402328e-18, 6.23488204372e-18, 4.1553038842e-18, 7.24287285285e-18, 4.92126142355e-18 ] }, spectrum_data_point_t { xystar: [0.10922399907836883, 0.34767964787107547], uv: [8.0, 10.155275390624999], spectrum: [ 6.01782784005e-18, 1.97127008665e-17, 7.78721760731e-18, 4.69850073443e-19, 0.0, 6.12055663697e-18, 0.0, 1.78481157374e-18, 2.45480461973e-18, 0.0, 2.30418855147e-18, 2.56264606851e-17, 3.24561399788e-17, 0.0, 0.0, 3.69038315517e-18, 1.88218401475e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.11362485084e-18, 1.65867778186e-17, 2.76718775366e-17, 0.000591670845246, 0.00322479232413, 0.00672450130779, 0.0102535537531, 0.0133141200551, 0.0156076959599, 0.0169464778605, 0.017246406452, 0.0165252776007, 0.014897161459, 0.0125523752934, 0.00973890614628, 0.00675438854928, 0.00393467104073, 0.00163333947632, 0.000207994449075, 0.0, 2.25149639359e-17, 6.24088375963e-18, 0.0, 0.0, 9.48161890733e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.19633383869e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.22853310424e-6, 1.32286582092e-7, 7.58913445096e-7, 1.7135235437e-19, 7.44929393284e-8, 3.20726813663e-7, 7.24226763506e-7, 1.540659735e-18, 7.41926615395e-7, 9.69051773543e-7 ] }, spectrum_data_point_t { xystar: [0.20116852684160416, 0.11296964824697227], uv: [9.683595703124999, 6.0], spectrum: [ 3.50368088116e-8, 2.61066157516e-8, 0.0, 7.44377472502e-20, 0.0, 7.07520478481e-19, 6.90149131282e-19, 1.21685292749e-19, 1.33504713127e-18, 1.87735433754e-18, 0.0, 1.78152944876e-19, 0.0, 3.88430161982e-20, 0.0, 0.0, 0.0, 5.80164643082e-19, 2.10312086999e-19, 2.65570806742e-19, 4.84365618936e-19, 3.3015524107e-19, 0.0, 0.000119387037252, 0.000503441613987, 0.00107329070153, 0.00176215729295, 0.00251025727997, 0.00326593949606, 0.00398869266936, 0.00465093560303, 0.0052332398227, 0.00572303485424, 0.00611530971875, 0.00640560085077, 0.00659490943399, 0.00668739929153, 0.00669119423993, 0.00661557640721, 0.006472103852, 0.0062767785039, 0.006042149305, 0.00578340380996, 0.00551424599057, 0.0052469010167, 0.00499273506686, 0.00475715981165, 0.00454577534381, 0.00436184951929, 0.00420448616812, 0.00407375814464, 0.00396729149397, 0.00388299134249, 0.00381864158515, 0.0037697999242, 0.00373390564058, 0.00370698174712, 0.00368705747989, 0.0036735155059, 0.00366428577758, 0.0036580732033, 0.00365338973172, 0.00364980971045, 0.00364674048075, 0.00364389140921, 0.00364179738781, 0.00364070559308, 0.00363994014195, 0.00363894663229, 0.0036386929704, 0.00363832716458, 0.00363760931287, 0.00363747068492, 0.00363718925509, 0.00363699472667, 0.0036367030429, 0.00363642700698, 0.00363626753744, 0.00363644346577, 0.00363612011681, 0.00363625132928 ] }, spectrum_data_point_t { xystar: [0.17994237858321024, 0.16945447237045844], uv: [9.294923828125, 7.0], spectrum: [ 6.02862078815e-19, 8.68441944075e-19, 2.34537007447e-18, 0.0, 6.27888418374e-19, 0.0, 5.56605679962e-19, 1.04109794558e-18, 0.0, 0.0, 2.34374100216e-18, 0.0, 5.70484153056e-19, 0.0, 2.78237008076e-18, 4.62135822211e-20, 1.66957933982e-19, 2.96979249044e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.000149248678795, 0.000740555938732, 0.00163274904059, 0.0026902164825, 0.00379936911097, 0.00487002184304, 0.00584723226955, 0.00669122778614, 0.00737496199289, 0.00788407758213, 0.00821154567685, 0.00835970541161, 0.00833614197692, 0.00815544234688, 0.007834581913, 0.00739962618903, 0.00687679127318, 0.00629061108964, 0.00567071943097, 0.00504283679456, 0.00443091157061, 0.00385404770005, 0.00332759959285, 0.00286091549551, 0.00245712882249, 0.00211763910917, 0.00183861642588, 0.00161210810556, 0.00143267383591, 0.00129397066179, 0.00118781909534, 0.00110852033669, 0.00105025283351, 0.00100855688042, 0.000978757508639, 0.000958004657367, 0.000942814797126, 0.00093192695595, 0.000924587454003, 0.000918680456024, 0.000914783301914, 0.000911779984036, 0.000909336716392, 0.000908011918495, 0.000906697118524, 0.000905992400369, 0.000905558269344, 0.000904815726833, 0.000904832853876, 0.000904501062485, 0.000904328001438, 0.000904560314264, 0.000904032100006, 0.000904508117066, 0.000904382369149, 0.00090430502962, 0.000904426242138 ] }, spectrum_data_point_t { xystar: [0.1638359986175532, 0.21181820078499514], uv: [9.0, 7.750001953125], spectrum: [ 1.25991328825e-18, 1.55218774116e-18, 4.17583700953e-18, 0.0, 6.53196676819e-20, 0.0, 1.11913171094e-17, 0.0, 1.00371323101e-17, 0.0, 0.0, 2.89446616167e-18, 0.0, 6.32754599791e-18, 1.1381263843e-18, 2.37424794065e-18, 3.47256108127e-18, 6.1012486253e-18, 0.0, 0.0, 0.0, 1.46546005436e-18, 1.14905371362e-18, 1.9472658127e-18, 8.03410470719e-20, 0.000475385486038, 0.00146797307899, 0.00276050711896, 0.0041629773546, 0.00553959000652, 0.00679881268906, 0.00787996505675, 0.00874005843762, 0.00934794288374, 0.00969762922548, 0.00979213669128, 0.00964470885532, 0.00927602344524, 0.00871397501467, 0.00799900654503, 0.00716918257672, 0.00626726781083, 0.00533829089081, 0.00441865077402, 0.00354354009044, 0.00274205514529, 0.00203424520111, 0.00143509098055, 0.000949260750661, 0.000573932592177, 0.000304674153089, 0.000127136800861, 2.91799003773e-5, 0.0, 0.0, 5.50079836257e-20, 0.0, 4.03526105304e-19, 2.54254006807e-19, 5.3686676338e-19, 5.68269304374e-19, 6.47334015871e-19, 4.85356536956e-19, 7.95502923817e-19, 7.54388718648e-19, 4.18948428437e-7, 5.79052898567e-19, 4.9509075767e-19, 4.76591474971e-7, 5.7619416237e-19, 4.15332233448e-7, 2.3353396124e-7, 4.98902405933e-19, 7.35928878591e-7, 1.68572566867e-7, 2.10064170919e-19, 8.74422623282e-7, 2.88485131765e-7, 1.57548128189e-19, 1.18154094349e-6, 5.66628300343e-7 ] }, spectrum_data_point_t { xystar: [0.2643669833395862, -0.056484824123486134], uv: [10.840822265625, 3.0], spectrum: [ 0.000197266690303, 0.000198152168969, 0.000200158671912, 0.000201993484934, 0.000202684086341, 0.000202951237512, 0.000203442197363, 0.000202646316007, 0.000198603015646, 0.000190734640024, 0.000179901709764, 0.000164986807702, 0.000146304692939, 0.000123941258487, 9.80771375313e-5, 7.03997162666e-5, 4.34858983975e-5, 2.10540600902e-5, 5.62013524649e-6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.48149903065e-5, 8.77217783064e-5, 0.000224106502557, 0.000426937663405, 0.000697374555392, 0.00103316482522, 0.00143087641527, 0.00188653745693, 0.00239456439959, 0.00294652468658, 0.00353376055151, 0.00414547904511, 0.004769805468, 0.0053950766636, 0.00600931123683, 0.00660156584368, 0.00715996278197, 0.00767572123742, 0.00814232099162, 0.00855543748198, 0.0089133441319, 0.00921702368003, 0.00946898720108, 0.00967416095561, 0.00983771874064, 0.00996543736158, 0.0100633512863, 0.0101369520928, 0.0101917054939, 0.0102321154905, 0.0102611300875, 0.0102815582846, 0.0102964161932, 0.0103067202694, 0.010314597233, 0.0103204197844, 0.010324052614, 0.0103264123852, 0.0103278697478, 0.0103286166586, 0.0103294487376, 0.0103296460324, 0.010329897046, 0.0103301779555, 0.0103300739557, 0.0103303483782, 0.010330610225, 0.0103304271712, 0.0103305283816, 0.0103303485414, 0.0103303692294, 0.0103304598938, 0.0103304557358, 0.0103305385195 ] }, spectrum_data_point_t { xystar: [0.24330083117359216, 0.0], uv: [10.455080078125, 4.0], spectrum: [ 2.61091875907e-5, 2.45148807571e-5, 2.13309194485e-5, 1.75006199267e-5, 1.33685310797e-5, 7.69899191129e-6, 3.39392244037e-6, 7.58607242128e-7, 2.11738148668e-7, 5.17161684891e-8, 0.0, 1.5366994319e-21, 1.92941609236e-21, 1.42887817516e-20, 0.0, 1.99132561581e-20, 3.93018315379e-6, 2.62943022815e-5, 6.63768995861e-5, 0.000122744584833, 0.000194352615969, 0.000282442535906, 0.000386641145667, 0.000501253315675, 0.000633701070245, 0.000784117491975, 0.000955833483923, 0.00115098128176, 0.0013681186745, 0.00161061735353, 0.00187890448042, 0.00217281903229, 0.00249148687179, 0.00283206074673, 0.00319177215103, 0.00356802178026, 0.0039550588609, 0.00435253307183, 0.00475144170296, 0.00514853440264, 0.00553585647432, 0.0059078528839, 0.00625971086764, 0.00658715931642, 0.00688587502847, 0.00715478267545, 0.00739088039123, 0.00759370588758, 0.00776622943861, 0.00790804059326, 0.00802352091482, 0.00811535273471, 0.00818749234729, 0.00824200685753, 0.00828262697081, 0.00831155643231, 0.00833310772056, 0.00834888418932, 0.00835980698664, 0.00836759118204, 0.0083729765562, 0.00837660219359, 0.00837888080868, 0.00838092396409, 0.00838218739949, 0.00838337978547, 0.00838458041727, 0.00838519519703, 0.00838591302841, 0.00838646324552, 0.00838686829778, 0.00838728540291, 0.00838749796865, 0.00838763612021, 0.00838798793896, 0.00838816576414, 0.00838835683372, 0.00838867412732, 0.00838876131718, 0.00838885746089, 0.00838884108449 ] }, spectrum_data_point_t { xystar: [0.22223467900759816, 0.056484824123486106], uv: [10.069337890625, 4.999999999999999], spectrum: [ 1.15245369929e-6, 9.62205469091e-7, 7.33539395123e-7, 3.92202380037e-7, 2.49548099144e-7, 6.62809605248e-8, 0.0, 1.10377923726e-19, 0.0, 8.46658585474e-20, 0.0, 0.0, 1.90029684359e-22, 1.36167834134e-19, 2.27945285961e-19, 5.94855375533e-20, 0.0, 0.0, 3.58243940574e-20, 2.50029741756e-20, 0.0, 3.66376143805e-5, 0.000207466083063, 0.000477091394478, 0.000815736511219, 0.00120181771987, 0.00162042210042, 0.00205529141596, 0.0024934826583, 0.00292001345618, 0.00332778936495, 0.00371213641288, 0.0040700891032, 0.00439619810132, 0.00469172063958, 0.00495258812946, 0.00518248480222, 0.00538059330468, 0.00554848129215, 0.00568880081819, 0.00580423314037, 0.00589841688165, 0.00597191835943, 0.00602936817431, 0.00607168893394, 0.0061035266168, 0.00612714275208, 0.00614321360763, 0.00615559287424, 0.00616397689129, 0.00616948538103, 0.00617394395678, 0.00617718871124, 0.00617863926894, 0.00618057502373, 0.00618213672607, 0.00618210805646, 0.00618223760933, 0.00618199790448, 0.00618102087895, 0.00618042267272, 0.00617968939389, 0.00617975444142, 0.00617989858915, 0.00617967913644, 0.00617944224954, 0.00617939580299, 0.00617918678318, 0.00617899757526, 0.00617899863369, 0.00617862299668, 0.00617836729145, 0.00617827992355, 0.00617797523226, 0.00617752443119, 0.00617743068767, 0.00617728515152, 0.0061767128634, 0.00617691971029, 0.00617662862058, 0.00617665313231 ] }, spectrum_data_point_t { xystar: [0.21844799815673765, 0.06663455128009714], uv: [10.0, 5.1796894531249995], spectrum: [ 4.14745397026e-7, 2.6406579284e-7, 1.32543140345e-8, 0.0, 2.75495565463e-19, 0.0, 2.70983577987e-19, 0.0, 1.77154247881e-20, 6.33183019564e-21, 3.98538652876e-19, 0.0, 0.0, 5.1335596135e-19, 0.0, 0.0, 5.6188777859e-20, 9.53086135943e-20, 0.0, 4.27380301912e-21, 0.0, 0.0, 0.000144432222291, 0.000417457882222, 0.000784922708878, 0.00121681885915, 0.00168727824607, 0.00217487417672, 0.00266226724035, 0.00313378141315, 0.00357803687254, 0.00398980010864, 0.00436381753161, 0.00469425024955, 0.00498234937385, 0.00522776844067, 0.00543186118725, 0.00559543268191, 0.0057226461721, 0.00581433841058, 0.0058759852019, 0.00591247721153, 0.00592868320681, 0.00592930404143, 0.00592011225973, 0.00590457268879, 0.00588635577304, 0.00586647115122, 0.00584701926815, 0.00582894366649, 0.00581342037123, 0.00579978906515, 0.00578920736767, 0.00578025916366, 0.00577239092841, 0.00576648803916, 0.00576153967446, 0.00575760922614, 0.00575633707961, 0.00575573049605, 0.00575431578051, 0.00575390730731, 0.00575350145022, 0.00575251029974, 0.00575230760153, 0.00575149890848, 0.00575041376758, 0.0057497177596, 0.00574895173949, 0.00574835165223, 0.00574766343335, 0.00574797937354, 0.00574887434323, 0.00574897964003, 0.00574930562132, 0.00574987114721, 0.00574990453568, 0.00574907920559, 0.0057492693093, 0.00574928483388, 0.00574896095856 ] }, spectrum_data_point_t { xystar: [0.3066059517331741, -0.1694544723704584], uv: [11.614259765625, 1.0], spectrum: [ 0.000448055179387, 0.000448111689116, 0.000447763932322, 0.000446467048857, 0.000444232548124, 0.000440260980813, 0.000432951124157, 0.000419162769014, 0.00039477850985, 0.000354098362627, 0.000291604158114, 0.000209597314334, 0.000118180638486, 3.80368407636e-5, 0.0, 0.0, 3.74640257717e-19, 0.0, 4.4722304919e-19, 0.0, 0.0, 6.83511926982e-19, 6.89487756518e-19, 1.40936532967e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 1.00612536347e-18, 0.0, 0.0, 1.45763898626e-18, 2.64802378963e-18, 6.15739066088e-19, 0.0, 4.9942949242e-19, 0.0, 0.0, 0.0, 0.0, 0.000719361878561, 0.00217933380534, 0.00414526243809, 0.00640272288636, 0.00876694380689, 0.0110874459866, 0.0132565694278, 0.0152030782577, 0.0168893978039, 0.0183091036733, 0.0194752536715, 0.0204093434852, 0.0211395436545, 0.0216981192036, 0.0221180406573, 0.0224272162135, 0.0226519026663, 0.0228145724589, 0.0229316754484, 0.0230151189971, 0.0230737956959, 0.0231151486631, 0.0231439670959, 0.0231644786995, 0.0231792678069, 0.0231894907254, 0.0231965410465, 0.0232017514248, 0.0232049688033, 0.0232071333853, 0.0232089167722, 0.0232099117811, 0.0232107733958, 0.0232113474929, 0.0232116643364, 0.0232118727112, 0.0232118449145, 0.0232120348202, 0.0232119499786, 0.0232118551746 ] }, spectrum_data_point_t { xystar: [0.28548646753638013, -0.11296964824697227], uv: [11.227541015625, 2.0], spectrum: [ 0.000250549602027, 0.000251452709583, 0.000251035319131, 0.000251943054287, 0.000253356039742, 0.000252561421046, 0.000252810777263, 0.000250887773992, 0.000248485473205, 0.000240406275936, 0.000224181770295, 0.000198124505456, 0.000164778686088, 0.000125295331646, 8.26336566789e-5, 4.20660201895e-5, 1.16170064803e-5, 3.64812680522e-20, 0.0, 6.64503738095e-20, 3.28898900598e-20, 1.09526564068e-19, 1.08270809735e-19, 9.36651261686e-20, 0.0, 0.0, 0.0, 0.0, 1.33087073689e-19, 0.0, 1.12462849073e-19, 0.0, 4.47598299087e-20, 7.29091486159e-21, 5.25636536023e-5, 0.000328468748266, 0.000806997405984, 0.00146270484608, 0.00226944272939, 0.00319417459694, 0.00420107028513, 0.0052568451724, 0.00632408175829, 0.00737057841626, 0.00836617000443, 0.00928929219789, 0.0101209441927, 0.0108522020281, 0.011480120857, 0.0120051038558, 0.0124352216198, 0.0127803214614, 0.0130523887267, 0.0132630343465, 0.0134227726385, 0.0135410111012, 0.0136261601491, 0.0136877818466, 0.0137330371035, 0.0137658147759, 0.013789171165, 0.0138048276006, 0.0138154722901, 0.0138233251254, 0.0138293686576, 0.0138336051554, 0.0138363546725, 0.0138380840147, 0.0138391997799, 0.0138397904444, 0.0138401579417, 0.0138401551041, 0.0138402280602, 0.0138404329634, 0.0138401161483, 0.0138394661719, 0.0138392315997, 0.0138392665857, 0.0138396501605, 0.0138388950849, 0.0138388370719 ] }, spectrum_data_point_t { xystar: [0.2730599976959221, -0.07970747840702072], uv: [11.0, 2.588869140625], spectrum: [ 0.000118565233311, 0.000123262040414, 0.000128919358877, 0.000139190956308, 0.000140326915506, 0.000157471454122, 0.000164553709047, 0.000182120311266, 0.000190177335556, 0.000189546102185, 0.000195127430367, 0.000182270437578, 0.000161461630374, 0.000136216617639, 0.00010589690497, 7.3536774755e-5, 4.47953376902e-5, 2.1127706825e-5, 6.14098886759e-20, 1.18165568349e-19, 1.50522700947e-19, 6.19343199438e-20, 1.13089071484e-19, 5.40449164441e-20, 9.98284769573e-20, 9.45989491016e-20, 6.39750717648e-20, 0.0, 0.0, 0.0, 9.72512544466e-6, 0.000129756423003, 0.000359526905722, 0.000692954002978, 0.00112094150231, 0.00163698486081, 0.00223516061296, 0.0028968306559, 0.00360977044185, 0.00435946901225, 0.00511963142006, 0.0058852465185, 0.00663261560781, 0.00734299364325, 0.00800844966575, 0.00861233980877, 0.00915233244937, 0.00961890929621, 0.010016391677, 0.0103459101367, 0.0106127431111, 0.0108310173006, 0.0110007794012, 0.0111327219081, 0.0112328513819, 0.0113046598165, 0.0113554850397, 0.0113932040434, 0.0114203543128, 0.0114412190468, 0.0114574135164, 0.0114679205428, 0.0114744459452, 0.0114788104756, 0.0114822299725, 0.0114841035555, 0.011485297945, 0.0114868723497, 0.0114878306557, 0.0114875512019, 0.0114882853944, 0.0114892791972, 0.0114878998915, 0.0114882732002, 0.0114890356065, 0.0114877882955, 0.0114880021172, 0.0114878653648, 0.0114876576551, 0.0114879115507, 0.0114882008427 ] }, spectrum_data_point_t { xystar: [-0.27837992110025134, -0.19769688443220146], uv: [0.9025869140625007, 0.5000000000000004], spectrum: [ 0.0104239281828, 0.0104239093013, 0.0104229471446, 0.0104211184481, 0.0104169564189, 0.010408216388, 0.0103929509585, 0.0103650252649, 0.0103148743768, 0.0102253950866, 0.010074312785, 0.00984414033678, 0.00952251077563, 0.0091031779513, 0.00858951154235, 0.00798611371659, 0.0073002158701, 0.00654543063713, 0.00573574655304, 0.00489253073012, 0.00404232472016, 0.00320927491592, 0.00241685966162, 0.00168918816507, 0.00105208067036, 0.000533318191267, 0.000169723536218, 0.0, 0.0, 2.05547286963e-19, 1.01246688419e-19, 0.0, 1.3423878586e-19, 0.0, 2.47380442251e-19, 0.0, 1.16821137258e-19, 0.0, 0.0, 1.19172225885e-19, 3.529192653e-20, 3.37005404328e-20, 0.0, 7.63534051944e-21, 0.0, 4.45847010194e-5, 0.000121839773594, 0.000215053284068, 0.000311612312683, 0.000402844751035, 0.000485504286605, 0.000556412386062, 0.000615387823003, 0.00066195958945, 0.000698421425605, 0.000727925927516, 0.00075035783929, 0.000765864509279, 0.000777051723653, 0.000785015438684, 0.000790608775099, 0.00079535055359, 0.000797696058588, 0.000797728962314, 0.000797930398981, 0.000798554947388, 0.000799046532587, 0.000800028470433, 0.000799954971347, 0.00079901501148, 0.000798881494173, 0.000799315881926, 0.000799565780648, 0.000799590722935, 0.000799529583795, 0.000799530247533, 0.000799107199109, 0.000798712733053, 0.000798422038851, 0.000798286255173, 0.000798186621819 ] }, spectrum_data_point_t { xystar: [0.29509948609003117, -0.1976968844322015], uv: [11.403564941406248, 0.5], spectrum: [ 0.00202603816895, 0.00202403245604, 0.00202007600043, 0.00201281260783, 0.00199987976248, 0.00197814511307, 0.00193686933683, 0.00186300688783, 0.00173373309939, 0.00151841612431, 0.00119451680024, 0.000777205571495, 0.000342882992414, 2.18585131267e-5, 0.0, 0.0, 0.0, 0.0, 1.02415054517e-17, 1.01536539658e-17, 1.19524346786e-17, 1.06557291661e-17, 0.0, 8.95060455358e-18, 1.19674666925e-17, 3.64006502636e-18, 1.20440200833e-18, 5.1700636838e-18, 0.0, 2.29924269662e-17, 0.0, 1.58561845174e-17, 7.57756747454e-18, 0.0, 0.0, 0.0, 4.79240253004e-18, 0.0, 3.53258656541e-18, 0.0, 1.66234562567e-18, 0.0, 1.08946097758e-18, 2.51275764394e-18, 4.65285657194e-18, 0.00199235898488, 0.0055726815377, 0.00993720590368, 0.0144975700138, 0.018859172437, 0.0227914499404, 0.0261822930656, 0.0289959240621, 0.0312539140942, 0.033014557628, 0.0343566350042, 0.0353585737046, 0.0360936554356, 0.0366264025905, 0.0370109591966, 0.0372868007575, 0.037480731712, 0.0376161240696, 0.0377130158091, 0.0377825055681, 0.0378310271749, 0.0378658632156, 0.0378888063078, 0.0379052001371, 0.0379166245115, 0.0379245071062, 0.0379296596166, 0.0379336508317, 0.0379356057728, 0.0379369372027, 0.0379382931141, 0.0379386614219, 0.0379395856283, 0.0379392066324, 0.0379397376926, 0.0379403418607 ] }, spectrum_data_point_t { xystar: [-0.2841797794497497, -0.14121206030871533], uv: [0.7963857421875007, 1.5], spectrum: [ 0.00628432809638, 0.00628485644276, 0.00628571579639, 0.00628729205915, 0.00629178668877, 0.00630159758807, 0.00631787002298, 0.00634579461141, 0.00639401596786, 0.00647672081292, 0.00661126442131, 0.0068064107176, 0.00705936463416, 0.00735894883271, 0.00768162405171, 0.00799681783528, 0.0082671122759, 0.00845105209757, 0.00851058063867, 0.00841611210741, 0.00814900399084, 0.00770319560397, 0.00708339224395, 0.00630702792456, 0.0053918736992, 0.00436329447628, 0.00326102882011, 0.0021488987035, 0.00113528214777, 0.000361717222617, 1.0264905558e-18, 1.93668452079e-18, 0.0, 8.44920321304e-19, 2.35231843066e-20, 4.7753076814e-19, 1.53635208407e-18, 1.06725833199e-18, 0.0, 0.0, 5.10557869414e-19, 0.0, 0.0, 0.0, 5.87712433658e-18, 1.83197370939e-18, 1.24019885473e-18, 2.46747966784e-18, 2.71768790479e-18, 2.40252753623e-18, 0.0, 2.12063487708e-18, 7.54881276926e-19, 0.0, 2.003172608e-19, 0.0, 0.0, 2.32555013113e-19, 0.0, 0.0, 2.40088727814e-19, 5.35762943763e-20, 1.20849244774e-19, 7.73259704349e-20, 3.59009267938e-19, 1.50120540917e-19, 5.30257254457e-20, 0.0, 0.0, 2.28063621048e-19, 6.69156028331e-20, 5.12228686942e-20, 2.69304961117e-19, 3.91276282072e-19, 8.92560968169e-19, 5.1838416372e-19, 2.99849663328e-19, 1.66214413328e-7, 0.0, 2.4055735702e-19, 6.2139423229e-8 ] }, spectrum_data_point_t { xystar: [0.28455310366534964, -0.14121206030871533], uv: [11.2104501953125, 1.5], spectrum: [ 0.00061168578911, 0.000611388358419, 0.000613327629482, 0.000615241332934, 0.000617636141757, 0.000619479482398, 0.000620039116978, 0.000618678698867, 0.000611730662792, 0.000587932550076, 0.000551990186117, 0.000493798688772, 0.000413022101087, 0.000321884859896, 0.000219647275369, 0.000119744078958, 4.2075357895e-5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.62463103768e-20, 2.4742769796e-19, 2.80998930815e-19, 2.06585776493e-19, 0.0, 1.16890215176e-19, 0.0, 3.93228171495e-19, 2.29114683494e-19, 4.18108437463e-19, 4.56428557146e-19, 0.0, 0.0, 0.0, 0.000111855929556, 0.000619107207326, 0.00144776237315, 0.00254093636305, 0.00382753952878, 0.00522551767313, 0.00666767903981, 0.00809458055253, 0.00945624381695, 0.0107068686378, 0.0118248546796, 0.0127970826411, 0.0136162785903, 0.0142929632984, 0.0148409834083, 0.0152752750056, 0.0156113990122, 0.0158658090268, 0.0160562549776, 0.0161966265002, 0.0162980844999, 0.0163714360797, 0.0164233367231, 0.0164611575073, 0.0164881179952, 0.0165073719261, 0.0165211747086, 0.0165305481645, 0.0165363859483, 0.0165404483045, 0.0165431889098, 0.0165447766755, 0.0165460649647, 0.016546892921, 0.0165477585326, 0.0165485879385, 0.0165485931888, 0.0165489554011, 0.0165487661503, 0.0165494749914, 0.0165496786678, 0.016549860804, 0.0165502033349, 0.0165498362918 ] }, spectrum_data_point_t { xystar: [-0.2836064601186499, -0.0847272361852292], uv: [0.8068837890625007, 2.5], spectrum: [ 0.0, 3.94809627166e-18, 3.02699515885e-18, 2.17149279486e-18, 0.0, 0.0, 7.6271275878e-21, 2.66467507353e-18, 3.30558065903e-18, 0.000111068415549, 0.000555692036095, 0.0014090663424, 0.00268804719301, 0.00435479163993, 0.00631341410395, 0.00843497006169, 0.0105477516672, 0.0124582767358, 0.0139851163365, 0.0149790597822, 0.0153444876279, 0.0150424407853, 0.0140773946108, 0.0125083244581, 0.0104227528833, 0.00794384520377, 0.00525814732927, 0.00268691471403, 0.000714062213391, 0.0, 2.9151186855e-19, 0.0, 9.20456545404e-19, 6.32164411287e-18, 2.8996929534e-18, 3.24382839127e-18, 0.0, 7.55865094739e-18, 4.59959782125e-18, 2.55186210695e-18, 2.32345402355e-18, 0.0, 0.0, 0.0, 0.0, 7.81009093921e-18, 2.84338642649e-18, 1.15561073346e-17, 3.88932860562e-18, 1.16513639743e-17, 3.75720181218e-18, 7.96441876388e-19, 4.15830994252e-18, 0.0, 0.0, 0.0, 0.0, 7.81398551357e-19, 0.0, 2.0868446057e-19, 1.38585373884e-19, 0.0, 2.63419148966e-19, 0.0, 0.0, 1.75820027074e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [0.24947659500898114, -0.08372328462958752], uv: [10.568164453125, 2.5177738281249997], spectrum: [ 0.000752303150972, 0.000751456115099, 0.000751035637707, 0.000750179301397, 0.000747828322906, 0.000745257809108, 0.000741344422098, 0.000735917512662, 0.000726382278368, 0.000711889436019, 0.000687801510296, 0.000653729599782, 0.000606037169972, 0.000546898964558, 0.000476982007756, 0.000399444641529, 0.000317184415035, 0.000234230143908, 0.000155349859027, 8.69619110553e-5, 3.5073840106e-5, 3.53500195796e-6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.18139317575e-20, 2.34827716577e-20, 2.75645830151e-5, 0.000156344487784, 0.000384694991594, 0.000709784218776, 0.00112579649752, 0.00162477292269, 0.0021966748174, 0.00282800560565, 0.00350526243252, 0.00421374599292, 0.00493776094158, 0.00565989320097, 0.00636421462851, 0.00703491709098, 0.0076592244585, 0.00822833161981, 0.00873443375859, 0.00917506233502, 0.00954929929845, 0.00986077771228, 0.0101145915146, 0.0103177823394, 0.010477342052, 0.0106000016092, 0.0106924994993, 0.0107609817433, 0.0108109707158, 0.0108472063131, 0.0108732191221, 0.0108911621871, 0.0109040667093, 0.0109129889531, 0.0109189299024, 0.0109233139571, 0.0109267050423, 0.0109291390504, 0.0109307338737, 0.0109320766972, 0.0109330123631, 0.010933823782, 0.0109343381271, 0.0109346626673, 0.0109349196971, 0.010935015115, 0.0109349580342, 0.0109347746162, 0.0109346520556, 0.0109344422283, 0.0109343426886, 0.0109342433988, 0.0109342172561 ] }, spectrum_data_point_t { xystar: [0.2772021543094081, -0.10188225830032176], uv: [11.075847005208333, 2.196289713541667], spectrum: [ 0.000358595883835, 0.000358136654626, 0.000357147902036, 0.000356617878124, 0.000355719270239, 0.000354163201973, 0.000352286992504, 0.00035002619395, 0.000343982638754, 0.000331249374502, 0.000311894967909, 0.00028431972171, 0.000245906684169, 0.000198756537478, 0.000148457169262, 0.000100677501953, 5.49731457986e-5, 1.87737833635e-5, 3.453926489e-20, 2.57985631011e-21, 1.34691964862e-19, 0.0, 1.71853904884e-19, 5.86343663743e-20, 1.47942985084e-19, 2.37339839612e-19, 3.33867623516e-19, 9.69812164142e-20, 0.0, 0.0, 3.01100353513e-19, 1.67915999764e-19, 0.0, 9.86819250572e-5, 0.000362758815861, 0.000787514989029, 0.00135025276354, 0.00203749021394, 0.00282292036392, 0.00368283254374, 0.00459693070347, 0.00553234140117, 0.0064625570474, 0.00736365913062, 0.00821467396964, 0.00899667286052, 0.00969824301379, 0.0103101556098, 0.0108324475101, 0.0112698337638, 0.0116251924829, 0.01190980112, 0.0121330897322, 0.0123073493895, 0.0124389487782, 0.0125367914282, 0.0126106147833, 0.0126632186827, 0.0127017459994, 0.0127297043156, 0.0127494833486, 0.0127620632374, 0.0127714438172, 0.0127777787991, 0.0127818962192, 0.0127842524222, 0.0127860709515, 0.0127867562672, 0.0127870539959, 0.0127874290906, 0.0127872376033, 0.0127873448076, 0.0127878776929, 0.0127875851096, 0.0127879490375, 0.0127876578295, 0.0127879611665, 0.0127883219496, 0.0127885174689, 0.012788998643, 0.0127891146099 ] }, spectrum_data_point_t { xystar: [-0.28080652850165067, -0.028242412061743067], uv: [0.8581533203125007, 3.5], spectrum: [ 0.0, 0.0, 0.0, 0.0, 0.0, 1.03905484239e-17, 2.52200600561e-18, 0.0, 0.0, 0.0, 1.41670588112e-18, 0.0, 4.5002581257e-18, 0.0, 0.000742413333543, 0.00348969793744, 0.00762659958119, 0.012418656254, 0.0171073331756, 0.0209814252783, 0.0235150602453, 0.0243994054981, 0.0235076122298, 0.0209452708732, 0.0169587847365, 0.0119595684164, 0.00661105458348, 0.00204151894314, 0.0, 0.0, 0.0, 0.0, 4.68967262573e-18, 1.62189714791e-17, 0.0, 0.0, 2.10645102638e-17, 7.47702732521e-18, 1.82274150802e-17, 2.50777549836e-17, 4.10244944262e-18, 0.0, 7.72763743982e-19, 0.0, 1.30240876472e-17, 3.42162051697e-17, 4.68744716196e-18, 0.0, 4.6445437645e-17, 0.0, 2.81172855514e-17, 0.0, 1.75918940592e-17, 0.0, 0.0, 0.0, 8.68507639257e-18, 6.085151361e-18, 0.0, 4.07438727531e-18, 1.61203657002e-19, 0.0, 0.0, 0.0, 0.0, 1.60877592671e-18, 2.97809586842e-18, 6.10163294179e-19, 2.52673430511e-19, 1.84695888253e-18, 3.34459284765e-18, 3.35066269943e-18, 2.91004688899e-18, 1.89829556874e-18, 3.8902047515e-18, 0.0, 0.0, 0.0, 2.34354257907e-20, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [0.2361409527066634, -0.028242412061743067], uv: [10.3239755859375, 3.5], spectrum: [ 0.000422675476941, 0.000422108207641, 0.000420755723936, 0.000419493177081, 0.000416731579472, 0.000412052238997, 0.000408581824492, 0.000403584801514, 0.000397478228573, 0.000389983475625, 0.000379647897349, 0.000365388411384, 0.000348374190835, 0.00032756809369, 0.000303358071464, 0.000278591866108, 0.000254675537217, 0.000233343570976, 0.000214804811719, 0.000202032800285, 0.000197118526265, 0.000204448657043, 0.000226528251958, 0.00026268449046, 0.000317902691239, 0.000393807861407, 0.000495917480694, 0.000628775139543, 0.000796123284222, 0.00100252808788, 0.00124862630972, 0.00153480725621, 0.00185923579138, 0.00221806903148, 0.00260903510467, 0.00302829596251, 0.00346986476441, 0.00392815927198, 0.00439615475303, 0.00486681158281, 0.00533216480308, 0.00578435117732, 0.00621690521278, 0.00662314756107, 0.0069958983748, 0.00733168700041, 0.0076284433092, 0.00788378936149, 0.00809913141202, 0.00827702372775, 0.00842094314075, 0.00853620430526, 0.008626004853, 0.00869511369428, 0.00874760124817, 0.00878756530691, 0.00881646747115, 0.00883703713124, 0.00885230602343, 0.00886313107718, 0.00887000169776, 0.00887488156119, 0.00887831727617, 0.00888042890482, 0.00888164394655, 0.00888222971367, 0.008882952011, 0.00888337591855, 0.0088836627569, 0.00888349960944, 0.00888367089236, 0.00888337577171, 0.00888324545732, 0.00888351763733, 0.00888289266708, 0.0088829691338, 0.00888297250303, 0.00888313844468, 0.00888297711787, 0.0088830202079, 0.0088829905212 ] }, spectrum_data_point_t { xystar: [-0.27637996994525194, 0.028242412061743053], uv: [0.9392080078125007, 4.5], spectrum: [ 0.0, 1.62782010939e-17, 0.0, 0.0, 1.18099882308e-17, 0.0, 1.03793225146e-18, 0.0, 0.0, 2.32974588978e-17, 1.65685757543e-17, 0.0, 1.60319161671e-18, 0.0, 0.0, 0.0, 6.35189851361e-17, 0.00416838400449, 0.0131513287851, 0.0233835543041, 0.0320273655621, 0.0371658612996, 0.0377135879972, 0.0336703917765, 0.0257510940043, 0.0154519258439, 0.00537470904257, 0.0, 2.02985312349e-18, 5.1210815568e-17, 0.0, 0.0, 0.0, 2.99226733637e-17, 5.0054823244e-17, 4.63171287601e-17, 4.35394960715e-17, 5.36527081047e-17, 0.0, 0.0, 5.63187072993e-18, 5.11501429198e-17, 0.0, 1.75578901584e-16, 0.0, 7.33221006647e-18, 2.82872426985e-16, 0.0, 1.38037253533e-16, 4.25354817307e-17, 2.3883157815e-17, 0.0, 0.0, 5.72387607076e-17, 2.13359862942e-17, 5.46425178445e-18, 4.98793868261e-17, 1.67913900667e-18, 2.34774698486e-17, 0.0, 8.46999961289e-18, 2.01953274217e-17, 1.03834782653e-17, 1.42715524626e-18, 4.70207459287e-18, 0.0, 3.85404896879e-18, 5.67376148605e-18, 0.0, 0.0, 0.0, 0.0, 2.79282500729e-18, 6.19602475011e-18, 1.02577869928e-17, 1.17746344909e-19, 0.0, 0.0, 3.70647133437e-18, 7.2431504743e-18, 2.03864872474e-18 ] }, spectrum_data_point_t { xystar: [0.2256078766236664, 0.028242412061743053], uv: [10.1311044921875, 4.5], spectrum: [ 3.56822771849e-6, 3.28535339104e-6, 3.46459065097e-6, 3.23413499301e-6, 2.09478448538e-6, 6.76952524611e-7, 3.60338079119e-8, 0.0, 0.0, 1.78724906014e-21, 9.05418544163e-21, 2.8362742546e-22, 2.27772384505e-20, 0.0, 0.0, 1.94291012302e-20, 2.98116715124e-5, 9.25724191243e-5, 0.000187303685197, 0.000306767381721, 0.000450990643083, 0.000612991359464, 0.000791233597256, 0.000982838759525, 0.00118631701779, 0.00140223850396, 0.00162740935805, 0.00186368709263, 0.0021121000246, 0.00236987934724, 0.00263738143968, 0.00291354934657, 0.00319827542284, 0.00348808166506, 0.00378125685508, 0.00407726845996, 0.00437213180057, 0.00466434476539, 0.00495089917922, 0.00522813950758, 0.00549335824092, 0.00574411849873, 0.00597766609531, 0.00619237131576, 0.00638691072167, 0.00655992162656, 0.00671138413008, 0.00684147797815, 0.00695113830262, 0.00704170019385, 0.00711454548749, 0.00717303206736, 0.00721839616562, 0.00725322885894, 0.00727870243206, 0.00729660816371, 0.00730926134828, 0.00731826789221, 0.00732424221034, 0.00732813461069, 0.00733059582607, 0.00733238506714, 0.00733418627978, 0.00733493423057, 0.00733582575091, 0.0073366122451, 0.00733753879191, 0.00733776574005, 0.00733865296276, 0.00733955925629, 0.007340117399, 0.00734018101016, 0.00734021767528, 0.00734066264857, 0.00734023952901, 0.00734042841943, 0.00734029824306, 0.00734003290058, 0.00734009248939, 0.00733997425641, 0.00733986631081 ] }, spectrum_data_point_t { xystar: [-0.27348668949700916, 0.05872807331382255], uv: [0.9921868489583341, 5.039714192708333], spectrum: [ 2.44113460454e-17, 0.0, 0.0, 3.55265263486e-18, 0.0, 1.12067147207e-18, 0.0, 2.64812602344e-17, 0.0, 1.124394965e-17, 1.72841406419e-16, 5.6334814203e-17, 4.41460939176e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00482114341753, 0.0190097407467, 0.0345922844069, 0.0458910272793, 0.0493836127166, 0.0443789867593, 0.0321076562599, 0.0158344620622, 0.00160099595098, 0.0, 4.95964018682e-17, 3.6542527507e-17, 0.0, 0.0, 2.27976665718e-16, 0.0, 8.968619849e-17, 6.95136060138e-17, 0.0, 0.0, 2.22111338683e-16, 0.0, 0.0, 6.87590478109e-16, 0.0, 3.35408269012e-16, 5.08701717706e-16, 0.0, 1.1587462913e-16, 0.0, 0.0, 2.15042331923e-16, 0.0, 5.99814515245e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.22079176272e-17, 3.77118404989e-18, 0.0, 0.0, 0.0, 4.63396217674e-18, 4.33037048797e-18, 1.89378577264e-17, 0.0, 0.0, 3.02095785665e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.2489539411071413, 0.08042470328708243], uv: [1.441405859375, 5.423828515624999], spectrum: [ 0.0, 0.0, 0.0, 0.0, 9.12713508213e-19, 0.0, 0.0, 1.99421385301e-19, 0.0, 0.0, 1.84422225597e-18, 0.0, 7.54212691991e-19, 0.0, 1.53554118497e-18, 0.00151073543639, 0.00450490091926, 0.008482993115, 0.012896669955, 0.0171671514551, 0.0208113349644, 0.0234654054327, 0.0248762269414, 0.0249227678097, 0.0235519535324, 0.0207807358377, 0.0167228681884, 0.0117389060147, 0.00652576437705, 0.00214923152153, 0.0, 0.0, 3.71128472563e-18, 0.0, 1.25674422066e-17, 0.0, 2.87314872693e-17, 9.47517482423e-18, 2.7478802935e-17, 2.97170013013e-17, 0.0, 0.0, 0.0, 5.21164120456e-18, 0.0, 1.33735423557e-17, 3.64317892689e-18, 0.0, 3.83205909411e-17, 4.97468528582e-19, 5.4047555843e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.65317357529e-18, 9.17240039857e-19, 6.31868632858e-19, 9.82370784106e-19, 2.52716876647e-18, 7.54116704491e-19, 1.03706340135e-18, 5.84678012374e-19, 0.0, 0.0, 1.62536998505e-18, 8.61378232776e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [0.19314730407803718, 0.08110869920420279], uv: [9.536719140625, 5.4359378906249995], spectrum: [ 4.79286979596e-7, 4.46521825788e-7, 2.99223083087e-7, 1.11783605605e-7, 0.0, 6.28775257147e-21, 0.0, 0.0, 0.0, 2.10997600259e-20, 5.06846960705e-20, 0.0, 0.0, 0.0, 0.0, 8.95766203389e-7, 6.80861166029e-5, 0.000200502664505, 0.000388918609223, 0.000625218865231, 0.000899592791724, 0.00120178807441, 0.00152283258162, 0.0018553020836, 0.00219409802072, 0.0025325784328, 0.002866626155, 0.00319103552929, 0.00350133362405, 0.00379205139792, 0.00406123771418, 0.00430644706028, 0.0045260498583, 0.00472068756607, 0.00489016031345, 0.00503510594858, 0.00515489419286, 0.00525199995499, 0.00532796586272, 0.0053840726922, 0.00542382438126, 0.00544946836135, 0.00546387257781, 0.00546942768054, 0.00546815709723, 0.00546139744381, 0.00545285567053, 0.00544325508505, 0.00543333004013, 0.00542431998126, 0.00541568667676, 0.00540883405426, 0.00540373719161, 0.00539915930357, 0.00539607514366, 0.00539416971331, 0.00539227405056, 0.00539099131333, 0.005389907946, 0.00538878176491, 0.00538801149523, 0.00538744788875, 0.0053875040432, 0.00538710673839, 0.00538681370397, 0.00538684377415, 0.00538674351413, 0.00538676334072, 0.00538667216733, 0.00538658012229, 0.00538671885963, 0.00538636408309, 0.00538599483529, 0.00538582339257, 0.00538555369455, 0.00538584338772, 0.00538532501754, 0.0053851033934, 0.00538480329743, 0.00538449505942, 0.00538461199443 ] }, spectrum_data_point_t { xystar: [0.2197102251070245, 0.05986806650902312], uv: [10.023112630208333, 5.059896484375], spectrum: [ 2.9726370987e-6, 2.10185099262e-6, 1.50938270532e-6, 7.66841661172e-7, 3.13079954619e-7, 6.50129467434e-20, 0.0, 0.0, 1.52673830577e-19, 0.0, 1.09904462481e-19, 0.0, 0.0, 0.0, 0.0, 4.53516059772e-20, 2.84911034655e-19, 1.40041211603e-19, 0.0, 1.4967243856e-20, 0.0, 0.000120700984084, 0.0003453991763, 0.000644009762968, 0.000996175133115, 0.00138676099201, 0.00179955464307, 0.00221916885181, 0.00263682500299, 0.00304299378117, 0.00343083320797, 0.00379485918909, 0.00413271817456, 0.00444041835384, 0.00471784076755, 0.00496408782439, 0.00517916119572, 0.00536684780006, 0.00552413367066, 0.00565537296934, 0.0057630943374, 0.00584848934344, 0.00591657442715, 0.00596768373325, 0.00600706461198, 0.00603752905902, 0.00605943064913, 0.00607504710419, 0.00608573349947, 0.00609424518234, 0.00609923828802, 0.0061034300974, 0.00610660606482, 0.00610676370427, 0.0061068788204, 0.00610721819996, 0.00610767941899, 0.00610793181374, 0.00610783209325, 0.0061080462127, 0.00610875519837, 0.00610743279431, 0.0061067291821, 0.00610658027906, 0.00610574400508, 0.00610535333693, 0.00610462580558, 0.00610446732049, 0.00610408708307, 0.00610342794756, 0.00610347715537, 0.0061029550209, 0.00610260885136, 0.00610232408282, 0.00610206634736, 0.00610198984901, 0.00610165091713, 0.0061013801542, 0.0061008858311, 0.00610095918613, 0.0061004590366 ] }, spectrum_data_point_t { xystar: [-0.2365542759453633, 0.14121206030871536], uv: [1.6684560546875007, 6.5], spectrum: [ 5.44188461488e-18, 1.26529925677e-17, 1.1949402695e-17, 1.08961043637e-17, 0.0, 0.0, 0.0, 4.78284367836e-19, 7.35449686716e-18, 3.30439980732e-18, 1.52922501725e-18, 0.0, 0.0, 0.0, 8.36513538545e-18, 0.0, 0.000436219914947, 0.00399555564422, 0.00957857760789, 0.0159568363483, 0.0220635132764, 0.0270613672829, 0.0303362397401, 0.0315495799939, 0.0305138624785, 0.0271914144067, 0.0217416560727, 0.0147601569587, 0.00745717581835, 0.00171438572147, 0.0, 0.0, 2.05656257207e-17, 7.02685346587e-18, 0.0, 0.0, 0.0, 1.7242137684e-17, 5.70146382433e-18, 0.0, 2.94716490339e-17, 7.62115925321e-18, 0.0, 1.73966272367e-17, 3.51204619184e-17, 3.80777984231e-17, 0.0, 1.02054361413e-17, 0.0, 0.0, 1.45932175301e-17, 0.0, 0.0, 0.0, 6.62827718194e-18, 1.0383911796e-17, 1.81935629418e-18, 0.0, 1.02637504904e-18, 0.0, 2.11710587482e-18, 3.69776000207e-19, 4.42708905839e-19, 1.07314924371e-18, 3.64734455341e-18, 0.0, 5.33469640003e-18, 2.25935552658e-18, 5.16738091197e-18, 5.16335372555e-18, 4.79792942913e-18, 8.0817497964e-18, 2.61614142321e-18, 1.53409039825e-18, 2.935704131e-18, 4.43930885586e-18, 5.15587165821e-18, 4.35160663999e-18, 6.46467730251e-18, 9.39222615617e-18, 1.0424954829e-17 ] }, spectrum_data_point_t { xystar: [0.1771957256649802, 0.14121206030871536], uv: [9.2446298828125, 6.5], spectrum: [ 1.80913947623e-6, 1.26854734392e-6, 9.30529052092e-7, 2.88281153356e-7, 4.24884300322e-19, 0.0, 0.0, 0.0, 0.0, 4.74823410911e-19, 0.0, 1.25688477822e-19, 0.0, 0.0, 0.0, 8.76271769087e-20, 2.27283515817e-20, 1.80506685191e-20, 0.0, 6.67714463269e-5, 0.000324141830579, 0.000722343445089, 0.00121854399859, 0.00178000157555, 0.0023811199909, 0.00299486586087, 0.00360237049854, 0.00418372249665, 0.0047220693487, 0.0052002800617, 0.00560955173595, 0.00594357465679, 0.00619911123069, 0.00637556892061, 0.00647387282169, 0.0064976151736, 0.00645169755833, 0.00634521276402, 0.00618656641839, 0.00598265271636, 0.00574834803417, 0.00549136190308, 0.00522147451528, 0.00495309658835, 0.00469241315744, 0.00444868213332, 0.00422707340787, 0.00403002670269, 0.00385970647372, 0.00371361505597, 0.00359533563833, 0.00350049352596, 0.00342470559355, 0.00336600023703, 0.0033206584701, 0.00328756673851, 0.00326343297669, 0.00324592003785, 0.00323281957026, 0.00322342164438, 0.0032174480003, 0.00321336354506, 0.00321007632489, 0.00320747269641, 0.00320589575507, 0.00320426215322, 0.00320276961645, 0.00320195423677, 0.00320093821711, 0.00320001443213, 0.00319997456505, 0.00319925062551, 0.00319886221595, 0.00319887687527, 0.00319857320185, 0.00319847565903, 0.00319827327387, 0.00319828753023, 0.00319815388279, 0.00319838867105, 0.003198331053 ] }, spectrum_data_point_t { xystar: [-0.2289411285486655, 0.1976968844322015], uv: [1.8078603515624998, 7.5], spectrum: [ 1.44282289301e-17, 0.0, 0.0, 8.65701283388e-17, 0.0, 0.0, 0.0, 3.28271605947e-17, 0.0, 4.39405548661e-18, 0.0, 0.0, 4.11639235029e-17, 4.07787410885e-17, 0.0, 3.08656297397e-19, 3.02936355368e-17, 0.0, 0.00132485859169, 0.00955680871733, 0.0207157532139, 0.0315959819512, 0.0397879503046, 0.0438998167667, 0.043168436147, 0.0374421884081, 0.027300141317, 0.0147241852945, 0.00362439930526, 0.0, 6.73246840079e-17, 0.0, 0.0, 0.0, 4.22363469916e-17, 6.64539259184e-17, 3.01801949345e-17, 1.07889836121e-16, 0.0, 0.0, 0.0, 1.1979043399e-16, 0.0, 0.0, 1.79775083887e-16, 0.0, 7.11000644605e-17, 0.0, 0.0, 0.0, 1.44067387889e-16, 0.0, 3.62978529874e-17, 0.0, 3.03108135165e-17, 0.0, 0.0, 7.16407908708e-18, 4.96784891896e-18, 0.0, 0.0, 7.53891130709e-19, 0.0, 6.65682164036e-18, 3.37602685924e-18, 6.76169504924e-19, 2.34647922769e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.28850078495e-18, 3.99074961775e-18, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [0.14090324670637208, 0.20052114770276025], uv: [8.580078515624999, 7.550000390625001], spectrum: [ 1.5901864328e-6, 3.17164797282e-7, 4.69701640619e-7, 1.33101485698e-20, 0.0, 0.0, 0.0, 0.0, 6.47957060658e-20, 3.76743538766e-19, 0.0, 7.61345095506e-20, 1.18036418491e-19, 0.0, 2.91458586065e-19, 0.0, 0.0, 0.0, 0.000105641555067, 0.000424639837621, 0.000910410160789, 0.00151463800537, 0.00219588848271, 0.00292167644086, 0.00366464808519, 0.00440011603675, 0.00510532201929, 0.00575859233034, 0.0063375764386, 0.00682436735294, 0.00720810253951, 0.00748536294964, 0.00765189893022, 0.00770797569231, 0.00765785998305, 0.00750693343932, 0.00726417138078, 0.0069417528939, 0.00655207919317, 0.0061101611907, 0.00563194054096, 0.00513334946955, 0.00463084566089, 0.0041398716853, 0.00367129145778, 0.00323679309015, 0.0028449686056, 0.00250021771185, 0.00220286531906, 0.00195414209329, 0.00175036299464, 0.00158619207023, 0.00145709715925, 0.00135765045608, 0.00128315236153, 0.00122855743814, 0.00118837743458, 0.00115967326537, 0.00113930262722, 0.00112480266888, 0.00111428843206, 0.00110659456747, 0.00110049130828, 0.00109622081055, 0.00109343398133, 0.00109046436037, 0.00108808041843, 0.00108717877226, 0.00108592325984, 0.00108512468077, 0.00108462963925, 0.00108409642757, 0.00108381802199, 0.0010831974599, 0.00108241882262, 0.00108179531492, 0.0010810585339, 0.00108084896474, 0.00108064838418, 0.00108029696837, 0.00108047975349 ] }, spectrum_data_point_t { xystar: [0.1692047919394389, 0.183575715175304], uv: [9.098307942708333, 7.250000651041667], spectrum: [ 0.0, 0.0, 1.20389380979e-19, 0.0, 5.51476977449e-19, 1.07165364637e-18, 0.0, 1.19244705078e-18, 0.0, 3.09275001802e-19, 0.0, 3.77342329279e-19, 9.88928817581e-20, 0.0, 0.0, 0.0, 1.56165820098e-18, 0.0, 6.14696999574e-19, 0.0, 1.80133868371e-19, 1.86127239512e-19, 0.000128590532217, 0.000598134182674, 0.00130273958172, 0.00216027033064, 0.00310326964769, 0.00406706601025, 0.00499062045874, 0.00582826383141, 0.00655346080557, 0.007147659001, 0.00759917820367, 0.00789939232473, 0.00804885699682, 0.00805561628696, 0.00792813834688, 0.00768017850784, 0.00732766475966, 0.00688761913844, 0.00638363866701, 0.00583724277804, 0.0052700113843, 0.00470494650379, 0.00416077073098, 0.00365162626752, 0.00318825337313, 0.00277842613561, 0.0024255221369, 0.00212938171545, 0.00188781802547, 0.00169247238182, 0.00153611290172, 0.00141463012305, 0.00132249218056, 0.00125364276506, 0.00120377443182, 0.00116736177781, 0.0011400990554, 0.00112123116723, 0.00110847883893, 0.0010996647689, 0.00109304791818, 0.00108777297019, 0.00108360531727, 0.00108046488071, 0.00107845449886, 0.0010768712855, 0.00107577231459, 0.00107517651518, 0.00107431464886, 0.00107352546329, 0.00107337015523, 0.00107267997038, 0.00107230566623, 0.00107229472508, 0.00107203085497, 0.00107170081206, 0.00107114305081, 0.00107081022417, 0.00107083850779 ] }, spectrum_data_point_t { xystar: [-0.22273237351902372, 0.2393618337920543], uv: [1.9215488281249993, 8.237630859375], spectrum: [ 0.0, 0.0, 0.0, 4.94554227559e-17, 2.46906963833e-19, 0.0, 0.0, 6.03850122437e-17, 8.05283157717e-17, 9.30687695604e-17, 0.0, 0.0, 2.58851235384e-17, 2.40014241846e-17, 0.0, 1.11590531137e-17, 2.73269487897e-17, 3.23805580555e-17, 0.0, 0.0, 0.0117854464603, 0.0301931703029, 0.0469217960641, 0.0570083987806, 0.0577075840058, 0.0483658403969, 0.0307485120478, 0.0107565110327, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.65676416919e-16, 1.7878365547e-16, 0.0, 1.68549712547e-16, 3.28589388356e-16, 2.54857533697e-16, 0.0, 4.96578334366e-16, 1.77858203427e-16, 0.0, 0.0, 0.0, 1.04324144144e-16, 0.0, 0.0, 1.08272437594e-16, 0.0, 1.5889679549e-16, 2.93723508073e-16, 1.70892197557e-16, 1.29281087105e-16, 2.12318333764e-17, 0.0, 1.03846905665e-16, 0.0, 0.0, 1.61502866592e-17, 4.00068641356e-18, 3.30085688909e-17, 0.0, 0.0, 0.0, 2.44188236793e-18, 2.04173132788e-17, 1.89775813742e-17, 1.14922168207e-17, 5.23964226715e-17, 0.0, 4.1784919608e-17, 4.43792133801e-17, 2.83244361889e-17, 4.63155043685e-18, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.19555791187019658, 0.25658674852220487], uv: [2.419140234374999, 8.542578515625], spectrum: [ 2.30266772318e-17, 6.64318453347e-18, 0.0, 0.0, 9.83805947592e-19, 0.0, 0.0, 0.0, 0.0, 1.61232761768e-17, 8.70682910321e-19, 2.57930627017e-18, 1.57560807526e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00327880875082, 0.00925214559275, 0.0163956775009, 0.0234294467744, 0.0293388409381, 0.0334319574341, 0.0352035518563, 0.0343091217496, 0.0305804220486, 0.0242644094387, 0.0162001823665, 0.00792228307174, 0.00161628012678, 0.0, 5.40372445955e-18, 0.0, 2.65697991288e-17, 0.0, 0.0, 0.0, 6.48064308497e-17, 3.08548459088e-17, 1.82212675149e-17, 0.0, 0.0, 0.0, 0.0, 5.21348351828e-17, 4.59198633338e-17, 8.79053816212e-18, 1.31863381152e-17, 0.0, 0.0, 0.0, 4.2424308662e-17, 0.0, 0.0, 1.15578681403e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 1.31379172226e-18, 1.91125269754e-18, 0.0, 0.0, 9.54938460528e-19, 0.0, 0.0, 6.2002607238e-19, 9.00028041233e-19, 4.73944085501e-19, 9.88314004553e-19, 3.10412625318e-18, 2.67653060268e-18, 4.0754594382e-18, 1.85987842528e-18, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [0.12830358642909417, 0.2541817085556876], uv: [8.3493662109375, 8.5], spectrum: [ 7.74237155221e-20, 2.5747909799e-19, 6.07788508574e-19, 1.57629369784e-19, 1.61080529997e-20, 1.37923531744e-19, 5.62242965412e-19, 5.65961371764e-19, 0.0, 0.0, 0.0, 6.32750995829e-19, 0.0, 0.0, 4.73122070413e-19, 4.31840930675e-19, 1.87930667792e-19, 3.47728348155e-19, 4.44136529076e-19, 0.0, 0.00013613339044, 0.00063549658256, 0.00139098037326, 0.00231541849329, 0.00333924178875, 0.00440477256841, 0.00546100955567, 0.00645913631421, 0.00735315337319, 0.00810861820624, 0.00870404394031, 0.00912573973968, 0.00936769297627, 0.00942968225599, 0.00931663017848, 0.00904103303515, 0.00861651345988, 0.00806242798682, 0.00740175809308, 0.00666063600018, 0.00586710162274, 0.00505007463064, 0.0042388447056, 0.00345869099725, 0.00273337843845, 0.00208127185969, 0.00151589740733, 0.00104444135323, 0.0006683269092, 0.000384299152639, 0.00018526710977, 6.20294800893e-5, 2.92208942676e-6, 7.68376005464e-20, 0.0, 0.0, 0.0, 1.13392976746e-19, 1.9517126126e-19, 0.0, 2.25011478202e-19, 1.54187483865e-19, 2.41083053587e-19, 9.70837730932e-20, 3.73385826334e-19, 1.05630272436e-7, 1.62906363083e-19, 1.98238658804e-8, 3.10044411361e-7, 4.08702395167e-7, 3.99990871252e-7, 5.26244822101e-7, 4.49411014286e-7, 6.47917193915e-7, 7.3714349113e-7, 6.5578461788e-7, 5.92672464043e-7, 7.24097067544e-7, 4.83927699747e-7, 4.2357300216e-7, 2.60797850332e-7 ] }, spectrum_data_point_t { xystar: [-0.1833955742454785, 0.3106665326791737], uv: [2.6418447265625, 9.5], spectrum: [ 0.0, 0.0, 4.70805104299e-18, 1.75627853881e-17, 0.0, 2.60164280582e-18, 0.0, 1.88684552895e-17, 3.17531285463e-20, 0.0, 0.0, 4.07116076955e-17, 2.51386354887e-18, 7.77602486606e-20, 8.60466142095e-18, 0.0, 0.0, 1.12571560462e-17, 0.0, 0.00242111344562, 0.0105871092634, 0.0211196787864, 0.031303233555, 0.0392623730551, 0.0436443767409, 0.0435565521804, 0.0385740815825, 0.0291857893235, 0.017183314106, 0.00588367565427, 3.04389296001e-17, 0.0, 5.01264524126e-17, 1.12320729862e-16, 4.07829629754e-17, 0.0, 0.0, 0.0, 1.19796195223e-16, 0.0, 1.61136214296e-17, 5.69794922676e-17, 0.0, 0.0, 2.05774116056e-18, 0.0, 7.94271357626e-17, 9.91909037779e-17, 1.0126227779e-17, 3.14211022597e-17, 1.18468850913e-16, 0.0, 2.16600237922e-17, 0.0, 0.0, 2.14463290529e-17, 2.26694661126e-17, 2.97487108515e-17, 3.2316071497e-17, 2.49180114773e-17, 1.24776358524e-17, 8.33339818406e-18, 3.92890176765e-18, 1.14660735314e-17, 8.44614302982e-19, 0.0, 1.6036046024e-18, 4.84280150301e-18, 8.60572395419e-18, 1.8376237628e-18, 1.54237692128e-17, 1.22520187456e-17, 8.88686900106e-18, 1.08652849071e-17, 1.22069707946e-17, 1.19990263212e-17, 1.32421962169e-17, 1.4716291894e-18, 4.38581391545e-18, 1.35362747114e-17, 1.38134297119e-17 ] }, spectrum_data_point_t { xystar: [0.11695719687639743, 0.3106665326791737], uv: [8.1416025390625, 9.5], spectrum: [ 3.5102566516e-19, 9.19919246988e-19, 9.75121902453e-19, 2.43699221275e-19, 7.38027499366e-20, 4.99379641513e-19, 0.0, 5.82327680539e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 2.15381251731e-18, 0.0, 5.05470864793e-18, 1.98583767893e-18, 0.0, 3.56957726207e-18, 0.0, 3.57532929263e-19, 0.0, 1.82910280378e-19, 0.000164402478579, 0.00114332103699, 0.00265879901573, 0.00448197293626, 0.00639735696064, 0.00821500701222, 0.0097951755794, 0.0110546559441, 0.0119446310119, 0.0124371124359, 0.0125257433154, 0.0122251147748, 0.0115678179675, 0.0106011419053, 0.00938376795285, 0.00798636134079, 0.00648957822429, 0.00497655243402, 0.00353532456709, 0.00225050704446, 0.00119711829747, 0.000440016087199, 2.95503379179e-5, 9.19898511497e-19, 9.91496905163e-19, 9.46371295945e-19, 0.0, 0.0, 1.37419012135e-20, 6.40554870125e-19, 0.0, 0.0, 1.02991188318e-18, 2.52006290523e-18, 5.88846819464e-19, 4.5132396371e-19, 1.47321607005e-18, 1.0259315596e-18, 2.1001926085e-19, 1.40138384126e-19, 3.45022198159e-19, 0.0, 6.89103953948e-9, 3.81941111064e-7, 2.28107717928e-7, 3.7831361708e-7, 3.1967435292e-7, 2.03037838448e-7, 1.2708257638e-7, 1.92454689329e-7, 3.19218710892e-7, 4.74796435277e-7, 4.04011537932e-7, 4.44133715418e-7, 9.28189568219e-7, 9.23105652193e-7, 8.68469055884e-7, 8.91258188586e-7 ] }, spectrum_data_point_t { xystar: [-0.17239584289298163, 0.36715135680265987], uv: [2.8432607421875, 10.5], spectrum: [ 6.66978481294e-17, 0.0, 0.0, 0.0, 1.23698548427e-17, 0.0, 2.78110883146e-17, 0.0, 3.23929366214e-17, 0.0, 2.20415725551e-16, 0.0, 1.01735932573e-16, 0.0, 6.01147181899e-17, 1.05533600282e-16, 5.58815377179e-17, 0.0, 0.0, 1.89380148397e-17, 0.0, 0.00850868570575, 0.026886393489, 0.0458725007271, 0.0589439684282, 0.0619436066879, 0.0530196751933, 0.034014486174, 0.0119822601373, 2.99940779574e-16, 0.0, 1.27535463774e-16, 0.0, 0.0, 0.0, 2.18476937039e-16, 0.0, 1.02167960481e-16, 0.0, 3.86795325381e-16, 0.0, 3.59585922973e-16, 2.65451321869e-16, 0.0, 2.47402256807e-16, 0.0, 1.41218805641e-16, 0.0, 5.25757641063e-17, 8.23087899085e-17, 5.89974018844e-16, 0.0, 1.91108511648e-16, 1.48563012461e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.36497159584e-17, 0.0, 0.0, 0.0, 2.09367425873e-18, 0.0, 0.0, 0.0, 2.83663129423e-18, 0.0, 9.7451401807e-19, 2.12165639255e-17, 5.2949699853e-18, 4.94695111542e-19, 4.70402080404e-17, 7.92177761606e-17, 9.74901051703e-17 ] }, spectrum_data_point_t { xystar: [0.08300599406990862, 0.363257015016343], uv: [7.5199222656249995, 10.431055078124999], spectrum: [ 5.71796587953e-20, 6.46930694911e-19, 0.0, 2.14458449064e-19, 1.62263265406e-18, 0.0, 4.89325168456e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 3.39291929138e-18, 7.28503736267e-18, 5.73539378507e-19, 3.79453538551e-19, 0.0, 1.17916594971e-18, 0.0, 0.0, 3.19496556876e-18, 1.49600689261e-18, 0.000504307016975, 0.00182619929741, 0.00366458945654, 0.00577762240418, 0.00796065793936, 0.0100231744273, 0.0117968617005, 0.0131620439249, 0.0140539818246, 0.0144458570026, 0.0143368316732, 0.0137501089963, 0.0127317323754, 0.0113500689194, 0.00969058357835, 0.00785304910936, 0.00595288824071, 0.00411534886557, 0.0024748600205, 0.00116074418905, 0.000297935112677, 1.06931458966e-18, 1.23720942236e-18, 0.0, 8.17409344411e-19, 1.42192416031e-18, 0.0, 0.0, 0.0, 1.04362864604e-18, 1.82540507844e-18, 9.56169198786e-20, 0.0, 0.0, 0.0, 4.84380936351e-21, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.40647507972e-8, 0.0, 2.29098193342e-8, 4.57474690925e-7, 1.1248796319e-7, 0.0, 3.13275254995e-7, 0.0 ] }, spectrum_data_point_t { xystar: [0.11048622602865567, 0.34183251245096963], uv: [8.023112630208333, 10.051758463541665], spectrum: [ 0.0, 7.79476879092e-18, 0.0, 0.0, 0.0, 1.49316980148e-18, 0.0, 0.0, 0.0, 2.48405772926e-17, 3.54363573011e-18, 1.16527751606e-17, 0.0, 3.0322270968e-17, 1.628145479e-17, 3.3672907156e-18, 0.0, 0.0, 3.74654415978e-18, 1.59647859363e-17, 0.0, 1.34329309845e-19, 0.0, 1.58750953783e-18, 0.0, 0.0, 0.00152884857421, 0.0042607500802, 0.00740869271718, 0.0104141114935, 0.012947700883, 0.014807985521, 0.0158699337835, 0.0160873828966, 0.0154850550875, 0.0141443721204, 0.0122002272358, 0.00984136848306, 0.00728238789434, 0.00475866596266, 0.00253377300131, 0.000864652608379, 1.33741493695e-17, 0.0, 2.43026268091e-17, 0.0, 0.0, 3.68618378002e-18, 0.0, 0.0, 1.9876212397e-18, 4.23350470371e-18, 2.15533068191e-17, 0.0, 7.8639766722e-18, 9.83108344763e-19, 2.87429652883e-18, 1.37758873933e-18, 1.61376175765e-18, 4.31193441099e-18, 1.8166140782e-18, 4.1156305323e-18, 4.80171732827e-18, 8.42922645034e-18, 1.14017526525e-17, 1.20928481543e-17, 1.36939728116e-17, 1.47133423213e-17, 1.71133858719e-17, 1.55570306257e-17, 1.65183600813e-17, 1.41925830818e-17, 1.19936688958e-17, 1.27698687128e-17, 1.28776536553e-17, 9.84379339652e-18, 1.09449362279e-17, 1.3383025144e-7, 1.07699931856e-7, 4.90008559987e-18, 1.74467611311e-18 ] }, spectrum_data_point_t { xystar: [-0.16563154587583995, 0.39975152156196625], uv: [2.9671217447916667, 11.077149088541667], spectrum: [ 0.0, 7.64719810675e-16, 2.46027592254e-16, 0.0, 1.97424194247e-17, 0.0, 0.0, 4.90678201913e-16, 0.0, 3.71006221883e-16, 8.61189827443e-16, 0.0, 0.0, 3.33299601832e-16, 0.0, 0.0, 3.19739601647e-16, 3.24860974776e-16, 0.0, 2.6304875546e-16, 7.92708696601e-17, 0.0, 0.0111285266392, 0.0419644275041, 0.0702181760694, 0.0814661616267, 0.0686674024288, 0.0354686732299, 0.000532900602666, 3.59945948538e-16, 3.39632582107e-16, 1.58692622923e-16, 0.0, 7.33154804514e-16, 9.67809027452e-16, 0.0, 0.0, 0.0, 9.67679832371e-16, 3.43780596737e-16, 5.09721501476e-16, 0.0, 0.0, 0.0, 0.0, 1.12798886131e-15, 2.42569599963e-15, 1.7551114349e-15, 5.78736374519e-16, 0.0, 0.0, 0.0, 2.61730704938e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.07742675505e-16, 2.17342748402e-17, 0.0, 4.85216106491e-18, 0.0, 0.0, 5.95629258436e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.30747676921e-18, 3.81658260145e-17, 5.12214378248e-17, 6.23271411159e-17, 5.85391789472e-17, 3.76245401549e-17 ] }, spectrum_data_point_t { xystar: [-0.13713800533189321, 0.42060235013233543], uv: [3.4888667968749996, 11.446289453125], spectrum: [ 1.03550356466e-16, 7.28749494497e-17, 5.69449237428e-17, 0.0, 0.0, 2.97065321731e-18, 1.94227811545e-17, 2.8086205469e-17, 0.0, 4.22699887129e-17, 0.0, 1.66699614342e-16, 0.0, 4.26116191556e-18, 0.0, 6.63960207085e-17, 3.37155873265e-17, 3.97198665293e-17, 0.0, 0.0, 0.0, 0.00498319061689, 0.0174720390516, 0.0319953430799, 0.04441921795, 0.0517021526124, 0.0517142440591, 0.0438007418104, 0.0294046616919, 0.0126051223228, 3.77333655729e-17, 3.71462560039e-16, 0.0, 0.0, 0.0, 2.35058455014e-17, 0.0, 0.0, 1.25487701712e-16, 0.0, 0.0, 0.0, 0.0, 3.87224575731e-16, 0.0, 0.0, 3.56738502902e-17, 1.43774035531e-16, 7.03877329806e-18, 6.64028767907e-17, 1.74844177883e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 3.11992142954e-17, 0.0, 0.0, 0.0, 1.98646622963e-17, 5.92369435444e-18, 0.0, 0.0, 0.0, 0.0, 3.27604710759e-20, 0.0, 0.0, 0.0, 0.0, 4.64438187528e-18, 8.16362149928e-19, 0.0, 1.63229799354e-18, 1.04282569661e-17, 2.91899550824e-17, 2.27106473818e-17, 2.11392644328e-17, 1.77045688367e-17, 1.10351452368e-17 ] }, spectrum_data_point_t { xystar: [0.06354516803021264, 0.423636180926146], uv: [7.163575195312499, 11.5], spectrum: [ 1.83208984536e-18, 3.89631688794e-18, 8.93817268559e-18, 2.12280527863e-18, 1.37295819301e-18, 0.0, 0.0, 1.88365227071e-18, 0.0, 1.00315003328e-17, 1.42534971908e-18, 3.5889070279e-17, 2.60053835047e-17, 0.0, 3.46149186407e-18, 0.0, 1.74892742305e-17, 0.0, 0.0, 0.0, 4.47759084751e-18, 0.0, 0.0, 0.0, 0.000559251813694, 0.00344069838865, 0.00759636590377, 0.0120737597484, 0.0160580334882, 0.0190015817344, 0.0206497515996, 0.0209279665796, 0.0198785326936, 0.0176567122248, 0.0145141482971, 0.0108051386543, 0.00696552144046, 0.00350238783766, 0.000979175478232, 6.58513328198e-18, 0.0, 0.0, 2.43854125407e-17, 1.88565782295e-17, 0.0, 4.65919738906e-18, 9.69818195244e-18, 0.0, 0.0, 1.24011631896e-17, 0.0, 0.0, 5.34046280923e-18, 3.07870725492e-18, 5.03394928831e-19, 3.13215122532e-18, 4.11336188077e-19, 3.76854273383e-19, 0.0, 7.35149746763e-19, 5.18928379699e-19, 8.11539116747e-19, 3.87077868717e-21, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.2027867851e-19, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.11933934314145316, 0.46802240436486464], uv: [3.8147779947916667, 12.285807942708333], spectrum: [ 4.02526813228e-16, 0.0, 5.65207872888e-17, 0.0, 0.0, 1.24210470189e-17, 0.0, 0.0, 0.0, 2.2411274972e-16, 2.30138915965e-16, 0.0, 1.77016538637e-16, 0.0, 0.0, 8.90779746699e-17, 0.0, 0.0, 6.36822555872e-17, 2.19607701261e-17, 1.00868129247e-16, 0.0, 0.00104922353747, 0.020207928254, 0.0436371684629, 0.0612850981267, 0.0662425335065, 0.0557297689484, 0.0329253494732, 0.00844405144273, 6.24795252045e-16, 5.08157516648e-16, 3.38067138422e-16, 0.0, 0.0, 1.89937218673e-16, 0.0, 0.0, 0.0, 0.0, 0.0, 9.61984605696e-17, 5.52585840442e-16, 5.43643501646e-17, 5.7738434974e-16, 3.48457476069e-16, 0.0, 4.60136386371e-16, 1.67170384409e-16, 1.7646473694e-16, 0.0, 3.38697744292e-17, 7.6508977977e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.14395327497e-17, 1.9559092254e-16, 0.0, 0.0, 4.97860917985e-17, 0.0, 3.40068771501e-18, 8.02749777429e-17, 3.18170890541e-17, 1.75856473865e-17, 5.66842718733e-17, 5.89868031095e-17, 0.0, 0.0, 8.37253110201e-18, 0.0, 1.41245560488e-17 ] }, spectrum_data_point_t { xystar: [-0.08567259560990789, 0.4841588094634689], uv: [4.431249609375, 12.571484765625], spectrum: [ 3.01585976714e-17, 2.41407144961e-17, 0.0, 0.0, 0.0, 0.0, 7.21315236394e-18, 0.0, 2.84401822678e-17, 7.66519241567e-19, 0.0, 0.0, 3.95677097919e-17, 1.06971794701e-16, 1.78785932487e-17, 3.96517646432e-17, 2.98091020371e-17, 0.0, 0.0, 0.0, 0.0, 4.83945484713e-17, 0.00398585808348, 0.0151888068479, 0.0285891112712, 0.0403075911461, 0.0473095357681, 0.0475774265785, 0.0406181577953, 0.0279951257129, 0.0133715388476, 0.00198768536234, 0.0, 8.92197151224e-20, 1.91006653713e-17, 6.59731248547e-17, 0.0, 0.0, 5.71383844025e-18, 1.31879070644e-16, 1.8021783967e-16, 8.87996539995e-17, 0.0, 9.684059183e-17, 0.0, 9.99056127953e-19, 0.0, 2.34266749343e-17, 0.0, 1.16047649676e-17, 1.3183413082e-16, 0.0, 0.0, 0.0, 1.21546810426e-17, 0.0, 0.0, 2.69513969322e-18, 4.51427641884e-18, 3.42452923022e-18, 0.0, 0.0, 0.0, 0.0, 9.43357690638e-18, 2.134345427e-17, 6.29425369641e-18, 3.53759406393e-18, 1.63696193967e-17, 1.83264711967e-17, 7.7195056548e-18, 1.96112609374e-17, 1.30392115784e-17, 1.46916058601e-17, 1.3273039183e-17, 0.0, 2.30442678878e-18, 0.0, 0.0, 1.23492567868e-17, 4.01529693826e-17 ] }, spectrum_data_point_t { xystar: [0.025450066430565042, 0.475399248847444], uv: [6.466016015625, 12.416406640625002], spectrum: [ 0.0, 1.25749485278e-17, 0.0, 3.76319920014e-18, 0.0, 3.38063433126e-18, 4.42665585835e-19, 0.0, 3.11756990532e-17, 0.0, 2.13297557153e-17, 0.0, 3.531765107e-17, 2.36666429072e-17, 0.0, 4.21219669749e-18, 0.0, 3.97870109784e-18, 0.0, 0.0, 0.0, 2.86934073203e-17, 9.98020207202e-18, 2.44902223875e-18, 0.00233187872092, 0.00780890582714, 0.0145792536175, 0.0209922052059, 0.0257182942132, 0.0279799275337, 0.0276081594865, 0.0248353200718, 0.0201440802426, 0.0142558848071, 0.00812676945665, 0.00292168174833, 0.0, 0.0, 5.19935258333e-18, 0.0, 7.72309293574e-18, 1.34359788547e-17, 3.90417242735e-17, 5.67203986808e-18, 0.0, 5.17558136252e-18, 1.12764891677e-18, 0.0, 0.0, 9.61051082588e-18, 0.0, 8.21519492467e-18, 0.0, 4.07834901578e-18, 4.14127604637e-18, 5.65807098428e-19, 0.0, 3.3978325519e-18, 7.33677894554e-19, 0.0, 0.0, 9.56901250035e-19, 0.0, 0.0, 0.0, 3.88781611218e-18, 5.46852600797e-18, 6.79892511272e-18, 2.34592691828e-18, 4.7866650401e-18, 1.66986544669e-18, 4.71326134001e-18, 3.64365016959e-18, 2.17811558375e-18, 1.02971962999e-18, 3.99765908717e-18, 4.35762862069e-18, 5.11081079226e-18, 3.11122263852e-18, 5.75045358578e-18, 5.98577008001e-18 ] }, spectrum_data_point_t { xystar: [0.055607566335471294, 0.45342313667148976], uv: [7.018229817708333, 12.027344401041667], spectrum: [ 0.0, 1.68296145143e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.46210085566e-16, 0.0, 5.75024210688e-17, 0.0, 0.0, 1.80468397118e-17, 6.74280682275e-17, 6.90743394104e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00245724958278, 0.00986889550888, 0.0182004123204, 0.0247704006299, 0.0283437370609, 0.0285503056793, 0.0255363670802, 0.0199360083769, 0.0128599144043, 0.00585038923915, 0.000821267524753, 8.14212536757e-18, 0.0, 8.45214724806e-18, 7.14713935401e-17, 5.82039651852e-17, 0.0, 0.0, 0.0, 4.56860778618e-17, 9.279858144e-18, 0.0, 3.35685644089e-17, 3.24672608151e-17, 4.63109898541e-17, 0.0, 0.0, 2.76422474461e-17, 3.31501021153e-17, 1.79618601923e-17, 1.22677220069e-17, 0.0, 0.0, 0.0, 3.81708170948e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 2.14252222626e-18, 0.0, 0.0, 1.81659048918e-19, 0.0, 0.0, 0.0, 0.0, 2.08648543118e-19, 0.0, 0.0, 4.71739504507e-19, 5.1519608558e-19, 7.05207868148e-19, 0.0 ] }, spectrum_data_point_t { xystar: [-0.06997165996426725, 0.5197449988503355], uv: [4.718749348958333, 13.201498046874999], spectrum: [ 1.66303660376e-16, 0.0, 1.78463423974e-16, 1.44836563284e-17, 0.0, 3.45957881756e-17, 0.0, 0.0, 1.16774112254e-16, 4.08199133519e-16, 0.0, 7.68602270882e-16, 4.31088185823e-16, 7.47159296604e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.39352266752e-17, 9.89049825668e-17, 0.0148922538986, 0.0375322204041, 0.0561019055159, 0.0622309967762, 0.0526526356358, 0.0310815874729, 0.0082447704983, 0.0, 8.36513861024e-17, 0.0, 0.0, 1.61381796489e-16, 6.06891349369e-17, 1.0360820431e-16, 3.6756942106e-16, 0.0, 0.0, 1.55602190724e-16, 1.29003064495e-16, 8.09730405772e-17, 0.0, 0.0, 0.0, 2.18906424179e-16, 0.0, 0.0, 0.0, 2.53911287022e-16, 0.0, 0.0, 7.44129384506e-17, 2.35273543183e-16, 8.2557691736e-18, 2.32333214366e-17, 0.0, 2.19390900094e-17, 0.0, 2.05765307129e-17, 2.95147795093e-18, 2.71759282593e-17, 0.0, 1.87150371653e-17, 4.64717802319e-17, 1.35898045842e-17, 1.53987068718e-17, 1.65796582348e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [-0.02730599976959222, 0.5216986346081299], uv: [5.5, 13.236084960937498], spectrum: [ 9.24752934342e-17, 3.90563690066e-17, 9.51272382456e-17, 0.0, 7.99552564236e-19, 8.84485041987e-18, 1.38783261533e-18, 0.0, 8.03517774241e-17, 4.65598741548e-17, 2.54980623824e-16, 1.75109722558e-17, 7.84679737391e-17, 0.0, 0.0, 1.73983451201e-16, 0.0, 0.0, 1.24712522376e-17, 0.0, 0.0, 0.0, 1.67480335165e-17, 0.0, 0.00411137974316, 0.0172599536975, 0.0323691454927, 0.0436056883339, 0.0470594033699, 0.0417058133204, 0.0295621396273, 0.0147617271419, 0.00270647272222, 2.68132611769e-17, 0.0, 2.31240516408e-17, 4.37475755621e-17, 0.0, 5.66634765588e-18, 6.9853716488e-17, 8.55821315204e-18, 0.0, 2.04628020305e-16, 1.3434165859e-16, 7.51815277509e-17, 0.0, 0.0, 0.0, 1.9547701934e-16, 0.0, 0.0, 0.0, 3.92167072591e-17, 4.32460748909e-17, 4.48693233433e-17, 0.0, 0.0, 2.5627120413e-17, 5.8157167117e-18, 9.33975339626e-18, 0.0, 1.81647938611e-18, 1.12475627173e-17, 0.0, 4.98766018453e-18, 0.0, 0.0, 1.15098397577e-18, 0.0, 0.0, 0.0, 3.99283787308e-18, 4.33499210544e-18, 4.10460994484e-19, 3.03905884059e-19, 3.80979757403e-18, 0.0, 0.0, 4.44313844788e-19, 0.0, 0.0 ] }, spectrum_data_point_t { xystar: [0.0060087776914854825, 0.514762125368088], uv: [6.110026692708333, 13.113281901041667], spectrum: [ 0.0, 0.0, 0.0, 0.0, 0.0, 1.93338217864e-17, 2.53350889881e-17, 0.0, 0.0, 0.0, 1.61227265611e-16, 0.0, 0.0, 0.0, 4.59037251366e-16, 1.27019079857e-17, 6.40160211435e-17, 9.92561789615e-17, 0.0, 2.18941745526e-16, 2.1460175331e-16, 0.0, 1.07051751967e-16, 0.0, 1.75546062865e-17, 0.00151145772444, 0.0146955129168, 0.0303109047478, 0.0412510589145, 0.0438507111116, 0.03809308886, 0.0263481927175, 0.0124188863197, 0.00146807277693, 1.50637835621e-16, 0.0, 0.0, 1.22214262388e-17, 0.0, 6.84691033944e-17, 3.74224599397e-16, 0.0, 0.0, 0.0, 0.0, 2.99910514975e-17, 1.30789826894e-16, 1.48059435997e-16, 4.05916616996e-16, 6.45026506533e-17, 2.6606584345e-16, 0.0, 0.0, 1.07893205131e-17, 0.0, 0.0, 1.35742938534e-17, 1.44397414332e-17, 0.0, 2.2658646767e-17, 1.50832660872e-17, 0.0, 1.40668523737e-17, 5.95205406137e-18, 0.0, 6.99200268532e-18, 0.0, 0.0, 0.0, 0.0, 3.42386013034e-19, 5.04498636532e-18, 0.0, 5.16084971135e-19, 0.0, 0.0, 4.14328825874e-18, 2.56492279833e-18, 4.66543423876e-18, 9.39355685547e-18, 9.85269802799e-18 ] } +]; + +// Color matching functions. +pub const cmf_wavelength: [f64; spectrum_num_samples] = [ + 380.0, 385.0, 390.0, 395.0, 400.0, 405.0, 410.0, 415.0, 420.0, 425.0, 430.0, 435.0, 440.0, + 445.0, 450.0, 455.0, 460.0, 465.0, 470.0, 475.0, 480.0, 485.0, 490.0, 495.0, 500.0, 505.0, + 510.0, 515.0, 520.0, 525.0, 530.0, 535.0, 540.0, 545.0, 550.0, 555.0, 560.0, 565.0, 570.0, + 575.0, 580.0, 585.0, 590.0, 595.0, 600.0, 605.0, 610.0, 615.0, 620.0, 625.0, 630.0, 635.0, + 640.0, 645.0, 650.0, 655.0, 660.0, 665.0, 670.0, 675.0, 680.0, 685.0, 690.0, 695.0, 700.0, + 705.0, 710.0, 715.0, 720.0, 725.0, 730.0, 735.0, 740.0, 745.0, 750.0, 755.0, 760.0, 765.0, + 770.0, 775.0, 780.0, +]; +const cmf_x: [f64; spectrum_num_samples] = [ + 0.001368, 0.002236, 0.004243, 0.00765, 0.01431, 0.02319, 0.04351, 0.07763, 0.13438, 0.21477, + 0.2839, 0.3285, 0.34828, 0.34806, 0.3362, 0.3187, 0.2908, 0.2511, 0.19536, 0.1421, 0.09564, + 0.05795, 0.03201, 0.0147, 0.0049, 0.0024, 0.0093, 0.0291, 0.06327, 0.1096, 0.1655, 0.22575, + 0.2904, 0.3597, 0.43345, 0.51205, 0.5945, 0.6784, 0.7621, 0.8425, 0.9163, 0.9786, 1.0263, + 1.0567, 1.0622, 1.0456, 1.0026, 0.9384, 0.85445, 0.7514, 0.6424, 0.5419, 0.4479, 0.3608, + 0.2835, 0.2187, 0.1649, 0.1212, 0.0874, 0.0636, 0.04677, 0.0329, 0.0227, 0.01584, 0.011359, + 0.008111, 0.00579, 0.004109, 0.002899, 0.002049, 0.00144, 0.001, 0.00069, 0.000476, 0.000332, + 0.000235, 0.000166, 0.000117, 8.3e-05, 5.9e-05, 4.2e-05, +]; +const cmf_y: [f64; spectrum_num_samples] = [ + 3.9e-05, 6.4e-05, 0.00012, 0.000217, 0.000396, 0.00064, 0.00121, 0.00218, 0.004, 0.0073, + 0.0116, 0.01684, 0.023, 0.0298, 0.038, 0.048, 0.06, 0.0739, 0.09098, 0.1126, 0.13902, 0.1693, + 0.20802, 0.2586, 0.323, 0.4073, 0.503, 0.6082, 0.71, 0.7932, 0.862, 0.91485, 0.954, 0.9803, + 0.99495, 1.0, 0.995, 0.9786, 0.952, 0.9154, 0.87, 0.8163, 0.757, 0.6949, 0.631, 0.5668, 0.503, + 0.4412, 0.381, 0.321, 0.265, 0.217, 0.175, 0.1382, 0.107, 0.0816, 0.061, 0.04458, 0.032, + 0.0232, 0.017, 0.01192, 0.00821, 0.005723, 0.004102, 0.002929, 0.002091, 0.001484, 0.001047, + 0.00074, 0.00052, 0.000361, 0.000249, 0.000172, 0.00012, 8.5e-05, 6e-05, 4.2e-05, 3e-05, + 2.1e-05, 1.5e-05, +]; +const cmf_z: [f64; spectrum_num_samples] = [ + 0.00645, 0.01055, 0.02005, 0.03621, 0.06785, 0.1102, 0.2074, 0.3713, 0.6456, 1.03905, 1.3856, + 1.62296, 1.74706, 1.7826, 1.77211, 1.7441, 1.6692, 1.5281, 1.28764, 1.0419, 0.81295, 0.6162, + 0.46518, 0.3533, 0.272, 0.2123, 0.1582, 0.1117, 0.07825, 0.05725, 0.04216, 0.02984, 0.0203, + 0.0134, 0.00875, 0.00575, 0.0039, 0.00275, 0.0021, 0.0018, 0.00165, 0.0014, 0.0011, 0.001, + 0.0008, 0.0006, 0.00034, 0.00024, 0.00019, 0.0001, 5e-05, 3e-05, 2e-05, 1e-05, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, +]; + +pub fn xyz_from_spectrum(spectrum: &[f64; spectrum_num_samples], xyz: &mut [f64; 3]) { + *xyz = [0.0, 0.0, 0.0]; + for i in 0..spectrum_num_samples { + xyz[0] += spectrum[i] * cmf_x[i]; + xyz[1] += spectrum[i] * cmf_y[i]; + xyz[2] += spectrum[i] * cmf_z[i]; + } + xyz[0] *= spectrum_bin_size; + xyz[1] *= spectrum_bin_size; + xyz[2] *= spectrum_bin_size; +} + +// This is 1 over the integral over either CMF. +// Spectra can be mapped so that xyz=(1,1,1) is converted to constant 1 by +// dividing by this value. This is important for valid reflectances. +pub const equal_energy_reflectance: f64 = 0.009358239977091027; diff --git a/clovers/src/spectrum/spectrum_grid.rs b/clovers/src/spectrum/spectrum_grid.rs new file mode 100644 index 00000000..ae8e3ba5 --- /dev/null +++ b/clovers/src/spectrum/spectrum_grid.rs @@ -0,0 +1,149 @@ +//! Hand-converted from `spectrum_grid.h` in the supplemental material from [Physically Meaningful Rendering using Tristimulus Colours](https://doi.org/10.1111/cgf.12676) + +#![allow(clippy::pedantic)] +#![allow(missing_docs)] +#![allow(non_camel_case_types)] +#![allow(non_upper_case_globals)] +#![allow(non_snake_case)] + +use super::spectra_xyz_5nm_380_780_097::*; + +/* + * Evaluate the spectrum for xyz at the given wavelength. + */ +pub(super) fn spectrum_xyz_to_p(lambda: f64, xyz: [f64; 3]) -> f64 { + assert!(lambda >= spectrum_sample_min); + assert!(lambda <= spectrum_sample_max); + let mut xyY: [f64; 3] = [0.0, 0.0, 0.0]; + let mut uv: [f64; 2] = [0.0, 0.0]; + + let norm: f64 = 1.0 / (xyz[0] + xyz[1] + xyz[2]); + #[allow(clippy::neg_cmp_op_on_partial_ord)] + if !(norm < f64::MAX) { + return 0.0; + } + // convert to xy chromaticities + xyY[0] = xyz[0] * norm; + xyY[1] = xyz[1] * norm; + xyY[2] = xyz[1]; + + // rotate to align with grid + spectrum_xy_to_uv([xyY[0], xyY[1]], &mut uv); + + if uv[0] < 0.0 + || uv[0] >= spectrum_grid_width_f + || uv[1] < 0.0 + || uv[1] >= spectrum_grid_height_f + { + return 0.0; + } + + let uvi: [usize; 2] = [uv[0] as usize, uv[1] as usize]; + assert!(uvi[0] < spectrum_grid_width); + assert!(uvi[1] < spectrum_grid_height); + + let cell_idx: usize = uvi[0] + spectrum_grid_width * uvi[1]; + assert!(cell_idx < spectrum_grid_width * spectrum_grid_height); + // assert!(cell_idx >= 0); + + let spectrum_grid_cell_t { + inside, + num_points, + idx, + } = spectrum_grid[cell_idx]; + let num = num_points; + + // get linearly interpolated spectral power for the corner vertices: + let mut p = std::iter::repeat(0.0).take(num).collect::>(); + // this clamping is only necessary if lambda is not sure to be >= spectrum_sample_min and <= spectrum_sample_max: + let sb: f64 = //fminf(spectrum_num_samples-1e-4, fmaxf(0.0, + (lambda - spectrum_sample_min)/(spectrum_sample_max-spectrum_sample_min) * (spectrum_num_samples_f-1.0); //)); + assert!(sb >= 0.0); + assert!(sb <= spectrum_num_samples_f); + + let sb0: usize = sb as usize; + let sb1: usize = if sb0 + 1 < spectrum_num_samples { + sb0 + 1 + } else { + spectrum_num_samples - 1 + }; + let sbf: f64 = sb - sb0 as f64; + for i in 0..num { + let index = idx[i]; + assert!(index >= 0); + let index = index as usize; + assert!(sb0 < spectrum_num_samples); + assert!(sb1 < spectrum_num_samples); + let spectrum = spectrum_data_points[index].spectrum; + p[i] = spectrum[sb0] * (1.0 - sbf) + spectrum[sb1] * sbf; + } + + let mut interpolated_p: f64 = 0.0; + + if inside == 1 { + // fast path for normal inner quads: + uv[0] -= uvi[0] as f64; + uv[1] -= uvi[1] as f64; + + assert!(uv[0] >= 0.0 && uv[0] <= 1.0); + assert!(uv[1] >= 0.0 && uv[1] <= 1.0); + + // the layout of the vertices in the quad is: + // 2 3 + // 0 1 + interpolated_p = p[0] * (1.0 - uv[0]) * (1.0 - uv[1]) + + p[2] * (1.0 - uv[0]) * uv[1] + + p[3] * uv[0] * uv[1] + + p[1] * uv[0] * (1.0 - uv[1]); + } else { + // need to go through triangulation :( + // we get the indices in such an order that they form a triangle fan around idx[0]. + // compute barycentric coordinates of our xy* point for all triangles in the fan: + let ex: f64 = uv[0] - spectrum_data_points[idx[0] as usize].uv[0]; + let ey: f64 = uv[1] - spectrum_data_points[idx[0] as usize].uv[1]; + let mut e0x: f64 = spectrum_data_points[idx[1] as usize].uv[0] + - spectrum_data_points[idx[0] as usize].uv[0]; + let mut e0y: f64 = spectrum_data_points[idx[1] as usize].uv[1] + - spectrum_data_points[idx[0] as usize].uv[1]; + let mut uu: f64 = e0x * ey - ex * e0y; + for i in 0..(num - 1) { + let e1x: f64; + let e1y: f64; + if i == num - 2 { + // close the circle + e1x = spectrum_data_points[idx[1] as usize].uv[0] + - spectrum_data_points[idx[0] as usize].uv[0]; + e1y = spectrum_data_points[idx[1] as usize].uv[1] + - spectrum_data_points[idx[0] as usize].uv[1]; + } else { + e1x = spectrum_data_points[idx[i + 2] as usize].uv[0] + - spectrum_data_points[idx[0] as usize].uv[0]; + e1y = spectrum_data_points[idx[i + 2] as usize].uv[1] + - spectrum_data_points[idx[0] as usize].uv[1]; + } + let vv: f64 = ex * e1y - e1x * ey; + + // TODO: with some sign magic, this division could be deferred to the last iteration! + let area: f64 = e0x * e1y - e1x * e0y; + // normalise + let u: f64 = uu / area; + let v: f64 = vv / area; + let w: f64 = 1.0 - u - v; + // outside spectral locus (quantized version at least) or outside grid + if u < 0.0 || v < 0.0 || w < 0.0 { + uu = -vv; + e0x = e1x; + e0y = e1y; + continue; + } + + // This seems to be the triangle we've been looking for. + interpolated_p = p[0] * w + p[i + 1] * v + p[if i == num - 2 { 1 } else { i + 2 }] * u; + break; + } + } + + // now we have a spectrum which corresponds to the xy chromaticities of the input. need to scale according to the + // input brightness X+Y+Z now: + interpolated_p / norm +} diff --git a/clovers/src/textures.rs b/clovers/src/textures.rs index 0a711414..2f860fa4 100644 --- a/clovers/src/textures.rs +++ b/clovers/src/textures.rs @@ -5,11 +5,12 @@ pub mod spatial_checker; pub mod surface_checker; use enum_dispatch::enum_dispatch; +use palette::LinSrgb; pub use solid_color::*; pub use spatial_checker::*; pub use surface_checker::*; -use crate::{color::Color, Float, Vec3}; +use crate::{Float, Vec3}; #[enum_dispatch(TextureTrait)] #[derive(Clone, Debug)] @@ -29,7 +30,7 @@ pub enum Texture { pub(crate) trait TextureTrait { /// Evaluates the color of the texture at the given surface coordinates or spatial coordinate. #[must_use] - fn color(&self, u: Float, v: Float, position: Vec3) -> Color; + fn color(&self, u: Float, v: Float, position: Vec3) -> LinSrgb; } impl Default for Texture { diff --git a/clovers/src/textures/solid_color.rs b/clovers/src/textures/solid_color.rs index b7eb62e4..e5981d1d 100644 --- a/clovers/src/textures/solid_color.rs +++ b/clovers/src/textures/solid_color.rs @@ -1,29 +1,40 @@ //! A solid color texture. -use crate::{color::Color, Float, Vec3}; +use palette::{convert::IntoColorUnclamped, LinSrgb, Srgb}; + +use crate::{Float, Vec3}; use super::TextureTrait; -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug)] #[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))] /// A solid color texture. Simplest possible [Texture](crate::textures::Texture): returns a solid color at any surface coordinate or spatial position. pub struct SolidColor { /// The color of the [Texture](crate::textures::Texture). - pub color: Color, + pub color: Srgb, } impl TextureTrait for SolidColor { /// Evaluates the color ignoring the given surface coordinates and spatial position - always returns the solid color. #[must_use] - fn color(&self, _u: Float, _v: Float, _position: Vec3) -> Color { - self.color + fn color(&self, _u: Float, _v: Float, _position: Vec3) -> LinSrgb { + self.color.into_color_unclamped() } } impl SolidColor { /// Creates a new solid color texture with the specified color. #[must_use] - pub fn new(color: Color) -> Self { + pub fn new(color: Srgb) -> Self { SolidColor { color } } } + +impl Default for SolidColor { + fn default() -> Self { + // 18% grey + Self { + color: LinSrgb::new(0.18, 0.18, 0.18).into_color_unclamped(), + } + } +} diff --git a/clovers/src/textures/spatial_checker.rs b/clovers/src/textures/spatial_checker.rs index cc3e237e..72c5f21b 100644 --- a/clovers/src/textures/spatial_checker.rs +++ b/clovers/src/textures/spatial_checker.rs @@ -2,8 +2,11 @@ // TODO: object-aligned spatial checker? +use palette::convert::IntoColorUnclamped; +use palette::{LinSrgb, Srgb}; + use super::TextureTrait; -use crate::{color::Color, Float, Vec3, PI}; +use crate::{Float, Vec3, PI}; #[derive(Clone, Debug)] #[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))] @@ -11,25 +14,25 @@ use crate::{color::Color, Float, Vec3, PI}; pub struct SpatialChecker { #[cfg_attr(feature = "serde-derive", serde(default = "default_even"))] /// Uniform color for the even-numbered checkers of the texture. - pub even: Color, + pub even: Srgb, #[cfg_attr(feature = "serde-derive", serde(default = "default_odd"))] /// Uniform color for the odd-numbered checkers of the texture. - pub odd: Color, + pub odd: Srgb, #[cfg_attr(feature = "serde-derive", serde(default = "default_density_spatial"))] /// Controls the density of the checkered pattern. Default value is 1.0, which corresponds to filling a 1.0 unit cube in the coordinate system with one color of the pattern. Even values preferred - odd values may create a visually thicker stripe due to two stripes with same color being next to each other. pub density: Float, } #[cfg(feature = "serde-derive")] -fn default_even() -> Color { +fn default_even() -> Srgb { // White minus middle gray 18% - Color::new(0.82, 0.82, 0.82) + LinSrgb::new(0.82, 0.82, 0.82).into_color_unclamped() } #[cfg(feature = "serde-derive")] -fn default_odd() -> Color { +fn default_odd() -> Srgb { // Middle gray 18% - Color::new(0.18, 0.18, 0.18) + LinSrgb::new(0.18, 0.18, 0.18).into_color_unclamped() } #[cfg(feature = "serde-derive")] @@ -40,7 +43,7 @@ fn default_density_spatial() -> Float { impl SpatialChecker { /// Create a new `SpatialChecker` object with the specified colors and density. #[must_use] - pub fn new(color1: Color, color2: Color, density: Float) -> Self { + pub fn new(color1: Srgb, color2: Srgb, density: Float) -> Self { SpatialChecker { even: color1, odd: color2, @@ -52,7 +55,7 @@ impl SpatialChecker { impl TextureTrait for SpatialChecker { /// Evaluates the color at the given spatial position coordinate. Note that the `SpatialChecker` is spatial - surface coordinates are ignored. #[must_use] - fn color(&self, _u: Float, _v: Float, position: Vec3) -> Color { + fn color(&self, _u: Float, _v: Float, position: Vec3) -> LinSrgb { // TODO: convert ahead-of-time. NOTE: take into account serde-i-fication; not enough to do in `new` alone let density = self.density * PI; let sines = 1.0 // cosmetic 1 for readability of following lines :) @@ -60,9 +63,9 @@ impl TextureTrait for SpatialChecker { * (density * position.y).sin() * (density * position.z).sin(); if sines < 0.0 { - self.odd + self.odd.into_color_unclamped() } else { - self.even + self.even.into_color_unclamped() } } } diff --git a/clovers/src/textures/surface_checker.rs b/clovers/src/textures/surface_checker.rs index 0eb21ba7..33aa097f 100644 --- a/clovers/src/textures/surface_checker.rs +++ b/clovers/src/textures/surface_checker.rs @@ -1,34 +1,34 @@ //! Checkered texture based on the surface coordinates of an object. +use palette::convert::IntoColorUnclamped; +use palette::{LinSrgb, Srgb}; + use super::TextureTrait; -use crate::color::Color; -use crate::Float; -use crate::Vec3; -use crate::PI; +use crate::{Float, Vec3, PI}; #[derive(Clone, Debug)] #[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))] /// A standard checkered texture based on 2D surface UV coordinates. pub struct SurfaceChecker { #[cfg_attr(feature = "serde-derive", serde(default = "default_even"))] - pub(crate) even: Color, + pub(crate) even: Srgb, #[cfg_attr(feature = "serde-derive", serde(default = "default_odd"))] - pub(crate) odd: Color, + pub(crate) odd: Srgb, #[cfg_attr(feature = "serde-derive", serde(default = "default_density_surface"))] /// Controls the density of the checkered pattern. Default value is 10, which corresponds to using 10 tiles over the width of the object. On spheres, this means 10 tiles around the sphere. pub(crate) density: Float, } #[cfg(feature = "serde-derive")] -fn default_even() -> Color { +fn default_even() -> Srgb { // White minus middle gray 18% - Color::new(0.82, 0.82, 0.82) + LinSrgb::new(0.82, 0.82, 0.82).into_color_unclamped() } #[cfg(feature = "serde-derive")] -fn default_odd() -> Color { +fn default_odd() -> Srgb { // Middle gray 18% - Color::new(0.18, 0.18, 0.18) + LinSrgb::new(0.18, 0.18, 0.18).into_color_unclamped() } #[cfg(feature = "serde-derive")] @@ -39,7 +39,7 @@ fn default_density_surface() -> Float { impl SurfaceChecker { /// Create a new `SurfaceChecker` object with the specified colors and density. #[must_use] - pub fn new(color1: Color, color2: Color, density: Float) -> Self { + pub fn new(color1: Srgb, color2: Srgb, density: Float) -> Self { SurfaceChecker { even: color1, odd: color2, @@ -51,16 +51,16 @@ impl SurfaceChecker { impl TextureTrait for SurfaceChecker { /// Evaluates the color at the given surface position coordinates. Note that `SurfaceChecker` is surface-based, and thus ignores the spatial position coordinate. #[must_use] - fn color(&self, u: Float, v: Float, _position: Vec3) -> Color { + fn color(&self, u: Float, v: Float, _position: Vec3) -> LinSrgb { // TODO: convert ahead-of-time. NOTE: take into account serde-i-fication; not enough to do in `new` alone let density = self.density * PI; let sines = 1.0 // cosmetic 1 for readability of following lines :) * (density * u).sin() * (density * v).sin(); if sines < 0.0 { - self.odd + self.odd.into_color_unclamped() } else { - self.even + self.even.into_color_unclamped() } } } diff --git a/clovers/src/wavelength.rs b/clovers/src/wavelength.rs new file mode 100644 index 00000000..d79e8a8e --- /dev/null +++ b/clovers/src/wavelength.rs @@ -0,0 +1,75 @@ +//! The fundamental building blocks of spectral rendering. + +use core::{array::from_fn, ops::Range}; +use palette::{white_point::E, Xyz}; +use rand::rngs::SmallRng; +use rand_distr::uniform::SampleRange; + +use crate::Float; + +/// Wavelength in nanometers +pub type Wavelength = usize; + +/// The lower bound for the wavelengths, inclusive +pub const MIN_WAVELENGTH: Wavelength = 380; +/// The upper bound for the wavelenghts, exclusive +pub const MAX_WAVELENGTH: Wavelength = 780; +/// The range of wavelenghts used, inclusive low, exclusive high +pub const SPECTRUM: Range = MIN_WAVELENGTH..MAX_WAVELENGTH; +/// The length of the wavelength spectrum used +pub const SPECTRUM_SIZE: usize = MAX_WAVELENGTH - MIN_WAVELENGTH; +/// The probability of picking a specific wavelength +#[allow(clippy::cast_precision_loss)] +pub const WAVELENGTH_PROBABILITY: Float = 1.0 / (SPECTRUM_SIZE as Float); +/// The count of wavelenghts used per ray in Hero Wavelength Sampling +pub const WAVE_SAMPLE_COUNT: usize = 4; + +/// Return a random wavelength, sampled uniformly from the visible spectrum. +pub fn random_wavelength(rng: &mut SmallRng) -> Wavelength { + SPECTRUM.sample_single(rng) +} + +/// Given a hero wavelength, create additional equidistant wavelengths in the visible spectrum. Returns an array of wavelengths, with the original hero wavelength as the first one. +#[must_use] +pub fn rotate_wavelength(hero: Wavelength) -> [Wavelength; WAVE_SAMPLE_COUNT] { + from_fn(|j| { + (hero - MIN_WAVELENGTH + (j * SPECTRUM_SIZE / WAVE_SAMPLE_COUNT)) % SPECTRUM_SIZE + + MIN_WAVELENGTH + }) +} + +/// Helper function adapted from +fn gaussian(x: Float, alpha: Float, mu: Float, sigma1: Float, sigma2: Float) -> Float { + let t = (x - mu) / (if x < mu { sigma1 } else { sigma2 }); + alpha * (-(t * t) / 2.0).exp() +} + +/// Helper function adapted from +#[allow(clippy::cast_precision_loss)] +#[must_use] +pub fn wavelength_into_xyz(lambda: Wavelength) -> Xyz { + // With the wavelength λ measured in nanometers, we then approximate the 1931 color matching functions: + let l: Float = lambda as Float; + let x = 0.0 // for readability of next lines + + gaussian(l, 1.056, 599.8, 37.9, 31.0) + + gaussian(l, 0.362, 442.0, 16.0, 26.7) + + gaussian(l, -0.065, 501.1, 20.4, 26.2); + let y = gaussian(l, 0.821, 568.8, 46.9, 40.5) + gaussian(l, 0.286, 530.9, 16.3, 31.1); + let z = gaussian(l, 1.217, 437.0, 11.8, 36.0) + gaussian(l, 0.681, 459.0, 26.0, 13.8); + + // The functions above have been designed for the whitepoint E + Xyz::::new(x, y, z) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn rotate_wavelength_spread() { + let hero = 380; + let rotations = rotate_wavelength(hero); + let expected = [380, 480, 580, 680]; + assert_eq!(rotations, expected); + } +} diff --git a/scenes/bunny.json b/scenes/bunny.json deleted file mode 100644 index 8b911b0a..00000000 --- a/scenes/bunny.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "time_0": 0, - "time_1": 1, - "camera": { - "look_from": [278, 278, -800], - "look_at": [278, 278, 0], - "up": [0, 1, 0], - "vertical_fov": 40, - "aperture": 0, - "focus_distance": 10 - }, - "background_color": [0, 0, 0], - "objects": [ - { - "kind": "Quad", - "q": [555, 0, 0], - "u": [0, 0, 555], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.12, 0.45, 0.15] - } - }, - "comment": "green wall, left" - }, - { - "kind": "Quad", - "q": [0, 0, 555], - "u": [0, 0, -555], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.65, 0.05, 0.05] - } - }, - "comment": "red wall, right" - }, - { - "kind": "Quad", - "q": [0, 0, 0], - "u": [555, 0, 0], - "v": [0, 0, 555], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "floor" - }, - { - "kind": "Quad", - "q": [0, 555, 0], - "u": [555, 0, 0], - "v": [0, 0, 555], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "ceiling" - }, - { - "kind": "Quad", - "q": [0, 0, 555], - "u": [555, 0, 0], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "back wall" - }, - { - "kind": "Quad", - "q": [113, 554, 127], - "u": [330, 0, 0], - "v": [0, 0, 305], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [7, 7, 7] - } - }, - "comment": "big ceiling light" - }, - { - "kind": "STL", - "center": [378, -15, 278], - "scale": 3, - "rotation": [-90, 180, 0], - "path": "stl/bunny.stl", - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.9, 0.9, 0.9] - } - }, - "comment": "stanford bunny" - } - ], - "priority_objects": [ - { - "kind": "Quad", - "q": [113, 554, 127], - "u": [330, 0, 0], - "v": [0, 0, 305], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [7, 7, 7] - } - }, - "comment": "big ceiling light" - } - ] -} diff --git a/scenes/colorchecker.js b/scenes/colorchecker.js new file mode 100644 index 00000000..fae25bf6 --- /dev/null +++ b/scenes/colorchecker.js @@ -0,0 +1,120 @@ +let fs = require("fs"); +let path = require("path"); + +// Camera staring down from above, centered around origin +let scene = { + time_0: 0.0, + time_1: 1.0, + camera: { + look_from: [ + // TODO: fix the bad camera behavior with zero... + 1e-6, 30.0, 0.0, + ], + look_at: [0.0, 0.0, 0.0], + up: [0.0, 1.0, 0.0], + vertical_fov: 40.0, + aperture: 0.0, + focus_distance: 10.0, + }, + background_color: [0.0, 0.0, 0.0], + objects: [], + priority_objects: [], +}; + +// Big light for smooth lighting of the entire scene +let brightness = 2.5; +let light = { + kind: "Quad", + q: [-100.0, 80.0, -100.0], + u: [200.0, 0.0, 0.0], + v: [0.0, 0.0, 200.0], + material: { + kind: "DiffuseLight", + emit: { + kind: "SolidColor", + color: [brightness, brightness, brightness], + }, + }, +}; + +scene.objects.push(light); +scene.priority_objects.push(light); + +const colors = [ + // Row 1: Natural colors + [ + ["Dark skin", "#735244"], + ["Light skin", "#c29682"], + ["Blue sky", "#627a9d"], + ["Foliage", "#576c43"], + ["Blue flower", "#8580b1"], + ["Bluish green", "#67bdaa"], + ], + // Row 2: Miscellaneous colors + [ + ["Orange", "#d67e2c"], + ["Purplish blue", "#505ba6"], + ["Moderate red", "#c15a63"], + ["Purple", "#5e3c6c"], + ["Yellow green", "#9dbc40"], + ["Orange yellow", "#e0a32e"], + ], + // Row 3: Primary and secondary colors + [ + ["Blue", "#383d96"], + ["Green", "#469449"], + ["Red", "#af363c"], + ["Yellow", "#e7c71f"], + ["Magenta", "#bb5695"], + ["Cyan", "#0885a1"], + ], + // Row 4: Grayscale colors + [ + ["White", "#f3f3f2"], + ["Neutral 8", "#c8c8c8"], + ["Neutral 6.5", "#a0a0a0"], + ["Neutral 5", "#7a7a7a"], + ["Neutral 3.5", "#555555"], + ["Black", "#343434"], + ], +]; + +const hexToRgb = (hex) => { + let r = "0x" + hex[1] + hex[2]; + let g = "0x" + hex[3] + hex[4]; + let b = "0x" + hex[5] + hex[6]; + + r = r / 255.0; + g = g / 255.0; + b = b / 255.0; + + return [r, g, b]; +}; + +const width = 2.5; +const gap = 0.5; +const multiplier = width + gap; +const ystart = -0.5 * 4 * multiplier + 0.5 * gap; +const xstart = 0.5 * 4 * multiplier + 0.5 * gap; +colors.forEach((row, y) => { + row.forEach(([name, hex], x) => { + let quad = { + kind: "Quad", + // TODO: fix the camera setup, these coordinates are in weird order :| + q: [ystart + y * multiplier, width, xstart + x * -multiplier], + u: [width, 0.0, 0.0], + v: [0.0, 0.0, width], + material: { + kind: "Lambertian", + albedo: { + kind: "SolidColor", + color: hexToRgb(hex), + }, + }, + }; + scene.objects.push(quad); + }); +}); + +let json = JSON.stringify(scene); +fs.writeFileSync(path.join(__dirname, "colorchecker.json"), json); diff --git a/scenes/colorchecker.json b/scenes/colorchecker.json new file mode 100644 index 00000000..cb949bfc --- /dev/null +++ b/scenes/colorchecker.json @@ -0,0 +1 @@ +{"time_0":0,"time_1":1,"camera":{"look_from":[0.000001,30,0],"look_at":[0,0,0],"up":[0,1,0],"vertical_fov":40,"aperture":0,"focus_distance":10},"background_color":[0,0,0],"objects":[{"kind":"Quad","q":[-100,80,-100],"u":[200,0,0],"v":[0,0,200],"material":{"kind":"DiffuseLight","emit":{"kind":"SolidColor","color":[2.5,2.5,2.5]}}},{"kind":"Quad","q":[-5.75,2.5,6.25],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.45098039215686275,0.3215686274509804,0.26666666666666666]}}},{"kind":"Quad","q":[-5.75,2.5,3.25],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.7607843137254902,0.5882352941176471,0.5098039215686274]}}},{"kind":"Quad","q":[-5.75,2.5,0.25],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.3843137254901961,0.47843137254901963,0.615686274509804]}}},{"kind":"Quad","q":[-5.75,2.5,-2.75],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.3411764705882353,0.4235294117647059,0.2627450980392157]}}},{"kind":"Quad","q":[-5.75,2.5,-5.75],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.5215686274509804,0.5019607843137255,0.6941176470588235]}}},{"kind":"Quad","q":[-5.75,2.5,-8.75],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.403921568627451,0.7411764705882353,0.6666666666666666]}}},{"kind":"Quad","q":[-2.75,2.5,6.25],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.8392156862745098,0.49411764705882355,0.17254901960784313]}}},{"kind":"Quad","q":[-2.75,2.5,3.25],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.3137254901960784,0.3568627450980392,0.6509803921568628]}}},{"kind":"Quad","q":[-2.75,2.5,0.25],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.7568627450980392,0.35294117647058826,0.38823529411764707]}}},{"kind":"Quad","q":[-2.75,2.5,-2.75],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.3686274509803922,0.23529411764705882,0.4235294117647059]}}},{"kind":"Quad","q":[-2.75,2.5,-5.75],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.615686274509804,0.7372549019607844,0.25098039215686274]}}},{"kind":"Quad","q":[-2.75,2.5,-8.75],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.8784313725490196,0.6392156862745098,0.1803921568627451]}}},{"kind":"Quad","q":[0.25,2.5,6.25],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.2196078431372549,0.23921568627450981,0.5882352941176471]}}},{"kind":"Quad","q":[0.25,2.5,3.25],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.27450980392156865,0.5803921568627451,0.28627450980392155]}}},{"kind":"Quad","q":[0.25,2.5,0.25],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.6862745098039216,0.21176470588235294,0.23529411764705882]}}},{"kind":"Quad","q":[0.25,2.5,-2.75],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.9058823529411765,0.7803921568627451,0.12156862745098039]}}},{"kind":"Quad","q":[0.25,2.5,-5.75],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.7333333333333333,0.33725490196078434,0.5843137254901961]}}},{"kind":"Quad","q":[0.25,2.5,-8.75],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.03137254901960784,0.5215686274509804,0.6313725490196078]}}},{"kind":"Quad","q":[3.25,2.5,6.25],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.9529411764705882,0.9529411764705882,0.9490196078431372]}}},{"kind":"Quad","q":[3.25,2.5,3.25],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.7843137254901961,0.7843137254901961,0.7843137254901961]}}},{"kind":"Quad","q":[3.25,2.5,0.25],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.6274509803921569,0.6274509803921569,0.6274509803921569]}}},{"kind":"Quad","q":[3.25,2.5,-2.75],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.47843137254901963,0.47843137254901963,0.47843137254901963]}}},{"kind":"Quad","q":[3.25,2.5,-5.75],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.3333333333333333,0.3333333333333333,0.3333333333333333]}}},{"kind":"Quad","q":[3.25,2.5,-8.75],"u":[2.5,0,0],"v":[0,0,2.5],"material":{"kind":"Lambertian","albedo":{"kind":"SolidColor","color":[0.20392156862745098,0.20392156862745098,0.20392156862745098]}}}],"priority_objects":[{"kind":"Quad","q":[-100,80,-100],"u":[200,0,0],"v":[0,0,200],"material":{"kind":"DiffuseLight","emit":{"kind":"SolidColor","color":[2.5,2.5,2.5]}}}]} \ No newline at end of file diff --git a/scenes/cornell.json b/scenes/cornell.json index 02f32104..2b14acf5 100644 --- a/scenes/cornell.json +++ b/scenes/cornell.json @@ -80,7 +80,7 @@ "kind": "Sphere", "center": [190, 90, 190], "radius": 90, - "material": "glass", + "material": "Dense flint glass SF10", "comment": "glass sphere" } ], @@ -97,20 +97,16 @@ "kind": "Sphere", "center": [190, 90, 190], "radius": 90, - "material": { - "kind": "Dielectric", - "refractive_index": 1.5, - "color": [1, 1, 1] - }, + "material": "Dense flint glass SF10", "comment": "glass sphere" } ], "materials": [ { - "name": "glass", - "kind": "Dielectric", - "refractive_index": 1.5, - "color": [1, 1, 1] + "name": "Dense flint glass SF10", + "kind": "Dispersive", + "cauchy_a": 1.728, + "cauchy_b": 0.01342 }, { "name": "lamp", diff --git a/scenes/cornell_with_subsurface_sphere.json b/scenes/cornell_with_subsurface_sphere.json deleted file mode 100644 index 2cfd9ffa..00000000 --- a/scenes/cornell_with_subsurface_sphere.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "time_0": 0, - "time_1": 1, - "camera": { - "look_from": [278, 278, -800], - "look_at": [278, 278, 0], - "up": [0, 1, 0], - "vertical_fov": 40, - "aperture": 0, - "focus_distance": 10 - }, - "background_color": [0, 0, 0], - "objects": [ - { - "kind": "Quad", - "q": [555, 0, 0], - "u": [0, 0, 555], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.12, 0.45, 0.15] - } - }, - "comment": "green wall, left" - }, - { - "kind": "Quad", - "q": [0, 0, 555], - "u": [0, 0, -555], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.65, 0.05, 0.05] - } - }, - "comment": "red wall, right" - }, - { - "kind": "Quad", - "q": [0, 0, 0], - "u": [555, 0, 0], - "v": [0, 0, 555], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "floor" - }, - { - "kind": "Quad", - "q": [0, 555, 0], - "u": [555, 0, 0], - "v": [0, 0, 555], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "ceiling" - }, - { - "kind": "Quad", - "q": [0, 0, 555], - "u": [555, 0, 0], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "back wall" - }, - { - "kind": "Quad", - "q": [113, 554, 127], - "u": [330, 0, 0], - "v": [0, 0, 305], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [7, 7, 7] - } - }, - "comment": "big ceiling light" - }, - { - "kind": "Sphere", - "center": [278, 278, 278], - "radius": 120, - "material": { - "kind": "Dielectric", - "refractive_index": 1.5, - "color": [1, 1, 1] - } - }, - { - "kind": "ConstantMedium", - "boundary": { - "kind": "Sphere", - "center": [278, 278, 278], - "radius": 119 - }, - "density": 0.2, - "texture": { - "kind": "SolidColor", - "color": [0.2, 0.4, 0.9] - } - } - ], - "priority_objects": [ - { - "kind": "Quad", - "q": [113, 554, 127], - "u": [330, 0, 0], - "v": [0, 0, 305], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [7, 7, 7] - } - }, - "comment": "big ceiling light" - } - ] -} diff --git a/scenes/default_values_scene.json b/scenes/default_values_scene.json deleted file mode 100644 index ed81380b..00000000 --- a/scenes/default_values_scene.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "time_0": 0, - "time_1": 1, - "camera": { - "look_from": [278, 278, -800], - "look_at": [278, 278, 0], - "up": [0, 1, 0], - "vertical_fov": 40, - "aperture": 0, - "focus_distance": 10 - }, - "background_color": [0, 0, 0], - "objects": [ - { - "kind": "Quad", - "q": [555, 0, 0], - "u": [0, 0, 555], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.12, 0.45, 0.15] - } - }, - "comment": "green wall, left" - }, - { - "kind": "Quad", - "q": [0, 0, 555], - "u": [0, 0, -555], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.65, 0.05, 0.05] - } - }, - "comment": "red wall, right" - }, - { - "kind": "Quad", - "q": [0, -0.001, 0], - "u": [555, 0, 0], - "v": [0, 0, 555], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SpatialChecker", - "density": 0.1 - } - }, - "comment": "floor. note slightly moved y axis for spatial checker to be visible and not in the exact transition plane" - }, - { - "kind": "Quad", - "q": [0, 555, 0], - "u": [555, 0, 0], - "v": [0, 0, 555], - "comment": "ceiling" - }, - { - "kind": "Quad", - "q": [0, 0, 555], - "u": [555, 0, 0], - "v": [0, 555, 0], - "comment": "back wall" - }, - { - "kind": "Quad", - "q": [113, 554, 127], - "u": [330, 0, 0], - "v": [0, 0, 305], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [7, 7, 7] - } - }, - "comment": "big ceiling light" - }, - { - "kind": "Translate", - "offset": [265, 0, 295], - "object": { - "kind": "RotateY", - "angle": 15, - "object": { - "kind": "ConstantMedium", - "boundary": { - "kind": "Boxy", - "corner_0": [0, 0, 0], - "corner_1": [165, 330, 165] - } - } - } - }, - { - "kind": "Sphere", - "center": [190, 90, 190], - "radius": 90, - "material": { - "kind": "Dielectric" - } - } - ], - "priority_objects": [ - { - "kind": "Quad", - "q": [113, 554, 127], - "u": [330, 0, 0], - "v": [0, 0, 305], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [7, 7, 7] - } - }, - "comment": "big ceiling light" - }, - { - "kind": "Sphere", - "center": [190, 90, 190], - "radius": 90 - } - ] -} diff --git a/scenes/dispersive.json b/scenes/dispersive.json new file mode 100644 index 00000000..37de7a4e --- /dev/null +++ b/scenes/dispersive.json @@ -0,0 +1,150 @@ +{ + "time_0": 0, + "time_1": 1, + "camera": { + "look_from": [-600, 310, -400], + "look_at": [0, 310, 0], + "up": [0, 1, 0], + "vertical_fov": 35, + "aperture": 0, + "focus_distance": 10 + }, + "background_color": [0, 0, 0], + "objects": [ + { + "kind": "Quad", + "q": [555, 0, 0], + "u": [0, 0, 555], + "v": [0, 555, 0], + "material": "grey wall", + "comment": "wall, left" + }, + { + "kind": "Quad", + "q": [113, 750, 127], + "u": [330, 0, 0], + "v": [0, 0, 305], + "material": "big lamp", + "comment": "big ceiling light" + }, + { + "kind": "Quad", + "q": [277, 554, 140], + "u": [10, 0, 0], + "v": [0, 0, 278], + "material": "narrow lamp", + "comment": "narrow ceiling light" + }, + { + "kind": "STL", + "center": [300, 350, 278], + "scale": 20, + "rotation": [0, 0, -30], + "path": "stl/prism.stl", + "material": "Dense flint glass SF10", + "comment": "triangular prism" + } + ], + "priority_objects": [ + { + "kind": "Quad", + "q": [113, 750, 127], + "u": [330, 0, 0], + "v": [0, 0, 305], + "material": "big lamp", + "comment": "big ceiling light" + }, + { + "kind": "Quad", + "q": [277, 554, 140], + "u": [10, 0, 0], + "v": [0, 0, 278], + "material": "narrow lamp", + "comment": "narrow ceiling light" + }, + { + "kind": "STL", + "center": [300, 350, 278], + "scale": 20, + "rotation": [0, 0, -30], + "path": "stl/prism.stl", + "material": "Dense flint glass SF10", + "comment": "triangular prism" + } + ], + "materials": [ + { + "name": "dielectric glass", + "kind": "Dielectric", + "refractive_index": 1.5, + "color": [1, 1, 1] + }, + { + "name": "Fused silica", + "kind": "Dispersive", + "cauchy_a": 1.458, + "cauchy_b": 0.00354 + }, + { + "name": "Borosilicate glass BK7", + "kind": "Dispersive", + "cauchy_a": 1.5046, + "cauchy_b": 0.0042 + }, + { + "name": "Hard crown glass K5", + "kind": "Dispersive", + "cauchy_a": 1.522, + "cauchy_b": 0.00459 + }, + { + "name": "Barium crown glass BaK4", + "kind": "Dispersive", + "cauchy_a": 1.569, + "cauchy_b": 0.00531 + }, + { + "name": "Barium flint glass BaF10", + "kind": "Dispersive", + "cauchy_a": 1.67, + "cauchy_b": 0.00743 + }, + { + "name": "Dense flint glass SF10", + "kind": "Dispersive", + "cauchy_a": 1.728, + "cauchy_b": 0.01342 + }, + { + "name": "Super dispersive glass", + "kind": "Dispersive", + "cauchy_a": 1.8, + "cauchy_b": 0.5 + }, + { + "name": "big lamp", + "kind": "DiffuseLight", + "emit": { + "kind": "SolidColor", + "color": [2, 2, 2] + } + }, + { + "name": "narrow lamp", + "kind": "ConeLight", + "spread": 2.0, + "emit": { + "kind": "SolidColor", + "color": [25, 25, 25] + } + }, + { + "name": "grey wall", + "kind": "Lambertian", + "albedo": { + "kind": "SolidColor", + "color": [0.73, 0.73, 0.73] + } + } + ] +} diff --git a/scenes/dragon.json b/scenes/dragon.json deleted file mode 100644 index 669e0cd1..00000000 --- a/scenes/dragon.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "time_0": 0, - "time_1": 1, - "camera": { - "look_from": [300, 300, -500], - "look_at": [300, 300, 0], - "up": [0, 1, 0], - "vertical_fov": 40, - "aperture": 0, - "focus_distance": 10 - }, - "background_color": [0, 0, 0], - "objects": [ - { - "kind": "STL", - "comment": "dragon", - "path": "stl/dragon.stl", - "rotation": [-90, 180, 0], - "center": [300, 300, 600], - "scale": 15, - "material": { - "kind": "Metal", - "albedo": { - "kind": "SolidColor", - "color": [0.9, 0.6, 0.3] - } - } - }, - { - "kind": "Quad", - "q": [-5000, 0, -500], - "u": [10000, 0, 0], - "v": [0, 0, 10000], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SurfaceChecker", - "even": [0.9, 0.9, 0.9], - "odd": [0.1, 0.1, 0.1], - "density": 100 - } - }, - "comment": "floor" - }, - { - "kind": "Quad", - "q": [0, 600, 0], - "u": [600, 0, 0], - "v": [0, 0, 300], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [10, 10, 10] - } - }, - "comment": "big ceiling light" - } - ], - "priority_objects": [ - { - "kind": "Quad", - "q": [0, 600, 0], - "u": [600, 0, 0], - "v": [0, 0, 300], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [10, 10, 10] - } - }, - "comment": "big ceiling light" - } - ] -} diff --git a/scenes/duck.json b/scenes/duck.json deleted file mode 100644 index 3198bfb2..00000000 --- a/scenes/duck.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "time_0": 0, - "time_1": 1, - "camera": { - "look_from": [278, 278, -800], - "look_at": [278, 278, 0], - "up": [0, 1, 0], - "vertical_fov": 40, - "aperture": 0, - "focus_distance": 10 - }, - "background_color": [0, 0, 0], - "objects": [ - { - "kind": "Quad", - "q": [555, 0, 0], - "u": [0, 0, 555], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.12, 0.45, 0.15] - } - }, - "comment": "green wall, left" - }, - { - "kind": "Quad", - "q": [0, 0, 555], - "u": [0, 0, -555], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.65, 0.05, 0.05] - } - }, - "comment": "red wall, right" - }, - { - "kind": "Quad", - "q": [0, 0, 0], - "u": [555, 0, 0], - "v": [0, 0, 555], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "floor" - }, - { - "kind": "Quad", - "q": [0, 555, 0], - "u": [555, 0, 0], - "v": [0, 0, 555], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "ceiling" - }, - { - "kind": "Quad", - "q": [0, 0, 555], - "u": [555, 0, 0], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "back wall" - }, - { - "kind": "Quad", - "q": [113, 554, 127], - "u": [330, 0, 0], - "v": [0, 0, 305], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [7, 7, 7] - } - }, - "comment": "big ceiling light" - }, - { - "kind": "STL", - "center": [278, 70, 278], - "scale": 3, - "rotation": [-90, 135, 0], - "path": "stl/duck.stl", - "material": { - "kind": "Metal", - "fuzz": 0.03, - "albedo": { - "kind": "SolidColor", - "color": [0.9, 0.9, 0.1] - } - }, - "comment": "rubber duck" - } - ], - "priority_objects": [ - { - "kind": "Quad", - "q": [113, 554, 127], - "u": [330, 0, 0], - "v": [0, 0, 305], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [7, 7, 7] - } - }, - "comment": "big ceiling light" - } - ] -} diff --git a/scenes/gltf_scifi_helmet.json b/scenes/gltf_scifi_helmet.json index ec4724dd..2b531f85 100644 --- a/scenes/gltf_scifi_helmet.json +++ b/scenes/gltf_scifi_helmet.json @@ -9,7 +9,7 @@ "aperture": 0, "focus_distance": 10.0 }, - "background_color": [0.1, 0.1, 0.1], + "background_color": [0.3, 0.3, 0.3], "objects": [ { "kind": "GLTF", @@ -23,7 +23,7 @@ "kind": "DiffuseLight", "emit": { "kind": "SolidColor", - "color": [2.0, 2.0, 2.0] + "color": [5.0, 5.0, 5.0] } } } @@ -37,7 +37,7 @@ "kind": "DiffuseLight", "emit": { "kind": "SolidColor", - "color": [2.0, 2.0, 2.0] + "color": [5.0, 5.0, 5.0] } } } diff --git a/scenes/gltf_water_bottle.json b/scenes/gltf_water_bottle.json index 6f33d0ed..f8ad530f 100644 --- a/scenes/gltf_water_bottle.json +++ b/scenes/gltf_water_bottle.json @@ -9,7 +9,7 @@ "aperture": 0, "focus_distance": 10.0 }, - "background_color": [0.1, 0.1, 0.1], + "background_color": [0.3, 0.3, 0.3], "objects": [ { "kind": "GLTF", @@ -23,7 +23,7 @@ "kind": "DiffuseLight", "emit": { "kind": "SolidColor", - "color": [1, 1, 1] + "color": [2.0, 2.0, 2.0] } } } @@ -37,7 +37,7 @@ "kind": "DiffuseLight", "emit": { "kind": "SolidColor", - "color": [1, 1, 1] + "color": [2.0, 2.0, 2.0] } } } diff --git a/scenes/noir.json b/scenes/noir.json deleted file mode 100644 index 5dbf8abd..00000000 --- a/scenes/noir.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "time_0": 0, - "time_1": 1, - "camera": { - "look_from": [278, 278, -800], - "look_at": [278, 278, 0], - "up": [0, 1, 0], - "vertical_fov": 40, - "aperture": 0, - "focus_distance": 10 - }, - "background_color": [0, 0, 0], - "objects": [ - { - "kind": "Translate", - "offset": [265, 0, 295], - "object": { - "kind": "RotateY", - "angle": 15, - "object": { - "kind": "Boxy", - "corner_0": [0, 0, 0], - "corner_1": [165, 330, 165], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - } - } - } - }, - { - "kind": "Quad", - "q": [113, 554, 127], - "u": [330, 0, 0], - "v": [0, 0, 305], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [7, 7, 7] - } - }, - "comment": "big ceiling light" - }, - { - "kind": "Sphere", - "center": [190, 90, 190], - "radius": 90, - "material": { - "kind": "Dielectric", - "refractive_index": 1.5, - "color": [1, 1, 1] - } - } - ], - "priority_objects": [ - { - "kind": "Quad", - "q": [113, 554, 127], - "u": [330, 0, 0], - "v": [0, 0, 305], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [7, 7, 7] - } - }, - "comment": "big ceiling light" - }, - { - "kind": "Sphere", - "center": [190, 90, 190], - "radius": 90, - "material": { - "kind": "Dielectric", - "refractive_index": 1.5, - "color": [1, 1, 1] - } - } - ] -} diff --git a/scenes/teapot.json b/scenes/teapot.json deleted file mode 100644 index 80faae11..00000000 --- a/scenes/teapot.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "time_0": 0, - "time_1": 1, - "camera": { - "look_from": [278, 278, -800], - "look_at": [278, 278, 0], - "up": [0, 1, 0], - "vertical_fov": 40, - "aperture": 0, - "focus_distance": 10 - }, - "background_color": [0, 0, 0], - "objects": [ - { - "kind": "Quad", - "q": [555, 0, 0], - "u": [0, 0, 555], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.12, 0.45, 0.15] - } - }, - "comment": "green wall, left" - }, - { - "kind": "Quad", - "q": [0, 0, 555], - "u": [0, 0, -555], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.65, 0.05, 0.05] - } - }, - "comment": "red wall, right" - }, - { - "kind": "Quad", - "q": [0, 0, 0], - "u": [555, 0, 0], - "v": [0, 0, 555], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "floor" - }, - { - "kind": "Quad", - "q": [0, 555, 0], - "u": [555, 0, 0], - "v": [0, 0, 555], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "ceiling" - }, - { - "kind": "Quad", - "q": [0, 0, 555], - "u": [555, 0, 0], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "back wall" - }, - { - "kind": "Quad", - "q": [113, 554, 127], - "u": [330, 0, 0], - "v": [0, 0, 305], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [7, 7, 7] - } - }, - "comment": "big ceiling light" - }, - { - "kind": "STL", - "center": [278, 100, 278], - "scale": 25, - "rotation": [-90, 180, 0], - "path": "stl/teapot.stl", - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.9, 0.9, 0.9] - } - }, - "comment": "utah teapot" - } - ], - "priority_objects": [ - { - "kind": "Quad", - "q": [113, 554, 127], - "u": [330, 0, 0], - "v": [0, 0, 305], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [7, 7, 7] - } - }, - "comment": "big ceiling light" - } - ] -} diff --git a/scenes/triangles.json b/scenes/triangles.json deleted file mode 100644 index ee7542e7..00000000 --- a/scenes/triangles.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "time_0": 0, - "time_1": 1, - "camera": { - "look_from": [278, 278, -800], - "look_at": [278, 278, 0], - "up": [0, 1, 0], - "vertical_fov": 40, - "aperture": 0, - "focus_distance": 10 - }, - "background_color": [0, 0, 0], - "objects": [ - { - "kind": "Quad", - "q": [555, 0, 0], - "u": [0, 0, 555], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.12, 0.45, 0.15] - } - }, - "comment": "green wall, left" - }, - { - "kind": "Quad", - "q": [0, 0, 555], - "u": [0, 0, -555], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.65, 0.05, 0.05] - } - }, - "comment": "red wall, right" - }, - { - "kind": "Quad", - "q": [0, 0, 0], - "u": [555, 0, 0], - "v": [0, 0, 555], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "floor" - }, - { - "kind": "Quad", - "q": [0, 555, 0], - "u": [555, 0, 0], - "v": [0, 0, 555], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "ceiling" - }, - { - "kind": "Quad", - "q": [0, 0, 555], - "u": [555, 0, 0], - "v": [0, 555, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.73, 0.73, 0.73] - } - }, - "comment": "back wall" - }, - { - "kind": "Quad", - "q": [113, 554, 127], - "u": [330, 0, 0], - "v": [0, 0, 305], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [7, 7, 7] - } - }, - "comment": "big ceiling light" - }, - { - "kind": "Triangle", - "q": [255, 10, 255], - "u": [0, 100, 0], - "v": [100, 0, 0], - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SolidColor", - "color": [0.72, 0.72, 0.72] - } - }, - "comment": "triangle red" - }, - { - "kind": "Triangle", - "q": [0, 0, 0], - "u": [0, 0, 0], - "v": [0, 0, 0], - "comment": "empty object to appease bvhnode creation" - } - ], - "priority_objects": [ - { - "kind": "Quad", - "q": [113, 554, 127], - "u": [330, 0, 0], - "v": [0, 0, 305], - "material": { - "kind": "DiffuseLight", - "emit": { - "kind": "SolidColor", - "color": [7, 7, 7] - } - }, - "comment": "big ceiling light" - } - ] -} diff --git a/scenes/two_checkered_spheres.json b/scenes/two_checkered_spheres.json deleted file mode 100644 index e4246de1..00000000 --- a/scenes/two_checkered_spheres.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "time_0": 0, - "time_1": 1, - "camera": { - "look_from": [13, 2, 3], - "look_at": [0, 0, 0], - "up": [0, 1, 0], - "vertical_fov": 20, - "aperture": 0, - "focus_distance": 1 - }, - "background_color": [0.7, 0.7, 0.7], - "objects": [ - { - "kind": "Sphere", - "center": [0, -10, 0], - "radius": 10, - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SurfaceChecker", - "even": [0.2, 0.3, 0.1], - "odd": [0.9, 0.9, 0.9], - "density": 10 - } - } - }, - { - "kind": "Sphere", - "center": [0, 10, 0], - "radius": 10, - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SurfaceChecker", - "even": [0.2, 0.3, 0.1], - "odd": [0.9, 0.9, 0.9], - "density": 10 - } - } - } - ], - "priority_objects": [ - { - "kind": "Sphere", - "center": [0, -10, 0], - "radius": 10, - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SurfaceChecker", - "even": [0.2, 0.3, 0.1], - "odd": [0.9, 0.9, 0.9], - "density": 10 - } - } - }, - { - "kind": "Sphere", - "center": [0, 10, 0], - "radius": 10, - "material": { - "kind": "Lambertian", - "albedo": { - "kind": "SurfaceChecker", - "even": [0.2, 0.3, 0.1], - "odd": [0.9, 0.9, 0.9], - "density": 10 - } - } - } - ] -} diff --git a/stl/prism.stl b/stl/prism.stl new file mode 100644 index 00000000..1ff5f579 Binary files /dev/null and b/stl/prism.stl differ