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