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

1# fmt: off 

2 

3import optparse 

4import os 

5 

6import numpy as np 

7 

8from ase.db import connect 

9from ase.db.sqlite import index_statements 

10 

11 

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 

33 

34 atoms = row.toatoms() 

35 if opts.remove_constrints: 

36 atoms.constraints = [] 

37 con2.write(atoms, data=row.get('data'), **kvp) 

38 

39 assert row is not None, 'Your database is empty!' 

40 

41 c = con2._connect() 

42 for statement in index_statements: 

43 c.execute(statement) 

44 c.commit() 

45 

46 os.rename(name, name[:-2] + 'old.db') 

47 os.rename(newname, name) 

48 

49 

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) 

61 

62 

63if __name__ == '__main__': 

64 main()