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
108lazy_static! {
109    static ref MATCHED_VECS: Vec<Vec<&'static str>> = vec![
110        vec![
111            "stid",
112            "channel",
113            "nvec",
114            "freq",
115            "major.revision",
116            "minor.revision",
117            "program.id",
118            "noise.mean",
119            "noise.sd",
120            "gsct",
121            "v.min",
122            "v.max",
123            "p.min",
124            "p.max",
125            "w.min",
126            "w.max",
127            "ve.min",
128            "ve.max",
129        ],
130        vec![
131            "vector.mlat",
132            "vector.mlon",
133            "vector.kvect",
134            "vector.stid",
135            "vector.channel",
136            "vector.index",
137            "vector.vel.median",
138            "vector.vel.sd",
139            "vector.pwr.median",
140            "vector.pwr.sd",
141            "vector.wdt.median",
142            "vector.wdt.sd",
143        ],
144        vec!["N", "N+1", "N+2", "N+3",],
145        vec![
146            "model.mlat",
147            "model.mlon",
148            "model.kvect",
149            "model.vel.median",
150        ],
151        vec!["boundary.mlat", "boundary.mlon",]
152    ];
153    static ref MAP_FIELDS: Fields<'static> = Fields {
154        all_fields: {
155            let mut fields: Vec<&str> = vec![];
156            fields.extend(SCALAR_FIELDS.clone().into_iter().map(|x| x.0));
157            fields.extend(SCALAR_FIELDS_OPT.clone().into_iter().map(|x| x.0));
158            fields.extend(VECTOR_FIELDS.clone().into_iter().map(|x| x.0));
159            fields.extend(VECTOR_FIELDS_OPT.clone().into_iter().map(|x| x.0));
160            fields
161        },
162        scalars_required: SCALAR_FIELDS.to_vec(),
163        scalars_optional: SCALAR_FIELDS_OPT.to_vec(),
164        vectors_required: VECTOR_FIELDS.to_vec(),
165        vectors_optional: VECTOR_FIELDS_OPT.to_vec(),
166        vector_dim_groups: MATCHED_VECS.clone(),
167    };
168}
169
170create_record_type!(map, MAP_FIELDS);