Example #1
0
    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))
Example #2
0
def parse_surface_pieces(spec):

    from chimera.specifier import evalSpec
    sel = evalSpec(spec)
    import Surface
    plist = Surface.selected_surface_pieces(sel)
    return plist
Example #3
0
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_surface_pieces(spec):

    from chimera.specifier import evalSpec
    sel = evalSpec(spec)
    import Surface
    plist = Surface.selected_surface_pieces(sel)
    return plist
Example #6
0
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
Example #7
0
    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))
Example #8
0
 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
Example #9
0
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 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
Example #12
0
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]
Example #13
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
Example #15
0
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
Example #16
0
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
Example #17
0
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
Example #18
0
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 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)
Example #22
0
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)
Example #24
0
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)
Example #26
0
    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))
Example #27
0
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 molecules_arg(s):

    from chimera.specifier import evalSpec
    sel = evalSpec(s)
    mlist = sel.molecules()
    return mlist
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
Example #30
0
    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)