Skip to content

Commit

Permalink
antex record: re-enable record merging, introduce dedicated test
Browse files Browse the repository at this point in the history
Signed-off-by: Guillaume W. Bres <[email protected]>
  • Loading branch information
gwbres committed Dec 26, 2023
1 parent d28ac7a commit bb6b1b2
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 23 deletions.
48 changes: 29 additions & 19 deletions rinex/src/antex/record.rs
Original file line number Diff line number Diff line change
Expand Up @@ -412,25 +412,35 @@ impl Merge for Record {
Ok(lhs)
}
/// Merges `rhs` into `Self`
fn merge_mut(&mut self, _rhs: &Self) -> Result<(), merge::Error> {
//for antenna in rhs.iter() {
// if self.contains(antenna) {
// let (antenna, frequencies) = antenna;
// for (aantenna, ffrequencies) in self.iter_mut() {
// if antenna == aantenna {
// // for this antenna
// // add missing frequencies
// for frequency in frequencies {
// if !ffrequencies.contains(frequency) {
// ffrequencies.push(frequency.clone());
// }
// }
// }
// }
// } else {
// self.push(antenna.clone());
// }
//}
fn merge_mut(&mut self, rhs: &Self) -> Result<(), merge::Error> {
for (antenna, subset) in rhs.iter() {
for (carrier, freqdata) in subset.iter() {
/*
* determine whether self contains this antenna & signal or not
*/
let mut has_ant = false;
let mut has_signal = false;
for (lhs_ant, subset) in self.iter_mut() {
if lhs_ant == antenna {
has_ant |= true;
for (lhs_carrier, lhs_freq_data) in subset.iter_mut() {
if lhs_carrier == carrier {
has_signal |= true;
break;
}
}
if !has_signal {
subset.insert(carrier.clone(), freqdata.clone());
}
}
}
if !has_ant {
let mut inner = HashMap::<Carrier, FrequencyDependentData>::new();
inner.insert(carrier.clone(), freqdata.clone());
self.push((antenna.clone(), inner));
}
}
}
Ok(())
}
}
13 changes: 9 additions & 4 deletions rinex/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2930,10 +2930,15 @@ impl Merge for Rinex {
/// Merges `rhs` into `Self` in place
fn merge_mut(&mut self, rhs: &Self) -> Result<(), merge::Error> {
self.header.merge_mut(&rhs.header)?;
if self.epoch().count() == 0 {
// lhs is empty : overwrite
self.record = rhs.record.clone();
} else if rhs.epoch().count() != 0 {
if !self.is_antex() {
if self.epoch().count() == 0 {
// lhs is empty : overwrite
self.record = rhs.record.clone();
} else if rhs.epoch().count() != 0 {
// real merge
self.record.merge_mut(&rhs.record)?;
}
} else {
// real merge
self.record.merge_mut(&rhs.record)?;
}
Expand Down
40 changes: 40 additions & 0 deletions rinex/src/tests/merge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -169,4 +169,44 @@ mod test {
// remove file we just generated
let _ = std::fs::remove_file("merge.txt");
}
#[cfg(feature = "antex")]
use crate::antex::antenna::AntennaMatcher;
#[cfg(feature = "antex")]
use crate::Carrier;
#[test]
#[cfg(feature = "flate2")]
#[cfg(feature = "antex")]
fn merge_atx() {
let fp = env!("CARGO_MANIFEST_DIR").to_owned()
+ "/../test_resources/ATX/V1/TROSAR25.R4__LEIT_2020_09_23.atx";
let rinex_a = Rinex::from_file(&fp);
let rinex_a = rinex_a.unwrap();

let fp =
env!("CARGO_MANIFEST_DIR").to_owned() + "/../test_resources/ATX/V1/igs14_small.atx.gz";
let rinex_b = Rinex::from_file(&fp);
let rinex_b = rinex_b.unwrap();

let merged = rinex_a.merge(&rinex_b);
assert!(merged.is_ok(), "merged atx(a,b) failed");
let merged = merged.unwrap();

let antennas: Vec<_> = merged.antennas().collect();
assert_eq!(antennas.len(), 7, "bad number of antennas");

for (name, expected_apc) in [
("JPSLEGANT_E", (1.36, -0.43, 35.44)),
("JPSODYSSEY_I", (1.06, -2.43, 70.34)),
("TROSAR25.R4", (-0.22, -0.01, 154.88)),
] {
let fakenow = Epoch::from_gregorian_utc_at_midnight(2023, 01, 01);
let apc = merged.rx_antenna_apc_offset(
fakenow,
AntennaMatcher::IGSCode(name.to_string()),
Carrier::L1,
);
assert!(apc.is_some(), "APC should still be contained after merge()");
assert_eq!(apc.unwrap(), expected_apc);
}
}
}

0 comments on commit bb6b1b2

Please sign in to comment.