Ejemplo n.º 1
0
def spine(operation,
          regions,
          spacing=None,
          tipLength=None,
          color=None,
          showDiameter=False):

    sel = parse_object_specifier(regions, 'segmentation region')

    import Surface
    plist = Surface.selected_surface_pieces(sel, include_outline_boxes=False)
    from Segger.regions import Segmentation
    rlist = [
        p.region for p in plist
        if (hasattr(p, 'region') and isinstance(p.model, Segmentation))
    ]
    if len(rlist) == 0:
        raise CommandError('No segmentation regions specified: "%s"' % regions)

    if not (spacing is None or isinstance(spacing,
                                          (int, float)) and spacing > 0):
        raise CommandError('spacing must be positive numeric value')
    if not (tipLength is None or isinstance(tipLength,
                                            (int, float)) and tipLength > 0):
        raise CommandError('tipLength must be positive numeric value')

    if not color is None:
        from Commands import parse_color
        color = parse_color(color)

    if showDiameter:
        from _surface import SurfaceModel
        diam_model = SurfaceModel()
        diam_model.name = 'Diameters'
        from chimera import openModels
        openModels.add([diam_model], sameAs=rlist[0].segmentation)
    else:
        diam_model = None

    import spine
    from chimera import replyobj
    from PathLength import path_length
    for r in rlist:
        mset = spine.trace_spine(r, spacing, tipLength, color)
        slen = path_length([l.bond for l in mset.links()])
        r.set_attribute('spine length', slen)
        msg = 'Spine length for region %d is %.4g' % (r.rid, slen)
        dmax, dmin = spine.measure_diameter(r, mset, diam_model)
        if not dmax is None:
            r.set_attribute('diameter1', dmax)
            r.set_attribute('diameter2', dmin)
            msg += ', diameters %.4g, %.4g' % (dmax, dmin)
        kave, kmin, kmax = spine.measure_curvature(mset)
        if not kmax is None:
            r.set_attribute('curvature average', kave)
            r.set_attribute('curvature minimum', kmin)
            r.set_attribute('curvature maximum', kmax)
            msg += ', curvature %.4g (ave), %.4g (max), %.4g (min)' % (
                kave, kmax, kmin)
        replyobj.info(msg + '\n')
Ejemplo n.º 2
0
    def show_cb(self, event=None, model_id=None):

        radius = self.radius.value(self.default_radius)
        sphere_factor = self.sphere_factor.value(0)
        surface_style = self.surface_style.get()
        orientation = self.orientation_name()
        subdivision_levels = self.subdivision_levels(radius)

        if self.surface_model == None:
            import _surface
            sm = _surface.SurfaceModel()
            sm.name = 'Icosahedron'
            self.surface_model = sm
            import chimera
            chimera.addModelClosedCallback(sm, self.surface_closed_cb)
            self.surface_piece = None

        from Icosahedron import make_icosahedron_surface
        p = make_icosahedron_surface(radius, orientation, subdivision_levels,
                                     sphere_factor, surface_style,
                                     self.color.rgba, self.surface_model)

        if self.surface_piece:
            self.surface_model.removePiece(self.surface_piece)
        else:
            from chimera import openModels as om
            if model_id is None:
                id = subid = om.Default
            else:
                id, subid = model_id
            om.add([self.surface_model], baseId=id, subid=subid)

        self.surface_piece = p
Ejemplo n.º 3
0
def make_molecule_map(atoms, resolution, step, pad, cutoff_range,
                      sigma_factor, display_threshold, model_id, replace,
		      show_dialog):

    atoms = tuple(atoms)

    grid, molecules = molecule_grid_data(atoms, resolution, step, pad,
                                         cutoff_range, sigma_factor)

    from chimera import openModels as om
    if replace:
        from VolumeViewer import volume_list
        vlist = [v for v in volume_list()
                 if getattr(v, 'molmap_atoms', None) == atoms]
        om.close(vlist)

    from VolumeViewer import volume_from_grid_data
    v = volume_from_grid_data(grid, open_model = False,
                              show_dialog = show_dialog)
    v.initialize_thresholds(mfrac = (display_threshold, 1), replace = True)
    v.show()

    v.molmap_atoms = tuple(atoms)   # Remember atoms used to calculate volume
    v.molmap_parameters = (resolution, step, pad, cutoff_range, sigma_factor)

    if len(molecules) == 1 and model_id is None:
        om.add([v], sameAs = tuple(molecules)[0])
    else:
        if model_id is None:
            model_id = (om.Default, om.Default)
        om.add([v], baseId = model_id[0], subid = model_id[1])
        v.openState.xform = atoms[0].molecule.openState.xform

    return v
def subdivide_op(surfaces, spacing = None, inPlace = False, modelId = None):

    from Commands import parse_surface_pieces, check_number, parse_model_id
    plist = parse_surface_pieces(surfaces)
    if len(plist) == 0:
        raise CommandError, 'No surfaces specified'
    if spacing is None:
        raise CommandError, 'Must specify mesh spacing'
    check_number(spacing, 'spacing', positive = True)
    model_id = parse_model_id(modelId)
    if inPlace:
        s = None
    else:
        from _surface import SurfaceModel
        s = SurfaceModel()
        s.name = 'finer mesh'
        from chimera import openModels as om
        if model_id:
            id, subid = model_id
        else:
            id, subid = om.Default, om.Default
        om.add([s], baseId = id, subid = subid)
        s.openState.xform = plist[0].model.openState.xform
    from subdivide import subdivide
    for p in plist:
        np = subdivide(p, spacing, s)
        if np != p:
            np.save_in_session = True
