Coverage for /builds/ase/ase/ase/db/convert.py: 17.39%
46 statements
« prev ^ index » next coverage.py v7.5.3, created at 2025-08-02 00:12 +0000
« prev ^ index » next coverage.py v7.5.3, created at 2025-08-02 00:12 +0000
1# fmt: off
3import optparse
4import os
6import numpy as np
8from ase.db import connect
9from ase.db.sqlite import index_statements
12def convert(name, opts):
13 con1 = connect(name, use_lock_file=False)
14 con1._allow_reading_old_format = True
15 newname = name[:-2] + 'new.db'
16 with connect(newname, create_indices=False, use_lock_file=False) as con2:
17 row = None
18 for row in con1.select():
19 kvp = row.get('key_value_pairs', {})
20 if opts.convert_strings_to_numbers:
21 for key, value in kvp.items():
22 if isinstance(value, str):
23 try:
24 value = float(value)
25 except ValueError:
26 pass
27 else:
28 kvp[key] = value
29 if opts.convert_minus_to_not_a_number:
30 for key, value in kvp.items():
31 if value == '-':
32 kvp[key] = np.nan
34 atoms = row.toatoms()
35 if opts.remove_constrints:
36 atoms.constraints = []
37 con2.write(atoms, data=row.get('data'), **kvp)
39 assert row is not None, 'Your database is empty!'
41 c = con2._connect()
42 for statement in index_statements:
43 c.execute(statement)
44 c.commit()
46 os.rename(name, name[:-2] + 'old.db')
47 os.rename(newname, name)
50def main():
51 parser = optparse.OptionParser()
52 parser.add_option('-S', '--convert-strings-to-numbers',
53 action='store_true')
54 parser.add_option('-N', '--convert-minus-to-not-a-number',
55 action='store_true')
56 parser.add_option('-C', '--remove-constraints',
57 action='store_true')
58 opts, args = parser.parse_args()
59 for name in args:
60 convert(name, opts)
63if __name__ == '__main__':
64 main()