From d5895a03d60f70183272600490a7a4cc0813e238 Mon Sep 17 00:00:00 2001 From: Udo Eisenbarth <udo.eisenbarth@web.de> Date: Wed, 26 Jul 2023 13:53:05 +0200 Subject: [PATCH] Reenable lens_test example --- examples/lens_test.rs | 32 +++++++------- src/analyzer.rs | 1 + src/nodes/beam_splitter.rs | 5 +++ src/nodes/ideal_filter.rs | 5 +++ src/nodes/lens.rs | 89 ++++++++++++++++++++++---------------- src/nodes/mod.rs | 5 ++- 6 files changed, 81 insertions(+), 56 deletions(-) diff --git a/examples/lens_test.rs b/examples/lens_test.rs index bc7ec608..9b5a8d11 100644 --- a/examples/lens_test.rs +++ b/examples/lens_test.rs @@ -1,24 +1,24 @@ -// use opossum::{Detector, -// optic_scenery::OpticScenery -// }; -// use std::io::Write; +use opossum::nodes::{RealLens, Source}; +use opossum::{nodes::Detector, optic_scenery::OpticScenery}; +use std::fs::File; +use std::io::Write; use opossum::error::OpossumError; fn main() -> Result<(), OpossumError> { - // let mut scenery = OpticScenery::new(); - // scenery.set_description("Lens Ray-trace test".into()); - // let src = scenery.add_element("Source", Source::default()); - // let l1 = scenery.add_element("Lens 1", RealLens::default()); - // let l2 = scenery.add_element("Lens 2", RealLens::default()); - // let det=scenery.add_element("Detector", Detector::default()); + let mut scenery = OpticScenery::new(); + scenery.set_description("Lens Ray-trace test".into()); + let src = scenery.add_element("Source", Source::default()); + let l1 = scenery.add_element("Lens 1", RealLens::default()); + let l2 = scenery.add_element("Lens 2", RealLens::default()); + let det = scenery.add_element("Detector", Detector::default()); - // scenery.connect_nodes(src, "out1", l1, "in1")?; - // scenery.connect_nodes(l1, "out1", l2, "in1")?; - // scenery.connect_nodes(l2, "out1", det, "in1")?; + scenery.connect_nodes(src, "out1", l1, "in1")?; + scenery.connect_nodes(l1, "out1", l2, "in1")?; + scenery.connect_nodes(l2, "out1", det, "in1")?; - // let path = "lens_system.dot"; - // let mut output = File::create(path).unwrap(); - // write!(output, "{}", scenery.to_dot()).unwrap(); + let path = "lens_system.dot"; + let mut output = File::create(path).unwrap(); + write!(output, "{}", scenery.to_dot()).unwrap(); Ok(()) } diff --git a/src/analyzer.rs b/src/analyzer.rs index 43cf145f..aca57780 100644 --- a/src/analyzer.rs +++ b/src/analyzer.rs @@ -19,4 +19,5 @@ impl AnalyzerEnergy { pub enum AnalyzerType { Energy, + ParAxialRayTrace, } diff --git a/src/nodes/beam_splitter.rs b/src/nodes/beam_splitter.rs index 2bb446b0..a6f1ac14 100644 --- a/src/nodes/beam_splitter.rs +++ b/src/nodes/beam_splitter.rs @@ -114,6 +114,11 @@ impl Optical for BeamSplitter { ) -> Result<LightResult> { match analyzer_type { AnalyzerType::Energy => self.analyze_energy(incoming_data), + _ => { + return Err(OpossumError::Analysis( + "analysis type not yet implemented".into(), + )) + } } } } diff --git a/src/nodes/ideal_filter.rs b/src/nodes/ideal_filter.rs index 6db5bfa1..26963722 100644 --- a/src/nodes/ideal_filter.rs +++ b/src/nodes/ideal_filter.rs @@ -128,6 +128,11 @@ impl Optical for IdealFilter { ) -> Result<crate::optic_node::LightResult> { match analyzer_type { AnalyzerType::Energy => self.analyze_energy(incoming_data), + _ => { + return Err(OpossumError::Analysis( + "analysis type not yet implemented".into(), + )) + } } } } diff --git a/src/nodes/lens.rs b/src/nodes/lens.rs index 8be6263b..e9c5c4f2 100644 --- a/src/nodes/lens.rs +++ b/src/nodes/lens.rs @@ -1,43 +1,44 @@ -use std::collections::HashMap; -use uom::{si::f64::{Energy, Length}, si::length::meter, num_traits::Zero}; -use ndarray::{Array1, Array2, array}; - -type Result<T> = std::result::Result<T, OpossumError>; - - use crate::{ analyzer::AnalyzerType, error::OpossumError, - lightdata::{LightData, DataEnergy, RayDataParaxial}, + lightdata::LightData, optic_node::{Dottable, LightResult, Optical}, optic_ports::OpticPorts, }; +use ndarray::{array, Array1}; +use uom::{si::f64::Length, si::length::meter}; +type Result<T> = std::result::Result<T, OpossumError>; + +pub struct IdealLens; -pub struct IdealLens { - focal_length: f64, - aperture: f64 -} #[derive(Debug)] pub struct RealLens { aperture: Length, curvatures: Array1<Length>, center_thickness: Length, - z_pos: Length, + z_pos: Length, refractive_index: f64, } - impl RealLens { - pub fn new(aperture: Length, front_curvature: Length, rear_curvature: Length, center_thickness: Length, z_pos: Length, refractive_index: f64) -> Self { - Self{ aperture: aperture, - curvatures: array![front_curvature,rear_curvature], - center_thickness: center_thickness, - z_pos: z_pos, - refractive_index: refractive_index, + pub fn new( + aperture: Length, + front_curvature: Length, + rear_curvature: Length, + center_thickness: Length, + z_pos: Length, + refractive_index: f64, + ) -> Self { + Self { + aperture: aperture, + curvatures: array![front_curvature, rear_curvature], + center_thickness: center_thickness, + z_pos: z_pos, + refractive_index: refractive_index, } } - pub fn get_aperture(&self) -> Length{ + pub fn get_aperture(&self) -> Length { self.aperture } @@ -45,15 +46,18 @@ impl RealLens { self.aperture = Length::new::<meter>(aperture); } - pub fn get_curvatures(&self) -> &Array1<Length>{ + pub fn get_curvatures(&self) -> &Array1<Length> { &self.curvatures - } + } pub fn set_curvatures(&mut self, curvature_1: f64, curvature_2: f64) { - self.curvatures = array![Length::new::<meter>(curvature_1),Length::new::<meter>(curvature_2)]; + self.curvatures = array![ + Length::new::<meter>(curvature_1), + Length::new::<meter>(curvature_2) + ]; } - pub fn get_thickness(&self) -> Length{ + pub fn get_thickness(&self) -> Length { self.center_thickness } @@ -61,7 +65,7 @@ impl RealLens { self.center_thickness = Length::new::<meter>(thickness); } - pub fn get_position(&self) -> Length{ + pub fn get_position(&self) -> Length { self.z_pos } @@ -69,7 +73,7 @@ impl RealLens { self.z_pos = Length::new::<meter>(position); } - pub fn get_refractve_index(&self) -> f64{ + pub fn get_refractve_index(&self) -> f64 { self.refractive_index } @@ -78,7 +82,7 @@ impl RealLens { } fn analyze_ray_trace(&mut self, incoming_data: LightResult) -> Result<LightResult> { - let in1: Option<&Option<LightData>> = incoming_data.get("in1"); + let _in1: Option<&Option<LightData>> = incoming_data.get("in1"); Ok(incoming_data) // let mut in_rays: Vec<RayDataParaxial> = Vec::new(); @@ -112,17 +116,21 @@ impl RealLens { // bounce_lvl: usize, // max_bounces: usize, // } - } impl Default for RealLens { /// Create a 100mm focal lengths lens. LA1251-B from thorlabs. refractive inde hardcoded for n-bk7 at 1054 nm fn default() -> Self { - Self { aperture: Length::new::<meter>(25e-3), - curvatures: array![Length::new::<meter>(51.5e-3),Length::new::<meter>(f64::INFINITY)], - center_thickness: Length::new::<meter>(3.6e-3), - z_pos: Length::new::<meter>(0.0), - refractive_index: 1.5068} + Self { + aperture: Length::new::<meter>(25e-3), + curvatures: array![ + Length::new::<meter>(51.5e-3), + Length::new::<meter>(f64::INFINITY) + ], + center_thickness: Length::new::<meter>(3.6e-3), + z_pos: Length::new::<meter>(0.0), + refractive_index: 1.5068, + } } } @@ -137,15 +145,20 @@ impl Optical for RealLens { ports } - fn analyze(&mut self, incoming_data: LightResult, analyzer_type: &AnalyzerType) -> Result<LightResult> { + fn analyze( + &mut self, + incoming_data: LightResult, + analyzer_type: &AnalyzerType, + ) -> Result<LightResult> { match analyzer_type { - AnalyzerType::Energy => Err(OpossumError::Analysis("Energy Analysis is not yet implemented for Lens Nodes".into())), + AnalyzerType::Energy => Err(OpossumError::Analysis( + "Energy Analysis is not yet implemented for Lens Nodes".into(), + )), AnalyzerType::ParAxialRayTrace => self.analyze_ray_trace(incoming_data), } - } + } } - impl Dottable for RealLens { fn node_color(&self) -> &str { "blue" diff --git a/src/nodes/mod.rs b/src/nodes/mod.rs index d9b5b270..a49cb1d6 100644 --- a/src/nodes/mod.rs +++ b/src/nodes/mod.rs @@ -4,6 +4,7 @@ mod detector; mod dummy; mod group; mod ideal_filter; +mod lens; mod reference; mod source; @@ -11,7 +12,7 @@ pub use beam_splitter::BeamSplitter; pub use detector::Detector; pub use dummy::Dummy; pub use group::NodeGroup; -pub use ideal_filter::FilterType; -pub use ideal_filter::IdealFilter; +pub use ideal_filter::{FilterType, IdealFilter}; +pub use lens::{IdealLens, RealLens}; pub use reference::NodeReference; pub use source::Source; -- GitLab