def topology(self): """Get the topology out from the file Returns ------- topology : mdtraj.Topology A topology object """ try: raw = self._get_node('/', name='topology')[0] if not isinstance(raw, string_types): raw = raw.decode() topology_dict = json.loads(raw) except self.tables.NoSuchNodeError: return None topology = Topology() for chain_dict in sorted(topology_dict['chains'], key=operator.itemgetter('index')): chain = topology.add_chain() for residue_dict in sorted(chain_dict['residues'], key=operator.itemgetter('index')): try: resSeq = residue_dict["resSeq"] except KeyError: resSeq = None warnings.warn( 'No resSeq information found in HDF file, defaulting to zero-based indices' ) residue = topology.add_residue(residue_dict['name'], chain, resSeq=resSeq) for atom_dict in sorted(residue_dict['atoms'], key=operator.itemgetter('index')): try: element = elem.get_by_symbol(atom_dict['element']) except KeyError: element = None topology.add_atom(atom_dict['name'], element, residue) atoms = list(topology.atoms) for index1, index2 in topology_dict['bonds']: topology.add_bond(atoms[index1], atoms[index2]) return topology
def load_coor(filename): """ Load a simple coordinate file, formatted as: x y z atomic_number where `x`,`y`,`z` (float) are the positions of the atom, in angstroms, and `atomic_number` (int) is the atomic number Z specifying what the atom is. Parameters ---------- filename : str The filename to load. Returns ------- structure : mdtraj.trajectory A meta-data minimal mdtraj instance """ data = np.genfromtxt(filename) xyz = data[:, :3] / 10.0 # coor files are in angstoms, conv. to nm atomic_numbers = data[:, 3] top = Topology() chain = top.addChain() residue = top.addResidue('XXX', chain) for i in range(data.shape[0]): element_symb = periodic_table[atomic_numbers[i]][ 1] # should give symbol element = Element.getBySymbol(element_symb) name = '%s' % element_symb top.addAtom(name, element, residue) structure = trajectory.Trajectory(xyz=xyz, topology=top) return structure
def _read_models(self): if not self._mode == 'r': raise ValueError('file not opened for reading') self._topology = Topology() pdb = PdbStructure(self._file, load_all_models=True) atomByNumber = {} for chain in pdb.iter_chains(): c = self._topology.add_chain() for residue in chain.iter_residues(): resName = residue.get_name() if resName in PDBTrajectoryFile._residueNameReplacements: resName = PDBTrajectoryFile._residueNameReplacements[resName] r = self._topology.add_residue(resName, c, residue.number) if resName in PDBTrajectoryFile._atomNameReplacements: atomReplacements = PDBTrajectoryFile._atomNameReplacements[resName] else: atomReplacements = {} for atom in residue.atoms: atomName = atom.get_name() if atomName in atomReplacements: atomName = atomReplacements[atomName] atomName = atomName.strip() element = atom.element if element is None: element = self._guess_element(atomName, residue) newAtom = self._topology.add_atom(atomName, element, r) atomByNumber[atom.serial_number] = newAtom # load all of the positions (from every model) _positions = [] for model in pdb.iter_models(use_all_models=True): coords = [] for chain in model.iter_chains(): for residue in chain.iter_residues(): for atom in residue.atoms: coords.append(atom.get_position()) _positions.append(coords) self._positions = np.array(_positions) ## The atom positions read from the PDB file self._unitcell_lengths = pdb.get_unit_cell_lengths() self._unitcell_angles = pdb.get_unit_cell_angles() self._topology.create_standard_bonds() self._topology.create_disulfide_bonds(self.positions[0]) # Add bonds based on CONECT records. connectBonds = [] for connect in pdb.models[0].connects: i = connect[0] for j in connect[1:]: connectBonds.append((atomByNumber[i], atomByNumber[j])) if len(connectBonds) > 0: # Only add bonds that don't already exist. existingBonds = set(self._topology.bonds) for bond in connectBonds: if bond not in existingBonds and (bond[1], bond[0]) not in existingBonds: self._topology.add_bond(bond[0], bond[1]) existingBonds.add(bond)