From 4abae7d084754b8b40ce46af1153d0d177d426e6 Mon Sep 17 00:00:00 2001 From: Hayato Ikoma Date: Sat, 13 Nov 2021 10:37:13 -0800 Subject: [PATCH 1/2] Fix a bug of parsing channel validity --- nd2reader/raw_metadata.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/nd2reader/raw_metadata.py b/nd2reader/raw_metadata.py index 1152219..d1113d1 100644 --- a/nd2reader/raw_metadata.py +++ b/nd2reader/raw_metadata.py @@ -139,11 +139,15 @@ def _process_channels_metadata(self, metadata): def _get_channel_validity_list(self, metadata): try: - validity = self.image_metadata[six.b('SLxExperiment')][six.b('ppNextLevelEx')][six.b('')][0][ - six.b('ppNextLevelEx')][six.b('')][0][six.b('pItemValid')] + validity = self.image_metadata[six.b('SLxExperiment')][six.b('ppNextLevelEx')][six.b('')][ + six.b('ppNextLevelEx')][six.b('')][six.b('pItemValid')] except (KeyError, TypeError): - # If none of the channels have been deleted, there is no validity list, so we just make one - validity = [True for _ in metadata] + try: + validity = self.image_metadata[six.b('SLxExperiment')][six.b('ppNextLevelEx')][six.b('')][0][ + six.b('ppNextLevelEx')][six.b('')][0][six.b('pItemValid')] + except (KeyError, TypeError): + # If none of the channels have been deleted, there is no validity list, so we just make one + validity = [True for _ in metadata[six.b('sPlaneNew')]] return validity def _parse_fields_of_view(self): From 02eeda2248096c05832e527e3e897dba946e7e2c Mon Sep 17 00:00:00 2001 From: Hayato Ikoma Date: Sat, 13 Nov 2021 20:34:52 -0800 Subject: [PATCH 2/2] Refactor --- nd2reader/raw_metadata.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/nd2reader/raw_metadata.py b/nd2reader/raw_metadata.py index d1113d1..3d4624c 100644 --- a/nd2reader/raw_metadata.py +++ b/nd2reader/raw_metadata.py @@ -1,3 +1,4 @@ +from collections.abc import Sequence import re import xmltodict import six @@ -137,17 +138,21 @@ def _process_channels_metadata(self, metadata): channels.append('Unknown') return channels + def _parse_validity(self): + parsed = self.image_metadata[six.b('SLxExperiment')] + for _ in range(2): + parsed = parsed[six.b('ppNextLevelEx')][six.b('')] + if isinstance(parsed, Sequence): + # Old format had this structure. + parsed = parsed[0] + return parsed[six.b('pItemValid')] + def _get_channel_validity_list(self, metadata): try: - validity = self.image_metadata[six.b('SLxExperiment')][six.b('ppNextLevelEx')][six.b('')][ - six.b('ppNextLevelEx')][six.b('')][six.b('pItemValid')] + validity = self._parse_validity() except (KeyError, TypeError): - try: - validity = self.image_metadata[six.b('SLxExperiment')][six.b('ppNextLevelEx')][six.b('')][0][ - six.b('ppNextLevelEx')][six.b('')][0][six.b('pItemValid')] - except (KeyError, TypeError): - # If none of the channels have been deleted, there is no validity list, so we just make one - validity = [True for _ in metadata[six.b('sPlaneNew')]] + # If none of the channels have been deleted, there is no validity list, so we just make one + validity = [True for _ in metadata[six.b('sPlaneNew')]] return validity def _parse_fields_of_view(self):