#!/bin/env python
import os
import six
import sys
from time import ctime
from .version import viparr_version
[docs]def ffio_add_block(ffio_ff, ffio_name, block):
'''ffio_name = name of block, e.g., ffio_pairs
block = [ [[x, x], x, [x, x]], ... ]
'''
# prevent outputing an empty block
if len(block) == 0:
return
anames = [
'ffio_ai', 'ffio_aj', 'ffio_ak', 'ffio_al', 'ffio_am', 'ffio_an',
'ffio_ao', 'ffio_ap'
]
cnames = [
'ffio_c1', 'ffio_c2', 'ffio_c3', 'ffio_c4', 'ffio_c5', 'ffio_c6',
'ffio_c7', 'ffio_c8', 'ffio_c9'
]
# special handling for stupid cases in mae file
if ffio_name == 'ffio_dihedrals':
cnames.insert(0, 'ffio_c0')
if ffio_name == 'ffio_vdwtypes':
anames = ['ffio_name']
if ffio_name == 'ffio_virtuals':
cnames.insert(0, 'ffio_index')
if ffio_name == 'ffio_polarizable':
cnames.insert(0, 'ffio_index')
#assert not hasattr(ffio_ff, ffio_name)
assert not ffio_ff.__contains__(ffio_name)
#print 'number of existing rows in <%s>: %d' % (ffio_name, n)
n = 0 # number of existing rows
a = ffio_ff.__new_array__(ffio_name, len(block))
for i in range(len(block)):
[avals, funcform, cvals] = block[i]
assert len(avals) <= len(anames) # need this because of zip
assert len(cvals) <= len(cnames) # need this because of zip
row = a[i + 1 + n]
for name, value in zip(anames, avals):
setattr(row, name, value)
if funcform != None:
#row.ffio_funct = funcform
setattr(row, 'ffio_funct', funcform) # not okay if funcform is None
if (len(cvals) > 0 and isinstance(cvals[-1], six.string_types)):
for name, value in zip(cnames, cvals[:-1]):
setattr(row, name, value)
setattr(row, 'ffio_comment', cvals[-1])
else:
for name, value in zip(cnames, cvals):
setattr(row, name, value)
[docs]def ffio_add_atoms_block(ffio_ff, block):
a = ffio_ff.__new_array__('ffio_sites', len(block))
for i, dummyfunc, row in block:
i = i[0]
a[i + 1].ffio_type = row[0]
a[i + 1].ffio_resnr = row[1]
a[i + 1].ffio_residue = row[2]
a[i + 1].ffio_charge = row[3]
a[i + 1].ffio_mass = row[4]
a[i + 1].ffio_vdwtype = row[5]
[docs]def ffio_add_pseudo_block(ffio_ff, pseudo_list):
# count number of entries
count = 0
for r in pseudo_list:
count = count + len(r)
print('Number of pseudo particles:', count)
a = ffio_ff.__new_array__('ffio_pseudo', count)
i = 1
for r in pseudo_list:
for b in r:
a[i].ffio_x_coord = b.x
a[i].ffio_y_coord = b.y
a[i].ffio_z_coord = b.z
a[i].ffio_residue_number = b.resnum
a[i].ffio_chain_name = b.chain
a[i].ffio_pdb_residue_name = b.pdbres
a[i].ffio_atom_name = b.pdbname
if hasattr(b, 'grp_thermostat'):
a[i].ffio_grp_thermostat = b.grp_thermostat
if hasattr(b, 'grp_energy'):
a[i].ffio_grp_energy = b.grp_energy
i = i + 1
[docs]def CtAtoms(ct):
class Atom(object):
pass
# construct residue numbers while looping over all atoms
d = dict()
k = 1
atoms = list()
for ctatom in ct.m_atom:
try:
chain_name = ctatom.m_chain_name
except: # noqa: E722
chain_name = " "
if ctatom.__contains__('m_pdb_segment_name'):
chain_name += '_SEG_'
if ctatom.m_pdb_segment_name is not None:
chain_name += ctatom.m_pdb_segment_name
if ctatom.__contains__('m_insertion_code'):
chain_name += '_INS_'
if ctatom.m_insertion_code is not None:
chain_name += ctatom.m_insertion_code
key = (chain_name, ctatom.m_residue_number)
if key not in d:
d[key] = k
k = k + 1
a = Atom()
try:
a.pdbname = ctatom.m_pdb_atom_name.strip()
except AttributeError:
a.pdbname = None
try:
a.pdbres = ctatom.m_pdb_residue_name.strip()
except AttributeError:
a.pdbres = None
a.resnum = d[(chain_name, ctatom.m_residue_number)]
a.atomicnum = ctatom.m_atomic_number
a.x = ctatom.m_x_coord
a.y = ctatom.m_y_coord
a.z = ctatom.m_z_coord
a.chain = chain_name
a.resnum_orig = ctatom.m_residue_number
# Copy in tgrp info... This maybe should be extended to clone all ffio_grp_*
if ctatom.__contains__('ffio_grp_thermostat'):
a.grp_thermostat = ctatom.ffio_grp_thermostat
if ctatom.__contains__('ffio_grp_energy'):
a.grp_energy = ctatom.ffio_grp_energy
atoms.append(a)
return atoms
[docs]def CtBonds(ct):
nlist = [[] for i in range(len(ct.m_atom))]
if not ct.__contains__('m_bond'):
return nlist
for b in ct.m_bond:
nlist[b.m_from - 1].append(b.m_to)
# check that we have backward edges
if len(ct.m_bond) > 0:
b = ct.m_bond[1] # these arrays are 1-based
if b.m_from not in nlist[b.m_to - 1]:
print('Warning: Missing backward edges...adding them now')
for b in ct.m_bond:
nlist[b.m_to - 1].append(b.m_from)
# sort each list
for l in nlist:
l.sort()
return nlist