dmap/formats/
grid.rs

1//! The [Grid file format](https://radar-software-toolkit-rst.readthedocs.io/en/latest/references/general/grid/).
2
3use crate::record::create_record_type;
4use crate::types::{Fields, Type};
5use lazy_static::lazy_static;
6
7static SCALAR_FIELDS: [(&str, Type); 12] = [
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];
21
22static SCALAR_FIELDS_OPT: [(&str, Type); 0] = [];
23
24static VECTOR_FIELDS: [(&str, Type); 18] = [
25    ("stid", Type::Short),
26    ("channel", Type::Short),
27    ("nvec", Type::Short),
28    ("freq", Type::Float),
29    ("major.revision", Type::Short),
30    ("minor.revision", Type::Short),
31    ("program.id", Type::Short),
32    ("noise.mean", Type::Float),
33    ("noise.sd", Type::Float),
34    ("gsct", Type::Short),
35    ("v.min", Type::Float),
36    ("v.max", Type::Float),
37    ("p.min", Type::Float),
38    ("p.max", Type::Float),
39    ("w.min", Type::Float),
40    ("w.max", Type::Float),
41    ("ve.min", Type::Float),
42    ("ve.max", Type::Float),
43];
44
45static VECTOR_FIELDS_OPT: [(&str, Type); 13] = [
46    ("vector.mlat", Type::Float),
47    ("vector.mlon", Type::Float),
48    ("vector.kvect", Type::Float),
49    ("vector.stid", Type::Short),
50    ("vector.channel", Type::Short),
51    ("vector.index", Type::Int),
52    ("vector.vel.median", Type::Float),
53    ("vector.vel.sd", Type::Float),
54    ("vector.pwr.median", Type::Float),
55    ("vector.pwr.sd", Type::Float),
56    ("vector.wdt.median", Type::Float),
57    ("vector.wdt.sd", Type::Float),
58    ("vector.srng", Type::Float),
59];
60
61lazy_static! {
62    static ref MATCHED_VECS: Vec<Vec<&'static str>> = vec![
63        vec![
64            "stid",
65            "channel",
66            "nvec",
67            "freq",
68            "major.revision",
69            "minor.revision",
70            "program.id",
71            "noise.mean",
72            "noise.sd",
73            "gsct",
74            "v.min",
75            "v.max",
76            "p.min",
77            "p.max",
78            "w.min",
79            "w.max",
80            "ve.min",
81            "ve.max",
82        ],
83        vec![
84            "vector.mlat",
85            "vector.mlon",
86            "vector.kvect",
87            "vector.stid",
88            "vector.channel",
89            "vector.index",
90            "vector.vel.median",
91            "vector.vel.sd",
92            "vector.pwr.median",
93            "vector.pwr.sd",
94            "vector.wdt.median",
95            "vector.wdt.sd",
96        ],
97    ];
98    static ref GRID_FIELDS: Fields<'static> = Fields {
99        all_fields: {
100            let mut fields: Vec<&str> = vec![];
101            fields.extend(SCALAR_FIELDS.clone().into_iter().map(|x| x.0));
102            fields.extend(SCALAR_FIELDS_OPT.clone().into_iter().map(|x| x.0));
103            fields.extend(VECTOR_FIELDS.clone().into_iter().map(|x| x.0));
104            fields.extend(VECTOR_FIELDS_OPT.clone().into_iter().map(|x| x.0));
105            fields
106        },
107        scalars_required: SCALAR_FIELDS.to_vec(),
108        scalars_optional: SCALAR_FIELDS_OPT.to_vec(),
109        vectors_required: VECTOR_FIELDS.to_vec(),
110        vectors_optional: VECTOR_FIELDS_OPT.to_vec(),
111        vector_dim_groups: MATCHED_VECS.clone(),
112    };
113}
114
115create_record_type!(grid, GRID_FIELDS);