1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct TimeRange {
6 pub start: f64,
7 pub end: f64,
8}
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct PreprocessingOptions {
14 pub highpass: Option<f64>,
15 pub lowpass: Option<f64>,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct AlgorithmSelection {
21 pub enabled_variants: Vec<String>,
22 #[serde(skip_serializing_if = "Option::is_none")]
31 pub select_mask: Option<String>,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
36pub struct WindowParameters {
37 pub window_length: u32,
38 pub window_step: u32,
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub ct_window_length: Option<u32>,
42 #[serde(skip_serializing_if = "Option::is_none")]
44 pub ct_window_step: Option<u32>,
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct DelayParameters {
51 pub delays: Vec<i32>,
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize)]
58pub struct ModelParameters {
59 pub dm: u32, pub order: u32, pub nr_tau: u32, }
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
66pub struct VariantChannelConfig {
67 #[serde(skip_serializing_if = "Option::is_none")]
69 pub selected_channels: Option<Vec<usize>>,
70 #[serde(skip_serializing_if = "Option::is_none")]
72 pub ct_channel_pairs: Option<Vec<[usize; 2]>>,
73 #[serde(skip_serializing_if = "Option::is_none")]
75 pub cd_channel_pairs: Option<Vec<[usize; 2]>>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct DDARequest {
81 pub file_path: String,
82 #[serde(alias = "channel_list")]
83 pub channels: Option<Vec<usize>>, pub time_range: TimeRange,
85 pub preprocessing_options: PreprocessingOptions,
86 pub algorithm_selection: AlgorithmSelection,
87 pub window_parameters: WindowParameters,
88 pub delay_parameters: DelayParameters,
89 #[serde(skip_serializing_if = "Option::is_none")]
92 pub ct_channel_pairs: Option<Vec<[usize; 2]>>,
93 #[serde(skip_serializing_if = "Option::is_none")]
97 pub cd_channel_pairs: Option<Vec<[usize; 2]>>,
98 #[serde(skip_serializing_if = "Option::is_none")]
101 pub model_parameters: Option<ModelParameters>,
102 #[serde(skip_serializing_if = "Option::is_none")]
105 pub variant_configs: Option<std::collections::HashMap<String, VariantChannelConfig>>,
106 #[serde(skip_serializing_if = "Option::is_none")]
109 pub sampling_rate: Option<f64>,
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct VariantResult {
115 pub variant_id: String, pub variant_name: String, pub q_matrix: Vec<Vec<f64>>, #[serde(skip_serializing_if = "Option::is_none")]
119 pub channel_labels: Option<Vec<String>>, }
121
122#[derive(Debug, Clone, Serialize, Deserialize)]
124pub struct DDAResult {
125 pub id: String,
126 pub file_path: String,
127 pub channels: Vec<String>,
128 pub q_matrix: Vec<Vec<f64>>, pub variant_results: Option<Vec<VariantResult>>, pub raw_output: Option<String>, pub window_parameters: WindowParameters,
132 pub delay_parameters: DelayParameters,
133 pub created_at: String,
134}
135
136impl DDAResult {
137 pub fn new(
138 id: String,
139 file_path: String,
140 channels: Vec<String>,
141 q_matrix: Vec<Vec<f64>>,
142 window_parameters: WindowParameters,
143 delay_parameters: DelayParameters,
144 ) -> Self {
145 Self {
146 id,
147 file_path,
148 channels,
149 q_matrix,
150 variant_results: None,
151 raw_output: None,
152 window_parameters,
153 delay_parameters,
154 created_at: chrono::Utc::now().to_rfc3339(),
155 }
156 }
157
158 pub fn with_raw_output(mut self, raw_output: String) -> Self {
159 self.raw_output = Some(raw_output);
160 self
161 }
162
163 pub fn with_variant_results(mut self, variant_results: Vec<VariantResult>) -> Self {
164 self.variant_results = Some(variant_results);
165 self
166 }
167}