def prody_align(opt): """Align models in a PDB file or a PDB file onto others.""" import prody LOGGER = prody.LOGGER args = opt.pdb if len(args) == 1: pdb = args[0] LOGGER.info('Aligning multiple models in: ' + pdb) selstr, prefix, model = opt.select, opt.prefix, opt.model pdb = prody.parsePDB(pdb) pdbselect = pdb.select(selstr) if pdbselect is None: opt.subparser.error('Selection {0:s} do not match any atoms.' .format(repr(selstr))) LOGGER.info('{0:d} atoms will be used for alignment.' .format(len(pdbselect))) pdbselect.setACSIndex(model-1) prody.printRMSD(pdbselect, msg='Before alignment ') prody.alignCoordsets(pdbselect) prody.printRMSD(pdbselect, msg='After alignment ') if prefix == '': prefix = pdb.getTitle() + '_aligned' outfn = prefix + '.pdb' LOGGER.info('Writing file: ' + outfn) prody.writePDB(outfn, pdb) else: reffn = args.pop(0) seqid=opt.seqid overlap=opt.overlap LOGGER.info('Aligning structures onto: ' + reffn) ref = prody.parsePDB(reffn) for arg in args: if arg == reffn: continue if '_aligned.pdb' in arg: continue pdb = prody.parsePDB(arg) result = prody.matchAlign(pdb, ref, seqid=seqid, overlap=overlap, tarsel=opt.select, allcsets=True, cslabel='Model', csincr=1) if result: outfn = pdb.getTitle() + '_aligned.pdb' LOGGER.info('Writing file: ' + outfn) prody.writePDB(outfn, pdb) else: LOGGER.warning('Failed to align ' + arg)
def prody_align(*pdbs, **kwargs): """Align models in a PDB file or multiple structures in separate PDB files. By default, protein chains will be matched based on selected atoms and alignment will be performed based on matching residues. If non-protein atoms are selected and selected atoms match in multiple structures, they will be used for alignment. :arg pdbs: PDB identifier(s) or filename(s) :arg select: atom selection string, default is :term:`calpha`, see :ref:`selections` :arg model: for NMR files, reference model index, default is ``1`` :arg seqid: percent sequence identity, default is ``90`` :arg overlap: percent sequence overlap, default is ``90`` :arg prefix: prefix for output file, default is PDB filename :arg suffix: output filename suffix, default is :file:`_aligned`""" from numpy import all from prody import LOGGER, writePDB, parsePDB from prody import alignCoordsets, printRMSD, matchAlign, superpose selstr = kwargs.get('select', 'calpha') suffix = kwargs.get('suffix', '_aligned') if len(pdbs) == 1: pdb = pdbs[0] LOGGER.info('Aligning multiple models in: ' + pdb) prefix = kwargs.get('prefix') model = kwargs.get('model') pdb = parsePDB(pdb) pdbselect = pdb.select(selstr) if pdbselect is None: subparser = kwargs.get('subparser') if subparser: subparser.error('Selection {0} do not match any atoms.'.format( repr(selstr))) else: raise ValueError('select does not match any atoms') LOGGER.info('{0} atoms will be used for alignment.'.format( len(pdbselect))) pdbselect.setACSIndex(model - 1) printRMSD(pdbselect, msg='Before alignment ') alignCoordsets(pdbselect) printRMSD(pdbselect, msg='After alignment ') outfn = (prefix or pdb.getTitle()) + suffix + '.pdb' LOGGER.info('Writing file: ' + outfn) writePDB(outfn, pdb) else: pdbs = list(pdbs) reffn = pdbs.pop(0) seqid = kwargs.get('seqid') overlap = kwargs.get('overlap') LOGGER.info('Aligning structures onto: ' + reffn) ref = parsePDB(reffn) ref_sel = ref.select(selstr) if ref_sel: LOGGER.info('Selection {0} matched {1} atoms.'.format( repr(selstr), len(ref_sel))) else: raise ValueError('selection {0} did not match any atoms'.format( repr(selstr))) match = True if ref_sel.numAtoms('ca') < 2: match = False for arg in pdbs: if arg == reffn: continue #if '_aligned.pdb' in arg: # continue LOGGER.info('Evaluating structure: ' + arg) pdb = parsePDB(arg) if match: result = matchAlign(pdb, ref, seqid=seqid, overlap=overlap, tarsel=selstr, allcsets=True, cslabel='Model', csincr=1) if result: outfn = pdb.getTitle() + suffix + '.pdb' LOGGER.info('Writing file: ' + outfn) writePDB(outfn, pdb) continue pdb_sel = pdb.select(selstr) LOGGER.info('Selection {0} matched {1} atoms.'.format( repr(selstr), len(pdb_sel))) if (len(pdb_sel) == len(ref_sel) and all(pdb_sel.getNames() == ref_sel.getNames())): printRMSD(ref_sel, pdb_sel, msg='Before alignment ') superpose(pdb_sel, ref_sel) printRMSD(ref_sel, pdb_sel, msg='After alignment ') outfn = pdb.getTitle() + suffix + '.pdb' LOGGER.info('Writing file: ' + outfn) writePDB(outfn, pdb) else: LOGGER.warn('Failed to align structure ' + arg + '.')
def prody_align(*pdbs, **kwargs): """Align models in a PDB file or multiple structures in separate PDB files. By default, protein chains will be matched based on selected atoms and alignment will be performed based on matching residues. If non-protein atoms are selected and selected atoms match in multiple structures, they will be used for alignment. :arg pdbs: PDB identifier(s) or filename(s) :arg select: atom selection string, default is :term:`calpha`, see :ref:`selections` :arg model: for NMR files, reference model index, default is ``1`` :arg seqid: percent sequence identity, default is ``90`` :arg overlap: percent sequence overlap, default is ``90`` :arg prefix: prefix for output file, default is PDB filename :arg suffix: output filename suffix, default is :file:`_aligned`""" from numpy import all from prody import LOGGER, writePDB, parsePDB from prody import alignCoordsets, printRMSD, matchAlign, superpose selstr = kwargs.get('select', 'calpha') suffix = kwargs.get('suffix', '_aligned') if len(pdbs) == 1: pdb = pdbs[0] LOGGER.info('Aligning multiple models in: ' + pdb) prefix = kwargs.get('prefix') model = kwargs.get('model') pdb = parsePDB(pdb) pdbselect = pdb.select(selstr) if pdbselect is None: subparser = kwargs.get('subparser') if subparser: subparser.error('Selection {0} do not match any atoms.' .format(repr(selstr))) else: raise ValueError('select does not match any atoms') LOGGER.info('{0} atoms will be used for alignment.' .format(len(pdbselect))) pdbselect.setACSIndex(model-1) printRMSD(pdbselect, msg='Before alignment ') alignCoordsets(pdbselect) printRMSD(pdbselect, msg='After alignment ') outfn = (prefix or pdb.getTitle()) + suffix + '.pdb' LOGGER.info('Writing file: ' + outfn) writePDB(outfn, pdb) else: pdbs = list(pdbs) reffn = pdbs.pop(0) seqid = kwargs.get('seqid') overlap = kwargs.get('overlap') LOGGER.info('Aligning structures onto: ' + reffn) ref = parsePDB(reffn) ref_sel = ref.select(selstr) if ref_sel: LOGGER.info('Selection {0} matched {1} atoms.' .format(repr(selstr), len(ref_sel))) else: raise ValueError('selection {0} did not match any atoms' .format(repr(selstr))) match = True if ref_sel.numAtoms('ca') < 2: match = False for arg in pdbs: if arg == reffn: continue #if '_aligned.pdb' in arg: # continue LOGGER.info('Evaluating structure: ' + arg) pdb = parsePDB(arg) if match: result = matchAlign(pdb, ref, seqid=seqid, overlap=overlap, tarsel=selstr, allcsets=True, cslabel='Model', csincr=1) if result: outfn = pdb.getTitle() + suffix + '.pdb' LOGGER.info('Writing file: ' + outfn) writePDB(outfn, pdb) continue pdb_sel = pdb.select(selstr) LOGGER.info('Selection {0} matched {1} atoms.' .format(repr(selstr), len(pdb_sel))) if (len(pdb_sel) == len(ref_sel) and all(pdb_sel.getNames() == ref_sel.getNames())): printRMSD(ref_sel, pdb_sel, msg='Before alignment ') superpose(pdb_sel, ref_sel) printRMSD(ref_sel, pdb_sel, msg='After alignment ') outfn = pdb.getTitle() + suffix + '.pdb' LOGGER.info('Writing file: ' + outfn) writePDB(outfn, pdb) else: LOGGER.warn('Failed to align structure ' + arg + '.')