def exercise_external_clusters(n_trials=10):
  # copy of phenix_regression/tardy_action/gly_gly_box.pdb:
  """
CRYST1   12.661   12.601   14.403  90.00  90.00  90.00 P 1
ATOM      0  C   GLY A 138       5.965   6.290   5.906  1.00 35.93           C
ATOM      1  O   GLY A 138       5.429   5.188   5.784  1.00 40.71           O
ATOM      2  N   GLY A 138       7.860   7.800   5.206  1.00 34.54           N
ATOM      3  CA  GLY A 138       6.857   6.828   4.801  1.00 33.64           C
ATOM      4  N   GLY A 139       5.798   7.062   6.977  1.00 33.49           N
ATOM      5  CA  GLY A 139       4.960   6.636   8.087  1.00 33.25           C
ATOM      6  C   GLY A 139       5.536   5.495   8.904  1.00 32.97           C
ATOM      7  O   GLY A 139       4.801   4.801   9.602  1.00 35.18           O
ATOM      8  OXT GLY A 139       6.772   5.318   8.862  1.00 34.96           O
END
  """
  edge_list = [(0,1), (0,3), (0,4), (2,3), (4,5), (5,6), (6,7), (6,8)]
  expected = [
    (None,
     [[0], [1], [2], [3], [4], [5], [6], [7], [8]],
     0),
    ([[3,0,4,5], [0,1,3,4], [5,6,7,8]], # actual
     [[0,4], [1], [2], [3], [5], [6], [7], [8]],
     1),
    ([[3,0,4,5], [0,1,2,3], [5,6,7,8]], # artificial
     [[0,3,4], [1], [2], [5], [6], [7], [8]],
     2),
    ([[3,0,4,5], [0,1,2,3], [0,4,5,6]], # artificial
     [[0,3,4,5], [1], [2], [6], [7], [8]],
     3),
    ([[3,0,4,5], [0,1,2,3], [0,4,5,6], [4,5,6,8]], # artificial
     [[0,3,4,5,6], [1], [2], [7], [8]],
     4),
    ([[3,0,4,5], [0,1,2,3], [4,5,6,8]], # artificial
     [[0,3,4], [5,6], [1], [2], [7], [8]],
     3),
    ([[0,1,2,3], [4,5,6,8]], # artificial
     [[0,3], [5,6], [1], [2], [4], [7], [8]],
     2)]
  for external_clusters,expected_clusters,expected_count in expected:
    tt = construct(
      n_vertices=9, edge_list=edge_list, external_clusters=external_clusters)
    assert tt.cluster_manager.clusters == expected_clusters
    assert tt.external_clusters_connect_count == expected_count
  for external_clusters,expected_clusters,expected_count in expected:
    if (external_clusters is None): external_clusters = []
    for i_trial in xrange(n_trials):
      tt = construct(
        n_vertices=9,
        edge_list=random_permutation(edge_list),
        external_clusters=[random_permutation(c) for c in external_clusters])
      assert tt.cluster_manager.clusters == expected_clusters
      assert tt.external_clusters_connect_count == expected_count
Example #2
0
def exercise_fixed_hinges():
    # disulfide bond: CA - CB - SG - SG - CB - CA
    edge_list = [(0, 1), (1, 2), (2, 5), (3, 4), (4, 5)]
    sites = matrix.col_list([(2.031, 74.980, 4.910), (0.672, 75.625, 4.635),
                             (-0.061, 75.171, 3.047), (-2.009, 74.382, 0.323),
                             (-0.709, 75.082, 0.718), (-0.355, 75.059, 2.491)])
    tt = construct(sites=sites,
                   edge_list=edge_list,
                   near_singular_hinges_angular_tolerance_deg=0)
    assert tt.cluster_manager.cluster_indices == [0, 0, 0, 3, 2, 1]
    tt = construct(sites=sites,
                   edge_list=edge_list,
                   near_singular_hinges_angular_tolerance_deg=5)
    assert tt.cluster_manager.cluster_indices == [0, 0, 0, 2, 1, 0]
Example #3
0
def exercise_test_cases(out):
    for i_tc, tc in enumerate(test_cases):
        print("test_case index:", i_tc, file=out)
        print(tc.art, file=out)
        tc_c1, tc_he1, tc_r1, tc_tid1, tc_le1, tc_leb1, \
        tc_c2, tc_he2, tc_le2, tc_leb2 = \
          tc.clusters1, tc.hinge_edges1, \
          tc.roots1, tc.tree_ids1, tc.loop_edges1, tc.loop_edge_bendings1, \
          tc.clusters1, tc.hinge_edges1, tc.loop_edges1, tc.loop_edge_bendings1

        def assert_same(label, have, expected):
            print(label, have, file=out)
            if (expected is not None):
                if (have != expected):
                    print("expected:", expected, file=out)
                assert have == expected, "Note: --verbose for details"

        #
        tt = construct(n_vertices=tc.n_vertices, edge_list=tc.edge_list)
        cm = tt.cluster_manager
        assert_same("c1:", cm.clusters, tc_c1)
        cm.construct_spanning_trees(edge_sets=tt.edge_sets)
        print("c1t:", cm.clusters, file=out)
        assert_same("he1:", cm.hinge_edges, tc_he1)
        assert_same("le1:", cm.loop_edges, tc_le1)
        r = cm.roots()
        assert_same("r1:", r, tc_r1)
        tid = cm.tree_ids()
        assert_same("tid1:", tid, tc_tid1)
        cm.find_loop_edge_bendings(edge_sets=tt.edge_sets)
        assert_same("leb1:", cm.loop_edge_bendings, tc_leb1)
        #
        tt = construct(n_vertices=tc.n_vertices, edge_list=tc.edge_list)
        cm = tt.cluster_manager
        cm.merge_clusters_with_multiple_connections(edge_sets=tt.edge_sets)
        assert_same("c2:", cm.clusters, tc_c2)
        cm.construct_spanning_trees(edge_sets=tt.edge_sets)
        print("c2t:", cm.clusters, file=out)
        assert_same("he2:", cm.hinge_edges, tc_he2)
        assert_same("le2:", cm.loop_edges, tc_le2)
        cm.find_loop_edge_bendings(edge_sets=tt.edge_sets)
        assert_same("leb2:", cm.loop_edge_bendings, tc_leb2)
        #
        fp = find_paths(edge_sets=tt.edge_sets)
        for iv in range(len(tt.edge_sets)):
            fp.search_from(iv=iv)
        #
        print(file=out)
