def load_rigimol_inp(filename, oname, _self=cmd): ''' DESCRIPTION Load the structures from a RigiMOL "inp" file. ''' import shlex from chempy import Atom, Bond, models parsestate = '' model = None state = 0 for line in open(filename): lex = shlex.shlex(line, posix=True) lex.whitespace_split = True lex.quotes = '"' a = list(lex) if not a: continue if a[0] == '+': if a[1] == 'NAME': assert a[2:] == [ 'RESI', 'RESN', 'CHAIN', 'SEGI', 'X', 'Y', 'Z', 'B' ] parsestate = 'ATOMS' model = models.Indexed() elif a[1] == 'FROM': assert a[2:] == ['TO'] parsestate = 'BONDS' else: parsestate = '' elif a[0] == '|': if parsestate == 'ATOMS': atom = Atom() atom.coord = [float(x) for x in a[6:9]] atom.name = a[1] atom.resi = a[2] atom.resn = a[3] atom.chain = a[4] atom.segi = a[5] atom.b = a[9] atom.symbol = '' model.add_atom(atom) elif parsestate == 'BONDS': bnd = Bond() bnd.index = [int(a[1]), int(a[2])] model.add_bond(bnd) elif a[0] == 'end': if parsestate in ('ATOMS', 'BONDS'): state += 1 _self.load_model(model, oname, state=state) parsestate = ''
def fromList(self,list): # currently no handling of conect records model = Indexed() # read atoms cnt = 0 at = None for rec in list: if (rec[0:4]=='ATOM') or (rec[0:6]=='HETATM'): at = Atom() if rec[0]=='A': at.hetatm=0 # default is 1 at.index = cnt at.name = string.strip(rec[12:16]) at.alt = string.strip(rec[16:17]) at.resn = string.strip(rec[17:20]) at.chain = string.strip(rec[21:22]) at.resi = string.strip(rec[22:27]) # note: insertion is part of resi at.resi_number = int(rec[22:26]) at.coord = [float(rec[30:38]), float(rec[38:46]), float(rec[46:54])] try: at.q = float(rec[54:60]) except ValueError: at.q = 1.0 try: at.b = float(rec[60:66]) except ValueError: at.b = 0.0 at.segi = string.strip(rec[72:76]) at.symbol = string.strip(rec[76:78]) if not len(at.symbol): at.symbol = at.name[0:1] if at.symbol in '012345678': at.symbol = at.name[1:2] cnt = cnt + 1 model.add_atom(at) elif (rec[0:3]=='TER'): if at: at.ter=1 return(model)
def __init__(self, object, name='MMTK_model', configuration=None, b_values=None): self.object = object self.universe = object.universe() self.name = name self.model = Indexed() self.index_map = {} self.atoms = [] chain_id_number = 0 in_chain = True for o in object.bondedUnits(): if Utility.isSequenceObject(o): groups = [(g, g.name) for g in o] if not in_chain: chain_id_number = (chain_id_number + 1) % len( self.chain_ids) in_chain = True else: groups = [(o, o.name)] in_chain = False residue_number = 1 for g, g_name in groups: for a in g.atomList(): atom = Atom() atom.symbol = a.symbol atom.name = a.name atom.resi_number = residue_number atom.chain = self.chain_ids[chain_id_number] if b_values is not None: atom.b = b_values[a] atom.resn = g_name self.model.atom.append(atom) self.index_map[a] = len(self.atoms) self.atoms.append(a) residue_number = residue_number + 1 if in_chain: chain_id_number = (chain_id_number + 1) % len(self.chain_ids) try: bonds = o.bonds except AttributeError: bonds = [] for b in bonds: bond = Bond() bond.index = [self.index_map[b.a1], self.index_map[b.a2]] self.model.bond.append(bond) self._setCoordinates(configuration)
def __init__(self, object, name = 'MMTK_model', configuration = None, b_values = None): self.object = object self.universe = object.universe() self.name = name self.model = Indexed() self.index_map = {} self.atoms = [] chain_id_number = 0 in_chain = True for o in object.bondedUnits(): if Utility.isSequenceObject(o): groups = [(g, g.name) for g in o] if not in_chain: chain_id_number = (chain_id_number+1) % len(self.chain_ids) in_chain = True else: groups = [(o, o.name)] in_chain = False residue_number = 1 for g, g_name in groups: for a in g.atomList(): atom = Atom() atom.symbol = a.symbol atom.name = a.name atom.resi_number = residue_number atom.chain = self.chain_ids[chain_id_number] if b_values is not None: atom.b = b_values[a] atom.resn = g_name self.model.atom.append(atom) self.index_map[a] = len(self.atoms) self.atoms.append(a) residue_number = residue_number + 1 if in_chain: chain_id_number = (chain_id_number+1) % len(self.chain_ids) try: bonds = o.bonds except AttributeError: bonds = [] for b in bonds: bond = Bond() bond.index = [self.index_map[b.a1], self.index_map[b.a2]] self.model.bond.append(bond) self._setCoordinates(configuration)
def convert_to_chempy_model(atom_array): """ Convert an :class:`AtomArray` into a :class:`chempy.models.Indexed` object. Returns ------- chempy_model : Indexed The converted structure. """ model = IndexedModel() annot_cat = atom_array.get_annotation_categories() for i in range(atom_array.array_length()): atom = Atom() atom.segi = atom_array.chain_id[i] atom.chain = atom_array.chain_id[i] atom.resi_number = atom_array.res_id[i] atom.ins_code = atom_array.ins_code[i] res_name = atom_array.res_name[i] atom.resn = res_name if len(res_name) == 1: atom.resn_code = res_name else: try: atom.resn_code = ProteinSequence.convert_letter_3to1(res_name) except KeyError: atom.resn_code = "X" atom.hetatm = 1 if atom_array.hetero[i] else 0 atom.name = atom_array.atom_name[i] atom.symbol = atom_array.element[i] if "b_factor" in annot_cat: atom.b = atom_array.b_factor[i] if "occupancy" in annot_cat: atom.q = atom_array.occupancy[i] if "charge" in annot_cat: atom.formal_charge = atom_array.charge[i] atom.coord = tuple(atom_array.coord[..., i, :]) atom.index = i + 1 model.add_atom(atom) if atom_array.bonds is not None: for i, j, bond_type in atom_array.bonds.as_array(): bond = Bond() bond.order = BOND_ORDER[bond_type] bond.index = [i, j] model.add_bond(bond) else: warnings.warn( "The given atom array (stack) has no associated bond information") return model
def load_pdbml(filename, object='', discrete=0, multiplex=1, zoom=-1, quiet=1, _self=cmd): ''' DESCRIPTION Load a PDBML formatted structure file ''' from chempy import Atom, models from collections import defaultdict multiplex, discrete = int(multiplex), int(discrete) try: root = etree.fromstring(_self.file_read(filename)) PDBxNS = root.tag.rstrip('datablock') atom_site_list = root.findall('.' '/' + PDBxNS + 'atom_siteCategory' '/' + PDBxNS + 'atom_site') except etree.XMLSyntaxError: raise CmdException("File doesn't look like XML") except etree.XPathEvalError: raise CmdException("XML file doesn't look like a PDBML file") if not atom_site_list: raise CmdException("no PDBx:atom_site nodes found in XML file") # state -> model dictionary model_dict = defaultdict(models.Indexed) # atoms for atom_site in atom_site_list: atom = Atom() atom.coord = [None, None, None] model_num = 1 for child in atom_site: tag = child.tag if tag == PDBxNS + 'Cartn_x': atom.coord[0] = float(child.text) elif tag == PDBxNS + 'Cartn_y': atom.coord[1] = float(child.text) elif tag == PDBxNS + 'Cartn_z': atom.coord[2] = float(child.text) elif tag == PDBxNS + 'B_iso_or_equiv': atom.b = float(child.text) elif tag == PDBxNS + 'auth_asym_id': atom.chain = child.text or '' elif tag == PDBxNS + 'auth_atom_id': atom.name = child.text or '' elif tag == PDBxNS + 'auth_comp_id': atom.resn = child.text or '' elif tag == PDBxNS + 'auth_seq_id': atom.resi = child.text or '' elif tag == PDBxNS + 'label_alt_id': atom.resi = child.text or '' elif tag == PDBxNS + 'label_asym_id': atom.segi = child.text or '' elif tag == PDBxNS + 'label_atom_id': if not atom.name: atom.name = child.text or '' elif tag == PDBxNS + 'label_comp_id': if not atom.resn: atom.resn = child.text or '' elif tag == PDBxNS + 'label_seq_id': if not atom.resi: atom.resi = child.text or '' elif tag == PDBxNS + 'label_entity_id': atom.custom = child.text or '' elif tag == PDBxNS + 'occupancy': atom.q = float(child.text) elif tag == PDBxNS + 'pdbx_PDB_model_num': model_num = int(child.text) elif tag == PDBxNS + 'type_symbol': atom.symbol = child.text or '' elif tag == PDBxNS + 'group_PDB': atom.hetatm = (child.text == 'HETATM') if None not in atom.coord: model_dict[model_num].add_atom(atom) # symmetry and cell try: node = root.findall('.' '/' + PDBxNS + 'cellCategory' '/' + PDBxNS + 'cell')[0] cell = [ float(node.findall('./' + PDBxNS + a)[0].text) for a in [ 'length_a', 'length_b', 'length_c', 'angle_alpha', 'angle_beta', 'angle_gamma' ] ] spacegroup = root.findall('.' '/' + PDBxNS + 'symmetryCategory' '/' + PDBxNS + 'symmetry' '/' + PDBxNS + 'space_group_name_H-M')[0].text except IndexError: cell = None spacegroup = '' # object name if not object: object = os.path.basename(filename).split('.', 1)[0] # only multiplex if more than one model/state multiplex = multiplex and len(model_dict) > 1 # load models as objects or states for model_num in sorted(model_dict): if model_num < 1: print(" Error: model_num < 1 not supported") continue model = model_dict[model_num] model.connect_mode = 3 if cell: model.cell = cell model.spacegroup = spacegroup if multiplex: oname = '%s_%04d' % (object, model_num) model_num = 1 else: oname = object _self.load_model(model, oname, state=model_num, zoom=zoom, discrete=discrete)
def load_3d(filename, object=''): ''' DESCRIPTION Load a survex 3d cave survey as "molecule" http://survex.com http://trac.survex.com/browser/trunk/doc/3dformat.htm ''' from chempy import Atom, Bond, models from struct import unpack if object == '': object = os.path.splitext(os.path.basename(filename))[0] f = open(filename, 'rb') line = f.readline() # File ID if not line.startswith('Survex 3D Image File'): print " Error: not a Survex 3D File" raise CmdException line = f.readline() # File format version assert line[0] == 'v' ff_version = int(line[1:]) line = unicode(f.readline(), 'latin1') # Survex title line = f.readline() # Timestamp class Station: def __init__(self): self.labels = [] self.adjacent = [] self.lrud = None self.flag = 0 def connect(self, other): self.adjacent.append(other) def is_surface(self): return self.flag & 0x01 def is_underground(self): return self.flag & 0x02 def is_entrance(self): return self.flag & 0x04 def is_exported(self): return self.flag & 0x08 def is_fixed(self): return self.flag & 0x10 class Survey(dict): def __init__(self): self.prev = None self.curr_label = '' self.labelmap = {} def get(self, xyz): return dict.setdefault(self, tuple(xyz), Station()) def line(self, xyz): s = self.get(xyz) self.prev.connect(s) self.prev = s def move(self, xyz): s = self.get(xyz) self.prev = s def label(self, xyz, flag=0): s = self.get(xyz) s.labels.append(self.curr_label) self.labelmap[s.labels[-1]] = s if flag > 0: s.flag = flag def lrud(self, lrud): s = self.labelmap[self.curr_label] s.lrud = lrud survey = Survey() def read_xyz(): return unpack('<iii', f.read(12)) def read_len(): len = read_byte() if len == 0xfe: len += unpack('<H', f.read(2))[0] elif len == 0xff: len += unpack('<I', f.read(4))[0] return len def read_label(): len = read_len() if len > 0: survey.curr_label += skip_bytes(len) def skip_bytes(n): return f.read(n) def read_byte(): byte = f.read(1) if len(byte) != 1: return -1 return ord(byte) while 1: byte = read_byte() if byte == -1: break if byte == 0x00: # STOP survey.curr_label = '' elif byte <= 0x0e: # TRIM # FIXME: according to doc, trim 16 bytes, but img.c does 17! (i,n) = (-17,0) while n < byte: i -= 1 if survey.curr_label[i] == '.': n += 1 survey.curr_label = survey.curr_label[:i + 1] elif byte <= 0x0f: # MOVE xyz = read_xyz() survey.move(xyz) elif byte <= 0x1f: # TRIM survey.curr_label = survey.curr_label[:15 - byte] elif byte <= 0x20: # DATE if ff_version < 7: skip_bytes(4) else: skip_bytes(2) elif byte <= 0x21: # DATE if ff_version < 7: skip_bytes(8) else: skip_bytes(3) elif byte <= 0x22: # Error info skip_bytes(5 * 4) elif byte <= 0x23: # DATE skip_bytes(4) elif byte <= 0x24: # DATE continue elif byte <= 0x2f: # Reserved continue elif byte <= 0x31: # XSECT read_label() lrud = unpack('<hhhh', f.read(8)) survey.lrud(lrud) elif byte <= 0x33: # XSECT read_label() lrud = unpack('<iiii', f.read(16)) survey.lrud(lrud) elif byte <= 0x3f: # Reserved continue elif byte <= 0x7f: # LABEL read_label() xyz = read_xyz() survey.label(xyz, byte & 0x3f) elif byte <= 0xbf: # LINE read_label() xyz = read_xyz() survey.line(xyz) elif byte <= 0xff: # Reserved continue model = models.Indexed() for (xyz,s) in survey.iteritems(): l0, _, l1 = s.labels[0].rpartition('.') resi, name = l1[:5], l1[5:] segi, chain, resn = l0[-8:-4], l0[-4:-3], l0[-3:] atom = Atom() atom.coord = [i/100.0 for i in xyz] atom.segi = segi atom.chain = chain atom.resn = resn atom.name = name atom.resi = resi atom.b = atom.coord[2] atom.label = s.labels[0] if s.lrud is not None: atom.vdw = sum(s.lrud)/400.0 model.add_atom(atom) s2i = dict((s,i) for (i,s) in enumerate(survey.itervalues())) for (s,i) in s2i.iteritems(): for o in s.adjacent: bnd = Bond() bnd.index = [i, s2i[o]] model.add_bond(bnd) cmd.load_model(model, object, 1) cmd.show_as('lines', object) cmd.spectrum('b', 'rainbow', object)
def load_3d(filename, object=''): ''' DESCRIPTION Load a survex 3d cave survey as "molecule" http://survex.com http://trac.survex.com/browser/trunk/doc/3dformat.htm ''' from chempy import Atom, Bond, models from struct import unpack if object == '': object = os.path.splitext(os.path.basename(filename))[0] f = open(filename, 'rb') line = f.readline() # File ID if not line.startswith('Survex 3D Image File'): print(" Error: not a Survex 3D File") raise CmdException line = f.readline() # File format version assert line[0] == 'v' ff_version = int(line[1:]) line = f.readline().decode('latin1') # Survex title line = f.readline() # Timestamp class Station: def __init__(self): self.labels = [] self.adjacent = [] self.lrud = None self.flag = 0 def connect(self, other): self.adjacent.append(other) def is_surface(self): return self.flag & 0x01 def is_underground(self): return self.flag & 0x02 def is_entrance(self): return self.flag & 0x04 def is_exported(self): return self.flag & 0x08 def is_fixed(self): return self.flag & 0x10 class Survey(dict): def __init__(self): self.prev = None self.curr_label = '' self.labelmap = {} def get(self, xyz): return dict.setdefault(self, tuple(xyz), Station()) def line(self, xyz): s = self.get(xyz) self.prev.connect(s) self.prev = s def move(self, xyz): s = self.get(xyz) self.prev = s def label(self, xyz, flag=0): s = self.get(xyz) s.labels.append(self.curr_label) self.labelmap[s.labels[-1]] = s if flag > 0: s.flag = flag def lrud(self, lrud): s = self.labelmap[self.curr_label] s.lrud = lrud survey = Survey() def read_xyz(): return unpack('<iii', f.read(12)) def read_len(): len = read_byte() if len == 0xfe: len += unpack('<H', f.read(2))[0] elif len == 0xff: len += unpack('<I', f.read(4))[0] return len def read_label(): len = read_len() if len > 0: survey.curr_label += skip_bytes(len) def skip_bytes(n): return f.read(n) def read_byte(): byte = f.read(1) if len(byte) != 1: return -1 return ord(byte) while 1: byte = read_byte() if byte == -1: break if byte == 0x00: # STOP survey.curr_label = '' elif byte <= 0x0e: # TRIM # FIXME: according to doc, trim 16 bytes, but img.c does 17! (i, n) = (-17, 0) while n < byte: i -= 1 if survey.curr_label[i] == '.': n += 1 survey.curr_label = survey.curr_label[:i + 1] elif byte <= 0x0f: # MOVE xyz = read_xyz() survey.move(xyz) elif byte <= 0x1f: # TRIM survey.curr_label = survey.curr_label[:15 - byte] elif byte <= 0x20: # DATE if ff_version < 7: skip_bytes(4) else: skip_bytes(2) elif byte <= 0x21: # DATE if ff_version < 7: skip_bytes(8) else: skip_bytes(3) elif byte <= 0x22: # Error info skip_bytes(5 * 4) elif byte <= 0x23: # DATE skip_bytes(4) elif byte <= 0x24: # DATE continue elif byte <= 0x2f: # Reserved continue elif byte <= 0x31: # XSECT read_label() lrud = unpack('<hhhh', f.read(8)) survey.lrud(lrud) elif byte <= 0x33: # XSECT read_label() lrud = unpack('<iiii', f.read(16)) survey.lrud(lrud) elif byte <= 0x3f: # Reserved continue elif byte <= 0x7f: # LABEL read_label() xyz = read_xyz() survey.label(xyz, byte & 0x3f) elif byte <= 0xbf: # LINE read_label() xyz = read_xyz() survey.line(xyz) elif byte <= 0xff: # Reserved continue model = models.Indexed() for (xyz, s) in survey.items(): l0, _, l1 = s.labels[0].rpartition('.') resi, name = l1[:5], l1[5:] segi, chain, resn = l0[-8:-4], l0[-4:-3], l0[-3:] atom = Atom() atom.coord = [i / 100.0 for i in xyz] atom.segi = segi atom.chain = chain atom.resn = resn atom.name = name atom.resi = resi atom.b = atom.coord[2] atom.label = s.labels[0] if s.lrud is not None: atom.vdw = sum(s.lrud) / 400.0 model.add_atom(atom) s2i = dict((s, i) for (i, s) in enumerate(survey.values())) for (s, i) in s2i.items(): for o in s.adjacent: bnd = Bond() bnd.index = [i, s2i[o]] model.add_bond(bnd) cmd.load_model(model, object, 1) cmd.show_as('lines', object) cmd.spectrum('b', 'rainbow', object)
def load_3d(filename, object=''): ''' DESCRIPTION Load a survex 3d cave survey as "molecule" http://survex.com ''' from chempy import Atom, Bond, models if object == '': import os object = os.path.splitext(os.path.basename(filename))[0] f = open(filename, 'rb') line = f.readline() # File ID if not line.startswith('Survex 3D Image File'): print " Error: not a Survex 3D File" raise CmdException line = f.readline() # File format version assert line[0] == 'v' ff_version = int(line[1:]) line = unicode(f.readline(), 'latin1') # Survex title line = f.readline() # Timestamp class Station(tuple): def __new__(cls, xyz): return tuple.__new__(cls, xyz) def __init__(self, xyz): self.labels = [] self.adjacent = [] def connect(self, other): self.adjacent.append(other) class Survey(dict): def __init__(self): self.prev = None self.curr_label = '' def get(self, xyz): s = Station(xyz) return dict.setdefault(self, s, s) def line(self, xyz): s = self.get(xyz) self.prev.connect(s) self.prev = s def move(self, xyz): s = self.get(xyz) self.prev = s def label(self, xyz): s = survey.get(xyz) s.labels.append(self.curr_label) def __repr__(self): return 'Survey(' + repr(self.keys())[1:-1] + ')' survey = Survey() def read_xyz(): x = read_int(4, 1) y = read_int(4, 1) z = read_int(4, 1) return [ x, y, z ] def read_int(len, sign): int = 0 for i in range(len): int |= read_byte() << (8 * i) if sign and (int >> (8 * len - 1)): int -= (1 << 8 * len) return int def read_len(): len = read_byte() if len == 0xfe: len += read_int(2, 0) elif len == 0xff: len = read_int(4, 0) return len def read_label(): len = read_len() if len > 0: survey.curr_label += skip_bytes(len) def skip_bytes(n): return f.read(n) def read_byte(): byte = f.read(1) if len(byte) != 1: return -1 return ord(byte) while 1: byte = read_byte() if byte == -1: break if byte == 0x00: # STOP survey.curr_label = '' elif byte <= 0x0e: # TRIM (i,n) = (-16,0) while n < byte: i -= 1 if survey.curr_label[i] == '.': n += 1 survey.curr_label = survey.curr_label[:i + 1] elif byte <= 0x0f: # MOVE xyz = read_xyz() survey.move(xyz) elif byte <= 0x1f: # TRIM survey.curr_label = survey.curr_label[:15 - byte] elif byte <= 0x20: # DATE if ff_version < 7: skip_bytes(4) else: skip_bytes(2) elif byte <= 0x21: # DATE if ff_version < 7: skip_bytes(8) else: skip_bytes(3) elif byte <= 0x22: # Error info skip_bytes(5 * 4) elif byte <= 0x23: # DATE skip_bytes(4) elif byte <= 0x24: # DATE continue elif byte <= 0x2f: # Reserved continue elif byte <= 0x31: # XSECT read_label() skip_bytes(4 * 2) elif byte <= 0x33: # XSECT read_label() skip_bytes(4 * 4) elif byte <= 0x3f: # Reserved continue elif byte <= 0x7f: # LABEL read_label() xyz = read_xyz() survey.label(xyz) elif byte <= 0xbf: # LINE read_label() xyz = read_xyz() survey.line(xyz) elif byte <= 0xff: # Reserved continue model = models.Indexed() for s in survey: l0, _, l1 = s.labels[0].rpartition('.') resi, name = l1[:5], l1[5:] # segi, chain, resn = l0[:4],l0[-4:-3], l0[-3:] segi, chain, resn = l0[-8:-4], l0[-4:-3], l0[-3:] atom = Atom() atom.coord = [i/100.0 for i in s] atom.segi = segi atom.chain = chain atom.resn = resn atom.name = name atom.resi = resi atom.b = atom.coord[2] model.add_atom(atom) s2i = dict((s,i) for (i,s) in enumerate(survey)) for s in survey: for o in s.adjacent: bnd = Bond() bnd.index = [s2i[s], s2i[o]] model.add_bond(bnd) cmd.load_model(model, object, 1) cmd.show_as('lines', object) cmd.spectrum('b', 'rainbow', object)