Skip to content

Commit 7e86202

Browse files
committed
Retain existing dataset IDs
If any datasets, dataset groups, or dataset transforms already have IDs, e.g. from make_mmcif, retain them when writing out the new file. Closes #187.
1 parent a23854b commit 7e86202

1 file changed

Lines changed: 18 additions & 35 deletions

File tree

ihm/dumper.py

Lines changed: 18 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1266,44 +1266,27 @@ def _posix_path(self, path):
12661266

12671267
class _DatasetDumper(Dumper):
12681268
def finalize(self, system):
1269-
def _all_transforms(dataset):
1270-
for p in dataset.parents:
1271-
if isinstance(p, ihm.dataset.TransformedDataset):
1272-
yield p.transform
1273-
seen_datasets = {}
1274-
seen_transforms = {}
1269+
def _all_transforms():
1270+
for d in system._all_datasets():
1271+
for p in d.parents:
1272+
if isinstance(p, ihm.dataset.TransformedDataset):
1273+
yield p.transform
1274+
yield from system._orphan_dataset_transforms
1275+
12751276
# Assign IDs to all datasets and transforms
1276-
self._dataset_by_id = []
1277-
self._transform_by_id = []
1278-
for d in system._all_datasets():
1279-
for t in _all_transforms(d):
1280-
# Can't use default _id attribute here since a given transform
1281-
# may be used by both a dataset and a geometric object, and
1282-
# since they live in different tables they need different IDs
1283-
util._remove_id(t, attr='_dtid')
1284-
util._remove_id(d)
1285-
for t in system._orphan_dataset_transforms:
1286-
util._remove_id(t, attr='_dtid')
1287-
for d in system._all_datasets():
1288-
util._assign_id(d, seen_datasets, self._dataset_by_id)
1289-
for t in _all_transforms(d):
1290-
util._assign_id(t, seen_transforms, self._transform_by_id,
1291-
attr='_dtid')
1292-
for t in system._orphan_dataset_transforms:
1293-
util._assign_id(t, seen_transforms, self._transform_by_id,
1294-
attr='_dtid')
1277+
assign = util._HashAssignIDs(system._all_datasets)
1278+
self._dataset_by_id = assign.assign_all()
1279+
# Can't use default _id attribute here since a given transform
1280+
# may be used by both a dataset and a geometric object, and
1281+
# since they live in different tables they need different IDs
1282+
assign = util._HashAssignIDs(_all_transforms, attr='_dtid')
1283+
self._transform_by_id = assign.assign_all()
12951284

12961285
# Assign IDs to all groups and remove duplicates
1297-
seen_group_ids = {}
1298-
self._dataset_group_by_id = []
1299-
for g in system._all_dataset_groups():
1300-
ids = tuple(sorted(d._id for d in g))
1301-
if ids not in seen_group_ids:
1302-
self._dataset_group_by_id.append(g)
1303-
g._id = len(self._dataset_group_by_id)
1304-
seen_group_ids[ids] = g
1305-
else:
1306-
g._id = seen_group_ids[ids]._id
1286+
assign = util._HashAssignIDs(
1287+
system._all_dataset_groups,
1288+
hash_func=lambda g: tuple(sorted(d._id for d in g)))
1289+
self._dataset_group_by_id = assign.assign_all()
13071290

13081291
def dump(self, system, writer):
13091292
with writer.loop("_ihm_dataset_list",

0 commit comments

Comments
 (0)