Esempio n. 1
0
    def capNME( self, model, chain, breaks=True, checkgap=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'] = list(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 checkgap and 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
Esempio n. 2
0
    def capNME(self, model, chain, breaks=True, checkgap=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'] = list(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 checkgap and 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
Esempio n. 3
0
    def capACE( self, model, chain, breaks=True, checkgap=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'] = list(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 checkgap and 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
Esempio n. 4
0
    def capACE(self, model, chain, breaks=True, checkgap=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'] = list(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 checkgap and 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