Example #1
0
 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)
Example #2
0
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)
Example #3
0
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)
Example #4
0
	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
Example #7
0
    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')
Example #8
0
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
Example #9
0
	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
Example #10
0
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