Ejemplo n.º 5
0
  def show_cb(self, event = None, model_id = None):

    radius = self.radius.value(self.default_radius)
    sphere_factor = self.sphere_factor.value(0)
    surface_style = self.surface_style.get()
    orientation = self.orientation_name()
    subdivision_levels = self.subdivision_levels(radius)

    if self.surface_model == None:
      import _surface
      sm = _surface.SurfaceModel()
      sm.name = 'Icosahedron'
      self.surface_model = sm
      import chimera
      chimera.addModelClosedCallback(sm, self.surface_closed_cb)
      self.surface_piece = None

    from Icosahedron import make_icosahedron_surface
    p = make_icosahedron_surface(radius, orientation, subdivision_levels,
                                 sphere_factor, surface_style, self.color.rgba,
                                 self.surface_model)
    
    if self.surface_piece:
      self.surface_model.removePiece(self.surface_piece)
    else:
      from chimera import openModels as om
      if model_id is None:
        id = subid = om.Default
      else:
        id, subid = model_id
      om.add([self.surface_model], baseId = id, subid = subid)

    self.surface_piece = p
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)
Ejemplo n.º 7
0
def create_patch(v, n, t, surf, color, offset = 0, slab = None):

  from _surface import SurfaceModel
  s = SurfaceModel()
  s.name = 'contact patch'
  from chimera import openModels as om
  om.add([s])
  s.openState.xform = surf.openState.xform

  p = s.newPiece()
  p.color = color
  p.save_in_session = True

  if offset:
    vo = v.copy()
    vo += n*offset
    p.geometry = vo,t
    p.normals = n

  if slab:
    from Mask import depthmask
    vs, ns, ts = depthmask.slab_surface(v, t, n, slab, sharp_edges = True)
    p.geometry = vs,ts
    p.normals = ns

  return p
Ejemplo n.º 8
0
def make_molecule_map(atoms, resolution, step, pad, cutoff_range, sigma_factor,
                      display_threshold, model_id, replace, show_dialog):

    atoms = tuple(atoms)

    grid, molecules = molecule_grid_data(atoms, resolution, step, pad,
                                         cutoff_range, sigma_factor)

    from chimera import openModels as om
    if replace:
        from VolumeViewer import volume_list
        vlist = [
            v for v in volume_list()
            if getattr(v, 'molmap_atoms', None) == atoms
        ]
        om.close(vlist)

    from VolumeViewer import volume_from_grid_data
    v = volume_from_grid_data(grid, open_model=False, show_dialog=show_dialog)
    v.initialize_thresholds(mfrac=(display_threshold, 1), replace=True)
    v.show()

    v.molmap_atoms = tuple(atoms)  # Remember atoms used to calculate volume
    v.molmap_parameters = (resolution, step, pad, cutoff_range, sigma_factor)

    if len(molecules) == 1 and model_id is None:
        om.add([v], sameAs=tuple(molecules)[0])
    else:
        if model_id is None:
            model_id = (om.Default, om.Default)
        om.add([v], baseId=model_id[0], subid=model_id[1])
        v.openState.xform = atoms[0].molecule.openState.xform

    return v
Ejemplo n.º 9
0
def show_ellipsoid(axes, d2, center, model):

    from math import sqrt
    d = [sqrt(e) for e in d2]
    sm = ellipsoid_surface(center, axes, d)
    sm.name = 'inertia ellipsoid for %s' % m.name
    from chimera import openModels as om
    om.add([sm], sameAs=model)
Ejemplo n.º 10
0
def surface_model(surface, xf, name):

    if surface is None:
        import _surface
        s = _surface.SurfaceModel()
        s.name = name
        from chimera import openModels as om
        om.add([s])
        s.openState.xform = xf
        return s
    return surface
Ejemplo n.º 11
0
def surface_model(surface, xf, name):

  if surface is None:
    import _surface
    s = _surface.SurfaceModel()
    s.name = name
    from chimera import openModels as om
    om.add([s])
    s.openState.xform = xf
    return s
  return surface
Ejemplo n.º 12
0
def new_surface(name, align_to, model_id):
    from _surface import SurfaceModel
    s = SurfaceModel()
    s.name = name
    from chimera import openModels as om
    if model_id:
        id, subid = model_id
    else:
        id, subid = om.Default, om.Default
    om.add([s], baseId=id, subid=subid)
    s.openState.xform = align_to.openState.xform
    return s
