Source code for ipsuite.analysis.md

import pathlib

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import zntrack

from ipsuite import base
from ipsuite.dynamics import ASEMD
from ipsuite.utils.ase_sim import get_density_from_atoms


[docs] class AnalyseDensity(base.AnalyseAtoms): window: int = zntrack.params(1000) start: int = zntrack.params(0) end: int = zntrack.params(None) density: dict = zntrack.metrics() results: pd.DataFrame = zntrack.plots() figure: pathlib.Path = zntrack.plots_path(zntrack.nwd / "density.png")
[docs] def run(self): densities = [get_density_from_atoms(x) for x in self.data] fig, ax = plt.subplots() ax.plot(densities) ax.plot(np.convolve(densities, np.ones(self.window) / self.window, mode="valid")) ax.set_ylabel(r"Density $\rho$ / kg $\cdot$ m$^{-3}$") ax.set_xlabel("Step") fig.tight_layout() fig.savefig(self.figure) plt.close() self.density = { "density": np.mean(densities[self.start : self.end]), "std": np.std(densities[self.start : self.end]), } self.results = pd.DataFrame(densities, columns=["density"])
[docs] class CollectMDSteps(base.IPSNode): mds: list[ASEMD] = zntrack.deps() metrics: dict = zntrack.metrics()
[docs] def run(self): steps: list[int] = [x.steps_before_stopping for x in self.mds] self.metrics = { "total": int(np.sum(steps)), "mean": float(np.mean(steps)), "std": float(np.std(steps)), "max": int(np.max(steps)), "min": int(np.min(steps)), }