def exercise_three_archs(arch_size_max=8):
    for arch_size_1 in xrange(1, arch_size_max + 1):
        edge_list_1 = archs_grow_edge_list([], 2, arch_size_1)
        for arch_size_2 in xrange(1, arch_size_max + 1):
            edge_list_12 = archs_grow_edge_list(edge_list_1, 2 + arch_size_1,
                                                arch_size_2)
            for arch_size_3 in xrange(1, arch_size_max + 1):
                n_vertices = 2 + arch_size_1 + arch_size_2 + arch_size_3
                edge_list_123 = archs_grow_edge_list(
                    edge_list_12, 2 + arch_size_1 + arch_size_2, arch_size_3)
                es, dof = arch_dof(n_vertices=n_vertices,
                                   edge_list=edge_list_123)
                expected = max(6,
                               max(arch_size_1, arch_size_2, arch_size_3) + 1,
                               arch_size_1 + arch_size_2 + arch_size_3 - 3)
                assert expected == dof
                is_rigid = (dof == 6)
                inferred_is_rigid = (
                    arch_size_1 < 6 and arch_size_2 < 6 and arch_size_3 < 6
                    and arch_size_1 + arch_size_2 + arch_size_3 < 10)
                assert inferred_is_rigid == is_rigid
                #
                tt = construct(n_vertices=n_vertices,
                               edge_list=edge_list_123).build_tree()
                inferred_is_rigid = (len(tt.cluster_manager.clusters) == 1)
def exercise_three_archs(arch_size_max=8):
  for arch_size_1 in xrange(1, arch_size_max+1):
    edge_list_1 = archs_grow_edge_list(
      [], 2, arch_size_1)
    for arch_size_2 in xrange(1, arch_size_max+1):
      edge_list_12 = archs_grow_edge_list(
        edge_list_1, 2+arch_size_1, arch_size_2)
      for arch_size_3 in xrange(1, arch_size_max+1):
        n_vertices = 2 + arch_size_1 + arch_size_2 + arch_size_3
        edge_list_123 = archs_grow_edge_list(
          edge_list_12, 2+arch_size_1+arch_size_2, arch_size_3)
        es, dof = arch_dof(n_vertices=n_vertices, edge_list=edge_list_123)
        expected = max(
          6,
          max(arch_size_1, arch_size_2, arch_size_3) + 1,
          arch_size_1 + arch_size_2 + arch_size_3 - 3)
        assert expected == dof
        is_rigid = (dof == 6)
        inferred_is_rigid = (
              arch_size_1 < 6
          and arch_size_2 < 6
          and arch_size_3 < 6
          and arch_size_1 + arch_size_2 + arch_size_3 < 10)
        assert inferred_is_rigid == is_rigid
        #
        tt = construct(
          n_vertices=n_vertices, edge_list=edge_list_123).build_tree()
        inferred_is_rigid = (len(tt.cluster_manager.clusters) == 1)
 def tardy_tree_construct(O, fixed_vertex_lists=[]):
   from scitbx.graph import tardy_tree
   tt = tardy_tree.construct(
     sites=O.sites,
     edge_list=O.bonds,
     fixed_vertex_lists=fixed_vertex_lists)
   if (len(fixed_vertex_lists) != 0):
     return tt
   cm = tt.cluster_manager
   if (O.clusters is None):
     print "tag:", O.tag
   if (O.clusters is None):
     print "clusters:", cm.clusters
   else:
     assert cm.clusters == O.clusters
   if (O.hinge_edges is None):
     print "hinge_edges:", cm.hinge_edges
   else:
     assert cm.hinge_edges == O.hinge_edges
   if (O.loop_edges is None):
     print "loop_edges:", cm.loop_edges
   else:
     assert cm.loop_edges == O.loop_edges
   if (O.loop_edge_bendings is None):
     print "loop_edge_bendings:", cm.loop_edge_bendings
   else:
     assert cm.loop_edge_bendings == O.loop_edge_bendings
   assert tt.find_cluster_loop_repeats == O.find_cluster_loop_repeats
   assert cm.merge_clusters_with_multiple_connections_passes \
       ==  O.merge_clusters_with_multiple_connections_passes
   if (O.clusters is None):
     print
   return tt
Example #7
0
 def tardy_tree_construct(O, fixed_vertex_lists=[]):
     from scitbx.graph import tardy_tree
     tt = tardy_tree.construct(sites=O.sites,
                               edge_list=O.bonds,
                               fixed_vertex_lists=fixed_vertex_lists)
     if (len(fixed_vertex_lists) != 0):
         return tt
     cm = tt.cluster_manager
     if (O.clusters is None):
         print("tag:", O.tag)
     if (O.clusters is None):
         print("clusters:", cm.clusters)
     else:
         assert cm.clusters == O.clusters
     if (O.hinge_edges is None):
         print("hinge_edges:", cm.hinge_edges)
     else:
         assert cm.hinge_edges == O.hinge_edges
     if (O.loop_edges is None):
         print("loop_edges:", cm.loop_edges)
     else:
         assert cm.loop_edges == O.loop_edges
     if (O.loop_edge_bendings is None):
         print("loop_edge_bendings:", cm.loop_edge_bendings)
     else:
         assert cm.loop_edge_bendings == O.loop_edge_bendings
     assert tt.find_cluster_loop_repeats == O.find_cluster_loop_repeats
     assert cm.merge_clusters_with_multiple_connections_passes \
         ==  O.merge_clusters_with_multiple_connections_passes
     if (O.clusters is None):
         print()
     return tt
