From 8102d52138b00f070f44f0994f80657969201041 Mon Sep 17 00:00:00 2001 From: Jas Kalayan Date: Fri, 25 Sep 2026 15:07:09 +0100 Subject: [PATCH 1/2] Update top/traj metadata to append rather than replace logfile extracted metadata --- biosim_extractor/metadata/populatemetadata.py | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/biosim_extractor/metadata/populatemetadata.py b/biosim_extractor/metadata/populatemetadata.py index a0f64fe..58fff38 100644 --- a/biosim_extractor/metadata/populatemetadata.py +++ b/biosim_extractor/metadata/populatemetadata.py @@ -257,7 +257,7 @@ def populate(self): self.data = self.apply_mapping() if self.top_file and self.traj_file: - self.data = self.populate_toptraj() + self.populate_toptraj() # self.data["SimulationMetadata"]["@type"] = "SimulationMetadata" result = self.data["SimulationMetadata"] @@ -526,19 +526,25 @@ 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 either path is missing, fetch a schema bundle from package if available, or download and fill defaults. if not mapping_path or not biosim_path: - bundle = ( - update_schema( - version=args.schema_version, - cache_dir=args.schema_cache_dir, - ) - if args.update_schema - else get_schema( - version=args.schema_version, - cache_dir=args.schema_cache_dir, + try: + from biosim_schema.utils.paths import engine_mappings_path, schema_yaml_path + + mapping_path = mapping_path or engine_mappings_path() + biosim_path = biosim_path or schema_yaml_path() + except ImportError: + bundle = ( + update_schema( + version=args.schema_version, + cache_dir=args.schema_cache_dir, + ) + if args.update_schema + else get_schema( + version=args.schema_version, + cache_dir=args.schema_cache_dir, + ) ) - ) mapping_path = mapping_path or str(bundle.mapping_json) biosim_path = biosim_path or str(bundle.schema_yaml) From ec04f1f62ba4dac565fe5cf9f3f38de9fb9f4a7b Mon Sep 17 00:00:00 2001 From: Jas Kalayan Date: Fri, 25 Sep 2026 16:32:44 +0100 Subject: [PATCH 2/2] Merge top/traj metadata into existing extracted data --- biosim_extractor/helpers/metadata_utils.py | 19 +++++++++++ biosim_extractor/metadata/populatemetadata.py | 34 ++++++++----------- 2 files changed, 34 insertions(+), 19 deletions(-) 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 58fff38..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.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,25 +528,19 @@ def resolve_schema_inputs(args): mapping_path = args.mappingschema biosim_path = args.biosimschema - # If either path is missing, fetch a schema bundle from package if available, or download and fill defaults. if not mapping_path or not biosim_path: - try: - from biosim_schema.utils.paths import engine_mappings_path, schema_yaml_path - - mapping_path = mapping_path or engine_mappings_path() - biosim_path = biosim_path or schema_yaml_path() - except ImportError: - bundle = ( - update_schema( - version=args.schema_version, - cache_dir=args.schema_cache_dir, - ) - if args.update_schema - else get_schema( - version=args.schema_version, - cache_dir=args.schema_cache_dir, - ) + bundle = ( + update_schema( + version=args.schema_version, + cache_dir=args.schema_cache_dir, + ) + if args.update_schema + else get_schema( + version=args.schema_version, + cache_dir=args.schema_cache_dir, ) + ) + mapping_path = mapping_path or str(bundle.mapping_json) biosim_path = biosim_path or str(bundle.schema_yaml)