Files
PlantAI-dev/tools/pymol-open-source/modules/chempy/fast/__init__.py
T
2026-08-03 18:42:47 +08:00

179 lines
4.9 KiB
Python

import chempy
import copy
from chempy.models import Indexed
from Numeric import *
from Precision import *
class FastModel:
#------------------------------------------------------------------------------
def __init__(self):
self.reset()
#------------------------------------------------------------------------------
def reset(self):
self.nAtom = 0
self.molecule = chempy.Molecule()
self.txta = None
self.inta = None
self.flta = None
self.crda = None
self.bnda = None
#------------------------------------------------------------------------------
def from_indexed(self,model):
self.reset()
self.nAtom = model.nAtom
self.nBond = model.nBond
self.molecule = copy.deepcopy(model.molecule)
self.txta = resize(array(' ','c'),(self.nAtom,as_width))
self.inta = zeros((self.nAtom,ai_width),Int32)
self.flta = zeros((self.nAtom,af_width),Float)
self.bnda = zeros((self.nBond,bi_width),Int32)
self.crda = zeros((self.nAtom,3),Float)
c = 0
for a in model.atom:
txt = "%-4s%-2s%-1s%-4s%-1s%-4s%-1s%-4s%-20s" % \
(a.name[0:4],a.symbol[0:2],a.alt[0:1],a.resn[0:4],
a.resn_code[0:1],a.resi[0:4],a.chain[0:1],
a.segi[0:4],a.text_type[0:20])
self.txta[c] = txt
self.inta[c] = [ a.resi_number, a.hetatm, a.formal_charge,
a.flags, a.color_code, a.stereo, a.numeric_type ]
self.flta[c] = [ a.b, a.q, a.partial_charge, a.vdw ]
self.crda[c] = [ a.coord[0], a.coord[1], a.coord[2] ]
c = c + 1
c = 0
for b in model.bond:
self.bnda[c] = [ b.index[0], b.index[1], b.order, b.stereo ]
c = c + 1
#------------------------------------------------------------------------------
def convert_to_indexed(self):
model = Indexed()
model.molecule = copy.deepcopy(self.molecule)
for c in range(self.nAtom):
at = chempy.Atom()
txta = self.txta[c]
for attrib in ( 'name', 'symbol', 'resn', 'resn_code', 'resi',
'alt', 'chain', 'segi', 'text_type' ):
ll = as_[attrib]
setattr(at,attrib,''.join(txta[ll[0]:ll[1]]).strip())
inta = self.inta[c]
for attrib in ( 'resi_number', 'hetatm', 'formal_charge','flags',
'color_code', 'stereo', 'numeric_type' ):
setattr(at,attrib,inta[ai[attrib]])
flta = self.flta[c]
for attrib in ( 'b', 'q', 'partial_charge' ) :
setattr(at,attrib,flta[af[attrib]])
crda = self.crda[c]
at.coord = [crda[0],crda[1],crda[2]]
# probably need to add some checking here to eliminate values
# which come back as defaults
model.atom.append(at)
for c in range(self.nBond):
bnd = chempy.Bond()
bnda = self.bnda[c]
bnd.index = [bnda[bi_index0],bnda[bi_index1]]
bnd.order = bnda[bi_order]
bnd.stereo = bnda[bi_stereo]
model.bond.append(bnd)
return model
#------------------------------------------------------------------------------
# text properties
as_ = {}
as_width = 0
as_['name'] = [ as_width ]
as_width = as_width + 4
as_['name'].append(as_width)
as_['symbol'] = [ as_width ]
as_width = as_width + 2
as_['symbol'].append(as_width)
as_['alt'] = [ as_width ]
as_width = as_width + 1
as_['alt'].append(as_width)
as_['resn'] = [ as_width ]
as_width = as_width + 4
as_['resn'].append(as_width)
as_['resn_code'] = [ as_width ]
as_width = as_width + 1
as_['resn_code'].append(as_width)
as_['resi'] = [ as_width ]
as_width = as_width + 4
as_['resi'].append(as_width)
as_['chain'] = [ as_width ]
as_width = as_width + 1
as_['chain'].append(as_width)
as_['segi' ] = [ as_width ]
as_width = as_width + 4
as_['segi'].append(as_width)
as_['text_type'] = [ as_width ]
as_width = as_width + 20
as_['text_type'].append(as_width)
# integer properties
ai = {}
ai_width = 0
ai['resi_number'] = ai_width
ai_width = ai_width + 1
ai['hetatm'] = ai_width
ai_width = ai_width + 1
ai['formal_charge'] = ai_width
ai_width = ai_width + 1
ai['flags'] = ai_width
ai_width = ai_width + 1
ai['color_code'] = ai_width
ai_width = ai_width + 1
ai['stereo'] = ai_width
ai_width = ai_width + 1
ai['numeric_type'] = ai_width
ai_width = ai_width + 1
# float properties
af = {}
af_width = 0
af['b'] = af_width
af_width = af_width + 1
af['q'] = af_width
af_width = af_width + 1
af['partial_charge'] = af_width
af_width = af_width + 1
af['vdw'] = af_width
af_width = af_width + 1
# bond information
bi_index0 = 0
bi_index1 = 1
bi_order = 2
bi_stereo = 3
bi_width = 4