Example #8
0
def exercise_test_cases(out):
  for i_tc,tc in enumerate(test_cases):
    print >> out, "test_case index:", i_tc
    print >> out, tc.art
    tc_c1, tc_he1, tc_r1, tc_tid1, tc_le1, tc_leb1, \
    tc_c2, tc_he2, tc_le2, tc_leb2 = \
      tc.clusters1, tc.hinge_edges1, \
      tc.roots1, tc.tree_ids1, tc.loop_edges1, tc.loop_edge_bendings1, \
      tc.clusters1, tc.hinge_edges1, tc.loop_edges1, tc.loop_edge_bendings1
    def assert_same(label, have, expected):
      print >> out, label, have
      if (expected is not None):
        if (have != expected):
          print >> out, "expected:", expected
        assert have == expected, "Note: --verbose for details"
    #
    tt = construct(n_vertices=tc.n_vertices, edge_list=tc.edge_list)
    cm = tt.cluster_manager
    assert_same("c1:", cm.clusters, tc_c1)
    cm.construct_spanning_trees(edge_sets=tt.edge_sets)
    print >> out, "c1t:", cm.clusters
    assert_same("he1:", cm.hinge_edges, tc_he1)
    assert_same("le1:", cm.loop_edges, tc_le1)
    r = cm.roots()
    assert_same("r1:", r, tc_r1)
    tid = cm.tree_ids()
    assert_same("tid1:", tid, tc_tid1)
    cm.find_loop_edge_bendings(edge_sets=tt.edge_sets)
    assert_same("leb1:", cm.loop_edge_bendings, tc_leb1)
    #
    tt = construct(n_vertices=tc.n_vertices, edge_list=tc.edge_list)
    cm = tt.cluster_manager
    cm.merge_clusters_with_multiple_connections(edge_sets=tt.edge_sets)
    assert_same("c2:", cm.clusters, tc_c2)
    cm.construct_spanning_trees(edge_sets=tt.edge_sets)
    print >> out, "c2t:", cm.clusters
    assert_same("he2:", cm.hinge_edges, tc_he2)
    assert_same("le2:", cm.loop_edges, tc_le2)
    cm.find_loop_edge_bendings(edge_sets=tt.edge_sets)
    assert_same("leb2:", cm.loop_edge_bendings, tc_leb2)
    #
    fp = find_paths(edge_sets=tt.edge_sets)
    for iv in xrange(len(tt.edge_sets)):
      fp.search_from(iv=iv)
    #
    print >> out
Example #9
0
def exercise_fixed_hinges():
  # disulfide bond: CA - CB - SG - SG - CB - CA
  edge_list = [(0,1), (1,2), (2,5), (3,4), (4,5)]
  sites = matrix.col_list([
    ( 2.031, 74.980, 4.910),
    ( 0.672, 75.625, 4.635),
    (-0.061, 75.171, 3.047),
    (-2.009, 74.382, 0.323),
    (-0.709, 75.082, 0.718),
    (-0.355, 75.059, 2.491)])
  tt = construct(
    sites=sites,
    edge_list=edge_list,
    near_singular_hinges_angular_tolerance_deg=0)
  assert tt.cluster_manager.cluster_indices == [0,0,0,3,2,1]
  tt = construct(
    sites=sites,
    edge_list=edge_list,
    near_singular_hinges_angular_tolerance_deg=5)
  assert tt.cluster_manager.cluster_indices == [0,0,0,2,1,0]
Example #10
0
 def check(n_vertices, edge_list, clusters, nosiet, somiet):
   sites = matrix.col_list([(i,i%2,0) for i in xrange(n_vertices)])
   labels = [str(i) for i in xrange(n_vertices)]
   masses = [13, 7, 23, 19, 29, 11, 17][:n_vertices]
   assert len(masses) == n_vertices
   tt = tardy_tree.construct(sites=sites, edge_list=edge_list)
   assert len(tt.cluster_manager.fixed_hinges) == 0
   assert tt.cluster_manager.clusters == clusters
   tm = construct_tardy_model(
     labels=labels, sites=sites, masses=masses, tardy_tree=tt)
   assert tm.root_indices() == list(reversed([i for i,n in nosiet]))
   assert tm.number_of_sites_in_each_tree() == nosiet
   assert tm.sum_of_masses_in_each_tree() == somiet
Example #11
0
def exercise_rmsd_calculation():
    from scitbx.array_family import flex
    from libtbx.test_utils import approx_equal
    sites_1 = flex.vec3_double([(0, 0, 0), (0, -1, 1), (0, 1, 1)])
    sites_2 = sites_1.select(flex.size_t([0, 2, 1]))
    tt = construct(sites=sites_1, edge_list=[(0, 1), (0, 2)])
    rmsd_calculator = tt.rmsd_calculator()
    assert approx_equal(
        rmsd_calculator(sites_cart_1=sites_1, sites_cart_2=sites_1), 0)
    assert approx_equal(
        rmsd_calculator(sites_cart_1=sites_1, sites_cart_2=sites_2), 0)
    #
    sites_1 = flex.vec3_double([(0, 0, 0), (0, -1, 1), (0, 1, 1), (0, -1, 2),
                                (0, -2, 1), (0, 2, 1), (0, 1, 2)])
    sites_2 = sites_1.select(flex.size_t([0, 1, 2, 4, 3, 6, 5]))
    tt = construct(sites=sites_1,
                   edge_list=[(0, 1), (0, 2), (1, 3), (1, 4), (2, 5), (2, 6)])
    assert list(tt.rmsd_permutation(
        sites_cart_1=sites_1, sites_cart_2=sites_1)) == [0, 1, 2, 3, 4, 5, 6]
    assert list(tt.rmsd_permutation(
        sites_cart_1=sites_1, sites_cart_2=sites_2)) == [0, 1, 2, 4, 3, 6, 5]
    assert list(tt.rmsd_permutation(
        sites_cart_1=sites_2, sites_cart_2=sites_1)) == [0, 1, 2, 4, 3, 6, 5]
    #
    sites_1.append((0, 2, 3))
    sites_2.append((0, 3, 2))
    tt = construct(sites=sites_1,
                   edge_list=[(0, 1), (0, 2), (1, 3), (1, 4), (2, 5), (2, 6),
                              (6, 7)])
    assert list(
        tt.rmsd_permutation(sites_cart_1=sites_1,
                            sites_cart_2=sites_1)) == [0, 1, 2, 3, 4, 5, 6, 7]
    assert list(
        tt.rmsd_permutation(sites_cart_1=sites_1,
                            sites_cart_2=sites_2)) == [0, 1, 2, 4, 3, 5, 6, 7]
    assert list(
        tt.rmsd_permutation(sites_cart_1=sites_2,
                            sites_cart_2=sites_1)) == [0, 1, 2, 4, 3, 5, 6, 7]
