I am trying to understand whether there is a built-in aiida function that exports TrajectoryData info to XYZ format (or similar). By far, I haven’t found much. Any idea or pointer, or shall one write a custom function?
Thanks a lot!
I see two options:
TrajectoryData.get_positions()
together withTrajectoryData.symbols
gives you all information and then you format it manuallyTrajectoryData.get_structure()
to get aStructureData
which comes with_prepare_xyz
to return it in XYZ format.
Think latter is easier as you don’t reimplement formatting yourself, but not sure about performance of having to go to StructureData
as intermediate.
1 Like
Thanks Sebastian!
Since I needed energy, forces, and stresse for training such data, I found this solution:
from qe_tools import CONSTANTS as C
from ase.io import write
from ase import units
from ase.calculators.singlepoint import SinglePointCalculator
filename = './dataset.xyz'
stress_units = (-1 * units.Ry / units.Bohr**3)/(C.ry_si / C.bohr_si**3 / 10**9) # convention as in ASE (sign and eV/Ang^3)
index = 0
atoms = traj.get_step_structure(index).get_ase()
energy = traj.get_array('energy')[index]
s = traj.get_array('stress')[index]
calc = SinglePointCalculator(atoms)
calc.results = {
'energy': energy,
'free_energy': energy,
'forces': traj.get_array('forces')[index],
'stress': stress_units*np.array([s[0,0],s[1,1],s[2,2],s[1,2],s[0,2],s[0,1]]),
}
atoms.calc = calc
write(filename, atoms, format='extxyz', append=True)
I think one can also collect in a single calculator more than one “Atoms”, and then write it once instead of looping each index. Happy to receive suggestions here on how to optimize (:
I struggled with this as well, and in the end used the get_step_structure
. It might be nice if TrajectoryData
had the get_ase()
method similarly to StructureData
.
Another quality-of-life improvement would be if verdi data core.trajectory export
supported the extended XYZ format.