def update(self, trigName, myData, changes): # print >> __stdout__, "update", trigName, myData, dir(changes), changes.modified # coordSet = list(changes.modified)[0] # print >> __stdout__, len(coordSet.coords()) # print >> __stdout__, dir(coordSet) # print >> __stdout__, "update" # atoms = [] # for selection in xla.get_gui().Subunits.getMovableAtomSpecs(): # atoms.extend(evalSpec(selection).atoms()) for serie in self.series: serie['new'] = [] for chainId in serie['chainIds']: atoms = evalSpec(':.{0}'.format(chainId)).atoms() serie['new'].append(numpyArrayFromAtoms(atoms)) # if self.was_changed(): i = 0 changed_c = None for old_c, new_c in zip(serie['old'], serie['new']): if not (old_c == new_c).all(): changed_c = i i = i + 1 if changed_c is not None: other = set(range(len(serie['chainIds']))) other.remove(changed_c) t3d, rmsd = matchPositions(serie['new'][changed_c], serie['old'][changed_c]) for o in other: newT = Xform.identity() newT.premultiply(serie['t3ds'][o][changed_c]) newT.premultiply(t3d) newT.premultiply(serie['t3ds'][changed_c][o]) atoms = evalSpec(':.{0}'.format( serie['chainIds'][o])).atoms() for a in atoms: a.setCoord(newT.apply(a.coord())) serie['old'] = [] for chainId in serie['chainIds']: atoms = evalSpec(':.{0}'.format(chainId)).atoms() serie['old'].append(numpyArrayFromAtoms(atoms))
def parse_surface_pieces(spec): from chimera.specifier import evalSpec sel = evalSpec(spec) import Surface plist = Surface.selected_surface_pieces(sel) return plist
def inertia(operation, objects, showEllipsoid = True, color = None, perChain = False): from chimera import specifier try: sel = specifier.evalSpec(objects) except: raise CommandError, 'Bad object specifier "%s"' % objects if not color is None: from Commands import parse_color color = parse_color(color) atoms = sel.atoms() if atoms: import inertia if perChain: xf = atoms[0].molecule.openState.xform mname = molecules_name(list(set([a.molecule for a in atoms]))) s = inertia.surface_model(None, xf, 'ellipsoids ' + mname) for achain in atoms_by_chain(atoms): p = inertia.atoms_inertia_ellipsoid(achain, showEllipsoid, color, s) if p: p.oslName = achain[0].residue.id.chainId else: inertia.atoms_inertia_ellipsoid(atoms, showEllipsoid, color) import Surface plist = Surface.selected_surface_pieces(sel, include_outline_boxes = False) if plist: import inertia inertia.surface_inertia_ellipsoid(plist, showEllipsoid, color)
def split_molecules(cmdname, args): fields = args.split() from chimera import openModels, Molecule if len(fields) >= 1: from chimera import specifier sel = specifier.evalSpec(fields[0]) mlist = sel.molecules() else: mlist = openModels.list(modelTypes=[Molecule]) if len(mlist) == 0: from Midas.midas_text import error error('%s: No molecules to split.' % cmdname) return slist = [] for m in mlist: clist = split_molecule(m) if clist: openModels.add(clist, baseId=m.id, noprefs=True) for c in clist: c.openState.xform = m.openState.xform slist.append(m) from chimera import makeLongBondsDashed, makePseudoBondsToMetals makePseudoBondsToMetals(clist) makeLongBondsDashed(clist) openModels.close(slist)
def parse_object_specifier(spec, name='object'): from chimera import specifier try: sel = specifier.evalSpec(spec) except: raise CommandError('Bad %s specifier "%s"' % (name, spec)) return sel
def update(self, trigName, myData, changes): # print >> __stdout__, "update", trigName, myData, dir(changes), changes.modified # coordSet = list(changes.modified)[0] # print >> __stdout__, len(coordSet.coords()) # print >> __stdout__, dir(coordSet) # print >> __stdout__, "update" # atoms = [] # for selection in xla.get_gui().Subunits.getMovableAtomSpecs(): # atoms.extend(evalSpec(selection).atoms()) for serie in self.series: serie['new'] = [] for chainId in serie['chainIds']: atoms = evalSpec(':.{0}'.format(chainId)).atoms() serie['new'].append(numpyArrayFromAtoms(atoms)) # if self.was_changed(): i = 0 changed_c = None for old_c, new_c in zip(serie['old'], serie['new']): if not (old_c == new_c).all(): changed_c = i i = i + 1 if changed_c is not None: other = set(range(len(serie['chainIds']))) other.remove(changed_c) t3d, rmsd = matchPositions(serie['new'][changed_c], serie['old'][changed_c]) for o in other: newT = Xform.identity() newT.premultiply(serie['t3ds'][o][changed_c]) newT.premultiply(t3d) newT.premultiply(serie['t3ds'][changed_c][o]) atoms = evalSpec(':.{0}'.format(serie['chainIds'][o])).atoms() for a in atoms: a.setCoord(newT.apply(a.coord())) serie['old'] = [] for chainId in serie['chainIds']: atoms = evalSpec(':.{0}'.format(chainId)).atoms() serie['old'].append(numpyArrayFromAtoms(atoms))
def validate(self, query): try: sel = evalSpec(query) if sel: current = getattr(sel, self.mode)() if len(current) == 1: return current[0] except: # Syntax error, etc return
def model_arg(s): from chimera.specifier import evalSpec sel = evalSpec(s) mlist = sel.models() if len(mlist) == 0: raise CommandError, 'No models specified' elif len(mlist) > 1: raise CommandError, 'Multiple models specified' return mlist[0]
def parse_model_spec(mspec): if mspec.lower() == 'all': from chimera import openModels as om mlist = om.list() else: from chimera.specifier import evalSpec try: mlist = evalSpec(mspec).models() except: mlist = [] return mlist
def segmentation_arg(s): from chimera.specifier import evalSpec sel = evalSpec(s) mlist = sel.models() from regions import Segmentation slist = [s for s in mlist if isinstance(s, Segmentation)] if len(slist) == 0: raise CommandError, 'No segmentation specified' elif len(slist) > 1: raise CommandError, 'Multiple segmentations specified' return slist[0]
def regions_arg(s): from chimera.specifier import evalSpec sel = evalSpec(s) import Surface plist = Surface.selected_surface_pieces(sel) from Segger import Region rlist = [ p.region for p in plist if hasattr(p, 'region') and isinstance(p.region, Region) ] if len(rlist) == 0: raise CommandError, 'No segmentation regions specified' return rlist
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 parse_atom_specifier(atom_spec, cmdname): # Parse atoms from chimera import specifier try: asel = specifier.evalSpec(atom_spec) except: from Midas.midas_text import error error('%s: Bad atom specifier %s' % (cmdname, atom_spec)) return [] atoms = asel.atoms() if len(atoms) == 0: from Midas.midas_text import error error('%s: No atoms specified by specifier %s' % (cmdname, atom_spec)) return [] return atoms
def parse_multiscale_models(surf_spec, cmdname): # Parse multiscale models from chimera import specifier try: ssel = specifier.evalSpec(surf_spec) except: from Midas.midas_text import error error('%s: Bad model specifier %s' % (cmdname, surf_spec)) return [] ms_models = multiscale_models(ssel.models()) if len(ms_models) == 0: from Midas.midas_text import error error('%s: No multiscale models specified by %s' % (cmdname, surf_spec)) return [] return ms_models
def volumes_from_specifier(spec): from chimera import specifier try: sel = specifier.evalSpec(spec) except: return [] from volume import Volume, volume_list vlist = [m for m in sel.models() if isinstance(m, Volume)] # Translate solid volume models to volume models. from _volume import Volume_Model svlist = [m for m in sel.models() if isinstance(m, Volume_Model)] for s in svlist: for v in volume_list(): if s in v.models(): if not v in vlist: vlist.append(v) break return vlist
def inertia(operation, objects, showEllipsoid=True, color=None, perChain=False): from chimera import specifier try: sel = specifier.evalSpec(objects) except: raise CommandError, 'Bad object specifier "%s"' % objects if not color is None: from Commands import parse_color color = parse_color(color) atoms = sel.atoms() if atoms: import inertia if perChain: xf = atoms[0].molecule.openState.xform mname = molecules_name(list(set([a.molecule for a in atoms]))) s = inertia.surface_model(None, xf, 'ellipsoids ' + mname) for achain in atoms_by_chain(atoms): p = inertia.atoms_inertia_ellipsoid(achain, showEllipsoid, color, s) if p: p.oslName = achain[0].residue.id.chainId else: inertia.atoms_inertia_ellipsoid(atoms, showEllipsoid, color) import Surface plist = Surface.selected_surface_pieces(sel, include_outline_boxes=False) if plist: import inertia inertia.surface_inertia_ellipsoid(plist, showEllipsoid, color)
def molecules_arg(s): from chimera.specifier import evalSpec sel = evalSpec(s) mlist = sel.molecules() return mlist
# Show unit cell outline for a molecule. Usage "runscript showoutline.py #0" import UnitCell d = UnitCell.show_unit_cell_dialog() from chimera import specifier m = specifier.evalSpec(arguments[0]).molecules()[0] d.show_outline_model(m)
def cmdDetectClash(testAtoms, overlapCutoff=defaults[CLASH_THRESHOLD], hbondAllowance=defaults[HBOND_ALLOWANCE], test="others", setAttrs=defaults[ACTION_ATTR], selectClashes=defaults[ACTION_SELECT], colorClashes=defaults[ACTION_COLOR], clashColor=defColors[CLASH_COLOR], nonclashColor=defColors[NONCLASH_COLOR], makePseudobonds=defaults[ACTION_PSEUDOBONDS], pbColor=defColors[PB_COLOR], lineWidth=defaults[PB_WIDTH], bondSeparation=defaults[BOND_SEPARATION], saveFile=None, namingStyle=None, ignoreIntraRes=defaults[IGNORE_INTRA_RES], interSubmodel=False, log=defaults[ACTION_REPLYLOG], summary=True, continuous=False): global _continuousID from Midas import MidasError if continuous: if setAttrs or saveFile != None or log: raise MidasError("log/setAttrs/saveFile not allowed" " with continuous detection") if _continuousID == None: from inspect import getargvalues, currentframe argNames, fArgs, fKw, frameDict = getargvalues(currentframe()) callData = [frameDict[an] for an in argNames] def preCB(trigName, myData, changes): if 'transformation change' in changes.reasons: return _motionCB(myData) _continuousID = chimera.triggers.addHandler( 'OpenState', preCB, callData) elif _continuousID != None: chimera.triggers.deleteHandler('OpenState', _continuousID) _continuousID = None if isinstance(test, basestring): if test.startswith("other"): test = "others" elif test not in ('self', 'model'): # atom spec from chimera.specifier import evalSpec try: test = evalSpec(test).atoms() except: raise MidasError("Could not parse atom spec '%s'" % test) clashes = detectClash(testAtoms, test=test, hbondAllowance=hbondAllowance, clashThreshold=overlapCutoff, bondSeparation=bondSeparation, intraRes=not ignoreIntraRes, interSubmodel=interSubmodel) if selectClashes: chimera.selection.setCurrent(clashes.keys()) if test == "self": outputGrouping = set() else: outputGrouping = testAtoms info = (overlapCutoff, hbondAllowance, bondSeparation, ignoreIntraRes, clashes, outputGrouping) if log: import sys # put a separator in the Reply Log print >> sys.stdout, "" _fileOutput(sys.stdout, info, namingStyle=namingStyle) if saveFile == '-': from FindHBond.MolInfoDialog import SaveMolInfoDialog SaveMolInfoDialog(info, _fileOutput, initialfile="overlaps", title="Choose Overlap Info Save File", historyID="Overlap info") elif saveFile is not None: _fileOutput(saveFile, info, namingStyle=namingStyle) if summary == True: def _summary(msg): from chimera import replyobj replyobj.status(msg + '\n') replyobj.info(msg + '\n') summary = _summary if summary: if clashes: total = 0 for clashList in clashes.values(): total += len(clashList) summary("%d contacts" % (total / 2)) else: summary("No contacts") if not (setAttrs or colorClashes or makePseudobonds): nukeGroup() return clashes if test in ("others", "model"): atoms = [ a for m in chimera.openModels.list(modelTypes=[chimera.Molecule]) for a in m.atoms ] else: atoms = testAtoms if setAttrs: # delete the attribute in _all_ atoms... for m in chimera.openModels.list(modelTypes=[chimera.Molecule]): for a in m.atoms: if hasattr(a, attrName): delattr(a, attrName) for a in atoms: if a in clashes: clashVals = clashes[a].values() clashVals.sort() setattr(a, attrName, clashVals[-1]) if colorClashes: for a in atoms: a.surfaceColor = None if a in clashes: a.color = clashColor else: a.color = nonclashColor if makePseudobonds: from chimera.misc import getPseudoBondGroup pbg = getPseudoBondGroup(groupName) pbg.deleteAll() pbg.lineWidth = lineWidth pbg.color = pbColor seen = set() for a in atoms: if a not in clashes: continue seen.add(a) for clasher in clashes[a].keys(): if clasher in seen: continue pbg.newPseudoBond(a, clasher) else: nukeGroup() return clashes
def testTutorial(self): subUnitFrame = self.g.configFrame.subUnitFrame self.assertEqual(0, len(subUnitFrame.frames)) self.assertEqual(0, len(self.g.configFrame.config.subunits)) activeItemFrame = subUnitFrame.activeItemFrame activeItemFrame.fields["name"][1].insert(0, "Rvb1") activeItemFrame.fields["chainIds"][1].insert(0, "A,C,E") activeItemFrame.fields["color"][1].set(chimera.MaterialColor(0, 255, 0)) activeItemFrame.add.invoke() self.assertEqual(1, len(self.g.configFrame.config.subunits)) self.assertEqual(1, len(subUnitFrame.frames)) activeItemFrame.fields["name"][1].insert(0, "Rvb2") activeItemFrame.fields["chainIds"][1].insert(0, "B,D,F") activeItemFrame.fields["color"][1].set(chimera.MaterialColor(0.392, 0.584, 0.929)) activeItemFrame.add.invoke() self.assertEqual(2, len(self.g.configFrame.config.subunits)) self.assertEqual(2, len(subUnitFrame.frames)) configfilename = tempfile.mkstemp()[1] self.g.configFrame.resMngr._saveAssembly(configfilename) self.assertEqual(configfilename, xla.getRecentPaths()[0]) self.g.Subunits.table.colorAll.invoke() for chain in ["A", "C", "E"]: color = evalSpec("#{0}:.{1}".format(self.model.id, chain)).atoms()[0].color self.assertEqual(color, chimera.MaterialColor(0, 255, 0)) for chain in ["B", "D", "F"]: color = evalSpec("#{0}:.{1}".format(self.model.id, chain)).atoms()[0].color self.assertEqual(color, chimera.MaterialColor(0.392, 0.584, 0.929)) ctable = self.g.Subunits.table ctable.table.tixTable.hlist.selection_clear() ctable.table.tixTable.hlist.selection_set(0) ctable.hide.invoke() for chain in ["A", "C", "E"]: ribbonDisplay = evalSpec("#{0}:.{1}".format(self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, False) for chain in ["B", "D", "F"]: ribbonDisplay = evalSpec("#{0}:.{1}".format(self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, True) ctable.showAll.invoke() ctable.table.tixTable.hlist.selection_clear() ctable.table.tixTable.hlist.selection_set(1) ctable.hide.invoke() for chain in ["A", "C", "E"]: ribbonDisplay = evalSpec("#{0}:.{1}".format(self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, True) for chain in ["B", "D", "F"]: ribbonDisplay = evalSpec("#{0}:.{1}".format(self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, False) ctable.show.invoke() for chain in ["B", "D", "F"]: ribbonDisplay = evalSpec("#{0}:.{1}".format(self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, True) ctable.showAll.invoke() ctable.table.tixTable.hlist.selection_clear() ctable.table.tixTable.hlist.selection_set(0) ctable.showOnly.invoke() for chain in ["A", "C", "E"]: ribbonDisplay = evalSpec("#{0}:.{1}".format(self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, True) for chain in ["B", "D", "F"]: ribbonDisplay = evalSpec("#{0}:.{1}".format(self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, False) ctable.showAll.invoke() ctable.table.tixTable.hlist.selection_clear() ctable.table.tixTable.hlist.selection_set(0) chimera.selection.clearCurrent() ctable.select.invoke() self.assertListEqual(["A", "C", "E"], [s.chain for s in chimera.selection.currentChains()]) chimera.selection.clearCurrent() self.assertEqual(2, len(ctable.table._sortedData())) ctable.chainVar.set(1) self.assertEqual(6, len(ctable.table._sortedData())) ctable.showAll.invoke() ctable.table.tixTable.hlist.selection_clear() ctable.table.tixTable.hlist.selection_set(0) ctable.hide.invoke() for chain in ["A"]: ribbonDisplay = evalSpec("#{0}:.{1}".format(self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, False) for chain in ["C", "E"]: ribbonDisplay = evalSpec("#{0}:.{1}".format(self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, True) ctable.table.tixTable.hlist.selection_set(1) ctable.hide.invoke() ctable.table.tixTable.hlist.selection_set(2) ctable.hide.invoke() ctable.chainVar.set(0) self.assertEqual(False, self.g.configFrame.config.subunits[0].show) self.assertEqual(2, len(ctable.table._sortedData())) ctable.showAll.invoke() self.assertEqual(True, self.g.configFrame.config.subunits[0].show) dataFrame = self.g.configFrame.dataFrame activeItemFrame = dataFrame.activeItemFrame activeItemFrame.fields["name"][1].insert(0, "xlinks") paths = ["xlinks/inter.csv", "xlinks/intra.csv", "xlinks/monolinks.csv"] dirname = os.path.dirname(self.xlaTestCPath) paths = [os.path.join(dirname, p) for p in paths] fileFrame = activeItemFrame.fields["fileGroup"][1] map(fileFrame.fileGroup.addFile, paths) fileFrame.resetFileMenu(paths, 0) activeItemFrame.fields["type"][3].set("xquest") activeItemFrame.add.invoke() self.assertEqual(1, len(self.g.configFrame.config.dataItems)) self.assertEqual(1, len(dataFrame.frames)) dataMgrTab = self.g.__dict__["Data manager"] self.assertEqual(3, len(dataMgrTab.winfo_children())) xFrame = self.g.Xlinks xFrame.displayDefaultBtn.invoke() self.assertEqual(1, len(xFrame.getXlinkDataMgrs())) xmgr = xFrame.getXlinkDataMgrs()[0] self.assertEqual(216, len(xmgr.pbg.pseudoBonds)) displayed = len([pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(75, displayed) xFrame.ld_score_var.set(30.0) displayed = len([pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(57, displayed) xFrame.hideAllXlinksBtn.invoke() displayed = len([pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(0, displayed) xFrame.displayDefaultBtn.invoke() displayed = len([pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(57, displayed) xFrame.hideIntraXlinksBtn.invoke() displayed = len([pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(24, displayed) xFrame.displayDefaultBtn.invoke() xFrame.hideInterXlinksBtn.invoke() displayed = len([pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(33, displayed) xFrame.showAllXlinksBtn.invoke() xFrame.smartModeBtn.invoke() displayed = len([pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(162, displayed) xFrame.smartModeBtn.invoke() displayed = len([pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(57, displayed) xFrame.confOligBtn.invoke() xFrame.confOligWindow.winfo_children()[0].winfo_children()[0].invoke() displayed = len([pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(18, displayed) xFrame.confOligWindow.winfo_children()[0].winfo_children()[0].invoke() activeItemFrame.fields["name"][1].insert(0, "sequences") paths = ["sequences.yeast.fasta"] dirname = os.path.dirname(self.xlaTestCPath) paths = [os.path.join(dirname, p) for p in paths] fileFrame = activeItemFrame.fields["fileGroup"][1] map(fileFrame.fileGroup.addFile, paths) fileFrame.resetFileMenu(paths, 0) activeItemFrame.fields["type"][3].set("sequences") activeItemFrame.add.invoke() self.assertEqual(2, len(self.g.configFrame.config.dataItems)) self.assertEqual(2, len(dataFrame.frames)) sequenceFrame = dataFrame.frames[-1] mapFrame = sequenceFrame.fields["mapping"][1] mapFrame.mapButton.invoke() for seqName, subset in mapFrame.subsetframes.iteritems(): if "RUVB1" in seqName: subset.menus[0].var.set("Rvb1") if "RUVB2" in seqName: subset.menus[0].var.set("Rvb2") mapFrame.onSave() self.g.configFrame.resMngr._saveAssembly(self.g.configFrame.config.file) self.assertEqual(5, len(dataMgrTab.winfo_children())) dataMgrTab.winfo_children()[2].invoke() displayed = len([pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(0, displayed) dataMgrTab.winfo_children()[2].invoke() displayed = len([pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(57, displayed) xFrame.showModifiedFrame.showModifiedMap() for chain in ["A", "C", "E"]: color = evalSpec("#{0}:.{1}".format(self.model.id, chain)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName("light gray")) for chain in ["B", "D", "F"]: color = evalSpec("#{0}:.{1}".format(self.model.id, chain)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName("light gray")) some_red_resi = map(str, [81, 128, 161, 174, 276]) for resi in some_red_resi: for chain in ["B", "D", "F"]: color = evalSpec("#{0}:{2}.{1}".format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName("red")) some_red_resi = map(str, [85, 116, 193, 210, 239, 377]) for resi in some_red_resi: for chain in ["A", "C", "E"]: color = evalSpec("#{0}:{2}.{1}".format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName("red")) some_yellow_resi = map(str, [15, 130, 201, 285, 438]) for resi in some_yellow_resi: for chain in ["B", "D", "F"]: color = evalSpec("#{0}:{2}.{1}".format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName("yellow")) some_blue_resi = map(str, [198, 331, 338, 357]) for resi in some_blue_resi: for chain in ["B", "D", "F"]: color = evalSpec("#{0}:{2}.{1}".format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName("blue")) xFrame.ld_score_var.set(0.0) xFrame.showModifiedFrame.showModifiedMap() some_blue_resi = map(str, [377]) for resi in some_blue_resi: for chain in ["A", "C", "E"]: color = evalSpec("#{0}:{2}.{1}".format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName("blue")) xFrame.ld_score_var.set(30.0) xFrame.showModifiedFrame.showModifiedMap() modelStatsTable = self.g.Xlinks.modelStatsTable modelStatsTable.xlinkToolbar.resetView() self.g.Subunits.table.colorAll.invoke() self.assertEqual(6, len(modelStatsTable.winfo_children())) csvfilename = tempfile.mkstemp()[1] with open(csvfilename, "w") as f: modelStatsTable._exportTable(f) with open(csvfilename, "rU") as csvfile: dialect = csv.Sniffer().sniff(csvfile.readline(), ["\t", ","]) csvfile.seek(0) reader = csv.DictReader(csvfile, dialect=dialect) self.assertListEqual( ["All xlinks", "Satisfied", "Violated", "Satisfied [%]", "Violated [%]", "model"], reader.fieldnames ) rows = list(reader) self.assertEqual(1, len(rows)) row = rows[0] self.assertEqual(2, int(row["Violated"])) self.assertEqual(18, int(row["All xlinks"])) self.assertEqual(16, int(row["Satisfied"])) self.assertEqual("88.9", row["Satisfied [%]"]) self.assertEqual("11.1", row["Violated [%]"]) self.assertEqual("yRvb12.hexamer.pdb", row["model"]) modelStatsTable.modelListFrame.winfo_children()[8].invoke() detailsFrame = modelStatsTable.detailsFrame self.assertEqual(2, len(detailsFrame.winfo_children())) detailsFrame.showHistogram() xlinksSet = detailsFrame.xlinkDataMgr.getXlinksWithDistances(detailsFrame.xlinkStats) self.assertEqual(18, len(xlinksSet.data)) # TODO: test exportSelectedXlinkList detailsFrame.byCompViolatedListFrame.highlightSelBtn.invoke() self.assertEqual(6, len(chimera.selection.currentPseudobonds())) csvfilename = tempfile.mkstemp()[1] with open(csvfilename, "w") as f: detailsFrame.byCompViolatedListFrame._exportSelectedXlinkList(f) with open(csvfilename, "rU") as csvfile: dialect = csv.Sniffer().sniff(csvfile.readline(), ["\t", ","]) csvfile.seek(0) reader = csv.DictReader(csvfile, dialect=dialect) self.assertEqual(6, len(list(reader))) chimera.selection.clearCurrent() detailsFrame.byPairViolatedListFrame.highlightSelBtn.invoke() self.assertEqual(6, len(chimera.selection.currentPseudobonds())) csvfilename = tempfile.mkstemp()[1] with open(csvfilename, "w") as f: detailsFrame.byCompViolatedListFrame._exportSelectedXlinkList(f) with open(csvfilename, "rU") as csvfile: dialect = csv.Sniffer().sniff(csvfile.readline(), ["\t", ","]) csvfile.seek(0) reader = csv.DictReader(csvfile, dialect=dialect) self.assertEqual(6, len(list(reader))) chimera.selection.clearCurrent() modelStatsTable.xlinkToolbar.lengthThreshVar.set(40.0) modelStatsTable.xlinkToolbar.lengthThresholdFrameApplyBtn.invoke() modelStatsTable.updateBtn.invoke() self.assertEqual(6, len(modelStatsTable.winfo_children())) csvfilename = tempfile.mkstemp()[1] with open(csvfilename, "w") as f: modelStatsTable._exportTable(f) with open(csvfilename, "rU") as csvfile: dialect = csv.Sniffer().sniff(csvfile.readline(), ["\t", ","]) csvfile.seek(0) reader = csv.DictReader(csvfile, dialect=dialect) self.assertListEqual( ["All xlinks", "Satisfied", "Violated", "Satisfied [%]", "Violated [%]", "model"], reader.fieldnames ) rows = list(reader) self.assertEqual(1, len(rows)) row = rows[0] self.assertEqual(1, int(row["Violated"])) self.assertEqual(18, int(row["All xlinks"])) self.assertEqual(17, int(row["Satisfied"])) self.assertEqual("94.4", row["Satisfied [%]"]) self.assertEqual("5.6", row["Violated [%]"]) self.assertEqual("yRvb12.hexamer.pdb", row["model"]) modelStatsTable.xlinkToolbar.lengthThreshVar.set(30.0) modelStatsTable.xlinkToolbar.lengthThresholdFrameApplyBtn.invoke() modelStatsTable.updateBtn.invoke() xFrame.showXlinksFromTabNameCompOptMenuFrom.var.set("Rvb1") xFrame.showXlinksFromTabNameCompOptMenuTo.var.set("Rvb2") xFrame.showXlinksFromBtn.invoke() displayed = len([pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(24, displayed) xFrame.ld_score_var.set(0.0) displayed = len([pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(27, displayed) xFrame.ld_score_var.set(30.0) colorXlinkedFrame = xFrame.colorXlinkedFrame colorXlinkedFrame.compOptMenuFrom.var.set("Rvb1") colorXlinkedFrame.compOptMenuTo.var.set("Rvb2") colorXlinkedFrame.colorOptionVar.set(1) colorXlinkedFrame.colorBtn.invoke() some_test_resi = map(str, [31, 171, 174, 432, 450, 454]) for resi in some_test_resi: for chain in ["A", "C", "E"]: color = evalSpec("#{0}:{2}.{1}".format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName("red")) display = evalSpec("#{0}:{2}.{1}".format(self.model.id, chain, resi)).atoms()[0].display self.assertEqual(display, True) colorXlinkedFrame.colorOptionVar.set(2) colorXlinkedFrame.colorBtn.invoke() some_test_resi = map(str, [31, 171, 174, 432, 450, 454]) for resi in some_test_resi: for chain in ["A", "C", "E"]: color = evalSpec("#{0}:{2}.{1}".format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.MaterialColor(0.392, 0.584, 0.929)) display = evalSpec("#{0}:{2}.{1}".format(self.model.id, chain, resi)).atoms()[0].display self.assertEqual(display, True) colorXlinkedFrame.compOptMenuFrom.var.set("Rvb2") colorXlinkedFrame.compOptMenuTo.var.set("Rvb1") colorXlinkedFrame.uncolorOthersBtn.var.set(True) colorXlinkedFrame.colorOptionVar.set(2) colorXlinkedFrame.colorBtn.invoke() some_test_resi = map(str, [31, 171, 174, 432, 450, 454]) for resi in some_test_resi: for chain in ["A", "C", "E"]: display = evalSpec("#{0}:{2}.{1}".format(self.model.id, chain, resi)).atoms()[0].display self.assertEqual(display, False) some_test_resi = map(str, [123, 157, 198, 357, 414]) for resi in some_test_resi: for chain in ["B", "D", "F"]: color = evalSpec("#{0}:{2}.{1}".format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.MaterialColor(0, 255, 0)) display = evalSpec("#{0}:{2}.{1}".format(self.model.id, chain, resi)).atoms()[0].display self.assertEqual(display, True)
def __init__(self): self.m = chimera.openModels.list()[0] # Matchmaker yRvb12.hexamer.pdb, chain C (#1) with yRvb12.hexamer.pdb, chain A (#0), sequence alignment score = 1986.2 # with these parameters: # chain pairing: bb # Needleman-Wunsch using BLOSUM-62 # ss fraction: 0.3 # gap open (HH/SS/other) 18/18/6, extend 1 # ss matrix: # (H, O): -6 # (S, S): 6 # (H, H): 6 # (O, S): -6 # (O, O): 4 # (H, S): -9 # iteration cutoff: 2 # RMSD between 393 atom pairs is 0.001 angstroms # Position of yRvb12.hexamer.pdb (#0) relative to yRvb12.hexamer.pdb (#1) coordinates: # Matrix rotation and translation # -0.50000042 0.86602516 0.00000116 -103.53997515 # -0.86602516 -0.50000042 0.00000058 179.33655802 # 0.00000108 -0.00000072 1.00000000 0.00005125 # Axis -0.00000075 0.00000005 -1.00000000 # Axis point -0.00001174 119.55767842 0.00000000 # Rotation angle (degrees) 120.00002798 # Shift along axis 0.00003425 self.series = [ { 'tr3d': Xform.xform(-0.50000042, 0.86602516, 0.00000116, -103.53997515, -0.86602516, -0.50000042, 0.00000058, 179.33655802, 0.00000108, -0.00000072, 1.00000000, 0.00005125, orthogonalize=True), 'chainIds': ['A', 'C', 'E'], 'old': [], 'new': [] } ] # for a in evalSpec(':.A').atoms(): # a.setCoord(self.symTr3d.apply(a.coord())) for serie in self.series: serie['t3ds'] = [[None for i in range(len(serie['chainIds']))] for j in range(len(serie['chainIds']))] for i in range(len(serie['chainIds'])): # self.t3ds.append([]) for j in range(len(serie['chainIds'])): count = abs(j-i) symTr3d = Xform.identity() for c in range(count): symTr3d.multiply(serie['tr3d']) newT = Xform.identity() if i < j: newT = symTr3d elif i > j: newT = symTr3d.inverse() serie['t3ds'][i][j] = newT for chainId in serie['chainIds']: atoms = evalSpec(':.{0}'.format(chainId)).atoms() serie['old'].append(numpyArrayFromAtoms(atoms))
def cmdDetectClash(testAtoms, overlapCutoff=defaults[CLASH_THRESHOLD], hbondAllowance=defaults[HBOND_ALLOWANCE], test="others", setAttrs=defaults[ACTION_ATTR], selectClashes= defaults[ACTION_SELECT], colorClashes=defaults[ACTION_COLOR], clashColor=defColors[CLASH_COLOR], nonclashColor= defColors[NONCLASH_COLOR], makePseudobonds= defaults[ACTION_PSEUDOBONDS], pbColor=defColors[PB_COLOR], lineWidth=defaults[PB_WIDTH], bondSeparation= defaults[BOND_SEPARATION], saveFile=None, namingStyle=None, ignoreIntraRes=defaults[IGNORE_INTRA_RES], interSubmodel=False, log=defaults[ACTION_REPLYLOG], summary=True, continuous=False): global _continuousID from Midas import MidasError if continuous: if setAttrs or saveFile != None or log: raise MidasError("log/setAttrs/saveFile not allowed" " with continuous detection") if _continuousID == None: from inspect import getargvalues, currentframe argNames, fArgs, fKw, frameDict = getargvalues( currentframe()) callData = [frameDict[an] for an in argNames] def preCB(trigName, myData, changes): if 'transformation change' in changes.reasons: return _motionCB(myData) _continuousID = chimera.triggers.addHandler( 'OpenState', preCB, callData) elif _continuousID != None: chimera.triggers.deleteHandler('OpenState', _continuousID) _continuousID = None if isinstance(test, basestring): if test.startswith("other"): test = "others" elif test not in ('self', 'model'): # atom spec from chimera.specifier import evalSpec try: test = evalSpec(test).atoms() except: raise MidasError("Could not parse atom spec '%s'" % test) clashes = detectClash(testAtoms, test=test, hbondAllowance=hbondAllowance, clashThreshold=overlapCutoff, bondSeparation=bondSeparation, intraRes=not ignoreIntraRes, interSubmodel=interSubmodel) if selectClashes: chimera.selection.setCurrent(clashes.keys()) if test == "self": outputGrouping = set() else: outputGrouping = testAtoms info = (overlapCutoff, hbondAllowance, bondSeparation, ignoreIntraRes, clashes, outputGrouping) if log: import sys # put a separator in the Reply Log print>>sys.stdout, "" _fileOutput(sys.stdout, info, namingStyle=namingStyle) if saveFile == '-': from FindHBond.MolInfoDialog import SaveMolInfoDialog SaveMolInfoDialog(info, _fileOutput, initialfile="overlaps", title="Choose Overlap Info Save File", historyID="Overlap info") elif saveFile is not None: _fileOutput(saveFile, info, namingStyle=namingStyle) if summary == True: def _summary(msg): from chimera import replyobj replyobj.status(msg + '\n') replyobj.info(msg + '\n') summary = _summary if summary: if clashes: total = 0 for clashList in clashes.values(): total += len(clashList) summary("%d contacts" % (total/2)) else: summary("No contacts") if not (setAttrs or colorClashes or makePseudobonds): nukeGroup() return clashes if test in ("others", "model"): atoms = [a for m in chimera.openModels.list( modelTypes=[chimera.Molecule]) for a in m.atoms] else: atoms = testAtoms if setAttrs: # delete the attribute in _all_ atoms... for m in chimera.openModels.list(modelTypes=[chimera.Molecule]): for a in m.atoms: if hasattr(a, attrName): delattr(a, attrName) for a in atoms: if a in clashes: clashVals = clashes[a].values() clashVals.sort() setattr(a, attrName, clashVals[-1]) if colorClashes: for a in atoms: a.surfaceColor = None if a in clashes: a.color = clashColor else: a.color = nonclashColor if makePseudobonds: from chimera.misc import getPseudoBondGroup pbg = getPseudoBondGroup(groupName) pbg.deleteAll() pbg.lineWidth = lineWidth pbg.color = pbColor seen = set() for a in atoms: if a not in clashes: continue seen.add(a) for clasher in clashes[a].keys(): if clasher in seen: continue pbg.newPseudoBond(a, clasher) else: nukeGroup() return clashes
def _addAttr(attrFile, models, log, raiseAttrDialog): setAttrs = {} colors = {} from CGLutil.annotatedDataFile import readDataFile control = { 'match mode': _MATCH_MODE_ANY, 'recipient': "atoms" } for rawControl, data in readDataFile(attrFile): control.update(rawControl) legalNames = ["attribute", "match mode", "recipient"] for name in control.keys(): if name not in legalNames: raise SyntaxError("Unknown name part of control" " line: '%s'\nMust be one of: %s" % ( name, ", ".join(legalNames))) if "attribute" not in control: raise SyntaxError("No attribute name specified in file") attrName = control["attribute"] if not attrName.replace("_", "").isalnum() \ or attrName[0].isdigit(): raise SyntaxError("Attribute name (%s) is bad.\n" "It must be strictly alphanumeric characters or" " underscores with no spaces and must not start" " with a digit." % control["attribute"]) colorAttr = attrName.lower().endswith("color") matchMode = control["match mode"] if matchMode not in _matchModes: raise SyntaxError("Unknown match mode (%s) specified.\n" "It must be one of: %s" % ( control["match mode"], ", ".join(_matchModes))) recipient = control["recipient"] if not hasattr(selection.ItemizedSelection, recipient): raise SyntaxError("Unknown attribute recipient (%s)" " specified.\nSuggest using atoms, residues, or" " molecules" % control["recipient"]) dataErrors = [] for lineNum, d in enumerate(data): try: selector, value = d except ValueError: dataErrors.append("Data line %d of file either" " not selector/value or not" " tab-delimited" % (lineNum+1)) continue try: sel = specifier.evalSpec(selector, models) except: import sys dataErrors.append("Mangled selector (%s) on" " data line %d: %s" % (selector, lineNum+1, sys.exc_value)) continue matches = getattr(sel, recipient)() # restrict to models; the "models" argument to evalSpec # only works if the selector is an OSL if matches and models is not None: md = set(models) level = matches[0].oslLevel() if level == selection.SelGraph: filterFunc = lambda x, md=md: x in md elif level == selection.SelEdge: filterFunc = lambda x, md=md: \ x.atoms[0].molecule in md else: filterFunc = lambda x, md=md: \ x.molecule in md matches = filter(filterFunc, matches) if not matches: if matchMode != _MATCH_MODE_ANY: dataErrors.append("Selector (%s) on" " data line %d matched nothing" % (selector, lineNum+1)) continue elif len(matches) > 1: if matchMode == _MATCH_MODE_1_TO_1: dataErrors.append("Selector (%s) on" " data line %d matched multiple" " items: %s" % (selector, lineNum+1, ", ".join(map(lambda m: m.oslIdent(), matches)))) if log: replyobj.info("Selector %s matched " % selector + ", ".join(map(misc.chimeraLabel, matches)) + "\n") if colorAttr: if value[0].isalpha(): # color name from chimera.colorTable \ import getColorByName try: value = getColorByName(value) except KeyError: dataErrors.append("Unknown" " color name on data" " line %d: '%s'" % (lineNum+1, value)) continue else: try: rgba = tuple(map(float, value.split())) except ValueError: dataErrors.append( "Unrecognizable color" " value on data line" " %d: '%s'; Must be" " either color name or" " 3 or 4 numbers" " between 0 and 1" " (RGBA)" % (lineNum+1)) continue if max(rgba) > 1.0 or min(rgba) < 0.0: dataErrors.append("Color" " component values on" " data line %d not" " in the range 0 to 1" % (lineNum+1)) continue if rgba in colors: value = colors[rgba] elif len(rgba) in [3, 4]: value = chimera.MaterialColor( *rgba) colors[rgba] = value else: dataErrors.append("Bad number" " of color components" " on data line %d; Must" " be either 3 or 4 (was" " %d)" % (lineNum+1, len(rgba))) continue else: value = convertType(value) for match in matches: setattr(match, attrName, value) if matches and not colorAttr: setAttrs[(recipient, attrName)] = value recipMapping = { "molecules": chimera.Molecule, "residues": chimera.Residue, "bonds": chimera.Bond, "atoms": chimera.Atom } from SimpleSession import registerAttribute for recipient, attrName in setAttrs: if recipient in recipMapping: registerAttribute(recipMapping[recipient], attrName) if setAttrs and not chimera.nogui and raiseAttrDialog: from ShowAttr import ShowAttrDialog, screenedAttrs from chimera import dialogs showableAttr = False reasons = [] for recipient, attrName in setAttrs.keys(): if recipient == "molecules": recipient = "models" validRecipients = ["atoms", "residues", "models"] if recipient not in validRecipients: reasons.append("%s not assigned to atoms," " residues, or models" % attrName) continue key = [chimera.Atom, chimera.Residue, chimera.Model][ validRecipients.index(recipient)] if attrName in screenedAttrs[key]: reasons.append("%s automatically screened out" " by Render By Attribute" % attrName) continue if attrName[0] == '_': reasons.append("%s considered to be a private" " variable" % attrName) continue if attrName[0].isupper(): reasons.append("%s considered to be a symbolic" " constant due to initial capital" " letter" % attrName) continue showableAttr = True break if showableAttr: if models is None: ms = chimera.openModels.list() else: ms = models if colorAttr: an = None mode = None else: an = attrName from types import StringTypes if type(setAttrs[(recipient, attrName)]) in ( bool,) + StringTypes: mode = "Select" else: mode = "Render" d = dialogs.display(ShowAttrDialog.name) d.configure(models=[m for m in ms if isinstance(m, chimera.Molecule)], attrsOf=recipient, attrName=an, mode=mode) else: replyobj.warning("No attributes usable by Render dialog" " were defined:\n" + "\n".join(reasons) + "\n") if dataErrors: raise SyntaxError, "\n".join(dataErrors) return setAttrs
def __init__(self): self.m = chimera.openModels.list()[0] # Matchmaker yRvb12.hexamer.pdb, chain C (#1) with yRvb12.hexamer.pdb, chain A (#0), sequence alignment score = 1986.2 # with these parameters: # chain pairing: bb # Needleman-Wunsch using BLOSUM-62 # ss fraction: 0.3 # gap open (HH/SS/other) 18/18/6, extend 1 # ss matrix: # (H, O): -6 # (S, S): 6 # (H, H): 6 # (O, S): -6 # (O, O): 4 # (H, S): -9 # iteration cutoff: 2 # RMSD between 393 atom pairs is 0.001 angstroms # Position of yRvb12.hexamer.pdb (#0) relative to yRvb12.hexamer.pdb (#1) coordinates: # Matrix rotation and translation # -0.50000042 0.86602516 0.00000116 -103.53997515 # -0.86602516 -0.50000042 0.00000058 179.33655802 # 0.00000108 -0.00000072 1.00000000 0.00005125 # Axis -0.00000075 0.00000005 -1.00000000 # Axis point -0.00001174 119.55767842 0.00000000 # Rotation angle (degrees) 120.00002798 # Shift along axis 0.00003425 self.series = [{ 'tr3d': Xform.xform(-0.50000042, 0.86602516, 0.00000116, -103.53997515, -0.86602516, -0.50000042, 0.00000058, 179.33655802, 0.00000108, -0.00000072, 1.00000000, 0.00005125, orthogonalize=True), 'chainIds': ['A', 'C', 'E'], 'old': [], 'new': [] }] # for a in evalSpec(':.A').atoms(): # a.setCoord(self.symTr3d.apply(a.coord())) for serie in self.series: serie['t3ds'] = [[None for i in range(len(serie['chainIds']))] for j in range(len(serie['chainIds']))] for i in range(len(serie['chainIds'])): # self.t3ds.append([]) for j in range(len(serie['chainIds'])): count = abs(j - i) symTr3d = Xform.identity() for c in range(count): symTr3d.multiply(serie['tr3d']) newT = Xform.identity() if i < j: newT = symTr3d elif i > j: newT = symTr3d.inverse() serie['t3ds'][i][j] = newT for chainId in serie['chainIds']: atoms = evalSpec(':.{0}'.format(chainId)).atoms() serie['old'].append(numpyArrayFromAtoms(atoms))
def testTutorial(self): subUnitFrame = self.g.configFrame.subUnitFrame self.assertEqual(0, len(subUnitFrame.frames)) self.assertEqual(0, len(self.g.configFrame.config.subunits)) activeItemFrame = subUnitFrame.activeItemFrame activeItemFrame.fields['name'][1].insert(0, 'Rvb1') activeItemFrame.fields['chainIds'][1].insert(0, 'A,C,E') activeItemFrame.fields['color'][1].set(chimera.MaterialColor( 0, 255, 0)) activeItemFrame.add.invoke() self.assertEqual(1, len(self.g.configFrame.config.subunits)) self.assertEqual(1, len(subUnitFrame.frames)) activeItemFrame.fields['name'][1].insert(0, 'Rvb2') activeItemFrame.fields['chainIds'][1].insert(0, 'B,D,F') activeItemFrame.fields['color'][1].set( chimera.MaterialColor(0.392, 0.584, 0.929)) activeItemFrame.add.invoke() self.assertEqual(2, len(self.g.configFrame.config.subunits)) self.assertEqual(2, len(subUnitFrame.frames)) configfilename = tempfile.mkstemp()[1] self.g.configFrame.resMngr._saveAssembly(configfilename) self.assertEqual(configfilename, xla.getRecentPaths()[0]) self.g.Subunits.table.colorAll.invoke() for chain in ['A', 'C', 'E']: color = evalSpec('#{0}:.{1}'.format(self.model.id, chain)).atoms()[0].color self.assertEqual(color, chimera.MaterialColor(0, 255, 0)) for chain in ['B', 'D', 'F']: color = evalSpec('#{0}:.{1}'.format(self.model.id, chain)).atoms()[0].color self.assertEqual(color, chimera.MaterialColor(0.392, 0.584, 0.929)) ctable = self.g.Subunits.table ctable.table.tixTable.hlist.selection_clear() ctable.table.tixTable.hlist.selection_set(0) ctable.hide.invoke() for chain in ['A', 'C', 'E']: ribbonDisplay = evalSpec('#{0}:.{1}'.format( self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, False) for chain in ['B', 'D', 'F']: ribbonDisplay = evalSpec('#{0}:.{1}'.format( self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, True) ctable.showAll.invoke() ctable.table.tixTable.hlist.selection_clear() ctable.table.tixTable.hlist.selection_set(1) ctable.hide.invoke() for chain in ['A', 'C', 'E']: ribbonDisplay = evalSpec('#{0}:.{1}'.format( self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, True) for chain in ['B', 'D', 'F']: ribbonDisplay = evalSpec('#{0}:.{1}'.format( self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, False) ctable.show.invoke() for chain in ['B', 'D', 'F']: ribbonDisplay = evalSpec('#{0}:.{1}'.format( self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, True) ctable.showAll.invoke() ctable.table.tixTable.hlist.selection_clear() ctable.table.tixTable.hlist.selection_set(0) ctable.showOnly.invoke() for chain in ['A', 'C', 'E']: ribbonDisplay = evalSpec('#{0}:.{1}'.format( self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, True) for chain in ['B', 'D', 'F']: ribbonDisplay = evalSpec('#{0}:.{1}'.format( self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, False) ctable.showAll.invoke() ctable.table.tixTable.hlist.selection_clear() ctable.table.tixTable.hlist.selection_set(0) chimera.selection.clearCurrent() ctable.select.invoke() self.assertListEqual( ['A', 'C', 'E'], [s.chain for s in chimera.selection.currentChains()]) chimera.selection.clearCurrent() self.assertEqual(2, len(ctable.table._sortedData())) ctable.chainVar.set(1) self.assertEqual(6, len(ctable.table._sortedData())) ctable.showAll.invoke() ctable.table.tixTable.hlist.selection_clear() ctable.table.tixTable.hlist.selection_set(0) ctable.hide.invoke() for chain in ['A']: ribbonDisplay = evalSpec('#{0}:.{1}'.format( self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, False) for chain in ['C', 'E']: ribbonDisplay = evalSpec('#{0}:.{1}'.format( self.model.id, chain)).residues()[0].ribbonDisplay self.assertEqual(ribbonDisplay, True) ctable.table.tixTable.hlist.selection_set(1) ctable.hide.invoke() ctable.table.tixTable.hlist.selection_set(2) ctable.hide.invoke() ctable.chainVar.set(0) self.assertEqual(False, self.g.configFrame.config.subunits[0].show) self.assertEqual(2, len(ctable.table._sortedData())) ctable.showAll.invoke() self.assertEqual(True, self.g.configFrame.config.subunits[0].show) dataFrame = self.g.configFrame.dataFrame activeItemFrame = dataFrame.activeItemFrame activeItemFrame.fields['name'][1].insert(0, 'xlinks') paths = [ 'xlinks/inter.csv', 'xlinks/intra.csv', 'xlinks/monolinks.csv' ] dirname = os.path.dirname(self.xlaTestCPath) paths = [os.path.join(dirname, p) for p in paths] fileFrame = activeItemFrame.fields['fileGroup'][1] map(fileFrame.fileGroup.addFile, paths) fileFrame.resetFileMenu(paths, 0) activeItemFrame.fields['type'][3].set('xquest') activeItemFrame.add.invoke() self.assertEqual(1, len(self.g.configFrame.config.dataItems)) self.assertEqual(1, len(dataFrame.frames)) dataMgrTab = self.g.__dict__['Data manager'] self.assertEqual(3, len(dataMgrTab.winfo_children())) xFrame = self.g.Xlinks xFrame.displayDefaultBtn.invoke() self.assertEqual(1, len(xFrame.getXlinkDataMgrs())) xmgr = xFrame.getXlinkDataMgrs()[0] self.assertEqual(216, len(xmgr.pbg.pseudoBonds)) displayed = len( [pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(75, displayed) xFrame.ld_score_var.set(30.0) displayed = len( [pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(57, displayed) xFrame.hideAllXlinksBtn.invoke() displayed = len( [pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(0, displayed) xFrame.displayDefaultBtn.invoke() displayed = len( [pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(57, displayed) xFrame.hideIntraXlinksBtn.invoke() displayed = len( [pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(24, displayed) xFrame.displayDefaultBtn.invoke() xFrame.hideInterXlinksBtn.invoke() displayed = len( [pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(33, displayed) xFrame.showAllXlinksBtn.invoke() xFrame.smartModeBtn.invoke() displayed = len( [pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(162, displayed) xFrame.smartModeBtn.invoke() displayed = len( [pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(57, displayed) xFrame.confOligBtn.invoke() xFrame.confOligWindow.winfo_children()[0].winfo_children()[0].invoke() displayed = len( [pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(18, displayed) xFrame.confOligWindow.winfo_children()[0].winfo_children()[0].invoke() activeItemFrame.fields['name'][1].insert(0, 'sequences') paths = ['sequences.yeast.fasta'] dirname = os.path.dirname(self.xlaTestCPath) paths = [os.path.join(dirname, p) for p in paths] fileFrame = activeItemFrame.fields['fileGroup'][1] map(fileFrame.fileGroup.addFile, paths) fileFrame.resetFileMenu(paths, 0) activeItemFrame.fields['type'][3].set('sequences') activeItemFrame.add.invoke() self.assertEqual(2, len(self.g.configFrame.config.dataItems)) self.assertEqual(2, len(dataFrame.frames)) sequenceFrame = dataFrame.frames[-1] mapFrame = sequenceFrame.fields['mapping'][1] mapFrame.mapButton.invoke() for seqName, subset in mapFrame.subsetframes.iteritems(): if 'RUVB1' in seqName: subset.menus[0].var.set('Rvb1') if 'RUVB2' in seqName: subset.menus[0].var.set('Rvb2') mapFrame.onSave() self.g.configFrame.resMngr._saveAssembly( self.g.configFrame.config.file) self.assertEqual(5, len(dataMgrTab.winfo_children())) dataMgrTab.winfo_children()[2].invoke() displayed = len( [pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(0, displayed) dataMgrTab.winfo_children()[2].invoke() displayed = len( [pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(57, displayed) xFrame.showModifiedFrame.showModifiedMap() for chain in ['A', 'C', 'E']: color = evalSpec('#{0}:.{1}'.format(self.model.id, chain)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName('light gray')) for chain in ['B', 'D', 'F']: color = evalSpec('#{0}:.{1}'.format(self.model.id, chain)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName('light gray')) some_red_resi = map(str, [81, 128, 161, 174, 276]) for resi in some_red_resi: for chain in ['B', 'D', 'F']: color = evalSpec('#{0}:{2}.{1}'.format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName('red')) some_red_resi = map(str, [85, 116, 193, 210, 239, 377]) for resi in some_red_resi: for chain in ['A', 'C', 'E']: color = evalSpec('#{0}:{2}.{1}'.format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName('red')) some_yellow_resi = map(str, [15, 130, 201, 285, 438]) for resi in some_yellow_resi: for chain in ['B', 'D', 'F']: color = evalSpec('#{0}:{2}.{1}'.format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName('yellow')) some_blue_resi = map(str, [198, 331, 338, 357]) for resi in some_blue_resi: for chain in ['B', 'D', 'F']: color = evalSpec('#{0}:{2}.{1}'.format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName('blue')) xFrame.ld_score_var.set(0.0) xFrame.showModifiedFrame.showModifiedMap() some_blue_resi = map(str, [377]) for resi in some_blue_resi: for chain in ['A', 'C', 'E']: color = evalSpec('#{0}:{2}.{1}'.format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName('blue')) xFrame.ld_score_var.set(30.0) xFrame.showModifiedFrame.showModifiedMap() modelStatsTable = self.g.Xlinks.modelStatsTable modelStatsTable.xlinkToolbar.resetView() self.g.Subunits.table.colorAll.invoke() self.assertEqual(6, len(modelStatsTable.winfo_children())) csvfilename = tempfile.mkstemp()[1] with open(csvfilename, 'w') as f: modelStatsTable._exportTable(f) with open(csvfilename, 'rU') as csvfile: dialect = csv.Sniffer().sniff(csvfile.readline(), ['\t', ',']) csvfile.seek(0) reader = csv.DictReader(csvfile, dialect=dialect) self.assertListEqual([ 'All xlinks', 'Satisfied', 'Violated', 'Satisfied [%]', 'Violated [%]', 'model' ], reader.fieldnames) rows = list(reader) self.assertEqual(1, len(rows)) row = rows[0] self.assertEqual(2, int(row['Violated'])) self.assertEqual(18, int(row['All xlinks'])) self.assertEqual(16, int(row['Satisfied'])) self.assertEqual('88.9', row['Satisfied [%]']) self.assertEqual('11.1', row['Violated [%]']) self.assertEqual('yRvb12.hexamer.pdb', row['model']) modelStatsTable.modelListFrame.winfo_children()[8].invoke() detailsFrame = modelStatsTable.detailsFrame self.assertEqual(2, len(detailsFrame.winfo_children())) detailsFrame.showHistogram() xlinksSet = detailsFrame.xlinkDataMgr.getXlinksWithDistances( detailsFrame.xlinkStats) self.assertEqual(18, len(xlinksSet.data)) #TODO: test exportSelectedXlinkList detailsFrame.byCompViolatedListFrame.highlightSelBtn.invoke() self.assertEqual(6, len(chimera.selection.currentPseudobonds())) csvfilename = tempfile.mkstemp()[1] with open(csvfilename, 'w') as f: detailsFrame.byCompViolatedListFrame._exportSelectedXlinkList(f) with open(csvfilename, 'rU') as csvfile: dialect = csv.Sniffer().sniff(csvfile.readline(), ['\t', ',']) csvfile.seek(0) reader = csv.DictReader(csvfile, dialect=dialect) self.assertEqual(6, len(list(reader))) chimera.selection.clearCurrent() detailsFrame.byPairViolatedListFrame.highlightSelBtn.invoke() self.assertEqual(6, len(chimera.selection.currentPseudobonds())) csvfilename = tempfile.mkstemp()[1] with open(csvfilename, 'w') as f: detailsFrame.byCompViolatedListFrame._exportSelectedXlinkList(f) with open(csvfilename, 'rU') as csvfile: dialect = csv.Sniffer().sniff(csvfile.readline(), ['\t', ',']) csvfile.seek(0) reader = csv.DictReader(csvfile, dialect=dialect) self.assertEqual(6, len(list(reader))) chimera.selection.clearCurrent() modelStatsTable.xlinkToolbar.lengthThreshVar.set(40.0) modelStatsTable.xlinkToolbar.lengthThresholdFrameApplyBtn.invoke() modelStatsTable.updateBtn.invoke() self.assertEqual(6, len(modelStatsTable.winfo_children())) csvfilename = tempfile.mkstemp()[1] with open(csvfilename, 'w') as f: modelStatsTable._exportTable(f) with open(csvfilename, 'rU') as csvfile: dialect = csv.Sniffer().sniff(csvfile.readline(), ['\t', ',']) csvfile.seek(0) reader = csv.DictReader(csvfile, dialect=dialect) self.assertListEqual([ 'All xlinks', 'Satisfied', 'Violated', 'Satisfied [%]', 'Violated [%]', 'model' ], reader.fieldnames) rows = list(reader) self.assertEqual(1, len(rows)) row = rows[0] self.assertEqual(1, int(row['Violated'])) self.assertEqual(18, int(row['All xlinks'])) self.assertEqual(17, int(row['Satisfied'])) self.assertEqual('94.4', row['Satisfied [%]']) self.assertEqual('5.6', row['Violated [%]']) self.assertEqual('yRvb12.hexamer.pdb', row['model']) modelStatsTable.xlinkToolbar.lengthThreshVar.set(30.0) modelStatsTable.xlinkToolbar.lengthThresholdFrameApplyBtn.invoke() modelStatsTable.updateBtn.invoke() xFrame.showXlinksFromTabNameCompOptMenuFrom.var.set('Rvb1') xFrame.showXlinksFromTabNameCompOptMenuTo.var.set('Rvb2') xFrame.showXlinksFromBtn.invoke() displayed = len( [pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(24, displayed) xFrame.ld_score_var.set(0.0) displayed = len( [pb for pb in xmgr.pbg.pseudoBonds if pb.display == True]) self.assertEqual(27, displayed) xFrame.ld_score_var.set(30.0) colorXlinkedFrame = xFrame.colorXlinkedFrame colorXlinkedFrame.compOptMenuFrom.var.set('Rvb1') colorXlinkedFrame.compOptMenuTo.var.set('Rvb2') colorXlinkedFrame.colorOptionVar.set(1) colorXlinkedFrame.colorBtn.invoke() some_test_resi = map(str, [31, 171, 174, 432, 450, 454]) for resi in some_test_resi: for chain in ['A', 'C', 'E']: color = evalSpec('#{0}:{2}.{1}'.format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.colorTable.getColorByName('red')) display = evalSpec('#{0}:{2}.{1}'.format( self.model.id, chain, resi)).atoms()[0].display self.assertEqual(display, True) colorXlinkedFrame.colorOptionVar.set(2) colorXlinkedFrame.colorBtn.invoke() some_test_resi = map(str, [31, 171, 174, 432, 450, 454]) for resi in some_test_resi: for chain in ['A', 'C', 'E']: color = evalSpec('#{0}:{2}.{1}'.format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.MaterialColor(0.392, 0.584, 0.929)) display = evalSpec('#{0}:{2}.{1}'.format( self.model.id, chain, resi)).atoms()[0].display self.assertEqual(display, True) colorXlinkedFrame.compOptMenuFrom.var.set('Rvb2') colorXlinkedFrame.compOptMenuTo.var.set('Rvb1') colorXlinkedFrame.uncolorOthersBtn.var.set(True) colorXlinkedFrame.colorOptionVar.set(2) colorXlinkedFrame.colorBtn.invoke() some_test_resi = map(str, [31, 171, 174, 432, 450, 454]) for resi in some_test_resi: for chain in ['A', 'C', 'E']: display = evalSpec('#{0}:{2}.{1}'.format( self.model.id, chain, resi)).atoms()[0].display self.assertEqual(display, False) some_test_resi = map(str, [123, 157, 198, 357, 414]) for resi in some_test_resi: for chain in ['B', 'D', 'F']: color = evalSpec('#{0}:{2}.{1}'.format(self.model.id, chain, resi)).atoms()[0].color self.assertEqual(color, chimera.MaterialColor(0, 255, 0)) display = evalSpec('#{0}:{2}.{1}'.format( self.model.id, chain, resi)).atoms()[0].display self.assertEqual(display, True)