Example #12
0
 def check(n_vertices, edge_list, clusters, nosiet, somiet):
     sites = matrix.col_list([(i, i % 2, 0) for i in range(n_vertices)])
     labels = [str(i) for i in range(n_vertices)]
     masses = [13, 7, 23, 19, 29, 11, 17][:n_vertices]
     assert len(masses) == n_vertices
     tt = tardy_tree.construct(sites=sites, edge_list=edge_list)
     assert len(tt.cluster_manager.fixed_hinges) == 0
     assert tt.cluster_manager.clusters == clusters
     tm = construct_tardy_model(labels=labels,
                                sites=sites,
                                masses=masses,
                                tardy_tree=tt)
     assert tm.root_indices() == list(reversed([i for i, n in nosiet]))
     assert tm.number_of_sites_in_each_tree() == nosiet
     assert tm.sum_of_masses_in_each_tree() == somiet
Example #13
0
def exercise_rmsd_calculation():
  from scitbx.array_family import flex
  from libtbx.test_utils import approx_equal
  sites_1 = flex.vec3_double([(0,0,0),(0,-1,1),(0,1,1)])
  sites_2 = sites_1.select(flex.size_t([0,2,1]))
  tt = construct(sites=sites_1, edge_list=[(0,1),(0,2)])
  rmsd_calculator = tt.rmsd_calculator()
  assert approx_equal(rmsd_calculator(
    sites_cart_1=sites_1, sites_cart_2=sites_1), 0)
  assert approx_equal(rmsd_calculator(
    sites_cart_1=sites_1, sites_cart_2=sites_2), 0)
  #
  sites_1 = flex.vec3_double([
    (0,0,0),(0,-1,1),(0,1,1),(0,-1,2),(0,-2,1),(0,2,1),(0,1,2)])
  sites_2 = sites_1.select(flex.size_t([0,1,2,4,3,6,5]))
  tt = construct(
    sites=sites_1,
    edge_list=[(0,1),(0,2),(1,3),(1,4),(2,5),(2,6)])
  assert list(tt.rmsd_permutation(
    sites_cart_1=sites_1, sites_cart_2=sites_1)) == [0,1,2,3,4,5,6]
  assert list(tt.rmsd_permutation(
    sites_cart_1=sites_1, sites_cart_2=sites_2)) == [0,1,2,4,3,6,5]
  assert list(tt.rmsd_permutation(
    sites_cart_1=sites_2, sites_cart_2=sites_1)) == [0,1,2,4,3,6,5]
  #
  sites_1.append((0,2,3))
  sites_2.append((0,3,2))
  tt = construct(
    sites=sites_1,
    edge_list=[(0,1),(0,2),(1,3),(1,4),(2,5),(2,6),(6,7)])
  assert list(tt.rmsd_permutation(
    sites_cart_1=sites_1, sites_cart_2=sites_1)) == [0,1,2,3,4,5,6,7]
  assert list(tt.rmsd_permutation(
    sites_cart_1=sites_1, sites_cart_2=sites_2)) == [0,1,2,4,3,5,6,7]
  assert list(tt.rmsd_permutation(
    sites_cart_1=sites_2, sites_cart_2=sites_1)) == [0,1,2,4,3,5,6,7]
def exercise_fused_loops(arch_size_max=8):
    for arch_size_1 in xrange(1, arch_size_max + 1):
        edge_list_1 = archs_grow_edge_list([(0, 1)], 2, arch_size_1)
        for arch_size_2 in xrange(1, arch_size_max + 1):
            n_vertices = 2 + arch_size_1 + arch_size_2
            edge_list_12 = archs_grow_edge_list(edge_list_1, 2 + arch_size_1,
                                                arch_size_2)
            es, dof = arch_dof(n_vertices=n_vertices, edge_list=edge_list_12)
            is_rigid = (dof == 6)
            inferred_is_rigid = (arch_size_1 < 6 and arch_size_2 < 6
                                 and arch_size_1 + arch_size_2 < 10)
            assert inferred_is_rigid == is_rigid
            #
            tt = construct(n_vertices=n_vertices,
                           edge_list=edge_list_12).build_tree()
            inferred_is_rigid = (len(tt.cluster_manager.clusters) == 1)
            assert inferred_is_rigid == is_rigid
def exercise_all_in_one_rigid_body():
  tt = construct(
    sites=matrix.col_list([(0,0,0), (0,0,1), (0,0,2)]),
    edge_list="all_in_one_rigid_body")
  sio = StringIO()
  tt.show_summary(vertex_labels=None, out=sio)
  assert not show_diff(sio.getvalue(), """\
number of vertices: 3
number of edges: None
find cluster loops: 0 repeats
number of fixed vertex lists: 0
number of fixed vertices: 0
number of clusters: 1
merge clusters with multiple connections: 0 passes
number of hinge edges: 1
number of loop edges: 0
number of loop edge bendings: 0
number of fixed hinges: 0
""")
def exercise_fused_loops(arch_size_max=8):
  for arch_size_1 in xrange(1, arch_size_max+1):
    edge_list_1 = archs_grow_edge_list(
      [(0,1)], 2, arch_size_1)
    for arch_size_2 in xrange(1, arch_size_max+1):
      n_vertices = 2 + arch_size_1 + arch_size_2
      edge_list_12 = archs_grow_edge_list(
        edge_list_1, 2+arch_size_1, arch_size_2)
      es, dof = arch_dof(n_vertices=n_vertices, edge_list=edge_list_12)
      is_rigid = (dof == 6)
      inferred_is_rigid = (
            arch_size_1 < 6
        and arch_size_2 < 6
        and arch_size_1 + arch_size_2 < 10)
      assert inferred_is_rigid == is_rigid
      #
      tt = construct(
        n_vertices=n_vertices, edge_list=edge_list_12).build_tree()
      inferred_is_rigid = (len(tt.cluster_manager.clusters) == 1)
      assert inferred_is_rigid == is_rigid
