diff --git a/src/agora/io/signal.py b/src/agora/io/signal.py index 3f0d66d5c011e577c32c621df9c710b244c2d018..dac2ec6b5173db404192d185f577242c5dd9baa5 100644 --- a/src/agora/io/signal.py +++ b/src/agora/io/signal.py @@ -15,7 +15,6 @@ from agora.io.decorators import _first_arg_str_to_raw_df from agora.utils.indexing import validate_lineage from agora.utils.kymograph import add_index_levels from agora.utils.merge import apply_merges -from postprocessor.core.reshapers.picker import Picker, PickerParameters class Signal(BridgeH5): @@ -57,8 +56,11 @@ class Signal(BridgeH5): """Get Signal after merging and picking.""" if isinstance(dset_name, str): dsets = self.get_raw(dset_name, **kwargs) - picked_merged = self.apply_merging_picking(dsets, **kwargs) - return self.add_name(picked_merged, dset_name) + if dsets is not None: + picked_merged = self.apply_merging_picking(dsets, **kwargs) + return self.add_name(picked_merged, dset_name) + else: + return None else: raise Exception("Error in Signal.get") @@ -266,32 +268,37 @@ class Signal(BridgeH5): try: if isinstance(dataset, str): with h5py.File(self.filename, "r") as f: - df = self.dataset_to_df(f, dataset).sort_index() - if in_minutes: - df = self.cols_in_mins(df) + df = self.dataset_to_df(f, dataset) + if df is not None: + df = df.sort_index() + if in_minutes: + df = self.cols_in_mins(df) + # apply merging or picking or both or neither + df = self.apply_merging_picking(df, merges, picks) + # add mother label to data frame + if lineage: + mother_label = np.zeros(len(df), dtype=int) + lineage = self.lineage() + valid_lineage, valid_indices = validate_lineage( + lineage, + indices=np.array(df.index.to_list()), + how="daughters", + ) + mother_label[valid_indices] = lineage[ + valid_lineage, 1 + ] + df = add_index_levels( + df, {"mother_label": mother_label} + ) + return df elif isinstance(dataset, list): return [ self.get_raw(dset, in_minutes=in_minutes, lineage=lineage) for dset in dataset ] - # apply merging or picking or both or neither - df = self.apply_merging_picking(df, merges, picks) - # add mother label to data frame - if lineage: - mother_label = np.zeros(len(df), dtype=int) - lineage = self.lineage() - - valid_lineage, valid_indices = validate_lineage( - lineage, - indices=np.array(df.index.to_list()), - how="daughters", - ) - mother_label[valid_indices] = lineage[valid_lineage, 1] - df = add_index_levels(df, {"mother_label": mother_label}) - return df except Exception as e: - self._log(f"Could not fetch dataset {dataset}: {e}", "error") - raise e + message = f"Signal could not find data {dataset}: {e}." + self._log(message) def load_merges(self): """Get merge events going up to the first level.""" @@ -318,21 +325,25 @@ class Signal(BridgeH5): def dataset_to_df(self, f: h5py.File, path: str) -> pd.DataFrame: """Get data from h5 file as a dataframe.""" - assert path in f, f"{path} not in {f}" - dset = f[path] - values, index, columns = [], [], [] - index_names = copy(self.index_names) - valid_names = [lbl for lbl in index_names if lbl in dset.keys()] - if valid_names: - index = pd.MultiIndex.from_arrays( - [dset[lbl] for lbl in valid_names], names=valid_names - ) - columns = dset.attrs.get("columns", None) - if "timepoint" in dset: - columns = f[path + "/timepoint"][()] - values = f[path + "/values"][()] - df = pd.DataFrame(values, index=index, columns=columns) - return df + if path not in f: + message = f"{path} not in {f}." + self._log(message) + return None + else: + dset = f[path] + values, index, columns = [], [], [] + index_names = copy(self.index_names) + valid_names = [lbl for lbl in index_names if lbl in dset.keys()] + if valid_names: + index = pd.MultiIndex.from_arrays( + [dset[lbl] for lbl in valid_names], names=valid_names + ) + columns = dset.attrs.get("columns", None) + if "timepoint" in dset: + columns = f[path + "/timepoint"][()] + values = f[path + "/values"][()] + df = pd.DataFrame(values, index=index, columns=columns) + return df @property def stem(self): diff --git a/src/postprocessor/core/postprocessing.py b/src/postprocessor/core/postprocessing.py index 301891dc6e8d6df48dca92801fd82ac7483a6310..f7e0811aa45bf0ad6c9f30d56965ca2058ce12cc 100644 --- a/src/postprocessor/core/postprocessing.py +++ b/src/postprocessor/core/postprocessing.py @@ -192,7 +192,9 @@ class PostProcessor(ProcessABC): else: raise ("Incorrect dataset") # run process on signal - if len(signal) and ( + if signal is None: + return None + elif len(signal) and ( not isinstance(loaded_process, LineageProcess) or len(loaded_process.lineage) ): diff --git a/src/postprocessor/grouper.py b/src/postprocessor/grouper.py index cc525eca6bbed3c45878f5ca58b70e4ec349b4cd..4903957216f0e6a8609a3af2e9f899494fe1a4f8 100644 --- a/src/postprocessor/grouper.py +++ b/src/postprocessor/grouper.py @@ -128,7 +128,7 @@ class Grouper(ABC): ] records = [record for record in records if record is not None] if len(errors): - print("Warning: Positions contain errors {errors}") + print(f"Warning: Positions ({errors}) contain errors.") assert len(records), "All data sets contain errors" # combine into one dataframe concat = pd.concat(records, axis=0)