Ejemplo n.º 13
0
def create_symmetry_copies(mol,
                           csys,
                           tflist,
                           cdist,
                           rdist,
                           exclude_identity=True):

    if exclude_identity:
        from Matrix import is_identity_matrix
        tflist = [tf for tf in tflist if not is_identity_matrix(tf)]

    close_contacts = not cdist is None
    close_centers = not rdist is None
    if not close_contacts and not close_centers:
        transforms = tflist  # Use all transforms
    elif close_contacts and not close_centers:
        transforms = contacting_transforms(mol, csys, tflist, cdist)
    elif close_centers and not close_contacts:
        transforms = close_center_transforms(mol, csys, tflist, rdist)
    else:
        transforms = unique(
            contacting_transforms(mol, csys, tflist, cdist) +
            close_center_transforms(mol, csys, tflist, rdist))

    if hasattr(mol, 'symmetry_copies'):
        remove_symmetry_copies(mol)

    copies = []
    from chimera import openModels, replyobj
    from PDBmatrices import copy_molecule
    from Matrix import chimera_xform
    for tf in transforms:
        copy = copy_molecule(mol)
        copy.symmetry_xform = chimera_xform(tf)
        copies.append(copy)
        replyobj.status('Created symmetry copy %d of %d' %
                        (len(copies), len(transforms)))

    if len(copies) == 0:
        return copies

    openModels.add(copies)
    replyobj.status('')

    mol.symmetry_copies = copies
    mol.symmetry_reference_model = csys

    # TODO: Set xform before opening so that code that detects open sees
    # the correct position.  Currently not possible.  Bug 4486.
    update_symmetry_positions(mol)

    return copies
Ejemplo n.º 14
0
def show_slabs(xf, color, center, os):

    # Make schematic illustrating rotation
    if color is None:
        color = (.7, .7, .7, 1)
    import MatchDomains
    sm = MatchDomains.transform_schematic(xf, center, color, color)
    if sm:
        sm.name = 'slabs'
        from chimera import openModels as om
        om.add([sm])
        sm.openState.xform = os.xform
    return sm
Ejemplo n.º 15
0
def surface_model(model_id, shape_name, coord_xform = None):

    s = find_surface_model(model_id)
    if s is None:
        from _surface import SurfaceModel
        s = SurfaceModel()
        s.name = shape_name
        from chimera import openModels as om
        if model_id is None:
            model_id = (om.Default, om.Default)
        om.add([s], baseId = model_id[0], subid = model_id[1])
        if coord_xform:
            s.openState.xform = coord_xform
    return s
Ejemplo n.º 16
0
    def marker_molecule(self, model_id=None):

        if self.molecule == None:
            from chimera import Molecule, openModels
            m = Molecule()
            m.name = self.name
            if model_id == None:
                id = subid = openModels.Default
            else:
                id, subid = model_id
            self.set_marker_molecule(m)
            openModels.add([m], baseId=id, subid=subid, noprefs=True)

        return self.molecule
def surface_model(model_id, shape_name, coord_xform=None):

    s = find_surface_model(model_id)
    if s is None:
        from _surface import SurfaceModel
        s = SurfaceModel()
        s.name = shape_name
        from chimera import openModels as om
        if model_id is None:
            model_id = (om.Default, om.Default)
        om.add([s], baseId=model_id[0], subid=model_id[1])
        if coord_xform:
            s.openState.xform = coord_xform
    return s
def test():
    from numpy import array, float32, int32
    varray = array(((0, 0, 0), (5.1, 0, 0), (5.1, 8.5, 0)), float32)
    narray = array(((0, 0, 1), (0, 0, 1), (0, 0, 1)), float32)
    tarray = array(((0, 1, 2), ), int32)
    elength = 1
    va, ta = subdivided_geometry(varray, tarray, narray, elength)
    import _surface
    s = _surface.SurfaceModel()
    color = (1, 1, 1, 1)
    p = s.addPiece(va, ta, color)
    p.displayStyle = p.Mesh
    from chimera import openModels as om
    om.add([s])
Ejemplo n.º 19
0
def create_surface(va, ta, color, v, model_id):

    import _surface
    s = _surface.SurfaceModel()
    s.name = '%s field lines' % v.name
    p = s.addPiece(va, ta, color)
    p.save_in_session = True

    from chimera import openModels, OpenModels
    id, subid = ((OpenModels.Default,
                  OpenModels.Default) if model_id is None else model_id)
    openModels.add([s], baseId=id, subid=subid)
    s.openState.xform = v.openState.xform
    return p
Ejemplo n.º 20
0
def distance(operation,
             object1,
             object2,
             multiple=False,
             show=False,
             color=(0, 1, 1, 1)):

    a1 = object1.atoms()
    import Surface as s
    s1 = s.selected_surface_pieces(object1, include_outline_boxes=False)

    if len(a1) == 0 and len(s1) == 0:
        raise CommandError('No atoms or surfaces specified')

    a2 = object2.atoms()
    s2 = s.selected_surface_pieces(object2, include_outline_boxes=False)

    if len(a2) == 0 and len(s2) == 0:
        raise CommandError('No target atoms or surfaces')

    # Remove near stuff.
    if a1:
        a2 = list(set(a2).difference(a1))
    if s1:
        s2 = list(set(s2).difference(s1))

    name2 = object_name(a2, s2)
    xyz2 = point_array(a2, s2)

    if show:
        from Commands import parse_color
        color = parse_color(color)
        from _surface import SurfaceModel
        surf = SurfaceModel()
        surf.name = 'Distance measurement'
        from chimera import openModels
        openModels.add([surf])
    else:
        surf = None

    if multiple:
        pairs = [([a], []) for a in a1] + [([], [s]) for s in s1]
    else:
        pairs = [(a1, s1)]

    for a, s in pairs:
        name = object_name(a, s)
        xyz = point_array(a, s)
        report_distance(xyz, xyz2, name, name2, surf, color)
