def atoms_to_residues(atoms, atomsPerRes, seqid, resnames=None):
    """
    Builds a list of residues from a list of atoms, where each residue
    i the list has 'atomsPerRes' atoms per residue. All residues are
    set to 'A', if no residue names are given.
    """

    # Check the arguments
    if (len(atoms) % atomsPerRes) != 0:
        raise ValueError, "Mismatch between list length and atoms per residues."

    if resnames==None:
        resnames = ["  A" for _ in xrange(len(atoms)/atomsPerRes)]


    residues = []
    res = None
    
    for (i,atom) in enumerate(atoms):
        # Residue number
        resnumber = i // atomsPerRes

        # Create a new residue
        if (i % atomsPerRes) == 0:
            if res!=None:
                residues.append(res)
            res = Residue((" ", resnumber, " "), resnames[resnumber], seqid)
            res.add(atom)
        # Add an atom
        else:
            res.add(atom)

    if res!=None:
        residues.append(res)

    return residues
Beispiel #2
0
    def init_residue(self, resname, field, resseq, icode):
        """Initiate a new Residue object.

        Arguments:
        o resname - string, e.g. "ASN"
        o field - hetero flag, "W" for waters, "H" for
            hetero residues, otherwise blanc.
        o resseq - int, sequence identifier
        o icode - string, insertion code

        """
        if field != " ":
            if field == "H":
                # The hetero field consists of
                # H_ + the residue name (e.g. H_FUC)
                field = "H_" + resname
        res_id = (field, resseq, icode)

        if resseq > self.max_resseq:
            self.max_resseq = resseq

        if field == " ":
            fudged_resseq = False
            while (self.chain.has_id(res_id) or resseq == 0):
                # There already is a residue with the id (field, resseq, icode)
                # resseq == 0 catches already wrapped residue numbers which
                # do not trigger the has_id() test.
                #
                # Be sloppy and just increment...
                # (This code will not leave gaps in resids... I think)
                #
                # XXX: shouldn't we also do this for hetero atoms and water??
                self.max_resseq += 1
                resseq = self.max_resseq
                res_id = (field, resseq, icode)  # use max_resseq!
                fudged_resseq = True

            if fudged_resseq and self.verbose:
                sys.stderr.write("Residues are wrapping (Residue " +
                                 "('%s', %i, '%s') at line %i)." %
                                 (field, resseq, icode, self.line_counter) +
                                 ".... assigning new resid %d.\n" %
                                 self.max_resseq)
        residue = Residue(res_id, resname, self.segid)
        self.chain.add(residue)
        self.residue = residue
    def build_structure(self, sequence, start_index, moltype):
        """
           builds new structure composed of atom_name atoms only
           for nucleic acids these are C4', for proteins CA
        """
        new_chain = list(self.fragment_lattice.get_chains())[0]
        for resi in sequence:
            #print "resi", resi, start_index
            resi_id = (" ", start_index, " ")
            #resi_name = resi
            ###############33
            if moltype == "protein":
                resi_name = AMINOACIDS[resi.upper()]
            else:
                resi_name = NUCLEOTIDES[resi.upper()]
###############33
            new_resi = Residue(resi_id, resi_name, " ")
            new_chain.add(new_resi)
            start_index += 1
Beispiel #4
0
def _cmp_res(r0: Residue, r1: Residue, verbose: bool, cmpdict: Dict) -> None:
    r0id, r0fid, r1fid = r0.id, r0.full_id, r1.full_id
    chn = r0.parent.id
    if chn not in cmpdict["chains"]:
        cmpdict["chains"].append(chn)
    cmpdict["rCount"] += 1
    if r0fid == r1fid:
        cmpdict["rMatchCount"] += 1
    elif verbose:
        print(r0fid, "!=", r1fid)
    if " " == r0id[0] and not (" " == r0.resname[0] or 2 == len(r0.resname)):
        # skip water, DNA (' ' == [0] for pdb, 2 == len() for mmcif)
        cmpdict["residues"] += 1
        longer = r0 if len(r0.child_dict) >= len(r1.child_dict) else r1
        for ak in longer.child_dict:
            a0 = r0.child_dict.get(ak, None)
            if a0 is None:
                aknd = re.sub("D", "H", ak, count=1)
                a0 = r0.child_dict.get(aknd, None)
            a1 = r1.child_dict.get(ak, None)
            if a1 is None:
                aknd = re.sub("D", "H", ak, count=1)
                a1 = r1.child_dict.get(aknd, None)
            if (a0 is None or a1 is None
                    or 0 == a0.is_disordered() == a1.is_disordered()):
                _cmp_atm(r0, r1, a0, a1, verbose, cmpdict)
            elif 2 == a0.is_disordered() == a1.is_disordered():
                cmpdict["disAtmCount"] += 1
                for da0k in a0.child_dict:
                    _cmp_atm(
                        r0,
                        r1,
                        a0.child_dict.get(da0k, None),
                        a1.child_dict.get(da0k, None),
                        verbose,
                        cmpdict,
                    )
            else:
                if verbose:
                    print("disorder disagreement:", r0.get_full_id(), ak)
                cmpdict["aCount"] += 1
Beispiel #5
0
def get_CA_or(res: Residue) -> Atom:
    """Returns the alpha carbon for the resiude if there is one, else the first atom in the list"""
    atoms: List[Atom] = list(res.get_atoms())
    alphacarbons = list(
        filter(lambda atom: True if atom.get_name() == 'CA' else False, atoms))
    return atoms[0] if len(alphacarbons) == 0 else alphacarbons[0]
Beispiel #6
0
def makeResidueTuple(res:Residue)->Tuple[ str, int, NDArray[3] ]: 
    ac     : Atom       = get_alpha_carbon(res)
    coords : NDArray[3] = ac.get_coord()
    resi   : int        = res.get_id()
    resn   : str        = res.get_resname()
    return tuple(( resn, resi, coords ))
    def build_martini_representation(self, old_struct, new_st):
        """
        Reduces complexity of protein residue to the MARTINI coarse grained model:
        CA, O, Bead(s) in specific atom location.
        Reference:
        
        Monticelli et al. The MARTINI coarse-grained force field: extension to proteins.
        J. Chem. Theory Comput. (2008) vol. 4 (5) pp. 819-834
        """

        conversion_table = {
            "L": ["CG"],
            "V": ["CB"],
            "E": ["CB"],
            "d": ["CG"],
            "T": ["CB"],
            "Q": ["CB"],
            "S": ["CB"],
            "A": [],
            "G": [],
            "K": ["CG", "CE"],
            "I": ["CD1"],
            "R": ["CG", "NE"],
            "N": ["CG"],
            "P": ["CG"],
            "F": ["CG", "CE1", "CE2"],
            "Y": ["CG", "CE1", "CE2"],
            "H": ["CB", "ND1", "NE2"],
            "M": ["CG"],
            "W": ["CB", "CD1", "CD2", "CE2"],
            "C": ["SG"],
            "LEU": ["CG"],
            "VAL": ["CB"],
            "GLU": ["CB"],
            "ASP": ["CG"],
            "THR": ["CB"],
            "GLN": ["CB"],
            "SER": ["CB"],
            "ALA": [],
            "GLY": [],
            "LYS": ["CG", "CE"],
            "ILE": ["CD1"],
            "ARG": ["CG", "NE"],
            "ASN": ["CG"],
            "PRO": ["CG"],
            "PHE": ["CG", "CE1", "CE2"],
            "TYR": ["CG", "CE1", "CE2"],
            "HIS": ["CB", "ND1", "NE2"],
            "MET": ["CG"],
            "TRP": ["CB", "CD1", "CD2", "CE2"],
            "CYS": ["SG"],
        }

        for resi in old_struct.struct.get_residues():
            new_chain = list(new_st.get_chains())[0]
            #print "@@@", resi.resname, resi.id
            hetname = resi.id[0].split("_")
            if hetname[0] == "H": continue
            for atom in resi:
                resname = resi.resname.strip()

                if atom.name in conversion_table[resname] or atom.name == "CA":
                    resi = atom.get_parent()
                    if new_chain.has_id(resi.id): pass
                    else:
                        new_resi = Residue(resi.id, resi.resname, " ")
                        new_chain.add(new_resi)
                    new_resi.add(atom)
        del self.fa_struct
