smamp.extract_bader_charges
module
- Extract atomic charges from Bader Charge Analysis output.
- Copyright 2019 Simulation Lab
- University of Freiburg
- Author:
Modified
:Lukas
Elflein
elfleinl@cs.uni-freiburg.de
Source code
""" Extract atomic charges from Bader Charge Analysis output.
Copyright 2019 Simulation Lab
University of Freiburg
Author:
Modified: Lukas Elflein <elfleinl@cs.uni-freiburg.de>
"""
import ase
from parmed import gromacs
import numpy as np
from smamp.insertHbyList import insertHbyList
import warnings
def extract(snapshot_path='snapshot.pdb', top_path='example.top', bader_path='ACF.dat',
out_path='bader_charges.csv'):
""" Execute everything."""
# Read the atomic structure
ase_struct = ase.io.read(snapshot_path)
# Read the toplogy
with warnings.catch_warnings(): # supress warnings
warnings.simplefilter("ignore")
pmd_top = gromacs.GromacsTopologyFile(top_path, parametrize=False)
implicitHbondingPartners={'CD4':1,'CD3':1,'CA2':2,'CA3':2,'CB2':2,'CB3':2}
new_ase_struct, new_pmd_top, names, residues = insertHbyList(ase_struct, pmd_top,
implicitHbondingPartners)
atomic_number = new_ase_struct.get_atomic_numbers()
bader_charges = np.genfromtxt(bader_path,skip_header=2,skip_footer=4,usecols=4)
atomic_charges = atomic_number - bader_charges # this inverts the sign of the bader charges
results =[]
for i in range(127):
results.append((names[i], residues[i], atomic_charges[i],
atomic_number[i],bader_charges[i]))
# find the summed charges of carbon atoms and corresponding H atoms
list_of_C_atoms = ['CD3', 'CD4', 'CA2', 'CA3', 'CB2', 'CB3']
atom_res_totq = [] # list of [C-atom, residue, total_charge]
nra = np.array([names,residues,atomic_charges])
total_charge_results = np.array(results)[:,:4]
total_charge_results[:,3] = total_charge_results[:,2]
terminal_names = np.unique(nra[1])
for term in terminal_names:
residue = np.where(nra[1] == str(term))
# print(residue)
nra_for_one_residue = nra[:,residue[0]]
# find all carbon atoms and the belonging H atoms
for c_atom in list_of_C_atoms:
C_H_positions = np.flatnonzero(np.core.defchararray.find(
nra_for_one_residue[0], str(c_atom))!=-1)
C_H_atoms = nra_for_one_residue[:, C_H_positions]
total_charge = (C_H_atoms[2]).astype(np.float).sum()
atom_res_totq.append([c_atom, term, total_charge])
#overwrite the charge of list_of_C_atoms in results with total_charge
res_position = np.where((total_charge_results[:,0]==c_atom)
& (total_charge_results[:,1]==term))
#print(res_position+(2,))
total_charge_results[res_position+(3,)] = total_charge
with open(out_path, 'w') as f:
f.write("atom,\t residue,\t q"+ '\n')
for line in total_charge_results:
f.write(', \t '.join(line[:-1])+'\n')
def main():
extract()
if __name__ == '__main__':
main()
Functions
def extract(snapshot_path='snapshot.pdb', top_path='example.top', bader_path='ACF.dat', out_path='bader_charges.csv')
-
Execute everything.
Source code
def extract(snapshot_path='snapshot.pdb', top_path='example.top', bader_path='ACF.dat', out_path='bader_charges.csv'): """ Execute everything.""" # Read the atomic structure ase_struct = ase.io.read(snapshot_path) # Read the toplogy with warnings.catch_warnings(): # supress warnings warnings.simplefilter("ignore") pmd_top = gromacs.GromacsTopologyFile(top_path, parametrize=False) implicitHbondingPartners={'CD4':1,'CD3':1,'CA2':2,'CA3':2,'CB2':2,'CB3':2} new_ase_struct, new_pmd_top, names, residues = insertHbyList(ase_struct, pmd_top, implicitHbondingPartners) atomic_number = new_ase_struct.get_atomic_numbers() bader_charges = np.genfromtxt(bader_path,skip_header=2,skip_footer=4,usecols=4) atomic_charges = atomic_number - bader_charges # this inverts the sign of the bader charges results =[] for i in range(127): results.append((names[i], residues[i], atomic_charges[i], atomic_number[i],bader_charges[i])) # find the summed charges of carbon atoms and corresponding H atoms list_of_C_atoms = ['CD3', 'CD4', 'CA2', 'CA3', 'CB2', 'CB3'] atom_res_totq = [] # list of [C-atom, residue, total_charge] nra = np.array([names,residues,atomic_charges]) total_charge_results = np.array(results)[:,:4] total_charge_results[:,3] = total_charge_results[:,2] terminal_names = np.unique(nra[1]) for term in terminal_names: residue = np.where(nra[1] == str(term)) # print(residue) nra_for_one_residue = nra[:,residue[0]] # find all carbon atoms and the belonging H atoms for c_atom in list_of_C_atoms: C_H_positions = np.flatnonzero(np.core.defchararray.find( nra_for_one_residue[0], str(c_atom))!=-1) C_H_atoms = nra_for_one_residue[:, C_H_positions] total_charge = (C_H_atoms[2]).astype(np.float).sum() atom_res_totq.append([c_atom, term, total_charge]) #overwrite the charge of list_of_C_atoms in results with total_charge res_position = np.where((total_charge_results[:,0]==c_atom) & (total_charge_results[:,1]==term)) #print(res_position+(2,)) total_charge_results[res_position+(3,)] = total_charge with open(out_path, 'w') as f: f.write("atom,\t residue,\t q"+ '\n') for line in total_charge_results: f.write(', \t '.join(line[:-1])+'\n')
def main()
-
Source code
def main(): extract()