def capNME(self, model, chain, breaks=True): """ Cap C-terminal of given chain. Note: In order to allow the capping of chain breaks, the chain index is, by default, based on model.chainIndex(breaks=True), that means with chain break detection activated! This is not the default behaviour of PDBModel.chainIndex or takeChains or chainLength. Please use the wrapping method capTerminals() for more convenient handling of the index. @param model: model @type model: PDBMode @param chain: index of chain to be capped @type chain: int @param breaks: consider chain breaks when identifying chain boundaries @type breaks: bool @return: model with added NME capping residue @rtype : PDBModel """ if self.verbose: self.logWrite('Capping C-terminal of chain %i with NME.' % chain) m_nme = PDBModel(self.F_nme_cap) c_start = model.chainIndex(breaks=breaks) c_end = model.chainEndIndex(breaks=breaks) Nterm_is_break = False Cterm_is_break = False if breaks: Nterm_is_break = c_start[chain] not in model.chainIndex() Cterm_is_break = c_end[chain] not in model.chainEndIndex() chains_before = model.takeChains(range(chain), breaks=breaks) m_chain = model.takeChains([chain], breaks=breaks) chains_after = model.takeChains(range(chain + 1, len(c_start)), breaks=breaks) m_term = m_chain.resModels()[-1] ## rename overhanging residue in cap PDB, renumber cap residue for a in m_nme: if a['residue_name'] != 'NME': a['residue_name'] = m_term.atoms['residue_name'][0] else: a['residue_number'] = m_term.atoms['residue_number'][0] + 1 a['chain_id'] = m_term.atoms['chain_id'][0] a['segment_id'] = m_term.atoms['segment_id'][0] ## chain should not have any terminal O after capping m_chain.remove(['OXT']) ## fit cap onto last residue of chain m_nme = m_nme.magicFit(m_term) cap = m_nme.resModels()[-1] serial = m_term['serial_number'][-1] + 1 cap['serial_number'] = range(serial, serial + len(cap)) ## concat cap on chain m_chain = m_chain.concat(cap, newChain=False) ## should be obsolete now if getattr(m_chain, '_PDBModel__terAtoms', []) != []: m_chain._PDBModel__terAtoms = [len(m_chain) - 1] assert m_chain.lenChains() == 1 ## re-assemble whole model r = chains_before.concat(m_chain, newChain=not Nterm_is_break) r = r.concat(chains_after, newChain=not Cterm_is_break) if len(c_start) != r.lenChains(breaks=breaks): raise CappingError, 'Capping NME would mask a chain break. '+\ 'This typically indicates a tight gap with high risk of '+\ 'clashes and other issues.' return r
def capNME( self, model, chain, breaks=True ): """ Cap C-terminal of given chain. Note: In order to allow the capping of chain breaks, the chain index is, by default, based on model.chainIndex(breaks=True), that means with chain break detection activated! This is not the default behaviour of PDBModel.chainIndex or takeChains or chainLength. Please use the wrapping method capTerminals() for more convenient handling of the index. @param model: model @type model: PDBMode @param chain: index of chain to be capped @type chain: int @param breaks: consider chain breaks when identifying chain boundaries @type breaks: bool @return: model with added NME capping residue @rtype : PDBModel """ if self.verbose: self.logWrite('Capping C-terminal of chain %i with NME.' % chain ) m_nme = PDBModel( self.F_nme_cap ) c_start = model.chainIndex( breaks=breaks ) c_end = model.chainEndIndex( breaks=breaks) Nterm_is_break = False Cterm_is_break = False if breaks: Nterm_is_break = c_start[chain] not in model.chainIndex() Cterm_is_break = c_end[chain] not in model.chainEndIndex() chains_before = model.takeChains( range(chain), breaks=breaks ) m_chain = model.takeChains( [chain], breaks=breaks ) chains_after = model.takeChains( range(chain+1, len(c_start)), breaks=breaks ) m_term = m_chain.resModels()[-1] ## rename overhanging residue in cap PDB, renumber cap residue for a in m_nme: if a['residue_name'] != 'NME': a['residue_name'] = m_term.atoms['residue_name'][0] else: a['residue_number'] = m_term.atoms['residue_number'][0]+1 a['chain_id'] = m_term.atoms['chain_id'][0] a['segment_id'] = m_term.atoms['segment_id'][0] ## chain should not have any terminal O after capping m_chain.remove( ['OXT'] ) ## fit cap onto last residue of chain m_nme = m_nme.magicFit( m_term ) cap = m_nme.resModels()[-1] serial = m_term['serial_number'][-1]+1 cap['serial_number'] = range( serial, serial + len(cap) ) ## concat cap on chain m_chain = m_chain.concat( cap, newChain=False ) ## should be obsolete now if getattr( m_chain, '_PDBModel__terAtoms', []) != []: m_chain._PDBModel__terAtoms = [ len( m_chain ) - 1 ] assert m_chain.lenChains() == 1 ## re-assemble whole model r = chains_before.concat( m_chain, newChain=not Nterm_is_break) r = r.concat( chains_after, newChain=not Cterm_is_break) if len(c_start) != r.lenChains( breaks=breaks ): raise CappingError, 'Capping NME would mask a chain break. '+\ 'This typically indicates a tight gap with high risk of '+\ 'clashes and other issues.' return r
def capACE(self, model, chain, breaks=True): """ Cap N-terminal of given chain. Note: In order to allow the capping of chain breaks, the chain index is, by default, based on model.chainIndex(breaks=True), that means with chain break detection activated! This is not the default behaviour of PDBModel.chainIndex or takeChains or chainLength. Please use the wrapping method capTerminals() for more convenient handling of the index. @param model: model @type model: PDBMode @param chain: index of chain to be capped @type chain: int @param breaks: consider chain breaks when identifying chain boundaries @type breaks: bool @return: model with added NME capping @rtype : PDBModel """ if self.verbose: self.logWrite('Capping N-terminal of chain %i with ACE' % chain) c_start = model.chainIndex(breaks=breaks) c_end = model.chainEndIndex(breaks=breaks) Nterm_is_break = False Cterm_is_break = False if breaks: Nterm_is_break = c_start[chain] not in model.chainIndex() Cterm_is_break = c_end[chain] not in model.chainEndIndex() m_ace = PDBModel(self.F_ace_cap) chains_before = model.takeChains(range(chain), breaks=breaks) m_chain = model.takeChains([chain], breaks=breaks) chains_after = model.takeChains(range(chain + 1, len(c_start)), breaks=breaks) m_term = m_chain.resModels()[0] ## we need 3 atoms for superposition, CB might mess things up but ## could help if there is no HN ## if 'HN' in m_term.atomNames(): m_ace.remove(['CB']) ## use backbone 'C' rather than CB for fitting ## rename overhanging residue in cap PDB for a in m_ace: if a['residue_name'] != 'ACE': a['residue_name'] = m_term.atoms['residue_name'][0] else: a['residue_number'] = m_term.atoms['residue_number'][0] - 1 a['chain_id'] = m_term.atoms['chain_id'][0] a['segment_id'] = m_term.atoms['segment_id'][0] ## fit cap onto first residue of chain m_ace = m_ace.magicFit(m_term) cap = m_ace.resModels()[0] serial = m_term['serial_number'][0] - len(cap) cap['serial_number'] = range(serial, serial + len(cap)) ## concat cap on chain m_chain = cap.concat(m_chain, newChain=False) ## re-assemble whole model r = chains_before.concat(m_chain, newChain=not Nterm_is_break) r = r.concat(chains_after, newChain=not Cterm_is_break) if len(c_start) != r.lenChains(breaks=breaks): raise CappingError, 'Capping ACE would mask a chain break. '+\ 'This typically indicates a tight gap with high risk of '+\ 'clashes and other issues.' return r
def capACE( self, model, chain, breaks=True ): """ Cap N-terminal of given chain. Note: In order to allow the capping of chain breaks, the chain index is, by default, based on model.chainIndex(breaks=True), that means with chain break detection activated! This is not the default behaviour of PDBModel.chainIndex or takeChains or chainLength. Please use the wrapping method capTerminals() for more convenient handling of the index. @param model: model @type model: PDBMode @param chain: index of chain to be capped @type chain: int @param breaks: consider chain breaks when identifying chain boundaries @type breaks: bool @return: model with added NME capping @rtype : PDBModel """ if self.verbose: self.logWrite('Capping N-terminal of chain %i with ACE' % chain ) c_start = model.chainIndex( breaks=breaks ) c_end = model.chainEndIndex( breaks=breaks) Nterm_is_break = False Cterm_is_break = False if breaks: Nterm_is_break = c_start[chain] not in model.chainIndex() Cterm_is_break = c_end[chain] not in model.chainEndIndex() m_ace = PDBModel( self.F_ace_cap ) chains_before = model.takeChains( range(chain), breaks=breaks ) m_chain = model.takeChains( [chain], breaks=breaks ) chains_after = model.takeChains( range(chain+1, len(c_start)), breaks=breaks ) m_term = m_chain.resModels()[0] ## we need 3 atoms for superposition, CB might mess things up but ## could help if there is no HN ## if 'HN' in m_term.atomNames(): m_ace.remove( ['CB'] ) ## use backbone 'C' rather than CB for fitting ## rename overhanging residue in cap PDB for a in m_ace: if a['residue_name'] != 'ACE': a['residue_name'] = m_term.atoms['residue_name'][0] else: a['residue_number'] = m_term.atoms['residue_number'][0]-1 a['chain_id'] = m_term.atoms['chain_id'][0] a['segment_id'] = m_term.atoms['segment_id'][0] ## fit cap onto first residue of chain m_ace = m_ace.magicFit( m_term ) cap = m_ace.resModels()[0] serial = m_term['serial_number'][0] - len(cap) cap['serial_number'] = range( serial, serial + len(cap) ) ## concat cap on chain m_chain = cap.concat( m_chain, newChain=False ) ## re-assemble whole model r = chains_before.concat( m_chain, newChain=not Nterm_is_break) r = r.concat( chains_after, newChain=not Cterm_is_break) if len(c_start) != r.lenChains( breaks=breaks ): raise CappingError, 'Capping ACE would mask a chain break. '+\ 'This typically indicates a tight gap with high risk of '+\ 'clashes and other issues.' return r