def testPretty(self): cmd.load(self.datafile('1oky.pdb.gz')) preset.pretty('all') self._assertPrettyReps() self.assertFalse( cmd.get_setting_boolean('cartoon_smooth_loops', '1oky')) self.assertFalse( cmd.get_setting_boolean('cartoon_fancy_helices', '1oky'))
def wait_for(name, state=0, quiet=1): ''' DESCRIPTION Wait for "name" to be available as selectable object. ''' if cmd.count_atoms('?' + name, 1, state) == 0: s = cmd.get_setting_boolean('suspend_updates') if s: cmd.set('suspend_updates', 0) cmd.refresh() if s: cmd.set('suspend_updates')
def save_pdb_without_ter(filename, selection, *args, **kwargs): ''' DESCRIPTION Save PDB file without TER records. External applications like TMalign and DynDom stop reading PDB files at TER records, which might be undesired in case of missing loops. ''' v = cmd.get_setting_boolean('pdb_use_ter_records') if v: cmd.set('pdb_use_ter_records', 0) cmd.save(filename, selection, *args, **kwargs) if v: cmd.set('pdb_use_ter_records')
def save_pdb_without_ter(filename, selection, **kwargs): ''' DESCRIPTION Save PDB file without TER records. External applications like TMalign and DynDom stop reading PDB files at TER records, which might be undesired in case of missing loops. ''' v = cmd.get_setting_boolean('pdb_use_ter_records') if v: cmd.unset('pdb_use_ter_records') cmd.save(filename, selection, **kwargs) if v: cmd.set('pdb_use_ter_records')
def get_object_state(name): ''' DESCRIPTION Returns the effective object state. ''' states = cmd.count_states(name) if states < 2 and cmd.get_setting_boolean('static_singletons'): return 1 state = cmd.get_setting_int('state', name) if state > states: print(' Error: Invalid state %d for object %s' % (state, name)) raise CmdException return state
def save_movie_mpeg1(filename, mode='', first=0, last=0, preserve=0, fps=25, twopass=1, vbitrate=16000, quiet=1, exe='mencoder'): ''' DESCRIPTION Save movie as MPEG1 This will not be the best quality possible for the file size, but we were successfull to play those movies in PowerPoint. Requires mencoder executable from http://mplayerhq.hu ARGUMENTS filename = string: Filename, should end on '.mpeg' mode = normal | draw | ray first, last = integer: first and last frame number preserve = 0 or 1: delete temporary images if 0 {default: 0} fps = integer: frames per second {default: 25} twopass = 0 or 1: two pass mode encoding (improves quality) {default: 1} vbitrate = integer: average video bitrate {default: 16000} WARNING: 4-16000 (in kbit), 16001-24000000 (in bit) SEE ALSO cmd.movie.produce, http://www.freemol.org ''' import os, subprocess, tempfile first, last, quiet = int(first), int(last), int(quiet) fps, twopass, vbitrate = int(fps), int(twopass), int(vbitrate) if cmd.is_string(mode): if mode == '': if cmd.pymol.invocation.options.no_gui \ or cmd.get_setting_boolean('ray_trace_frames'): mode = 'ray' else: mode = 'draw' mode = produce_mode_sc.auto_err(mode, 'mode') mode = produce_mode_dict[mode] mode = int(mode) try: subprocess.call([exe]) except OSError: print(' Error: Cannot execute "%s"' % (exe)) raise CmdException if not quiet: print(' save_movie: Rendering frames...') tmp_path = tempfile.mkdtemp() prefix = os.path.join(tmp_path, 'frame') cmd.mpng(prefix, first, last, preserve, mode=mode) mpeg1line = '-mf type=png:fps=%d -ovc lavc -forceidx -noskip -of rawvideo' \ + ' -mpegopts format=mpeg1 -lavcopts vcodec=mpeg1video:vbitrate=%d' \ + ':vhq:trell:keyint=25' mpeg1line = mpeg1line % (fps, vbitrate) cmdline = exe + ' -quiet mf://' + prefix + '* ' + mpeg1line if not quiet: print(' save_movie: Running mencoder...') if twopass: if not quiet: print(' save_movie: First pass...') cmdline1 = cmdline + ':vpass=1' subprocess.call(cmdline1.split() + ['-o', os.devnull]) if not quiet: print(' save_movie: Second pass...') cmdline = cmdline + ':vpass=2' subprocess.call(cmdline.split() + ['-o', filename]) if not preserve: import shutil shutil.rmtree(tmp_path) elif not quiet: print(' save_movie: Not deleting temporary directory: ' + tmp_path) if not quiet: print(' save_movie: Done')
def testGetSettingBoolean(self): for v_ref in (0, 1): cmd.set('orthoscopic', v_ref) v = cmd.get_setting_boolean('orthoscopic') self.assertTrue(isinstance(v, int)) self.assertEqual(v, v_ref)
def testPretty(self): cmd.load(self.datafile('1oky.pdb.gz')) preset.pretty('all') self._assertPrettyReps() self.assertFalse(cmd.get_setting_boolean('cartoon_smooth_loops', '1oky')) self.assertFalse(cmd.get_setting_boolean('cartoon_fancy_helices', '1oky'))
def peptide_rebuild(name, selection='all', cycles=1000, state=1, quiet=1): ''' DESCRIPTION Rebuild the peptide from selection. All atoms which are present in selection will be kept fixed, while atoms missing in selection are placed by sculpting. USAGE peptide_rebuild name [, selection [, cycles [, state ]]] SEE ALSO stub2ala, add_missing_atoms, peptide_rebuild_modeller ''' from chempy import fragments, feedback, models cycles, state, quiet = int(cycles), int(state), int(quiet) # suppress feedback for model merging feedback['actions'] = False # work with named selection namedsele = cmd.get_unused_name('_') cmd.select(namedsele, selection, 0) identifiers = [] cmd.iterate(namedsele + ' and polymer and guide and alt +A', 'identifiers.append([segi,chain,resi,resv,resn])', space=locals()) model = models.Indexed() for (segi,chain,resi,resv,resn) in identifiers: try: fname = resn.lower() if resn != 'MSE' else 'met' frag = fragments.get(fname) except IOError: print(' Warning: unknown residue: ' + resn) continue for a in frag.atom: a.segi = segi a.chain = chain a.resi = resi a.resi_number = resv a.resn = resn model.merge(frag) if not quiet: print(' Loading model...') cmd.load_model(model, name, 1, zoom=0) if cmd.get_setting_boolean('auto_remove_hydrogens'): cmd.remove(name + ' and hydro') cmd.protect(name + ' in ' + namedsele) cmd.sculpt_activate(name) cmd.update(name, namedsele, 1, state) cmd.delete(namedsele) if not quiet: print(' Sculpting...') cmd.set('sculpt_field_mask', 0x003, name) # bonds and angles only cmd.sculpt_iterate(name, 1, int(cycles / 4)) cmd.set('sculpt_field_mask', 0x09F, name) # local + torsions cmd.sculpt_iterate(name, 1, int(cycles / 4)) cmd.set('sculpt_field_mask', 0x0FF, name) # ... + vdw cmd.sculpt_iterate(name, 1, int(cycles / 2)) cmd.sculpt_deactivate(name) cmd.deprotect(name) cmd.unset('sculpt_field_mask', name) if not quiet: print(' Connecting peptide...') pairs = cmd.find_pairs(name + ' and name C', name + ' and name N', 1, 1, 2.0) for pair in pairs: cmd.bond(*pair) cmd.h_fix(name) if not quiet: print(' peptide_rebuild: done')
parser.add_argument('--xml', action='store_true') parser.add_argument('filenames', nargs='*', default=[]) parser.add_argument('--out', default=sys.stdout) parser.add_argument('--offline', action='store_true') parser.add_argument('--no-mmlibs', action='store_true') parser.add_argument('--no-undo', action='store_true') parser.add_argument('--verbosity', type=int, default=2) have_dash_dash = __file__.startswith(sys.argv[0]) or '--run' in sys.argv cliargs = parser.parse_known_args(None if have_dash_dash else [])[0] run_all = False max_threads = int(cmd.get('max_threads')) cmd.set('use_shaders') use_shaders = cmd.get_setting_boolean('use_shaders') pymol_test_dir = os.path.abspath(os.path.dirname(__file__)) deferred_unlink = [] deferred_rmtree = [] class requires_version(object): ''' Decorator for restricting to PyMOL version ''' def __init__(self, version): self.version = version def _tupleize(self, strversion): r = []
def peptide_rebuild(name, selection='all', cycles=1000, state=1, quiet=1): ''' DESCRIPTION Rebuild the peptide from selection. All atoms which are present in selection will be kept fixed, while atoms missing in selection are placed by sculpting. USAGE peptide_rebuild name [, selection [, cycles [, state ]]] SEE ALSO stub2ala, add_missing_atoms, peptide_rebuild_modeller ''' from chempy import fragments, feedback, models cycles, state, quiet = int(cycles), int(state), int(quiet) # suppress feedback for model merging feedback['actions'] = False # work with named selection namedsele = cmd.get_unused_name('_') cmd.select(namedsele, selection, 0) identifiers = [] cmd.iterate(namedsele + ' and polymer and guide and alt +A', 'identifiers.append([segi,chain,resi,resv,resn])', space=locals()) model = models.Indexed() for (segi,chain,resi,resv,resn) in identifiers: try: fname = resn.lower() if resn != 'MSE' else 'met' frag = fragments.get(fname) except IOError: print(' Warning: unknown residue:', resn) continue for a in frag.atom: a.segi = segi a.chain = chain a.resi = resi a.resi_number = resv a.resn = resn model.merge(frag) if not quiet: print(' Loading model...') cmd.load_model(model, name, 1, zoom=0) if cmd.get_setting_boolean('auto_remove_hydrogens'): cmd.remove(name + ' and hydro') cmd.protect(name + ' in ' + namedsele) cmd.sculpt_activate(name) cmd.update(name, namedsele, 1, state) cmd.delete(namedsele) if not quiet: print(' Sculpting...') cmd.set('sculpt_field_mask', 0x003, name) # bonds and angles only cmd.sculpt_iterate(name, 1, int(cycles / 4)) cmd.set('sculpt_field_mask', 0x09F, name) # local + torsions cmd.sculpt_iterate(name, 1, int(cycles / 4)) cmd.set('sculpt_field_mask', 0x0FF, name) # ... + vdw cmd.sculpt_iterate(name, 1, int(cycles / 2)) cmd.sculpt_deactivate(name) cmd.deprotect(name) cmd.unset('sculpt_field_mask', name) if not quiet: print(' Connecting peptide...') pairs = cmd.find_pairs(name + ' and name C', name + ' and name N', 1, 1, 2.0) for pair in pairs: cmd.bond(*pair) cmd.h_fix(name) if not quiet: print(' peptide_rebuild: done')
def fetchdialog(): app = plugins.get_pmgapp() root = plugins.get_tk_root() self = Tkinter.Toplevel(root) self.title('PDB Loader Service') self.minsize(250, 0) self.resizable(0, 0) outer = self pad = 4 type_options = [ "cif (mmCIF)", "pdb (Asymmetric Unit)", "pdb1 (Biological Unit)", "2fofc (Density)", "fofc (Difference Density)", "cid (PubChem Compound)", "sid (PubChem Substance)", "emd (EMDB Density)", "cc (Chemical Component)", ] var_code = Tkinter.StringVar(self) var_chain = Tkinter.StringVar(self) var_assembly = Tkinter.StringVar(self, cmd.get('assembly')) var_name = Tkinter.StringVar(self) var_type = Tkinter.StringVar(self, type_options[0]) var_keep = Tkinter.BooleanVar( self, not cmd.get_setting_boolean('autoclose_dialogs')) def callback(*args): code = var_code.get() type = get_trunc(var_type) if type in ('pdb', 'cif'): code += var_chain.get() if type == 'cif': cmd.set('assembly', var_assembly.get()) try: result = cmd.fetch(code, var_name.get(), type=type) if result == -1: raise CmdException('You entered an invalid pdb code: ' + code) except CmdException as e: tkMessageBox.showerror('Error', str(e), parent=self) return cmd.log('fetch %s, type=%s, async=0\n' % (code, type)) if not var_keep.get(): self.destroy() def callback_type(*args): v = get_trunc(var_type) if v.startswith('pdb') or v.endswith('fofc') or v.startswith('cif'): but_code.configure(width=4) else: but_code.configure(width=20) if v in ('pdb', 'cif'): frame_pdb.pack(side=LEFT) else: frame_pdb.pack_forget() if v == 'cif': frame_assembly.pack(side=LEFT) else: frame_assembly.pack_forget() def makerow(label=None, parent=None, **kwargs): master = Tkinter.Frame(parent or outer) master.pack(fill=Tkinter.X, **kwargs) if label: Tkinter.Label(master, text=label).pack(side=LEFT) return master padkw = {'padx': pad, 'pady': (pad, 0)} master = makerow("Type:", **padkw) but_type = Tkinter.OptionMenu(master, var_type, *type_options, command=callback_type).pack(side=LEFT) master = makerow("Code:", **padkw) but_code = Tkinter.Entry(master, textvariable=var_code, width=4) but_code.bind("<Return>", callback) but_code.pack(side=LEFT) frame_pdb = makerow("Chain:", master, side=LEFT, padx=8) but_chain = Tkinter.Entry(frame_pdb, textvariable=var_chain, width=4) but_chain.bind("<Return>", callback) but_chain.pack(side=LEFT) frame_assembly = makerow("Assembly:", master, side=LEFT, padx=8) but_assembly = Tkinter.Entry(frame_assembly, textvariable=var_assembly, width=4) but_assembly.bind("<Return>", callback) but_assembly.pack(side=LEFT) frame_name = makerow("Name of new object:", **padkw) but_name = Tkinter.Entry(frame_name, textvariable=var_name, width=8) but_name.bind("<Return>", callback) but_name.pack(side=LEFT) master = makerow(padx=pad, pady=(2 * pad, 0)) but_ok = Tkinter.Button(master, width=10, text="OK", command=callback) but_cancel = Tkinter.Button(master, width=10, text="Cancel", command=self.destroy) but_cancel.pack(side=RIGHT, fill=Tkinter.X) but_ok.pack(side=RIGHT, fill=Tkinter.X) master = makerow(padx=pad, pady=(2, pad)) but_keep = Tkinter.Checkbutton(master, text="Keep dialog open", variable=var_keep) but_keep.pack(side=RIGHT) but_code.focus_set()
def save_movie_mpeg1(filename, mode='', first=0, last=0, preserve=0, fps=25, twopass=1, vbitrate=16000, quiet=1, exe='mencoder'): ''' DESCRIPTION Save movie as MPEG1 This will not be the best quality possible for the file size, but we were successfull to play those movies in PowerPoint. Requires mencoder executable from http://mplayerhq.hu ARGUMENTS filename = string: Filename, should end on '.mpeg' mode = normal | draw | ray first, last = integer: first and last frame number preserve = 0 or 1: delete temporary images if 0 {default: 0} fps = integer: frames per second {default: 25} twopass = 0 or 1: two pass mode encoding (improves quality) {default: 1} vbitrate = integer: average video bitrate {default: 16000} WARNING: 4-16000 (in kbit), 16001-24000000 (in bit) SEE ALSO cmd.movie.produce, http://www.freemol.org ''' import os, subprocess, tempfile first, last, quiet = int(first), int(last), int(quiet) fps, twopass, vbitrate = int(fps), int(twopass), int(vbitrate) if cmd.is_string(mode): if mode == '': if cmd.pymol.invocation.options.no_gui \ or cmd.get_setting_boolean('ray_trace_frames'): mode = 'ray' else: mode = 'draw' mode = produce_mode_sc.auto_err(mode, 'mode') mode = produce_mode_dict[mode] mode = int(mode) try: subprocess.call([exe]) except OSError: print ' Error: Cannot execute "%s"' % (exe) raise CmdException if not quiet: print ' save_movie: Rendering frames...' tmp_path = tempfile.mkdtemp() prefix = os.path.join(tmp_path, 'frame') cmd.mpng(prefix, first, last, preserve, mode=mode) mpeg1line = '-mf type=png:fps=%d -ovc lavc -forceidx -noskip -of rawvideo' \ + ' -mpegopts format=mpeg1 -lavcopts vcodec=mpeg1video:vbitrate=%d' \ + ':vhq:trell:keyint=25' mpeg1line = mpeg1line % (fps, vbitrate) cmdline = exe + ' -quiet mf://' + prefix + '* ' + mpeg1line if not quiet: print ' save_movie: Running mencoder...' if twopass: if not quiet: print ' save_movie: First pass...' cmdline1 = cmdline + ':vpass=1' subprocess.call(cmdline1.split() + ['-o', os.devnull]) if not quiet: print ' save_movie: Second pass...' cmdline = cmdline + ':vpass=2' subprocess.call(cmdline.split() + ['-o', filename]) if not preserve: import shutil shutil.rmtree(tmp_path) elif not quiet: print ' save_movie: Not deleting temporary directory:', tmp_path if not quiet: print ' save_movie: Done'
from pymol import cmd from pymol.invocation import options usage = 'pymol [pymol options] %s [test options]' % (os.path.basename(__file__)) parser = argparse.ArgumentParser(usage=usage) parser.add_argument('--run', dest='filenames', nargs='*', default=[]) parser.add_argument('--out', default=sys.stdout) parser.add_argument('--offline', action='store_true') parser.add_argument('--verbosity', type=int, default=2) cliargs = parser.parse_known_args()[0] run_all = False max_threads = int(cmd.get('max_threads')) cmd.set('use_shaders') use_shaders = cmd.get_setting_boolean('use_shaders') pymol_test_dir = os.path.abspath(os.path.dirname(__file__)) deferred_unlink = [] class requires(object): ''' Decorator for test methods which only should be executed under certain conditions. Example: >>> @requires('gui') >>> def testSomething(self): >>> do_something()
def fetchdialog(): from Tkinter import LEFT, RIGHT, TOP, BOTTOM app = plugins.get_pmgapp() root = plugins.get_tk_root() self = Tkinter.Toplevel(root) self.title('PDB Loader Service') self.minsize(250, 0) self.resizable(0,0) outer = self pad = 4 type_options = [ "pdb (Asymmetric Unit)", "pdb1 (Biological Unit)", "2fofc (Density)", "fofc (Difference Density)", "cid (PubChem Compound)", "sid (PubChem Substance)", "emd (EMDB Density)", ] var_code = Tkinter.StringVar(self) var_chain = Tkinter.StringVar(self) var_type = Tkinter.StringVar(self, type_options[0]) var_keep = Tkinter.BooleanVar(self, not cmd.get_setting_boolean('autoclose_dialogs')) def callback(*args): code = var_code.get() type = get_trunc(var_type) if type == 'pdb': code += var_chain.get() try: result = cmd.fetch(code, type=type) if result == -1: raise CmdException('You entered an invalid pdb code: ' + code) except CmdException as e: import tkMessageBox tkMessageBox.showerror('Error', str(e), parent=self) return cmd.log('fetch %s, type=%s, async=0\n' % (code, type)) if not var_keep.get(): self.destroy() def callback_type(*args): v = get_trunc(var_type) if v.startswith('pdb') or v.endswith('fofc'): but_code.configure(width=4) else: but_code.configure(width=20) if v == 'pdb': frame_pdb.pack(side=LEFT) else: frame_pdb.pack_forget() def makerow(label=None, parent=None, **kwargs): master = Tkinter.Frame(parent or outer) master.pack(fill=Tkinter.X, **kwargs) if label: Tkinter.Label(master, text=label).pack(side=LEFT) return master padkw = {'padx': pad, 'pady': (pad, 0)} master = makerow("Type:", **padkw) but_type = Tkinter.OptionMenu(master, var_type, *type_options, command=callback_type).pack(side=LEFT) master = makerow("Code:", **padkw) but_code = Tkinter.Entry(master, textvariable=var_code, width=4) but_code.bind("<Return>", callback) but_code.pack(side=LEFT) frame_pdb = makerow("Chain:", master, side=LEFT, padx=8) but_chain = Tkinter.Entry(frame_pdb, textvariable=var_chain, width=4) but_chain.bind("<Return>", callback) but_chain.pack(side=LEFT) master = makerow(padx=pad, pady=(2*pad,0)) but_ok = Tkinter.Button(master, width=10, text="OK", command=callback) but_cancel = Tkinter.Button(master, width=10, text="Cancel", command=self.destroy) but_cancel.pack(side=RIGHT, fill=Tkinter.X) but_ok.pack(side=RIGHT, fill=Tkinter.X) master = makerow(padx=pad, pady=(2,pad)) but_keep = Tkinter.Checkbutton(master, text="Keep dialog open", variable=var_keep) but_keep.pack(side=RIGHT) but_code.focus_set()