Ejemplo n.º 21
0
    def place_copies(self):

        from chimera import Molecule, openModels as om
        from Molecule import copy_molecule

        mxf_list = [(m,xf) for m,xf in self.model_xforms()
                    if isinstance(m, Molecule)]
        copies = [copy_molecule(m) for m, xf in mxf_list]
        if copies:
            om.add(copies)

        for c, (m,xf) in zip(copies, mxf_list):
            c.openState.xform = xf

        return copies
Ejemplo n.º 22
0
def make_molecule_copies(m, xflist, names):

    from chimera import openModels
    from PDBmatrices import copy_molecule

    mclist = []
    for c, xf in enumerate(xflist):
        mc = copy_molecule(m)
        mclist.append(mc)
        mc.name = names[c]
        openModels.add([mc])
        mcxf = m.openState.xform
        mcxf.multiply(xf)
        mc.openState.xform = mcxf

    return mclist
Ejemplo n.º 23
0
def make_molecule_copies(m, xflist, names):

    from chimera import openModels
    from PDBmatrices import copy_molecule

    mclist = []
    for c, xf in enumerate(xflist):
        mc = copy_molecule(m)
        mclist.append(mc)
        mc.name = names[c]
        openModels.add([mc])
        mcxf = m.openState.xform
        mcxf.multiply(xf)
        mc.openState.xform = mcxf

    return mclist
Ejemplo n.º 24
0
def create_symmetry_copies(mol, csys, tflist, cdist, rdist,
                           exclude_identity = True):

    if exclude_identity:
        from Matrix import is_identity_matrix
        tflist = [tf for tf in tflist if not is_identity_matrix(tf)]

    close_contacts = not cdist is None
    close_centers = not rdist is None
    if not close_contacts and not close_centers:
        transforms = tflist     # Use all transforms
    elif close_contacts and not close_centers:
        transforms = contacting_transforms(mol, csys, tflist, cdist)
    elif close_centers and not close_contacts:
        transforms = close_center_transforms(mol, csys, tflist, rdist)
    else:
        transforms = unique(contacting_transforms(mol, csys, tflist, cdist) +
                            close_center_transforms(mol, csys, tflist, rdist))

    if hasattr(mol, 'symmetry_copies'):
        remove_symmetry_copies(mol)

    copies = []
    from chimera import openModels, replyobj
    from PDBmatrices import copy_molecule
    from Matrix import chimera_xform
    for tf in transforms:
        copy = copy_molecule(mol)
        copy.symmetry_xform = chimera_xform(tf)
        copies.append(copy)
        replyobj.status('Created symmetry copy %d of %d'
                        % (len(copies), len(transforms)))

    if len(copies) == 0:
        return copies

    openModels.add(copies)
    replyobj.status('')

    mol.symmetry_copies = copies
    mol.symmetry_reference_model = csys

    # TODO: Set xform before opening so that code that detects open sees
    # the correct position.  Currently not possible.  Bug 4486.
    update_symmetry_positions(mol)

    return copies
Ejemplo n.º 25
0
def show_slabs(xf, color, os):

    # Make schematic illustrating rotation
    if color is None:
        color = (.7,.7,.7,1)
    have_box, box = os.bbox()
    if not have_box:
        return
    center = box.center().data()
    import MatchDomains
    sm = MatchDomains.transform_schematic(xf, center, color, color)
    if sm:
        sm.name = 'slabs'
        from chimera import openModels as om
        om.add([sm])
        sm.openState.xform = os.xform
    return sm
Ejemplo n.º 26
0
def create_volume_plane_surface(volume, height, interpolate = 'cubic',
                                mesh = 'isotropic', colormap = 'rainbow',
                                smoothing_factor = 0.3,
                                smoothing_iterations = 0,
                                color = (.7, .7, .7, 1),
                                replace = True):

    m = volume.matrix()
    axes = [a for a in range(3) if m.shape[2-a] == 1]
    if len(axes) != 1:
        from chimera.replyobj import warning
        warning('Volume %s has more than one plane shown (%d,%d,%d)' %
                ((volume.name,) + tuple(reversed(m.shape))))
        return
    axis = axes[0]
    m = m.squeeze()     # Convert 3d array to 2d

    tf = volume.matrix_indices_to_xyz_transform()
    perm = {0: ((0,0,1,0),(1,0,0,0),(0,1,0,0)),     # 2d matrix xyh -> 3d yzx
            1: ((1,0,0,0),(0,0,1,0),(0,1,0,0)),     # 2d matrix xyh -> 3d xzy
            2: ((1,0,0,0),(0,1,0,0),(0,0,1,0))}[axis]
    from Matrix import multiply_matrices
    tf = multiply_matrices(tf, perm)
    
    s = create_surface(m, height, tf, color, interpolate, mesh,
                       smoothing_factor, smoothing_iterations)
    s.name = volume.name + ' height'

    if colormap == 'rainbow':
        invert = not height is None and height < 0
        tf = volume.data.ijk_to_xyz_transform
        normal = [tf[i][axis] for i in range(3)]
        colormap_surface(s, normal, rainbow_colormap(invert))

    from chimera import openModels
    if replace:
        openModels.close([m for m in openModels.list()
                          if getattr(m, 'topography_volume', None) == volume])
    openModels.add([s])
    s.openState.xform = volume.model_transform()
    s.topography_volume = volume

    return s
