diff --git a/biosim_extractor/helpers/metadata_utils.py b/biosim_extractor/helpers/metadata_utils.py index c54a188..001320f 100644 --- a/biosim_extractor/helpers/metadata_utils.py +++ b/biosim_extractor/helpers/metadata_utils.py @@ -31,3 +31,22 @@ def round_floats(obj, decimals=3, preserve_below=1e-3): return {k: round_floats(v, decimals, preserve_below) for k, v in obj.items()} return obj + + +def merge_metadata(existing, incoming): + if not existing: + return incoming + if not incoming: + return existing + + for key, value in incoming.items(): + if ( + key in existing + and isinstance(existing[key], dict) + and isinstance(value, dict) + ): + merge_metadata(existing[key], value) + else: + existing[key] = value + + return existing diff --git a/biosim_extractor/metadata/populatemetadata.py b/biosim_extractor/metadata/populatemetadata.py index a0f64fe..bfc94fc 100644 --- a/biosim_extractor/metadata/populatemetadata.py +++ b/biosim_extractor/metadata/populatemetadata.py @@ -10,7 +10,7 @@ from biosim_extractor.amber.amberlog import AmberLogParser from biosim_extractor.gromacs.gromacslog import GromacsLogParser -from biosim_extractor.helpers.metadata_utils import round_floats +from biosim_extractor.helpers.metadata_utils import merge_metadata, round_floats from biosim_extractor.mdanalysis.toptraj import TopTrajParser from biosim_extractor.metadata.fetchschema import get_schema, update_schema from biosim_extractor.metadata.filemetadata import files_metadata, group_files @@ -257,7 +257,9 @@ def populate(self): self.data = self.apply_mapping() if self.top_file and self.traj_file: - self.data = self.populate_toptraj() + toptraj_data = self.populate_toptraj() + if toptraj_data is not None: + self.data = merge_metadata(self.data, toptraj_data) # self.data["SimulationMetadata"]["@type"] = "SimulationMetadata" result = self.data["SimulationMetadata"] @@ -526,7 +528,6 @@ def resolve_schema_inputs(args): mapping_path = args.mappingschema biosim_path = args.biosimschema - # If either path is missing, fetch a schema bundle and fill defaults. if not mapping_path or not biosim_path: bundle = ( update_schema( @@ -539,6 +540,7 @@ def resolve_schema_inputs(args): cache_dir=args.schema_cache_dir, ) ) + mapping_path = mapping_path or str(bundle.mapping_json) biosim_path = biosim_path or str(bundle.schema_yaml)