def fillInUI(self, parent): import Tkinter import Pmw self.scale = Pmw.Counter(parent, labelpos="w", label_text="Border scale:", entryfield_value=1.0, datatype={"counter": "real"}, entryfield_validate={ "validator": "real", "min": 0.0, "max": 2.0, }, increment=0.1) self.scale.pack(side=Tkinter.BOTTOM, expand=Tkinter.FALSE, fill=Tkinter.X) from chimera.widgets import ModelScrolledListBox self.modListBox = ModelScrolledListBox(parent, listbox_selectmode="extended", labelpos="n", label_text="Models") self.modListBox.pack(side=Tkinter.LEFT, expand=Tkinter.TRUE, fill=Tkinter.BOTH)
class TileStructuresCB(ModelessDialog): title = "Tile Structures" help = "ContributedSoftware/ensembletile/ensembletile.html" oneshot = True def configure(self, models=[]): self.modListBox.setvalue(models) def fillInUI(self, parent): import Tkinter import Pmw self.scale = Pmw.Counter(parent, labelpos="w", label_text="Border scale:", entryfield_value=1.0, datatype={"counter": "real"}, entryfield_validate={ "validator": "real", "min": 0.0, "max": 2.0, }, increment=0.1) self.scale.pack(side=Tkinter.BOTTOM, expand=Tkinter.FALSE, fill=Tkinter.X) from chimera.widgets import ModelScrolledListBox self.modListBox = ModelScrolledListBox(parent, listbox_selectmode="extended", labelpos="n", label_text="Models") self.modListBox.pack(side=Tkinter.LEFT, expand=Tkinter.TRUE, fill=Tkinter.BOTH) def Apply(self): modList = self.modListBox.getvalue() if len(modList) == 0: import chimera raise chimera.UserError("No models selected") ef = self.scale.component("entryfield") if not ef.valid(): import chimera raise chimera.UserError(ScaleErrorText) s = float(ef.getvalue()) import base base.tile(modList, s)
class TileStructuresCB(ModelessDialog): title = "Tile Structures" help = "ContributedSoftware/ensembletile/ensembletile.html" oneshot = True def configure(self, models=[]): self.modListBox.setvalue(models) def fillInUI(self, parent): import Tkinter import Pmw self.scale = Pmw.Counter(parent, labelpos="w", label_text="Border scale:", entryfield_value=1.0, datatype={ "counter":"real" }, entryfield_validate={ "validator":"real", "min":0.0, "max":2.0, }, increment=0.1) self.scale.pack(side=Tkinter.BOTTOM, expand=Tkinter.FALSE, fill=Tkinter.X) from chimera.widgets import ModelScrolledListBox self.modListBox = ModelScrolledListBox(parent, listbox_selectmode="extended", labelpos="n", label_text="Models") self.modListBox.pack(side=Tkinter.LEFT, expand=Tkinter.TRUE, fill=Tkinter.BOTH) def Apply(self): modList = self.modListBox.getvalue() if len(modList) == 0: import chimera raise chimera.UserError("No models selected") ef = self.scale.component("entryfield") if not ef.valid(): import chimera raise chimera.UserError(ScaleErrorText) s = float(ef.getvalue()) import base base.tile(modList, s)
def fillInUI(self, parent): import Tkinter import Pmw self.scale = Pmw.Counter(parent, labelpos="w", label_text="Border scale:", entryfield_value=1.0, datatype={ "counter":"real" }, entryfield_validate={ "validator":"real", "min":0.0, "max":2.0, }, increment=0.1) self.scale.pack(side=Tkinter.BOTTOM, expand=Tkinter.FALSE, fill=Tkinter.X) from chimera.widgets import ModelScrolledListBox self.modListBox = ModelScrolledListBox(parent, listbox_selectmode="extended", labelpos="n", label_text="Models") self.modListBox.pack(side=Tkinter.LEFT, expand=Tkinter.TRUE, fill=Tkinter.BOTH)
def fillInUI(self, parent): import Pmw, Tkinter self.buttonWidgets['OK']['state'] = 'disabled' self.buttonWidgets['Apply']['state'] = 'disabled' from chimera.widgets import ModelScrolledListBox self.surfListBox = ModelScrolledListBox( parent, labelpos='n', label_text='Surfaces to color by ESP:', listbox_selectmode="extended", filtFunc=lambda m: isinstance(m, chimera.MSMSModel), selectioncommand=self._selSurfCB) self.surfListBox.grid(row=0, column=0, sticky="nsew", columnspan=2) Pmw.OptionMenu(parent, command=self._menuCB, initialitem="3", items=[str(x) for x in range(2, 12)], labelpos='w', label_text="Number of colors/values:").grid( row=1, column=0, columnspan=2) f = self.interpFrame = Tkinter.Frame(parent) f.grid(row=2, column=0, columnspan=2) self.wells = [] self.values = [] self._entryOpts = { 'validate': 'real', 'entry_justify': 'center', 'entry_width': 6 } from CGLtk.color.ColorWell import ColorWell for color, value in [("red", -10), ("white", 0), ("blue", 10)]: well = ColorWell(f, color=color) well.grid(row=0, column=len(self.wells)) self.wells.append(well) entry = Pmw.EntryField(f, value=str(value), **self._entryOpts) entry.grid(row=1, column=len(self.values)) self.values.append(entry) from chimera.tkoptions import FloatOption, BooleanOption self.distDep = BooleanOption( parent, 3, "Distance-dependent dielectric", True, None, balloon="If true, charge falls off with distance squared to\n" "simulate solvent screening effects") self.dielectric = FloatOption(parent, 4, "Dielectric constant", 4.0, None) self.surfDist = FloatOption(parent, 5, "Distance from surface", 1.4, None, balloon="Potential at this distance from\n" "the surface is used for coloring") self.hisGroup = Pmw.Group(parent, hull_padx=2, tag_text="Implicit Histidine Protonation") self.hisGroup.grid(row=6, column=0, columnspan=2, sticky="nsew") self.hisProtVar = Tkinter.StringVar(parent) self.hisProtVar.set("name") interior = self.hisGroup.interior() interior.columnconfigure(0, weight=1) lab = Tkinter.Label( interior, text="Assumed histidine " "protonation for\nstructures without explicit hydrogens") from tkFont import Font font = Font(font=lab.cget('font')) font.config(size=int(0.75 * float(font.cget('size'))), slant='italic') lab.config(font=font) lab.grid(row=0) Tkinter.Radiobutton(interior, variable=self.hisProtVar, value="name", text="Residue name-based", command=self._switchHisList).grid(row=1, sticky='w') f = Tkinter.Frame(interior) f.grid(row=2) Tkinter.Label(f, text="HID/HIE/HIP = delta/epsilon/both").grid(row=0, sticky='w') self.hisDefault = Pmw.OptionMenu( f, initialitem=self.HB, items=[self.HB, "delta", "epsilon", "both"], labelpos='w', label_text="HIS = ", command=lambda a, s=self: setattr(s, 'hisChanged', True)) self.hisDefault.grid(row=1, sticky='w') self._pickText = Tkinter.StringVar(parent) self._pickText.set("Specified individually...") Tkinter.Radiobutton(interior, variable=self.hisProtVar, value="pick", textvariable=self._pickText, command=self._switchHisList).grid(row=3, sticky='w') Tkinter.Button(parent, pady=0, command=self._colorKeyCB, text="Create corresponding color key").grid( row=7, column=0, columnspan=2) self.hisChanged = False
class EspDialog(ModelessDialog): title = "Coulombic Surface Coloring" name = "ESP computation" help = "ContributedSoftware/coulombic/coulombic.html" HB = "estimated from H-bonds" def fillInUI(self, parent): import Pmw, Tkinter self.buttonWidgets['OK']['state'] = 'disabled' self.buttonWidgets['Apply']['state'] = 'disabled' from chimera.widgets import ModelScrolledListBox self.surfListBox = ModelScrolledListBox( parent, labelpos='n', label_text='Surfaces to color by ESP:', listbox_selectmode="extended", filtFunc=lambda m: isinstance(m, chimera.MSMSModel), selectioncommand=self._selSurfCB) self.surfListBox.grid(row=0, column=0, sticky="nsew", columnspan=2) Pmw.OptionMenu(parent, command=self._menuCB, initialitem="3", items=[str(x) for x in range(2, 12)], labelpos='w', label_text="Number of colors/values:").grid( row=1, column=0, columnspan=2) f = self.interpFrame = Tkinter.Frame(parent) f.grid(row=2, column=0, columnspan=2) self.wells = [] self.values = [] self._entryOpts = { 'validate': 'real', 'entry_justify': 'center', 'entry_width': 6 } from CGLtk.color.ColorWell import ColorWell for color, value in [("red", -10), ("white", 0), ("blue", 10)]: well = ColorWell(f, color=color) well.grid(row=0, column=len(self.wells)) self.wells.append(well) entry = Pmw.EntryField(f, value=str(value), **self._entryOpts) entry.grid(row=1, column=len(self.values)) self.values.append(entry) from chimera.tkoptions import FloatOption, BooleanOption self.distDep = BooleanOption( parent, 3, "Distance-dependent dielectric", True, None, balloon="If true, charge falls off with distance squared to\n" "simulate solvent screening effects") self.dielectric = FloatOption(parent, 4, "Dielectric constant", 4.0, None) self.surfDist = FloatOption(parent, 5, "Distance from surface", 1.4, None, balloon="Potential at this distance from\n" "the surface is used for coloring") self.hisGroup = Pmw.Group(parent, hull_padx=2, tag_text="Implicit Histidine Protonation") self.hisGroup.grid(row=6, column=0, columnspan=2, sticky="nsew") self.hisProtVar = Tkinter.StringVar(parent) self.hisProtVar.set("name") interior = self.hisGroup.interior() interior.columnconfigure(0, weight=1) lab = Tkinter.Label( interior, text="Assumed histidine " "protonation for\nstructures without explicit hydrogens") from tkFont import Font font = Font(font=lab.cget('font')) font.config(size=int(0.75 * float(font.cget('size'))), slant='italic') lab.config(font=font) lab.grid(row=0) Tkinter.Radiobutton(interior, variable=self.hisProtVar, value="name", text="Residue name-based", command=self._switchHisList).grid(row=1, sticky='w') f = Tkinter.Frame(interior) f.grid(row=2) Tkinter.Label(f, text="HID/HIE/HIP = delta/epsilon/both").grid(row=0, sticky='w') self.hisDefault = Pmw.OptionMenu( f, initialitem=self.HB, items=[self.HB, "delta", "epsilon", "both"], labelpos='w', label_text="HIS = ", command=lambda a, s=self: setattr(s, 'hisChanged', True)) self.hisDefault.grid(row=1, sticky='w') self._pickText = Tkinter.StringVar(parent) self._pickText.set("Specified individually...") Tkinter.Radiobutton(interior, variable=self.hisProtVar, value="pick", textvariable=self._pickText, command=self._switchHisList).grid(row=3, sticky='w') Tkinter.Button(parent, pady=0, command=self._colorKeyCB, text="Create corresponding color key").grid( row=7, column=0, columnspan=2) self.hisChanged = False def Apply(self): for entry in self.values: entry.invoke() colors = [w.rgba for w in self.wells] values = [float(e.getvalue()) for e in self.values] if self.hisProtVar.get() == "name": hisScheme = { self.HB: None, 'delta': 'HID', 'epsilon': 'HIE', 'both': 'HIP' }[self.hisDefault.getvalue()] else: hisScheme = self.hisListingData from ESP import colorEsp for surf in self.surfListBox.getvalue(): if self.hisChanged: # clear out charge values so that histidines # get new charges for a in surf.atoms: a.charge = None colorEsp(surf, colors, values, dielectric=self.dielectric.get(), distDep=self.distDep.get(), surfDist=self.surfDist.get(), hisScheme=hisScheme) self.hisChanged = False def _colorKeyCB(self): for entry in self.values: entry.invoke() from Ilabel.gui import IlabelDialog from chimera import dialogs d = dialogs.display(IlabelDialog.name) d.keyConfigure( zip([w.rgba for w in self.wells], [e.getvalue() for e in self.values])) def _menuCB(self, val): newNum = int(val) oldSettings = [] for well, entry in zip(self.wells, self.values): entry.invoke() oldSettings.append((well.rgba, float(entry.getvalue()))) well.grid_forget() well.destroy() entry.grid_forget() entry.destroy() import Pmw from CGLtk.color.ColorWell import ColorWell self.wells = [] self.values = [] scale = (len(oldSettings) - 1.0) / (newNum - 1.0) f = self.interpFrame for i in range(newNum): index = i * scale if index == int(index) \ or int(index) >= len(oldSettings): color, value = oldSettings[int(index)] else: lowc, lowv = oldSettings[int(index)] highc, highv = oldSettings[int(index) + 1] frac = index - int(index) color = [] for lowcomp, highcomp in zip(lowc, highc): color.append((1.0 - frac) * lowcomp + frac * highcomp) value = (1.0 - frac) * lowv + frac * highv well = ColorWell(f, color=color) well.grid(row=0, column=len(self.wells)) self.wells.append(well) entry = Pmw.EntryField(f, value=str(value), **self._entryOpts) entry.grid(row=1, column=len(self.values)) self.values.append(entry) def _selSurfCB(self): if self.surfListBox.getvalue(): state = 'normal' else: state = 'disabled' self.buttonWidgets['OK']['state'] = state self.buttonWidgets['Apply']['state'] = state self._updateHisListing() def _select(self, hisType): for r, vars in self._vars.items(): dv, ev = vars if hisType == "delta": dv.set(True) ev.set(False) self.hisListingData[r] = "HID" elif hisType == "epsilon": dv.set(False) ev.set(True) self.hisListingData[r] = "HIE" else: dv.set(True) ev.set(True) self.hisListingData[r] = "HIP" def _switchHisList(self): self.hisChanged = True if not hasattr(self, 'hisListing'): if self.hisProtVar.get() != "pick": return self.hisListingData = {} import Tix, Tkinter self.hisFrame = Tkinter.Frame(self.hisGroup.interior()) self.hisListing = Tix.ScrolledHList(self.hisFrame, width="3i", options="""hlist.columns 4 hlist.header 1 hlist.indicator 1""") self.hisListing.hlist.configure( selectbackground=self.hisListing['background'], selectborderwidth=0) self.hisListing.grid(row=0, column=0, columnspan=3, sticky="nsew") self.hisFrame.rowconfigure(1, weight=1) self.hisFrame.columnconfigure(0, weight=1) self.hisFrame.columnconfigure(1, weight=1) hlist = self.hisListing.hlist hlist.header_create(0, itemtype="text", text="Model") hlist.header_create(1, itemtype="text", text="Residue") hlist.header_create(2, itemtype="text", text="Delta") hlist.header_create(3, itemtype="text", text="Epsilon") self._checkButtonStyle = Tix.DisplayStyle( "window", background=hlist['background'], refwindow=self.hisListing, anchor='center') self._updateHisListing() Tkinter.Button(self.hisFrame, text="All Delta", pady=0, highlightthickness=0, command=lambda p="delta": self._select(p)).grid( row=1, column=0) Tkinter.Button(self.hisFrame, text="All Epsilon", pady=0, highlightthickness=0, command=lambda p="epsilon": self._select(p)).grid( row=1, column=1) Tkinter.Button(self.hisFrame, text="All Both", pady=0, highlightthickness=0, command=lambda p="both": self._select(p)).grid( row=1, column=2) if self.hisProtVar.get() == "pick": self._pickText.set("Specified individually:") self.hisFrame.grid(row=4, sticky="nsew") interior = self.hisGroup.interior() interior.rowconfigure(4, weight=1) self.uiMaster().rowconfigure(6, weight=4) else: self._pickText.set("Specified individually...") self.hisFrame.grid_forget() interior = self.hisGroup.interior() interior.rowconfigure(4, weight=0) self.uiMaster().rowconfigure(6, weight=0) def _toggleDelta(self, res): self.hisChanged = True old = self.hisListingData[res] if old == "HIS": new = "HID" elif old == "HID": new = "HIS" elif old == "HIE": new = "HIP" else: new = "HIE" self.hisListingData[res] = new def _toggleEpsilon(self, res): self.hisChanged = True old = self.hisListingData[res] if old == "HIS": new = "HIE" elif old == "HID": new = "HIP" elif old == "HIE": new = "HIS" else: new = "HID" self.hisListingData[res] = new def _updateHisListing(self): if not hasattr(self, 'hisListing'): return self._updateHisListingData() hlist = self.hisListing.hlist on = self.hisListing.tk.call('tix', 'getimage', 'ck_on') off = self.hisListing.tk.call('tix', 'getimage', 'ck_off') hlist.delete_all() import Tkinter row = 0 self._vars = {} for m in [s.molecule for s in self.surfListBox.getvalue()]: for r in m.residues: try: hisType = self.hisListingData[r] except KeyError: continue hlist.add(row, itemtype="text", text="%s (%s)" % (m.name, m.oslIdent())) hlist.item_create(row, 1, itemtype="text", text=r.oslIdent(start=chimera.SelResidue)) var = Tkinter.IntVar(hlist) var.set(hisType in ["HID", "HIP"]) cmd = lambda r=r: self._toggleDelta(r) self._vars[r] = [var] toggle = Tkinter.Checkbutton(hlist, command=cmd, variable=var, image=off, selectimage=on, selectcolor="", indicatoron=False, borderwidth=0) hlist.item_create(row, 2, itemtype="window", window=toggle, style=self._checkButtonStyle) var = Tkinter.IntVar(hlist) var.set(hisType in ["HIE", "HIP"]) cmd = lambda r=r: self._toggleEpsilon(r) self._vars[r].append(var) toggle = Tkinter.Checkbutton(hlist, command=cmd, variable=var, image=off, selectimage=on, selectcolor="", indicatoron=False, borderwidth=0) hlist.item_create(row, 3, itemtype="window", window=toggle, style=self._checkButtonStyle) row += 1 def _updateHisListingData(self): newData = {} default = { 'delta': 'HID', 'epsilon': 'HIE', 'both': 'HIP', self.HB: 'HID' }[self.hisDefault.getvalue()] for m in [s.molecule for s in self.surfListBox.getvalue()]: for r in m.residues: if r.type not in ["HIS", "HIE", "HIP", "HID"]: continue try: newData[r] = self.hisListingData[r] except KeyError: if r.type == 'HIS': newData[r] = default else: newData[r] = r.type self.hisListingData = newData
def fillInUI(self, parent): """fillInUI(parent) """ self.status('') self.track_xform = None # menu frame row = 0 from chimera.widgets import ModelOptionMenu self.menu = ModelOptionMenu(parent, command=self.menu_cb, labelpos='w', label_text='Model:') self.menu.grid(row=row, sticky='w', padx=8, pady=8) # initial transform frame (itf) row = row + 1 itf = Tkinter.Frame(parent,padx=8,pady=8) itf.grid(row=row, column=0, sticky='nw') # record initial itfg = Hybrid.Button_Row(itf, 'Record transform ', (('Record',self.record_initial_cb),)) itfg.frame.grid(row=0, column=0, columnspan=3, sticky='w') # parameters itfp = Tkinter.Frame(itf, padx=16) itfp.grid(row=1, column=0, sticky='w') self.init_trans, self.init_rot, self.init_ang = \ self._make_param_panel(itfp) # current transform frame (ctf) row = row + 1 ctf = Tkinter.Frame(parent, padx=8, pady=8) ctf.grid(row=row, column=0, sticky='nw') # get current ctfg = Hybrid.Button_Row(ctf, 'Current transform ', (('Get',self.record_current_cb),)) ctfg.frame.grid(row=0, column=0, sticky='w') # parameters ctfp = Tkinter.Frame(ctf, padx=16) ctfp.grid(row=1, column=0, sticky='w') self.curr_trans, self.curr_rot, self.curr_ang = \ self._make_param_panel(ctfp) # listbox frame row = row+1 from chimera.widgets import ModelScrolledListBox self.listbox = ModelScrolledListBox(parent, labelpos='w', label_text='Model List:') self.listbox.component('listbox')['selectmode'] = 'extended' self.listbox.grid(row=row, sticky='w', padx=8, pady=8) # apply frame (af) row = row + 1 af = Tkinter.Frame(parent, padx=8, pady=8) af.grid(row=row, column=0, sticky='nw') # apply afg = Hybrid.Button_Row(af, '', (('Apply',self.apply_initial_cb),)) afg.frame.grid(row=0, column=0, sticky='w') text = ' recorded transform to models\n' text = text + ' selected in above model list ' afgL = Tkinter.Label(af, text = text) afgL.grid(row=0, column=1, sticky='w') # reset afr = Hybrid.Button_Row(af, '', (('Reset',self.reset_initial_cb),)) afr.frame.grid(row=1, column=0, sticky='w') text = ' initial transform' afrL = Tkinter.Label(af, text = text) afrL.grid(row=1, column=1, sticky='w')
class TrackXformDialog(ModelessDialog): """Class TrackXformDialog() Dialog for tracking transforms in Chimera's camera coordinates. """ title= 'Track Model Transfom' name = 'track model transformation' buttons = ('Close',) # @ help = 'ContributedSoftware/SegmentTrack/trackxform.html' dir_pkg = os.path.dirname(__file__) help_path = os.path.join(dir_pkg, 'trackxform.html') help_url = 'file://' + help_path help = help_url provideStatus = True statusPosition = 'above' statusResizing = False statusWidth = 40 # --------------------------------------------------------------------- # Fill in UI # --------------------------------------------------------------------- def fillInUI(self, parent): """fillInUI(parent) """ self.status('') self.track_xform = None # menu frame row = 0 from chimera.widgets import ModelOptionMenu self.menu = ModelOptionMenu(parent, command=self.menu_cb, labelpos='w', label_text='Model:') self.menu.grid(row=row, sticky='w', padx=8, pady=8) # initial transform frame (itf) row = row + 1 itf = Tkinter.Frame(parent,padx=8,pady=8) itf.grid(row=row, column=0, sticky='nw') # record initial itfg = Hybrid.Button_Row(itf, 'Record transform ', (('Record',self.record_initial_cb),)) itfg.frame.grid(row=0, column=0, columnspan=3, sticky='w') # parameters itfp = Tkinter.Frame(itf, padx=16) itfp.grid(row=1, column=0, sticky='w') self.init_trans, self.init_rot, self.init_ang = \ self._make_param_panel(itfp) # current transform frame (ctf) row = row + 1 ctf = Tkinter.Frame(parent, padx=8, pady=8) ctf.grid(row=row, column=0, sticky='nw') # get current ctfg = Hybrid.Button_Row(ctf, 'Current transform ', (('Get',self.record_current_cb),)) ctfg.frame.grid(row=0, column=0, sticky='w') # parameters ctfp = Tkinter.Frame(ctf, padx=16) ctfp.grid(row=1, column=0, sticky='w') self.curr_trans, self.curr_rot, self.curr_ang = \ self._make_param_panel(ctfp) # listbox frame row = row+1 from chimera.widgets import ModelScrolledListBox self.listbox = ModelScrolledListBox(parent, labelpos='w', label_text='Model List:') self.listbox.component('listbox')['selectmode'] = 'extended' self.listbox.grid(row=row, sticky='w', padx=8, pady=8) # apply frame (af) row = row + 1 af = Tkinter.Frame(parent, padx=8, pady=8) af.grid(row=row, column=0, sticky='nw') # apply afg = Hybrid.Button_Row(af, '', (('Apply',self.apply_initial_cb),)) afg.frame.grid(row=0, column=0, sticky='w') text = ' recorded transform to models\n' text = text + ' selected in above model list ' afgL = Tkinter.Label(af, text = text) afgL.grid(row=0, column=1, sticky='w') # reset afr = Hybrid.Button_Row(af, '', (('Reset',self.reset_initial_cb),)) afr.frame.grid(row=1, column=0, sticky='w') text = ' initial transform' afrL = Tkinter.Label(af, text = text) afrL.grid(row=1, column=1, sticky='w') def Close(self): """Close() - close dialog. """ ModelessDialog.Close(self) def menu_cb(self, val): return # --------------------------------------------------------------------- # Paramaters panel # --------------------------------------------------------------------- def _make_param_panel(self, frame): """_make_param_panel(frame) Input: frame Output: translation translation text entry rotation rotation text entry angle angle text entry Makes the parameters panel. """ row = 0 # translation transL = Tkinter.Label(frame, text='Translation: ') transL.grid(row=row, column=0, sticky='w') trans = Tkinter.Label(frame, text='') trans.grid(row=row, column=1, sticky='w') # rotation axis row = row + 1 rotL = Tkinter.Label(frame, text='Rotation Axes: ') rotL.grid(row=row, column=0, sticky='w') rot = Tkinter.Label(frame, text='') rot.grid(row=row, column=1, sticky='w') # rotation angle row = row + 1 angL = Tkinter.Label(frame, text='Rotation Angle: ') angL.grid(row=row, column=0, sticky='w') ang = Tkinter.Label(frame, text='') ang.grid(row=row, column=1, sticky='w') return trans, rot, ang # --------------------------------------------------------------------- # Call back functions # --------------------------------------------------------------------- def record_initial_cb(self): """record_initial_cb() - callback func for record transform. """ model = self.menu.getvalue() self.record_initial(model) def record_current_cb(self): """record_current_cb() - callback func for current transform. """ model = self.menu.getvalue() self.record_current(model) def apply_initial_cb(self): """apply_initial_cb() - callback function for apply button. """ models = self.listbox.getvalue() for model in models: self.update_current(model) model = self.menu.getvalue() self.record_current(model) def reset_initial_cb(self): """reset_initial_cb() - callback function for reset button. """ self.reset_initial() # --------------------------------------------------------------------- # Command line (for GUI) functions # --------------------------------------------------------------------- def set_model(self, model): """set_model(model) - set menu to model. """ self.menu.setvalue(model) def record_initial(self, model): """record_initial(model) - record and display model transform. """ if not model: msg = 'No initial model' self.status(msg, color='blue', blankAfter=5) self.track_xform = get_xform(model) self._display_param_initial(self.track_xform) def record_current(self, model): """record_current(model) - display current model transform. """ if not model: msg = 'No current model' self.status(msg, color='blue', blankAfter=5) self._display_param_current(model) def update_current(self, model): """update_current(model) - apply recorded transform to model. """ if not model: msg = 'No current model' self.status(msg, color='blue', blankAfter=5) if not self.track_xform: msg = 'No starting transform' self.status(msg, color='blue', blankAfter=5) update_xform(model, self.track_xform) def reset_initial(self): """reset_initial() - reset all parameters """ self.track_xform = None self._display_param_initial(None) self._display_param_current(None) # --------------------------------------------------------------------- # GUI functions for parameters # --------------------------------------------------------------------- def _display_param_initial(self, xform): """_display_param_initial(xform) - display initial transform. """ vx, ax, an = self.get_param(xform=xform) self.init_trans['text'] = vx self.init_rot['text'] = ax self.init_ang['text'] = an def _display_param_current(self, model): """_display_param_current(model) - display current transform. """ vx, ax, an = self.get_param(model=model) self.curr_trans['text'] = vx self.curr_rot['text'] = ax self.curr_ang['text'] = an def get_param(self, xform=None, model=None): """get_param(xform=None, model=None) - transform parameters. Input: xform=None model=None Output: translation rotation vector rotation angle Get transform parameters as text strings, one each for translation vector, rotation vector, and rotation angle. Return empty text strings for no model and no xform. """ if not xform: if model: xform = model.openState.xform else: return '','','' vx = xform.getTranslation() ax, an = xform.getRotation() vx_text = '(%7.3f, %7.3f, %7.3f)' % (vx.x, vx.y, vx.z) ax_text = '(%8.4f, %8.4f, %8.4f)' % (ax.x, ax.y, ax.z) an_text = '%7.3f' % (an) return vx_text, ax_text, an_text
def fillInUI(self, parent): import Pmw, Tkinter self.buttonWidgets['OK']['state'] = 'disabled' self.buttonWidgets['Apply']['state'] = 'disabled' from chimera.widgets import ModelScrolledListBox self.surfListBox = ModelScrolledListBox(parent, labelpos='n', label_text='Surfaces to color by ESP:', listbox_selectmode="extended", filtFunc=lambda m: isinstance(m, chimera.MSMSModel), selectioncommand=self._selSurfCB) self.surfListBox.grid(row=0, column=0, sticky="nsew", columnspan=2) Pmw.OptionMenu(parent, command=self._menuCB, initialitem="3", items=[str(x) for x in range(2, 12)], labelpos='w', label_text="Number of colors/values:").grid(row=1, column=0, columnspan=2) f = self.interpFrame = Tkinter.Frame(parent) f.grid(row=2, column=0, columnspan=2) self.wells = [] self.values = [] self._entryOpts = { 'validate': 'real', 'entry_justify': 'center', 'entry_width': 6 } from CGLtk.color.ColorWell import ColorWell for color, value in [("red", -10), ("white", 0), ("blue", 10)]: well = ColorWell(f, color=color) well.grid(row=0, column=len(self.wells)) self.wells.append(well) entry = Pmw.EntryField(f, value=str(value), **self._entryOpts) entry.grid(row=1, column=len(self.values)) self.values.append(entry) from chimera.tkoptions import FloatOption, BooleanOption self.distDep = BooleanOption(parent, 3, "Distance-dependent dielectric", True, None, balloon= "If true, charge falls off with distance squared to\n" "simulate solvent screening effects") self.dielectric = FloatOption(parent, 4, "Dielectric constant", 4.0, None) self.surfDist = FloatOption(parent, 5, "Distance from surface", 1.4, None, balloon="Potential at this distance from\n" "the surface is used for coloring") self.hisGroup = Pmw.Group(parent, hull_padx=2, tag_text="Implicit Histidine Protonation") self.hisGroup.grid(row=6, column=0, columnspan=2, sticky="nsew") self.hisProtVar = Tkinter.StringVar(parent) self.hisProtVar.set("name") interior = self.hisGroup.interior() interior.columnconfigure(0, weight=1) lab = Tkinter.Label(interior, text="Assumed histidine " "protonation for\nstructures without explicit hydrogens") from tkFont import Font font = Font(font=lab.cget('font')) font.config(size=int(0.75 * float(font.cget('size'))), slant='italic') lab.config(font=font) lab.grid(row=0) Tkinter.Radiobutton(interior, variable=self.hisProtVar, value="name", text="Residue name-based", command= self._switchHisList).grid(row=1, sticky='w') f = Tkinter.Frame(interior) f.grid(row=2) Tkinter.Label(f, text="HID/HIE/HIP = delta/epsilon/both").grid( row=0, sticky='w') self.hisDefault = Pmw.OptionMenu(f, initialitem=self.HB, items=[self.HB, "delta", "epsilon", "both"], labelpos='w', label_text="HIS = ", command=lambda a, s=self: setattr(s, 'hisChanged', True)) self.hisDefault.grid(row=1, sticky='w') self._pickText = Tkinter.StringVar(parent) self._pickText.set("Specified individually...") Tkinter.Radiobutton(interior, variable=self.hisProtVar, value="pick", textvariable=self._pickText, command=self._switchHisList).grid(row=3, sticky='w') Tkinter.Button(parent, pady=0, command=self._colorKeyCB, text="Create corresponding color key").grid(row=7, column=0, columnspan=2) self.hisChanged = False
class EspDialog(ModelessDialog): title = "Coulombic Surface Coloring" name = "ESP computation" help = "ContributedSoftware/coulombic/coulombic.html" HB = "estimated from H-bonds" def fillInUI(self, parent): import Pmw, Tkinter self.buttonWidgets['OK']['state'] = 'disabled' self.buttonWidgets['Apply']['state'] = 'disabled' from chimera.widgets import ModelScrolledListBox self.surfListBox = ModelScrolledListBox(parent, labelpos='n', label_text='Surfaces to color by ESP:', listbox_selectmode="extended", filtFunc=lambda m: isinstance(m, chimera.MSMSModel), selectioncommand=self._selSurfCB) self.surfListBox.grid(row=0, column=0, sticky="nsew", columnspan=2) Pmw.OptionMenu(parent, command=self._menuCB, initialitem="3", items=[str(x) for x in range(2, 12)], labelpos='w', label_text="Number of colors/values:").grid(row=1, column=0, columnspan=2) f = self.interpFrame = Tkinter.Frame(parent) f.grid(row=2, column=0, columnspan=2) self.wells = [] self.values = [] self._entryOpts = { 'validate': 'real', 'entry_justify': 'center', 'entry_width': 6 } from CGLtk.color.ColorWell import ColorWell for color, value in [("red", -10), ("white", 0), ("blue", 10)]: well = ColorWell(f, color=color) well.grid(row=0, column=len(self.wells)) self.wells.append(well) entry = Pmw.EntryField(f, value=str(value), **self._entryOpts) entry.grid(row=1, column=len(self.values)) self.values.append(entry) from chimera.tkoptions import FloatOption, BooleanOption self.distDep = BooleanOption(parent, 3, "Distance-dependent dielectric", True, None, balloon= "If true, charge falls off with distance squared to\n" "simulate solvent screening effects") self.dielectric = FloatOption(parent, 4, "Dielectric constant", 4.0, None) self.surfDist = FloatOption(parent, 5, "Distance from surface", 1.4, None, balloon="Potential at this distance from\n" "the surface is used for coloring") self.hisGroup = Pmw.Group(parent, hull_padx=2, tag_text="Implicit Histidine Protonation") self.hisGroup.grid(row=6, column=0, columnspan=2, sticky="nsew") self.hisProtVar = Tkinter.StringVar(parent) self.hisProtVar.set("name") interior = self.hisGroup.interior() interior.columnconfigure(0, weight=1) lab = Tkinter.Label(interior, text="Assumed histidine " "protonation for\nstructures without explicit hydrogens") from tkFont import Font font = Font(font=lab.cget('font')) font.config(size=int(0.75 * float(font.cget('size'))), slant='italic') lab.config(font=font) lab.grid(row=0) Tkinter.Radiobutton(interior, variable=self.hisProtVar, value="name", text="Residue name-based", command= self._switchHisList).grid(row=1, sticky='w') f = Tkinter.Frame(interior) f.grid(row=2) Tkinter.Label(f, text="HID/HIE/HIP = delta/epsilon/both").grid( row=0, sticky='w') self.hisDefault = Pmw.OptionMenu(f, initialitem=self.HB, items=[self.HB, "delta", "epsilon", "both"], labelpos='w', label_text="HIS = ", command=lambda a, s=self: setattr(s, 'hisChanged', True)) self.hisDefault.grid(row=1, sticky='w') self._pickText = Tkinter.StringVar(parent) self._pickText.set("Specified individually...") Tkinter.Radiobutton(interior, variable=self.hisProtVar, value="pick", textvariable=self._pickText, command=self._switchHisList).grid(row=3, sticky='w') Tkinter.Button(parent, pady=0, command=self._colorKeyCB, text="Create corresponding color key").grid(row=7, column=0, columnspan=2) self.hisChanged = False def Apply(self): for entry in self.values: entry.invoke() colors = [w.rgba for w in self.wells] values = [float(e.getvalue()) for e in self.values] if self.hisProtVar.get() == "name": hisScheme = { self.HB: None, 'delta': 'HID', 'epsilon': 'HIE', 'both': 'HIP' }[self.hisDefault.getvalue()] else: hisScheme = self.hisListingData from ESP import colorEsp for surf in self.surfListBox.getvalue(): if self.hisChanged: # clear out charge values so that histidines # get new charges for a in surf.atoms: a.charge = None colorEsp(surf, colors, values, dielectric=self.dielectric.get(), distDep=self.distDep.get(), surfDist=self.surfDist.get(), hisScheme=hisScheme) self.hisChanged = False def _colorKeyCB(self): for entry in self.values: entry.invoke() from Ilabel.gui import IlabelDialog from chimera import dialogs d = dialogs.display(IlabelDialog.name) d.keyConfigure(zip([w.rgba for w in self.wells], [e.getvalue() for e in self.values])) def _menuCB(self, val): newNum = int(val) oldSettings = [] for well, entry in zip(self.wells, self.values): entry.invoke() oldSettings.append((well.rgba, float(entry.getvalue()))) well.grid_forget() well.destroy() entry.grid_forget() entry.destroy() import Pmw from CGLtk.color.ColorWell import ColorWell self.wells = [] self.values = [] scale = (len(oldSettings) - 1.0) / (newNum - 1.0) f = self.interpFrame for i in range(newNum): index = i * scale if index == int(index) \ or int(index) >= len(oldSettings): color, value = oldSettings[int(index)] else: lowc, lowv = oldSettings[int(index)] highc, highv = oldSettings[int(index)+1] frac = index - int(index) color = [] for lowcomp, highcomp in zip(lowc, highc): color.append((1.0 - frac) * lowcomp + frac * highcomp) value = (1.0 - frac) * lowv + frac * highv well = ColorWell(f, color=color) well.grid(row=0, column=len(self.wells)) self.wells.append(well) entry = Pmw.EntryField(f, value=str(value), **self._entryOpts) entry.grid(row=1, column=len(self.values)) self.values.append(entry) def _selSurfCB(self): if self.surfListBox.getvalue(): state = 'normal' else: state = 'disabled' self.buttonWidgets['OK']['state'] = state self.buttonWidgets['Apply']['state'] = state self._updateHisListing() def _select(self, hisType): for r, vars in self._vars.items(): dv, ev = vars if hisType == "delta": dv.set(True) ev.set(False) self.hisListingData[r] = "HID" elif hisType == "epsilon": dv.set(False) ev.set(True) self.hisListingData[r] = "HIE" else: dv.set(True) ev.set(True) self.hisListingData[r] = "HIP" def _switchHisList(self): self.hisChanged = True if not hasattr(self, 'hisListing'): if self.hisProtVar.get() != "pick": return self.hisListingData = {} import Tix, Tkinter self.hisFrame = Tkinter.Frame(self.hisGroup.interior()) self.hisListing = Tix.ScrolledHList(self.hisFrame, width="3i", options="""hlist.columns 4 hlist.header 1 hlist.indicator 1""") self.hisListing.hlist.configure( selectbackground=self.hisListing['background'], selectborderwidth=0) self.hisListing.grid(row=0, column=0, columnspan=3, sticky="nsew") self.hisFrame.rowconfigure(1, weight=1) self.hisFrame.columnconfigure(0, weight=1) self.hisFrame.columnconfigure(1, weight=1) hlist = self.hisListing.hlist hlist.header_create(0, itemtype="text", text="Model") hlist.header_create(1, itemtype="text", text="Residue") hlist.header_create(2, itemtype="text", text="Delta") hlist.header_create(3, itemtype="text", text="Epsilon") self._checkButtonStyle = Tix.DisplayStyle("window", background=hlist['background'], refwindow=self.hisListing, anchor='center') self._updateHisListing() Tkinter.Button(self.hisFrame, text="All Delta", pady=0, highlightthickness=0, command=lambda p="delta": self._select(p) ).grid(row=1, column=0) Tkinter.Button(self.hisFrame, text="All Epsilon", pady=0, highlightthickness=0, command=lambda p="epsilon": self._select(p) ).grid(row=1, column=1) Tkinter.Button(self.hisFrame, text="All Both", pady=0, highlightthickness=0, command=lambda p="both": self._select(p) ).grid(row=1, column=2) if self.hisProtVar.get() == "pick": self._pickText.set("Specified individually:") self.hisFrame.grid(row=4, sticky="nsew") interior = self.hisGroup.interior() interior.rowconfigure(4, weight=1) self.uiMaster().rowconfigure(6, weight=4) else: self._pickText.set("Specified individually...") self.hisFrame.grid_forget() interior = self.hisGroup.interior() interior.rowconfigure(4, weight=0) self.uiMaster().rowconfigure(6, weight=0) def _toggleDelta(self, res): self.hisChanged = True old = self.hisListingData[res] if old == "HIS": new = "HID" elif old == "HID": new = "HIS" elif old == "HIE": new = "HIP" else: new = "HIE" self.hisListingData[res] = new def _toggleEpsilon(self, res): self.hisChanged = True old = self.hisListingData[res] if old == "HIS": new = "HIE" elif old == "HID": new = "HIP" elif old == "HIE": new = "HIS" else: new = "HID" self.hisListingData[res] = new def _updateHisListing(self): if not hasattr(self, 'hisListing'): return self._updateHisListingData() hlist = self.hisListing.hlist on = self.hisListing.tk.call('tix', 'getimage', 'ck_on') off = self.hisListing.tk.call('tix', 'getimage', 'ck_off') hlist.delete_all() import Tkinter row = 0 self._vars = {} for m in [s.molecule for s in self.surfListBox.getvalue()]: for r in m.residues: try: hisType = self.hisListingData[r] except KeyError: continue hlist.add(row, itemtype="text", text="%s (%s)" % (m.name, m.oslIdent())) hlist.item_create(row, 1, itemtype="text", text=r.oslIdent( start=chimera.SelResidue)) var = Tkinter.IntVar(hlist) var.set(hisType in ["HID", "HIP"]) cmd = lambda r=r: self._toggleDelta(r) self._vars[r] = [var] toggle = Tkinter.Checkbutton(hlist, command=cmd, variable=var, image=off, selectimage=on, selectcolor="", indicatoron=False, borderwidth=0) hlist.item_create(row, 2, itemtype="window", window=toggle, style=self._checkButtonStyle) var = Tkinter.IntVar(hlist) var.set(hisType in ["HIE", "HIP"]) cmd = lambda r=r: self._toggleEpsilon(r) self._vars[r].append(var) toggle = Tkinter.Checkbutton(hlist, command=cmd, variable=var, image=off, selectimage=on, selectcolor="", indicatoron=False, borderwidth=0) hlist.item_create(row, 3, itemtype="window", window=toggle, style=self._checkButtonStyle) row += 1 def _updateHisListingData(self): newData = {} default = { 'delta': 'HID', 'epsilon': 'HIE', 'both': 'HIP', self.HB: 'HID' }[self.hisDefault.getvalue()] for m in [s.molecule for s in self.surfListBox.getvalue()]: for r in m.residues: if r.type not in ["HIS", "HIE", "HIP", "HID"]: continue try: newData[r] = self.hisListingData[r] except KeyError: if r.type == 'HIS': newData[r] = default else: newData[r] = r.type self.hisListingData = newData