Beispiel #8
0
class TestCsvParser(unittest.TestCase):
    """Test that we can parse CSV files correctly."""

    CSV_STRING = textwrap.dedent("""\
        NONSENSE_FIELD Phi Psi Chi0 Chi1 Chi2 Chi3 PDB_FILE CHAIN RES_INDEX AA ICODE
        foo -20 30 10 0 0 0 a.pdb A 10 SER X
        bar -15.0 0 180.0 0 0 0 b.pdb B 12 VAL
        baz -180 50 300 -200 102 300 c.pdb A 33A ARG
        """)
    CORRECT_TORSION = [(-20, 30), (-15.0, 0), (-180, 50)]
    CORRECT_CHI = [(10,), (180.0,), (300, -200, 102, 300)]
    CORRECT_RESIDUES = [
        Residue((' ', 10, 'X'), 'SER', 1),
        Residue((' ', 12, ' '), 'VAL', 1),
        Residue((' ', 33, 'A'), 'ARG', 1),
    ]
    CORRECT_CHAINS = ['A', 'B', 'A']
    CORRECT_SOURCES = ['a.pdb', 'b.pdb', 'c.pdb']

    def assertTupleAlmostequal(self, a, b, places, msg):
        for val1, val2 in zip(a, b):
            self.assertAlmostEqual(val1, val2, places, msg)
    def assertResiduesEqual(self, a, b, msg=""):
        self.assertEqual(
            a.get_full_id(),
            b.get_full_id(),
            "{}: Full ID".format(msg))
        self.assertEqual(
            a.get_resname(),
            b.get_resname(),
            "{} Residue name".format(msg))

    def test_parser(self):
        """Parse a dummy CSV file."""
        mapping = {
            "phi": "Phi",
            "psi": "Psi",
            "chi": ("Chi0", "Chi1", "Chi2", "Chi3"),
            "source": "PDB_FILE",
            "chain": "CHAIN",
            "residue": {"id": (None, "RES_INDEX", "ICODE"), "resname": "AA"}
        }
        parser = CsvParser(mapping, {}, delimiter=' ')
        with tempfile.NamedTemporaryFile("w") as csv_file:
            csv_file.write(self.CSV_STRING)
            csv_file.flush()

            results = parser.run({"residue_csv": csv_file.name})
            for i, residue in enumerate(results["residues"]):
                self.assertTupleAlmostequal(
                    residue["torsion"],
                    self.CORRECT_TORSION[i],
                    1,
                    "Residue {} torsion".format(i))
                self.assertTupleAlmostequal(
                    residue["sidechain"].angles,
                    self.CORRECT_CHI[i],
                    1,
                    "Residue {} chi".format(i))
                self.assertEqual(
                    residue["source"],
                    self.CORRECT_SOURCES[i],
                    "Residue {} source".format(i))
                self.assertResiduesEqual(
                    residue["residue"],
                    self.CORRECT_RESIDUES[i],
                    "Residue {}".format(i))
                self.assertEqual(
                    residue["chain"],
                    self.CORRECT_CHAINS[i],
                    "Residue {} chain".format(i))
Beispiel #9
0
def makeTyr(segID: int, N, CA, C, O, geo: TyrGeo) -> Residue:
    """Creates a Tyrosine residue"""
    ##R-Group
    CA_CB_length = geo.CA_CB_length
    C_CA_CB_angle = geo.C_CA_CB_angle
    N_C_CA_CB_diangle = geo.N_C_CA_CB_diangle

    CB_CG_length = geo.CB_CG_length
    CA_CB_CG_angle = geo.CA_CB_CG_angle
    N_CA_CB_CG_diangle = geo.N_CA_CB_CG_diangle

    CG_CD1_length = geo.CG_CD1_length
    CB_CG_CD1_angle = geo.CB_CG_CD1_angle
    CA_CB_CG_CD1_diangle = geo.CA_CB_CG_CD1_diangle

    CG_CD2_length = geo.CG_CD2_length
    CB_CG_CD2_angle = geo.CB_CG_CD2_angle
    CA_CB_CG_CD2_diangle = geo.CA_CB_CG_CD2_diangle

    CD1_CE1_length = geo.CD1_CE1_length
    CG_CD1_CE1_angle = geo.CG_CD1_CE1_angle
    CB_CG_CD1_CE1_diangle = geo.CB_CG_CD1_CE1_diangle

    CD2_CE2_length = geo.CD2_CE2_length
    CG_CD2_CE2_angle = geo.CG_CD2_CE2_angle
    CB_CG_CD2_CE2_diangle = geo.CB_CG_CD2_CE2_diangle

    CE1_CZ_length = geo.CE1_CZ_length
    CD1_CE1_CZ_angle = geo.CD1_CE1_CZ_angle
    CG_CD1_CE1_CZ_diangle = geo.CG_CD1_CE1_CZ_diangle

    CZ_OH_length = geo.CZ_OH_length
    CE1_CZ_OH_angle = geo.CE1_CZ_OH_angle
    CD1_CE1_CZ_OH_diangle = geo.CD1_CE1_CZ_OH_diangle

    carbon_b = calculateCoordinates(N, C, CA, CA_CB_length, C_CA_CB_angle,
                                    N_C_CA_CB_diangle)
    CB = Atom("CB", carbon_b, 0.0, 1.0, " ", " CB", 0, "C")
    carbon_g = calculateCoordinates(N, CA, CB, CB_CG_length, CA_CB_CG_angle,
                                    N_CA_CB_CG_diangle)
    CG = Atom("CG", carbon_g, 0.0, 1.0, " ", " CG", 0, "C")
    carbon_d1 = calculateCoordinates(CA, CB, CG, CG_CD1_length,
                                     CB_CG_CD1_angle, CA_CB_CG_CD1_diangle)
    CD1 = Atom("CD1", carbon_d1, 0.0, 1.0, " ", " CD1", 0, "C")
    carbon_d2 = calculateCoordinates(CA, CB, CG, CG_CD2_length,
                                     CB_CG_CD2_angle, CA_CB_CG_CD2_diangle)
    CD2 = Atom("CD2", carbon_d2, 0.0, 1.0, " ", " CD2", 0, "C")
    carbon_e1 = calculateCoordinates(CB, CG, CD1, CD1_CE1_length,
                                     CG_CD1_CE1_angle, CB_CG_CD1_CE1_diangle)
    CE1 = Atom("CE1", carbon_e1, 0.0, 1.0, " ", " CE1", 0, "C")
    carbon_e2 = calculateCoordinates(CB, CG, CD2, CD2_CE2_length,
                                     CG_CD2_CE2_angle, CB_CG_CD2_CE2_diangle)
    CE2 = Atom("CE2", carbon_e2, 0.0, 1.0, " ", " CE2", 0, "C")
    carbon_z = calculateCoordinates(CG, CD1, CE1, CE1_CZ_length,
                                    CD1_CE1_CZ_angle, CG_CD1_CE1_CZ_diangle)
    CZ = Atom("CZ", carbon_z, 0.0, 1.0, " ", " CZ", 0, "C")
    oxygen_h = calculateCoordinates(CD1, CE1, CZ, CZ_OH_length,
                                    CE1_CZ_OH_angle, CD1_CE1_CZ_OH_diangle)
    OH = Atom("OH", oxygen_h, 0.0, 1.0, " ", " OH", 0, "O")

    ##Create Residue Data S
    res = Residue((" ", segID, " "), "TYR", "    ")
    res.add(N)
    res.add(CA)
    res.add(C)
    res.add(O)
    res.add(CB)
    res.add(CG)
    res.add(CD1)
    res.add(CE1)
    res.add(CD2)
    res.add(CE2)
    res.add(CZ)
    res.add(OH)
    return res
