示例#1
0
def mark_map_center(volume):
    for s in volume.surfaces:
        va, ta = s.vertices, s.triangles
        from chimerax import surface
        varea = surface.vertex_areas(va, ta)
        a = varea.sum()
        c = varea.dot(va) / a
        _mouse_place_marker(volume.session, c)
示例#2
0
def principle_axes_box(varray, tarray):

    from chimerax import surface
    weights = surface.vertex_areas(varray, tarray)
    from chimerax.std_commands.measure_inertia import moments_of_inertia
    axes, d2e, center = moments_of_inertia([(varray, weights)])
    from chimerax.geometry import Place, point_bounds
    axes_points = Place(axes=axes).inverse().transform_points(varray)
    bounds = point_bounds(axes_points)
    return axes, bounds
示例#3
0
def surface_inertia(surfs):

  vw = []
  from chimerax.surface import vertex_areas
  for s in surfs:
      va, ta = s.vertices, s.triangles
      weights = vertex_areas(va, ta)
      v = s.scene_position.transform_points(va)
      vw.append((v, weights))
    
  return moments_of_inertia(vw)
示例#4
0
def connected_center(triangle_pick):
    d = triangle_pick.drawing()
    t = triangle_pick.triangle_number
    va, ta = d.vertices, d.triangles
    from chimerax import surface
    ti = surface.connected_triangles(ta, t)
    tc = ta[ti, :]
    varea = surface.vertex_areas(va, tc)
    a = varea.sum()
    c = varea.dot(va) / a
    cscene = d.scene_position * c
    vol, holes = surface.enclosed_volume(va, tc)
    return cscene, vol
示例#5
0
def _report_patch_intensities(patches, va, ta, signal_map, surf_position):
    lines = ['# Area average intensities of map %s for %d patches' % (signal_map.name, len(patches)),
             '# pnum area intensity']
    from chimerax.surface import surface_area, vertex_areas
    from chimerax.geometry import inner_product
    varea = vertex_areas(va, ta)
    for i, (vi,ti) in enumerate(patches):
        pva, pta = va[vi], ta[ti]
        area = surface_area(va, pta)
        vsig = signal_map.interpolated_values(pva, surf_position)
        pvarea = varea[vi]
        vasig = inner_product(pvarea, vsig)
        sig = vasig / pvarea.sum()
        lines.append('%d %.6g %.6g' % (i+1, area, sig))
    return '\n'.join(lines)
示例#6
0
def ellipsoid_shell_size_from_moments(d2):

  d2sum = sum(d2)
  from math import sqrt
  elen = [sqrt(max(0,3*(0.5*d2sum - d2[a]))) for a in range(3)]
  varray, narray, tarray = ellipsoid_geometry(center = (0,0,0),
                                              axes = ((1,0,0),(0,1,0),(0,0,1)),
                                              axis_lengths = elen)
  from chimerax.surface import vertex_areas
  for k in range(10):
    weights = vertex_areas(varray, tarray)
    axes, d2e, center = moments_of_inertia([(varray, weights)])
    de = (d2 - d2e) / d2
    escale = 0.25*(-2*de+de.sum()) + 1
    for a in range(3):
      varray[:,a] *= escale[a]
    elen = [elen[a]*escale[a] for a in range(3)]
  return elen
示例#7
0
def surface_blob_centers(surface):
    '''
    Return an array of center positions for each connected set of
    displayed triangles in the surface.  Centers are in surface coordinates.
    A center is computed as average vertex position weighted by vertex area
    where vertex area is 1/3 the area of the adjoining displayed triangles.
    '''

    # Get list of (vertex indices, triangle indices) for each connected piece
    triangles = surface.masked_triangles
    from chimerax.surface import connected_pieces, vertex_areas
    blob_list = connected_pieces(triangles)

    # Compute area-weighted center for each blob
    vertices = surface.vertices
    varea = vertex_areas(vertices, triangles)
    from numpy import empty, float32
    centers = empty((len(blob_list), 3), float32)
    for i, (vi, ti) in enumerate(blob_list):
        blob_varea = varea[vi]
        blob_area = blob_varea.sum()
        centers[i] = blob_varea.dot(vertices[vi]) / blob_area

    return centers