Example #17
0
def exercise_near_singular_hinges():
    # similar to scitbx/graph/test_cases_tardy_pdb.py, "collinear" test case
    r"""
    0                6
    | \             /
    |  2---3---4---5
    | /
    1
  """
    x = -0.5 * 3**0.5
    y = 0.5

    def build_sites(eps):
        return matrix.col_list([(x, -y, 0), (x, y, 0), (0, 0, 0), (1, 0, 0),
                                (2, 0, eps)])

    edge_list = [(0, 1), (0, 2), (1, 2), (2, 3), (3, 4)]
    sites = build_sites(eps=0)
    for i, j in edge_list:
        assert approx_equal(abs(sites[i] - sites[j]), 1)
    sites = build_sites(eps=1e-5)
    labels = [str(i) for i in range(len(sites))]
    masses = [1] * len(sites)
    tt = tardy_tree.construct(n_vertices=len(sites), edge_list=edge_list)
    tt.build_tree()
    assert tt.cluster_manager.clusters == [[0, 1, 2, 3], [4]]

    def e_kin_1():
        tm = construct_tardy_model(labels=labels,
                                   sites=sites,
                                   masses=masses,
                                   tardy_tree=tt)
        rnd = random.Random(0)
        tm.assign_random_velocities(e_kin_target=1, random_gauss=rnd.gauss)
        assert approx_equal(tm.e_kin(), 1, eps=1e-10)
        tm.dynamics_step(delta_t=0.01)
        return tm.e_kin()

    assert approx_equal(e_kin_1(), 60.9875715394)
    tt.fix_near_singular_hinges(sites=sites)
    assert tt.cluster_manager.fixed_hinges == [(2, 3)]
    assert tt.cluster_manager.clusters == [[0, 1, 2, 3, 4]]
    assert approx_equal(e_kin_1(), 1.00004830172, eps=1e-10)
    #
    sites.append(matrix.col((3, 0, 0)))
    labels.append("5")
    masses.append(1)
    edge_list.append((4, 5))
    tt = tardy_tree.construct(n_vertices=len(sites), edge_list=edge_list)
    tt.build_tree()
    assert tt.cluster_manager.clusters == [[0, 1, 2, 3], [4], [5]]
    assert approx_equal(e_kin_1(), 9.55508653428)
    tt.fix_near_singular_hinges(sites=sites)
    assert tt.cluster_manager.fixed_hinges == [(2, 3), (3, 4)]
    assert tt.cluster_manager.clusters == [[0, 1, 2, 3, 4, 5]]
    assert approx_equal(e_kin_1(), 1.00005333167, eps=1e-10)
    #
    sites.append(matrix.col((3 - x, -y, 0)))
    assert approx_equal(abs(sites[5] - sites[6]), 1)
    labels.append("6")
    masses.append(1)
    edge_list.append((5, 6))
    tt = tardy_tree.construct(n_vertices=len(sites), edge_list=edge_list)
    tt.build_tree()
    assert tt.cluster_manager.clusters == [[0, 1, 2, 3], [4], [5], [6]]
    assert approx_equal(e_kin_1(), 0.99994375467)
    tt.fix_near_singular_hinges(sites=sites)
    assert tt.cluster_manager.fixed_hinges == [(2, 3), (3, 4)]
    assert tt.cluster_manager.clusters == [[0, 1, 2, 3, 4, 5], [6]]
    assert approx_equal(e_kin_1(), 1.0000438095, eps=1e-10)
Example #18
0
def exercise_near_singular_hinges():
  # similar to scitbx/graph/test_cases_tardy_pdb.py, "collinear" test case
  """
    0                6
    | \             /
    |  2---3---4---5
    | /
    1
  """
  x = -0.5*3**0.5
  y = 0.5
  def build_sites(eps):
    return matrix.col_list([
      (x,-y,0),
      (x,y,0),
      (0,0,0),
      (1,0,0),
      (2,0,eps)])
  edge_list = [(0,1),(0,2),(1,2),(2,3),(3,4)]
  sites = build_sites(eps=0)
  for i,j in edge_list:
    assert approx_equal(abs(sites[i]-sites[j]), 1)
  sites = build_sites(eps=1e-5)
  labels = [str(i) for i in xrange(len(sites))]
  masses = [1] * len(sites)
  tt = tardy_tree.construct(n_vertices=len(sites), edge_list=edge_list)
  tt.build_tree()
  assert tt.cluster_manager.clusters == [[0,1,2,3], [4]]
  def e_kin_1():
    tm = construct_tardy_model(
      labels=labels,
      sites=sites,
      masses=masses,
      tardy_tree=tt)
    rnd = random.Random(0)
    tm.assign_random_velocities(e_kin_target=1, random_gauss=rnd.gauss)
    assert approx_equal(tm.e_kin(), 1, eps=1e-10)
    tm.dynamics_step(delta_t=0.01)
    return tm.e_kin()
  assert approx_equal(e_kin_1(), 60.9875715394)
  tt.fix_near_singular_hinges(sites=sites)
  assert tt.cluster_manager.fixed_hinges == [(2,3)]
  assert tt.cluster_manager.clusters == [[0,1,2,3,4]]
  assert approx_equal(e_kin_1(), 1.00004830172, eps=1e-10)
  #
  sites.append(matrix.col((3,0,0)))
  labels.append("5")
  masses.append(1)
  edge_list.append((4,5))
  tt = tardy_tree.construct(n_vertices=len(sites), edge_list=edge_list)
  tt.build_tree()
  assert tt.cluster_manager.clusters == [[0,1,2,3], [4], [5]]
  assert approx_equal(e_kin_1(), 9.55508653428)
  tt.fix_near_singular_hinges(sites=sites)
  assert tt.cluster_manager.fixed_hinges == [(2,3), (3,4)]
  assert tt.cluster_manager.clusters == [[0,1,2,3,4,5]]
  assert approx_equal(e_kin_1(), 1.00005333167, eps=1e-10)
  #
  sites.append(matrix.col((3-x,-y,0)))
  assert approx_equal(abs(sites[5] - sites[6]), 1)
  labels.append("6")
  masses.append(1)
  edge_list.append((5,6))
  tt = tardy_tree.construct(n_vertices=len(sites), edge_list=edge_list)
  tt.build_tree()
  assert tt.cluster_manager.clusters == [[0,1,2,3], [4], [5], [6]]
  assert approx_equal(e_kin_1(), 0.99994375467)
  tt.fix_near_singular_hinges(sites=sites)
  assert tt.cluster_manager.fixed_hinges == [(2,3), (3,4)]
  assert tt.cluster_manager.clusters == [[0,1,2,3,4,5], [6]]
  assert approx_equal(e_kin_1(), 1.0000438095, eps=1e-10)
