def protein_vacuum_esp(selection, mode=2, border=10.0, quiet = 1, _self=cmd): pymol=_self._pymol cmd=_self if ((string.split(selection)!=[selection]) or selection not in cmd.get_names('objects')): print " Error: must provide an object name" raise cmd.QuietException obj_name = selection + "_e_chg" map_name = selection + "_e_map" pot_name = selection + "_e_pot" cmd.disable(selection) cmd.delete(obj_name) cmd.delete(map_name) cmd.delete(pot_name) cmd.create(obj_name,"((polymer and ("+selection+ ") and (not resn A+C+T+G+U)) or ((bymol (polymer and ("+ selection+"))) and resn NME+NHE+ACE)) and (not hydro)") # try to just get protein... protein_assign_charges_and_radii(obj_name,_self=_self) ext = cmd.get_extent(obj_name) max_length = max(abs(ext[0][0] - ext[1][0]),abs(ext[0][1] - ext[1][1]),abs(ext[0][2]-ext[1][2])) + 2*border # compute an grid with a maximum dimension of 50, with 10 A borders around molecule, and a 1.0 A minimum grid sep = max_length/50.0 if sep<1.0: sep = 1.0 print " Util: Calculating electrostatic potential..." if mode==0: # absolute, no cutoff cmd.map_new(map_name,"coulomb",sep,obj_name,border) elif mode==1: # neutral, no cutoff cmd.map_new(map_name,"coulomb_neutral",sep,obj_name,border) else: # local, with cutoff cmd.map_new(map_name,"coulomb_local",sep,obj_name,border) cmd.ramp_new(pot_name, map_name, selection=obj_name,zero=1) cmd.hide("everything",obj_name) cmd.show("surface",selection) cmd.set("surface_color",pot_name,selection) cmd.set("surface_ramp_above_mode",1,selection)
def map_new_apbs(name, selection='all', grid=0.5, buffer=10.0, state=1, preserve=0, exe='', assign=-1, focus='', quiet=1, _template=''): ''' DESCRIPTION Create electrostatic potential map with APBS. For more control over parameters and a graphical user interface I recommend to use the APBS Tools Plugin instead. In case of missing atoms or residues I recommend to remodel the input structure with modeller before calculating the electrostatic potential. If selection has no charges and radii, they will be automatically assigned with PyMOL (not with pdb2pqr). SEE ALSO apbs_surface, map_new (coulomb), APBS Tools Plugin ''' import tempfile, os, shutil, glob, subprocess from pymol.util import protein_assign_charges_and_radii from .modelling import add_missing_atoms selection = '(%s) and not solvent' % (selection) grid, buffer, state = float(grid), float(buffer), int(state) preserve, assign, quiet = int(preserve), int(assign), int(quiet) # path to apbs executable exe = validate_apbs_exe(exe) # temporary directory tempdir = tempfile.mkdtemp() if not quiet: print(' Tempdir:', tempdir) # filenames pqrfile = os.path.join(tempdir, 'mol.pqr') infile = os.path.join(tempdir, 'apbs.in') stem = os.path.join(tempdir, 'map') # temporary object tmpname = cmd.get_unused_name('mol' if preserve else '_') cmd.create(tmpname, selection, state, 1) # partial charges assign = [assign] if assign[0] == -1: # auto detect if selection has charges and radii cmd.iterate(tmpname, 'assign[0] *= (elec_radius * partial_charge) == 0.0', space=locals()) if assign[0]: cmd.remove('hydro and model ' + tmpname) add_missing_atoms(tmpname, quiet=quiet) protein_assign_charges_and_radii(tmpname) elif not quiet: print(' Notice: using exsiting charges and radii') cmd.save(pqrfile, tmpname, 1, format='pqr', quiet=quiet) # grid dimensions extent = cmd.get_extent(tmpname) extentfocus = cmd.get_extent(focus) if focus else extent fglen = [(emax-emin + 2*buffer) for (emin, emax) in zip(*extentfocus)] cglen = [(emax-emin + 4*buffer) for (emin, emax) in zip(*extent)] if not preserve: cmd.delete(tmpname) apbs_in = { 'pqrfile': pqrfile, 'fgcent': 'mol 1', 'fglen': '%f %f %f' % tuple(fglen), 'cglen': '%f %f %f' % tuple(cglen), 'srad': cmd.get('solvent_radius'), 'mapfile': stem, } if focus: apbs_in['fgcent'] = '%f %f %f' % tuple((emax + emin) / 2.0 for (emin, emax) in zip(*extentfocus)) try: # apbs will fail if grid does not fit into memory # -> on failure repeat with larger grid spacing for _ in range(3): dime = [1 + max(64, n / grid) for n in fglen] apbs_in['dime'] = '%d %d %d' % tuple(dime) # apbs input file with open(infile, 'w') as f: f.write((_template or template_apbs_in).format(**apbs_in)) # run apbs r = subprocess.call([exe, infile], cwd=tempdir) if r == 0: break if r in (-6, -9): grid *= 2.0 if not quiet: print(' Warning: retry with grid =', grid) continue raise CmdException('apbs failed with code ' + str(r)) dx_list = glob.glob(stem + '*.dx') if len(dx_list) != 1: raise CmdException('dx file missing') # load map cmd.load(dx_list[0], name, quiet=quiet) except OSError: raise CmdException('Cannot execute "%s"' % (exe)) finally: if not preserve: shutil.rmtree(tempdir) elif not quiet: print(' Notice: not deleting %s' % (tempdir))
def map_new_apbs(name, selection='all', grid=0.5, buffer=10.0, state=1, preserve=0, exe='apbs', assign=-1, quiet=1): ''' DESCRIPTION Create electrostatic potential map with APBS. For more control over parameters and a graphical user interface I recommend to use the APBS Tools Plugin instead. In case of missing atoms or residues I recommend to remodel the input structure with modeller before calculating the electrostatic potential. If selection has no charges and radii, they will be automatically assigned with PyMOL (not with pdb2pqr). SEE ALSO apbs_surface, map_new (coulomb), APBS Tools Plugin ''' import tempfile, os, shutil, glob, subprocess from pymol.util import protein_assign_charges_and_radii from .modelling import add_missing_atoms selection = '(%s) and not solvent' % (selection) grid, buffer, state = float(grid), float(buffer), int(state) preserve, assign, quiet = int(preserve), int(assign), int(quiet) exe = cmd.exp_path(exe) # temporary directory tempdir = tempfile.mkdtemp() if not quiet: print ' Tempdir:', tempdir # filenames pqrfile = os.path.join(tempdir, 'mol.pqr') infile = os.path.join(tempdir, 'apbs.in') stem = os.path.join(tempdir, 'map') # temporary object tmpname = cmd.get_unused_name('mol' if preserve else '_') cmd.create(tmpname, selection, state, 1) # partial charges assign = [assign] if assign[0] == -1: # auto detect if selection has charges and radii cmd.iterate('first ((%s) and elem O)' % (tmpname), 'assign[0] = (elec_radius * partial_charge) == 0.0', space=locals()) if assign[0]: cmd.remove('hydro and model ' + tmpname) add_missing_atoms(tmpname, quiet=quiet) protein_assign_charges_and_radii(tmpname) elif not quiet: print ' Notice: using exsiting charges and radii' cmd.save(pqrfile, tmpname, 1, format='pqr', quiet=quiet) # grid dimensions extent = cmd.get_extent(tmpname) fglen = [(emax-emin + 2*buffer) for (emin, emax) in zip(*extent)] cglen = [(emax-emin + 4*buffer) for (emin, emax) in zip(*extent)] if not preserve: cmd.delete(tmpname) apbs_in = defaults_apbs_in.copy() apbs_in['fglen'] = '%f %f %f' % tuple(fglen) apbs_in['cglen'] = '%f %f %f' % tuple(cglen) apbs_in['srad'] = cmd.get('solvent_radius') apbs_in['write'] = 'pot dx "%s"' % (stem) # apbs input file def write_input_file(): f = open(infile, 'w') print >> f, ''' read mol pqr "%s" end elec mg-auto ''' % (pqrfile) for (k,v) in apbs_in.items(): if v is None: print >> f, k elif isinstance(v, list): for vi in v: print >> f, k, vi else: print >> f, k, v print >> f, ''' end quit ''' f.close() try: # apbs will fail if grid does not fit into memory # -> on failure repeat with larger grid spacing for _ in range(3): dime = [1 + max(64, n / grid) for n in fglen] apbs_in['dime'] = '%d %d %d' % tuple(dime) write_input_file() # run apbs r = subprocess.call([exe, infile], cwd=tempdir) if r == 0: break if r == -6: grid *= 2.0 if not quiet: print ' Warning: retry with grid =', grid continue print ' Error: apbs failed with code', r raise CmdException dx_list = glob.glob(stem + '*.dx') if len(dx_list) != 1: print ' Error: dx file missing' raise CmdException # load map cmd.load(dx_list[0], name, quiet=quiet) except OSError: print ' Error: Cannot execute "%s"' % (exe) raise CmdException finally: if not preserve: shutil.rmtree(tempdir) elif not quiet: print ' Notice: not deleting %s' % (tempdir)
def map_new_apbs(name, selection='all', grid=0.5, buffer=10.0, state=1, preserve=0, exe='', assign=-1, focus='', quiet=1, _template=''): ''' DESCRIPTION Create electrostatic potential map with APBS. For more control over parameters and a graphical user interface I recommend to use the APBS Tools Plugin instead. In case of missing atoms or residues I recommend to remodel the input structure with modeller before calculating the electrostatic potential. If selection has no charges and radii, they will be automatically assigned with PyMOL (not with pdb2pqr). SEE ALSO apbs_surface, map_new (coulomb), APBS Tools Plugin ''' import tempfile, os, shutil, glob, subprocess from pymol.util import protein_assign_charges_and_radii from .modelling import add_missing_atoms selection = '(%s) and not solvent' % (selection) grid, buffer, state = float(grid), float(buffer), int(state) preserve, assign, quiet = int(preserve), int(assign), int(quiet) # path to apbs executable exe = validate_apbs_exe(exe) # temporary directory tempdir = tempfile.mkdtemp() if not quiet: print(' Tempdir:', tempdir) # filenames pqrfile = os.path.join(tempdir, 'mol.pqr') infile = os.path.join(tempdir, 'apbs.in') stem = os.path.join(tempdir, 'map') # temporary object tmpname = cmd.get_unused_name('mol' if preserve else '_') cmd.create(tmpname, selection, state, 1) # partial charges assign = [assign] if assign[0] == -1: # auto detect if selection has charges and radii cmd.iterate(tmpname, 'assign[0] *= (elec_radius * partial_charge) == 0.0', space=locals()) if assign[0]: cmd.remove('hydro and model ' + tmpname) add_missing_atoms(tmpname, quiet=quiet) protein_assign_charges_and_radii(tmpname) elif not quiet: print(' Notice: using exsiting charges and radii') cmd.save(pqrfile, tmpname, 1, format='pqr', quiet=quiet) # grid dimensions extent = cmd.get_extent(tmpname) extentfocus = cmd.get_extent(focus) if focus else extent fglen = [(emax - emin + 2 * buffer) for (emin, emax) in zip(*extentfocus)] cglen = [(emax - emin + 4 * buffer) for (emin, emax) in zip(*extent)] if not preserve: cmd.delete(tmpname) apbs_in = { 'pqrfile': pqrfile, 'fgcent': 'mol 1', 'fglen': '%f %f %f' % tuple(fglen), 'cglen': '%f %f %f' % tuple(cglen), 'srad': cmd.get('solvent_radius'), 'mapfile': stem, } if focus: apbs_in['fgcent'] = '%f %f %f' % tuple( (emax + emin) / 2.0 for (emin, emax) in zip(*extentfocus)) try: # apbs will fail if grid does not fit into memory # -> on failure repeat with larger grid spacing for _ in range(3): dime = [1 + max(64, n / grid) for n in fglen] apbs_in['dime'] = '%d %d %d' % tuple(dime) # apbs input file with open(infile, 'w') as f: f.write((_template or template_apbs_in).format(**apbs_in)) # run apbs r = subprocess.call([exe, infile], cwd=tempdir) if r == 0: break if r in (-6, -9): grid *= 2.0 if not quiet: print(' Warning: retry with grid =', grid) continue raise CmdException('apbs failed with code ' + str(r)) dx_list = glob.glob(stem + '*.dx') if len(dx_list) != 1: raise CmdException('dx file missing') # load map cmd.load(dx_list[0], name, quiet=quiet) except OSError: raise CmdException('Cannot execute "%s"' % (exe)) finally: if not preserve: shutil.rmtree(tempdir) elif not quiet: print(' Notice: not deleting %s' % (tempdir))
def map_new_apbs(name, selection='all', grid=0.5, buffer=10.0, state=1, preserve=0, exe='', assign=-1, focus='', quiet=1): ''' DESCRIPTION Create electrostatic potential map with APBS. For more control over parameters and a graphical user interface I recommend to use the APBS Tools Plugin instead. In case of missing atoms or residues I recommend to remodel the input structure with modeller before calculating the electrostatic potential. If selection has no charges and radii, they will be automatically assigned with PyMOL (not with pdb2pqr). SEE ALSO apbs_surface, map_new (coulomb), APBS Tools Plugin ''' import tempfile, os, shutil, glob, subprocess from pymol.util import protein_assign_charges_and_radii from .modelling import add_missing_atoms selection = '(%s) and not solvent' % (selection) grid, buffer, state = float(grid), float(buffer), int(state) preserve, assign, quiet = int(preserve), int(assign), int(quiet) if exe: exe = cmd.exp_path(exe) else: try: import freemol.apbs exe = freemol.apbs.get_exe_path() except: pass if not exe: exe = "apbs" try: r = subprocess.call([exe, "--version"], stdout=open(os.devnull, "w"), stderr=subprocess.STDOUT) if r < 0: raise CmdException("Broken executable: " + exe) except OSError: raise CmdException("Cannot execute: " + exe) # temporary directory tempdir = tempfile.mkdtemp() if not quiet: print(' Tempdir:', tempdir) # filenames pqrfile = os.path.join(tempdir, 'mol.pqr') infile = os.path.join(tempdir, 'apbs.in') stem = os.path.join(tempdir, 'map') # temporary object tmpname = cmd.get_unused_name('mol' if preserve else '_') cmd.create(tmpname, selection, state, 1) # partial charges assign = [assign] if assign[0] == -1: # auto detect if selection has charges and radii cmd.iterate('first ((%s) and elem O)' % (tmpname), 'assign[0] = (elec_radius * partial_charge) == 0.0', space=locals()) if assign[0]: cmd.remove('hydro and model ' + tmpname) add_missing_atoms(tmpname, quiet=quiet) protein_assign_charges_and_radii(tmpname) elif not quiet: print(' Notice: using exsiting charges and radii') cmd.save(pqrfile, tmpname, 1, format='pqr', quiet=quiet) # grid dimensions extent = cmd.get_extent(tmpname) extentfocus = cmd.get_extent(focus) if focus else extent fglen = [(emax-emin + 2*buffer) for (emin, emax) in zip(*extentfocus)] cglen = [(emax-emin + 4*buffer) for (emin, emax) in zip(*extent)] if not preserve: cmd.delete(tmpname) apbs_in = defaults_apbs_in.copy() apbs_in['fglen'] = '%f %f %f' % tuple(fglen) apbs_in['cglen'] = '%f %f %f' % tuple(cglen) apbs_in['srad'] = cmd.get('solvent_radius') apbs_in['write'] = 'pot dx "%s"' % (stem) if focus: apbs_in['fgcent'] = '%f %f %f' % tuple((emax + emin) / 2.0 for (emin, emax) in zip(*extentfocus)) # apbs input file def write_input_file(): f = open(infile, 'w') print(''' read mol pqr "%s" end elec mg-auto ''' % (pqrfile), file=f) for (k,v) in apbs_in.items(): if v is None: print(k, file=f) elif isinstance(v, list): for vi in v: print(k, vi, file=f) else: print(k, v, file=f) print(''' end quit ''', file=f) f.close() try: # apbs will fail if grid does not fit into memory # -> on failure repeat with larger grid spacing for _ in range(3): dime = [1 + max(64, n / grid) for n in fglen] apbs_in['dime'] = '%d %d %d' % tuple(dime) write_input_file() # run apbs r = subprocess.call([exe, infile], cwd=tempdir) if r == 0: break if r in (-6, -9): grid *= 2.0 if not quiet: print(' Warning: retry with grid =', grid) continue print(' Error: apbs failed with code', r) raise CmdException dx_list = glob.glob(stem + '*.dx') if len(dx_list) != 1: print(' Error: dx file missing') raise CmdException # load map cmd.load(dx_list[0], name, quiet=quiet) except OSError: print(' Error: Cannot execute "%s"' % (exe)) raise CmdException finally: if not preserve: shutil.rmtree(tempdir) elif not quiet: print(' Notice: not deleting %s' % (tempdir))