Ejemplo n.º 27
0
  def create_object(self):

    from _surface import SurfaceModel
    sm = SurfaceModel()

    sm.piecesAreSelectable = self.pieces_are_selectable
    if self.version >= 2:
      sm.oneTransparentLayer = self.one_transparent_layer

    for ps in self.surface_piece_states:
      ps.create_object(sm)

    sms = self.surface_model
    from SimpleSession import modelOffset
    from chimera import openModels as om
    om.add([sm], baseId = sms.id + modelOffset, subid = sms.subid)
    sms.restore_state(sm)

    return sm
Ejemplo n.º 28
0
    def create_object(self):

        from _surface import SurfaceModel
        sm = SurfaceModel()

        sm.piecesAreSelectable = self.pieces_are_selectable
        if self.version >= 2:
            sm.oneTransparentLayer = self.one_transparent_layer

        for ps in self.surface_piece_states:
            ps.create_object(sm)

        sms = self.surface_model
        from SimpleSession import modelOffset
        from chimera import openModels as om
        om.add([sm], baseId=sms.id + modelOffset, subid=sms.subid)
        sms.restore_state(sm)

        return sm
Ejemplo n.º 29
0
def createCN(): 						
		cn= Molecule() 					# create an instance of a molecule

		# r = cn.newResidue(residue type, chain identifier, sequence number, insertion code)
		r = cn.newResidue("cn", " ", 1, " ")

		atomC = cn.newAtom("CE", Element("C")) 				# now create the atoms of the residue. 
		atomN = cn.newAtom("NF", Element("N"))

		bondLength_cn = 1.156
		
		atomC.setCoord(Coord(0, 0, 0))
		atomN.setCoord(Coord(bondLength_cn, 0, 0))
		
		r.addAtom(atomC)
		r.addAtom(atomN)

		cn.newBond(atomC, atomN)
		openModels.add([cn])
Ejemplo n.º 30
0
def tube_surface_piece(ptlist,
                       pcolors,
                       radius,
                       circle_subdivisions,
                       surface_model=None,
                       model_id=None):

    nz = len(ptlist)
    nc = circle_subdivisions
    height = 0
    from Shape.shapecmd import cylinder_geometry
    varray, tarray = cylinder_geometry(radius, height, nz, nc, caps=True)
    tflist = extrusion_transforms(ptlist)
    # Transform circles.
    from _contour import affine_transform_vertices
    for i in range(nz):
        affine_transform_vertices(varray[nc * i:nc * (i + 1), :], tflist[i])
    # Transform cap center points
    affine_transform_vertices(varray[-2:-1, :], tflist[0])
    affine_transform_vertices(varray[-1:, :], tflist[-1])

    # Vertex colors.
    from numpy import empty, float32
    carray = empty((nz * nc + 2, 4), float32)
    for i in range(nz):
        carray[nc * i:nc * (i + 1), :] = pcolors[i]
    carray[-2, :] = pcolors[0]
    carray[-1, :] = pcolors[-1]

    if surface_model is None:
        import _surface
        surface_model = _surface.SurfaceModel()
        from chimera import openModels as om
        if model_id is None:
            model_id = (om.Default, om.Default)
        om.add([surface_model], baseId=model_id[0], subid=model_id[1])

    p = surface_model.addPiece(varray, tarray, (1, 1, 1, 1))
    p.vertexColors = carray
    if radius == 0:
        p.displayStyle = p.Mesh
        p.useLighting = False
    return p
    def show_outline_model(self, m, om=None):

        from PDBmatrices import crystal_parameters, cell_origin
        cp = crystal_parameters(pdb_headers(m))
        if cp == None:
            return
        a, b, c, alpha, beta, gamma, space_group, zvalue = cp

        from PDBmatrices.crystal import unit_cell_axes
        axes = unit_cell_axes(a, b, c, alpha, beta, gamma)
        from Molecule import molecule_center
        mc = molecule_center(m)
        origin = cell_origin(self.grid_origin(), axes, mc)
        color = (1, 1, 1)  # white

        b = outline_box(origin, axes, color, om)
        b.name = self.outline_model_name(m)
        if om is None:
            from chimera import openModels
            openModels.add([b], sameAs=m)