def exercise_special_case_ZINC03847121():
  # Only case out of 69587 cases with a RIGID_MINUS_TARDY_6 cluster of
  # size different from 3:
  # RIGID_MINUS_TARDY_6: 3 NILE=0 LE=2 NV=13 ZINC03847121
  #   [(0, 10, 11), (3, 10, 12), (9, 10, 11, 12)]
  # ZINC03847121 c1ccc2ccc(=O)ccc(c1)C2
  # simplified (oxygen removed): c1ccc2cccccc(c1)C2
  n_vertices = 12
  edge_list = [
    (0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9),
    (9, 10), (9, 11), (0, 10), (3, 11)]
  tt = construct(n_vertices=n_vertices, edge_list=edge_list)
  cm = tt.cluster_manager
  assert sorted(cm.overlapping_rigid_clusters(edge_sets=tt.edge_sets)) == [
    (0, 1, 2), (0, 1, 10), (0, 9, 10), (1, 2, 3), (2, 3, 4, 11),
    (3, 4, 5), (3, 9, 11), (4, 5, 6), (5, 6, 7), (6, 7, 8), (7, 8, 9),
    (8, 9, 10, 11)]
  cii_orcs, fixed_vertex_info = \
    cm.determine_weighted_order_for_construct_spanning_tree(
      edge_sets=tt.edge_sets)
  assert cii_orcs == [
    (3, 4), (9, 4), (0, 3), (1, 3), (2, 3), (4, 3),
    (5, 3), (6, 3), (7, 3), (8, 3), (10, 3), (11, 3)]
  assert fixed_vertex_info == [0] * len(cii_orcs)
  #
  tt = construct(n_vertices=n_vertices, edge_list=edge_list)
  sio = StringIO()
  assert tt.show_summary(vertex_labels=None, out=sio, prefix="$") is tt
  assert not show_diff(sio.getvalue(), """\
$number of vertices: 12
$number of edges: 13
$find cluster loops: None
$number of fixed vertex lists: 0
$number of fixed vertices: 0
$number of clusters: 12
$merge clusters with multiple connections: 0 passes
$number of hinge edges: None
$number of loop edges: None
$number of loop edge bendings: None
$number of fixed hinges: None
""")
  tt.build_tree()
  sio = StringIO()
  assert tt.show_summary(vertex_labels=None, out=sio, prefix=">") is tt
  assert not show_diff(sio.getvalue(), """\
>number of vertices: 12
>number of edges: 13
>find cluster loops: 0 repeats
>number of fixed vertex lists: 0
>number of fixed vertices: 0
>number of clusters: 9
>merge clusters with multiple connections: 1 pass
>number of hinge edges: 9
>number of loop edges: 2
>number of loop edge bendings: 5
>number of fixed hinges: None
""")
  #
  sio = StringIO()
  assert tt.cluster_manager.show_tree(out=sio) is tt.cluster_manager
  assert not show_diff(sio.getvalue(), """\
# clusters are in square brackets []
# hinge edges are in parentheses ()
# (0, 1) -> [2, 3] means that the cluster with vertices [2, 3]
#   rotates around the axis through vertices (0, 1)
# integers are vertex indices (counting from 0)
[2, 3, 4, 11]
  (3, 2) -> [1]
    (2, 1) -> [0]
      (1, 0) -> [10]
  (3, 4) -> [5]
    (4, 5) -> [6]
      (5, 6) -> [7]
        (6, 7) -> [8]
          (7, 8) -> [9]
""")
  sio = StringIO()
  assert tt.show_tree(out=sio, prefix="=-", header=False) is tt
  assert not show_diff(sio.getvalue(), """\
=-[2, 3, 4, 11]
=-  (3, 2) -> [1]
=-    (2, 1) -> [0]
=-      (1, 0) -> [10]
=-  (3, 4) -> [5]
=-    (4, 5) -> [6]
=-      (5, 6) -> [7]
=-        (6, 7) -> [8]
=-          (7, 8) -> [9]
""")
Example #20
0
def exercise_fixed_vertices_special_cases():
  tardy_models = []
  """
          2
         /
    0---1
  """
  x = 0.5*3**0.5
  y = 0.5
  sites = matrix.col_list([
    (0,0,0),
    (1,0,0),
    (1+x,y,0)])
  edge_list = [(0,1),(1,2)]
  for i,j in edge_list:
    assert approx_equal(abs(sites[i]-sites[j]), 1)
  labels = [str(i) for i in xrange(len(sites))]
  masses = [1] * len(sites)
  #
  tt = tardy_tree.construct(
    sites=sites,
    edge_list=edge_list,
    fixed_vertex_lists=[])
  assert tt.cluster_manager.clusters == [[0,1,2]]
  tm = construct_tardy_model(
    labels=labels, sites=sites, masses=masses, tardy_tree=tt)
  tardy_models.append(tm)
  assert len(tm.bodies) == 1
  assert tm.bodies[0].joint.degrees_of_freedom == 6
  exercise_linear_velocity_manipulations(tardy_model=tm)
  #
  expected_e_kin_1 = [
    1.00009768395,
    1.00002522865,
    1.00000107257,
    1.0,
    1.0,
    1.0,
    0.0]
  rnd = random.Random(0)
  for i_fv,fixed_vertices in enumerate([[0], [1], [2],
                                        [0,1], [0,2], [1,2],
                                        [0,1,2]]):
    tt = tardy_tree.construct(
      sites=sites,
      edge_list=edge_list,
      fixed_vertex_lists=[fixed_vertices])
    assert tt.cluster_manager.clusters == [[0,1,2]]
    tm = construct_tardy_model(
      labels=labels, sites=sites, masses=masses, tardy_tree=tt)
    tardy_models.append(tm)
    assert len(tm.bodies) == 1
    assert tm.bodies[0].joint.degrees_of_freedom \
        == [3,1,0][len(fixed_vertices)-1]
    tm.assign_random_velocities(e_kin_target=1, random_gauss=rnd.gauss)
    if (len(fixed_vertices) != 3):
      assert approx_equal(tm.e_kin(), 1, eps=1e-10)
    else:
      assert approx_equal(tm.e_kin(), 0, eps=1e-10)
    tm.dynamics_step(delta_t=0.01)
    assert approx_equal(tm.e_kin(), expected_e_kin_1[i_fv], eps=1e-10)
    exercise_linear_velocity_manipulations(tardy_model=tm)
  #
  sites[2] = matrix.col([2,0,0])
  assert approx_equal((sites[0]-sites[1]).cos_angle(sites[2]-sites[1]), -1)
  for fixed_vertices in [[0,1], [0,2], [1,2]]:
    tt = tardy_tree.construct(
      sites=sites,
      edge_list=edge_list,
      fixed_vertex_lists=[fixed_vertices])
    assert tt.cluster_manager.clusters == [[0,1,2]]
    tm = construct_tardy_model(
      labels=labels, sites=sites, masses=masses, tardy_tree=tt)
    tardy_models.append(tm)
    assert len(tm.bodies) == 1
    assert tm.bodies[0].joint.degrees_of_freedom == 0
    exercise_linear_velocity_manipulations(tardy_model=tm)
  return tardy_models
 except RuntimeError, e:
   assert str(e) == \
     "determine_weighted_order_for_construct_spanning_tree():" \
     " fixed vertex lists in same connected tree."
 else: raise Exception_expected
 try:
   tc.tardy_tree_construct(fixed_vertex_lists=[[0],[11]])
 except RuntimeError, e:
   assert str(e) == \
     "construct_spanning_trees():" \
     " fixed vertex lists in same connected tree."
 else: raise Exception_expected
 #
 for tc in test_cases:
   if (max(tc.tree_ids1) == 0): continue
   tt = construct(n_vertices=tc.n_vertices, edge_list=tc.edge_list)
   tt.build_tree()
   cm = tt.cluster_manager
   cl = cm.clusters
   ti = cm.tree_ids()
   assert ti[0] != ti[-1]
   for lfvl0 in xrange(1,len(cl[0])+1):
     for lfvl1 in xrange(1,len(cl[-1])+1):
       for i_trial in xrange(n_trials):
         fvl0 = random_permutation(cl[0])[:lfvl0]
         fvl1 = random_permutation(cl[-1])[:lfvl1]
         ttf = construct(
           n_vertices=tc.n_vertices,
           edge_list=tc.edge_list,
           fixed_vertex_lists=[fvl0, fvl1]).build_tree()
         cmf = ttf.cluster_manager
