def prody_gnm(opt): """Perform GNM calculations based on command line arguments.""" outdir = opt.outdir if not os.path.isdir(outdir): opt.subparser('{0:s} is not a valid path'.format(outdir)) import numpy as np import prody LOGGER = prody.LOGGER pdb, prefix = opt.pdb, opt.prefix cutoff, gamma = opt.cutoff, opt.gamma, nmodes, selstr, model = opt.nmodes, opt.select, opt.model pdb = prody.parsePDB(pdb, model=model) if prefix == '_gnm': prefix = pdb.getTitle() + '_gnm' select = pdb.select(selstr) if select is None: opt.subparser('Selection "{0:s}" do not match any atoms.' .format(selstr)) LOGGER.info('{0:d} atoms will be used for GNM calculations.' .format(len(select))) gnm = prody.GNM(pdb.getTitle()) gnm.buildKirchhoff(select, cutoff, gamma) gnm.calcModes(nmodes) LOGGER.info('Writing numerical output.') if opt.npz: prody.saveModel(gnm) prody.writeNMD(os.path.join(outdir, prefix + '.nmd'), gnm, select) outall = opt.all delim, ext, format = opt.delim, opt.ext, opt.numformat if outall or opt.eigen: prody.writeArray(os.path.join(outdir, prefix + '_evectors'+ext), gnm.getArray(), delimiter=delim, format=format) prody.writeArray(os.path.join(outdir, prefix + '_evalues'+ext), gnm.getEigenvalues(), delimiter=delim, format=format) if outall or opt.beta: fout = prody.openFile(prefix + '_beta.txt', 'w', folder=outdir) fout.write('{0[0]:1s} {0[1]:4s} {0[2]:4s} {0[3]:5s} {0[4]:5s}\n' .format(['C', 'RES', '####', 'Exp.', 'The.'])) for data in zip(select.getChids(), select.getResnames(), select.getResnums(), select.getBetas(), prody.calcTempFactors(gnm, select)): fout.write('{0[0]:1s} {0[1]:4s} {0[2]:4d} {0[3]:5.2f} {0[4]:5.2f}\n' .format(data)) fout.close() if outall or opt.covar: prody.writeArray(os.path.join(outdir, prefix + '_covariance'+ext), gnm.getCovariance(), delimiter=delim, format=format) if outall or opt.ccorr: prody.writeArray(os.path.join(outdir, prefix + '_cross-correlations' + ext), prody.calcCrossCorr(gnm), delimiter=delim, format=format) if outall or opt.kirchhoff: prody.writeArray(os.path.join(outdir, prefix + '_kirchhoff'+ext), gnm.getKirchhoff(), delimiter=delim, format=format) if outall or opt.sqflucts: prody.writeArray(os.path.join(outdir, prefix + '_sqfluct'+ext), prody.calcSqFlucts(gnm), delimiter=delim, format=format) figall, cc, sf, bf, cm, modes = \ opt.figures, opt.cc, opt.sf, opt.bf, opt.cm, opt.modes if figall or cc or sf or bf or cm or modes: try: import matplotlib.pyplot as plt except ImportError: LOGGER.warning('Matplotlib could not be imported. ' 'Figures are not saved.') else: LOGGER.info('Saving graphical output.') format, width, height, dpi = \ opt.figformat, opt.width, opt.height, opt.dpi format = format.lower() if figall or cc: plt.figure(figsize=(width, height)) prody.showCrossCorr(gnm) plt.savefig(os.path.join(outdir, prefix + '_cc.'+format), dpi=dpi, format=format) plt.close('all') if figall or cm: plt.figure(figsize=(width, height)) prody.showContactMap(gnm) plt.savefig(os.path.join(outdir, prefix + '_cm.'+format), dpi=dpi, format=format) plt.close('all') if figall or sf: plt.figure(figsize=(width, height)) prody.showSqFlucts(gnm) plt.savefig(os.path.join(outdir, prefix + '_sf.'+format), dpi=dpi, format=format) plt.close('all') if figall or bf: plt.figure(figsize=(width, height)) bexp = select.getBetas() bcal = prody.calcTempFactors(gnm, select) plt.plot(bexp, label='Experimental') plt.plot(bcal, label=('Theoretical (corr coef = {0:.2f})' .format(np.corrcoef(bcal, bexp)[0,1]))) plt.legend(prop={'size': 10}) plt.xlabel('Node index') plt.ylabel('Experimental B-factors') plt.title(pdb.getTitle() + ' B-factors') plt.savefig(os.path.join(outdir, prefix + '_bf.'+format), dpi=dpi, format=format) plt.close('all') if modes: indices = [] items = modes.split() items = sum([item.split(',') for item in items], []) for item in items: try: item = item.split('-') if len(item) == 1: indices.append(int(item[0])-1) elif len(item) == 2: indices.extend(range(int(item[0])-1, int(item[1]))) except: pass for index in indices: try: mode = gnm[index] except: pass else: plt.figure(figsize=(width, height)) prody.showMode(mode) plt.grid() plt.savefig(os.path.join(outdir, prefix + '_mode_' + str(mode.getIndex()+1) + '.' + format), dpi=dpi, format=format) plt.close('all')
def prody_gnm(pdb, **kwargs): """Perform GNM calculations for *pdb*. """ for key in DEFAULTS: if not key in kwargs: kwargs[key] = DEFAULTS[key] from os.path import isdir, splitext, join outdir = kwargs.get('outdir') if not isdir(outdir): raise IOError('{0} is not a valid path'.format(repr(outdir))) import numpy as np import prody LOGGER = prody.LOGGER selstr = kwargs.get('select') prefix = kwargs.get('prefix') cutoff = kwargs.get('cutoff') gamma = kwargs.get('gamma') nmodes = kwargs.get('nmodes') selstr = kwargs.get('select') model = kwargs.get('model') altloc = kwargs.get('altloc') zeros = kwargs.get('zeros') pdb = prody.parsePDB(pdb, model=model, altloc=altloc) if prefix == '_gnm': prefix = pdb.getTitle() + '_gnm' select = pdb.select(selstr) if select is None: raise ValueError('selection {0} do not match any atoms'.format( repr(selstr))) LOGGER.info('{0} atoms will be used for GNM calculations.'.format( len(select))) gnm = prody.GNM(pdb.getTitle()) nproc = kwargs.get('nproc') if nproc: try: from threadpoolctl import threadpool_limits except ImportError: raise ImportError( 'Please install threadpoolctl to control threads') with threadpool_limits(limits=nproc, user_api="blas"): gnm.buildKirchhoff(select, cutoff, gamma) gnm.calcModes(nmodes, zeros=zeros) else: gnm.buildKirchhoff(select, cutoff, gamma) gnm.calcModes(nmodes, zeros=zeros) LOGGER.info('Writing numerical output.') if kwargs.get('outnpz'): prody.saveModel(gnm, join(outdir, prefix)) if kwargs.get('outscipion'): prody.writeScipionModes(outdir, gnm) prody.writeNMD(join(outdir, prefix + '.nmd'), gnm, select) extend = kwargs.get('extend') if extend: if extend == 'all': extended = prody.extendModel(gnm, select, pdb) else: extended = prody.extendModel(gnm, select, select | pdb.bb) prody.writeNMD(join(outdir, prefix + '_extended_' + extend + '.nmd'), *extended) outall = kwargs.get('outall') delim = kwargs.get('numdelim') ext = kwargs.get('numext') format = kwargs.get('numformat') if outall or kwargs.get('outeig'): prody.writeArray(join(outdir, prefix + '_evectors' + ext), gnm.getArray(), delimiter=delim, format=format) prody.writeArray(join(outdir, prefix + '_evalues' + ext), gnm.getEigvals(), delimiter=delim, format=format) if outall or kwargs.get('outbeta'): from prody.utilities import openFile fout = openFile(prefix + '_beta' + ext, 'w', folder=outdir) fout.write( '{0[0]:1s} {0[1]:4s} {0[2]:4s} {0[3]:5s} {0[4]:5s}\n'.format( ['C', 'RES', '####', 'Exp.', 'The.'])) for data in zip(select.getChids(), select.getResnames(), select.getResnums(), select.getBetas(), prody.calcTempFactors(gnm, select)): fout.write( '{0[0]:1s} {0[1]:4s} {0[2]:4d} {0[3]:5.2f} {0[4]:5.2f}\n'. format(data)) fout.close() if outall or kwargs.get('outcov'): prody.writeArray(join(outdir, prefix + '_covariance' + ext), gnm.getCovariance(), delimiter=delim, format=format) if outall or kwargs.get('outcc') or kwargs.get('outhm'): cc = prody.calcCrossCorr(gnm) if outall or kwargs.get('outcc'): prody.writeArray(join(outdir, prefix + '_cross-correlations' + ext), cc, delimiter=delim, format=format) if outall or kwargs.get('outhm'): prody.writeHeatmap(join(outdir, prefix + '_cross-correlations.hm'), cc, resnum=select.getResnums(), xlabel='Residue', ylabel='Residue', title=gnm.getTitle() + ' cross-correlations') if outall or kwargs.get('kirchhoff'): prody.writeArray(join(outdir, prefix + '_kirchhoff' + ext), gnm.getKirchhoff(), delimiter=delim, format=format) if outall or kwargs.get('outsf'): prody.writeArray(join(outdir, prefix + '_sqfluct' + ext), prody.calcSqFlucts(gnm), delimiter=delim, format=format) figall = kwargs.get('figall') cc = kwargs.get('figcc') sf = kwargs.get('figsf') bf = kwargs.get('figbeta') cm = kwargs.get('figcmap') modes = kwargs.get('figmode') if figall or cc or sf or bf or cm or modes: try: import matplotlib.pyplot as plt except ImportError: LOGGER.warning('Matplotlib could not be imported. ' 'Figures are not saved.') else: prody.SETTINGS['auto_show'] = False LOGGER.info('Saving graphical output.') format = kwargs.get('figformat') width = kwargs.get('figwidth') height = kwargs.get('figheight') dpi = kwargs.get('figdpi') format = format.lower() if figall or cc: plt.figure(figsize=(width, height)) prody.showCrossCorr(gnm) plt.savefig(join(outdir, prefix + '_cc.' + format), dpi=dpi, format=format) plt.close('all') if figall or cm: plt.figure(figsize=(width, height)) prody.showContactMap(gnm) plt.savefig(join(outdir, prefix + '_cm.' + format), dpi=dpi, format=format) plt.close('all') if figall or sf: plt.figure(figsize=(width, height)) prody.showSqFlucts(gnm) plt.savefig(join(outdir, prefix + '_sf.' + format), dpi=dpi, format=format) plt.close('all') if figall or bf: plt.figure(figsize=(width, height)) bexp = select.getBetas() bcal = prody.calcTempFactors(gnm, select) plt.plot(bexp, label='Experimental') plt.plot(bcal, label=('Theoretical (corr coef = {0:.2f})'.format( np.corrcoef(bcal, bexp)[0, 1]))) plt.legend(prop={'size': 10}) plt.xlabel('Node index') plt.ylabel('Experimental B-factors') plt.title(pdb.getTitle() + ' B-factors') plt.savefig(join(outdir, prefix + '_bf.' + format), dpi=dpi, format=format) plt.close('all') if modes: indices = [] items = modes.split() items = sum([item.split(',') for item in items], []) for item in items: try: item = item.split('-') if len(item) == 1: indices.append(int(item[0]) - 1) elif len(item) == 2: indices.extend( list(range(int(item[0]) - 1, int(item[1])))) except: pass for index in indices: try: mode = gnm[index] except: pass else: plt.figure(figsize=(width, height)) prody.showMode(mode) plt.grid() plt.savefig(join( outdir, prefix + '_mode_' + str(mode.getIndex() + 1) + '.' + format), dpi=dpi, format=format) plt.close('all')
def prody_gnm(pdb, **kwargs): """Perform GNM calculations for *pdb*. """ for key in DEFAULTS: if not key in kwargs: kwargs[key] = DEFAULTS[key] from os.path import isdir, splitext, join outdir = kwargs.get("outdir") if not isdir(outdir): raise IOError("{0} is not a valid path".format(repr(outdir))) import numpy as np import prody LOGGER = prody.LOGGER selstr = kwargs.get("select") prefix = kwargs.get("prefix") cutoff = kwargs.get("cutoff") gamma = kwargs.get("gamma") nmodes = kwargs.get("nmodes") selstr = kwargs.get("select") model = kwargs.get("model") pdb = prody.parsePDB(pdb, model=model) if prefix == "_gnm": prefix = pdb.getTitle() + "_gnm" select = pdb.select(selstr) if select is None: raise ValueError("selection {0} do not match any atoms".format(repr(selstr))) LOGGER.info("{0} atoms will be used for GNM calculations.".format(len(select))) gnm = prody.GNM(pdb.getTitle()) gnm.buildKirchhoff(select, cutoff, gamma) gnm.calcModes(nmodes) LOGGER.info("Writing numerical output.") if kwargs.get("outnpz"): prody.saveModel(gnm, join(outdir, prefix)) prody.writeNMD(join(outdir, prefix + ".nmd"), gnm, select) extend = kwargs.get("extend") if extend: if extend == "all": extended = prody.extendModel(gnm, select, pdb) else: extended = prody.extendModel(gnm, select, select | pdb.bb) prody.writeNMD(join(outdir, prefix + "_extended_" + extend + ".nmd"), *extended) outall = kwargs.get("outall") delim = kwargs.get("numdelim") ext = kwargs.get("numext") format = kwargs.get("numformat") if outall or kwargs.get("outeig"): prody.writeArray(join(outdir, prefix + "_evectors" + ext), gnm.getArray(), delimiter=delim, format=format) prody.writeArray(join(outdir, prefix + "_evalues" + ext), gnm.getEigvals(), delimiter=delim, format=format) if outall or kwargs.get("outbeta"): from prody.utilities import openFile fout = openFile(prefix + "_beta.txt", "w", folder=outdir) fout.write("{0[0]:1s} {0[1]:4s} {0[2]:4s} {0[3]:5s} {0[4]:5s}\n".format(["C", "RES", "####", "Exp.", "The."])) for data in zip( select.getChids(), select.getResnames(), select.getResnums(), select.getBetas(), prody.calcTempFactors(gnm, select), ): fout.write("{0[0]:1s} {0[1]:4s} {0[2]:4d} {0[3]:5.2f} {0[4]:5.2f}\n".format(data)) fout.close() if outall or kwargs.get("outcov"): prody.writeArray( join(outdir, prefix + "_covariance" + ext), gnm.getCovariance(), delimiter=delim, format=format ) if outall or kwargs.get("outcc") or kwargs.get("outhm"): cc = prody.calcCrossCorr(gnm) if outall or kwargs.get("outcc"): prody.writeArray(join(outdir, prefix + "_cross-correlations" + ext), cc, delimiter=delim, format=format) if outall or kwargs.get("outhm"): prody.writeHeatmap( join(outdir, prefix + "_cross-correlations.hm"), cc, resnum=select.getResnums(), xlabel="Residue", ylabel="Residue", title=gnm.getTitle() + " cross-correlations", ) if outall or kwargs.get("kirchhoff"): prody.writeArray(join(outdir, prefix + "_kirchhoff" + ext), gnm.getKirchhoff(), delimiter=delim, format=format) if outall or kwargs.get("outsf"): prody.writeArray( join(outdir, prefix + "_sqfluct" + ext), prody.calcSqFlucts(gnm), delimiter=delim, format=format ) figall = kwargs.get("figall") cc = kwargs.get("figcc") sf = kwargs.get("figsf") bf = kwargs.get("figbeta") cm = kwargs.get("figcmap") modes = kwargs.get("figmode") if figall or cc or sf or bf or cm or modes: try: import matplotlib.pyplot as plt except ImportError: LOGGER.warning("Matplotlib could not be imported. " "Figures are not saved.") else: prody.SETTINGS["auto_show"] = False LOGGER.info("Saving graphical output.") format = kwargs.get("figformat") width = kwargs.get("figwidth") height = kwargs.get("figheight") dpi = kwargs.get("figdpi") format = format.lower() if figall or cc: plt.figure(figsize=(width, height)) prody.showCrossCorr(gnm) plt.savefig(join(outdir, prefix + "_cc." + format), dpi=dpi, format=format) plt.close("all") if figall or cm: plt.figure(figsize=(width, height)) prody.showContactMap(gnm) plt.savefig(join(outdir, prefix + "_cm." + format), dpi=dpi, format=format) plt.close("all") if figall or sf: plt.figure(figsize=(width, height)) prody.showSqFlucts(gnm) plt.savefig(join(outdir, prefix + "_sf." + format), dpi=dpi, format=format) plt.close("all") if figall or bf: plt.figure(figsize=(width, height)) bexp = select.getBetas() bcal = prody.calcTempFactors(gnm, select) plt.plot(bexp, label="Experimental") plt.plot(bcal, label=("Theoretical (corr coef = {0:.2f})".format(np.corrcoef(bcal, bexp)[0, 1]))) plt.legend(prop={"size": 10}) plt.xlabel("Node index") plt.ylabel("Experimental B-factors") plt.title(pdb.getTitle() + " B-factors") plt.savefig(join(outdir, prefix + "_bf." + format), dpi=dpi, format=format) plt.close("all") if modes: indices = [] items = modes.split() items = sum([item.split(",") for item in items], []) for item in items: try: item = item.split("-") if len(item) == 1: indices.append(int(item[0]) - 1) elif len(item) == 2: indices.extend(range(int(item[0]) - 1, int(item[1]))) except: pass for index in indices: try: mode = gnm[index] except: pass else: plt.figure(figsize=(width, height)) prody.showMode(mode) plt.grid() plt.savefig( join(outdir, prefix + "_mode_" + str(mode.getIndex() + 1) + "." + format), dpi=dpi, format=format, ) plt.close("all")
def prody_gnm(pdb, **kwargs): """Perform GNM calculations for *pdb*. """ for key in DEFAULTS: if not key in kwargs: kwargs[key] = DEFAULTS[key] from os.path import isdir, splitext, join outdir = kwargs.get('outdir') if not isdir(outdir): raise IOError('{0} is not a valid path'.format(repr(outdir))) import numpy as np import prody LOGGER = prody.LOGGER selstr = kwargs.get('select') prefix = kwargs.get('prefix') cutoff = kwargs.get('cutoff') gamma = kwargs.get('gamma') nmodes = kwargs.get('nmodes') selstr = kwargs.get('select') model = kwargs.get('model') pdb = prody.parsePDB(pdb, model=model) if prefix == '_gnm': prefix = pdb.getTitle() + '_gnm' select = pdb.select(selstr) if select is None: raise ValueError('selection {0} do not match any atoms' .format(repr(selstr))) LOGGER.info('{0} atoms will be used for GNM calculations.' .format(len(select))) gnm = prody.GNM(pdb.getTitle()) gnm.buildKirchhoff(select, cutoff, gamma) gnm.calcModes(nmodes) LOGGER.info('Writing numerical output.') if kwargs.get('outnpz'): prody.saveModel(gnm, join(outdir, prefix)) prody.writeNMD(join(outdir, prefix + '.nmd'), gnm, select) extend = kwargs.get('extend') if extend: if extend == 'all': extended = prody.extendModel(gnm, select, pdb) else: extended = prody.extendModel(gnm, select, select | pdb.bb) prody.writeNMD(join(outdir, prefix + '_extended_' + extend + '.nmd'), *extended) outall = kwargs.get('outall') delim = kwargs.get('numdelim') ext = kwargs.get('numext') format = kwargs.get('numformat') if outall or kwargs.get('outeig'): prody.writeArray(join(outdir, prefix + '_evectors'+ext), gnm.getArray(), delimiter=delim, format=format) prody.writeArray(join(outdir, prefix + '_evalues'+ext), gnm.getEigvals(), delimiter=delim, format=format) if outall or kwargs.get('outbeta'): from prody.utilities import openFile fout = openFile(prefix + '_beta.txt', 'w', folder=outdir) fout.write('{0[0]:1s} {0[1]:4s} {0[2]:4s} {0[3]:5s} {0[4]:5s}\n' .format(['C', 'RES', '####', 'Exp.', 'The.'])) for data in zip(select.getChids(), select.getResnames(), select.getResnums(), select.getBetas(), prody.calcTempFactors(gnm, select)): fout.write('{0[0]:1s} {0[1]:4s} {0[2]:4d} {0[3]:5.2f} {0[4]:5.2f}\n' .format(data)) fout.close() if outall or kwargs.get('outcov'): prody.writeArray(join(outdir, prefix + '_covariance'+ext), gnm.getCovariance(), delimiter=delim, format=format) if outall or kwargs.get('outcc') or kwargs.get('outhm'): cc = prody.calcCrossCorr(gnm) if outall or kwargs.get('outcc'): prody.writeArray(join(outdir, prefix + '_cross-correlations' + ext), cc, delimiter=delim, format=format) if outall or kwargs.get('outhm'): prody.writeHeatmap(join(outdir, prefix + '_cross-correlations.hm'), cc, resnum=select.getResnums(), xlabel='Residue', ylabel='Residue', title=gnm.getTitle() + ' cross-correlations') if outall or kwargs.get('kirchhoff'): prody.writeArray(join(outdir, prefix + '_kirchhoff'+ext), gnm.getKirchhoff(), delimiter=delim, format=format) if outall or kwargs.get('outsf'): prody.writeArray(join(outdir, prefix + '_sqfluct'+ext), prody.calcSqFlucts(gnm), delimiter=delim, format=format) figall = kwargs.get('figall') cc = kwargs.get('figcc') sf = kwargs.get('figsf') bf = kwargs.get('figbeta') cm = kwargs.get('figcmap') modes = kwargs.get('figmode') if figall or cc or sf or bf or cm or modes: try: import matplotlib.pyplot as plt except ImportError: LOGGER.warning('Matplotlib could not be imported. ' 'Figures are not saved.') else: prody.SETTINGS['auto_show'] = False LOGGER.info('Saving graphical output.') format = kwargs.get('figformat') width = kwargs.get('figwidth') height = kwargs.get('figheight') dpi = kwargs.get('figdpi') format = format.lower() if figall or cc: plt.figure(figsize=(width, height)) prody.showCrossCorr(gnm) plt.savefig(join(outdir, prefix + '_cc.'+format), dpi=dpi, format=format) plt.close('all') if figall or cm: plt.figure(figsize=(width, height)) prody.showContactMap(gnm) plt.savefig(join(outdir, prefix + '_cm.'+format), dpi=dpi, format=format) plt.close('all') if figall or sf: plt.figure(figsize=(width, height)) prody.showSqFlucts(gnm) plt.savefig(join(outdir, prefix + '_sf.'+format), dpi=dpi, format=format) plt.close('all') if figall or bf: plt.figure(figsize=(width, height)) bexp = select.getBetas() bcal = prody.calcTempFactors(gnm, select) plt.plot(bexp, label='Experimental') plt.plot(bcal, label=('Theoretical (corr coef = {0:.2f})' .format(np.corrcoef(bcal, bexp)[0,1]))) plt.legend(prop={'size': 10}) plt.xlabel('Node index') plt.ylabel('Experimental B-factors') plt.title(pdb.getTitle() + ' B-factors') plt.savefig(join(outdir, prefix + '_bf.'+format), dpi=dpi, format=format) plt.close('all') if modes: indices = [] items = modes.split() items = sum([item.split(',') for item in items], []) for item in items: try: item = item.split('-') if len(item) == 1: indices.append(int(item[0])-1) elif len(item) == 2: indices.extend(range(int(item[0])-1, int(item[1]))) except: pass for index in indices: try: mode = gnm[index] except: pass else: plt.figure(figsize=(width, height)) prody.showMode(mode) plt.grid() plt.savefig(join(outdir, prefix + '_mode_' + str(mode.getIndex()+1) + '.' + format), dpi=dpi, format=format) plt.close('all')