From fe4cddba7e75cf12024ce6f8391abce864167a4a Mon Sep 17 00:00:00 2001 From: Brett Johnston Date: Tue, 7 Jan 2025 11:07:05 +0000 Subject: [PATCH] Bugfix metadata params from xml --- sarkit/standards/sicd/projection/params.py | 1 + sarkit/verification/sicd_consistency.py | 3 --- tests/standards/sicd/test_projection.py | 8 +++++++ tests/verification/test_sicd_consistency.py | 26 +++++++++++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/sarkit/standards/sicd/projection/params.py b/sarkit/standards/sicd/projection/params.py index a02ad62..271e85f 100644 --- a/sarkit/standards/sicd/projection/params.py +++ b/sarkit/standards/sicd/projection/params.py @@ -28,6 +28,7 @@ def _get_rcv_poly(xmlhelp): rcv_apc_polys = [ xmlhelp.load(f"{{*}}Position/{{*}}RcvAPC/{{*}}RcvAPCPoly[@index='{c}']") for c in rcv_apc_indices + if c is not None ] if rcv_apc_polys: return functools.reduce(npp.polyadd, rcv_apc_polys) / len(rcv_apc_polys) diff --git a/sarkit/verification/sicd_consistency.py b/sarkit/verification/sicd_consistency.py index 3519b21..13561ad 100644 --- a/sarkit/verification/sicd_consistency.py +++ b/sarkit/verification/sicd_consistency.py @@ -1753,9 +1753,6 @@ def check_rcvapcindex(self) -> None: "./{*}RadarCollection/{*}RcvChannels/{*}ChanParameters/{*}RcvAPCIndex" ) ] - with self.need("RcvAPC and RcvAPCIndex must be included together"): - assert len(rcvapc_indices) > 0 - assert len(rcvapcindex) > 0 for index in rcvapcindex: with self.need( diff --git a/tests/standards/sicd/test_projection.py b/tests/standards/sicd/test_projection.py index 3e0c78e..b68deab 100644 --- a/tests/standards/sicd/test_projection.py +++ b/tests/standards/sicd/test_projection.py @@ -46,6 +46,14 @@ def test_metadata_params(): assert not unset_attrs +def test_metadata_params_without_optional_apcs(): + etree = lxml.etree.parse(DATAPATH / "example-sicd-1.3.0.xml") + assert ss_proj.MetadataParams.from_xml(etree).Rcv_Poly is not None + for el in etree.findall(".//{*}RcvAPCIndex") + etree.findall(".//{*}RcvApcPoly"): + el.getparent().remove(el) + assert ss_proj.MetadataParams.from_xml(etree).Rcv_Poly is None + + def test_metadata_params_is_monostatic(example_proj_metadata): example_proj_metadata.Collect_Type = "MONOSTATIC" assert example_proj_metadata.is_monostatic() diff --git a/tests/verification/test_sicd_consistency.py b/tests/verification/test_sicd_consistency.py index 16d7404..0801383 100644 --- a/tests/verification/test_sicd_consistency.py +++ b/tests/verification/test_sicd_consistency.py @@ -676,3 +676,29 @@ def test_check_image_formation_timeline(sicd_con): ) sicd_con.check("check_image_formation_timeline") assert sicd_con.failures() + + +def test_check_rcvapcindex(sicd_con): + # Invalid APCIndex + sicd_con.xmlhelp.set( + "./{*}RadarCollection/{*}RcvChannels/{*}ChanParameters/{*}RcvAPCIndex", + 100, + ) + sicd_con.check("check_rcvapcindex") + assert sicd_con.failures() + + # No APCIndex with APCPolys is OK + rcvapcindex = sicd_con.sicdroot.find( + "./{*}RadarCollection/{*}RcvChannels/{*}ChanParameters/{*}RcvAPCIndex" + ) + rcvapcindex.getparent().remove(rcvapcindex) + sicd_con.check("check_rcvapcindex") + assert not sicd_con.failures() + + +def test_check_rcvapcindex_nopolys(sicd_con): + # APCIndex with no APCPolys + rcvapcnode = sicd_con.sicdroot.find("./{*}Position/{*}RcvAPC") + rcvapcnode.getparent().remove(rcvapcnode) + sicd_con.check("check_rcvapcindex") + assert sicd_con.failures()