Beispiel #10
0
def makePro(segID: int, N, CA, C, O, geo: ProGeo) -> Residue:
    """Creates a Proline residue"""
    ##R-Group
    CA_CB_length = geo.CA_CB_length
    C_CA_CB_angle = geo.C_CA_CB_angle
    N_C_CA_CB_diangle = geo.N_C_CA_CB_diangle

    CB_CG_length = geo.CB_CG_length
    CA_CB_CG_angle = geo.CA_CB_CG_angle
    N_CA_CB_CG_diangle = geo.N_CA_CB_CG_diangle

    CG_CD_length = geo.CG_CD_length
    CB_CG_CD_angle = geo.CB_CG_CD_angle
    CA_CB_CG_CD_diangle = geo.CA_CB_CG_CD_diangle

    carbon_b = calculateCoordinates(N, C, CA, CA_CB_length, C_CA_CB_angle,
                                    N_C_CA_CB_diangle)
    CB = Atom("CB", carbon_b, 0.0, 1.0, " ", " CB", 0, "C")
    carbon_g = calculateCoordinates(N, CA, CB, CB_CG_length, CA_CB_CG_angle,
                                    N_CA_CB_CG_diangle)
    CG = Atom("CG", carbon_g, 0.0, 1.0, " ", " CG", 0, "C")
    carbon_d = calculateCoordinates(CA, CB, CG, CG_CD_length, CB_CG_CD_angle,
                                    CA_CB_CG_CD_diangle)
    CD = Atom("CD", carbon_d, 0.0, 1.0, " ", " CD", 0, "C")

    res = Residue((" ", segID, " "), "PRO", "    ")

    res.add(N)
    res.add(CA)
    res.add(C)
    res.add(O)
    res.add(CB)
    res.add(CG)
    res.add(CD)

    return res
Beispiel #11
0
def makeIle(segID: int, N, CA, C, O, geo: IleGeo) -> Residue:
    """Creates an Isoleucine residue"""
    ##R-group
    CA_CB_length = geo.CA_CB_length
    C_CA_CB_angle = geo.C_CA_CB_angle
    N_C_CA_CB_diangle = geo.N_C_CA_CB_diangle

    CB_CG1_length = geo.CB_CG1_length
    CA_CB_CG1_angle = geo.CA_CB_CG1_angle
    N_CA_CB_CG1_diangle = geo.N_CA_CB_CG1_diangle

    CB_CG2_length = geo.CB_CG2_length
    CA_CB_CG2_angle = geo.CA_CB_CG2_angle
    N_CA_CB_CG2_diangle = geo.N_CA_CB_CG2_diangle

    CG1_CD1_length = geo.CG1_CD1_length
    CB_CG1_CD1_angle = geo.CB_CG1_CD1_angle
    CA_CB_CG1_CD1_diangle = geo.CA_CB_CG1_CD1_diangle

    carbon_b = calculateCoordinates(N, C, CA, CA_CB_length, C_CA_CB_angle,
                                    N_C_CA_CB_diangle)
    CB = Atom("CB", carbon_b, 0.0, 1.0, " ", " CB", 0, "C")
    carbon_g1 = calculateCoordinates(N, CA, CB, CB_CG1_length, CA_CB_CG1_angle,
                                     N_CA_CB_CG1_diangle)
    CG1 = Atom("CG1", carbon_g1, 0.0, 1.0, " ", " CG1", 0, "C")
    carbon_g2 = calculateCoordinates(N, CA, CB, CB_CG2_length, CA_CB_CG2_angle,
                                     N_CA_CB_CG2_diangle)
    CG2 = Atom("CG2", carbon_g2, 0.0, 1.0, " ", " CG2", 0, "C")
    carbon_d1 = calculateCoordinates(CA, CB, CG1, CG1_CD1_length,
                                     CB_CG1_CD1_angle, CA_CB_CG1_CD1_diangle)
    CD1 = Atom("CD1", carbon_d1, 0.0, 1.0, " ", " CD1", 0, "C")

    res = Residue((" ", segID, " "), "ILE", "    ")
    res.add(N)
    res.add(CA)
    res.add(C)
    res.add(O)
    res.add(CB)
    res.add(CG1)
    res.add(CG2)
    res.add(CD1)
    return res
def add_ACE_cap_at_res(res, next_res=None):
    if 'N' in res:
        #ADD ACE residue
        print(residue_id(res), "Adding extra ACE residue")

        print("  Adding new atom C")
        new_res = Residue((' ', res.id[1] - 1, ' '), 'ACE', 0)
        add_new_atom_to_residue(
            new_res, 'C',
            build_coords_from_ats_internal(res['N'], res['CA'], res['C'],
                                           [PEPDIS, SP2ANGLE, 180.]))

        print("  Adding new atom CH3")
        add_new_atom_to_residue(
            new_res, 'CH3',
            build_coords_trans_CA(new_res['C'], res['N'], res['CA']))

        print("  Adding new atom O")
        add_new_atom_to_residue(
            new_res, 'O',
            build_coords_SP2(OINTERNALS[0], new_res['C'], new_res['CH3'],
                             res['N']))

        # Checking position to insert new res
        pos = res.get_parent().get_list().index(res)
        res.get_parent().insert(pos, new_res)

    elif 'CA' in res:
        #Modify residue to ACE
        for atm in res.get_atoms():
            print(residue_id(res), "Replacing by ACE residue")
            if atm.id not in ('C', 'O', 'CA'):
                print(residue_id(res))
                remove_atom_from_res(res, atm.id)
                print("  Removing atom {}".format(atm.id))
            if atm.id == 'CA':
                rename_atom(res, 'CA', 'CH3')
        res.resname = 'ACE'
    else:
        # Mutate to ACE
        print(residue_id(res), "No CA, Replacing by ACE residue")
        #clean
        if next_res is None:
            print("Error")
            return True
        # Clean residue side chain
        for atm in res.get_atoms():
            if atm.id not in ('C', 'O', 'CA'):
                remove_atom_from_res(res, atm.id)
                print("  Removing unexpected atom {}".format(atm.id))
        print("  Adding new atom CA")
        add_new_atom_to_residue(
            res, 'CH3',
            build_coords_trans_CA(res['C'], next_res['N'], next_res['CA']))
        if 'O' not in res:
            print("  Adding new atom O")
            add_new_atom_to_residue(
                res, 'O',
                build_coords_SP2(OINTERNALS[0], res['C'], res['CH3'],
                                 next_res['N']))
        res.resname = 'ACE'
    return False
Beispiel #13
0
# nie jestem pewien dlaczego to nie działa. Pojawia się błąd:
# AttributeError: 'module' object has no attribute 'array'

from Bio import PDB
from Bio.PDB import PDBParser, NeighborSearch, Superimposer, PDBIO
from Bio.PDB.Atom import Atom
from Bio.PDB.Residue import Residue
from Bio.PDB.Chain import Chain
from Bio.PDB.Model import Model
from Bio.PDB.Structure import Structure

