Source code for schrodinger.application.desmond.packages.viparr1.viparr.viparr_util

#!/bin/env python

import os
import six
import sys
from time import ctime

from .version import viparr_version


[docs]def ffio_add_header(ffio_ff, ffio_name, info): ffio_ff.viparr_version = viparr_version ffio_ff.ffio_name = ffio_name ffio_ff.ffio_version = '1.0.0' ffio_ff.viparr_workdir = os.getcwd() ffio_ff.viparr_command = ' '.join(sys.argv) ffio_ff.date = 'date: %s' % ctime() ffio_ff.user = 'user: %s' % os.getenv('USER') # add a block for ffio information: b = ffio_ff.__new_array__('viparr_info', len(info)) for i, v in enumerate(info): b[i + 1].viparr_section = v[0] b[i + 1].viparr_info = v[1]
[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 item in nlist: item.sort() return nlist