1use 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);