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