dmap/formats/
fitacf.rs

1//! The [FitACF file format](https://radar-software-toolkit-rst.readthedocs.io/en/latest/references/general/fitacf/).
2
3use crate::record::create_record_type;
4use crate::types::{Fields, Type};
5use lazy_static::lazy_static;
6
7static SCALAR_FIELDS: [(&str, Type); 49] = [
8    ("radar.revision.major", Type::Char),
9    ("radar.revision.minor", Type::Char),
10    ("origin.code", Type::Char),
11    ("origin.time", Type::String),
12    ("origin.command", Type::String),
13    ("cp", Type::Short),
14    ("stid", Type::Short),
15    ("time.yr", Type::Short),
16    ("time.mo", Type::Short),
17    ("time.dy", Type::Short),
18    ("time.hr", Type::Short),
19    ("time.mt", Type::Short),
20    ("time.sc", Type::Short),
21    ("time.us", Type::Int),
22    ("txpow", Type::Short),
23    ("nave", Type::Short),
24    ("atten", Type::Short),
25    ("lagfr", Type::Short),
26    ("smsep", Type::Short),
27    ("ercod", Type::Short),
28    ("stat.agc", Type::Short),
29    ("stat.lopwr", Type::Short),
30    ("noise.search", Type::Float),
31    ("noise.mean", Type::Float),
32    ("channel", Type::Short),
33    ("bmnum", Type::Short),
34    ("bmazm", Type::Float),
35    ("scan", Type::Short),
36    ("offset", Type::Short),
37    ("rxrise", Type::Short),
38    ("intt.sc", Type::Short),
39    ("intt.us", Type::Int),
40    ("txpl", Type::Short),
41    ("mpinc", Type::Short),
42    ("mppul", Type::Short),
43    ("mplgs", Type::Short),
44    ("nrang", Type::Short),
45    ("frang", Type::Short),
46    ("rsep", Type::Short),
47    ("xcf", Type::Short),
48    ("tfreq", Type::Short),
49    ("mxpwr", Type::Int),
50    ("lvmax", Type::Int),
51    ("fitacf.revision.major", Type::Int),
52    ("fitacf.revision.minor", Type::Int),
53    ("combf", Type::String),
54    ("noise.sky", Type::Float),
55    ("noise.lag0", Type::Float),
56    ("noise.vel", Type::Float),
57];
58
59static SCALAR_FIELDS_OPT: [(&str, Type); 4] = [
60    ("mplgexs", Type::Short),
61    ("ifmode", Type::Short),
62    ("algorithm", Type::String),
63    ("tdiff", Type::Float),
64];
65
66static VECTOR_FIELDS: [(&str, Type); 3] = [
67    ("ptab", Type::Short),
68    ("ltab", Type::Short),
69    ("pwr0", Type::Float),
70];
71
72static VECTOR_FIELDS_OPT: [(&str, Type); 39] = [
73    ("slist", Type::Short),
74    ("nlag", Type::Short),
75    ("qflg", Type::Char),
76    ("gflg", Type::Char),
77    ("p_l", Type::Float),
78    ("p_l_e", Type::Float),
79    ("p_s", Type::Float),
80    ("p_s_e", Type::Float),
81    ("v", Type::Float),
82    ("v_e", Type::Float),
83    ("w_l", Type::Float),
84    ("w_l_e", Type::Float),
85    ("w_s", Type::Float),
86    ("w_s_e", Type::Float),
87    ("sd_l", Type::Float),
88    ("sd_s", Type::Float),
89    ("sd_phi", Type::Float),
90    ("x_qflg", Type::Char),
91    ("x_gflg", Type::Char),
92    ("x_p_l", Type::Float),
93    ("x_p_l_e", Type::Float),
94    ("x_p_s", Type::Float),
95    ("x_p_s_e", Type::Float),
96    ("x_v", Type::Float),
97    ("x_v_e", Type::Float),
98    ("x_w_l", Type::Float),
99    ("x_w_l_e", Type::Float),
100    ("x_w_s", Type::Float),
101    ("x_w_s_e", Type::Float),
102    ("phi0", Type::Float),
103    ("phi0_e", Type::Float),
104    ("elv", Type::Float),
105    ("elv_fitted", Type::Float),
106    ("elv_error", Type::Float),
107    ("elv_low", Type::Float),
108    ("elv_high", Type::Float),
109    ("x_sd_l", Type::Float),
110    ("x_sd_s", Type::Float),
111    ("x_sd_phi", Type::Float),
112];
113
114/// This defines the groups of vector fields that must have the same dimensionality.
115static MATCHED_VECS: [[&str; 39]; 1] = [[
116    "slist",
117    "nlag",
118    "qflg",
119    "gflg",
120    "p_l",
121    "p_l_e",
122    "p_s",
123    "p_s_e",
124    "v",
125    "v_e",
126    "w_l",
127    "w_l_e",
128    "w_s",
129    "w_s_e",
130    "sd_l",
131    "sd_s",
132    "sd_phi",
133    "x_qflg",
134    "x_gflg",
135    "x_p_l",
136    "x_p_l_e",
137    "x_p_s",
138    "x_p_s_e",
139    "x_v",
140    "x_v_e",
141    "x_w_l",
142    "x_w_l_e",
143    "x_w_s",
144    "x_w_s_e",
145    "phi0",
146    "phi0_e",
147    "elv",
148    "elv_fitted",
149    "elv_error",
150    "elv_low",
151    "elv_high",
152    "x_sd_l",
153    "x_sd_s",
154    "x_sd_phi",
155]];
156
157static DATA_FIELDS: [&str; 39] = [
158    "slist",
159    "nlag",
160    "qflg",
161    "gflg",
162    "p_l",
163    "p_l_e",
164    "p_s",
165    "p_s_e",
166    "v",
167    "v_e",
168    "w_l",
169    "w_l_e",
170    "w_s",
171    "w_s_e",
172    "sd_l",
173    "sd_s",
174    "sd_phi",
175    "x_qflg",
176    "x_gflg",
177    "x_p_l",
178    "x_p_l_e",
179    "x_p_s",
180    "x_p_s_e",
181    "x_v",
182    "x_v_e",
183    "x_w_l",
184    "x_w_l_e",
185    "x_w_s",
186    "x_w_s_e",
187    "phi0",
188    "phi0_e",
189    "elv",
190    "elv_fitted",
191    "elv_error",
192    "elv_low",
193    "elv_high",
194    "x_sd_l",
195    "x_sd_s",
196    "x_sd_phi",
197];
198
199lazy_static! {
200    static ref FITACF_FIELDS: Fields<'static> = Fields {
201        all_fields: {
202            let mut fields: Vec<&str> = vec![];
203            fields.extend(SCALAR_FIELDS.clone().into_iter().map(|x| x.0));
204            fields.extend(SCALAR_FIELDS_OPT.clone().into_iter().map(|x| x.0));
205            fields.extend(VECTOR_FIELDS.clone().into_iter().map(|x| x.0));
206            fields.extend(VECTOR_FIELDS_OPT.clone().into_iter().map(|x| x.0));
207            fields
208        },
209        scalars_required: SCALAR_FIELDS.to_vec(),
210        scalars_optional: SCALAR_FIELDS_OPT.to_vec(),
211        vectors_required: VECTOR_FIELDS.to_vec(),
212        vectors_optional: VECTOR_FIELDS_OPT.to_vec(),
213        vector_dim_groups: {
214            let mut grouped_vecs: Vec<Vec<&str>> = vec![];
215            for group in MATCHED_VECS.iter() {
216                grouped_vecs.push(group.to_vec())
217            }
218            grouped_vecs
219        },
220        data_fields: DATA_FIELDS.to_vec(),
221    };
222}
223
224create_record_type!(fitacf, FITACF_FIELDS);