go_pybindings/
liftof.rs

1use pyo3::prelude::*;
2
3//use std::collections::HashMap;
4use pyo3::exceptions::PyValueError;
5
6pub use crate::dataclasses::{
7  PyMasterTriggerEvent,
8  PyRBEvent,
9  PyTofEvent
10};
11
12pub use crate::liftof_dataclasses::PyIPBus;
13
14pub use crate::master_trigger::{
15  PyMasterTrigger,
16  wrap_prescale_to_u32,
17};
18
19use tof_dataclasses::analysis::{
20    calc_edep_simple
21};
22
23use tof_dataclasses::database::{
24    RAT,
25    DSICard,
26    Paddle,
27    MTBChannel,
28    LocalTriggerBoard,
29    ReadoutBoard,
30    Panel,
31    connect_to_db,
32};
33
34use liftof_lib::{
35  waveform_analysis,
36  fit_sine_sydney,
37};
38
39use liftof_lib::settings::{
40  //AnalysisEngineSettings,
41  LiftofSettings
42};
43
44#[pyfunction]
45#[pyo3(name="test_db")]
46pub fn test_db() {
47  let mut conn = connect_to_db(String::from("/srv/gaps/gaps-online-software/gaps-db/gaps_db/gaps_flight.db")).unwrap();
48  let rats = RAT::all(&mut conn).unwrap();
49  for r in rats {
50    println!("{}", r);
51  }
52  let dsis = DSICard::all(&mut conn).unwrap();
53  for dsi in dsis {
54    println!("{}", dsi);
55  }
56  let paddles = Paddle::all(&mut conn).unwrap();
57  for pdl in paddles {
58    println!("{}", pdl);
59  }
60  let mtbch = MTBChannel::all(&mut conn).unwrap();
61  for chnl in mtbch {
62    println!("{}", chnl);
63  }
64  let ltbs = LocalTriggerBoard::all(&mut conn).unwrap();
65  for ltb in ltbs {
66    println!("{}", ltb);
67  }
68  let rbs = ReadoutBoard::all(&mut conn).unwrap();
69  for rb in rbs {
70    println!("{}", rb);
71  }
72  let panels = Panel::all(&mut conn).unwrap();
73  for pnl in panels {
74    println!("{}", pnl);
75  }
76}
77
78/// A wrapper for Liftof settings. Can be useful to pass 
79/// settings to functions
80#[pyclass]
81#[pyo3(name="LiftofSettings")]
82pub struct PyLiftofSettings {
83  pub settings : LiftofSettings
84}
85
86impl PyLiftofSettings {
87  pub fn set_settings(&mut self, settings : &LiftofSettings) {
88    self.settings = settings.clone()
89  }
90}
91
92#[pymethods]
93impl PyLiftofSettings {
94  #[new]
95  fn new() -> Self {
96    let settings = LiftofSettings::new();
97    Self { 
98      settings : settings
99    }
100  }
101
102  /// Read settings from a .toml file
103  ///
104  /// # Arugments:
105  ///
106  /// * filename : A .toml file with settings fro the 
107  ///              liftof flight suite
108  #[staticmethod]
109  fn from_file(filename : &str) -> PyResult<Self> {
110    let mut pysettings = PyLiftofSettings::new();
111    match LiftofSettings::from_toml(filename) {
112      Ok(settings) => {
113        pysettings.settings = settings;
114      }
115      Err(err) => {
116        return Err(PyValueError::new_err(err.to_string()));
117      }
118    }
119    Ok(pysettings)
120  }
121 
122  fn __repr__(&self) -> PyResult<String> {
123    Ok(format!("<PyO3Wrapper: {}>", self.settings))
124  } 
125
126}
127
128#[pyfunction]
129#[pyo3(name="calc_edep_simple")]
130pub fn wrap_calc_edep_simple(peak_voltage : f32) -> f32 {
131  calc_edep_simple(peak_voltage)
132}
133
134#[pyfunction]
135#[pyo3(name="fit_sine_sydney")]
136pub fn wrap_fit_sine_sydney(volts: Vec<f32>, times: Vec<f32>) -> (f32,f32,f32) {
137  fit_sine_sydney(&volts, &times)
138}
139
140#[pyfunction]
141#[pyo3(name="waveform_analysis")]
142pub fn py_waveform_analysis(event : &PyTofEvent,
143                            settings : &PyLiftofSettings) -> PyResult<PyTofEvent> {
144//match waveform_analysis(
145//  &mut rbev,
146//  &rb_map[&rb_id],
147//  settings.clone()
148//) {
149  let ana_settings = settings.settings.analysis_engine_settings;
150  let pth          = settings.settings.db_path.clone();
151  let mut conn     = connect_to_db(pth).expect("Check the DB path in the liftof settings!");
152  let rbs          = ReadoutBoard::all(&mut conn).expect("Check DB");
153  //let mut rb       = ReadoutBoard::new();
154  let mut ev_new   = event.clone();
155  let mut new_rb_evs = event.event.rb_events.clone();
156  for rb_ev in new_rb_evs.iter_mut() {
157    for rb_ in &rbs {
158      if rb_.rb_id == rb_ev.header.rb_id {
159        match waveform_analysis(rb_ev, rb_, ana_settings) {
160          Err(err) => {
161            println!("Unable to perform waveform_analysis! {err}");
162          }
163          Ok(_) => ()
164        }
165      }
166    }
167    //if rb_ev.rb_id = 
168  }
169  ev_new.event.rb_events = new_rb_evs;
170  //match waveform_analysis(
171  Ok(ev_new)
172}
173
174
175