Ejemplo n.º 32
0
  def show_outline_model(self, m, om = None):

    from PDBmatrices import crystal_parameters, cell_origin
    cp = crystal_parameters(pdb_headers(m))
    if cp == None:
      return
    a, b, c, alpha, beta, gamma, space_group, zvalue = cp

    from PDBmatrices.crystal import unit_cell_axes
    axes = unit_cell_axes(a, b, c, alpha, beta, gamma)
    from Molecule import molecule_center
    mc = molecule_center(m)
    origin = cell_origin(self.grid_origin(), axes, mc)
    color = (1,1,1)                     # white

    b = outline_box(origin, axes, color, om)
    b.name = self.outline_model_name(m)
    if om is None:
      from chimera import openModels
      openModels.add([b], sameAs = m)
Ejemplo n.º 33
0
def illustrate_backbone_alignment():

    # Find atom pairs
    from chimera import selection
    a1, a2 = backbone_atom_pairs(selection.currentAtoms())
    if a1 == None:
        return

    # Compute alignment
    from chimera import match
    xform, rmsd = match.matchAtoms(a1, a2)

    # Find aligning transformation to apply to molecule 2 object coordinates
    m1 = a1[0].molecule
    m2 = a2[0].molecule
    xf = m1.openState.xform
    xf.multiply(xform)  # New m2 transform to align.
    inv_xf2 = m2.openState.xform
    inv_xf2.invert()
    xf.premultiply(inv_xf2)  # xform in m2 object coordinates

    # Make schematic illustrating rotation
    #    alpha = .5
    from_rgba = list(m2.color.rgba())
    #    from_rgba[3] = alpha
    to_rgba = list(m1.color.rgba())
    #    to_rgba[3] = alpha
    sm = transform_schematic(xf, center_of_atoms(a2), from_rgba, to_rgba)
    if sm:
        sm.name = 'Transform from %s to %s' % (m2.name, m1.name)
        from chimera import openModels
        openModels.add([sm], sameAs=m2)

    # Report atom count, rmsd, and angle
    axis, angle = xf.getRotation()
    from chimera import replyobj
    replyobj.status(
        'RMSD between %d atom pairs is %.3f angstroms, rotation angle = %.2f degrees\n'
        % (len(a1), rmsd, angle),
        log=True)
Ejemplo n.º 34
0
def tube_surface_piece(ptlist, pcolors, radius, circle_subdivisions,
                       surface_model = None, model_id = None):

    nz = len(ptlist)
    nc = circle_subdivisions
    height = 0
    from Shape.shapecmd import cylinder_geometry
    varray, tarray = cylinder_geometry(radius, height, nz, nc, caps = True)
    tflist = extrusion_transforms(ptlist)
    # Transform circles.
    from _contour import affine_transform_vertices
    for i in range(nz):
        affine_transform_vertices(varray[nc*i:nc*(i+1),:], tflist[i])
    # Transform cap center points
    affine_transform_vertices(varray[-2:-1,:], tflist[0])
    affine_transform_vertices(varray[-1:,:], tflist[-1])

    # Vertex colors.
    from numpy import empty, float32
    carray = empty((nz*nc+2,4), float32)
    for i in range(nz):
        carray[nc*i:nc*(i+1),:] = pcolors[i]
    carray[-2,:] = pcolors[0]
    carray[-1,:] = pcolors[-1]

    if surface_model is None:
        import _surface
        surface_model = _surface.SurfaceModel()
        from chimera import openModels as om
        if model_id is None:
            model_id = (om.Default, om.Default)
        om.add([surface_model], baseId = model_id[0], subid = model_id[1])
    
    p = surface_model.addPiece(varray, tarray, (1,1,1,1))
    p.vertexColors = carray
    if radius == 0:
        p.displayStyle = p.Mesh
        p.useLighting = False
    return p
Ejemplo n.º 35
0
def illustrate_backbone_alignment():

    # Find atom pairs
    from chimera import selection
    a1, a2 = backbone_atom_pairs(selection.currentAtoms())
    if a1 == None:
        return

    # Compute alignment
    from chimera import match
    xform, rmsd = match.matchAtoms(a1, a2)

    # Find aligning transformation to apply to molecule 2 object coordinates
    m1 = a1[0].molecule
    m2 = a2[0].molecule
    xf = m1.openState.xform
    xf.multiply(xform)                  # New m2 transform to align.
    inv_xf2 = m2.openState.xform
    inv_xf2.invert()
    xf.premultiply(inv_xf2)             # xform in m2 object coordinates

    # Make schematic illustrating rotation
#    alpha = .5
    from_rgba = list(m2.color.rgba())
#    from_rgba[3] = alpha
    to_rgba = list(m1.color.rgba())
#    to_rgba[3] = alpha
    sm = transform_schematic(xf, center_of_atoms(a2), from_rgba, to_rgba)
    if sm:
        sm.name = 'Transform from %s to %s' % (m2.name, m1.name)
        from chimera import openModels
        openModels.add([sm], sameAs = m2)

    # Report atom count, rmsd, and angle
    axis, angle = xf.getRotation()
    from chimera import replyobj
    replyobj.status('RMSD between %d atom pairs is %.3f angstroms, rotation angle = %.2f degrees\n'
                    % (len(a1), rmsd, angle), log = True)
