def matchAlign(mobile, target, **kwargs): """Superpose *mobile* onto *target* based on best matching pair of chains. This function uses :func:`matchChains` for matching chains and returns a tuple that contains the following items: * *mobile* after it is superposed, * matching chain from *mobile* as a :class:`.AtomMap` instance, * matching chain from *target* as a :class:`.AtomMap` instance, * percent sequence identity of the match, * percent sequence overlap of the match. :arg mobile: atoms that contain a protein chain :type mobile: :class:`.Chain`, :class:`.AtomGroup`, :class:`.Selection` :arg target: atoms that contain a protein chain :type target: :class:`.Chain`, :class:`.AtomGroup`, :class:`.Selection` :arg tarsel: *target* atoms that will be used for alignment, default is ``'calpha'`` :type tarsel: str :arg allcsets: align all coordinate sets of *mobile*, default is **True** :type allcsets: bool :keyword seqid: percent sequence identity, default is 90 :type seqid: float :keyword overlap: percent overlap, default is 90 :type overlap: float :keyword pwalign: perform pairwise sequence alignment :type pwalign: bool""" selstr = kwargs.pop('tarsel', 'calpha') if selstr == 'calpha': selstr = None subset = 'calpha' if selstr: if selstr in _SUBSETS: subset = selstr else: subset = 'all' sel = target.select(selstr) if sel is None: raise ValueError('selection {0} did not match any atoms'.format( repr(selstr))) chid = set(sel.getChids()) if len(chid) == 1: chid = chid.pop() target = target.select('chain ' + chid) match = matchChains(mobile, target, subset=subset, **kwargs) if not match: return match = match[0] mob = match[0] tar = match[1] if selstr: which = SELECT.getIndices(tar, selstr) n_atoms = len(which) else: which = slice(None) n_atoms = len(tar) selstr = 'calpha' if kwargs.get('allcets', True): csets = list(range(mobile.numCoordsets())) # PY3K: OK else: csets = [mobile.getACSIndex()] LOGGER.info('Alignment is based on {0} atoms matching {1}.'.format( n_atoms, repr(selstr))) printRMSD(tar._getCoords()[which], mob._getCoordsets()[:, which], msg='Before alignment ') for acsi in csets: mob.setACSIndex(acsi) mobile.setACSIndex(acsi) calcTransformation(mob._getCoords()[which], tar._getCoords()[which]).apply(mobile) printRMSD(tar._getCoords()[which], mob._getCoordsets()[:, which], msg='After alignment ') return (mobile, ) + match
def testGetBoolArray(self): self.assertEqual(len(AM), len(SELECT.getBoolArray(AM, 'name CA')))
def matchAlign(mobile, target, **kwargs): """Superpose *mobile* onto *target* based on best matching pair of chains. This function uses :func:`matchChains` for matching chains and returns a tuple that contains the following items: * *mobile* after it is superposed, * matching chain from *mobile* as a :class:`.AtomMap` instance, * matching chain from *target* as a :class:`.AtomMap` instance, * percent sequence identity of the match, * percent sequence overlap of the match. :arg mobile: atoms that contain a protein chain :type mobile: :class:`.Chain`, :class:`.AtomGroup`, :class:`.Selection` :arg target: atoms that contain a protein chain :type target: :class:`.Chain`, :class:`.AtomGroup`, :class:`.Selection` :arg tarsel: *target* atoms that will be used for alignment, default is ``'calpha'`` :type tarsel: str :arg allcsets: align all coordinate sets of *mobile*, default is **True** :type allcsets: bool :keyword seqid: percent sequence identity, default is 90 :type seqid: float :keyword overlap: percent overlap, default is 90 :type overlap: float :keyword pwalign: perform pairwise sequence alignment :type pwalign: bool""" selstr = kwargs.pop('tarsel', 'calpha') if selstr == 'calpha': selstr = None subset = 'calpha' if selstr: if selstr in _SUBSETS: subset = selstr else: subset = 'all' sel = target.select(selstr) if sel is None: raise ValueError('selection {0} did not match any atoms' .format(repr(selstr))) chid = set(sel.getChids()) if len(chid) == 1: chid = chid.pop() target = target.select('chain ' + chid) match = matchChains(mobile, target, subset=subset, **kwargs) if not match: return match = match[0] mob = match[0] tar = match[1] if selstr: which = SELECT.getIndices(tar, selstr) n_atoms = len(which) else: which = slice(None) n_atoms = len(tar) selstr = 'calpha' if kwargs.get('allcets', True): csets = range(mobile.numCoordsets()) # PY3K: OK else: csets = [mobile.getACSIndex()] LOGGER.info('Alignment is based on {0} atoms matching {1}.' .format(n_atoms, repr(selstr))) printRMSD(tar._getCoords()[which], mob._getCoordsets()[:, which], msg='Before alignment ') for acsi in csets: mob.setACSIndex(acsi) mobile.setACSIndex(acsi) calcTransformation(mob._getCoords()[which], tar._getCoords()[which]).apply(mobile) printRMSD(tar._getCoords()[which], mob._getCoordsets()[:, which], msg='After alignment ') return (mobile,) + match