def sequence(self, xtable=MU.xxDic): """ Amino acid sequence in one letter code. @param xtable: dict {str:str}, additional residue:single_letter mapping for non-standard residues (default molUtils.xxDic) @type xtable: dict @return: 1-letter-code AA sequence (based on first atom of each res). @rtype: str """ l = self.residues['name'] return ''.join(MU.singleAA(l, xtable))
def createResidue( self, res, atoms ): """ """ r = AmberResidueType( **res ) r.letter = M.singleAA( [r.code] )[0] r.xyz = atoms['xyz'] n = len(r.xyz) for key in B.PDBModel.PDB_KEYS: r[key] = n * [''] r['type'] = ['ATOM'] * n r['residue_name'] = [r.code] * n r['residue_number'] = [1] * n r['occupancy'] = [1.0] * n r['after_ter'] = [0] * n r['temperature_factor'] = [0] * n del atoms['xyz'] for key, profile in atoms.items(): r.atoms[key] = profile return r
def createResidue(self, res, atoms): """ """ r = AmberResidueType(**res) r.letter = M.singleAA([r.code])[0] r.xyz = atoms['xyz'] n = len(r.xyz) for key in B.PDBModel.PDB_KEYS: r[key] = n * [''] r['type'] = ['ATOM'] * n r['residue_name'] = [r.code] * n r['residue_number'] = [1] * n r['occupancy'] = [1.0] * n r['after_ter'] = [0] * n r['temperature_factor'] = [0] * n del atoms['xyz'] for key, profile in atoms.items(): r.atoms[key] = profile return r
def __fromPDB( self ): self.code = self.atoms['name'][0] self.letter = M.singleAA( [ self.code ] )
def parse_lines(self, lines): ## Collect secondary structure data. Note that: ## ## 1. If Dssp detects a chain break or a residue with an ## incomplete backbone it inserts a line with an ## exclamation mark "!" in the residue column. ## ## Example: 496 524 C V < ## 497 525 C P ## 498 ! ## 499 539 C F ## 500 540 C N > - ## ## 2. A termini (a switch of chain identifier) is marked ## by a asterisk "*" in the column next to the "!" ## ## Example: 721 789 C Q T < ## 722 790 C A < ## 723 !* ## 724 33 Z E > ## 725 34 Z K T 4 + ## 726 35 Z L T >> S+ ## ## 3. If DSSP detects an incomplete residue in the terminus ## we only get a single line with a "!" and "*" not a ## for the incomplete residue and one for the terminus ## as woulld be expected! ## ## Example: 84 101 A A ## 85 102 A E ## 86 !* <-- residue 103 skipped! ## 87 16 B S ## 88 17 B G E ## skip header (may be interesting to get total area and bonds though) while lines and not lines[0][:12]==' # RESIDUE': lines.pop(0) lines.pop(0) table = ParseDSSPTable() r = [ table.parse_line(l) for l in lines ] r = [ res for res in r if res ] ## filter out TER and invalid records m = self.model len_res = m.lenResidues() m.residues.set('dssp', ['.']*len_res ,default='.') m.residues.set('dssp_acc', N.zeros(len_res), default=0.0) m.residues.set('dssp_phi', N.ones(len_res)*360.0, default=360.0 ) m.residues.set('dssp_psi', N.ones(len_res)*360.0, default=360.0 ) m.residues['residue'] = MU.singleAA( m.atom2resProfile('residue_name'), unknown='X') m.residues['insertion_code'] = m.atom2resProfile('insertion_code') m.residues['chain'] = m.atom2resProfile('chain_id') i = 0 for res in r: while i < (len_res-1) and \ not ( m.residues['residue'][i] == res['residue'] and\ m.residues['chain'][i] == res['chain'] and\ m.residues['insertion_code'][i] == res['insertion_code'] ): i += 1 m.residues['dssp'][i] = res['ss'] if res['ss'] else '.' m.residues['dssp_acc'][i] = res['acc'] m.residues['dssp_phi'][i] = res['phi'] m.residues['dssp_psi'][i] = res['psi'] i += 1
def __fromPDB(self): self.code = self.atoms['name'][0] self.letter = M.singleAA([self.code])