Example #22
0
def exercise_fixed_vertices(n_trials=10):
    cm = cluster_manager(n_vertices=2, fixed_vertex_lists=[[0]])
    assert cm.clusters == [[0], [1]]
    cm = cluster_manager(n_vertices=2, fixed_vertex_lists=[[1]])
    assert cm.clusters == [[1], [0]]
    edge_list = [(0, 1), (1, 2), (2, 3), (1, 3)]
    edge_sets = construct_edge_sets(n_vertices=4, edge_list=edge_list)
    for fixed_vertex in [0, 1]:
        for optimize in [False, True]:
            for connects in [[(1, 2), (2, 3)], [(2, 3), (1, 2)],
                             [(2, 1), (3, 2)]]:
                cm = cluster_manager(n_vertices=4,
                                     fixed_vertex_lists=[[fixed_vertex]])
                for i, j in connects:
                    cm.connect_vertices(i=i, j=j, optimize=optimize)
                if (fixed_vertex == 0):
                    if (connects[0] == (2, 1)):
                        if (not optimize):
                            assert cm.clusters == [[0], [], [], [3, 2, 1]]
                        else:
                            assert cm.clusters == [[0], [], [2, 1, 3], []]
                    else:
                        if (not optimize or connects[0][0] == 1):
                            assert cm.clusters == [[0], [1, 2, 3], [], []]
                        else:
                            assert cm.clusters == [[0], [], [2, 3, 1], []]
                    cm.tidy()
                    assert cm.clusters == [[0], [1, 2, 3]]
                else:
                    assert cm.clusters == [[1, 2, 3], [0], [], []]
                    cm.tidy()
                    assert cm.clusters == [[1, 2, 3], [0]]
                cm.construct_spanning_trees(edge_sets=edge_sets)
                assert cm.clusters == [[0, 1, 2, 3]]
                assert cm.hinge_edges == [(-1, 1)]
                assert cm.loop_edges == []
    #
    from scitbx.graph import test_cases_tardy_pdb
    tc = test_cases_tardy_pdb.test_cases[5]
    assert tc.tag == "tyr_with_h"
    tt = tc.tardy_tree_construct(fixed_vertex_lists=[[0, 16, 17]])
    assert tt.cluster_manager.clusters == [[
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19
    ], [11], [20]]
    try:
        tc.tardy_tree_construct(fixed_vertex_lists=[[0], [1]])
    except RuntimeError as e:
        assert str(e) == \
          "connect_clusters(): fixed vertex lists in same connected tree."
    else:
        raise Exception_expected
    try:
        tc.tardy_tree_construct(fixed_vertex_lists=[[0], [10]])
    except RuntimeError as e:
        assert str(e) == \
          "determine_weighted_order_for_construct_spanning_tree():" \
          " fixed vertex lists in same connected tree."
    else:
        raise Exception_expected
    try:
        tc.tardy_tree_construct(fixed_vertex_lists=[[0], [11]])
    except RuntimeError as e:
        assert str(e) == \
          "construct_spanning_trees():" \
          " fixed vertex lists in same connected tree."
    else:
        raise Exception_expected
    #
    for tc in test_cases:
        if (max(tc.tree_ids1) == 0): continue
        tt = construct(n_vertices=tc.n_vertices, edge_list=tc.edge_list)
        tt.build_tree()
        cm = tt.cluster_manager
        cl = cm.clusters
        ti = cm.tree_ids()
        assert ti[0] != ti[-1]
        for lfvl0 in range(1, len(cl[0]) + 1):
            for lfvl1 in range(1, len(cl[-1]) + 1):
                for i_trial in range(n_trials):
                    fvl0 = random_permutation(cl[0])[:lfvl0]
                    fvl1 = random_permutation(cl[-1])[:lfvl1]
                    ttf = construct(n_vertices=tc.n_vertices,
                                    edge_list=tc.edge_list,
                                    fixed_vertex_lists=[fvl0,
                                                        fvl1]).build_tree()
                    cmf = ttf.cluster_manager
                    cif = cmf.cluster_indices
                    fvgci = cmf.fixed_vertices_given_cluster_index_dict()
                    assert len(fvgci) == len(cmf.fixed_vertex_lists)
                    for fixed_vertices in cmf.fixed_vertex_lists:
                        assert len(set([cif[i] for i in fixed_vertices])) == 1
                        assert fvgci[cif[fixed_vertices[0]]] is fixed_vertices
    #
    for fixed_vertex in [0, 1]:
        tt = construct(n_vertices=2,
                       edge_list=[(0, 1)],
                       fixed_vertex_lists=[[fixed_vertex]]).build_tree()
        assert tt.cluster_manager.clusters == [[0, 1]]
    #
    for fixed_vertex in [0, 1, 2]:
        tt = construct(n_vertices=3,
                       edge_list=[(0, 1), (1, 2)],
                       fixed_vertex_lists=[[fixed_vertex]]).build_tree()
        assert tt.cluster_manager.clusters == [[0, 1, 2]]
    #
    el = [(8, 9), (7, 9), (3, 7), (8, 11), (8, 12), (12, 14), (13, 15),
          (7, 13), (1, 6), (4, 6), (0, 5)]
    tt = construct(n_vertices=16, edge_list=el, fixed_vertices=())
    assert tt.cluster_manager.fixed_vertex_lists == ()
    tt = construct(n_vertices=16,
                   edge_list=el,
                   fixed_vertices=(12, 6, 4, 7, 9, 5))
    assert tt.cluster_manager.fixed_vertex_lists == [[12, 7, 9], [6, 4], [5]]
