def restore_state(self, model): model.name = self.name model.display = self.display model.openState.xform = self.xform.create_object() model.openState.active = self.active # # Record how model id number has been remapped. # if self.version >= 2: import SimpleSession if hasattr(SimpleSession, 'modelMap'): mid = (self.id, self.subid) SimpleSession.modelMap.setdefault(mid, []).append(model) else: from SimpleSession import updateOSLmap updateOSLmap(self.osl_identifier, model.oslIdent()) if self.version >= 3: p = model.clipPlane import chimera p.origin = chimera.Point(*self.clip_plane_origin) n = chimera.Vector(*self.clip_plane_normal) if n.length == 0: n = chimera.Vector(0, 0, -1) p.normal = n model.clipPlane = p model.clipThickness = self.clip_thickness model.useClipPlane = self.use_clip_plane if self.version >= 4: model.useClipThickness = self.use_clip_thickness
def AddAxes ( rad, lX, lY, lZ, cF, mol ) : pos = chimera.Vector(0,0,0) mol = AddArrow2 ( pos, chimera.Vector(1,0,0), lX, (cF,0,0,1), rad, mol ) mol = AddArrow2 ( pos, chimera.Vector(0,1,0), lY, (0,cF,0,1), rad, mol ) mol = AddArrow2 ( pos, chimera.Vector(0,0,1), lZ, (0,0,cF,1), rad, mol ) mol.name = "XYZ (RGB) Axes" return mol
def AxesModOffset ( COM=[0,0,0], U=None, Extents=[30,30,30], rad=1.0, f=1.0, alignTo = None ) : import _surface mol = _surface.SurfaceModel() chimera.openModels.add([mol], sameAs = alignTo) pos = chimera.Vector(0,0,0) axes = AddArrow2 ( pos, chimera.Vector(0,1,0), lY, (cF,.3,.3,1), rad, mol ) axes.name = "Riboarrow" if U != None : R = numpy.array([ [ U[0,0], U[0,1], U[0,2], 0.0 ], [ U[1,0], U[1,1], U[1,2], 0.0 ], [ U[2,0], U[2,1], U[2,2], 0.0 ] ] ) T = numpy.array([ [ 1.0, 0.0, 0.0, COM[0] ], [ 0.0, 1.0, 0.0, COM[1] ], [ 0.0, 0.0, 1.0, COM[2] ] ] ) Ti = numpy.array([ [ 1.0, 0.0, 0.0, Extents[0]*0.7 ], [ 0.0, 1.0, 0.0, -Extents[1]/2.0 ], [ 0.0, 0.0, 1.0, -Extents[0]*0.7 ] ] ) import Matrix M = Matrix.multiply_matrices ( R, Ti ) M = Matrix.multiply_matrices ( T, M ) ps = [] for p in axes.surfacePieces : v, t = numpy.copy(p.geometry[0]), numpy.copy(p.geometry[1]) ps.append ( [v,t,p.color] ) axes.removePiece ( p ) import _contour for p in ps : _contour.affine_transform_vertices( p[0], M ) axes.addPiece ( p[0], p[1], p[2] ) from random import random as rand clr = ( rand()*.7, rand()*.7, rand()*.7, 1.0 ) # for p in axes.surfacePieces : p.color = clr #for g in axes.surfacePieces : # g.initial_v = numpy.copy ( g.geometry[0] ) return axes
def AxesMod1 ( COM=[0,0,0], U=None, length=10.0, exfac=10.0, rad=1.0, alignTo = None, axes=None ) : import _surface toaxes = axes if toaxes == None : toaxes = _surface.SurfaceModel() chimera.openModels.add([toaxes], sameAs = alignTo) toaxes.name = "Axes" #axes = AddAxes ( rad, Extents[0]*f, Extents[1]*f, Extents[2]*f, 1.0, mol ) pos = chimera.Vector(0,0,0) #mol = AddArrow2 ( pos, chimera.Vector(1,0,0), lX, (cF,0,0,1), rad, mol ) #mol = AddArrow2 ( pos, chimera.Vector(0,1,0), lY, (0,cF,0,1), rad, mol ) naxes = AddArrow3 ( pos, chimera.Vector(0,0,1), length, (0,0,1,1), rad, _surface.SurfaceModel() ) if U != None : S = numpy.array([ [ 1.0, 0.0, 0.0, 0 ], [ 0.0, 1.0, 0.0, 0 ], [ 0.0, 0.0, 2.0, 0 ] ] ) P = numpy.array([ [ 1.0, 0.0, 0.0, 0 ], [ 0.0, 1.0, 0.0, 0 ], [ 0.0, 0.0, 1.0, -length ] ] ) R = numpy.array([ [ U[0,0], U[0,1], U[0,2], 0.0 ], [ U[1,0], U[1,1], U[1,2], 0.0 ], [ U[2,0], U[2,1], U[2,2], 0.0 ] ] ) T = numpy.array([ [ 1.0, 0.0, 0.0, COM[0] ], [ 0.0, 1.0, 0.0, COM[1] ], [ 0.0, 0.0, 1.0, COM[2] ] ] ) import Matrix M = Matrix.multiply_matrices ( T, R ) M = Matrix.multiply_matrices ( M, P ) M = Matrix.multiply_matrices ( M, S ) import _contour for p in naxes.surfacePieces : v, t = numpy.copy(p.geometry[0]), numpy.copy(p.geometry[1]) _contour.affine_transform_vertices( v, M ) toaxes.addPiece ( v,t,p.color ) return toaxes
def matchPositions(fixedPositions, movablePositions): m = Match(fixedPositions, movablePositions) mat = m.matrix() rot = chimera.Xform.xform(mat[0, 0], mat[0, 1], mat[0, 2], 0, mat[1, 0], mat[1, 1], mat[1, 2], 0, mat[2, 0], mat[2, 1], mat[2, 2], 0, True) fC = m.center(fixedPositions) fT = chimera.Xform.translation(chimera.Vector(fC[0], fC[1], fC[2])) mC = m.center(movablePositions) mT = chimera.Xform.translation(chimera.Vector(-mC[0], -mC[1], -mC[2])) xform = chimera.Xform() xform.multiply(fT) xform.multiply(rot) xform.multiply(mT) return xform, m.rms
def transform_square(xform, center): axis, angle_deg = xform.getRotation() trans = xform.getTranslation() t1 = trans - axis * (trans * axis) import chimera t2 = chimera.cross(axis, t1) from math import pi, sin, cos angle = angle_deg * pi / 180 sa, ca = sin(angle), cos(angle) if 1 - ca == 0: return None # No rotation axis_offset = t1 * .5 + t2 * (.5 * sa / (1 - ca)) c = chimera.Vector(center[0], center[1], center[2]) cd = c - axis_offset sq1 = cd - axis * (cd * axis) sq2 = axis * sq1.length e = 2 # Factor for enlarging square dz = chimera.cross(axis, sq1) * .05 # Thickness vector corners = [ p.data() for p in ( c - sq1 - sq2 * e - dz, c - sq1 + sq2 * e - dz, c + sq1 * e + sq2 * e - dz, c + sq1 * e - sq2 * e - dz, c - sq1 - sq2 * e + dz, c - sq1 + sq2 * e + dz, c + sq1 * e + sq2 * e + dz, c + sq1 * e - sq2 * e + dz, ) ] return corners
def rotate(molecule, at, alpha): if len(at) == 3: try: a1, a2, a3 = [a.coord() for a in at] except AttributeError: a1, a2, a3 = at axis_a = a1 - a2 axis_b = a3 - a2 delta = chimera.angle(a1, a2, a3) - alpha axis = chimera.cross(axis_a, axis_b) if axis.data() == (0.0, 0.0, 0.0): axis = chimera.cross(axis_a, axis_b + chimera.Vector(1, 0, 0)) logger.warning("Had to choose arbitrary normal vector") pivot = a2 elif len(at) == 4: try: a1, a2, a3, a4 = [a.coord() for a in at] except AttributeError: a1, a2, a3, a4 = at axis = a3 - a2 delta = chimera.dihedral(a1, a2, a3, a4) - alpha pivot = a3 else: raise ValueError( "Atom list must contain 3 (angle) or 4 (dihedral) atoms only") r = X.translation(pivot - ZERO) # move to origin r.multiply(X.rotation(axis, -delta)) # rotate r.multiply(X.translation(ZERO - pivot)) # return to orig pos for a in molecule.atoms: a.setCoord(r.apply(a.coord()))
def interpolateCorkscrew(xf, c0, c1, f): """Interpolate by splitting the transformation into a rotation and a translation along the axis of rotation.""" import chimera, math dc = c1 - c0 vr, a = xf.getRotation() # a is in degrees tra = dc * vr # magnitude of translation # along rotation axis vt = dc - tra * vr # where c1 would end up if # only rotation is used cm = c0 + vt / 2 v0 = chimera.cross(vr, vt) if v0.sqlength() <= 0.0: ident = chimera.Xform.identity() return ident, ident v0.normalize() if a != 0.0: l = vt.length / 2 / math.tan(math.radians(a / 2)) cr = (cm + v0 * l).toVector() else: cr = chimera.Vector(0.0, 0.0, 0.0) Tinv = chimera.Xform.translation(-cr) R0 = chimera.Xform.rotation(vr, a * f) R1 = chimera.Xform.rotation(vr, -a * (1 - f)) X0 = chimera.Xform.translation(cr + vr * (f * tra)) X0.multiply(R0) X0.multiply(Tinv) X1 = chimera.Xform.translation(cr - vr * ((1 - f) * tra)) X1.multiply(R1) X1.multiply(Tinv) return X0, X1
def prAxes ( points ) : com = numpy.sum(points, axis=0) / len(points) C = chimera.Vector ( com[0], com[1], com[2] ) comv = numpy.ones_like ( points ) * com points = points - comv i = numpy.matrix ( [[1,0,0], [0,1,0], [0,0,1]] ) ii = i * numpy.sum ( numpy.multiply ( points, points ) ) p_t = numpy.transpose(points) td = numpy.tensordot ( points, p_t, axes=[0,1] ) I0 = ii - td try : U, S, V = numpy.linalg.svd( I0 ) except : print "- error computing SVD - prob. singular matrix" return [] #U[0,0] = U[0,0] * -1.0 #U[1,0] = U[1,0] * -1.0 #U[2,0] = U[2,0] * -1.0 #U[0,2] = U[0,2] * -1.0 #U[1,2] = U[1,2] * -1.0 #U[2,2] = U[2,2] * -1.0 return [C, U, S, V]
def _setLightFromParams(self, params, activeName, saveName): import chimera active, diff, diffScale, spec, specScale, dir = params light = self._setActiveLight(active, activeName, saveName) light.diffuse = chimera.MaterialColor(*diff) light.diffuseScale = diffScale light.specular = chimera.MaterialColor(*spec) light.specularScale = specScale light.direction = chimera.Vector(*dir)
def _makeLight(self): import chimera light = chimera.DirectionalLight() light.diffuse = self.diffuse.get() light.diffuseScale = self.diffuseScale.get() light.specular = self.specular.get() light.specularScale = self.specularScale.get() light.direction = chimera.Vector(0.25, 0.25, 1) return light
def restoreModelClip(clipInfo): for modelID, info in clipInfo.items(): model = idLookup(modelID) originData, normalData = info cp = model.clipPlane cp.origin = chimera.Point(*originData) cp.normal = chimera.Vector(*normalData) model.clipPlane = cp model.useClipPlane = True
def translate_perpendicular_to_axis(axis, screen_xy, last_screen_xy): psize = pixel_size() d = chimera.Vector((screen_xy[0] - last_screen_xy[0]) * psize, -(screen_xy[1] - last_screen_xy[1]) * psize, 0) a = apply(chimera.Vector, axis) a.normalize() t = d - a * (a*d) xf = chimera.Xform.translation(t) move_active_models(xf)
def translate(x, y, z, molecule): ''' from chimera import runCommand as rc rc('rmsd #0 #1') m=chimera.openModels.list()[0] xf = chimera.Xform.translation(chimera.Vector(10,0,0)) m.openState.globalXform(xf) import io f=io.open('/Users/wyf/Desktop/sbw/version_manager/auto_fit_902/tt.dat','w',encoding='utf-8') old = sys.stdout sys.stdout=f :param x: :param y: :param z: :param molecule: :return: ''' xf = chimera.Xform.translation(chimera.Vector(x, y, z)) molecule.openState.globalXform(xf)
def slerp(p, q, t): cs = p.dot(q) angle = numpy.arccos(cs) if abs(angle) > 0.0: sn = numpy.sin(angle) invSn = 1.0 / sn tAngle = t * angle c0 = numpy.sin(angle - tAngle) * invSn c1 = numpy.sin(tAngle) * invSn #mTuple[0] = coeff0*p.mTuple[0] + coeff1*q.mTuple[0]; #mTuple[1] = coeff0*p.mTuple[1] + coeff1*q.mTuple[1]; #mTuple[2] = coeff0*p.mTuple[2] + coeff1*q.mTuple[2]; #mTuple[3] = coeff0*p.mTuple[3] + coeff1*q.mTuple[3]; return Quaternion(p.s * c0 + q.s * c1, p.v * c0 + q.v * c1) else: return Quaternion(p.s, chimera.Vector(p.v[0], p.v[1], p.v[2]))
def AlignXf ( pos, v ) : Z = v Z.normalize() from random import random as rand dZ = chimera.Vector( rand(), rand(), rand() ) dZ.normalize() X = chimera.cross ( Z, dZ ) X.normalize () Y = chimera.cross ( Z, X ) Y.normalize () xf = chimera.Xform.xform ( X.x, Y.x, Z.x, pos[0], X.y, Y.y, Z.y, pos[1], X.z, Y.z, Z.z, pos[2] ) #xf3 = chimera.Xform.xform ( # d, 0, 0, 0, # 0, d, 0, 0, # 0, 0, d, 0 ) #print xf3 return xf
def _planeTrans(self, viewer, event): clipModel = getClipModel() if not clipModel: return p = clipModel.clipPlane dx, dy = viewer.delta(event.x, event.y, event.state % 2 == 1) axis, angle = clipModel.openState.xform.getRotation() mxf = chimera.Xform.rotation(axis, angle) n = mxf.apply(p.normal) # figure out major axis of normal in lab space if abs(n.x) >= abs(n.y): axis = (0, 1) else: axis = (1, 0) # reassign normal so there are no zeros # in mouse adjustment calculation def fuzzySign(x): if x < -1e-6: return -1 if x > 1e-6: return 1 return 0 n = [fuzzySign(n.x), fuzzySign(n.y), fuzzySign(n.z)] if n[axis[0]] == 0: # should never happen with non-zero normal n[axis[0]] = 1 if n[axis[1]] == 0: n[axis[1]] = n[axis[0]] # mimic major axis n = chimera.Vector(*n) adjust = n.x * dx + n.y * dy distance = 2 * viewer.camera.extent * adjust p.moveOrigin(distance) clipModel.clipPlane = p
def _chooseInterface(self, value=None): if value is None: value = self.interfaceVar.get() if value == self.Interface_LightsAdvanced: try: from _LightViewer import LightViewer self.viewer.mode = LightViewer.Advanced except ImportError: pass self.simpleFrame.pack_forget() self.shininessFrame.pack_forget() self.advancedFrame.pack() self._updateLight() elif value == self.Interface_LightsBasic: try: from _LightViewer import LightViewer self.viewer.mode = LightViewer.Simple except ImportError: pass self.advancedFrame.pack_forget() self.shininessFrame.pack_forget() self.simpleFrame.pack() keyLight = self.lensViewer.keyLight if not keyLight and self.saveKey: # bring back original in simple interface keyLight = self.saveKey self.lensViewer.keyLight = keyLight self.saveKey = None if not keyLight: import chimera keyLight = chimera.DirectionalLight() keyLight.diffuse = keyLight.specular \ = self.diffuse.get() keyLight.diffuseScale = self.diffuseScale.get() keyLight.specularScale = 1 # use default from chimera module from math import sin, cos, radians angle = radians(45) keyLight.direction = chimera.Vector(-sin(angle / 2), sin(angle), cos(angle)) self.lensViewer.keyLight = keyLight fillLight = self.lensViewer.fillLight if not fillLight and self.saveFill: # bring back original in simple interface fillLight = self.saveFill self.lensViewer.fillLight = fillLight self.saveFill = None if not fillLight: import chimera fillLight = chimera.DirectionalLight() fillLight.diffuse = keyLight.specular \ = self.diffuse.get() fillLight.diffuseScale = self.diffuseScale.get() fillLight.specularScale = 0 # use default from chimera module from math import sin, cos, radians angle = radians(15) fillLight.direction = chimera.Vector(sin(angle), sin(angle), cos(angle)) self.lensViewer.fillLight = fillLight brightness, contrast = self._calculateBrightnessContrast() self.brightness.set_value(brightness) self.contrast.set_value(contrast) if not self.light: # update in case user goes to Advanced version if self.whichLight.getvalue() == "key light": self.light = self.lensViewer.keyLight else: self.light = self.lensViewer.fillLight elif value == self.Interface_Shininess: try: from _LightViewer import LightViewer self.viewer.mode = LightViewer.Shininess except ImportError: pass self.advancedFrame.pack_forget() self.simpleFrame.pack_forget() self.shininessFrame.pack()
def __init__(self, s=1.0, v=chimera.Vector(0, 0, 0)): self.s = s self.v = v
def restoreCoreModels(): from SimpleSession.versions.v65 import init, restoreViewer, \ restoreMolecules, restoreColors, restoreSurfaces, \ restoreVRML, restorePseudoBondGroups, restoreModelAssociations molInfo = cPickle.loads(base64.b64decode('gAJ9cQEoVRFyaWJib25JbnNpZGVDb2xvcnECSwZOfYdVCWJhbGxTY2FsZXEDSwZHP8mZmaAAAAB9h1UJcG9pbnRTaXplcQRLBkc/8AAAAAAAAH2HVQVjb2xvcnEFSwZLAH1xBihLAV1xB0sBYUsCXXEISwJhSwNdcQlLA2FLBF1xCksEYUsFXXELSwVhdYdVCnJpYmJvblR5cGVxDEsGSwB9h1UKc3RpY2tTY2FsZXENSwZHP+AAAAAAAAB9h1UMbW1DSUZIZWFkZXJzcQ5dcQ8oTk5OTk5OZVUMYXJvbWF0aWNNb2RlcRBLBksBfYdVCnZkd0RlbnNpdHlxEUsGR0AUAAAAAAAAfYdVBmhpZGRlbnESSwaJfYdVDWFyb21hdGljQ29sb3JxE0sGTn2HVQ9yaWJib25TbW9vdGhpbmdxFEsGSwB9h1UJYXV0b2NoYWlucRVLBoh9h1UKcGRiVmVyc2lvbnEWSwZLAH2HVQhvcHRpb25hbHEXfXEYVQhvcGVuZWRBc3EZiIlLBihVMS9Vc2Vycy90ZW1lbHNvYi9Eb3dubG9hZHMvY29vcmRzL1MyLUExLURNQTEtMS54eXpxGk5OSwF0cRt9cRwoKFUqL1VzZXJzL3RlbWVsc29iL0Rvd25sb2Fkcy9jb29yZHMvMy1JLWQueHl6cR1OTksBdHEeXXEfSwJhKFUrL1VzZXJzL3RlbWVsc29iL0Rvd25sb2Fkcy9jb29yZHMvQTFXMy0xLnh5enEgTk5LAXRxIV1xIksEYShVMS9Vc2Vycy90ZW1lbHNvYi9Eb3dubG9hZHMvY29vcmRzL3dhdGVyLTYtQkstMS54eXpxI05OSwF0cSRdcSVLAGEoVTovVXNlcnMvdGVtZWxzb2IvRG93bmxvYWRzL2Nvb3Jkcy9jb3JhbnV1bGVuZV93YXRlci1vdXQueHl6cSZOTksBdHEnXXEoSwVhKFUrL1VzZXJzL3RlbWVsc29iL0Rvd25sb2Fkcy9jb29yZHMvMV8yLUExLnh5enEpTk5LAXRxKl1xK0sBYXWHh3NVD2xvd2VyQ2FzZUNoYWluc3EsSwaJfYdVCWxpbmVXaWR0aHEtSwZHP/AAAAAAAAB9h1UPcmVzaWR1ZUxhYmVsUG9zcS5LBksAfYdVBG5hbWVxL0sGWEsAAABTMlczLUlfZCBFW1JJLU1QMi9hVltEVFFdWi8vTVAyLzYtMzErRypdIC0xNjI3LjAwMTMgLTEsNjI3LjkxNjEgLTEsNjI4LjIxNzZ9cTAoWAYAAAA2LUJLLTFdcTFLAGFYIAAAAEFjZW5hcGh0aGVuZS0oSDJPKTMgSXNvbWVyIGVmcC0zXXEySwRhWDcAAAAxXzItQTEgRVtSSS1NUDIvYVZbRFRRXVpdCS04NTEuNjI3NAktODUyLjExMzUJLTg1Mi4yNzQ3XXEzSwFhWCEAAABwcmluY2lwYWwgbW9tZW50IGFsaWduZWQgZ2VvbWV0cnldcTRLBWFYSwAAAFMyLUExLURNQTFfRUZQLUQtMzAtcHc5MSAGBkVlPTAuMzEga2MvbSAGBkUwPTAuMjcga2MvbSAGBkcoMjk4Syk9IDAuMTkga2MvbV1xNUsDYXWHVQ9hcm9tYXRpY0Rpc3BsYXlxNksGiX2HVQ9yaWJib25TdGlmZm5lc3NxN0sGRz/pmZmZmZmafYdVCnBkYkhlYWRlcnNxOF1xOSh9cTp9cTt9cTx9cT19cT59cT9lVQNpZHNxQEsGSwBLAIZ9cUEoSwNLAIZdcUJLA2FLAksAhl1xQ0sCYUsFSwCGXXFESwVhSwFLAIZdcUVLAWFLBEsAhl1xRksEYXWHVQ5zdXJmYWNlT3BhY2l0eXFHSwZHv/AAAAAAAAB9h1UQYXJvbWF0aWNMaW5lVHlwZXFISwZLAn2HVRRyaWJib25IaWRlc01haW5jaGFpbnFJSwaIfYdVB2Rpc3BsYXlxSksGiH2HdS4=')) resInfo = cPickle.loads(base64.b64decode('gAJ9cQEoVQZpbnNlcnRxAksGVQEgfYdVC2ZpbGxEaXNwbGF5cQNLBol9h1UEbmFtZXEESwZYAwAAAFVOS32HVQVjaGFpbnEFSwZYAQAAACB9h1UOcmliYm9uRHJhd01vZGVxBksGSwJ9h1UCc3NxB0sGiYmGfYdVCG1vbGVjdWxlcQhLBksAfXEJKEsBTl1xCksBSwGGcQthhksCTl1xDEsCSwGGcQ1hhksDTl1xDksDSwGGcQ9hhksETl1xEEsESwGGcRFhhksFTl1xEksFSwGGcRNhhnWHVQtyaWJib25Db2xvcnEUSwZOfYdVBWxhYmVscRVLBlgAAAAAfYdVCmxhYmVsQ29sb3JxFksGTn2HVQhmaWxsTW9kZXEXSwZLAX2HVQVpc0hldHEYSwaJfYdVC2xhYmVsT2Zmc2V0cRlLBk59h1UIcG9zaXRpb25xGl1xGyhLAUsBhnEcSwFLAYZxHUsBSwGGcR5LAUsBhnEfSwFLAYZxIEsBSwGGcSFlVQ1yaWJib25EaXNwbGF5cSJLBol9h1UIb3B0aW9uYWxxI31VBHNzSWRxJEsGSv////99h3Uu')) atomInfo = cPickle.loads(base64.b64decode('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')) bondInfo = cPickle.loads(base64.b64decode('gAJ9cQEoVQVjb2xvcnECS4NOfYdVBWF0b21zcQNdcQQoXXEFKEsMSw1lXXEGKEsMSw5lXXEHKEsPSxBlXXEIKEsPSxFlXXEJKEsSSxNlXXEKKEsSSxRlXXELKEsVSxZlXXEMKEsVSxdlXXENKEsYSxllXXEOKEsYSxplXXEPKEsbSxxlXXEQKEsbSx1lXXERKEseSx9lXXESKEseSyBlXXETKEseSyFlXXEUKEseSyJlXXEVKEshSyNlXXEWKEsiSyRlXXEXKEslSyZlXXEYKEslSydlXXEZKEsoSyllXXEaKEsoSyplXXEbKEsrSyxlXXEcKEsrSy1lXXEdKEsrSy5lXXEeKEsrSy9lXXEfKEssSzBlXXEgKEsuSzFlXXEhKEsySzNlXXEiKEsySzRlXXEjKEsySzVlXXEkKEsySzZlXXElKEszSzdlXXEmKEs1SzhlXXEnKEs5SzplXXEoKEs5SztlXXEpKEs8Sz1lXXEqKEs8Sz5lXXErKEs/S0BlXXEsKEs/S0FlXXEtKEtCS0NlXXEuKEtCS0RlXXEvKEtES0VlXXEwKEtES0ZlXXExKEtES0dlXXEyKEtIS0llXXEzKEtIS0plXXE0KEtKS0tlXXE1KEtKS0xlXXE2KEtKS01lXXE3KEtOS09lXXE4KEtOS1BlXXE5KEtOS1FlXXE6KEtOS1hlXXE7KEtPS1JlXXE8KEtPS1NlXXE9KEtPS1RlXXE+KEtQS1VlXXE/KEtQS1ZlXXFAKEtQS1dlXXFBKEtZS1plXXFCKEtZS1tlXXFDKEtZS1xlXXFEKEtZS11lXXFFKEteS19lXXFGKEteS2ZlXXFHKEteS2dlXXFIKEtfS2BlXXFJKEtfS2FlXXFKKEtgS2JlXXFLKEtgS3JlXXFMKEthS2NlXXFNKEthS3NlXXFOKEtiS2RlXXFPKEtiS3BlXXFQKEtjS2VlXXFRKEtjS3FlXXFSKEtkS2ZlXXFTKEtkS25lXXFUKEtlS2dlXXFVKEtlS29lXXFWKEtmS2hlXXFXKEtnS2llXXFYKEtoS2llXXFZKEtoS2plXXFaKEtoS2xlXXFbKEtpS2tlXXFcKEtpS21lXXFdKEt0S3VlXXFeKEt0S3ZlXXFfKEt3S3hlXXFgKEt3S3llXXFhKEt6S3tlXXFiKEt6S3xlXXFjKEt9S35lXXFkKEt9S4FlXXFlKEt9S4ZlXXFmKEt+S39lXXFnKEt+S4llXXFoKEt/S4BlXXFpKEt/S4JlXXFqKEuAS4FlXXFrKEuAS4VlXXFsKEuBS4plXXFtKEuCS4NlXXFuKEuCS5BlXXFvKEuDS4RlXXFwKEuDS5FlXXFxKEuES4VlXXFyKEuES5JlXXFzKEuFS4xlXXF0KEuGS4dlXXF1KEuGS45lXXF2KEuHS4hlXXF3KEuHS5NlXXF4KEuIS4llXXF5KEuIS5RlXXF6KEuJS49lXXF7KEuKS4tlXXF8KEuKS41lXXF9KEuLS4xlXXF+KEuLS5VlXXF/KEuMS5ZlXXGAKEuNS45lXXGBKEuNS5dlXXGCKEuOS5hlXXGDKEuPS5BlXXGEKEuPS5llXXGFKEuQS5plXXGGKEubS5xlXXGHKEubS51lZVUFbGFiZWxxiEuDWAAAAAB9h1UIaGFsZmJvbmRxiUuDiH2HVQZyYWRpdXNxikuDRz/JmZmgAAAAfYdVC2xhYmVsT2Zmc2V0cYtLg059h1UIZHJhd01vZGVxjEuDSwF9h1UIb3B0aW9uYWxxjX1VB2Rpc3BsYXlxjkuDSwJ9h3Uu')) crdInfo = cPickle.loads(base64.b64decode('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')) surfInfo = {'category': (6, u'main', {}), 'probeRadius': (6, 1.4, {}), 'pointSize': (6, 1, {}), 'name': [u'MSMS main surface of 6-BK-1', u'MSMS main surface of 1_2-A1 E[RI-MP2/aV[DTQ]Z]\t-851.6274\t-852.1135\t-852.2747', u'MSMS main surface of S2W3-I_d E[RI-MP2/aV[DTQ]Z//MP2/6-31+G*] -1627.0013 -1,627.9161 -1,628.2176', u'MSMS main surface of S2-A1-DMA1_EFP-D-30-pw91 \x06\x06Ee=0.31 kc/m \x06\x06E0=0.27 kc/m \x06\x06G(298K)= 0.19 kc/m', u'MSMS main surface of Acenaphthene-(H2O)3 Isomer efp-3', u'MSMS main surface of principal moment aligned geometry'], 'density': (6, 2, {}), 'colorMode': (6, 1, {}), 'useLighting': (6, True, {}), 'transparencyBlendMode': (6, 1, {}), 'molecule': [0, 1, 2, 3, 4, 5], 'smoothLines': (6, False, {}), 'lineWidth': (6, 1, {}), 'allComponents': (6, True, {}), 'twoSidedLighting': (6, True, {}), 'customVisibility': [None, None, None, None, None, None], 'drawMode': (6, 1, {}), 'display': (6, True, {}), 'customColors': [(0, None, {}), (0, None, {}), (0, None, {}), (0, None, {}), (0, None, {}), (0, None, {})]} vrmlInfo = {'subid': (0, None, {}), 'display': (0, None, {}), 'id': (0, None, {}), 'vrmlString': [], 'name': (0, None, {})} colors = {u'Ru': ((0.141176, 0.560784, 0.560784), 1, u'default'), u'Re': ((0.14902, 0.490196, 0.670588), 1, u'default'), u'Rf': ((0.8, 0, 0.34902), 1, u'default'), u'Ra': ((0, 0.490196, 0), 1, u'default'), u'Rb': ((0.439216, 0.180392, 0.690196), 1, u'default'), u'Rn': ((0.258824, 0.509804, 0.588235), 1, u'default'), u'Rh': ((0.0392157, 0.490196, 0.54902), 1, u'default'), u'Be': ((0.760784, 1, 0), 1, u'default'), u'Ba': ((0, 0.788235, 0), 1, u'default'), u'Bh': ((0.878431, 0, 0.219608), 1, u'default'), u'Bi': ((0.619608, 0.309804, 0.709804), 1, u'default'), u'Bk': ((0.541176, 0.309804, 0.890196), 1, u'default'), u'Br': ((0.65098, 0.160784, 0.160784), 1, u'default'), u'H': ((1, 1, 1), 1, u'default'), u'P': ((1, 0.501961, 0), 1, u'default'), u'Os': ((0.14902, 0.4, 0.588235), 1, u'default'), u'Es': ((0.701961, 0.121569, 0.831373), 1, u'default'), u'Hg': ((0.721569, 0.721569, 0.815686), 1, u'default'), u'Ge': ((0.4, 0.560784, 0.560784), 1, u'default'), u'Gd': ((0.270588, 1, 0.780392), 1, u'default'), u'Ga': ((0.760784, 0.560784, 0.560784), 1, u'default'), u'Pr': ((0.85098, 1, 0.780392), 1, u'default'), u'Pt': ((0.815686, 0.815686, 0.878431), 1, u'default'), u'Pu': ((0, 0.419608, 1), 1, u'default'), u'C': ((0.564706, 0.564706, 0.564706), 1, u'default'), u'Pb': ((0.341176, 0.34902, 0.380392), 1, u'default'), u'Pa': ((0, 0.631373, 1), 1, u'default'), u'Pd': ((0, 0.411765, 0.521569), 1, u'default'), u'Xe': ((0.258824, 0.619608, 0.690196), 1, u'default'), u'Po': ((0.670588, 0.360784, 0), 1, u'default'), u'Pm': ((0.639216, 1, 0.780392), 1, u'default'), u'Hs': ((0.901961, 0, 0.180392), 1, u'default'), u'Ho': ((0, 1, 0.611765), 1, u'default'), u'Hf': ((0.301961, 0.760784, 1), 1, u'default'), u'Mo': ((0.329412, 0.709804, 0.709804), 1, u'default'), u'He': ((0.85098, 1, 1), 1, u'default'), u'Md': ((0.701961, 0.0509804, 0.65098), 1, u'default'), u'Mg': ((0.541176, 1, 0), 1, u'default'), u'K': ((0.560784, 0.25098, 0.831373), 1, u'default'), u'Mn': ((0.611765, 0.478431, 0.780392), 1, u'default'), u'O': ((1, 0.0509804, 0.0509804), 1, u'default'), u'Mt': ((0.921569, 0, 0.14902), 1, u'default'), u'S': ((1, 1, 0.188235), 1, u'default'), u'W': ((0.129412, 0.580392, 0.839216), 1, u'default'), u'sky blue': ((0.529412, 0.807843, 0.921569), 1, u'default'), u'Zn': ((0.490196, 0.501961, 0.690196), 1, u'default'), u'plum': ((0.866667, 0.627451, 0.866667), 1, u'default'), u'Eu': ((0.380392, 1, 0.780392), 1, u'default'), u'Zr': ((0.580392, 0.878431, 0.878431), 1, u'default'), u'Er': ((0, 0.901961, 0.458824), 1, u'default'), u'Ni': ((0.313725, 0.815686, 0.313725), 1, u'default'), u'No': ((0.741176, 0.0509804, 0.529412), 1, u'default'), u'Na': ((0.670588, 0.360784, 0.94902), 1, u'default'), u'Nb': ((0.45098, 0.760784, 0.788235), 1, u'default'), u'Nd': ((0.780392, 1, 0.780392), 1, u'default'), u'Ne': ((0.701961, 0.890196, 0.960784), 1, u'default'), u'Np': ((0, 0.501961, 1), 1, u'default'), u'Fr': ((0.258824, 0, 0.4), 1, u'default'), u'Fe': ((0.878431, 0.4, 0.2), 1, u'default'), u'Fm': ((0.701961, 0.121569, 0.729412), 1, u'default'), u'B': ((1, 0.709804, 0.709804), 1, u'default'), u'F': ((0.564706, 0.878431, 0.313725), 1, u'default'), u'Sr': ((0, 1, 0), 1, u'default'), u'N': ((0.188235, 0.313725, 0.972549), 1, u'default'), u'Kr': ((0.360784, 0.721569, 0.819608), 1, u'default'), u'Si': ((0.941176, 0.784314, 0.627451), 1, u'default'), u'Sn': ((0.4, 0.501961, 0.501961), 1, u'default'), u'Sm': ((0.560784, 1, 0.780392), 1, u'default'), u'V': ((0.65098, 0.65098, 0.670588), 1, u'default'), u'Sc': ((0.901961, 0.901961, 0.901961), 1, u'default'), u'Sb': ((0.619608, 0.388235, 0.709804), 1, u'default'), u'Sg': ((0.85098, 0, 0.270588), 1, u'default'), u'Se': ((1, 0.631373, 0), 1, u'default'), u'Co': ((0.941176, 0.564706, 0.627451), 1, u'default'), u'Cm': ((0.470588, 0.360784, 0.890196), 1, u'default'), u'Cl': ((0.121569, 0.941176, 0.121569), 1, u'default'), u'Ca': ((0.239216, 1, 0), 1, u'default'), u'Cf': ((0.631373, 0.211765, 0.831373), 1, u'default'), u'Ce': ((1, 1, 0.780392), 1, u'default'), u'Cd': ((1, 0.85098, 0.560784), 1, u'default'), u'Lu': ((0, 0.670588, 0.141176), 1, u'default'), u'light green': ((0.564706, 0.933333, 0.564706), 1, u'default'), u'Cs': ((0.341176, 0.0901961, 0.560784), 1, u'default'), u'Cr': ((0.541176, 0.6, 0.780392), 1, u'default'), u'Cu': ((0.784314, 0.501961, 0.2), 1, u'default'), u'La': ((0.439216, 0.831373, 1), 1, u'default'), u'Li': ((0.8, 0.501961, 1), 1, u'default'), u'Tl': ((0.65098, 0.329412, 0.301961), 1, u'default'), u'Tm': ((0, 0.831373, 0.321569), 1, u'default'), u'Lr': ((0.780392, 0, 0.4), 1, u'default'), u'Th': ((0, 0.729412, 1), 1, u'default'), u'Ti': ((0.74902, 0.760784, 0.780392), 1, u'default'), u'tan': ((0.823529, 0.705882, 0.54902), 1, u'default'), u'Te': ((0.831373, 0.478431, 0), 1, u'default'), u'Tb': ((0.188235, 1, 0.780392), 1, u'default'), u'Tc': ((0.231373, 0.619608, 0.619608), 1, u'default'), u'Ta': ((0.301961, 0.65098, 1), 1, u'default'), u'Yb': ((0, 0.74902, 0.219608), 1, u'default'), u'Db': ((0.819608, 0, 0.309804), 1, u'default'), u'Dy': ((0.121569, 1, 0.780392), 1, u'default'), u'I': ((0.580392, 0, 0.580392), 1, u'default'), u'salmon': ((0.980392, 0.501961, 0.447059), 1, u'default'), u'U': ((0, 0.560784, 1), 1, u'default'), u'Y': ((0.580392, 1, 1), 1, u'default'), u'Ac': ((0.439216, 0.670588, 0.980392), 1, u'default'), u'Ag': ((0.752941, 0.752941, 0.752941), 1, u'default'), u'Ir': ((0.0901961, 0.329412, 0.529412), 1, u'default'), u'Am': ((0.329412, 0.360784, 0.94902), 1, u'default'), u'Al': ((0.74902, 0.65098, 0.65098), 1, u'default'), u'As': ((0.741176, 0.501961, 0.890196), 1, u'default'), u'Ar': ((0.501961, 0.819608, 0.890196), 1, u'default'), u'Au': ((1, 0.819608, 0.137255), 1, u'default'), u'At': ((0.458824, 0.309804, 0.270588), 1, u'default'), u'In': ((0.65098, 0.458824, 0.45098), 1, u'default'), u'light gray': ((0.827451, 0.827451, 0.827451), 1, u'default')} materials = {u'default': ((0.85, 0.85, 0.85), 30)} pbInfo = {'category': [u'distance monitor', u'hydrogen bonds'], 'bondInfo': [{'color': (0, None, {}), 'atoms': [], 'label': (0, None, {}), 'halfbond': (0, None, {}), 'labelColor': (0, None, {}), 'labelOffset': (0, None, {}), 'drawMode': (0, None, {}), 'display': (0, None, {})}, {'color': (27, 13, {}), 'atoms': [[14, 15], [16, 18], [17, 27], [20, 21], [22, 27], [25, 12], [29, 24], [35, 37], [36, 40], [39, 31], [42, 32], [48, 53], [49, 52], [55, 57], [56, 60], [59, 47], [62, 63], [65, 54], [73, 70], [88, 77], [88, 75], [81, 71], [90, 75], [93, 69], [118, 119], [120, 122], [123, 116]], 'label': (27, u'', {}), 'halfbond': (27, False, {}), 'labelColor': (27, None, {}), 'labelOffset': (27, chimera.Vector(-1e+99, 0.0, 0.0), {chimera.Vector(-1e+99, 0.0, 0.0): [7], chimera.Vector(-1e+99, 0.0, 0.0): [21], chimera.Vector(-1e+99, 0.0, 0.0): [22], chimera.Vector(-1e+99, 0.0, 0.0): [23], chimera.Vector(-1e+99, 0.0, 0.0): [24], chimera.Vector(-1e+99, 0.0, 0.0): [2], chimera.Vector(-1e+99, 0.0, 0.0): [4], chimera.Vector(-1e+99, 0.0, 0.0): [26], chimera.Vector(-1e+99, 0.0, 0.0): [9], chimera.Vector(-1e+99, 0.0, 0.0): [1], chimera.Vector(-1e+99, 0.0, 0.0): [25], chimera.Vector(-1e+99, 0.0, 0.0): [13], chimera.Vector(-1e+99, 0.0, 0.0): [0], chimera.Vector(-1e+99, 0.0, 0.0): [10], chimera.Vector(-1e+99, 0.0, 0.0): [11], chimera.Vector(-1e+99, 0.0, 0.0): [12], chimera.Vector(-1e+99, 0.0, 0.0): [3], chimera.Vector(-1e+99, 0.0, 0.0): [14], chimera.Vector(-1e+99, 0.0, 0.0): [15], chimera.Vector(-1e+99, 0.0, 0.0): [16], chimera.Vector(-1e+99, 0.0, 0.0): [17], chimera.Vector(-1e+99, 0.0, 0.0): [18], chimera.Vector(-1e+99, 0.0, 0.0): [19], chimera.Vector(-1e+99, 0.0, 0.0): [6], chimera.Vector(-1e+99, 0.0, 0.0): [20], chimera.Vector(-1e+99, 0.0, 0.0): [8]}), 'drawMode': (27, 0, {}), 'display': (27, 2, {})}], 'lineType': (2, 1, {2: [0]}), 'color': (2, 11, {12: [1]}), 'optional': {'fixedLabels': (True, False, (2, False, {None: [1]}))}, 'display': (2, True, {}), 'showStubBonds': (2, False, {}), 'lineWidth': (2, 1, {}), 'stickScale': (2, 1, {}), 'id': [-2, -1]} modelAssociations = {} colorInfo = (16, (u'', (0, 0, 1, 1)), {(u'H', (1, 1, 1, 1)): [7], (u'S', (1, 1, 0.188235, 1)): [8], (u'light green', (0.564706, 0.933333, 0.564706, 1)): [3], (u'N', (0.188235, 0.313725, 0.972549, 1)): [9], (u'green', (0, 1, 0, 1)): [15], (u'O', (1, 0.0509804, 0.0509804, 1)): [6], (u'sky blue', (0.529412, 0.807843, 0.921569, 1)): [1], (u'tan', (0.823529, 0.705882, 0.54902, 1)): [0], (u'plum', (0.866667, 0.627451, 0.866667, 1)): [2], (u'light gray', (0.827451, 0.827451, 0.827451, 1)): [5], (u'salmon', (0.980392, 0.501961, 0.447059, 1)): [4], (u'white', (1, 1, 1, 1)): [14], (u'C', (0.564706, 0.564706, 0.564706, 1)): [10], (u'gray', (0.745, 0.745, 0.745, 1)): [12]}) viewerInfo = {'cameraAttrs': {'center': (9.3963327286629, -5.2188747823001, -0.095359999999999), 'fieldOfView': 25.50160439021, 'nearFar': (16.239534862196, -16.430254862196), 'ortho': False, 'eyeSeparation': 50.8, 'focal': -0.095359999999999}, 'viewerAttrs': {'silhouetteColor': None, 'clipping': False, 'showSilhouette': True, 'showShadows': False, 'viewSize': 17.330834895913, 'labelsOnTop': True, 'depthCueRange': (0.5, 1), 'silhouetteWidth': 2, 'singleLayerTransparency': True, 'shadowTextureSize': 2048, 'backgroundImage': [None, 1, 2, 1, 0, 0], 'backgroundGradient': [(None, [(0.941176, 0.941176, 0.941176, 1), (0.741176, 0.741176, 0.741176, 1), (0.388235, 0.388235, 0.388235, 1)], 1), 1, 0, 0], 'depthCue': False, 'highlight': 0, 'scaleFactor': 1.2070993261352, 'angleDependentTransparency': True, 'backgroundMethod': 0}, 'viewerHL': 15, 'cameraMode': 'mono', 'detail': 5, 'viewerFog': None, 'viewerBG': 14} replyobj.status("Initializing session restore...", blankAfter=0, secondary=True) from SimpleSession.versions.v65 import expandSummary init(dict(enumerate(expandSummary(colorInfo)))) replyobj.status("Restoring colors...", blankAfter=0, secondary=True) restoreColors(colors, materials) replyobj.status("Restoring molecules...", blankAfter=0, secondary=True) restoreMolecules(molInfo, resInfo, atomInfo, bondInfo, crdInfo) replyobj.status("Restoring surfaces...", blankAfter=0, secondary=True) restoreSurfaces(surfInfo) replyobj.status("Restoring VRML models...", blankAfter=0, secondary=True) restoreVRML(vrmlInfo) replyobj.status("Restoring pseudobond groups...", blankAfter=0, secondary=True) restorePseudoBondGroups(pbInfo) replyobj.status("Restoring model associations...", blankAfter=0, secondary=True) restoreModelAssociations(modelAssociations) replyobj.status("Restoring camera...", blankAfter=0, secondary=True) restoreViewer(viewerInfo)
def showTurn(turn, color, width, thickness): pt = [] for r in turn: a = r.findAtom('CA') if not a: continue pt.append(a.coord()) size = max(width, thickness) try: c, d, n, b = ssMap[turn[0]] cv = chimera.Point(c[0], c[1], c[2]) dv = chimera.Vector(d[0], d[1], d[2]) nv = chimera.Vector(n[0], n[1], n[2]) bv = chimera.Vector(b[0], b[1], b[2]) startDir = dv startNormals = (nv, bv) pt.insert(0, cv) except KeyError: startDir = None startNormals = None try: c, d, n, b = ssMap[turn[-1]] cv = chimera.Point(c[0], c[1], c[2]) dv = chimera.Vector(d[0], d[1], d[2]) nv = chimera.Vector(n[0], n[1], n[2]) bv = chimera.Vector(b[0], b[1], b[2]) endDir = -dv endNormals = (nv, bv) pt.append(cv) except KeyError: endDir = None endNormals = None if len(pt) < 3: return [] if len(pt) == 3: # need at least 4 points for vrml.Extrustion if startDir: pt.insert(1, chimera.Point(pt[:2])) if endDir: pt.insert(-1, chimera.Point(pt[-2:])) dir = [] if startDir is None: dir.append(pt[1] - pt[0]) else: dir.append(startDir) for i in range(1, len(pt) - 1): dir.append(pt[i + 1] - pt[i - 1]) if endDir is None: dir.append(pt[-1] - pt[-2]) else: dir.append(endDir) offsets = [[0.0, thickness], [width, 0.0], [0.0, -thickness], [-width, 0.0]] edges = [] for i in offsets: edges.append([]) if startNormals is not None: normal, binormal = startNormals else: normal, binormal = getEndNormals(pt[0], pt[1], pt[2]) addEdges(edges, offsets, pt[0], normal, binormal) for i in range(1, len(pt) - 1): try: n, b = getInteriorNormals(pt[i], pt[i - 1], pt[i + 1]) normal, binormal = minimizeTwist(dir[i], n, b, normal, binormal) except ValueError: # This can happen if the three points are linear # We just inherit the normals from the previous triple pass addEdges(edges, offsets, pt[i], normal, binormal) if endNormals is not None: n, b = endNormals else: n, b = getEndNormals(pt[-1], pt[-3], pt[-2]) normal, binormal = minimizeTwist(dir[-1], n, b, normal, binormal) addEdges(edges, offsets, pt[-1], normal, binormal) rgba = color.get().rgba() ext = vrml.Extrusion(color=rgba[:3], edges=edges) if rgba[3] < 1.0: ext.transparency = 1.0 - rgba[3] return [ext]
def Icos(self): imod = None axmod = None for m in chimera.openModels.list(): if m.name == "Icosahedron": imod = m if m.name == "Icosahedron_Axes": axmod = m if axmod == None: pass else: chimera.openModels.close([axmod]) if imod == None: self.umsg("No Icosahedron model found - please follow step 2.") return if len(imod.surfacePieces) <> 1: self.umsg("Please set 'Subdivision factor' to 1") return print len(imod.surfacePieces[0].geometry[1]), " tris" print len(imod.surfacePieces[0].geometry[0]), " verts" if len(imod.surfacePieces[0].geometry[1]) <> 20: self.umsg("Please set 'Subdivision factor' to 1") return self.umsg("Building axes...") import _surface surf_mod = _surface.SurfaceModel() chimera.openModels.add([surf_mod], sameAs=imod) import axes reload(axes) self.icos_vecs = [] from numpy import arccos, pi for p in imod.surfacePieces: v, t = p.geometry[0], p.geometry[1] #print len(v), len(t) #for pt in v : # print " - pt: ", pt for tri in t: #print " - tri: ", tri, p1 = v[tri[0]] p2 = v[tri[1]] p3 = v[tri[2]] mp = (p1 + p2 + p3) / 3.0 pv = chimera.Vector(mp[0], mp[1], mp[2]) r = pv.length pv.normalize() #print mp self.icos_vecs.append(pv) cyl = axes.AddCylinderSolid(chimera.Vector(0, 0, 0), pv, r, (.6, .4, .4, 1), 10.0, surf_mod) cyl.name = "Icosahedron_Axes" p1v = chimera.Vector(p1[0], p1[1], p1[2]) p1v.normalize() p2v = chimera.Vector(p2[0], p2[1], p2[2]) p2v.normalize() p3v = chimera.Vector(p3[0], p3[1], p3[2]) p3v.normalize() a1 = arccos(p1v * pv) * 180.0 / pi a2 = arccos(p2v * pv) * 180.0 / pi a3 = arccos(p3v * pv) * 180.0 / pi a12 = arccos(p1v * p2v) * 180.0 / pi # print a1, a2, a3, a12 minAng = 1e9 pv1 = self.icos_vecs[0] for pv2 in self.icos_vecs[1:]: dp = pv1 * pv2 ang = arccos(dp) #print ang * 180.0 / pi self.umsg("Axes built.")
def rotate(a, b, c, angle, molecule): axis = chimera.Vector(a, b, c) xf = chimera.Xform.rotation(axis, angle) molecule.openState.globalXform(xf)
def MakeHist(self): segMap = segmentation_map() if segMap == None: self.umsg("Please select a map in the Segment Map Dialog") return import axes reload(axes) pts, weights = axes.map_points(segMap) print len(pts) COM, U, S, V = prAxes(pts) print " - COM : ", COM smod = current_segmentation() if smod == None: self.umsg( "Please select a Current Segmentation in the Segment Map dialog" ) return print "Seg has %d regions" % (len(smod.regions)) if hasattr(self, 'icos_vecs'): self.umsg("Making (icosahedrally corrected) histogram...") else: self.umsg("Making histogram...") nregs, last = len(smod.regions), 0 regs = list(smod.regions) distByReg = {} for ri, r in enumerate(regs): if 0 and r.surface_piece != None: if r.surface_piece.display == False: print "i" + ri, continue try: p = r.center_of_points() except: print "+" continue rvec = chimera.Vector(p[0], p[1], p[2]) - chimera.Vector( COM[0], COM[1], COM[2]) rad = 0.0 if hasattr(self, 'icos_vecs'): for ivec in self.icos_vecs: irad = ivec * rvec if irad > rad: rad = irad else: rad = rvec.length distByReg[r] = rad at = int(numpy.floor(10.0 * (ri + 1) / nregs)) if at > last: #print at, if hasattr(self, 'icos_vecs'): self.status( "Making (icosahedrally corrected) histogram %d regions, at %d" % (len(regs), ri + 1)) else: self.status("Making histogram %d regions, at %d" % (len(regs), ri + 1)) last = at at += 1 print "" dists = distByReg.values() maxDist = max(dists) + 0.01 minDist = min(dists) nbins = int(self.numBins.get()) dr = (maxDist - minDist) / float(nbins) print "%d dists - max %.2f, min %.2f, nb %d, dr %.2f" % ( len(dists), maxDist, minDist, nbins, dr) bins = [] for i in range(nbins): bins.append([]) print "bad bins: ", for regm, rad in distByReg.iteritems(): bini = int(numpy.floor((rad - minDist) / dr)) if bini >= len(bins): print bini, bini = len(bins) - 1 bins[bini].append(regm) print "" if 0: f = open("rads.txt", "w") for k, regs in enumerate(bins): v = len(regs) vmin = minDist + k * dr vmax = minDist + (k + 1) * dr rm = .5 * (vmin + vmax) vn = v / (4 * 3.14 * rm * rm) f.write("%d\t%.2f\t%.2f\t%d\t%f\n" % (k, vmin, vmax, v, vn)) f.close() self.distByReg = distByReg #print self.distByReg def save(okay, dialog): if okay: paths = dialog.getPaths() if paths: path = paths[0] self.umsg("Saved plot to: " + path) f = open(path, "w") for k, regs in enumerate(bins): v = len(regs) vmin = minDist + k * dr vmax = minDist + (k + 1) * dr rm = .5 * (vmin + vmax) vn = v / (4 * 3.14 * rm * rm) f.write("%.2f,%d\n" % (vmin, v)) f.close() from OpenSave import SaveModeless SaveModeless(title='Save Histogram', filters=[('TXT', '*.txt', '.txt')], initialfile="dist_hist.txt", command=save)
def _setDirection(self, opt): if self.light: import chimera self.light.direction = chimera.Vector(*opt.get()) self.saveui.setItemChanged(True)
def restoreCoreModels(): from SimpleSession.versions.v65 import init, restoreViewer, \ restoreMolecules, restoreColors, restoreSurfaces, \ restoreVRML, restorePseudoBondGroups, restoreModelAssociations molInfo = cPickle.loads( base64.b64decode( 'gAJ9cQEoVRFyaWJib25JbnNpZGVDb2xvcnECSwNOfYdVCWJhbGxTY2FsZXEDSwNHP9AAAAAAAAB9h1UJcG9pbnRTaXplcQRLA0c/8AAAAAAAAH2HVQVjb2xvcnEFSwNLAH1xBihLAV1xB0sBYUsCXXEISwJhdYdVCnJpYmJvblR5cGVxCUsDSwB9h1UKc3RpY2tTY2FsZXEKSwNHP/AAAAAAAAB9h1UMbW1DSUZIZWFkZXJzcQtdcQwoTk5OZVUMYXJvbWF0aWNNb2RlcQ1LA0sBfYdVCnZkd0RlbnNpdHlxDksDR0AUAAAAAAAAfYdVBmhpZGRlbnEPSwOJfYdVDWFyb21hdGljQ29sb3JxEEsDTn2HVQ9yaWJib25TbW9vdGhpbmdxEUsDSwB9h1UJYXV0b2NoYWlucRJLA4h9h1UKcGRiVmVyc2lvbnETSwNLAn2HVQhvcHRpb25hbHEUfXEVVQhvcGVuZWRBc3EWiIlLAyhVEG91dGxpZXIuMDAzMS5wZGJxF05OSwF0cRh9cRkoKFUQb3V0bGllci4wNTkyLnBkYnEaTk5LAXRxG11xHEsBYShVEG91dGxpZXIuMTM0Mi5wZGJxHU5OSwF0cR5dcR9LAmF1h4dzVQ9sb3dlckNhc2VDaGFpbnNxIEsDiX2HVQlsaW5lV2lkdGhxIUsDRz/wAAAAAAAAfYdVD3Jlc2lkdWVMYWJlbFBvc3EiSwNLAH2HVQRuYW1lcSNLA1gQAAAAb3V0bGllci4xMzQyLnBkYn1xJChYEAAAAG91dGxpZXIuMDU5Mi5wZGJdcSVLAWFYEAAAAG91dGxpZXIuMDAzMS5wZGJdcSZLAGF1h1UPYXJvbWF0aWNEaXNwbGF5cSdLA4l9h1UPcmliYm9uU3RpZmZuZXNzcShLA0c/6ZmZmZmZmn2HVQpwZGJIZWFkZXJzcSldcSoofXErWAUAAABUSVRMRV1xLFg7AAAAVElUTEUgICAgIFRISVMgUERCIEZJTEUgSVMgR0VORVJBVEVEIEJZICJtb2wybW9sIiAtLWxmemhhby5xLWFzfXEuWAUAAABUSVRMRV1xL1g7AAAAVElUTEUgICAgIFRISVMgUERCIEZJTEUgSVMgR0VORVJBVEVEIEJZICJtb2wybW9sIiAtLWxmemhhby5xMGFzfXExWAUAAABUSVRMRV1xMlg7AAAAVElUTEUgICAgIFRISVMgUERCIEZJTEUgSVMgR0VORVJBVEVEIEJZICJtb2wybW9sIiAtLWxmemhhby5xM2FzZVUDaWRzcTRLA0sCSwCGfXE1KEsBSwCGXXE2SwFhSwBLAIZdcTdLAGF1h1UOc3VyZmFjZU9wYWNpdHlxOEsDR7/wAAAAAAAAfYdVEGFyb21hdGljTGluZVR5cGVxOUsDSwJ9h1UUcmliYm9uSGlkZXNNYWluY2hhaW5xOksDiH2HVQdkaXNwbGF5cTtLA4h9h3Uu' )) resInfo = cPickle.loads( base64.b64decode( 'gAJ9cQEoVQZpbnNlcnRxAksDVQEgfYdVC2ZpbGxEaXNwbGF5cQNLA4l9h1UEbmFtZXEESwNYAwAAAExJR32HVQVjaGFpbnEFSwNYAQAAAEF9h1UOcmliYm9uRHJhd01vZGVxBksDSwJ9h1UCc3NxB0sDiYmGfYdVCG1vbGVjdWxlcQhLA0sAfXEJKEsBTl1xCksBSwGGcQthhksCTl1xDEsCSwGGcQ1hhnWHVQtyaWJib25Db2xvcnEOSwNLA32HVQVsYWJlbHEPSwNYAAAAAH2HVQpsYWJlbENvbG9ycRBLA0sDfYdVCGZpbGxNb2RlcRFLA0sBfYdVBWlzSGV0cRJLA4l9h1ULbGFiZWxPZmZzZXRxE0sDTn2HVQhwb3NpdGlvbnEUXXEVKEsBSwGGcRZLAUsBhnEXSwFLAYZxGGVVDXJpYmJvbkRpc3BsYXlxGUsDiX2HVQhvcHRpb25hbHEafVUEc3NJZHEbSwNK/////32HdS4=' )) atomInfo = cPickle.loads( base64.b64decode( 'gAJ9cQEoVQdyZXNpZHVlcQJLEksDfXEDKEsETl1xBEsGSwaGcQVhhksFTl1xBksMSwaGcQdhhnWHVQh2ZHdDb2xvcnEISxJOfYdVBG5hbWVxCUsSWAEAAABIfXEKWAEAAABPXXELKEsASwNLBksJSwxLD2Vzh1UDdmR3cQxLEol9h1UOc3VyZmFjZURpc3BsYXlxDUsSiX2HVQVjb2xvcnEOSxJLA31xDyhLBF1xEChLA0sGSw9lSwVdcREoSwRLBUsHSwhLEEsRZXWHVQlpZGF0bVR5cGVxEksSiX2HVQZhbHRMb2NxE0sSVQB9h1UFbGFiZWxxFEsSWAAAAAB9h1UOc3VyZmFjZU9wYWNpdHlxFUsSR7/wAAAAAAAAfYdVB2VsZW1lbnRxFksSSwF9cRdLCF1xGChLAEsDSwZLCUsMSw9lc4dVCmxhYmVsQ29sb3JxGUsSSwN9cRpOXXEbKEsDSwRLBUsGSwdLCEsPSxBLEWVzh1UMc3VyZmFjZUNvbG9ycRxLEksDfXEdTl1xHihLA0sESwVLBksHSwhLD0sQSxFlc4dVD3N1cmZhY2VDYXRlZ29yeXEfSxJYBAAAAG1haW59h1UGcmFkaXVzcSBLEkc/8AAAAAAAAH1xIUc/+AAAAAAAAF1xIihLAEsDSwZLCUsMSw9lc4dVCmNvb3JkSW5kZXhxI11xJChLAEsGhnElSwBLBoZxJksASwaGcSdlVQtsYWJlbE9mZnNldHEoSxJOfYdVEm1pbmltdW1MYWJlbFJhZGl1c3EpSxJHAAAAAAAAAAB9h1UIZHJhd01vZGVxKksSSwJ9h1UIb3B0aW9uYWxxK31xLChVDHNlcmlhbE51bWJlcnEtiIhdcS4oSwFLBoZxL0sBSwaGcTBLAUsGhnExZYdVB2JmYWN0b3JxMoiJSxJHAAAAAAAAAAB9h4dVCW9jY3VwYW5jeXEziIlLEkc/8AAAAAAAAH2Hh3VVB2Rpc3BsYXlxNEsSiH2HdS4=' )) bondInfo = cPickle.loads( base64.b64decode( 'gAJ9cQEoVQVjb2xvcnECSwxLA31xA05dcQQoSwJLA0sESwVLCksLZXOHVQVhdG9tc3EFXXEGKF1xByhLBksHZV1xCChLBksIZV1xCShLCUsKZV1xCihLCUsLZV1xCyhLDEsNZV1xDChLDEsOZV1xDShLD0sQZV1xDihLD0sRZV1xDyhLEksTZV1xEChLEksUZV1xEShLFUsWZV1xEihLFUsXZWVVBWxhYmVscRNLDFgAAAAAfYdVCGhhbGZib25kcRRLDIh9h1UGcmFkaXVzcRVLDEc/yZmZoAAAAH2HVQtsYWJlbE9mZnNldHEWSwxOfYdVCGRyYXdNb2RlcRdLDEsBfYdVCG9wdGlvbmFscRh9VQdkaXNwbGF5cRlLDEsCfYd1Lg==' )) crdInfo = cPickle.loads( base64.b64decode( 'gAJ9cQEoSwB9cQIoSwBdcQMoRz/0j1wo9cKPR7/xZFocrAgxR8ADwIMSbpeNh3EERz/mbpeNT987R7/aLQ5WBBiTR8AA87ZFocrBh3EFRz/8NT987ZFoR7/k/fO2RaHLR8AJdLxqfvnbh3EGR0AHj1wo9cKPRz/cWhysCDEnR8ANyLQ5WBBih3EHR0ADJul41P30Rz/rItDlYEGJR8ARlocrAgxKh3EIR0ADl41P3ztkR7/U3S8an753R8ALcKPXCj1xh3EJZVUGYWN0aXZlcQpLAHVLAX1xCyhLAF1xDChHv8Q5WBBiTdNHP7fO2RaHKwJHP+141P3ztkaHcQ1Hv4BiTdLxqfxHP+1P3ztkWh1HP/ZJul41P32HcQ5Hv8xqfvnbItFHv+Jul41P3ztHP/m6XjU/fO6HcQ9HP8OVgQYk3S9HP/ZBiTdLxqhHQAayLQ5WBBmHcRBHv9KfvnbItDlHP/crAgxJul5HP//KwIMSbpiHcRFHP/A5WBBiTdNHP/AxJul41P5HQAUcrAgxJumHcRJlaApLAHVLAn1xEyhLAF1xFChHP/DlYEGJN0xHQBAi0OVgQYlHQBnfO2RaHKyHcRVHP/g9cKPXCj1HQBN3ztkWhytHQBlYEGJN0vKHcRZHP/rQ5WBBiTdHQArlYEGJN0xHQBiyLQ5WBBmHcRdHP/9YEGJN0vJHP/qTdLxqfvpHQBmhysCDEm+HcRhHQAAGJN0vGqBHQAPztkWhysFHQBuJN0vGp/CHcRlHQANgQYk3S8dHP/CDEm6XjVBHQBveNT987ZGHcRplaApLAHV1Lg==' )) surfInfo = { 'category': (0, None, {}), 'probeRadius': (0, None, {}), 'pointSize': (0, None, {}), 'name': [], 'density': (0, None, {}), 'colorMode': (0, None, {}), 'useLighting': (0, None, {}), 'transparencyBlendMode': (0, None, {}), 'molecule': [], 'smoothLines': (0, None, {}), 'lineWidth': (0, None, {}), 'allComponents': (0, None, {}), 'twoSidedLighting': (0, None, {}), 'customVisibility': [], 'drawMode': (0, None, {}), 'display': (0, None, {}), 'customColors': [] } vrmlInfo = { 'subid': (0, None, {}), 'display': (0, None, {}), 'id': (0, None, {}), 'vrmlString': [], 'name': (0, None, {}) } colors = { 'Ru': ((0.141176, 0.560784, 0.560784), 1, u'default'), 'Re': ((0.14902, 0.490196, 0.670588), 1, u'default'), 'Rf': ((0.8, 0, 0.34902), 1, u'default'), 'Ra': ((0, 0.490196, 0), 1, u'default'), 'Rb': ((0.439216, 0.180392, 0.690196), 1, u'default'), 'Rn': ((0.258824, 0.509804, 0.588235), 1, u'default'), 'Rh': ((0.0392157, 0.490196, 0.54902), 1, u'default'), 'Be': ((0.760784, 1, 0), 1, u'default'), 'Ba': ((0, 0.788235, 0), 1, u'default'), 'Bh': ((0.878431, 0, 0.219608), 1, u'default'), 'Bi': ((0.619608, 0.309804, 0.709804), 1, u'default'), 'Bk': ((0.541176, 0.309804, 0.890196), 1, u'default'), 'Br': ((0.65098, 0.160784, 0.160784), 1, u'default'), 'H': ((1, 1, 1), 1, u'default'), 'P': ((1, 0.501961, 0), 1, u'default'), 'Os': ((0.14902, 0.4, 0.588235), 1, u'default'), 'Ge': ((0.4, 0.560784, 0.560784), 1, u'default'), 'Gd': ((0.270588, 1, 0.780392), 1, u'default'), 'Ga': ((0.760784, 0.560784, 0.560784), 1, u'default'), 'Pr': ((0.85098, 1, 0.780392), 1, u'default'), 'Pt': ((0.815686, 0.815686, 0.878431), 1, u'default'), 'Pu': ((0, 0.419608, 1), 1, u'default'), 'C': ((0.564706, 0.564706, 0.564706), 1, u'default'), 'Pb': ((0.341176, 0.34902, 0.380392), 1, u'default'), 'Pa': ((0, 0.631373, 1), 1, u'default'), 'Pd': ((0, 0.411765, 0.521569), 1, u'default'), 'Cd': ((1, 0.85098, 0.560784), 1, u'default'), 'Po': ((0.670588, 0.360784, 0), 1, u'default'), 'Pm': ((0.639216, 1, 0.780392), 1, u'default'), 'Hs': ((0.901961, 0, 0.180392), 1, u'default'), 'Ho': ((0, 1, 0.611765), 1, u'default'), 'Hf': ((0.301961, 0.760784, 1), 1, u'default'), 'Hg': ((0.721569, 0.721569, 0.815686), 1, u'default'), 'He': ((0.85098, 1, 1), 1, u'default'), 'Md': ((0.701961, 0.0509804, 0.65098), 1, u'default'), 'Mg': ((0.541176, 1, 0), 1, u'default'), 'K': ((0.560784, 0.25098, 0.831373), 1, u'default'), 'Mn': ((0.611765, 0.478431, 0.780392), 1, u'default'), 'O': ((1, 0.0509804, 0.0509804), 1, u'default'), 'Mt': ((0.921569, 0, 0.14902), 1, u'default'), 'S': ((1, 1, 0.188235), 1, u'default'), 'W': ((0.129412, 0.580392, 0.839216), 1, u'default'), 'sky blue': ((0.529412, 0.807843, 0.921569), 1, u'default'), 'cornflower blue': ((0.392157, 0.584314, 0.929412), 1, u'default'), 'plum': ((0.866667, 0.627451, 0.866667), 1, u'default'), 'Eu': ((0.380392, 1, 0.780392), 1, u'default'), 'Zr': ((0.580392, 0.878431, 0.878431), 1, u'default'), 'Er': ((0, 0.901961, 0.458824), 1, u'default'), 'Ni': ((0.313725, 0.815686, 0.313725), 1, u'default'), 'No': ((0.741176, 0.0509804, 0.529412), 1, u'default'), 'Na': ((0.670588, 0.360784, 0.94902), 1, u'default'), 'Nb': ((0.45098, 0.760784, 0.788235), 1, u'default'), 'Nd': ((0.780392, 1, 0.780392), 1, u'default'), 'Ne': ((0.701961, 0.890196, 0.960784), 1, u'default'), 'Np': ((0, 0.501961, 1), 1, u'default'), 'Fr': ((0.258824, 0, 0.4), 1, u'default'), 'Fe': ((0.878431, 0.4, 0.2), 1, u'default'), 'Fm': ((0.701961, 0.121569, 0.729412), 1, u'default'), 'B': ((1, 0.709804, 0.709804), 1, u'default'), 'F': ((0.564706, 0.878431, 0.313725), 1, u'default'), 'Sr': ((0, 1, 0), 1, u'default'), 'Zn': ((0.490196, 0.501961, 0.690196), 1, u'default'), 'N': ((0.188235, 0.313725, 0.972549), 1, u'default'), 'Kr': ((0.360784, 0.721569, 0.819608), 1, u'default'), 'Si': ((0.941176, 0.784314, 0.627451), 1, u'default'), 'Sn': ((0.4, 0.501961, 0.501961), 1, u'default'), 'Sm': ((0.560784, 1, 0.780392), 1, u'default'), 'V': ((0.65098, 0.65098, 0.670588), 1, u'default'), 'Sc': ((0.901961, 0.901961, 0.901961), 1, u'default'), 'Sb': ((0.619608, 0.388235, 0.709804), 1, u'default'), 'Sg': ((0.85098, 0, 0.270588), 1, u'default'), 'Se': ((1, 0.631373, 0), 1, u'default'), 'Co': ((0.941176, 0.564706, 0.627451), 1, u'default'), 'Cm': ((0.470588, 0.360784, 0.890196), 1, u'default'), 'Cl': ((0.121569, 0.941176, 0.121569), 1, u'default'), 'Ca': ((0.239216, 1, 0), 1, u'default'), 'Cf': ((0.631373, 0.211765, 0.831373), 1, u'default'), 'Ce': ((1, 1, 0.780392), 1, u'default'), 'Xe': ((0.258824, 0.619608, 0.690196), 1, u'default'), 'Tm': ((0, 0.831373, 0.321569), 1, u'default'), 'Cs': ((0.341176, 0.0901961, 0.560784), 1, u'default'), 'Cr': ((0.541176, 0.6, 0.780392), 1, u'default'), 'Cu': ((0.784314, 0.501961, 0.2), 1, u'default'), 'La': ((0.439216, 0.831373, 1), 1, u'default'), 'Li': ((0.8, 0.501961, 1), 1, u'default'), 'Tl': ((0.65098, 0.329412, 0.301961), 1, u'default'), 'Lu': ((0, 0.670588, 0.141176), 1, u'default'), 'Lr': ((0.780392, 0, 0.4), 1, u'default'), 'Th': ((0, 0.729412, 1), 1, u'default'), 'Ti': ((0.74902, 0.760784, 0.780392), 1, u'default'), 'tan': ((0.823529, 0.705882, 0.54902), 1, u'default'), 'Te': ((0.831373, 0.478431, 0), 1, u'default'), 'Tb': ((0.188235, 1, 0.780392), 1, u'default'), 'Tc': ((0.231373, 0.619608, 0.619608), 1, u'default'), 'Ta': ((0.301961, 0.65098, 1), 1, u'default'), 'Yb': ((0, 0.74902, 0.219608), 1, u'default'), 'Db': ((0.819608, 0, 0.309804), 1, u'default'), 'Dy': ((0.121569, 1, 0.780392), 1, u'default'), 'At': ((0.458824, 0.309804, 0.270588), 1, u'default'), 'I': ((0.580392, 0, 0.580392), 1, u'default'), 'U': ((0, 0.560784, 1), 1, u'default'), 'Y': ((0.580392, 1, 1), 1, u'default'), 'Ac': ((0.439216, 0.670588, 0.980392), 1, u'default'), 'Ag': ((0.752941, 0.752941, 0.752941), 1, u'default'), 'Ir': ((0.0901961, 0.329412, 0.529412), 1, u'default'), 'Am': ((0.329412, 0.360784, 0.94902), 1, u'default'), 'Al': ((0.74902, 0.65098, 0.65098), 1, u'default'), 'As': ((0.741176, 0.501961, 0.890196), 1, u'default'), 'Ar': ((0.501961, 0.819608, 0.890196), 1, u'default'), 'Au': ((1, 0.819608, 0.137255), 1, u'default'), 'Es': ((0.701961, 0.121569, 0.831373), 1, u'default'), 'In': ((0.65098, 0.458824, 0.45098), 1, u'default'), 'Mo': ((0.329412, 0.709804, 0.709804), 1, u'default') } materials = {u'default': ((0.85, 0.85, 0.85), 30)} pbInfo = { 'category': [u'distance monitor'], 'bondInfo': [{ 'color': (5, None, {}), 'atoms': [[16, 13], [16, 11], [22, 20], [18, 6], [12, 18]], 'label': (5, u'2.335\xc5', { u'0.846\xc5': [0], u'0.797\xc5': [1], u'0.000\xc5': [3], u'1.168\xc5': [2] }), 'halfbond': (5, False, {}), 'labelColor': (5, None, {}), 'labelOffset': (5, chimera.Vector(-1e+99, 0.0, 0.0), { chimera.Vector(-1e+99, 0.0, 0.0): [3], chimera.Vector(-1e+99, 0.0, 0.0): [1], chimera.Vector(-1e+99, 0.0, 0.0): [0], chimera.Vector(-1e+99, 0.0, 0.0): [4] }), 'drawMode': (5, 0, {}), 'display': (5, 2, {}) }], 'lineType': (1, 2, {}), 'color': (1, 6, {}), 'optional': { 'fixedLabels': (True, False, (1, False, {})) }, 'display': (1, True, {}), 'showStubBonds': (1, False, {}), 'lineWidth': (1, 1, {}), 'stickScale': (1, 1, {}), 'id': [-2] } modelAssociations = {} colorInfo = (8, (u'H', (1, 1, 1, 1)), { (u'green', (0, 1, 0, 1)): [7], (u'O', (1, 0.0509804, 0.0509804, 1)): [4], (u'sky blue', (0.529412, 0.807843, 0.921569, 1)): [1], (u'tan', (0.823529, 0.705882, 0.54902, 1)): [0], (u'plum', (0.866667, 0.627451, 0.866667, 1)): [2], (u'gray', (0.745, 0.745, 0.745, 1)): [3], (u'yellow', (1, 1, 0, 1)): [6] }) viewerInfo = { 'cameraAttrs': { 'center': (-1.3921506511017, 0.021210263279751, 3.5953628871827), 'fieldOfView': 18.537294142553, 'nearFar': (7.8705550310897, -0.071197851695135), 'ortho': False, 'eyeSeparation': 50.8, 'focal': -3.183 }, 'viewerAttrs': { 'silhouetteColor': None, 'clipping': False, 'showSilhouette': False, 'showShadows': False, 'viewSize': 5.5016586772818, 'labelsOnTop': True, 'depthCueRange': (0.5, 1), 'silhouetteWidth': 2, 'singleLayerTransparency': True, 'shadowTextureSize': 2048, 'backgroundImage': [None, 1, 2, 1, 0, 0], 'backgroundGradient': [('Chimera default', [(1, 1, 1, 1), (0, 0, 1, 1)], 1), 1, 0, 0], 'depthCue': True, 'highlight': 0, 'scaleFactor': 1.5264412841657, 'angleDependentTransparency': True, 'backgroundMethod': 0 }, 'viewerHL': 7, 'cameraMode': 'mono', 'detail': 1.5, 'viewerFog': None, 'viewerBG': None } replyobj.status("Initializing session restore...", blankAfter=0, secondary=True) from SimpleSession.versions.v65 import expandSummary init(dict(enumerate(expandSummary(colorInfo)))) replyobj.status("Restoring colors...", blankAfter=0, secondary=True) restoreColors(colors, materials) replyobj.status("Restoring molecules...", blankAfter=0, secondary=True) restoreMolecules(molInfo, resInfo, atomInfo, bondInfo, crdInfo) replyobj.status("Restoring surfaces...", blankAfter=0, secondary=True) restoreSurfaces(surfInfo) replyobj.status("Restoring VRML models...", blankAfter=0, secondary=True) restoreVRML(vrmlInfo) replyobj.status("Restoring pseudobond groups...", blankAfter=0, secondary=True) restorePseudoBondGroups(pbInfo) replyobj.status("Restoring model associations...", blankAfter=0, secondary=True) restoreModelAssociations(modelAssociations) replyobj.status("Restoring camera...", blankAfter=0, secondary=True) restoreViewer(viewerInfo)
def LineCC(self): dmap = segmentation_map() if dmap == None: umsg("No map selected") return from chimera import Molecule mlist = OML(modelTypes=[Molecule]) if len(mlist) == 0: umsg("No molecule found") return mol = mlist[0] print "Doing line CC in " + dmap.name + " using mol " + mol.name print dmap.openState.xform print mol.openState.xform rccs = [] rmap = None rmap_pos = None rpoints, rpoint_weights = None, None xf = None resolution = 10.0 for ri, res in enumerate(mol.residues): try: cat = res.atomsMap["CA"][0] except: continue if rmap == None: rmap = makeMap("#%d:%d@CA" % (mol.id, res.id.position), resolution, 1, (.5, .5, .5, 1.0), "resmap") rmap_pos = cat.coord().toVector() print " - sphere map pos ", rmap_pos #rpoints, rpoint_weights = fit_points (rmap) rpoints, rpoint_weights = fit_points_old(rmap) xf = rmap.openState.xform break for radi in range(0, 1300, 1): #d = cat.coord() - rmap_pos d = chimera.Vector(0, 0, radi) - rmap_pos #print chimera.Vector(0,0,radi) trx = chimera.Xform.translation(d) #xf = dmap.openState.xform.inverse xf2 = xf.__copy__() xf2.multiply(trx) rmap.openState.xform = xf2 break if 1: rmap_values = dmap.interpolated_values(rpoints, xf2) olap, corr = overlap_and_correlation(rpoint_weights, rmap_values) if radi % 100 == 0: print " %d - overlap: %f, cross-correlation: %f" % ( radi, olap, corr) rccs.append([radi, corr]) #print corr, #chimera.openModels.close ( rmap ) fp = open("lineCC.txt", "w") for rad, cc in rccs: fp.write("%d\t%f\n" % (rad, cc)) fp.close()
pyrimidine_min[1] = min[1] if pyrimidine_min[2] > min[2]: pyrimidine_min[2] = min[2] if pyrimidine_max[0] < max[0]: pyrimidine_max[0] = max[0] if pyrimidine_max[1] < max[1]: pyrimidine_max[1] = max[1] if pyrimidine_max[2] < max[2]: pyrimidine_max[2] = max[2] pu = (purine_max[1] - purine_min[1]) py = (pyrimidine_max[1] - pyrimidine_min[1]) purine_pyrimidine_ratio = pu / (pu + py) del b, coord, min, max, pu, py # precompute z-plane rotation correction factor zAxis = chimera.Vector(0, 0, 1) for b in standard_bases.values(): pts = [chimera.Point(*b[n]) for n in b["ring atom names"][0:2]] yAxis = pts[0] - pts[1] yAxis.normalize() yAxis.z = 0.0 # should be zero already # insurance, so yAxis is perpendicular to zAxis xAxis = chimera.cross(yAxis, zAxis) xf = chimera.Xform.xform( xAxis[0], yAxis[0], zAxis[0], 0.0, xAxis[1], yAxis[1], zAxis[1], 0.0, xAxis[2], yAxis[2], zAxis[2], 0.0, orthogonalize=True ) # we can work in 2d because we know atoms are in z=0 plane #coords = [b[a][0:2] for a in atoms]
def Icos2(self): imod = self.GetMod("Icosahedron") axmods = [] for m in chimera.openModels.list(): if m.name == "Icosahedron Faces": axmods.append(m) if len(axmods) > 0: chimera.openModels.close(axmods) if imod == None: self.umsg("No Icosahedron model found - please follow step 2.") return if len(imod.surfacePieces) <> 1: self.umsg("Please set 'Subdivision factor' to 1") return print len(imod.surfacePieces[0].geometry[1]), " tris" print len(imod.surfacePieces[0].geometry[0]), " verts" if len(imod.surfacePieces[0].geometry[1]) <> 20: self.umsg("Please set 'Subdivision factor' to 1") return self.umsg("Building Icos2") import _surface surf_mod = _surface.SurfaceModel() surf_mod.name = "Icosahedron Faces" chimera.openModels.add([surf_mod], sameAs=imod) import axes reload(axes) self.icos_vecs = [] from numpy import arccos, pi for p in imod.surfacePieces: v, t = p.geometry[0], p.geometry[1] #print len(v), len(t) #for pt in v : # print " - pt: ", pt surf_mod.icosVerts0 = numpy.copy(v) surf_mod.icosVerts = numpy.copy(v) surf_mod.icosTris = numpy.copy(t) surf_mod.nvecs = numpy.zeros((len(t), 3)) surf_mod.sps = [] for ti, tri in enumerate(t): #print " - tri: ", tri, p1 = v[tri[0]] p2 = v[tri[1]] p3 = v[tri[2]] mp = (p1 + p2 + p3) / 3.0 pv = chimera.Vector(mp[0], mp[1], mp[2]) r = pv.length pv.normalize() #print mp #self.icos_vecs.append ( pv ) mp = mp / r #cyl = axes.AddCylinderSolid ( chimera.Vector(0,0,0), pv, r, (.6,.4,.4,1), 10.0, surf_mod ) #cyl.name = "Icosahedron_Axes" sp = axes.TriangleMeshDiv(p1, p2, p3, 50.0, None, None, surf_mod) #sp = surf_mod.surfacePieces [ len(surf_mod.surfacePieces)-1 ] sp.N = numpy.array(pv, numpy.float32) #surf_mod.nvecs.append ( mp ) surf_mod.nvecs[ti] = mp surf_mod.sps.append(sp) sp.ind = ti #p1v = chimera.Vector ( p1[0], p1[1], p1[2] ); p1v.normalize () #p2v = chimera.Vector ( p2[0], p2[1], p2[2] ); p2v.normalize () #p3v = chimera.Vector ( p3[0], p3[1], p3[2] ); p3v.normalize () #a1 = arccos ( p1v * pv ) * 180.0 / pi #a2 = arccos ( p2v * pv ) * 180.0 / pi #a3 = arccos ( p3v * pv ) * 180.0 / pi #a12 = arccos ( p1v * p2v ) * 180.0 / pi #print a1, a2, a3, a12 #if ti >= 0 : # break p1 = surf_mod.icosVerts0[surf_mod.icosTris[0][0]] r0 = numpy.sqrt(numpy.sum(p1 * p1)) self.umsg("Made Icos2 from %d sps in %s -> %d sps, rad %.1f" % (len( imod.surfacePieces), imod.name, len(surf_mod.surfacePieces), r0)) self.rad.set(r0)
def ReadMesh (patchpts = None, pos=Vector(0,0,0)) : m = _surface.Surface_Model() com = Vector (0,0,0) rad = Vector (0,0,0) numv = 0 aV = [] fp = open ( "C:\\greg\\chimera\\Blob\\psu_points.txt", 'r' ) for line in fp : n = line.split(',') for i in range( len(n) ) : c = n[i].split() if len(c) == 3 : #v = numpy.array([[float(c[0]),float(c[1]),float(c[2])]], 'f' ) aV = aV + [ [float(c[0]), float(c[1]), float(c[2])], ] numv = numv + 1 v = Vector ( float(c[0]), float(c[1]), float(c[2]) ) com = com + v if v.length > rad.length : rad = v fp.close() v = numpy.array( aV, 'f' ) print "COM:", com/float(numv) print "Rad:", rad.length scale = 1.0/rad.length xf = chimera.Xform.rotation ( Vector(0,0,1), 180 ) xf.multiply ( chimera.Xform.rotation ( Vector(1,0,0), -90 ) ) for i in range (numv) : vec = xf.apply ( Vector ( v[i][0], v[i][1], v[i][2] ) * scale ) v[i][0] = vec.x v[i][1] = vec.y v[i][2] = vec.z vi = [] vs = [] fp = open ( "C:\\greg\\chimera\\Blob\\psu_tris.txt", 'r' ) for line in fp : n = line.split(',') for t in n : try : ivi = int(t) if ivi == -1 : #print 'tri', vs vi = vi + [vs] vs = [] else : vs = vs + [ivi] except: #print "bad token:", t continue fp.close() color = (0.6039, 0.8431, 0.898, 1.0) sph = m.add_group( v, vi, color ) #sph.set_display_style(sph.Mesh) if patchpts : vcolors = () for i in range ( len(v) ) : vp = chimera.Vector ( v[i][0], v[i][1], v[i][2] ) - pos inP = None for pt in patchpts: if (pt[0] - vp).length < (1.0/2.5) : inP = pt[1] break if inP : if inP < 0.0 : vcolors = vcolors + ( (-inP*.6+.4, .4, .4, 1), ) else : vcolors = vcolors + ( (.4, .4, inP*.6+.4, 1), ) else : vcolors = vcolors + ( (color), ) print len ( vcolors ), len ( v ) sph.set_vertex_colors( vcolors ) chimera.openModels.add([m]) return m