1use pyo3::prelude::*;
2
3use 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 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#[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 #[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, ×)
138}
139
140#[pyfunction]
141#[pyo3(name="waveform_analysis")]
142pub fn py_waveform_analysis(event : &PyTofEvent,
143 settings : &PyLiftofSettings) -> PyResult<PyTofEvent> {
144let 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 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 }
169 ev_new.event.rb_events = new_rb_evs;
170 Ok(ev_new)
172}
173
174
175