my_structure = Structure('Cytosine')
my_model = Model(0)
my_chain = Chain('A')
my_residue = Residue((' ', 1, ' '), 'C', ' ')
atoms = [{
    'name': 'N1',
    'coord': PDB.Atom.array([64.612, 45.818, 10.877], 'f'),
    'bfactor': 42.59,
    'occupancy': 1.0,
    'altloc': ' ',
    'fullname': 'N1',
    'serial_number': 1
}, {
    'name': 'C2',
    'coord': PDB.Atom.array([65.472, 46.868, 10.634], 'f'),
    'bfactor': 44.48,
    'occupancy': 1.0,
    'altloc': ' ',
    'fullname': 'C2',
    'serial_number': 2
def res_full_id(res: Residue):
    """Return full residue identifier for thoroughly comparing residues."""
    return (res.get_resname(), *res.get_id())
Beispiel #15
0
                    nargs='+',
                    help=('One or more atoms or residues in the format of '
                          '{model}/{chain}/{resnum}/{inscode}/[{atomname}]'))

args = parser.parse_args()

# MODIFIED PDB WITH FAKE "LIGAND" RESIDUE TO DEFINE POCKET
mod_pdb = args.pdb + '_mod'

# PREFIX FOR DPOCKET OUTPUT
dpocket_prefix = os.path.split(args.pdb)[-1].replace('.', '_')

structure = PDBParser().get_structure('_', args.pdb)

# FAKE RESIDUE FOR DPOCKET POCKET DEFINITION
fake = Residue(('H_STP', 9999, ' '), 'STP', 1)
atom_counter = 0

for entity in args.entities:

    entity = entity.strip('/').split('/')
    atoms = []

    # RESIDUE
    if len(entity) == 4:

        model, chain, resnum, inscode = entity
        residue = structure[int(model)][chain][(' ', int(resnum),
                                                inscode if inscode else ' ')]

        atoms = list(residue.get_list())
Beispiel #16
0
    def run(self, data, config=None, pipeline=None):
        """
        Parse a CSV file and add the ``residues`` key to `data`.

        See :py:func:`phyre_engine.component.rotamer.extract.AngleExtractor.run`
        for the format of the ``residues`` list that will be added by this
        method.
        """
        residue_csv = self.get_vals(data)

        residues = []
        with open(residue_csv, "r", newline="") as csv_fh:
            reader = csv.DictReader(csv_fh, **self.csv_params)
            for values in reader:

                # Parse out residue ID
                res_id = [' ', None, ' ']
                for i, id_elem in enumerate(self.mapping["residue"]["id"]):
                    if id_elem is not None and values[id_elem] is not None:
                        res_id[i] = values[id_elem]
                try:
                    res_id[1] = int(res_id[1])
                except ValueError as err:
                    # Try and split numeric and non-numeric parts of the ID into
                    # residue number and insertion code.
                    numeric_match = re.search(r"(\d+)", res_id[1])
                    non_numeric_match = re.search(r"(\D+)", res_id[1])

                    # Bail if the matches fail (i.e. there are junk characters)
                    if numeric_match is None or non_numeric_match is None:
                        raise err

                    res_id[1] = int(numeric_match.group(0))
                    res_id[2] = non_numeric_match.group(0)

                res_id = tuple(res_id)

                # Get residue name
                res_name = values[self.mapping["residue"]["resname"]]

                # Build Bio.PDB.Residue object
                residue = Residue(res_id, res_name, 1)

                # Get phi, psi, chi angles
                num_chi = NUM_CHI_ANGLES[res_name]
                phi = float(values[self.mapping["phi"]])
                psi = float(values[self.mapping["psi"]])

                chi = [
                    float(values[name])
                    for name in self.mapping["chi"][0:num_chi]
                ]

                # Force final chi angle into correct range
                if (res_name in self.final_chi_range
                        and chi[-1] not in self.final_chi_range[res_name]):
                    chi[-1] = (chi[-1] + 180) % 360

                residue = {
                    "torsion": (phi, psi),
                    "sidechain": Sidechain(res_name, tuple(chi)),
                    "residue": residue
                }

                # Parse remaining mapped columns
                already_parsed = ("phi", "psi", "chi", "residue")
                for to_key, from_key in self.mapping.items():
                    if to_key not in already_parsed:
                        residue[to_key] = values[from_key]

                residues.append(residue)
        data["residues"] = residues
        return data
Beispiel #17
0
def makeHis(segID: int, N, CA, C, O, geo: HisGeo) -> Residue:
    """Creates a Histidine residue"""
    ##R-Group
    CA_CB_length = geo.CA_CB_length
    C_CA_CB_angle = geo.C_CA_CB_angle
    N_C_CA_CB_diangle = geo.N_C_CA_CB_diangle

    CB_CG_length = geo.CB_CG_length
    CA_CB_CG_angle = geo.CA_CB_CG_angle
    N_CA_CB_CG_diangle = geo.N_CA_CB_CG_diangle

    CG_ND1_length = geo.CG_ND1_length
    CB_CG_ND1_angle = geo.CB_CG_ND1_angle
    CA_CB_CG_ND1_diangle = geo.CA_CB_CG_ND1_diangle

    CG_CD2_length = geo.CG_CD2_length
    CB_CG_CD2_angle = geo.CB_CG_CD2_angle
    CA_CB_CG_CD2_diangle = geo.CA_CB_CG_CD2_diangle

    ND1_CE1_length = geo.ND1_CE1_length
    CG_ND1_CE1_angle = geo.CG_ND1_CE1_angle
    CB_CG_ND1_CE1_diangle = geo.CB_CG_ND1_CE1_diangle

    CD2_NE2_length = geo.CD2_NE2_length
    CG_CD2_NE2_angle = geo.CG_CD2_NE2_angle
    CB_CG_CD2_NE2_diangle = geo.CB_CG_CD2_NE2_diangle

    carbon_b = calculateCoordinates(N, C, CA, CA_CB_length, C_CA_CB_angle,
                                    N_C_CA_CB_diangle)
    CB = Atom("CB", carbon_b, 0.0, 1.0, " ", " CB", 0, "C")
    carbon_g = calculateCoordinates(N, CA, CB, CB_CG_length, CA_CB_CG_angle,
                                    N_CA_CB_CG_diangle)
    CG = Atom("CG", carbon_g, 0.0, 1.0, " ", " CG", 0, "C")
    nitrogen_d1 = calculateCoordinates(CA, CB, CG, CG_ND1_length,
                                       CB_CG_ND1_angle, CA_CB_CG_ND1_diangle)
    ND1 = Atom("ND1", nitrogen_d1, 0.0, 1.0, " ", " ND1", 0, "N")
    carbon_d2 = calculateCoordinates(CA, CB, CG, CG_CD2_length,
                                     CB_CG_CD2_angle, CA_CB_CG_CD2_diangle)
    CD2 = Atom("CD2", carbon_d2, 0.0, 1.0, " ", " CD2", 0, "C")
    carbon_e1 = calculateCoordinates(CB, CG, ND1, ND1_CE1_length,
                                     CG_ND1_CE1_angle, CB_CG_ND1_CE1_diangle)
    CE1 = Atom("CE1", carbon_e1, 0.0, 1.0, " ", " CE1", 0, "C")
    nitrogen_e2 = calculateCoordinates(CB, CG, CD2, CD2_NE2_length,
                                       CG_CD2_NE2_angle, CB_CG_CD2_NE2_diangle)
    NE2 = Atom("NE2", nitrogen_e2, 0.0, 1.0, " ", " NE2", 0, "N")

    res = Residue((" ", segID, " "), "HIS", "    ")
    res.add(N)
    res.add(CA)
    res.add(C)
    res.add(O)
    res.add(CB)
    res.add(CG)
    res.add(ND1)
    res.add(CD2)
    res.add(CE1)
    res.add(NE2)
    return res
Beispiel #18
0
def makeLeu(segID: int, N, CA, C, O, geo: LeuGeo) -> Residue:
    """Creates a Leucine residue"""
    ##R-Group
    CA_CB_length = geo.CA_CB_length
    C_CA_CB_angle = geo.C_CA_CB_angle
    N_C_CA_CB_diangle = geo.N_C_CA_CB_diangle

    CB_CG_length = geo.CB_CG_length
    CA_CB_CG_angle = geo.CA_CB_CG_angle
    N_CA_CB_CG_diangle = geo.N_CA_CB_CG_diangle

    CG_CD1_length = geo.CG_CD1_length
    CB_CG_CD1_angle = geo.CB_CG_CD1_angle
    CA_CB_CG_CD1_diangle = geo.CA_CB_CG_CD1_diangle

    CG_CD2_length = geo.CG_CD2_length
    CB_CG_CD2_angle = geo.CB_CG_CD2_angle
    CA_CB_CG_CD2_diangle = geo.CA_CB_CG_CD2_diangle

    carbon_b = calculateCoordinates(N, C, CA, CA_CB_length, C_CA_CB_angle,
                                    N_C_CA_CB_diangle)
    CB = Atom("CB", carbon_b, 0.0, 1.0, " ", " CB", 0, "C")
    carbon_g1 = calculateCoordinates(N, CA, CB, CB_CG_length, CA_CB_CG_angle,
                                     N_CA_CB_CG_diangle)
    CG = Atom("CG", carbon_g1, 0.0, 1.0, " ", " CG", 0, "C")
    carbon_d1 = calculateCoordinates(CA, CB, CG, CG_CD1_length,
                                     CB_CG_CD1_angle, CA_CB_CG_CD1_diangle)
    CD1 = Atom("CD1", carbon_d1, 0.0, 1.0, " ", " CD1", 0, "C")
    carbon_d2 = calculateCoordinates(CA, CB, CG, CG_CD2_length,
                                     CB_CG_CD2_angle, CA_CB_CG_CD2_diangle)
    CD2 = Atom("CD2", carbon_d2, 0.0, 1.0, " ", " CD2", 0, "C")

    res = Residue((" ", segID, " "), "LEU", "    ")
    res.add(N)
    res.add(CA)
    res.add(C)
    res.add(O)
    res.add(CB)
    res.add(CG)
    res.add(CD1)
    res.add(CD2)
    return res
Beispiel #19
0
def makePhe(segID: int, N, CA, C, O, geo: PheGeo) -> Residue:
    """Creates a Phenylalanine residue"""
    ##R-Group
    CA_CB_length = geo.CA_CB_length
    C_CA_CB_angle = geo.C_CA_CB_angle
    N_C_CA_CB_diangle = geo.N_C_CA_CB_diangle

    CB_CG_length = geo.CB_CG_length
    CA_CB_CG_angle = geo.CA_CB_CG_angle
    N_CA_CB_CG_diangle = geo.N_CA_CB_CG_diangle

    CG_CD1_length = geo.CG_CD1_length
    CB_CG_CD1_angle = geo.CB_CG_CD1_angle
    CA_CB_CG_CD1_diangle = geo.CA_CB_CG_CD1_diangle

    CG_CD2_length = geo.CG_CD2_length
    CB_CG_CD2_angle = geo.CB_CG_CD2_angle
    CA_CB_CG_CD2_diangle = geo.CA_CB_CG_CD2_diangle

    CD1_CE1_length = geo.CD1_CE1_length
    CG_CD1_CE1_angle = geo.CG_CD1_CE1_angle
    CB_CG_CD1_CE1_diangle = geo.CB_CG_CD1_CE1_diangle

    CD2_CE2_length = geo.CD2_CE2_length
    CG_CD2_CE2_angle = geo.CG_CD2_CE2_angle
    CB_CG_CD2_CE2_diangle = geo.CB_CG_CD2_CE2_diangle

    CE1_CZ_length = geo.CE1_CZ_length
    CD1_CE1_CZ_angle = geo.CD1_CE1_CZ_angle
    CG_CD1_CE1_CZ_diangle = geo.CG_CD1_CE1_CZ_diangle

    carbon_b = calculateCoordinates(N, C, CA, CA_CB_length, C_CA_CB_angle,
                                    N_C_CA_CB_diangle)
    CB = Atom("CB", carbon_b, 0.0, 1.0, " ", " CB", 0, "C")
    carbon_g = calculateCoordinates(N, CA, CB, CB_CG_length, CA_CB_CG_angle,
                                    N_CA_CB_CG_diangle)
    CG = Atom("CG", carbon_g, 0.0, 1.0, " ", " CG", 0, "C")
    carbon_d1 = calculateCoordinates(CA, CB, CG, CG_CD1_length,
                                     CB_CG_CD1_angle, CA_CB_CG_CD1_diangle)
    CD1 = Atom("CD1", carbon_d1, 0.0, 1.0, " ", " CD1", 0, "C")
    carbon_d2 = calculateCoordinates(CA, CB, CG, CG_CD2_length,
                                     CB_CG_CD2_angle, CA_CB_CG_CD2_diangle)
    CD2 = Atom("CD2", carbon_d2, 0.0, 1.0, " ", " CD2", 0, "C")
    carbon_e1 = calculateCoordinates(CB, CG, CD1, CD1_CE1_length,
                                     CG_CD1_CE1_angle, CB_CG_CD1_CE1_diangle)
    CE1 = Atom("CE1", carbon_e1, 0.0, 1.0, " ", " CE1", 0, "C")
    carbon_e2 = calculateCoordinates(CB, CG, CD2, CD2_CE2_length,
                                     CG_CD2_CE2_angle, CB_CG_CD2_CE2_diangle)
    CE2 = Atom("CE2", carbon_e2, 0.0, 1.0, " ", " CE2", 0, "C")
    carbon_z = calculateCoordinates(CG, CD1, CE1, CE1_CZ_length,
                                    CD1_CE1_CZ_angle, CG_CD1_CE1_CZ_diangle)
    CZ = Atom("CZ", carbon_z, 0.0, 1.0, " ", " CZ", 0, "C")

    res = Residue((" ", segID, " "), "PHE", "    ")
    res.add(N)
    res.add(CA)
    res.add(C)
    res.add(O)
    res.add(CB)
    res.add(CG)
    res.add(CD1)
    res.add(CE1)
    res.add(CD2)
    res.add(CE2)
    res.add(CZ)
    return res
Beispiel #20
0
def makeThr(segID: int, N, CA, C, O, geo: ThrGeo) -> Residue:
    """Creates a Threonine residue"""
    ##R-Group
    CA_CB_length = geo.CA_CB_length
    C_CA_CB_angle = geo.C_CA_CB_angle
    N_C_CA_CB_diangle = geo.N_C_CA_CB_diangle

    CB_OG1_length = geo.CB_OG1_length
    CA_CB_OG1_angle = geo.CA_CB_OG1_angle
    N_CA_CB_OG1_diangle = geo.N_CA_CB_OG1_diangle

    CB_CG2_length = geo.CB_CG2_length
    CA_CB_CG2_angle = geo.CA_CB_CG2_angle
    N_CA_CB_CG2_diangle = geo.N_CA_CB_CG2_diangle

    carbon_b = calculateCoordinates(N, C, CA, CA_CB_length, C_CA_CB_angle,
                                    N_C_CA_CB_diangle)
    CB = Atom("CB", carbon_b, 0.0, 1.0, " ", " CB", 0, "C")
    oxygen_g1 = calculateCoordinates(N, CA, CB, CB_OG1_length, CA_CB_OG1_angle,
                                     N_CA_CB_OG1_diangle)
    OG1 = Atom("OG1", oxygen_g1, 0.0, 1.0, " ", " OG1", 0, "O")
    carbon_g2 = calculateCoordinates(N, CA, CB, CB_CG2_length, CA_CB_CG2_angle,
                                     N_CA_CB_CG2_diangle)
    CG2 = Atom("CG2", carbon_g2, 0.0, 1.0, " ", " CG2", 0, "C")

    res = Residue((" ", segID, " "), "THR", "    ")
    res.add(N)
    res.add(CA)
    res.add(C)
    res.add(O)
    res.add(CB)
    res.add(OG1)
    res.add(CG2)
    return res
Beispiel #21
0
def makeTrp(segID: int, N, CA, C, O, geo: TrpGeo) -> Residue:
    """Creates a Tryptophan residue"""
    ##R-Group
    CA_CB_length = geo.CA_CB_length
    C_CA_CB_angle = geo.C_CA_CB_angle
    N_C_CA_CB_diangle = geo.N_C_CA_CB_diangle

    CB_CG_length = geo.CB_CG_length
    CA_CB_CG_angle = geo.CA_CB_CG_angle
    N_CA_CB_CG_diangle = geo.N_CA_CB_CG_diangle

    CG_CD1_length = geo.CG_CD1_length
    CB_CG_CD1_angle = geo.CB_CG_CD1_angle
    CA_CB_CG_CD1_diangle = geo.CA_CB_CG_CD1_diangle

    CG_CD2_length = geo.CG_CD2_length
    CB_CG_CD2_angle = geo.CB_CG_CD2_angle
    CA_CB_CG_CD2_diangle = geo.CA_CB_CG_CD2_diangle

    CD1_NE1_length = geo.CD1_NE1_length
    CG_CD1_NE1_angle = geo.CG_CD1_NE1_angle
    CB_CG_CD1_NE1_diangle = geo.CB_CG_CD1_NE1_diangle

    CD2_CE2_length = geo.CD2_CE2_length
    CG_CD2_CE2_angle = geo.CG_CD2_CE2_angle
    CB_CG_CD2_CE2_diangle = geo.CB_CG_CD2_CE2_diangle

    CD2_CE3_length = geo.CD2_CE3_length
    CG_CD2_CE3_angle = geo.CG_CD2_CE3_angle
    CB_CG_CD2_CE3_diangle = geo.CB_CG_CD2_CE3_diangle

    CE2_CZ2_length = geo.CE2_CZ2_length
    CD2_CE2_CZ2_angle = geo.CD2_CE2_CZ2_angle
    CG_CD2_CE2_CZ2_diangle = geo.CG_CD2_CE2_CZ2_diangle

    CE3_CZ3_length = geo.CE3_CZ3_length
    CD2_CE3_CZ3_angle = geo.CD2_CE3_CZ3_angle
    CG_CD2_CE3_CZ3_diangle = geo.CG_CD2_CE3_CZ3_diangle

    CZ2_CH2_length = geo.CZ2_CH2_length
    CE2_CZ2_CH2_angle = geo.CE2_CZ2_CH2_angle
    CD2_CE2_CZ2_CH2_diangle = geo.CD2_CE2_CZ2_CH2_diangle

    carbon_b = calculateCoordinates(N, C, CA, CA_CB_length, C_CA_CB_angle,
                                    N_C_CA_CB_diangle)
    CB = Atom("CB", carbon_b, 0.0, 1.0, " ", " CB", 0, "C")
    carbon_g = calculateCoordinates(N, CA, CB, CB_CG_length, CA_CB_CG_angle,
                                    N_CA_CB_CG_diangle)
    CG = Atom("CG", carbon_g, 0.0, 1.0, " ", " CG", 0, "C")
    carbon_d1 = calculateCoordinates(CA, CB, CG, CG_CD1_length,
                                     CB_CG_CD1_angle, CA_CB_CG_CD1_diangle)
    CD1 = Atom("CD1", carbon_d1, 0.0, 1.0, " ", " CD1", 0, "C")
    carbon_d2 = calculateCoordinates(CA, CB, CG, CG_CD2_length,
                                     CB_CG_CD2_angle, CA_CB_CG_CD2_diangle)
    CD2 = Atom("CD2", carbon_d2, 0.0, 1.0, " ", " CD2", 0, "C")
    nitrogen_e1 = calculateCoordinates(CB, CG, CD1, CD1_NE1_length,
                                       CG_CD1_NE1_angle, CB_CG_CD1_NE1_diangle)
    NE1 = Atom("NE1", nitrogen_e1, 0.0, 1.0, " ", " NE1", 0, "N")
    carbon_e2 = calculateCoordinates(CB, CG, CD2, CD2_CE2_length,
                                     CG_CD2_CE2_angle, CB_CG_CD2_CE2_diangle)
    CE2 = Atom("CE2", carbon_e2, 0.0, 1.0, " ", " CE2", 0, "C")
    carbon_e3 = calculateCoordinates(CB, CG, CD2, CD2_CE3_length,
                                     CG_CD2_CE3_angle, CB_CG_CD2_CE3_diangle)
    CE3 = Atom("CE3", carbon_e3, 0.0, 1.0, " ", " CE3", 0, "C")

    carbon_z2 = calculateCoordinates(CG, CD2, CE2, CE2_CZ2_length,
                                     CD2_CE2_CZ2_angle, CG_CD2_CE2_CZ2_diangle)
    CZ2 = Atom("CZ2", carbon_z2, 0.0, 1.0, " ", " CZ2", 0, "C")

    carbon_z3 = calculateCoordinates(CG, CD2, CE3, CE3_CZ3_length,
                                     CD2_CE3_CZ3_angle, CG_CD2_CE3_CZ3_diangle)
    CZ3 = Atom("CZ3", carbon_z3, 0.0, 1.0, " ", " CZ3", 0, "C")

    carbon_h2 = calculateCoordinates(CD2, CE2, CZ2, CZ2_CH2_length,
                                     CE2_CZ2_CH2_angle,
                                     CD2_CE2_CZ2_CH2_diangle)
    CH2 = Atom("CH2", carbon_h2, 0.0, 1.0, " ", " CH2", 0, "C")

    ##Create Residue DS
    res = Residue((" ", segID, " "), "TRP", "    ")
    res.add(N)
    res.add(CA)
    res.add(C)
    res.add(O)
    res.add(CB)
    res.add(CG)
    res.add(CD1)
    res.add(CD2)

    res.add(NE1)
    res.add(CE2)
    res.add(CE3)

    res.add(CZ2)
    res.add(CZ3)

    res.add(CH2)
    return res
Beispiel #22
0
def makeArg(segID: int, N, CA, C, O, geo: ArgGeo) -> Residue:
    """Creates an Arginie residue"""
    ##R-Group
    CA_CB_length = geo.CA_CB_length
    C_CA_CB_angle = geo.C_CA_CB_angle
    N_C_CA_CB_diangle = geo.N_C_CA_CB_diangle

    CB_CG_length = geo.CB_CG_length
    CA_CB_CG_angle = geo.CA_CB_CG_angle
    N_CA_CB_CG_diangle = geo.N_CA_CB_CG_diangle

    CG_CD_length = geo.CG_CD_length
    CB_CG_CD_angle = geo.CB_CG_CD_angle
    CA_CB_CG_CD_diangle = geo.CA_CB_CG_CD_diangle

    CD_NE_length = geo.CD_NE_length
    CG_CD_NE_angle = geo.CG_CD_NE_angle
    CB_CG_CD_NE_diangle = geo.CB_CG_CD_NE_diangle

    NE_CZ_length = geo.NE_CZ_length
    CD_NE_CZ_angle = geo.CD_NE_CZ_angle
    CG_CD_NE_CZ_diangle = geo.CG_CD_NE_CZ_diangle

    CZ_NH1_length = geo.CZ_NH1_length
    NE_CZ_NH1_angle = geo.NE_CZ_NH1_angle
    CD_NE_CZ_NH1_diangle = geo.CD_NE_CZ_NH1_diangle

    CZ_NH2_length = geo.CZ_NH2_length
    NE_CZ_NH2_angle = geo.NE_CZ_NH2_angle
    CD_NE_CZ_NH2_diangle = geo.CD_NE_CZ_NH2_diangle

    carbon_b = calculateCoordinates(N, C, CA, CA_CB_length, C_CA_CB_angle,
                                    N_C_CA_CB_diangle)
    CB = Atom("CB", carbon_b, 0.0, 1.0, " ", " CB", 0, "C")
    carbon_g = calculateCoordinates(N, CA, CB, CB_CG_length, CA_CB_CG_angle,
                                    N_CA_CB_CG_diangle)
    CG = Atom("CG", carbon_g, 0.0, 1.0, " ", " CG", 0, "C")
    carbon_d = calculateCoordinates(CA, CB, CG, CG_CD_length, CB_CG_CD_angle,
                                    CA_CB_CG_CD_diangle)
    CD = Atom("CD", carbon_d, 0.0, 1.0, " ", " CD", 0, "C")
    nitrogen_e = calculateCoordinates(CB, CG, CD, CD_NE_length, CG_CD_NE_angle,
                                      CB_CG_CD_NE_diangle)
    NE = Atom("NE", nitrogen_e, 0.0, 1.0, " ", " NE", 0, "N")
    carbon_z = calculateCoordinates(CG, CD, NE, NE_CZ_length, CD_NE_CZ_angle,
                                    CG_CD_NE_CZ_diangle)
    CZ = Atom("CZ", carbon_z, 0.0, 1.0, " ", " CZ", 0, "C")
    nitrogen_h1 = calculateCoordinates(CD, NE, CZ, CZ_NH1_length,
                                       NE_CZ_NH1_angle, CD_NE_CZ_NH1_diangle)
    NH1 = Atom("NH1", nitrogen_h1, 0.0, 1.0, " ", " NH1", 0, "N")
    nitrogen_h2 = calculateCoordinates(CD, NE, CZ, CZ_NH2_length,
                                       NE_CZ_NH2_angle, CD_NE_CZ_NH2_diangle)
    NH2 = Atom("NH2", nitrogen_h2, 0.0, 1.0, " ", " NH2", 0, "N")

    res = Residue((" ", segID, " "), "ARG", "    ")
    res.add(N)
    res.add(CA)
    res.add(C)
    res.add(O)
    res.add(CB)
    res.add(CG)
    res.add(CD)
    res.add(NE)
    res.add(CZ)
    res.add(NH1)
    res.add(NH2)
    return res
Beispiel #23
0
 def from_bio_residue(
         cls, residue: Residue,
         residue_id_mapping: 'BiopythonToMmcifResidueIds.Mapping'):
     return ResidueId(
         residue_id_mapping.to_label_seq_id(BioResidueId(*residue.id)),
         residue.get_parent().id)
Beispiel #24
0
def makeLys(segID: int, N, CA, C, O, geo: LysGeo) -> Residue:
    """Creates a Lysine residue"""
    ##R-Group
    CA_CB_length = geo.CA_CB_length
    C_CA_CB_angle = geo.C_CA_CB_angle
    N_C_CA_CB_diangle = geo.N_C_CA_CB_diangle

    CB_CG_length = geo.CB_CG_length
    CA_CB_CG_angle = geo.CA_CB_CG_angle
    N_CA_CB_CG_diangle = geo.N_CA_CB_CG_diangle

    CG_CD_length = geo.CG_CD_length
    CB_CG_CD_angle = geo.CB_CG_CD_angle
    CA_CB_CG_CD_diangle = geo.CA_CB_CG_CD_diangle

    CD_CE_length = geo.CD_CE_length
    CG_CD_CE_angle = geo.CG_CD_CE_angle
    CB_CG_CD_CE_diangle = geo.CB_CG_CD_CE_diangle

    CE_NZ_length = geo.CE_NZ_length
    CD_CE_NZ_angle = geo.CD_CE_NZ_angle
    CG_CD_CE_NZ_diangle = geo.CG_CD_CE_NZ_diangle

    carbon_b = calculateCoordinates(N, C, CA, CA_CB_length, C_CA_CB_angle,
                                    N_C_CA_CB_diangle)
    CB = Atom("CB", carbon_b, 0.0, 1.0, " ", " CB", 0, "C")
    carbon_g = calculateCoordinates(N, CA, CB, CB_CG_length, CA_CB_CG_angle,
                                    N_CA_CB_CG_diangle)
    CG = Atom("CG", carbon_g, 0.0, 1.0, " ", " CG", 0, "C")
    carbon_d = calculateCoordinates(CA, CB, CG, CG_CD_length, CB_CG_CD_angle,
                                    CA_CB_CG_CD_diangle)
    CD = Atom("CD", carbon_d, 0.0, 1.0, " ", " CD", 0, "C")
    carbon_e = calculateCoordinates(CB, CG, CD, CD_CE_length, CG_CD_CE_angle,
                                    CB_CG_CD_CE_diangle)
    CE = Atom("CE", carbon_e, 0.0, 1.0, " ", " CE", 0, "C")
    nitrogen_z = calculateCoordinates(CG, CD, CE, CE_NZ_length, CD_CE_NZ_angle,
                                      CG_CD_CE_NZ_diangle)
    NZ = Atom("NZ", nitrogen_z, 0.0, 1.0, " ", " NZ", 0, "N")

    res = Residue((" ", segID, " "), "LYS", "    ")
    res.add(N)
    res.add(CA)
    res.add(C)
    res.add(O)
    res.add(CB)
    res.add(CG)
    res.add(CD)
    res.add(CE)
    res.add(NZ)
    return res
Beispiel #25
0
def get_alpha_carbon(res:Residue)->Atom: 
    """Get the first(only) alpha carbon in the residue or an exception"""
    alpha_carbons: List[Atom] = list( filter(lambda internal_atom: internal_atom.get_id() =='CA', res.get_atoms()) )
    if len(alpha_carbons) != 1:
        raise Exception(f"Alpha carbon not found or duplicated in residue {res.get_full_id()}")
    return alpha_carbons[0]
Beispiel #26
0
def calculateCoordinates(refA: Residue, refB: Residue, refC: Residue, L: float,
                         ang: float, di: float) -> np.ndarray:
    AV = refA.get_vector()
    BV = refB.get_vector()
    CV = refC.get_vector()

    CA = AV - CV
    CB = BV - CV

    ##CA vector
    AX = CA[0]
    AY = CA[1]
    AZ = CA[2]

    ##CB vector
    BX = CB[0]
    BY = CB[1]
    BZ = CB[2]

    ##Plane Parameters
    A = (AY * BZ) - (AZ * BY)
    B = (AZ * BX) - (AX * BZ)
    G = (AX * BY) - (AY * BX)

    ##Dot Product Constant
    F = math.sqrt(BX * BX + BY * BY + BZ * BZ) * L * math.cos(
        ang * (math.pi / 180.0))

    ##Constants
    const = math.sqrt(
        math.pow((B * BZ - BY * G), 2) *
        (-(F * F) * (A * A + B * B + G * G) +
         (B * B * (BX * BX + BZ * BZ) + A * A * (BY * BY + BZ * BZ) -
          (2 * A * BX * BZ * G) + (BX * BX + BY * BY) * G * G - (2 * B * BY) *
          (A * BX + BZ * G)) * L * L))
    denom = ((B * B) * (BX * BX + BZ * BZ) + (A * A) * (BY * BY + BZ * BZ) -
             (2 * A * BX * BZ * G) + (BX * BX + BY * BY) * (G * G) -
             (2 * B * BY) * (A * BX + BZ * G))

    X = ((B * B * BX * F) - (A * B * BY * F) + (F * G) *
         (-A * BZ + BX * G) + const) / denom

    if (B == 0 or BZ == 0) and (BY == 0 or G == 0):
        const1 = math.sqrt(G * G * (-A * A * X * X + (B * B + G * G) *
                                    (L - X) * (L + X)))
        Y = ((-A * B * X) + const1) / (B * B + G * G)
        Z = -(A * G * G * X + B * const1) / (G * (B * B + G * G))
    else:
        Y = ((A * A * BY * F) * (B * BZ - BY * G) + G *
             (-F * math.pow(B * BZ - BY * G, 2) + BX * const) - A *
             (B * B * BX * BZ * F - B * BX * BY * F * G + BZ * const)) / (
                 (B * BZ - BY * G) * denom)
        Z = ((A * A * BZ * F) * (B * BZ - BY * G) +
             (B * F) * math.pow(B * BZ - BY * G, 2) + (A * BX * F * G) *
             (-B * BZ + BY * G) - B * BX * const + A * BY * const) / (
                 (B * BZ - BY * G) * denom)

    # Get the new Vector from the origin
    D = Vector(X, Y, Z) + CV
    with warnings.catch_warnings():
        # ignore inconsequential warning
        warnings.simplefilter("ignore")
        temp = calc_dihedral(AV, BV, CV, D) * (180.0 / math.pi)

    di = di - temp
    rot = rotaxis(math.pi * (di / 180.0), CV - BV)
    D = (D - BV).left_multiply(rot) + BV

    return D.get_array()
Beispiel #27
0
points = ReadXYZ ( args['src'], args['scale'])
if ( args['bfactor'] is not None):
    print "read bfactor file column %d" % args['column']
    bfactors = ReadBfactor(args['bfactor'],args['column'])
else:
    bfactors = zeros(len(points))

model = Model(1)
chain = Chain("A")
structure = Structure("ref")

num_count = 0
for i in range(0,shape(points)[0]):
    num_count = num_count +1
    res_id = (' ',num_count,' ')
    residue = Residue(res_id,'ALA',' ')
    cur_coord = tuple(points[i])
    bfactor = bfactors[i]
    atom = Atom('CA',cur_coord,bfactor,0,' ','CA',num_count,'C')
    residue.add(atom)
    chain.add(residue)

model.add(chain)
structure.add(model)
# --------------------------------------------------------------------
io=PDBIO()
io.set_structure(structure)
if ( args['dst'] is None):
    fn = sys.stdout
    io.save(fn)
    if ( args['link'] ):
Beispiel #28
0
def makeAsn(segID, N, CA, C, O, geo):
    """Creates an Asparagine residue"""
    ##R-Group
    CA_CB_length = geo.CA_CB_length
    C_CA_CB_angle = geo.C_CA_CB_angle
    N_C_CA_CB_diangle = geo.N_C_CA_CB_diangle

    CB_CG_length = geo.CB_CG_length
    CA_CB_CG_angle = geo.CA_CB_CG_angle
    N_CA_CB_CG_diangle = geo.N_CA_CB_CG_diangle

    CG_OD1_length = geo.CG_OD1_length
    CB_CG_OD1_angle = geo.CB_CG_OD1_angle
    CA_CB_CG_OD1_diangle = geo.CA_CB_CG_OD1_diangle

    CG_ND2_length = geo.CG_ND2_length
    CB_CG_ND2_angle = geo.CB_CG_ND2_angle
    CA_CB_CG_ND2_diangle = geo.CA_CB_CG_ND2_diangle

    carbon_b = calculateCoordinates(N, C, CA, CA_CB_length, C_CA_CB_angle,
                                    N_C_CA_CB_diangle)
    CB = Atom("CB", carbon_b, 0.0, 1.0, " ", " CB", 0, "C")
    carbon_g = calculateCoordinates(N, CA, CB, CB_CG_length, CA_CB_CG_angle,
                                    N_CA_CB_CG_diangle)
    CG = Atom("CG", carbon_g, 0.0, 1.0, " ", " CG", 0, "C")
    oxygen_d1 = calculateCoordinates(CA, CB, CG, CG_OD1_length,
                                     CB_CG_OD1_angle, CA_CB_CG_OD1_diangle)
    OD1 = Atom("OD1", oxygen_d1, 0.0, 1.0, " ", " OD1", 0, "O")
    nitrogen_d2 = calculateCoordinates(CA, CB, CG, CG_ND2_length,
                                       CB_CG_ND2_angle, CA_CB_CG_ND2_diangle)
    ND2 = Atom("ND2", nitrogen_d2, 0.0, 1.0, " ", " ND2", 0, "N")
    res = Residue((" ", segID, " "), "ASN", "    ")

    res.add(N)
    res.add(CA)
    res.add(C)
    res.add(O)
    res.add(CB)
    res.add(CG)
    res.add(OD1)
    res.add(ND2)
    return res
Beispiel #29
0
 def belongs_to_ptc(x: Residue):
     return int(x.get_id()[1]) in ptc_reslist
Beispiel #30
0
def makeGln(segID: int, N, CA, C, O, geo: GlnGeo) -> Residue:
    """Creates a Glutamine residue"""
    ##R-Group
    CA_CB_length = geo.CA_CB_length
    C_CA_CB_angle = geo.C_CA_CB_angle
    N_C_CA_CB_diangle = geo.N_C_CA_CB_diangle

    CB_CG_length = geo.CB_CG_length
    CA_CB_CG_angle = geo.CA_CB_CG_angle
    N_CA_CB_CG_diangle = geo.N_CA_CB_CG_diangle

    CG_CD_length = geo.CG_CD_length
    CB_CG_CD_angle = geo.CB_CG_CD_angle
    CA_CB_CG_CD_diangle = geo.CA_CB_CG_CD_diangle

    CD_OE1_length = geo.CD_OE1_length
    CG_CD_OE1_angle = geo.CG_CD_OE1_angle
    CB_CG_CD_OE1_diangle = geo.CB_CG_CD_OE1_diangle

    CD_NE2_length = geo.CD_NE2_length
    CG_CD_NE2_angle = geo.CG_CD_NE2_angle
    CB_CG_CD_NE2_diangle = geo.CB_CG_CD_NE2_diangle

    carbon_b = calculateCoordinates(N, C, CA, CA_CB_length, C_CA_CB_angle,
                                    N_C_CA_CB_diangle)
    CB = Atom("CB", carbon_b, 0.0, 1.0, " ", " CB", 0, "C")
    carbon_g = calculateCoordinates(N, CA, CB, CB_CG_length, CA_CB_CG_angle,
                                    N_CA_CB_CG_diangle)
    CG = Atom("CG", carbon_g, 0.0, 1.0, " ", " CG", 0, "C")
    carbon_d = calculateCoordinates(CA, CB, CG, CG_CD_length, CB_CG_CD_angle,
                                    CA_CB_CG_CD_diangle)
    CD = Atom("CD", carbon_d, 0.0, 1.0, " ", " CD", 0, "C")
    oxygen_e1 = calculateCoordinates(CB, CG, CD, CD_OE1_length,
                                     CG_CD_OE1_angle, CB_CG_CD_OE1_diangle)
    OE1 = Atom("OE1", oxygen_e1, 0.0, 1.0, " ", " OE1", 0, "O")
    nitrogen_e2 = calculateCoordinates(CB, CG, CD, CD_NE2_length,
                                       CG_CD_NE2_angle, CB_CG_CD_NE2_diangle)
    NE2 = Atom("NE2", nitrogen_e2, 0.0, 1.0, " ", " NE2", 0, "N")

    ##Create Residue DS
    res = Residue((" ", segID, " "), "GLN", "    ")

    res.add(N)
    res.add(CA)
    res.add(C)
    res.add(O)
    res.add(CB)
    res.add(CG)
    res.add(CD)
    res.add(OE1)
    res.add(NE2)
    return res
Beispiel #31
0
    def init_residue(self, resname, field, resseq, icode):
        """Create a new Residue object.

        Arguments:
         - resname - string, e.g. "ASN"
         - field - hetero flag, "W" for waters, "H" for
           hetero residues, otherwise blank.
         - resseq - int, sequence identifier
         - icode - string, insertion code

        """
        if field != " ":
            if field == "H":
                # The hetero field consists of H_ + the residue name (e.g. H_FUC)
                field = "H_" + resname
        res_id = (field, resseq, icode)
        if field == " ":
            if self.chain.has_id(res_id):
                # There already is a residue with the id (field, resseq, icode).
                # This only makes sense in the case of a point mutation.
                warnings.warn(
                    "WARNING: Residue ('%s', %i, '%s') redefined at line %i."
                    % (field, resseq, icode, self.line_counter),
                    PDBConstructionWarning,
                )
                duplicate_residue = self.chain[res_id]
                if duplicate_residue.is_disordered() == 2:
                    # The residue in the chain is a DisorderedResidue object.
                    # So just add the last Residue object.
                    if duplicate_residue.disordered_has_id(resname):
                        # The residue was already made
                        self.residue = duplicate_residue
                        duplicate_residue.disordered_select(resname)
                    else:
                        # Make a new residue and add it to the already
                        # present DisorderedResidue
                        new_residue = Residue(res_id, resname, self.segid)
                        duplicate_residue.disordered_add(new_residue)
                        self.residue = duplicate_residue
                        return
                else:
                    if resname == duplicate_residue.resname:
                        warnings.warn(
                            "WARNING: Residue ('%s', %i, '%s','%s') already defined "
                            "with the same name at line  %i."
                            % (field, resseq, icode, resname, self.line_counter),
                            PDBConstructionWarning,
                        )
                        self.residue = duplicate_residue
                        return
                    # Make a new DisorderedResidue object and put all
                    # the Residue objects with the id (field, resseq, icode) in it.
                    # These residues each should have non-blank altlocs for all their atoms.
                    # If not, the PDB file probably contains an error.
                    if not self._is_completely_disordered(duplicate_residue):
                        # if this exception is ignored, a residue will be missing
                        self.residue = None
                        raise PDBConstructionException(
                            "Blank altlocs in duplicate residue %s ('%s', %i, '%s')"
                            % (resname, field, resseq, icode)
                        )
                    self.chain.detach_child(res_id)
                    new_residue = Residue(res_id, resname, self.segid)
                    disordered_residue = DisorderedResidue(res_id)
                    self.chain.add(disordered_residue)
                    disordered_residue.disordered_add(duplicate_residue)
                    disordered_residue.disordered_add(new_residue)
                    self.residue = disordered_residue
                    return
        self.residue = Residue(res_id, resname, self.segid)
        self.chain.add(self.residue)
Beispiel #32
0
def makeMet(segID: int, N, CA, C, O, geo: MetGeo) -> Residue:
    """Creates a Methionine residue"""
    ##R-Group
    CA_CB_length = geo.CA_CB_length
    C_CA_CB_angle = geo.C_CA_CB_angle
    N_C_CA_CB_diangle = geo.N_C_CA_CB_diangle

    CB_CG_length = geo.CB_CG_length
    CA_CB_CG_angle = geo.CA_CB_CG_angle
    N_CA_CB_CG_diangle = geo.N_CA_CB_CG_diangle

    CG_SD_length = geo.CG_SD_length
    CB_CG_SD_angle = geo.CB_CG_SD_angle
    CA_CB_CG_SD_diangle = geo.CA_CB_CG_SD_diangle

    SD_CE_length = geo.SD_CE_length
    CG_SD_CE_angle = geo.CG_SD_CE_angle
    CB_CG_SD_CE_diangle = geo.CB_CG_SD_CE_diangle

    carbon_b = calculateCoordinates(N, C, CA, CA_CB_length, C_CA_CB_angle,
                                    N_C_CA_CB_diangle)
    CB = Atom("CB", carbon_b, 0.0, 1.0, " ", " CB", 0, "C")
    carbon_g = calculateCoordinates(N, CA, CB, CB_CG_length, CA_CB_CG_angle,
                                    N_CA_CB_CG_diangle)
    CG = Atom("CG", carbon_g, 0.0, 1.0, " ", " CG", 0, "C")
    sulfur_d = calculateCoordinates(CA, CB, CG, CG_SD_length, CB_CG_SD_angle,
                                    CA_CB_CG_SD_diangle)
    SD = Atom("SD", sulfur_d, 0.0, 1.0, " ", " SD", 0, "S")
    carbon_e = calculateCoordinates(CB, CG, SD, SD_CE_length, CG_SD_CE_angle,
                                    CB_CG_SD_CE_diangle)
    CE = Atom("CE", carbon_e, 0.0, 1.0, " ", " CE", 0, "C")

    res = Residue((" ", segID, " "), "MET", "    ")
    res.add(N)
    res.add(CA)
    res.add(C)
    res.add(O)
    res.add(CB)
    res.add(CG)
    res.add(SD)
    res.add(CE)
    return res