Source code for MDAnalysis.topology.CRDParser

# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding: utf-8 -*-
# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
#
# MDAnalysis --- https://www.mdanalysis.org
# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors
# (see the file AUTHORS for the full list of names)
#
# Released under the GNU Public Licence, v2 or any higher version
#
# Please cite your use of MDAnalysis in published work:
#
# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler,
# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein.
# MDAnalysis: A Python package for the rapid analysis of molecular dynamics
# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th
# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy.
# doi: 10.25080/majora-629e541a-00e
#
# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein.
# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations.
# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787
#

"""
CRD topology parser
===================

Read a list of atoms from a CHARMM CARD coordinate file (CRD_)
to build a basic topology.  Reads atom ids (ATOMNO), atom names (TYPES),
resids (RESID), residue numbers (RESNO), residue names (RESNames), segment ids
(SEGID) and tempfactor (Weighting).  Atom element and mass are guessed based on
the name of the atom.

Residues are detected through a change is either resid or resname
while segments are detected according to changes in segid.

.. _CRD: https://www.charmmtutorial.org/index.php/CHARMM:The_Basics


Classes
-------

.. autoclass:: CRDParser
   :members:
   :inherited-members:

"""
import numpy as np

from ..lib.util import openany, FORTRANReader
from .base import TopologyReaderBase, change_squash
from . import guessers
from ..core.topology import Topology
from ..core.topologyattrs import (
    Atomids,
    Atomnames,
    Atomtypes,
    Masses,
    Resids,
    Resnames,
    Resnums,
    Segids,
    Tempfactors,
)


[docs] class CRDParser(TopologyReaderBase): """Parse a CHARMM CARD coordinate file for topology information. Reads the following Attributes: - Atomids - Atomnames - Tempfactors - Resids - Resnames - Resnums - Segids Guesses the following attributes: - Atomtypes - Masses """ format = 'CRD'
[docs] def parse(self, **kwargs): """Create the Topology object Returns ------- MDAnalysis Topology object Todo ---- Could use the resnum and temp factor better """ extformat = FORTRANReader('2I10,2X,A8,2X,A8,3F20.10,2X,A8,2X,A8,F20.10') stdformat = FORTRANReader('2I5,1X,A4,1X,A4,3F10.5,1X,A4,1X,A4,F10.5') atomids = [] atomnames = [] tempfactors = [] resids = [] resnames = [] resnums = [] segids = [] with openany(self.filename) as crd: for linenum, line in enumerate(crd): # reading header if line.split()[0] == '*': continue elif line.split()[-1] == 'EXT' and int(line.split()[0]): r = extformat continue elif line.split()[0] == line.split()[-1] and line.split()[0] != '*': r = stdformat continue # anything else should be an atom try: (serial, resnum, resName, name, x, y, z, segid, resid, tempFactor) = r.read(line) except Exception: errmsg = (f"Check CRD format at line {linenum + 1}: " f"{line.rstrip()}") raise ValueError(errmsg) from None atomids.append(serial) atomnames.append(name) tempfactors.append(tempFactor) resids.append(resid) resnames.append(resName) resnums.append(resnum) segids.append(segid) # Convert to np arrays atomids = np.array(atomids, dtype=np.int32) atomnames = np.array(atomnames, dtype=object) tempfactors = np.array(tempfactors, dtype=np.float32) resids = np.array(resids, dtype=np.int32) resnames = np.array(resnames, dtype=object) resnums = np.array(resnums, dtype=np.int32) segids = np.array(segids, dtype=object) # Guess some attributes atomtypes = guessers.guess_types(atomnames) masses = guessers.guess_masses(atomtypes) atom_residx, (res_resids, res_resnames, res_resnums, res_segids) = change_squash( (resids, resnames), (resids, resnames, resnums, segids)) res_segidx, (seg_segids,) = change_squash( (res_segids,), (res_segids,)) top = Topology(len(atomids), len(res_resids), len(seg_segids), attrs=[ Atomids(atomids), Atomnames(atomnames), Atomtypes(atomtypes, guessed=True), Masses(masses, guessed=True), Tempfactors(tempfactors), Resids(res_resids), Resnames(res_resnames), Resnums(res_resnums), Segids(seg_segids), ], atom_resindex=atom_residx, residue_segindex=res_segidx) return top