Example #23
0
def exercise_fixed_vertices_special_cases():
    tardy_models = []
    """
          2
         /
    0---1
  """
    x = 0.5 * 3**0.5
    y = 0.5
    sites = matrix.col_list([(0, 0, 0), (1, 0, 0), (1 + x, y, 0)])
    edge_list = [(0, 1), (1, 2)]
    for i, j in edge_list:
        assert approx_equal(abs(sites[i] - sites[j]), 1)
    labels = [str(i) for i in range(len(sites))]
    masses = [1] * len(sites)
    #
    tt = tardy_tree.construct(sites=sites,
                              edge_list=edge_list,
                              fixed_vertex_lists=[])
    assert tt.cluster_manager.clusters == [[0, 1, 2]]
    tm = construct_tardy_model(labels=labels,
                               sites=sites,
                               masses=masses,
                               tardy_tree=tt)
    tardy_models.append(tm)
    assert len(tm.bodies) == 1
    assert tm.bodies[0].joint.degrees_of_freedom == 6
    exercise_linear_velocity_manipulations(tardy_model=tm)
    #
    expected_e_kin_1 = [
        1.00009768395, 1.00002522865, 1.00000107257, 1.0, 1.0, 1.0, 0.0
    ]
    rnd = random.Random(0)
    for i_fv, fixed_vertices in enumerate([[0], [1], [2], [0, 1], [0, 2],
                                           [1, 2], [0, 1, 2]]):
        tt = tardy_tree.construct(sites=sites,
                                  edge_list=edge_list,
                                  fixed_vertex_lists=[fixed_vertices])
        assert tt.cluster_manager.clusters == [[0, 1, 2]]
        tm = construct_tardy_model(labels=labels,
                                   sites=sites,
                                   masses=masses,
                                   tardy_tree=tt)
        tardy_models.append(tm)
        assert len(tm.bodies) == 1
        assert tm.bodies[0].joint.degrees_of_freedom \
            == [3,1,0][len(fixed_vertices)-1]
        tm.assign_random_velocities(e_kin_target=1, random_gauss=rnd.gauss)
        if (len(fixed_vertices) != 3):
            assert approx_equal(tm.e_kin(), 1, eps=1e-10)
        else:
            assert approx_equal(tm.e_kin(), 0, eps=1e-10)
        tm.dynamics_step(delta_t=0.01)
        assert approx_equal(tm.e_kin(), expected_e_kin_1[i_fv], eps=1e-10)
        exercise_linear_velocity_manipulations(tardy_model=tm)
    #
    sites[2] = matrix.col([2, 0, 0])
    assert approx_equal((sites[0] - sites[1]).cos_angle(sites[2] - sites[1]),
                        -1)
    for fixed_vertices in [[0, 1], [0, 2], [1, 2]]:
        tt = tardy_tree.construct(sites=sites,
                                  edge_list=edge_list,
                                  fixed_vertex_lists=[fixed_vertices])
        assert tt.cluster_manager.clusters == [[0, 1, 2]]
        tm = construct_tardy_model(labels=labels,
                                   sites=sites,
                                   masses=masses,
                                   tardy_tree=tt)
        tardy_models.append(tm)
        assert len(tm.bodies) == 1
        assert tm.bodies[0].joint.degrees_of_freedom == 0
        exercise_linear_velocity_manipulations(tardy_model=tm)
    return tardy_models