Source code for scm.conformers.plams.plot

import scm.plams
from scm.conformers.plams.interface import ConformersJob
import matplotlib.pyplot as plt
import numpy as np


def get_main_results(job: ConformersJob, temperature=298, unit="kcal/mol", return_molecules: bool = True):
    molecules = None
    if return_molecules:
        molecules = job.results.get_conformers()
    energies = job.results.get_relative_energies(unit)
    populations = job.results.get_boltzmann_distribution(temperature)

    return molecules, energies, populations


[docs]def plot_conformers(job: ConformersJob, indices=None, temperature=298, unit="kcal/mol", lowest=True): """ Function for plotting conformers in a Jupyter notebook job: ConformersJob Finished ConformersJob indices: None, int or list of int If None, will plot at most 3 conformers. If int, will plot at most the given number of conformers. If list of int (zero-based indices), plot those conformers. temperature: float Temperature for relative population (printed above the figure). unit: str Unit for relative energies (printed above the figure) lowest: bool Only used if ``indices`` is an integer. If True, plot the N lowest energy conformers. If False, plot conformers evenly distributed from the most stable to the least stable. """ molecules, energies, populations = get_main_results(job, unit=unit) if isinstance(indices, int): N_plot = min(indices, len(energies)) if lowest: indices = list(range(N_plot)) else: indices = np.linspace(0, len(energies) - 1, N_plot, dtype=np.int32) if indices is None: indices = list(range(min(3, len(energies)))) fig, axes = plt.subplots(1, len(indices), figsize=(12, 3)) if len(indices) == 1: axes = [axes] for ax, i in zip(axes, indices): mol = molecules[i] E = energies[i] population = populations[i] scm.plams.plot_molecule(mol, ax=ax) ax.set_title(f"#{i+1}\nΔE = {E:.2f} {unit}\nPop.: {population:.3f} (T = {temperature} K)") return axes