Ejemplo n.º 36
0
def show_hk_lattice(h, k, radius, orientation = '222',
                    color_rgba = (1,1,1,1), mesh_line_thickness = 1,
                    sphere_factor = 0, replace = True):

    varray, tarray, hex_edges = hk_icosahedron_lattice(h,k,radius,orientation)
    interpolate_with_sphere(varray, radius, sphere_factor)

    # Make new surface model or find an existing one.
    sm = None
    open = False
    from chimera import openModels
    from _surface import SurfaceModel
    if replace:
        mlist = openModels.list(modelTypes = [SurfaceModel])
        mlist = [m for m in mlist if hasattr(m, 'hkcage')]
        if mlist:
            sm = mlist[0]
            for p in sm.surfacePieces:
                if hasattr(p, 'hkcage'):
                    sm.removePiece(p)
            open = True
    if sm is None:
        sm = SurfaceModel()
        sm.name = 'h = %d, k = %d lattice' % (h,k)
        sm.hkcage = True

    p = sm.addPiece(varray, tarray, color_rgba)
    p.hkcage = True
    p.lineThickness = mesh_line_thickness
    p.displayStyle = p.Mesh
    p.setEdgeMask(hex_edges)    # Hide spokes of hexagons.

    if not open:
        openModels.add([sm])

    return sm
def show_line_segments(v1, v2, color = (1,1,1,1), surface_model = None):

    n = len(v1)
    from numpy import empty, single as floatc, intc, arange
    varray = empty((2*n,3), floatc)
    tarray = empty((n,3), intc)
    varray[:n,:] = v1
    varray[n:,:] = v2
    tarray[:,0] = tarray[:,2] = arange(n)
    tarray[:,1] = tarray[:,0] + n

    create_model = (surface_model is None)
    if create_model:
        from _surface import SurfaceModel
        surface_model = SurfaceModel()

    p = surface_model.addPiece(varray, tarray, color)
    p.displayStyle = p.Mesh

    if create_model:
        from chimera import openModels as om
        om.add([surface_model])

    return p
Ejemplo n.º 38
0
class CombineDialog(ModelessDialog):
	title = "Copy/Combine Molecular Models"
	help = "UsersGuide/modelpanel.html#combine"

	def __init__(self, models=None):
		self.initModels = models
		ModelessDialog.__init__(self)

	def fillInUI(self, parent):
		from chimera.widgets import MoleculeScrolledListBox
		self.molListBox = MoleculeScrolledListBox(parent,
			listbox_selectmode='extended', labelpos='w',
			label_text="Molecules to combine/copy:")
		if self.initModels:
			self.molListBox.setvalue(self.initModels)
		self.molListBox.grid(row=0, column=0, columnspan=2,
							sticky="nsew")
		parent.rowconfigure(0, weight=1)
		parent.columnconfigure(1, weight=1)
		from chimera.tkoptions import StringOption, IntOption
		self.molNameEntry = StringOption(parent, 1, "New model's"
						" name", "combination", None)

		curIDs = set([i1 for i1, i2 in openModels.listIds()])
		mid = 0
		while mid in curIDs:
			mid += 1
		self.modelID = IntOption(parent, 2, "New model's ID", mid, None)

		from chimera.widgets import MoleculeOptionMenu
		self.refMolMenu = MoleculeOptionMenu(parent, labelpos='w',
			label_text="Coordinate system of:",
			initialitem=self.initModels[0])
		self.refMolMenu.grid(row=3, column=0, columnspan=2, sticky='w')

		import Pmw
		chb = self.chainHandlingButtons = Pmw.RadioSelect(parent,
			buttontype="radiobutton", labelpos='w',
			label_text="If original molecules have duplicate\n"
			"single-letter chain IDs, then:", orient="vertical")
		self.buttonTexts = ["rename them uniquely",
				"retain them (residues may be renumbered)"]
		for bt in self.buttonTexts:
			chb.add(bt)
		chb.setvalue(self.buttonTexts[0])
		chb.grid(row=4, column=0, columnspan=2)

		import Tkinter
		self.closeModelsVar = Tkinter.IntVar(parent)
		self.closeModelsVar.set(False)
		Tkinter.Checkbutton(parent, text="Close source models",
					variable=self.closeModelsVar).grid(
					row=5, column=0, columnspan=2)
			

	def Apply(self):
		mols = self.molListBox.getvalue()
		from chimera import UserError
		if not mols:
			self.enter()
			raise UserError("Must specify at least one molecular"
				" model to combine/copy")
		from chimera import suppressNewMoleculeProcessing, \
						restoreNewMoleculeProcessing
		suppressNewMoleculeProcessing()
		newChainIDs = (self.chainHandlingButtons.getvalue()
						== self.buttonTexts[0])
		refMol = self.refMolMenu.getvalue()
		from Combine import combine, CombineError
		try:
			m = combine(mols, refMol,
					newChainIDs=newChainIDs, log=True)
		except CombineError, v:
			restoreNewMoleculeProcessing()
			self.enter()
			raise UserError(v)
		m.name = self.molNameEntry.get()
		openModels.add([m], baseId=self.modelID.get(), shareXform=False)
		m.openState.xform = refMol.openState.xform
		restoreNewMoleculeProcessing()

		if self.closeModelsVar.get():
			openModels.close(mols)
