Skip to content
Merged
1 change: 1 addition & 0 deletions doc/source/credits.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ Credits
* Mayukh Kundu
* Philipp Leclercq
* C\. Levi Petix
* Dimitris Arquin
22 changes: 20 additions & 2 deletions src/lammpsio/topology.py
Original file line number Diff line number Diff line change
Expand Up @@ -381,12 +381,23 @@ class LabelMap(collections.abc.MutableMapping[int, str]):
type_label = lammpsio.topology.LabelMap({1: "A", 2: "B"})

This creates a dictionary mapping numeric type ID labels 1 and 2 used by LAMMPS
to alphanumeric type labels "A" and "B", such as those used by HOOMD-blue.
to alphanumeric type labels "A" and "B", such as those used by HOOMD-blue. The
map can be accessed directly:

.. code-block:: python

assert type_label[1] == "A"

The `LabelMap` additionally supports inverse mapping from type label to type ID:

.. code-block:: python

assert type_label.inverse["B"] == 2
"""

def __init__(self, map=None):
self._map = {}
self._inverse_map = {}
if map is not None:
self.update(map)

Expand All @@ -395,9 +406,11 @@ def __getitem__(self, key):

def __setitem__(self, key, value):
self._map[key] = value
self._inverse_map[value] = key

def __delitem__(self, key):
del self._map[key]
value = self._map.pop(key)
del self._inverse_map[value]

def __iter__(self):
return iter(self._map)
Expand All @@ -414,3 +427,8 @@ def types(self):
def typeid(self):
"""tuple of int: Type IDs in map."""
return tuple(self._map.keys())

@property
def inverse(self) -> dict[str, int]:
"""dict: Inverse map from type label to type id."""
return self._inverse_map
5 changes: 4 additions & 1 deletion tests/test_topology.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,16 +204,19 @@ def test_impropers_wrong_shape(snap_8):
def test_LabelMap():
# create a simple label map
label = lammpsio.topology.LabelMap({1: "typeA", 2: "typeB"})

# check the types
assert label.types == ("typeA", "typeB")
# check the typeids
assert label.typeid == (1, 2)
# get
assert label[2] == "typeB"
# get inverse
assert label.inverse["typeB"] == 2
# set
label[3] = "typeC"
assert label[3] == "typeC"
assert label.inverse["typeC"] == 3
# delete
del label[3]
assert 3 not in label
assert "typeC" not in label.inverse