dmap/formats/
map.rs

1//! The [Map file format](https://radar-software-toolkit-rst.readthedocs.io/en/latest/references/general/map/).
2
3use crate::record::create_record_type;
4use crate::types::{Fields, Type};
5use lazy_static::lazy_static;
6
7static SCALAR_FIELDS: [(&str, Type); 35] = [
8    ("start.year", Type::Short),
9    ("start.month", Type::Short),
10    ("start.day", Type::Short),
11    ("start.hour", Type::Short),
12    ("start.minute", Type::Short),
13    ("start.second", Type::Double),
14    ("end.year", Type::Short),
15    ("end.month", Type::Short),
16    ("end.day", Type::Short),
17    ("end.hour", Type::Short),
18    ("end.minute", Type::Short),
19    ("end.second", Type::Double),
20    ("map.major.revision", Type::Short),
21    ("map.minor.revision", Type::Short),
22    ("doping.level", Type::Short),
23    ("model.wt", Type::Short),
24    ("error.wt", Type::Short),
25    ("IMF.flag", Type::Short),
26    ("hemisphere", Type::Short),
27    ("fit.order", Type::Short),
28    ("latmin", Type::Float),
29    ("chi.sqr", Type::Double),
30    ("chi.sqr.dat", Type::Double),
31    ("rms.err", Type::Double),
32    ("lon.shft", Type::Float),
33    ("lat.shft", Type::Float),
34    ("mlt.start", Type::Double),
35    ("mlt.end", Type::Double),
36    ("mlt.av", Type::Double),
37    ("pot.drop", Type::Double),
38    ("pot.drop.err", Type::Double),
39    ("pot.max", Type::Double),
40    ("pot.max.err", Type::Double),
41    ("pot.min", Type::Double),
42    ("pot.min.err", Type::Double),
43];
44
45static SCALAR_FIELDS_OPT: [(&str, Type); 13] = [
46    ("source", Type::String),
47    ("IMF.delay", Type::Short),
48    ("IMF.Bx", Type::Double),
49    ("IMF.By", Type::Double),
50    ("IMF.Bz", Type::Double),
51    ("IMF.Vx", Type::Double),
52    ("IMF.tilt", Type::Double),
53    ("IMF.Kp", Type::Double),
54    ("model.angle", Type::String),
55    ("model.level", Type::String),
56    ("model.tilt", Type::String),
57    ("model.name", Type::String),
58    ("noigrf", Type::Short),
59];
60
61static VECTOR_FIELDS: [(&str, Type); 18] = [
62    ("stid", Type::Short),
63    ("channel", Type::Short),
64    ("nvec", Type::Short),
65    ("freq", Type::Float),
66    ("major.revision", Type::Short),
67    ("minor.revision", Type::Short),
68    ("program.id", Type::Short),
69    ("noise.mean", Type::Float),
70    ("noise.sd", Type::Float),
71    ("gsct", Type::Short),
72    ("v.min", Type::Float),
73    ("v.max", Type::Float),
74    ("p.min", Type::Float),
75    ("p.max", Type::Float),
76    ("w.min", Type::Float),
77    ("w.max", Type::Float),
78    ("ve.min", Type::Float),
79    ("ve.max", Type::Float),
80];
81
82static VECTOR_FIELDS_OPT: [(&str, Type); 23] = [
83    ("vector.mlat", Type::Float),
84    ("vector.mlon", Type::Float),
85    ("vector.kvect", Type::Float),
86    ("vector.stid", Type::Short),
87    ("vector.channel", Type::Short),
88    ("vector.index", Type::Int),
89    ("vector.srng", Type::Float),
90    ("vector.vel.median", Type::Float),
91    ("vector.vel.sd", Type::Float),
92    ("vector.pwr.median", Type::Float),
93    ("vector.pwr.sd", Type::Float),
94    ("vector.wdt.median", Type::Float),
95    ("vector.wdt.sd", Type::Float),
96    ("N", Type::Double),
97    ("N+1", Type::Double),
98    ("N+2", Type::Double),
99    ("N+3", Type::Double),
100    ("model.mlat", Type::Float),
101    ("model.mlon", Type::Float),
102    ("model.kvect", Type::Float),
103    ("model.vel.median", Type::Float),
104    ("boundary.mlat", Type::Float),
105    ("boundary.mlon", Type::Float),
106];
107
108static DATA_FIELDS: [&str; 13] = [
109    "vector.mlat",
110    "vector.mlon",
111    "vector.kvect",
112    "vector.stid",
113    "vector.channel",
114    "vector.index",
115    "vector.srng",
116    "vector.vel.median",
117    "vector.vel.sd",
118    "vector.pwr.median",
119    "vector.pwr.sd",
120    "vector.wdt.median",
121    "vector.wdt.sd",
122];
123
124lazy_static! {
125    static ref MATCHED_VECS: Vec<Vec<&'static str>> = vec![
126        vec![
127            "stid",
128            "channel",
129            "nvec",
130            "freq",
131            "major.revision",
132            "minor.revision",
133            "program.id",
134            "noise.mean",
135            "noise.sd",
136            "gsct",
137            "v.min",
138            "v.max",
139            "p.min",
140            "p.max",
141            "w.min",
142            "w.max",
143            "ve.min",
144            "ve.max",
145        ],
146        vec![
147            "vector.mlat",
148            "vector.mlon",
149            "vector.kvect",
150            "vector.stid",
151            "vector.channel",
152            "vector.index",
153            "vector.vel.median",
154            "vector.vel.sd",
155            "vector.pwr.median",
156            "vector.pwr.sd",
157            "vector.wdt.median",
158            "vector.wdt.sd",
159        ],
160        vec!["N", "N+1", "N+2", "N+3",],
161        vec![
162            "model.mlat",
163            "model.mlon",
164            "model.kvect",
165            "model.vel.median",
166        ],
167        vec!["boundary.mlat", "boundary.mlon",]
168    ];
169    static ref MAP_FIELDS: Fields<'static> = Fields {
170        all_fields: {
171            let mut fields: Vec<&str> = vec![];
172            fields.extend(SCALAR_FIELDS.clone().into_iter().map(|x| x.0));
173            fields.extend(SCALAR_FIELDS_OPT.clone().into_iter().map(|x| x.0));
174            fields.extend(VECTOR_FIELDS.clone().into_iter().map(|x| x.0));
175            fields.extend(VECTOR_FIELDS_OPT.clone().into_iter().map(|x| x.0));
176            fields
177        },
178        scalars_required: SCALAR_FIELDS.to_vec(),
179        scalars_optional: SCALAR_FIELDS_OPT.to_vec(),
180        vectors_required: VECTOR_FIELDS.to_vec(),
181        vectors_optional: VECTOR_FIELDS_OPT.to_vec(),
182        vector_dim_groups: MATCHED_VECS.clone(),
183        data_fields: DATA_FIELDS.to_vec(),
184    };
185}
186
187create_record_type!(map, MAP_FIELDS);