The Trajectory Model

In addition to atomic structures and calculations, the asedb library provides a Trajectory model for representing sequences of atomic structures, typically used to represent simulation trajectories or a series of states in a calculation.

Model Overview

The Trajectory model stores a collection of atomic structures (AtomsModel instances) as a sequence. This model facilitates the organization and retrieval of atomic configurations that are related as a time series or a progression of states.

The relationship between Trajectory and AtomsModel is many-to-many, represented by the atoms_trajectory_mapping table.

Note

An AtomsModel may be owned by a Trajectory, so if an AtomsModel is removed from the atoms_list property and comitted to the database, this atoms object may be lost.

Using the Trajectory Model

Creating a new trajectory involves adding AtomsModel instances to the atoms_list attribute of a Trajectory instance. Here’s an example of how to create a trajectory, add atomic structures to it, and retrieve the structures as ASE Atoms objects:

from ase import Atoms
from asedb import Trajectory
from sqlalchemy.orm import Session

session = Session()

# Create a new Trajectory instance
trajectory = Trajectory(project='My Simulation Project')

# Add atomic structures to the trajectory
atoms1 = Atoms('H2', positions=[[0, 0, 0], [0, 0, 1]])
atoms2 = Atoms('H2O', positions=[[0, 0, 0], [0, 0, 1], [1, 0, 0]])
trajectory.add_atoms(atoms1)
trajectory.add_atoms(atoms2)

session.add(trajectory)
session.commit()

# Retrieve the trajectory and its atomic structures
retrieved_trajectory = session.query(Trajectory).first()
atoms_list = retrieved_trajectory.to_atoms_list()
for atoms in atoms_list:
    print(atoms)

The add_atoms method accepts an ASE Atoms object, converts it to an AtomsModel, and adds it to the trajectory. The to_atoms_list method converts the stored AtomsModel instances back into a list of ASE Atoms objects.