FixSymmetry cannot be saved in ase.db database
Checklist
-
The issue remains in the development version of ASE. -
A minimal example is provided to reproduce the issue.
Summary
An atoms object that has FixSymmetry()
constraints shows problems while saving into an ase_sqlite.db database. todict()
the method is missing. I wrote a subclass of FixSymmetry()
to solve this. But while reading it back, the dict2constraint()
method complained. As FixSymmetry
is missing from the list of constraints in dict2constraint()
.
In [1]: from ase.spacegroup.symmetrize import FixSymmetry
In [2]: from ase.build import bulk
In [3]: atoms = bulk("Al",cubic=True)
In [4]: atoms
Out[4]: Atoms(symbols='Al4', pbc=True, cell=[4.05, 4.05, 4.05])
In [5]: atoms.set_constraint(FixSymmetry(atoms))
In [6]: atoms
Out[6]: Atoms(symbols='Al4', pbc=True, cell=[4.049999999999999, 4.049999999999999, 4.049999999999999], constraint=<ase.spacegroup.symmetrize.FixSymmetry object at 0x1548b72ab820>)
In [7]: from ase.db import connect
In [8]: db = connect("test.db")
In [9]: db.write(atoms)
AttributeError Traceback (most recent call last) in ----> 1 db.write(atoms)
/home/groups/da_mm/apps/ase/3.23.0b1/lib/python3.9/site-packages/ase-3.23.0b1-py3.9.egg/ase/parallel.py in new_func(*args, **kwargs) 269 not kwargs.pop('parallel', True)): 270 # Disable: --> 271 return func(*args, **kwargs) 272 273 ex = None
/home/groups/da_mm/apps/ase/3.23.0b1/lib/python3.9/site-packages/ase-3.23.0b1-py3.9.egg/ase/db/core.py in new_method(self, *args, **kwargs) 240 else: 241 with self.lock: --> 242 return method(self, *args, **kwargs) 243 return new_method 244
/home/groups/da_mm/apps/ase/3.23.0b1/lib/python3.9/site-packages/ase-3.23.0b1-py3.9.egg/ase/db/core.py in write(self, atoms, key_value_pairs, data, id, **kwargs) 387 kvp.update(kwargs) 388 --> 389 id = self._write(atoms, kvp, data, id) 390 return id 391
/home/groups/da_mm/apps/ase/3.23.0b1/lib/python3.9/site-packages/ase-3.23.0b1-py3.9.egg/ase/db/sqlite.py in _write(self, atoms, key_value_pairs, data, id) 264 265 if not isinstance(atoms, AtomsRow): --> 266 row = AtomsRow(atoms) 267 row.ctime = mtime 268 row.user = os.getenv('USER')
/home/groups/da_mm/apps/ase/3.23.0b1/lib/python3.9/site-packages/ase-3.23.0b1-py3.9.egg/ase/db/row.py in init(self, dct) 81 dct['calculator_parameters']) 82 else: ---> 83 dct = atoms2dict(dct) 84 assert 'numbers' in dct 85 self._constraints = dct.pop('constraints', [])
/home/groups/da_mm/apps/ase/3.23.0b1/lib/python3.9/site-packages/ase-3.23.0b1-py3.9.egg/ase/db/row.py in atoms2dict(atoms) 50 dct['momenta'] = atoms.get_momenta() 51 if atoms.constraints: ---> 52 dct['constraints'] = [c.todict() for c in atoms.constraints] 53 if atoms.calc is not None: 54 dct['calculator'] = atoms.calc.name.lower()
/home/groups/da_mm/apps/ase/3.23.0b1/lib/python3.9/site-packages/ase-3.23.0b1-py3.9.egg/ase/db/row.py in (.0) 50 dct['momenta'] = atoms.get_momenta() 51 if atoms.constraints: ---> 52 dct['constraints'] = [c.todict() for c in atoms.constraints] 53 if atoms.calc is not None: 54 dct['calculator'] = atoms.calc.name.lower()
AttributeError: 'FixSymmetry' object has no attribute 'todict'