From 2eade5fabb58cb9a871aab4825d258def0aae762 Mon Sep 17 00:00:00 2001 From: Udo Eisenbarth <u.eisenbarth@gsi.de> Date: Wed, 30 Oct 2024 09:33:52 +0100 Subject: [PATCH] refactor: :recycle: Delete no longer needed Detector node and adapt examples. --- opossum/examples/beam_combine_test.rs | 4 +- opossum/examples/michaelson.rs | 4 +- opossum/src/nodes/detector.rs | 272 -------------------------- opossum/src/nodes/mod.rs | 7 - opossum/src/nodes/node_group/mod.rs | 4 +- 5 files changed, 6 insertions(+), 285 deletions(-) delete mode 100644 opossum/src/nodes/detector.rs diff --git a/opossum/examples/beam_combine_test.rs b/opossum/examples/beam_combine_test.rs index 88c10990..43e9dcf2 100644 --- a/opossum/examples/beam_combine_test.rs +++ b/opossum/examples/beam_combine_test.rs @@ -7,7 +7,7 @@ use opossum::{ error::OpmResult, lightdata::{DataEnergy, LightData}, nanometer, - nodes::{BeamSplitter, Detector, FilterType, IdealFilter, NodeGroup, Source}, + nodes::{BeamSplitter, Dummy, FilterType, IdealFilter, NodeGroup, Source}, ray::SplittingConfig, spectrum_helper::{self, create_he_ne_spec, create_nd_glass_spec, generate_filter_spectrum}, OpmDocument, @@ -40,7 +40,7 @@ fn main() -> OpmResult<()> { "filter", &FilterType::Spectrum(filter_spectrum), )?)?; - let i_d1 = scenery.add_node(&Detector::default())?; // Detector 1 + let i_d1 = scenery.add_node(&Dummy::default())?; scenery.connect_nodes(i_s1, "out1", i_bs, "input1", Length::zero())?; scenery.connect_nodes(i_s2, "out1", i_bs, "input2", Length::zero())?; diff --git a/opossum/examples/michaelson.rs b/opossum/examples/michaelson.rs index cb8f2891..afaffd5c 100644 --- a/opossum/examples/michaelson.rs +++ b/opossum/examples/michaelson.rs @@ -3,7 +3,7 @@ use opossum::{ analyzers::AnalyzerType, error::OpmResult, lightdata::{DataEnergy, LightData}, - nodes::{BeamSplitter, Detector, Dummy, NodeGroup, NodeReference, Source}, + nodes::{BeamSplitter, Dummy, NodeGroup, NodeReference, Source}, spectrum_helper::create_he_ne_spec, OpmDocument, }; @@ -26,7 +26,7 @@ fn main() -> OpmResult<()> { let m2 = scenery.add_node(&Dummy::new("Mirror"))?; let rf = NodeReference::from_node(&scenery.node(bs)?); let r_bs = scenery.add_node(&rf)?; - let det = scenery.add_node(&Detector::default())?; + let det = scenery.add_node(&Dummy::new("Detector"))?; scenery.connect_nodes(src, "out1", bs, "input1", Length::zero())?; scenery.connect_nodes(bs, "out1_trans1_refl2", sample, "front", Length::zero())?; diff --git a/opossum/src/nodes/detector.rs b/opossum/src/nodes/detector.rs deleted file mode 100644 index c7f3245d..00000000 --- a/opossum/src/nodes/detector.rs +++ /dev/null @@ -1,272 +0,0 @@ -#![warn(missing_docs)] -use super::node_attr::NodeAttr; -use crate::{ - analyzers::{ - energy::AnalysisEnergy, ghostfocus::AnalysisGhostFocus, raytrace::AnalysisRayTrace, - Analyzable, RayTraceConfig, - }, - dottable::Dottable, - error::{OpmResult, OpossumError}, - light_result::LightResult, - lightdata::LightData, - optic_node::{Alignable, OpticNode, LIDT}, - optic_ports::{OpticPorts, PortType}, - surface::{OpticalSurface, Plane}, - utils::geom_transformation::Isometry, -}; -use log::warn; -use std::fmt::Debug; - -/// A universal detector (so far for testing / debugging purposes). -/// -/// Any [`LightData`] coming in will be stored internally for later display / export. -/// -/// ## Optical Ports -/// - Inputs -/// - `in1` -/// - Outputs -/// - `out1` -/// -/// ## Properties -/// - `name` -/// - `apertures` -/// - `inverted` -/// -/// During analysis, the output port contains a replica of the input port similar to a [`Dummy`](crate::nodes::Dummy) node. This way, -/// different detector nodes can be "stacked" or used somewhere in between arbitrary optic nodes. -#[derive(Clone)] -pub struct Detector { - light_data: Option<LightData>, - node_attr: NodeAttr, - surface: OpticalSurface, -} -impl Default for Detector { - fn default() -> Self { - let mut ports = OpticPorts::new(); - ports.add(&PortType::Input, "in1").unwrap(); - ports.add(&PortType::Output, "out1").unwrap(); - let mut node_attr = NodeAttr::new("detector"); - node_attr.set_ports(ports); - Self { - light_data: Option::default(), - node_attr, - surface: OpticalSurface::new(Box::new(Plane::new(&Isometry::identity()))), - } - } -} -impl Detector { - /// Creates a new [`Detector`]. - /// # Attributes - /// * `name`: name of the [`Detector`] - /// - /// # Panics - /// This function panics if - /// - the input port name already exists. (Theoretically impossible at this point, as the [`OpticPorts`] are created just before in this function) - /// - the output port name already exists. (Theoretically impossible at this point, as the [`OpticPorts`] are created just before in this function) - /// - the property `apertures` can not be set. - #[must_use] - pub fn new(name: &str) -> Self { - let mut detector = Self::default(); - detector.node_attr.set_name(name); - detector - } -} -impl OpticNode for Detector { - fn node_attr(&self) -> &NodeAttr { - &self.node_attr - } - fn node_attr_mut(&mut self) -> &mut NodeAttr { - &mut self.node_attr - } - fn reset_data(&mut self) { - self.light_data = None; - self.surface.reset_hit_map(); - } - fn get_surface_mut(&mut self, _surf_name: &str) -> &mut OpticalSurface { - &mut self.surface - } -} - -impl Debug for Detector { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match &self.light_data { - Some(data) => write!(f, "{data}"), - None => write!(f, "no data"), - } - } -} -impl Dottable for Detector { - fn node_color(&self) -> &str { - "lemonchiffon" - } -} -impl LIDT for Detector {} - -impl Analyzable for Detector {} -impl AnalysisGhostFocus for Detector {} -impl AnalysisEnergy for Detector { - fn analyze(&mut self, incoming_data: LightResult) -> OpmResult<LightResult> { - let (inport, outport) = if self.inverted() { - ("out1", "in1") - } else { - ("in1", "out1") - }; - let Some(data) = incoming_data.get(inport) else { - return Ok(LightResult::default()); - }; - let outgoing_data = LightResult::from([(outport.to_string(), data.clone())]); - Ok(outgoing_data) - } -} -impl AnalysisRayTrace for Detector { - fn analyze( - &mut self, - incoming_data: LightResult, - config: &RayTraceConfig, - ) -> OpmResult<LightResult> { - let (in_port, out_port) = if self.inverted() { - ("out1", "in1") - } else { - ("in1", "out1") - }; - let Some(data) = incoming_data.get(in_port) else { - return Ok(LightResult::default()); - }; - if let LightData::Geometric(rays) = data { - let mut rays = rays.clone(); - if let Some(iso) = self.effective_iso() { - self.surface.set_isometry(&iso); - rays.refract_on_surface(&mut self.surface, None)?; - if let Some(aperture) = self.ports().aperture(&PortType::Input, in_port) { - let rays_apodized = rays.apodize(aperture, &iso)?; - if rays_apodized { - warn!("Rays have been apodized at input aperture of {}. Results might not be accurate.", self as &mut dyn OpticNode); - } - rays.invalidate_by_threshold_energy(config.min_energy_per_ray())?; - } else { - return Err(OpossumError::OpticPort("input aperture not found".into())); - }; - self.light_data = Some(LightData::Geometric(rays.clone())); - if let Some(aperture) = self.ports().aperture(&PortType::Output, out_port) { - rays.apodize(aperture, &iso)?; - rays.invalidate_by_threshold_energy(config.min_energy_per_ray())?; - } else { - return Err(OpossumError::OpticPort("input aperture not found".into())); - }; - } else { - return Err(OpossumError::Analysis( - "no location for surface defined. Aborting".into(), - )); - } - Ok(LightResult::from([( - out_port.into(), - LightData::Geometric(rays), - )])) - } else { - Ok(LightResult::from([(out_port.into(), data.clone())])) - } - } - - fn get_light_data_mut(&mut self) -> Option<&mut LightData> { - self.light_data.as_mut() - } - fn set_light_data(&mut self, ld: LightData) { - self.light_data = Some(ld); - } -} -impl Alignable for Detector {} - -#[cfg(test)] -mod test { - use super::*; - use crate::{ - lightdata::DataEnergy, nodes::test_helper::test_helper::*, optic_ports::PortType, - spectrum_helper::create_he_ne_spec, - }; - #[test] - fn default() { - let mut node = Detector::default(); - assert_eq!(node.name(), "detector"); - assert_eq!(node.node_type(), "detector"); - assert_eq!(node.inverted(), false); - assert_eq!(node.node_color(), "lemonchiffon"); - assert!(node.as_group().is_err()); - } - #[test] - fn new() { - let node = Detector::new("test"); - assert_eq!(node.name(), "test"); - } - #[test] - fn inverted() { - test_inverted::<Detector>() - } - #[test] - fn set_aperture() { - test_set_aperture::<Detector>("in1", "out1"); - } - #[test] - fn ports() { - let node = Detector::default(); - assert_eq!(node.ports().names(&PortType::Input), vec!["in1"]); - assert_eq!(node.ports().names(&PortType::Output), vec!["out1"]); - } - #[test] - fn ports_inverted() { - let mut node = Detector::default(); - node.set_inverted(true).unwrap(); - assert_eq!(node.ports().names(&PortType::Input), vec!["out1"]); - assert_eq!(node.ports().names(&PortType::Output), vec!["in1"]); - } - #[test] - fn analyze_empty() { - test_analyze_empty::<Detector>() - } - #[test] - fn analyze_wrong() { - let mut node = Detector::default(); - let mut input = LightResult::default(); - let input_light = LightData::Energy(DataEnergy { - spectrum: create_he_ne_spec(1.0).unwrap(), - }); - input.insert("wrong".into(), input_light.clone()); - let output = AnalysisEnergy::analyze(&mut node, input).unwrap(); - assert!(output.is_empty()); - } - #[test] - fn analyze_ok() { - let mut node = Detector::default(); - let mut input = LightResult::default(); - let input_light = LightData::Energy(DataEnergy { - spectrum: create_he_ne_spec(1.0).unwrap(), - }); - input.insert("in1".into(), input_light.clone()); - let output = AnalysisEnergy::analyze(&mut node, input).unwrap(); - assert!(output.contains_key("out1")); - assert_eq!(output.len(), 1); - let output = output.get("out1").unwrap(); - assert_eq!(*output, input_light); - } - #[test] - fn analyze_apodization_warning() { - test_analyze_apodization_warning::<Detector>() - } - #[test] - fn analyze_inverse() { - let mut node = Detector::default(); - node.set_inverted(true).unwrap(); - let mut input = LightResult::default(); - let input_light = LightData::Energy(DataEnergy { - spectrum: create_he_ne_spec(1.0).unwrap(), - }); - input.insert("out1".to_string(), input_light.clone()); - - let output = AnalysisEnergy::analyze(&mut node, input).unwrap(); - assert!(output.contains_key("in1")); - assert_eq!(output.len(), 1); - let output = output.get("in1"); - assert!(output.is_some()); - let output = output.clone().unwrap(); - assert_eq!(*output, input_light); - } -} diff --git a/opossum/src/nodes/mod.rs b/opossum/src/nodes/mod.rs index f463f05b..b27ea8b5 100644 --- a/opossum/src/nodes/mod.rs +++ b/opossum/src/nodes/mod.rs @@ -3,7 +3,6 @@ mod beam_splitter; mod cylindric_lens; -mod detector; mod dummy; mod energy_meter; mod ideal_filter; @@ -27,7 +26,6 @@ pub mod ray_propagation_visualizer; pub mod reflective_grating; pub use beam_splitter::BeamSplitter; pub use cylindric_lens::CylindricLens; -pub use detector::Detector; pub use dummy::Dummy; pub use energy_meter::{EnergyMeter, Metertype}; pub use fluence_detector::{FluenceData, FluenceDetector}; @@ -72,11 +70,6 @@ pub fn create_node_ref(node_type: &str, uuid: Option<Uuid>) -> OpmResult<OpticRe uuid, None, )), - "detector" => Ok(OpticRef::new( - Rc::new(RefCell::new(Detector::default())), - uuid, - None, - )), "beam splitter" => Ok(OpticRef::new( Rc::new(RefCell::new(BeamSplitter::default())), uuid, diff --git a/opossum/src/nodes/node_group/mod.rs b/opossum/src/nodes/node_group/mod.rs index 0ba27cc7..704c8008 100644 --- a/opossum/src/nodes/node_group/mod.rs +++ b/opossum/src/nodes/node_group/mod.rs @@ -563,7 +563,7 @@ mod test { light_result::LightResult, lightdata::LightData, millimeter, nanometer, - nodes::{test_helper::test_helper::*, Detector, Dummy, EnergyMeter, Source}, + nodes::{test_helper::test_helper::*, Dummy, EnergyMeter, Source}, optic_node::OpticNode, ray::Ray, rays::Rays, @@ -641,7 +641,7 @@ mod test { #[test] fn report() { let mut scenery = NodeGroup::default(); - scenery.add_node(&Detector::default()).unwrap(); + scenery.add_node(&Dummy::default()).unwrap(); let report = scenery.toplevel_report().unwrap(); assert!(serde_yaml::to_string(&report).is_ok()); // How shall we further parse the output? -- GitLab