nomad-parser-plugins-atomistic 1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. atomisticparsers/__init__.py +400 -0
  2. atomisticparsers/amber/__init__.py +19 -0
  3. atomisticparsers/amber/__main__.py +31 -0
  4. atomisticparsers/amber/metainfo/__init__.py +19 -0
  5. atomisticparsers/amber/metainfo/amber.py +495 -0
  6. atomisticparsers/amber/parser.py +42 -0
  7. atomisticparsers/asap/__init__.py +19 -0
  8. atomisticparsers/asap/__main__.py +31 -0
  9. atomisticparsers/asap/metainfo/__init__.py +19 -0
  10. atomisticparsers/asap/metainfo/asap.py +75 -0
  11. atomisticparsers/asap/parser.py +197 -0
  12. atomisticparsers/bopfox/__init__.py +19 -0
  13. atomisticparsers/bopfox/__main__.py +31 -0
  14. atomisticparsers/bopfox/metainfo/__init__.py +19 -0
  15. atomisticparsers/bopfox/metainfo/bopfox.py +225 -0
  16. atomisticparsers/bopfox/parser.py +808 -0
  17. atomisticparsers/dftbplus/__init__.py +19 -0
  18. atomisticparsers/dftbplus/__main__.py +31 -0
  19. atomisticparsers/dftbplus/metainfo/__init__.py +19 -0
  20. atomisticparsers/dftbplus/metainfo/dftbplus.py +217 -0
  21. atomisticparsers/dftbplus/parser.py +500 -0
  22. atomisticparsers/dlpoly/__init__.py +19 -0
  23. atomisticparsers/dlpoly/__main__.py +31 -0
  24. atomisticparsers/dlpoly/metainfo/__init__.py +19 -0
  25. atomisticparsers/dlpoly/metainfo/dl_poly.py +312 -0
  26. atomisticparsers/dlpoly/parser.py +798 -0
  27. atomisticparsers/gromacs/__init__.py +19 -0
  28. atomisticparsers/gromacs/__main__.py +31 -0
  29. atomisticparsers/gromacs/metainfo/__init__.py +19 -0
  30. atomisticparsers/gromacs/metainfo/gromacs.py +2388 -0
  31. atomisticparsers/gromacs/parser.py +1581 -0
  32. atomisticparsers/gromos/__init__.py +19 -0
  33. atomisticparsers/gromos/__main__.py +31 -0
  34. atomisticparsers/gromos/metainfo/__init__.py +19 -0
  35. atomisticparsers/gromos/metainfo/gromos.py +1995 -0
  36. atomisticparsers/gromos/parser.py +58 -0
  37. atomisticparsers/gulp/__init__.py +19 -0
  38. atomisticparsers/gulp/__main__.py +31 -0
  39. atomisticparsers/gulp/metainfo/__init__.py +19 -0
  40. atomisticparsers/gulp/metainfo/gulp.py +1117 -0
  41. atomisticparsers/gulp/parser.py +1316 -0
  42. atomisticparsers/h5md/__init__.py +19 -0
  43. atomisticparsers/h5md/__main__.py +31 -0
  44. atomisticparsers/h5md/metainfo/__init__.py +19 -0
  45. atomisticparsers/h5md/metainfo/h5md.py +239 -0
  46. atomisticparsers/h5md/parser.py +901 -0
  47. atomisticparsers/lammps/__init__.py +19 -0
  48. atomisticparsers/lammps/__main__.py +31 -0
  49. atomisticparsers/lammps/metainfo/__init__.py +19 -0
  50. atomisticparsers/lammps/metainfo/lammps.py +1417 -0
  51. atomisticparsers/lammps/parser.py +1753 -0
  52. atomisticparsers/libatoms/__init__.py +19 -0
  53. atomisticparsers/libatoms/__main__.py +31 -0
  54. atomisticparsers/libatoms/metainfo/__init__.py +19 -0
  55. atomisticparsers/libatoms/metainfo/lib_atoms.py +251 -0
  56. atomisticparsers/libatoms/parser.py +38 -0
  57. atomisticparsers/namd/__init__.py +19 -0
  58. atomisticparsers/namd/__main__.py +31 -0
  59. atomisticparsers/namd/metainfo/__init__.py +19 -0
  60. atomisticparsers/namd/metainfo/namd.py +1605 -0
  61. atomisticparsers/namd/parser.py +312 -0
  62. atomisticparsers/tinker/__init__.py +19 -0
  63. atomisticparsers/tinker/__main__.py +31 -0
  64. atomisticparsers/tinker/metainfo/__init__.py +18 -0
  65. atomisticparsers/tinker/metainfo/tinker.py +1363 -0
  66. atomisticparsers/tinker/parser.py +685 -0
  67. atomisticparsers/utils/__init__.py +22 -0
  68. atomisticparsers/utils/mdanalysis.py +662 -0
  69. atomisticparsers/utils/parsers.py +226 -0
  70. atomisticparsers/xtb/__init__.py +19 -0
  71. atomisticparsers/xtb/__main__.py +32 -0
  72. atomisticparsers/xtb/metainfo/__init__.py +19 -0
  73. atomisticparsers/xtb/metainfo/xtb.py +256 -0
  74. atomisticparsers/xtb/parser.py +979 -0
  75. nomad_parser_plugins_atomistic-1.0.dist-info/LICENSE +202 -0
  76. nomad_parser_plugins_atomistic-1.0.dist-info/METADATA +327 -0
  77. nomad_parser_plugins_atomistic-1.0.dist-info/RECORD +80 -0
  78. nomad_parser_plugins_atomistic-1.0.dist-info/WHEEL +5 -0
  79. nomad_parser_plugins_atomistic-1.0.dist-info/entry_points.txt +15 -0
  80. nomad_parser_plugins_atomistic-1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,226 @@