Ejemplo n.º 39
0
	if refMol == None:
		refMol = mols[:1]
	if len(refMol) == 0:
		raise MidasError("No reference molecule specified")
	elif len(refMol) > 1:
		raise MidasError("Multiple reference molecules specified")
	refMol = refMol[0]
	if modelId is not None and type(modelId) != int:
		try:
			modelId = int(modelId[1:])
		except:
			raise MidasError("modelId value must be integer")
	from chimera import suppressNewMoleculeProcessing, \
					restoreNewMoleculeProcessing
	suppressNewMoleculeProcessing()
	try:
		m = combine(mols, refMol, newChainIDs=newChainIDs, log=log)
	except CombineError, v:
		restoreNewMoleculeProcessing()
		raise MidasError(v)
	from chimera import openModels
	m.name = name
	kw = {'shareXform': False}
	if modelId != None:
		kw['baseId'] = modelId
	openModels.add([m], **kw)
	m.openState.xform = refMol.openState.xform
	restoreNewMoleculeProcessing()
	if close:
		openModels.close(mols)
    if refMol == None:
        refMol = mols[:1]
    if len(refMol) == 0:
        raise MidasError("No reference molecule specified")
    elif len(refMol) > 1:
        raise MidasError("Multiple reference molecules specified")
    refMol = refMol[0]
    if modelId is not None and type(modelId) != int:
        try:
            modelId = int(modelId[1:])
        except:
            raise MidasError("modelId value must be integer")
    from chimera import suppressNewMoleculeProcessing, \
        restoreNewMoleculeProcessing
    suppressNewMoleculeProcessing()
    try:
        m = combine(mols, refMol, newChainIDs=newChainIDs, log=log)
    except CombineError, v:
        restoreNewMoleculeProcessing()
        raise MidasError(v)
    from chimera import openModels
    m.name = name
    kw = {'shareXform': False}
    if modelId != None:
        kw['baseId'] = modelId
    openModels.add([m], **kw)
    m.openState.xform = refMol.openState.xform
    restoreNewMoleculeProcessing()
    if close:
        openModels.close(mols)
Ejemplo n.º 41
0
	def showAniso(self, targets, color=None, scale=1.0, smoothing=1,
				showEllipsoid=True, ellipsoidTransparency=None,
				axisColor=None, axisFactor=None, axisThickness=0.01,
				ellipseColor=None, ellipseFactor=None, ellipseThickness=0.02):
		"""targets can be an iterable of atoms or molecules

		   color of None means match the atom color.
		   showing outer ellipsoid controlled with 'showEllipsoid'
		   if 'ellipsoidTransparency' is not None, then the color's
		     transparency is set to that fraction.
		   'axisFactor' is a multiplicative factor of how long the displayed
		     axes lengths are versus the ellipsoid axes.  If 'axisFactor'
			 is None then no axes are displayed.
		   'ellipseFactor' is similar to 'axisFactor', but for the major
		     ellipses.
		"""
		molMap = self._makeMolMap(targets)
		self.removeAniso(molMap)
		noneShowing = not self._surfMap
		newlyShown = 0
		for m, atoms in molMap.items():
			if not m.display:
				continue
			surfMap = self._surfMap.setdefault(m, {})
			if surfMap:
				model = surfMap["model"]
			else:
				import _surface
				model = _surface.SurfaceModel()
				surfMap["model"] = model
				openModels.add([model], sameAs=m, hidden=True)
			for a in atoms:
				if not a.display or a.hide:
					continue
				if not hasattr(a, "anisoU"):
					continue
				noneColor = a.color
				if noneColor is None:
					noneColor = a.molecule.color
				if showEllipsoid:
					if color is None:
						_ellipsoidColor = noneColor
					else:
						_ellipsoidColor = color
				else:
					_ellipsoidColor = None
				if axisFactor is None:
					_axisColor = None
				elif axisColor is None:
					_axisColor = noneColor
				else:
					_axisColor = axisColor
				if ellipseFactor is None:
					_ellipseColor = None
				elif ellipseColor is None:
					_ellipseColor = noneColor
				else:
					_ellipseColor = ellipseColor
				surfMap[a] = self._makePieces(model, a, (_ellipsoidColor,
					_axisColor, _ellipseColor), ellipsoidTransparency, scale,
					smoothing, axisFactor, ellipseFactor, axisThickness,
					ellipseThickness)
				newlyShown += 1
				# can't look up 'molecule' in deleted atoms,
				# so remember it...
				self._atomMolLookup[a] = a.molecule
		if noneShowing and self._surfMap:
			self._handlerID = triggers.addHandler('Atom',
							self._atomCB, None)
		return newlyShown
Ejemplo n.º 42
0
  def open_model(self):

    from chimera import openModels, addModelClosedCallback
    openModels.add([self.volume], sameAs = self.attached_model)
    addModelClosedCallback(self.volume, self.model_closed_cb)
def open_pqs(id):

    models = read_pqs(id)
    from chimera import openModels
    openModels.add(models)
    return models
Ejemplo n.º 44
0
    def open_model(self):

        from chimera import openModels, addModelClosedCallback
        openModels.add([self.volume], sameAs=self.attached_model)
        addModelClosedCallback(self.volume, self.model_closed_cb)