Skip to content
Snippets Groups Projects
Commit 95020194 authored by Udo Eisenbarth's avatar Udo Eisenbarth :speech_balloon:
Browse files

Add beam combiner example.

Works in principle but awfully slow because of resampling.
parent 940626e5
No related branches found
No related tags found
No related merge requests found
use std::fs::File;
use std::io::Write;
use opossum::{
analyzer::AnalyzerEnergy,
error::OpossumError,
lightdata::{DataEnergy, LightData},
nodes::{BeamSplitter, Detector, IdealFilter, Source, FilterType},
optic_scenery::OpticScenery, spectrum::{create_he_ne_spectrum, Spectrum, create_nd_glass_spectrum},
};
fn main() -> Result<(), OpossumError> {
let mut scenery = OpticScenery::new();
scenery.set_description("beam combiner demo");
let i_s1 = scenery.add_element(
"Source 1",
Source::new(LightData::Energy(DataEnergy {
spectrum: create_he_ne_spectrum(1.0),
})),
);
let i_s2 = scenery.add_element(
"Source 2",
Source::new(LightData::Energy(DataEnergy {
spectrum: create_nd_glass_spectrum(1.0),
})),
);
let i_bs = scenery.add_element("Beam splitter", BeamSplitter::new(0.5));
// let filter_spectrum=Spectrum::from_csv("NE03B.csv")?;
// let i_f = scenery.add_element("Filter", IdealFilter::new(FilterType::Spectrum(filter_spectrum))?);
let i_d1 = scenery.add_element("Detector 1", Detector::default());
scenery.connect_nodes(i_s1, "out1", i_bs, "input1")?;
scenery.connect_nodes(i_s2, "out1", i_bs, "input2")?;
scenery.connect_nodes(i_bs, "out1_trans1_refl2", i_d1, "in1")?;
let path = "beam_combiner.dot";
let mut output = File::create(path).unwrap();
write!(output, "{}", scenery.to_dot()).unwrap();
scenery.report();
println!("");
let mut analyzer = AnalyzerEnergy::new(&scenery);
print!("Analyze...");
analyzer.analyze()?;
println!("Sucessful");
println!("");
scenery.report();
Ok(())
}
......@@ -6,9 +6,8 @@ use crate::{
lightdata::{DataEnergy, LightData},
optic_node::{Dottable, LightResult, Optical},
optic_ports::OpticPorts,
spectrum::Spectrum,
spectrum::{Spectrum, unify_spectrum}
};
use crate::spectrum::unify_spectrum;
type Result<T> = std::result::Result<T, OpossumError>;
......
......@@ -448,7 +448,7 @@ pub fn create_he_ne_spectrum(energy: f64) -> Spectrum {
///
/// This function generates an spectrum in the near infrared range (800 - 2500 nm) with a resolution
/// of 0.1 nm and a (Lorentzian) laser line at 1054 nm with a width of 0.5 nm.
pub fn create_yb_yag_spectrum(energy: f64) -> Spectrum {
pub fn create_nd_glass_spectrum(energy: f64) -> Spectrum {
let mut s = create_nir_spectrum();
s.add_lorentzian_peak(
Length::new::<nanometer>(1054.0),
......@@ -475,8 +475,11 @@ pub fn unify_spectrum(s1: Option<Spectrum>, s2: Option<Spectrum>) -> Option<Spec
.unwrap()
.average_resolution()
.min(s2.as_ref().unwrap().average_resolution());
println!("min={}, max={}, res={}", minimum.get::<nanometer>(), maximum.get::<nanometer>(), resolution.get::<nanometer>());
let mut s_out = Spectrum::new(minimum..maximum, resolution).unwrap();
println!("resampling...");
s_out.resample(&s1.unwrap());
println!("adding");
s_out.add(&s2.unwrap());
Some(s_out)
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment