Fragment Conversion

A tutorial page written by Thomas John and Rowan Hanson at Cardiff University, with thanks to the Nuffield Foundation and CCP5.

Overview

The Atomic Simulation Environment (ASE) is a popular tool for setting up materials simulations. ChemShell reads and writes chemical data files using the Fragment object, whereas ASE reads and writes using the Atoms object; thus, a tool has been written that interconvert ChemShell Fragments with the ASE atoms format, allowing structural manipulation in ASE prior to ChemShell use, and for access to additional I/O tools in ASE for saving results.

This page will show you how to convert to Fragment from Atoms and back by using a .cif file as the example.

Convert Fragment to Atoms

A Fragment object can be defined and converted into an Atoms object. Some of ASE’s method will then be used on the Atoms object. First, we must import ChemShell and create a Fragment of an N_2 molecule:

from chemsh import *
nitrogenMolecule = Fragment(znums=[7, 7], coords=[[0, 0, 0], [2.0787, 0, 0]])

Next, we import the io.tools from ChemShell. These are used to call the convert_frag_to_atoms function, passing the Fragment object as an argument. The output of the conversion is an ASE Atoms object, and can be visualised by importing the view function from ASE

from chemsh.io.tools import *
from ase.visualize import view
atomsObject = convert_frag_to_atoms(nitrogenMolecule)
view(atomsObject)

The kinetic and potential energies of the system can be calculated using calculators built into ASE, such as EMT:

from ase.calculators.emt import EMT
print("\nKinetic Energy: " + str(atomsObject.get_kinetic_energy()))
print("\nPotential Energy: " + str(atomsObject.get_potential_energy()))

Note

Other methods found in ASE can also be used to manipulate the created Atoms object. Charges associated with the Fragment are lost on conversion into the ASE object

Convert Atoms to Fragment

Simiar to above, an Atoms object can be defined and converted to a Fragment object. To begin, we import the Atoms object from ASE and define a molecule:

from ase.atoms import Atoms
nitrogenMolecule = Atoms("N2", positions=[[0, 0, 0], [1.1, 0, 0]])

Next, we import ChemShell and the io.tools. This allows a call to the convert_atoms_to_fragment function, passing the Atoms object and its connectivity mode (connect_mode) as arguments; connect_mode can be set as either "ionic" or "covalent".

fragmentObject = convert_atoms_to_frag(nitrogenMolecule)

Performing such an approach with a more native crystal formats, such as "cif", can allow easy cluster construction and energy calculations from popular formats, and transformation back for model review

from ase.io import read
fragmentObject = convert_atoms_to_frag(read("mgo.cif"))
fragmentObject.addCharges({"Mg":2.0, "O":-2.0})
cluster = fragmentObject.construct_cluster(origin_atom=0, radius_cluster=20.0, radius_active=10.0, bq_margin=7.0, bq_density=3, adjust_charge='coordination_scaled')
clusterToAtoms = convert_frag_to_atoms(cluster)
view(clusterToAtoms)