Skip to content

Commit d7c5ae4

Browse files
authored
Merge pull request #440 from OpenBioSim/feature_system_renumber
Add support for renumbering molecules when copying a system
2 parents 8d7eb9c + bc9610f commit d7c5ae4

File tree

4 files changed

+128
-0
lines changed

4 files changed

+128
-0
lines changed

python/BioSimSpace/Sandpit/Exscientia/_SireWrappers/_system.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,47 @@ def __len__(self):
260260
"""Return the number of molecules in the system."""
261261
return self.nMolecules()
262262

263+
def copy(self, renumber=False):
264+
"""
265+
Return a copy of this System.
266+
267+
Parameters
268+
----------
269+
270+
renumber : bool
271+
Whether to give the copied molecules unique molecule numbers.
272+
273+
Returns
274+
-------
275+
276+
System : :class:`System <BioSimSpace._SireWrappers.System>`
277+
A copy of the object.
278+
"""
279+
280+
if not isinstance(renumber, bool):
281+
raise TypeError("'renumber' must be of type 'bool'")
282+
283+
if not renumber:
284+
return super().copy()
285+
286+
# Create a molecules container.
287+
mols = _SireMol.MoleculeGroup("all")
288+
289+
# Give each molecule a unique molecule number.
290+
for mol in self._sire_object:
291+
cursor = mol.cursor()
292+
cursor.number = _SireMol.MolNum.getUniqueNumber()
293+
mols.add(cursor.commit())
294+
295+
# Create a new system.
296+
system = _Molecules(mols).toSystem()
297+
298+
# Copy over the system properties.
299+
for prop in self._sire_object.propertyKeys():
300+
system._sire_object.setProperty(prop, self._sire_object.property(prop))
301+
302+
return system
303+
263304
def nMolecules(self):
264305
"""
265306
Return the number of molecules in the system.

python/BioSimSpace/_SireWrappers/_system.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,47 @@ def __len__(self):
260260
"""Return the number of molecules in the system."""
261261
return self.nMolecules()
262262

263+
def copy(self, renumber=False):
264+
"""
265+
Return a copy of this System.
266+
267+
Parameters
268+
----------
269+
270+
renumber : bool
271+
Whether to give the copied molecules unique molecule numbers.
272+
273+
Returns
274+
-------
275+
276+
System : :class:`System <BioSimSpace._SireWrappers.System>`
277+
A copy of the object.
278+
"""
279+
280+
if not isinstance(renumber, bool):
281+
raise TypeError("'renumber' must be of type 'bool'")
282+
283+
if not renumber:
284+
return super().copy()
285+
286+
# Create a molecules container.
287+
mols = _SireMol.MoleculeGroup("all")
288+
289+
# Give each molecule a unique molecule number.
290+
for mol in self._sire_object:
291+
cursor = mol.cursor()
292+
cursor.number = _SireMol.MolNum.getUniqueNumber()
293+
mols.add(cursor.commit())
294+
295+
# Create a new system.
296+
system = _Molecules(mols).toSystem()
297+
298+
# Copy over the system properties.
299+
for prop in self._sire_object.propertyKeys():
300+
system._sire_object.setProperty(prop, self._sire_object.property(prop))
301+
302+
return system
303+
263304
def nMolecules(self):
264305
"""
265306
Return the number of molecules in the system.

tests/Sandpit/Exscientia/_SireWrappers/test_system.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,3 +508,26 @@ def test_remove_box(system):
508508

509509
# Make sure the box is removed.
510510
assert not "space" in system._sire_object.propertyKeys()
511+
512+
513+
def test_renumber(system):
514+
# Make sure all the molecules retain their original numbers
515+
# using the default copy.
516+
for mol0, mol1 in zip(system, system.copy()):
517+
assert mol0.number() == mol1.number()
518+
519+
# Store the set of original molecule numbers.
520+
original_numbers = set(mol.number() for mol in system)
521+
522+
# Create a renumbered copy of the system.
523+
renumbered_system = system.copy(renumber=True)
524+
525+
# Make sure that all of the numbers differ when renumbering.
526+
for mol0, mol1 in zip(system, renumbered_system):
527+
assert mol0.number() != mol1.number()
528+
529+
# Store the set of renumbered molecule numbers.
530+
renumbered_numbers = set(mol.number() for mol in renumbered_system)
531+
532+
# Make sure that no original numbers are present in the renumbered set.
533+
assert original_numbers.isdisjoint(renumbered_numbers)

tests/_SireWrappers/test_system.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,3 +498,26 @@ def test_remove_box(system):
498498

499499
# Make sure the box is removed.
500500
assert not "space" in system._sire_object.propertyKeys()
501+
502+
503+
def test_renumber(system):
504+
# Make sure all the molecules retain their original numbers
505+
# using the default copy.
506+
for mol0, mol1 in zip(system, system.copy()):
507+
assert mol0.number() == mol1.number()
508+
509+
# Store the set of original molecule numbers.
510+
original_numbers = set(mol.number() for mol in system)
511+
512+
# Create a renumbered copy of the system.
513+
renumbered_system = system.copy(renumber=True)
514+
515+
# Make sure that all of the numbers differ when renumbering.
516+
for mol0, mol1 in zip(system, renumbered_system):
517+
assert mol0.number() != mol1.number()
518+
519+
# Store the set of renumbered molecule numbers.
520+
renumbered_numbers = set(mol.number() for mol in renumbered_system)
521+
522+
# Make sure that no original numbers are present in the renumbered set.
523+
assert original_numbers.isdisjoint(renumbered_numbers)

0 commit comments

Comments
 (0)