1
+ #
2
+ # Copyright The NOMAD Authors.
3
+ #
4
+ # This file is part of NOMAD.
5
+ # See https://nomad-lab.eu for further info.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ from typing import Any, Dict, List, Union
21
+ import numpy as np
22
+ from collections.abc import Iterable
23
+
24
+ from nomad.utils import get_logger
25
+ from nomad.metainfo import MSection, SubSection, Quantity
26
+ from nomad.parsing.file_parser import Parser
27
+ from runschema.run import Run
28
+ from runschema.system import System
29
+ from runschema.calculation import Calculation
30
+ from runschema.method import Interaction, Model
31
+ from simulationworkflowschema import MolecularDynamics
32
+
33
+
34
+ class MDParser(Parser):
35
+ def __init__(self, **kwargs) -> None:
36
+ self.info: Dict[str, Any] = {}
37
+ self.cum_max_atoms: int = 2500000
38
+ self.logger = get_logger(__name__)
39
+ self._trajectory_steps: List[int] = []
40
+ self._thermodynamics_steps: List[int] = []
41
+ self._trajectory_steps_sampled: List[int] = []
42
+ self._steps: List[int] = []
43
+ super().__init__(**kwargs)
44
+
45
+ @property
46
+ def steps(self) -> List[int]:
47
+ """
48
+ Returns the set of trajectory and thermodynamics steps.
49
+ """
50
+ if not self._steps:
51
+ self._steps = list(set(self.trajectory_steps + self.thermodynamics_steps))
52
+ self._steps.sort()
53
+ return self._steps
54
+
55
+ @property
56
+ def trajectory_steps(self) -> List[int]:
57
+ """
58
+ Returns the sampled trajectory steps.
59
+ """
60
+ if not self._trajectory_steps_sampled:
61
+ self._trajectory_steps_sampled = [
62
+ step
63
+ for n, step in enumerate(self._trajectory_steps)
64
+ if n % self.archive_sampling_rate == 0
65
+ ]
66
+ return self._trajectory_steps_sampled
67
+
68
+ @trajectory_steps.setter
69
+ def trajectory_steps(self, value: List[int]):
70
+ self._trajectory_steps = list(set(value))
71
+ self._trajectory_steps.sort()
72
+ self.info['n_frames'] = len(self._trajectory_steps)
73
+ self._trajectory_steps_sampled = []
74
+
75
+ @property
76
+ def thermodynamics_steps(self) -> List[int]:
77
+ """
78
+ Returns the thermodynamics steps.
79
+ """
80
+ # TODO is it necessary to sample thermodynamics steps
81
+ return self._thermodynamics_steps
82
+
83
+ @thermodynamics_steps.setter
84
+ def thermodynamics_steps(self, value: List[int]):
85
+ self._thermodynamics_steps = list(set(value))
86
+ self._thermodynamics_steps.sort()
87
+
88
+ @property
89
+ def n_atoms(self) -> int:
90
+ return np.amax(self.info.get('n_atoms', [0]))
91
+
92
+ @n_atoms.setter
93
+ def n_atoms(self, value: Union[Iterable, int]):
94
+ self.info['n_atoms'] = [value] if not isinstance(value, Iterable) else value
95
+
96
+ @property
97
+ def archive_sampling_rate(self) -> int:
98
+ """
99
+ Returns the sampling rate of saved thermodynamics data and trajectory.
100
+ """
101
+ if self.info.get('archive_sampling_rate') is None:
102
+ n_frames = self.info.get('n_frames', len(self._trajectory_steps))
103
+ n_atoms = np.amax(self.n_atoms)
104
+ if not n_atoms or not n_frames:
105
+ self.info['archive_sampling_rate'] = 1
106
+ else:
107
+ cum_atoms = n_atoms * n_frames
108
+ self.info['archive_sampling_rate'] = (
109
+ 1
110
+ if cum_atoms <= self.cum_max_atoms
111
+ else -(-cum_atoms // self.cum_max_atoms)
112
+ )
113
+ return self.info.get('archive_sampling_rate')
114
+
115
+ def parse(self, *args, **kwargs):
116
+ self.info = {}
117
+ self.trajectory_steps = []
118
+ self.thermodynamics_steps = []
119
+ self._steps = []
120
+ self._trajectory_steps_sampled = []
121
+ super().parse(*args, **kwargs)
122
+
123
+ def parse_trajectory_step(self, data: Dict[str, Any]) -> None:
124
+ """
125
+ Create a system section and write the provided data.
126
+ """
127
+ if self.archive is None:
128
+ return
129
+
130
+ if (step := data.get('step')) is not None and step not in self.trajectory_steps:
131
+ return
132
+
133
+ if self.archive.run:
134
+ sec_run = self.archive.run[-1]
135
+ else:
136
+ sec_run = Run()
137
+ self.archive.run.append(sec_run)
138
+
139
+ sec_system = System()
140
+ sec_run.system.append(sec_system)
141
+ self.parse_section(data, sec_system)
142
+
143
+ def parse_thermodynamics_step(self, data: Dict[str, Any]) -> None:
144
+ """
145
+ Create a calculation section and write the provided data.
146
+ """
147
+ if self.archive is None:
148
+ return
149
+
150
+ if (
151
+ step := data.get('step')
152
+ ) is not None and step not in self.thermodynamics_steps:
153
+ return
154
+
155
+ if self.archive.run:
156
+ sec_run = self.archive.run[-1]
157
+ else:
158
+ sec_run = Run()
159
+ self.archive.run.append(sec_run)
160
+ sec_calc = Calculation()
161
+ sec_run.calculation.append(sec_calc)
162
+
163
+ self.parse_section(data, sec_calc)
164
+ try:
165
+ system_ref_index = self.trajectory_steps.index(sec_calc.step)
166
+ sec_calc.system_ref = sec_run.system[system_ref_index]
167
+ except Exception:
168
+ pass
169
+
170
+ def parse_md_workflow(self, data: Dict[str, Any]) -> None:
171
+ """
172
+ Create an md workflow section and write the provided data.
173
+ """
174
+ if self.archive is None:
175
+ return
176
+
177
+ sec_workflow = MolecularDynamics()
178
+ self.parse_section(data, sec_workflow)
179
+ self.archive.workflow2 = sec_workflow
180
+
181
+ def parse_interactions(self, interactions: List[Dict], sec_model: MSection) -> None:
182
+ if not interactions:
183
+ return
184
+
185
+ def write_interaction_values(values):
186
+ sec_interaction = Interaction()
187
+ sec_model.contributions.append(sec_interaction)
188
+ sec_interaction.type = current_type
189
+ sec_interaction.n_atoms = max(
190
+ [len(v) for v in values.get('atom_indices', [[0]])]
191
+ )
192
+ for key, val in values.items():
193
+ quantity_def = sec_interaction.m_def.all_quantities.get(key)
194
+ if quantity_def:
195
+ try:
196
+ sec_interaction.m_set(quantity_def, val)
197
+ except Exception:
198
+ self.logger.error('Error setting metadata.', data={'key': key})
199
+
200
+ interactions.sort(key=lambda x: x.get('type'))
201
+ current_type = interactions[0].get('type')
202
+ interaction_values: Dict[str, Any] = {}
203
+ for interaction in interactions:
204
+ interaction_type = interaction.get('type')
205
+ if current_type and current_type != interaction_type:
206
+ write_interaction_values(interaction_values)
207
+ current_type = interaction_type
208
+ interaction_values = {}
209
+ interaction_values.setdefault('n_interactions', 0)
210
+ interaction_values['n_interactions'] += 1
211
+ for key, val in interaction.items():
212
+ if key == 'type':
213
+ continue
214
+ interaction_values.setdefault(key, [])
215
+ interaction_values[key].append(val)
216
+ if interaction_values:
217
+ write_interaction_values(interaction_values)
218
+
219
+ def parse_interactions_by_type(
220
+ self, interactions_by_type: List[Dict], sec_model: Model
221
+ ) -> None:
222
+ for interaction_type_dict in interactions_by_type:
223
+ sec_interaction = Interaction()
224
+ sec_model.contributions.append(sec_interaction)
225
+ self.parse_section(interaction_type_dict, sec_interaction)
226
+ # TODO Shift Gromacs and Lammps parsers to use this function as well if possible
@@ -0,0 +1,19 @@
1
+ #
2
+ # Copyright The NOMAD Authors.
3
+ #
4
+ # This file is part of NOMAD.
5
+ # See https://nomad-lab.eu for further info.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ from .parser import XTBParser
@@ -0,0 +1,32 @@
1
+ #
2
+ # Copyright The NOMAD Authors.
3
+ #
4
+ # This file is part of NOMAD. See https://nomad-lab.eu for further info.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ import sys
20
+ import json
21
+ import logging
22
+
23
+ from nomad.utils import configure_logging
24
+ from nomad.datamodel import EntryArchive
25
+ from atomisticparsers.xtb import XTBParser
26
+
27
+
28
+ if __name__ == '__main__':
29
+ configure_logging(console_log_level=logging.DEBUG)
30
+ archive = EntryArchive()
31
+ XTBParser().parse(sys.argv[1], archive, logging)
32
+ json.dump(archive.m_to_dict(), sys.stdout, indent=2)
@@ -0,0 +1,19 @@
1
+ #
2
+ # Copyright The NOMAD Authors.
3
+ #
4
+ # This file is part of NOMAD.
5
+ # See https://nomad-lab.eu for further info.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ from . import xtb
@@ -0,0 +1,256 @@
1
+ #
2
+ # Copyright The NOMAD Authors.
3
+ #
4
+ # This file is part of NOMAD.
5
+ # See https://nomad-lab.eu for further info.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ import numpy as np # pylint: disable=unused-import
20
+
21
+ from nomad.metainfo import ( # pylint: disable=unused-import
22
+ Package,
23
+ Quantity,
24
+ Section,
25
+ SubSection,
26
+ JSON,
27
+ )
28
+ import runschema.run # pylint: disable=unused-import
29
+ import runschema.calculation # pylint: disable=unused-import
30
+ import runschema.method # pylint: disable=unused-import
31
+ import runschema.system # pylint: disable=unused-import
32
+ import simulationworkflowschema
33
+
34
+
35
+ m_package = Package()
36
+
37
+
38
+ class Run(runschema.method.Method):
39
+ m_def = Section(validate=False, extends_base_section=True)
40
+
41
+ x_xtb_calculation_setup = Quantity(
42
+ type=JSON,
43
+ shape=[],
44
+ description="""
45
+ """,
46
+ )
47
+
48
+
49
+ class TB(runschema.method.TB):
50
+ m_def = Section(validate=False, extends_base_section=True)
51
+
52
+ x_xtb_setup = Quantity(
53
+ type=JSON,
54
+ shape=[],
55
+ description="""
56
+ """,
57
+ )
58
+
59
+
60
+ class Energy(runschema.calculation.Energy):
61
+ m_def = Section(validate=False, extends_base_section=True)
62
+
63
+ x_xtb_scc = SubSection(sub_section=runschema.calculation.EnergyEntry.m_def)
64
+
65
+ x_xtb_isotropic_es = SubSection(sub_section=runschema.calculation.EnergyEntry.m_def)
66
+
67
+ x_xtb_anisotropic_es = SubSection(
68
+ sub_section=runschema.calculation.EnergyEntry.m_def
69
+ )
70
+
71
+ x_xtb_anistropic_xc = SubSection(
72
+ sub_section=runschema.calculation.EnergyEntry.m_def
73
+ )
74
+
75
+ x_xtb_dispersion = SubSection(sub_section=runschema.calculation.EnergyEntry.m_def)
76
+
77
+ x_xtb_repulsion = SubSection(sub_section=runschema.calculation.EnergyEntry.m_def)
78
+
79
+ x_xtb_halogen_bond_corr = SubSection(
80
+ sub_section=runschema.calculation.EnergyEntry.m_def
81
+ )
82
+
83
+ x_xtb_add_restraining = SubSection(
84
+ sub_section=runschema.calculation.EnergyEntry.m_def
85
+ )
86
+
87
+
88
+ class MultipolesEntry(runschema.calculation.MultipolesEntry):
89
+ m_def = Section(validate=False, extends_base_section=True)
90
+
91
+ x_xtb_q_only = Quantity(
92
+ type=np.float64,
93
+ shape=['n_multipoles'],
94
+ description="""
95
+ """,
96
+ )
97
+
98
+ x_xtb_q_plus_dip = Quantity(
99
+ type=np.float64,
100
+ shape=['n_multipoles'],
101
+ description="""
102
+ """,
103
+ )
104
+
105
+
106
+ class GeometryOptimization(simulationworkflowschema.GeometryOptimization):
107
+ m_def = Section(validate=False, extends_base_section=True)
108
+
109
+ x_xtb_optimization_level = Quantity(
110
+ type=str,
111
+ shape=[],
112
+ description="""
113
+ """,
114
+ )
115
+
116
+ x_xtb_max_opt_cycles = Quantity(
117
+ type=np.int32,
118
+ shape=[],
119
+ description="""
120
+ """,
121
+ )
122
+
123
+ x_xtb_anc_micro_cycles = Quantity(
124
+ type=np.int32,
125
+ shape=[],
126
+ description="""
127
+ """,
128
+ )
129
+
130
+ x_xtb_n_degrees_freedom = Quantity(
131
+ type=np.int32,
132
+ shape=[],
133
+ description="""
134
+ """,
135
+ )
136
+
137
+ x_xtb_rf_solver = Quantity(
138
+ type=str,
139
+ shape=[],
140
+ description="""
141
+ """,
142
+ )
143
+
144
+ x_xtb_linear = Quantity(
145
+ type=str,
146
+ shape=[],
147
+ description="""
148
+ """,
149
+ )
150
+
151
+ x_xtb_hlow = Quantity(
152
+ type=np.float64,
153
+ shape=[],
154
+ description="""
155
+ """,
156
+ )
157
+
158
+ x_xtb_hmax = Quantity(
159
+ type=np.float64,
160
+ shape=[],
161
+ description="""
162
+ """,
163
+ )
164
+
165
+ x_xtb_s6 = Quantity(
166
+ type=np.float64,
167
+ shape=[],
168
+ description="""
169
+ """,
170
+ )
171
+
172
+
173
+ class MolecularDynamics(simulationworkflowschema.MolecularDynamics):
174
+ m_def = Section(validate=False, extends_base_section=True)
175
+
176
+ x_xtb_md_time = Quantity(
177
+ type=np.float64,
178
+ shape=[],
179
+ unit='s',
180
+ description="""
181
+ """,
182
+ )
183
+
184
+ x_xtb_scc_accuracy = Quantity(
185
+ type=np.float64,
186
+ shape=[],
187
+ description="""
188
+ """,
189
+ )
190
+
191
+ x_xtb_temperature = Quantity(
192
+ type=np.float64,
193
+ shape=[],
194
+ unit='K',
195
+ description="""
196
+ """,
197
+ )
198
+
199
+ x_xtb_max_steps = Quantity(
200
+ type=np.int32,
201
+ shape=[],
202
+ description="""
203
+ """,
204
+ )
205
+
206
+ x_xtb_max_block_length = Quantity(
207
+ type=np.int32,
208
+ shape=[],
209
+ description="""
210
+ """,
211
+ )
212
+
213
+ x_xtb_dumpstep_trj = Quantity(
214
+ type=np.float64,
215
+ shape=[],
216
+ unit='s',
217
+ description="""
218
+ """,
219
+ )
220
+
221
+ x_xtb_dumpstep_coords = Quantity(
222
+ type=np.float64,
223
+ shape=[],
224
+ unit='s',
225
+ description="""
226
+ """,
227
+ )
228
+
229
+ x_xtb_h_atoms_mass = Quantity(
230
+ type=np.float64,
231
+ shape=[],
232
+ unit='kg',
233
+ description="""
234
+ """,
235
+ )
236
+
237
+ x_xtb_n_degrees_freedom = Quantity(
238
+ type=np.int32,
239
+ shape=[],
240
+ description="""
241
+ """,
242
+ )
243
+
244
+ x_xtb_shake_bonds = Quantity(
245
+ type=np.int32,
246
+ shape=[],
247
+ description="""
248
+ """,
249
+ )
250
+
251
+ x_xtb_berendsen = Quantity(
252
+ type=bool,
253
+ shape=[],
254
+ description="""
255
+ """,
256
+ )