def show_curve(self, radius=0, band_length=0, segment_subdivisions=10, circle_subdivisions=15): m = self.molecule if m is None: return import tube s, plist = tube.tube_through_atoms(m.atoms, radius, band_length, segment_subdivisions, circle_subdivisions) if s is None: return s.name = 'path tracer curve' self.curve_parameters = (radius, band_length, segment_subdivisions) self.curve_model = s from chimera import addModelClosedCallback addModelClosedCallback(s, self.curve_model_closed_cb) import SimpleSession SimpleSession.noAutoRestore(s)
def make_model(self, length, thickness, rgb, label, xy_offset, label_rgb, model_id): m = chimera.Molecule() m.name = 'scale bar' # # Need to create a residue because atom without residue causes # unknown C++ exceptions. # rid = chimera.MolResId(1) r = m.newResidue('sb', rid) atoms = [] for name, pos in (('1', (-length / 2.0, 0, 0)), ('2', (length / 2.0, 0, 0)), ('label', (xy_offset[0], xy_offset[1] + thickness / 2.0, 0))): a = m.newAtom(name, chimera.elements.H) r.addAtom(a) c = chimera.Coord() c.x, c.y, c.z = pos a.setCoord(c) # a.coord = c does not work a.display = 0 atoms.append(a) m.atom1, m.atom2, m.label_atom = atoms m.label_atom.color = background_color() m.label_atom.display = 1 b = m.newBond(m.atom1, m.atom2) b.display = b.Always b.drawMode = b.Stick b.radius = thickness / 2.0 b.color = chimera_color(rgb) b.halfbond = 0 m.label_atom.label = label m.label_atom.labelColor = chimera_color(label_rgb) self.model = m if model_id == None: id, subid = (self.model_id(), chimera.openModels.Default) else: id, subid = model_id chimera.openModels.add([m], baseId=id, subid=subid) chimera.addModelClosedCallback(m, self.model_closed_cb) import SimpleSession SimpleSession.noAutoRestore(m) m.openState.active = False z_near, z_far = clip_plane_positions() self.set_depth(.5 * (z_near + z_far)) self.set_screen_position(self.screen_position) self.orientation_cb() return m
def make_model(self, length, thickness, rgb, label, xy_offset, label_rgb, model_id): m = chimera.Molecule() m.name = 'scale bar' # # Need to create a residue because atom without residue causes # unknown C++ exceptions. # rid = chimera.MolResId(1) r = m.newResidue('sb', rid) atoms = [] for name, pos in (('1', (-length/2.0, 0, 0)), ('2', (length/2.0, 0, 0)), ('label', (xy_offset[0], xy_offset[1] + thickness/2.0, 0))): a = m.newAtom(name, chimera.elements.H) r.addAtom(a) c = chimera.Coord() c.x, c.y, c.z = pos a.setCoord(c) # a.coord = c does not work a.display = 0 atoms.append(a) m.atom1, m.atom2, m.label_atom = atoms m.label_atom.color = background_color() m.label_atom.display = 1 b = m.newBond(m.atom1, m.atom2) b.display = b.Always b.drawMode = b.Stick b.radius = thickness/2.0 b.color = chimera_color(rgb) b.halfbond = 0 m.label_atom.label = label m.label_atom.labelColor = chimera_color(label_rgb) self.model = m if model_id == None: id, subid = (self.model_id(), chimera.openModels.Default) else: id, subid = model_id chimera.openModels.add([m], baseId = id, subid = subid) chimera.addModelClosedCallback(m, self.model_closed_cb) import SimpleSession SimpleSession.noAutoRestore(m) m.openState.active = False z_near, z_far = clip_plane_positions() self.set_depth(.5 * (z_near + z_far)) self.set_screen_position(self.screen_position) self.orientation_cb() return m
def restoreSession_RibbonStyleEditor(): import SimpleSession import RibbonStyleEditor userScalings = [] userXSections = [] userResidueClasses = [] residueData = [(6, 'Chimera default', 'rounded', 'unknown'), (7, 'Chimera default', 'rounded', 'unknown'), (8, 'Chimera default', 'rounded', 'unknown'), (9, 'Chimera default', 'rounded', 'unknown'), (10, 'Chimera default', 'rounded', 'unknown'), (11, 'Chimera default', 'rounded', 'unknown'), (12, 'Chimera default', 'rounded', 'unknown'), (13, 'Chimera default', 'rounded', 'unknown'), (14, 'Chimera default', 'rounded', 'unknown'), (15, 'Chimera default', 'rounded', 'unknown'), (16, 'Chimera default', 'rounded', 'unknown'), (17, 'Chimera default', 'rounded', 'unknown')] flags = RibbonStyleEditor.NucleicDefault1 SimpleSession.registerAfterModelsCB(RibbonStyleEditor.restoreState, (userScalings, userXSections, userResidueClasses, residueData, flags))
def restoreSession_RibbonStyleEditor(): import SimpleSession import RibbonStyleEditor userScalings = [('licorice', [[0.35, 0.35], [0.35, 0.35], [0.35, 0.35], [0.35, 0.35, 0.35, 0.35], [0.35, 0.35]])] userXSections = [] userResidueClasses = [] residueData = [(6, 'Chimera default', 'rounded', u'unknown'), (7, 'Chimera default', 'rounded', u'unknown'), (8, 'Chimera default', 'rounded', u'unknown'), (9, 'Chimera default', 'rounded', u'unknown'), (10, 'Chimera default', 'rounded', u'unknown'), (11, 'Chimera default', 'rounded', u'unknown')] flags = RibbonStyleEditor.NucleicDefault1 SimpleSession.registerAfterModelsCB(RibbonStyleEditor.restoreState, (userScalings, userXSections, userResidueClasses, residueData, flags))
def restoreSession_RibbonStyleEditor(): import SimpleSession import RibbonStyleEditor userScalings = [] userXSections = [] userResidueClasses = [] residueData = [] flags = RibbonStyleEditor.NucleicDefault1 SimpleSession.registerAfterModelsCB( RibbonStyleEditor.restoreState, (userScalings, userXSections, userResidueClasses, residueData, flags))
def restoreSession_RibbonStyleEditor(): import SimpleSession import RibbonStyleEditor userScalings = [] userXSections = [] userResidueClasses = [] residueData = [(13, 'Chimera default', 'rounded', 'unknown'), (14, 'Chimera default', 'rounded', 'unknown'), (15, 'Chimera default', 'rounded', 'unknown'), (16, 'Chimera default', 'rounded', 'unknown'), (17, 'Chimera default', 'rounded', 'unknown'), (18, 'Chimera default', 'rounded', 'unknown'), (19, 'Chimera default', 'rounded', 'unknown'), (20, 'Chimera default', 'rounded', 'unknown'), (21, 'Chimera default', 'rounded', 'unknown'), (22, 'Chimera default', 'rounded', 'unknown'), (23, 'Chimera default', 'rounded', 'unknown'), (24, 'Chimera default', 'rounded', 'unknown'), (25, 'Chimera default', 'rounded', 'unknown'), (26, 'Chimera default', 'rounded', 'unknown'), (27, 'Chimera default', 'rounded', 'unknown'), (28, 'Chimera default', 'rounded', 'unknown'), (29, 'Chimera default', 'rounded', 'unknown'), (30, 'Chimera default', 'rounded', 'unknown'), (31, 'Chimera default', 'rounded', 'unknown'), (32, 'Chimera default', 'rounded', 'unknown'), (33, 'Chimera default', 'rounded', 'unknown'), (34, 'Chimera default', 'rounded', 'unknown'), (35, 'Chimera default', 'rounded', 'unknown'), (36, 'Chimera default', 'rounded', 'unknown'), (37, 'Chimera default', 'rounded', 'unknown'), (38, 'Chimera default', 'rounded', 'unknown')] flags = RibbonStyleEditor.NucleicDefault1 SimpleSession.registerAfterModelsCB(RibbonStyleEditor.restoreState, (userScalings, userXSections, userResidueClasses, residueData, flags))
def restoreSession_RibbonStyleEditor(): import SimpleSession import RibbonStyleEditor userScalings = [] userXSections = [] userResidueClasses = [] residueData = [(2, 'Chimera default', 'rounded', u'unknown'), (3, 'Chimera default', 'rounded', u'unknown')] flags = RibbonStyleEditor.NucleicDefault1 SimpleSession.registerAfterModelsCB( RibbonStyleEditor.restoreState, (userScalings, userXSections, userResidueClasses, residueData, flags))
def restoreSession_RibbonStyleEditor(): import SimpleSession import RibbonStyleEditor userScalings = [('licorice', [[0.35, 0.35], [0.35, 0.35], [0.35, 0.35], [0.35, 0.35, 0.35, 0.35], [0.35, 0.35]])] userXSections = [] userResidueClasses = [] residueData = [(1, 'licorice', 'rounded', u'amino acid'), (2, 'licorice', 'rounded', u'amino acid'), (3, 'licorice', 'rounded', u'amino acid'), (4, 'licorice', 'rounded', u'amino acid'), (5, 'licorice', 'rounded', u'amino acid'), (6, 'licorice', 'rounded', u'amino acid'), (7, 'licorice', 'rounded', u'amino acid'), (8, 'licorice', 'rounded', u'amino acid'), (9, 'licorice', 'rounded', u'amino acid'), (10, 'licorice', 'rounded', u'amino acid'), (11, 'licorice', 'rounded', u'amino acid'), (12, 'licorice', 'rounded', u'amino acid'), (13, 'licorice', 'rounded', u'amino acid'), (14, 'licorice', 'rounded', u'amino acid'), (15, 'licorice', 'rounded', u'amino acid'), (16, 'licorice', 'rounded', u'amino acid'), (17, 'licorice', 'rounded', u'amino acid'), (18, 'licorice', 'rounded', u'amino acid'), (19, 'licorice', 'rounded', u'amino acid'), (20, 'licorice', 'rounded', u'amino acid'), (21, 'licorice', 'rounded', u'amino acid'), (22, 'licorice', 'rounded', u'amino acid'), (23, 'licorice', 'rounded', u'amino acid'), (24, 'licorice', 'rounded', u'amino acid'), (25, 'licorice', 'rounded', u'amino acid'), (26, 'licorice', 'rounded', u'amino acid'), (27, 'licorice', 'rounded', u'amino acid'), (28, 'licorice', 'rounded', u'amino acid'), (29, 'licorice', 'rounded', u'amino acid'), (30, 'licorice', 'rounded', u'amino acid'), (31, 'licorice', 'rounded', u'amino acid'), (32, 'licorice', 'rounded', u'amino acid'), (33, 'licorice', 'rounded', u'amino acid'), (34, 'licorice', 'rounded', u'amino acid'), (35, 'licorice', 'rounded', u'amino acid'), (36, 'licorice', 'rounded', u'amino acid'), (37, 'licorice', 'rounded', u'amino acid'), (38, 'licorice', 'rounded', u'amino acid'), (39, 'licorice', 'rounded', u'amino acid'), (40, 'licorice', 'rounded', u'amino acid'), (41, 'licorice', 'rounded', u'unknown')] flags = RibbonStyleEditor.NucleicDefault1 SimpleSession.registerAfterModelsCB( RibbonStyleEditor.restoreState, (userScalings, userXSections, userResidueClasses, residueData, flags))
def restoreSession_RibbonStyleEditor(): import RibbonStyleEditor import SimpleSession userScalings = [] userXSections = [] userResidueClasses = [] residueData = [ (1, "Chimera default", "rounded", u"unknown"), (2, "Chimera default", "rounded", u"unknown"), ] flags = RibbonStyleEditor.NucleicDefault1 SimpleSession.registerAfterModelsCB( RibbonStyleEditor.restoreState, (userScalings, userXSections, userResidueClasses, residueData, flags), )
def restoreState(mdata, sdata={}): for name, info in sdata.items(): addStyle(name, info) for mid in mdata: m = SimpleSession.idLookup(mid) md = _molDict(m) smd = mdata[mid] for k in smd: if k.endswith('params'): md[k] = smd[k] rds = md[RESIDUES] srds = smd[RESIDUES] for rid in srds: r = SimpleSession.idLookup(rid) rd = rds[r] = srds[rid] rd[SUGAR] = [] rd[BASE] = [] _needRebuild[m] = None
def restoreSession_RibbonStyleEditor(): import SimpleSession import RibbonStyleEditor userScalings = [] userXSections = [] userResidueClasses = [] residueData = [ (3, "Chimera default", "rounded", "unknown"), (4, "Chimera default", "rounded", "unknown"), (5, "Chimera default", "rounded", "unknown"), (6, "Chimera default", "rounded", "unknown"), (7, "Chimera default", "rounded", "unknown"), (8, "Chimera default", "rounded", "unknown"), ] flags = RibbonStyleEditor.NucleicDefault1 SimpleSession.registerAfterModelsCB( RibbonStyleEditor.restoreState, (userScalings, userXSections, userResidueClasses, residueData, flags) )
def _sessionCB(self, trigger, myData, sesFile): import SimpleSession if self.reference: if isinstance(self.reference, StructureSequence): mid = None ss = self.reference.saveInfo() elif isinstance(self.reference, Molecule): mid = SimpleSession.sessionID(self.reference) ss = None else: mid = None ss = None else: mid = None ss = None if self.parser: parserData = self.parser.sessionData() else: parserData = None if self.service: serviceData = self.service.sessionData() else: serviceData = None data = (3, # version mid, # molecule ss, # StructureSeq self.sequence, # input seq self.program, # program self.basename, # name self.showOne, # one hit per PDB parserData, # parser serviceData, # service self.blastTable.getRestoreInfo()) # GUI print >> sesFile, """ try: from blastpdb.gui import sessionRestore sessionRestore(%s) except: reportRestoreError("Error restoring Blast dialog") """ % SimpleSession.sesRepr(data)
def save_session(trigger, closure, file): """convert data to session data""" if not _data: return # molecular data mdata = {} for m in _data: md = _data[m] mid = SimpleSession.sessionID(m) smd = mdata[mid] = {} for k in md: if k.endswith('params'): smd[k] = md[k] rds = md[RESIDUES] srds = smd[RESIDUES] = {} for r in rds: rid = SimpleSession.sessionID(r) rd = rds[r] srd = srds[rid] = {} for k in rd: if k.endswith('params'): srd[k] = rd[k] srd['side'] = rd['side'] # save restoring code in session restoring_code = ( """ def restoreNucleotides(): import NucleicAcids as NA NA.restoreState(%s, %s) try: restoreNucleotides() except: reportRestoreError('Error restoring Nucleotides') """) file.write(restoring_code % ( SimpleSession.sesRepr(mdata), SimpleSession.sesRepr(userStyles) ))
def restoreAnimation(): "A method to unpickle and restore animation objects" # Scenes must be unpickled after restoring transitions, because each # scene links to a 'scene' transition. Likewise, keyframes must be # unpickled after restoring scenes, because each keyframe links to a scene. # The unpickle process is left to the restore* functions, it's # important that it doesn't happen prior to calling those functions. import SimpleSession from Animate.Session import restoreKeyframes, restoreScenes, restoreTransitions SimpleSession.registerAfterModelsCB(restoreTransitions, trPickle) SimpleSession.registerAfterModelsCB(restoreScenes, scPickle) SimpleSession.registerAfterModelsCB(restoreKeyframes, kfPickle)
def restoreState(args): if len(args) == 4: userScalings, userXSections, userResidueClasses, residueData = args flags = 0 else: userScalings, userXSections, userResidueClasses, residueData, flags = args import scaling, xsection, atoms import chimera, SimpleSession for m in chimera.openModels.list(modelTypes=[chimera.Molecule]): m.updateRibbonData() scData = scaling.sessionRestoreUsed(userScalings) xsData = xsection.sessionRestoreUsed(userXSections) rcData = atoms.sessionRestoreUsed(userResidueClasses) for rId, sc, xs, rc in residueData: r = SimpleSession.idLookup(rId) atoms.sessionRestoreResidue(r, rc, rcData, flags) scaling.sessionRestoreResidue(r, sc, scData) xsection.sessionRestoreResidue(r, xs, xsData)
def restoreAnimation(): 'A method to unpickle and restore animation objects' # Scenes must be unpickled after restoring transitions, because each # scene links to a 'scene' transition. Likewise, keyframes must be # unpickled after restoring scenes, because each keyframe links to a scene. # The unpickle process is left to the restore* functions, it's # important that it doesn't happen prior to calling those functions. import SimpleSession from Animate.Session import restoreTransitions from Animate.Session import restoreScenes from Animate.Session import restoreKeyframes SimpleSession.registerAfterModelsCB(restoreTransitions, trPickle) SimpleSession.registerAfterModelsCB(restoreScenes, scPickle) SimpleSession.registerAfterModelsCB(restoreKeyframes, kfPickle)
for name, fpos in formattedPositions.items(): positions[name] = deformatPosition(fpos) import Midas if modelOffset == 0: Midas.positions.clear() Midas.positions.update(positions) positionStack = [] Midas._positionStack = map(deformatPosition, positionStack) def delayedMidasBase(): try: restoreMidasBase() except: reportRestoreError('Error restoring Midas base state') import SimpleSession SimpleSession.registerAfterModelsCB(delayedMidasBase) try: import StructMeasure from StructMeasure.DistMonitor import restoreDistances registerAfterModelsCB(restoreDistances, 1) except: reportRestoreError("Error restoring distances in session") def restoreRemainder(): from SimpleSession.versions.v45 import restoreWindowSize, \ restoreOpenStates, restoreSelections, restoreFontInfo, \ restoreOpenModelsAttrs, restoreModelClip
except: reportRestoreError("Error restoring color key") def restore2DLabelDialog(info): from chimera.dialogs import find from Ilabel.gui import IlabelDialog dlg = find(IlabelDialog.name) if dlg is not None: dlg.destroy() dlg = find(IlabelDialog.name, create=True) dlg._restoreSession(info) import SimpleSession SimpleSession.registerAfterModelsCB(restore2DLabelDialog, {'mouse func': 'labeling', 'sel ranges': (), 'dialog shown': 1}) def restoreRemainder(): from SimpleSession.versions.v65 import restoreWindowSize, \ restoreOpenStates, restoreSelections, restoreFontInfo, \ restoreOpenModelsAttrs, restoreModelClip, restoreSilhouettes curSelIds = [] savedSels = [] openModelsAttrs = { 'cofrMethod': 2 } windowSize = (1024, 781) xformMap = {0: (((-0.34821455627968, 0.82726846257295, 0.44087811652103), 9.9995089373332), (0.0076537672682732, 0.0083331466146478, -0.0095913043915013), False), 1: (((-0.99040907112338, 0.13815836179107, 0.0014624991412663), 109.62935189875), (8.9189222591104, -0.045770457294621, -0.032931556893357), False), 2: (((-0.20080631594196, -0.92498261478313, 0.32262049815036), 18.985788096111), (17.497129733092, -0.68455407611151, -0.47980035902674), False), 3: (((0.99205523056863, 0.020289399059421, -0.12415619109504), 170.88474103051), (-0.1169711633136, -8.6869766220186, 0.11207397706245), True), 4: (((0.23529125830917, 0.94204993508282, 0.23912328112031), 96.859237242746), (8.9195514371968, -9.2219927891895, -0.28512231169757), False), 5: (((0.73008849334292, 0.68289739957367, 0.024938595465521), 170.41609346508), (18.067194686271, -9.1650094893277, -1.4626137937459), False)} fontInfo = {'face': (u'Sans Serif', 'Bold', 12)} clipPlaneInfo = {}
def _rebuild(triggerName, closure, changes): """'monitor changes' trigger handler""" global _rebuilding if _block or not _needRebuild or _rebuilding: return _rebuilding = True for mol in _needRebuild: md = _molDict(mol) try: if md[VRML]: v = md[VRML] md[VRML] = None chimera.openModels.close(v) except (KeyError, chimera.error): # Either there's no previous VRML # model to close or it has already # been closed. pass # figure out which residues are of which type because # ladder needs knowledge about the whole molecule rds = md[RESIDUES] sides = {} for k in SideOptions: sides[k] = [] for r in rds.keys(): if r.__destroyed__: # Sometimes the residues are gone, # but there's a still reference to them. del rds[r] continue sides[rds[r]['side']].append(r) if not rds: # no residues to track in molecule v = md[VRML] if v: chimera.openModels.close(v) del _data[mol] continue allResidues = set(rds.keys()) # make new VRML nodes hideSugars = set() hideBases = set() residues = sides['ladder'] if not residues: md.pop('ladder params', None) else: # redo all ladder nodes hideSugars.update(residues) hideBases.update(residues) make_ladder(mol, residues, rds, **md['ladder params']) residues = sides['fill/slab'] if residues: hideBases.update(make_slab(mol, residues, rds)) residues = sides['tube/slab'] if residues: hideSugars.update(residues) make_tube(mol, residues, rds) hideBases.update(make_slab(mol, residues, rds)) residues = sides['orient'] if residues: make_orient(mol, residues, rds) # make sure sugar/base atoms are hidden/shown showSugars = allResidues - hideSugars showBases = allResidues - hideBases showResidues = showSugars - hideBases showSugars.difference_update(showResidues) showBases.difference_update(showResidues) setHideAtoms(False, AlwaysRE, NeverRE, showResidues) setHideAtoms(False, BackboneSugarRE, NeverRE, showSugars) nonRibbonSugars = [r for r in hideSugars if not r.ribbonDisplay or not r.hasRibbon()] setHideAtoms(False, BackboneRE, NeverRE, nonRibbonSugars) setHideAtoms(False, BaseAtomsRE, BaseExceptRE, showBases) # open VRML model nodes = sum((rds[r][SUGAR] + rds[r][BASE] for r in rds), []) if nodes: vrml = nodesToVRML(nodes) vList = chimera.openModels.open(vrml, type='VRML', sameAs=mol, hidden=True, identifyAs='%s - Nucleotides' % mol.name) assert(len(vList) == 1) v = vList[0] mol.addAssociatedModel(v) md[VRML] = v SimpleSession.noAutoRestore(v) _needRebuild.clear() # Since changing hide bits doesn't cause a rebuilding # of the molecule's display list, rebuild them all! chimera.viewer.invalidateCache() _rebuilding = False