buildingblocks_example¶
This notebook imports the fundamental objects of the streamm.buildingblocks module and goes through the functionality of each
import streamm.structures.buildingblock as bb
import math
from pathlib2 import Path
import os
Create a Buildingblock object with tag methane
mol_i = bb.Buildingblock('methane')
print(mol_i.print_properties())
If methane.xyz is not around run the structures example
need_files = ['methane.xyz']
for f in need_files:
path = Path(f)
if not path.is_file():
print("Need to run structures_example.ipynb")
os.system("jupyter nbconvert --to python structures_example.ipynb")
os.system("python structures_example.py")
mol_i.read_xyz()
mol_i.bonded_nblist = mol_i.guess_nblist(0,radii_buffer=1.25)
Check that all the particles have been read in
print(mol_i.n_particles)
Check that the neighbor list was set correctly
print(mol_i.bonded_nblist)
Looks good, you should have the geometry of a methane molecule with a C-H bond length of 1.2 Angstroms
We want to use the functionality of the buildingblock object to join two methanes together to create alkyl chains of any length
So let’s set two of the hydrogens to be reactive sites (rsites).
You can view the numerical order of the atoms in Avogadro by setting the label to “atom number,” however, Avogadro labels atoms from 1 to N, while streamm uses 0 to N-1
We will choose the first two hydrogens and set their rsite variable to ‘RH’. It does not matter what this identifier is, as long as the same identifier is passed to the attach() function later. Also, if the identifiers are not unique, the order in which it appears in the particles list will also be used.
mol_i.particles[1].rsite = 'RH'
mol_i.particles[2].rsite = 'RH'
Now use the find_rsites() function to create the dictionary of lists to be used by the attach() function
mol_i.find_rsites()
print(mol_i.show_rsites())
Pass the molecule to the attach function and set the rsite id’s and the list positions of the rsites
mol_j = bb.attach(mol_i,mol_i,'RH',0,'RH',1,tag='ethane')
Write the .xyz to file to be viewed with a molecular viewer.
mol_j.write_xyz()
While the ethane molecule was generated, the hydrogens are eclipsed rather than staggered.
We can avoid this by using the prepattach() function to orient the molecule and remove the reactive site
mol_k = mol_i.prepattach('RH',0,dir=-1,yangle=90.0)
Then apply a shift to set the bond length
CC_bl = mol_i.particles[0].bonded_radius*2.0
mol_k.shift_pos([CC_bl,0.0,0.0])
Then apply a rotation to set the conformation to staggered. Use a 180.0 degree rotation to place the reactive site in the correct orientation for subsequent attachments.
angle_rad = 180.0*math.pi/180.0
mol_k.rotate_yz(angle_rad)
mol_l = mol_i.prepattach('RH',1,dir=1)
mol_m = bb.attachprep(mol_k,mol_l)
mol_m.tag = 'ethane'
for pk,p in mol_m.particles.items():
print(pk,p)
print(mol_m.bonded_nblist.list)
print(mol_m.bonded_nblist.index)
mol_m.write_xyz()
print(mol_m.show_rsites())
mol_m.bonded_bonds()
mol_m.bonded_angles()
mol_m.bonded_dih()
mol_json = mol_m.export_json()
Attachments can also be done in a loop
# Number of ethanes to add to get a dodecyl
# SWS: should this be 'floor', 'round', or 'ceiling' ???
alkly_n = math.floor((12-1)/2)
print(alkly_n)
mol_n = mol_m
mol_n.find_rsites()
print(mol_n.show_rsites())
for i in range(alkly_n):
mol_n = bb.attach(mol_n,mol_m,'RH',1,'RH',0)
mol_n.tag = 'dodecyl'
mol_n.write_xyz()