def createHelices(m, **kw): from chimera.specifier import evalSpec sel = evalSpec(":/isHelix & backbone.minimal", models=[m]) residues = sel.residues() if not residues: return [] from chimera.misc import oslCmp residues.sort(lambda r1, r2: oslCmp(r1.oslIdent(), r2.oslIdent())) from chimera import bondsBetween from chimera.selection import INTERSECT, ItemizedSelection curHelix = [] axes = [] from Geometry import geomManager geomManager.suspendUpdates() while residues: if not curHelix: r = residues.pop(0) curHelix.append(r) helixNum = r.ssId continue if helixNum > -1: if helixNum == residues[0].ssId: curHelix.append(residues.pop(0)) continue elif bondsBetween(curHelix[-1], residues[0], True): curHelix.append(residues.pop(0)) continue resSel = ItemizedSelection() resSel.add(curHelix) resSel.merge(INTERSECT, sel) atoms = resSel.atoms() if helixNum < 0: created += 1 helixNum = created hname = "%s H%d" % (m.name, helixNum) axes.append(axisManager.createAxis(hname, atoms, **kw)) curHelix = [] if curHelix: resSel = ItemizedSelection() resSel.add(curHelix) resSel.merge(INTERSECT, sel) atoms = resSel.atoms() if helixNum < 0: created += 1 helixNum = created hname = "%s H%d" % (m.name, helixNum) axes.append(axisManager.createAxis(hname, atoms, **kw)) geomManager.enableUpdates() return axes
def _selResidues(self, residues): from chimera.selection import ItemizedSelection from chimera.tkgui import selectionOperation sel = ItemizedSelection() sel.add(residues) sel.addImplied(vertices=0) selectionOperation(sel)
def _instantiatePlane(self, number, name, cmpVal, color, radius, thickness, sourceModel, atoms, chimeraPlane): plane = Plane(number, name, color, radius, thickness, sourceModel, chimeraPlane) from chimera.selection import ItemizedSelection sel = ItemizedSelection(selChangedCB=lambda pl=plane: self.removePlanes([pl], checkForChanges=False)) sel.add(atoms) self.planeData[plane] = sel from Geometry import geomManager geomManager.addInterfaceItems([plane]) return plane
def _instantiateAxis(self, number, name, color, radius, sourceModel, atoms, center, vec, extents): axis = Axis(number, name, color, radius, sourceModel, center, vec, extents) from chimera.selection import ItemizedSelection sel = ItemizedSelection(selChangedCB=lambda a=axis: self.removeAxes( [a], checkForChanges=False)) sel.add(atoms) self.axisData[axis] = sel from Geometry import geomManager geomManager.addInterfaceItems([axis]) return axis
def _writeParmchk(self, filename): # generate Mol2 input file for parmchk import WriteMol2 from chimera.selection import ItemizedSelection from chimera import Bond rSet = set(self.needParmchk) for b in self.chimeraMolecule.bonds: if b.display == Bond.Never: continue a0, a1 = b.atoms r0 = a0.residue r1 = a1.residue if (r0 in self.needParmchk and r1 not in self.needParmchk): rSet.add(r1) elif (r0 not in self.needParmchk and r1 in self.needParmchk): rSet.add(r0) sel = ItemizedSelection() sel.add(rSet) WriteMol2.writeMol2(sel, filename, gaffType=True)
def gatherAtoms(bySerial, label, f, dicts): for line in f: line = line.strip() if not line: continue # ignore altloc column... if line.startswith("HETATM"): # guarantee that atom serial number splits off... line = "ATOM " + line[6:] fields = line[:16].strip().split() + line[17:].split() serial = int(fields[1]) try: atom = bySerial[serial] except KeyError: raise ValueError("Non-existent serial number (%d) found" " in %s file" % (serial, label)) from chimera.misc import chimeraLabel if atom.name != fields[2] \ and atom.name != fields[2].replace("*", "'"): raise ValueError( "Atom with serial number %d (%s) does" " not match name in %s file (%s)" % (serial, chimeraLabel(atom, showModel=False, modelName=False), label, fields[2])) if atom.residue.type != fields[3]: raise ValueError( "Atom with serial number %d (%s) does" " not match residue type in %s file (%s)" % (serial, chimeraLabel(atom, showModel=False, modelName=False), label, fields[3])) id = int(fields[-2]) if id > len(dicts): raise ValueError( "%s ID (%d) in %s file greater than" " number of %ss (%d) in %s info file" % (label.capitalize(), id, label, label, len(dicts), label)) dicts[id - 1].setdefault("atoms", []).append(atom) from chimera.selection import ItemizedSelection for d in dicts: sel = ItemizedSelection() sel.add(d.get("atoms", [])) d["atoms"] = sel
def holdSteadyCB(self): """'hold steady' menu callback""" from chimera.actions import selAtoms from chimera.selection import ItemizedSelection atoms = selAtoms() if not atoms: replyobj.error("No atoms selected\n") return self.status("Holding %d atoms steady" % len(atoms)) steadySel = ItemizedSelection(selChangedCB=self._steadySelCB) steadySel.add(atoms) identity = chimera.Xform.identity() curFrame = self.currentFrame.get() cs = self.model.activeCoordSet self.holdingSteady = (atoms, steadySel, cs, identity) self.transforms = {curFrame: (identity, identity)} self.actionsMenu.entryconfigure(self.stopHoldingLabel, state='normal') if self.volumeDialog: # clear "no atoms held steady" error self.volumeDialog.status("")
def Apply(self): from operator import add from chimera.selection import ItemizedSelection, \ OSLSelection, REPLACE sel = ItemizedSelection() chainOSL = "" for codeInfo, var in self._codeVars.items(): model, code = codeInfo if var.get(): chainOSL = chainOSL + model.oslIdent() \ + ":." + code if chainOSL: sel.merge(REPLACE, OSLSelection(chainOSL)) for model, var, resList in self._physVars: if var.get(): sel.add(resList) sel.addImplied(vertices=0) chimera.tkgui.selectionOperation(sel)
def fillInUI(self, parent): # inter/intra-model; slop; colors; models; replace current; # label # for removing labels in subsequent passes... # (use a selection so I don't have to track model closures) self.labelSelection = ItemizedSelection() self.labelMap = {} self.callbacks = [] row = 0 cols = 3 self.bondColorOption = ColorOption(parent, row, 'H-bond color', prefs[BOND_COLOR], None, noneOkay=0) class HBLineWidthOption(LineWidthOption): name = "Line width" balloon = "Width of pseudobonds (in pixels)" default = prefs[LINE_WIDTH] self.lineWidth = HBLineWidthOption(parent, row + 1, None, None, None, width=4, sticky='w') self.findMode = Pmw.RadioSelect(parent, buttontype='radiobutton', labelpos='n', pady=0, orient='vertical', label_text='Find these bonds:', hull_borderwidth=2, hull_relief='ridge') self.findMode.add('inter-model') self.findMode.add('intra-model') self.findMode.add('both') self.findMode.invoke('both') self.findMode.grid(row=row, column=2, rowspan=2) row += 2 self.relaxParams = RelaxParams(parent, prefs[RELAX_COLOR]) self.relaxParams.grid(row=row, columnspan=cols, sticky='nsew', padx=2) row += 1 self.restrictModels = Tkinter.IntVar(parent) self.restrictModels.set(0) self.modelFrame = Tkinter.Frame(parent) self.molTexts = ["Restrict to models...", "Restrict to models:"] self.restrictCheckBox = Tkinter.Checkbutton( self.modelFrame, variable=self.restrictModels, text=self.molTexts[0], command=self._restrictModelsCB) self.restrictCheckBox.grid(row=0, column=0) from chimera.widgets import MoleculeScrolledListBox self.molList = MoleculeScrolledListBox(self.modelFrame, listbox_selectmode="extended") self.modelFrame.rowconfigure(0, weight=1) self.modelFrame.grid(row=row, column=0, columnspan=cols, sticky="nsw") parent.rowconfigure(row, weight=1) row += 1 self.inSelection = Tkinter.IntVar(parent) self.inSelection.set(0) f = Tkinter.Frame(parent) f.grid(row=row, column=0, columnspan=cols, sticky="w") Tkinter.Checkbutton(f, variable=self.inSelection, text="Only find H-bonds with", command=self._useSelChange).grid(row=0, column=0, sticky="e") self.selType = Pmw.OptionMenu( f, items=["at least one end", "exactly one end", "both ends"], initialitem=0, menubutton_state="disabled", labelpos="e", label_text="selected") self.selType.grid(row=0, column=1, sticky="w") row += 1 self.revealEnds = Tkinter.IntVar(parent) self.revealEnds.set(0) Tkinter.Checkbutton( parent, variable=self.revealEnds, text="If endpoint atom hidden, show endpoint residue").grid( row=row, column=0, columnspan=cols, sticky="w") row += 1 self.retainCurrent = Tkinter.IntVar(parent) self.retainCurrent.set(0) Tkinter.Checkbutton(parent, variable=self.retainCurrent, text="Retain currently displayed H-bonds").grid( row=row, column=0, columnspan=cols, sticky="w") row += 1 self.interSubmodel = Tkinter.IntVar(parent) self.interSubmodel.set(0) # comment out the below since there seems to be no # situations where cross-submodel-same-model hbonds # are interesting. If reading pdbrun files occurs, this # may change. #Tkinter.Checkbutton(parent, variable=self.interSubmodel, # text="Find H-bonds between submodels\n" # "having same principal model number" # ).grid(row=row, column=0, columnspan=cols, sticky="w") #row += 1 self.writeFile = Tkinter.IntVar(parent) self.writeFile.set(0) Tkinter.Checkbutton(parent, variable=self.writeFile, text="Write information to file").grid( row=row, column=0, columnspan=cols, sticky="w") self.fileName = None row += 1 self.writeLog = Tkinter.IntVar(parent) self.writeLog.set(0) Tkinter.Checkbutton(parent, variable=self.writeLog, text="Write information to reply log").grid( row=row, column=0, columnspan=cols, sticky="w") row += 1
def _selCavityCB(self, tableSel): prefs[EXCLUDE_MOUTH] = self.excludeMouth.variable.get() from chimera.selection import ItemizedSelection, mergeCurrent, \ EXTEND, REMOVE cavitySel = ItemizedSelection() for cavity in tableSel: cavitySel.merge(EXTEND, cavity.pocketInfo["atoms"]) if prefs[EXCLUDE_MOUTH]: cavitySel.merge(REMOVE, cavity.mouthInfo["atoms"]) cavitySel.addImplied() # might be no cavities selected... cav1 = self.cavities[0] someA = (cav1.mouthInfo["atoms"].atoms() or cav1.pocketInfo["atoms"].atoms())[0] if someA.__destroyed__: return mol = someA.molecule cavitySet = set(cavitySel.atoms()) from chimera import selectionOperation doSelect = self.doSelect.variable.get() if doSelect != prefs[DO_SELECT]: #if not doSelect: # mergeCurrent(REMOVE, cavitySel) prefs[DO_SELECT] = doSelect doColor = self.doColor.variable.get() if doColor != prefs[DO_COLOR]: if not doColor and hasattr(self, '_prevColors'): for a, c, sc in self._prevColors: if a.__destroyed__: continue a.color = c a.surfaceColor = sc delattr(self, '_prevColors') prefs[DO_COLOR] = doColor if doColor: prefs[POCKET_COLOR] = self.pocketColor.rgba prefs[NONPOCKET_COLOR] = self.nonpocketColor.rgba doSurface = self.doSurface.variable.get() if doSurface != prefs[DO_SURFACE]: if not doSurface: for a in cavitySet: a.surfaceDisplay = False prefs[DO_SURFACE] = doSurface doZoom = self.doZoom.variable.get() if doZoom != prefs[DO_ZOOM]: if not doZoom: from Midas import focus, uncofr focus([mol]) uncofr() prefs[DO_ZOOM] = doZoom if doSelect: selectionOperation(cavitySel) if doColor: if prefs[POCKET_COLOR] == None: pocketColor = None else: pocketColor = chimera.MaterialColor( *prefs[POCKET_COLOR]) if prefs[NONPOCKET_COLOR] == None: nonpocketColor = None else: nonpocketColor = chimera.MaterialColor( *prefs[NONPOCKET_COLOR]) if not hasattr(self, '_prevColors'): self._prevColors = [(a, a.color, a.surfaceColor) for a in mol.atoms] for a in mol.atoms: if a in cavitySet: a.surfaceColor = a.color = pocketColor else: a.surfaceColor = a.color = nonpocketColor if doSurface: for a in mol.atoms: a.surfaceDisplay = a in cavitySet surfs = chimera.openModels.list(mol.id, mol.subid, modelTypes=[chimera.MSMSModel]) catsurfs = [s for s in surfs if s.category == "main"] if not catsurfs: from Midas import surfaceNew surfaceNew("main", models=[mol]) if doZoom and tableSel: from Midas import align, focus align(cavitySel, mol.atoms) focus(cavitySel)
def selectRotamers(self, rotamers): from chimera import selectionOperation from chimera.selection import ItemizedSelection rotSel = ItemizedSelection() rotSel.add(rotamers) selectionOperation(rotSel)
def writeMol2(models, fileName, status=None, anchor=None, relModel=None, hydNamingStyle="sybyl", multimodelHandling="individual", skip=None, resNum=True, gaffType=False, gaffFailError=None): """Write a Mol2 file. 'models' are the models to write out into a file named 'fileName'. 'status', if not None, is a function that takes a string -- used to report the progress of the write. 'anchor' is a selection (i.e. instance of a subclass of chimera.selection.Selection) containing atoms/bonds that should be written out to the @SETS section of the file as the rigid framework for flexible ligand docking. 'hydNamingStyle' controls whether hydrogen names should be "Sybyl-like" (value: sybyl) or "PDB-like" (value: pdb) -- e.g. HG21 vs. 1HG2. 'multimodelHandling' controls whether multiple models will be combined into a single @MOLECULE section (value: combined) or each given its own section (value: individual). 'skip' is a list of atoms to not output 'resNum' controls whether residue sequence numbers are included in the substructure name. Since Sybyl Mol2 files include them, this defaults to True. If 'gaffType' is True, outout GAFF atom types instead of Sybyl atom types. 'gaffFailError', if specified, is the type of error to throw (e.g. UserError) if there is no gaffType attribute for an atom, otherwise throw the standard AttributeError. """ # open the given file name for writing from OpenSave import osOpen f = osOpen(fileName, "w") sortFunc = serialSort = lambda a1, a2: cmp(a1.coordIndex, a2.coordIndex) if isinstance(models, chimera.Molecule): models = [models] elif isinstance(models, Selection): # create a fictitious jumbo model if isinstance(models, ItemizedSelection): sel = models else: sel = ItemizedSelection() sel.merge(models) sel.addImplied() class Jumbo: def __init__(self, sel): self.atoms = sel.atoms() self.residues = sel.residues() self.bonds = sel.bonds() self.name = "(selection)" models = [Jumbo(sel)] sortFunc = lambda a1, a2: cmp(a1.molecule.id, a2.molecule.id) \ or cmp(a1.molecule.subid, a2.molecule.subid) \ or serialSort(a1, a2) multimodelHandling = "individual" # transform... if relModel is None: xform = chimera.Xform.identity() else: xform = relModel.openState.xform xform.invert() # need to find amide moieties since Sybyl has an explicit amide type if status: status("Finding amides\n") from ChemGroup import findGroup amides = findGroup("amide", models) amideNs = dict.fromkeys([amide[2] for amide in amides]) amideCNs = dict.fromkeys([amide[0] for amide in amides]) amideCNs.update(amideNs) amideOs = dict.fromkeys([amide[1] for amide in amides]) substructureNames = None if multimodelHandling == "combined": # create a fictitious jumbo model class Jumbo: def __init__(self, models): self.atoms = [] self.residues = [] self.bonds = [] self.name = models[0].name + " (combined)" for m in models: self.atoms.extend(m.atoms) self.residues.extend(m.residues) self.bonds.extend(m.bonds) # if combining single-residue models, # can be more informative to use model name # instead of residue type for substructure if len(models) == len(self.residues): rtypes = [r.type for r in self.residues] if len(set(rtypes)) < len(rtypes): mnames = [m.name for m in models] if len(set(mnames)) == len(mnames): self.substructureNames = dict( zip(self.residues, mnames)) models = [Jumbo(models)] if hasattr(models[-1], 'substructureNames'): substructureNames = models[-1].substructureNames delattr(models[-1], 'substructureNames') sortFunc = lambda a1, a2: cmp(a1.molecule.id, a2.molecule.id) \ or cmp(a1.molecule.subid, a2.molecule.subid) \ or serialSort(a1, a2) # write out models for mol in models: if hasattr(mol, 'mol2comments'): for m2c in mol.mol2comments: print >> f, m2c if hasattr(mol, 'solventInfo'): print >> f, mol.solventInfo # molecule section header print >> f, "%s" % MOLECULE_HEADER # molecule name print >> f, "%s" % mol.name ATOM_LIST = mol.atoms BOND_LIST = mol.bonds if skip: skip = set(skip) ATOM_LIST = [a for a in ATOM_LIST if a not in skip] BOND_LIST = [ b for b in BOND_LIST if b.atoms[0] not in skip and b.atoms[1] not in skip ] RES_LIST = mol.residues # Chimera has an unusual internal order for its atoms, so # sort them by input order if status: status("Putting atoms in input order") ATOM_LIST.sort(sortFunc) # if anchor is not None, then there will be two entries in # the @SETS section of the file... if anchor: sets = 2 else: sets = 0 # number of entries for various sections... print >> f, "%d %d %d 0 %d" % (len(ATOM_LIST), len(BOND_LIST), len(RES_LIST), sets) # type of molecule if hasattr(mol, "mol2type"): mtype = mol.mol2type else: mtype = "SMALL" from chimera.resCode import nucleic3to1, protein3to1 for r in mol.residues: if r.type in protein3to1: mtype = "PROTEIN" break if r.type in nucleic3to1: mtype = "NUCLEIC_ACID" break print >> f, mtype # indicate type of charge information if hasattr(mol, 'chargeModel'): print >> f, mol.chargeModel else: print >> f, "NO_CHARGES" if hasattr(mol, 'mol2comment'): print >> f, "\n%s" % mol.mol2comment else: print >> f, "\n" if status: status("writing atoms\n") # atom section header print >> f, "%s" % ATOM_HEADER # make a dictionary of residue indices so that we can do # quick look ups resIndices = {} for i, r in enumerate(RES_LIST): resIndices[r] = i + 1 for i, atom in enumerate(ATOM_LIST): # atom ID, starting from 1 print >> f, "%7d" % (i + 1), # atom name, possibly rearranged if it's a hydrogen if hydNamingStyle == "sybyl" \ and not atom.name[0].isalpha(): atomName = atom.name[1:] + atom.name[0] else: atomName = atom.name print >> f, "%-8s" % atomName, # untransformed coordinate position coord = xform.apply(atom.xformCoord()) print >> f, "%9.4f %9.4f %9.4f" % (coord.x, coord.y, coord.z), # atom type if gaffType: try: atomType = atom.gaffType except AttributeError: if not gaffFailError: raise raise gaffFailError( "%s has no Amber/GAFF type assigned.\n" "Use the AddCharge tool to assign Amber/GAFF types." % atom) elif hasattr(atom, 'mol2type'): atomType = atom.mol2type elif atom in amideNs: atomType = "N.am" elif atom.residue.id.chainId == "water": if atom.element.name == "O": atomType = "O.t3p" else: atomType = "H.t3p" elif atom.element.name == "N" and len( [r for r in atom.minimumRings() if r.aromatic()]) > 0: atomType = "N.ar" elif atom.idatmType == "C2" and len( [nb for nb in atom.neighbors if nb.idatmType == "Ng+"]) > 2: atomType = "C.cat" else: try: atomType = chimera2sybyl[atom.idatmType] except KeyError: chimera.replyobj.warning("Atom whose" " IDATM type has no equivalent" " Sybyl type: %s (type: %s)\n" % (atom.oslIdent(), atom.idatmType)) atomType = str(atom.element) print >> f, "%-5s" % atomType, # residue-related info res = atom.residue # residue index print >> f, "%5d" % resIndices[res], # substructure identifier and charge if hasattr(atom, 'charge'): charge = atom.charge else: charge = 0.0 if substructureNames: rname = substructureNames[res] elif resNum: rname = "%3s%-5d" % (res.type, res.id.position) else: rname = "%3s" % res.type print >> f, "%s %9.4f" % (rname, charge) if status: status("writing bonds\n") # bond section header print >> f, "%s" % BOND_HEADER # make an atom-index dictionary to speed lookups atomIndices = {} for i, a in enumerate(ATOM_LIST): atomIndices[a] = i + 1 for i, bond in enumerate(BOND_LIST): a1, a2 = bond.atoms # ID print >> f, "%6d" % (i + 1), # atom IDs print >> f, "%4d %4d" % (atomIndices[a1], atomIndices[a2]), # bond order; give it our best shot... amideA1 = a1 in amideCNs amideA2 = a2 in amideCNs if amideA1 and amideA2: print >> f, "am" continue if amideA1 or amideA2: if a1 in amideOs or a2 in amideOs: print >> f, "2" else: print >> f, "1" continue aromatic = False for ring in bond.minimumRings(): if ring.aromatic(): aromatic = True break if aromatic: print >> f, "ar" continue try: geom1 = typeInfo[a1.idatmType].geometry except KeyError: print >> f, "1" continue try: geom2 = typeInfo[a2.idatmType].geometry except KeyError: print >> f, "1" continue if geom1 not in [2, 3] or geom2 not in [2, 3]: print >> f, "1" continue # if either endpoint atom is in an aromatic ring and # the bond isn't, it's a single bond... for endp in [a1, a2]: aromatic = False for ring in endp.minimumRings(): if ring.aromatic(): aromatic = True break if aromatic: break else: # neither endpoint in aromatic ring print >> f, "2" continue print >> f, "1" if status: status("writing residues") # residue section header print >> f, "%s" % SUBSTR_HEADER for i, res in enumerate(RES_LIST): # residue id field print >> f, "%6d" % (i + 1), # residue name field if substructureNames: rname = substructureNames[res] elif resNum: rname = "%3s%-4d" % (res.type, res.id.position) else: rname = "%3s" % res.type print >> f, rname, # ID of the root atom of the residue from chimera.misc import principalAtom chainAtom = principalAtom(res) if chainAtom is None: if hasattr(res, 'atomsMap'): chainAtom = res.atoms[0] else: chainAtom = res.atoms.values()[0][0] print >> f, "%5d" % atomIndices[chainAtom], print >> f, "RESIDUE 4", # Sybyl seems to use chain 'A' when chain ID is blank, # so run with that chainID = res.id.chainId if len(chainID.strip()) != 1: chainID = 'A' print >> f, "%s %3s" % (chainID, res.type), # number of out-of-substructure bonds crossResBonds = 0 if hasattr(res, "atomsMap"): atoms = res.atoms for a in atoms: for oa in a.bondsMap.keys(): if oa.residue != res: crossResBonds += 1 else: atoms = [a for aList in res.atoms.values() for a in aList] for a in atoms: for oa in a.bonds.keys(): if oa.residue != res: crossResBonds += 1 print >> f, "%5d" % crossResBonds, # print "ROOT" if first or only residue of a chain if a.molecule.rootForAtom(a, True).atom.residue == res: print >> f, "ROOT" else: print >> f # write flexible ligand docking info if anchor: if status: status("writing anchor info") print >> f, "%s" % SET_HEADER atomIndices = {} for i, a in enumerate(ATOM_LIST): atomIndices[a] = i + 1 bondIndices = {} for i, b in enumerate(BOND_LIST): bondIndices[b] = i + 1 print >> f, "ANCHOR STATIC ATOMS <user> **** Anchor Atom Set" atoms = anchor.atoms() print >> f, len(atoms), for a in atoms: if a in atomIndices: print >> f, atomIndices[a], print >> f print >> f, "RIGID STATIC BONDS <user> **** Rigid Bond Set" bonds = anchor.bonds() print >> f, len(bonds), for b in bonds: if b in bondIndices: print >> f, bondIndices[b], print >> f f.close()
def fillInUI(self, parent): self._handlers = {} desigGroup = Pmw.Group(parent, tag_text="Atoms to Check", hull_padx=2) desigGroup.grid(row=0, sticky="ew") from chimera.tkgui import windowSystem Tkinter.Button(desigGroup.interior(), command=self._desigCB, text="Designate").grid(row=0, column=0, sticky='e') Tkinter.Label(desigGroup.interior(), text="currently selected" " atoms for checking").grid(row=0, column=1, sticky='w') self.desigStatus = Tkinter.Label(desigGroup.interior()) from tkFont import Font font = Font(font=self.desigStatus.cget('font')) size = int(font.cget('size')) if size > 2: font.config(size=size - 2) font.config(weight='normal') self.desigStatus.config(font=font) from chimera.selection import ItemizedSelection self.designated = ItemizedSelection( selChangedCB=self._updateDesigStatus) self.desigStatus.grid(row=1, column=0, columnspan=2) self.designated2 = ItemizedSelection(selChangedCB=self._locButtonCB) if windowSystem == 'aqua': pady = None else: pady = 0 Tkinter.Button(desigGroup.interior(), command=self._desig2CB, pady=pady, text="Designate selection as second set").grid(row=3, column=1) self.desig2Status = Tkinter.Label(desigGroup.interior()) if size > 4: font2 = Font(font=font) font2.config(size=size - 4) else: font2 = font self.desig2Status.config(font=font2) self.desig2Status.grid(row=4, column=1) self.checkLocButtons = Pmw.RadioSelect( desigGroup.interior(), pady=0, orient='vertical', buttontype='radiobutton', labelpos='w', label_text="Check designated\natoms" " against:", command=self._locButtonCB) self.checkLocButtons.grid(row=2, column=0, columnspan=2) self.checkLocButtons.add("themselves") self.checkLocButtons.add("all other atoms") self.checkLocButtons.add("other atoms in same model") self.checkLocButtons.add(self.CHECK_SET) self.checkLocButtons.invoke(1) defGroup = Pmw.Group(parent, tag_text="Clash/Contact Parameters", hull_padx=2) defGroup.grid(row=1, sticky='ew') self.clashDef = ClashDef(defGroup.interior(), command=self._checkContinuous, value=str(prefs[CLASH_THRESHOLD])) self.clashDef.grid(row=0, sticky='w') self.hbondAllow = HbondAllow(defGroup.interior(), command=self._checkContinuous, value=str(prefs[HBOND_ALLOWANCE])) self.hbondAllow.grid(row=1, sticky='w') defaultsFrame = Tkinter.Frame(defGroup.interior()) defaultsFrame.grid(row=2) Tkinter.Label(defaultsFrame, text="Default").grid(row=0, column=0) Tkinter.Button(defaultsFrame, text="clash", pady=pady, command=self._clashDefaultsCB).grid(row=0, column=1) Tkinter.Label(defaultsFrame, text="/").grid(row=0, column=2) Tkinter.Button(defaultsFrame, text="contact", pady=pady, command=self._contactDefaultsCB).grid(row=0, column=3) Tkinter.Label(defaultsFrame, text="criteria").grid(row=0, column=4) bondsFrame = Tkinter.Frame(defGroup.interior()) bondsFrame.grid(row=3, sticky='w') self.bondsApart = Pmw.OptionMenu(bondsFrame, labelpos='w', label_text="Ignore contacts of pairs", command=self._checkContinuous, initialitem=str( prefs[BOND_SEPARATION]), items=[str(i + 2) for i in range(4)]) self.bondsApart.grid(row=0, column=0) Tkinter.Label(bondsFrame, text="or fewer bonds apart").grid(row=0, column=1) self.ignoreIntraResVar = Tkinter.IntVar(parent) self.ignoreIntraResVar.set(prefs[IGNORE_INTRA_RES]) Tkinter.Checkbutton(defGroup.interior(), text="Ignore intra-" "residue contacts", variable=self.ignoreIntraResVar, command=self._checkContinuous).grid(row=4) actionGroup = Pmw.Group(parent, tag_text="Treatment of Clash/Contact Atoms", hull_padx=2) actionGroup.grid(row=2, sticky='ew') self.actionSelVar = Tkinter.IntVar(parent) self.actionSelVar.set(prefs[ACTION_SELECT]) Tkinter.Checkbutton(actionGroup.interior(), text="Select", command=self._checkContinuous, variable=self.actionSelVar).grid(row=0, sticky='w') self.actionColorVar = Tkinter.IntVar(parent) self.actionColorVar.set(prefs[ACTION_COLOR]) f = Tkinter.Frame(actionGroup.interior()) f.grid(row=1, sticky='w') Tkinter.Checkbutton(f, text="Color", command=self._checkContinuous, variable=self.actionColorVar).grid(row=0, column=0) from CGLtk.color.ColorWell import ColorWell self.clashColorWell = ColorWell(f, noneOkay=True, callback=self._checkContinuous, color=prefs[CLASH_COLOR]) self.clashColorWell.grid(row=0, column=1) Tkinter.Label(f, text=" (and color all other atoms").grid(row=0, column=2) self.nonclashColorWell = ColorWell(f, noneOkay=True, callback=self._checkContinuous, color=prefs[NONCLASH_COLOR]) self.nonclashColorWell.grid(row=0, column=3) Tkinter.Label(f, text=")").grid(row=0, column=4) self.actionPBVar = Tkinter.IntVar(parent) self.actionPBVar.set(prefs[ACTION_PSEUDOBONDS]) f = Tkinter.Frame(actionGroup.interior()) f.grid(row=2, sticky='w') Tkinter.Checkbutton(f, text="Draw pseudobonds of color", command=self._checkContinuous, variable=self.actionPBVar).grid(row=0, column=0) from CGLtk.color.ColorWell import ColorWell self.pbColorWell = ColorWell(f, noneOkay=False, callback=self._checkContinuous, color=prefs[PB_COLOR]) self.pbColorWell.grid(row=0, column=1) self.pbWidthEntry = Pmw.EntryField(f, labelpos='w', label_text=" and width", validate={ 'validator': 'real', 'min': 0.01 }, entry_width=4, entry_justify="center", command=self._checkContinuous, value=str(prefs[PB_WIDTH])) self.pbWidthEntry.grid(row=0, column=2) self.actionAttrVar = Tkinter.IntVar(parent) self.actionAttrVar.set(prefs[ACTION_ATTR]) self.assignAttrButton = Tkinter.Checkbutton( actionGroup.interior(), text="Assign 'overlap' attribute", variable=self.actionAttrVar) self.assignAttrButton.grid(row=3, sticky='w') self.actionWriteInfoVar = Tkinter.IntVar(parent) self.actionWriteInfoVar.set(prefs[ACTION_WRITEINFO]) self.writeInfoButton = Tkinter.Checkbutton( actionGroup.interior(), text="Write information to" " file", variable=self.actionWriteInfoVar) self.writeInfoButton.grid(row=4, sticky='w') self.actionLogInfoVar = Tkinter.IntVar(parent) self.actionLogInfoVar.set(prefs[ACTION_REPLYLOG]) self.logInfoButton = Tkinter.Checkbutton( actionGroup.interior(), text="Write information to" " reply log", variable=self.actionLogInfoVar) self.logInfoButton.grid(row=5, sticky='w') freqGroup = Pmw.Group(parent, tag_text="Frequency of Checking", hull_padx=2) freqGroup.grid(row=3, sticky="ew") self.freqButtons = Pmw.RadioSelect(freqGroup.interior(), pady=0, orient='vertical', buttontype='radiobutton', labelpos='w', label_text="Check...", command=self._freqChangeCB) self.freqButtons.grid(sticky='w') self.freqButtons.add(self.FREQ_APPLY) self.freqButtons.add(self.FREQ_MOTION) self.freqButtons.add(self.FREQ_CONTINUOUS) self.freqButtons.invoke(0) self._updateDesigStatus()