Esempio n. 1
0
    def test_topology_get_index(self):
        top = Topology()
        conn_members = [Site(), Site(), Site(), Site()]
        for i in range(5):
            top.add_site(Site())
            top.add_connection(Bond(
                connection_members=[conn_members[0], conn_members[1]]))
            top.add_connection(Angle(
                connection_members=[conn_members[0], conn_members[1], conn_members[2]]))
            top.add_connection(Dihedral(
                connection_members=[conn_members[0], conn_members[1], conn_members[2], conn_members[3]]))
            top.add_connection(Improper(
                connection_members=[conn_members[0], conn_members[1], conn_members[2], conn_members[3]]))
        a_bond = Bond(connection_members=[conn_members[0], conn_members[1]])
        an_angle = Angle(connection_members=[conn_members[0], conn_members[1], conn_members[2]])
        a_site = Site()
        a_dihedral = Dihedral(connection_members=[conn_members[0], conn_members[1], conn_members[2], conn_members[3]])
        an_improper = Improper(connection_members=[conn_members[0], conn_members[1], conn_members[2], conn_members[3]])

        top.add_site(a_site)
        top.add_connection(a_bond)
        top.add_connection(an_angle)
        top.add_connection(a_dihedral)
        top.add_connection(an_improper)

        assert top.get_index(a_site) == 9
        assert top.get_index(a_bond) == 5
        assert top.get_index(an_angle) == 5
        assert top.get_index(a_dihedral) == 5
        assert top.get_index(an_improper) == 5
Esempio n. 2
0
    def test_angle_eq(self):
        atom1 = Atom(name='atom1', position=[0, 0, 0])
        atom2 = Atom(name='atom2', position=[1, 1, 1])
        atom3 = Atom(name='atom3', position=[1, 1, 1])

        ref_angle = Angle(connection_members=[atom1, atom2, atom3], )

        same_angle = Angle(connection_members=[atom1, atom2, atom3], )

        diff_angle = Angle(connection_members=[atom3, atom2, atom1], )

        assert ref_angle != same_angle
        assert ref_angle != diff_angle
Esempio n. 3
0
    def test_angle_eq(self):
        site1 = Site(name='site1', position=[0, 0, 0])
        site2 = Site(name='site2', position=[1, 1, 1])
        site3 = Site(name='site3', position=[1, 1, 1])

        ref_angle = Angle(connection_members=[site1, site2, site3], )

        same_angle = Angle(connection_members=[site1, site2, site3], )

        diff_angle = Angle(connection_members=[site3, site2, site1], )

        assert ref_angle != same_angle
        assert ref_angle != diff_angle
Esempio n. 4
0
    def test_topology_get_index(self):
        top = Topology()
        conn_members = [Atom() for _ in range(10)]
        for atom in conn_members:
            top.add_site(atom)

        for i in range(5):
            top.add_connection(
                Bond(connection_members=[conn_members[i], conn_members[i +
                                                                       1]]))
            top.add_connection(
                Angle(connection_members=[
                    conn_members[i], conn_members[i + 1], conn_members[i + 2]
                ]))
            top.add_connection(
                Dihedral(connection_members=[
                    conn_members[i], conn_members[i + 1], conn_members[i + 2],
                    conn_members[i + 3]
                ]))
            top.add_connection(
                Improper(connection_members=[
                    conn_members[i], conn_members[i + 1], conn_members[i + 2],
                    conn_members[i + 3]
                ]))

        a_atom = Atom()
        a_bond = Bond(connection_members=[conn_members[6], conn_members[7]])
        an_angle = Angle(connection_members=[
            conn_members[6], conn_members[7], conn_members[8]
        ])
        a_dihedral = Dihedral(connection_members=[
            conn_members[6], conn_members[7], conn_members[8], conn_members[9]
        ])
        an_improper = Improper(connection_members=[
            conn_members[6], conn_members[7], conn_members[8], conn_members[9]
        ])

        top.add_site(a_atom)
        top.add_connection(a_bond)
        top.add_connection(an_angle)
        top.add_connection(a_dihedral)
        top.add_connection(an_improper)

        assert top.get_index(a_atom) == 10
        assert top.get_index(a_bond) == 5
        assert top.get_index(an_angle) == 5
        assert top.get_index(a_dihedral) == 5
        assert top.get_index(an_improper) == 5
Esempio n. 5
0
    def test_angle_nonparametrized(self):
        atom1 = Atom(name='atom1')
        atom2 = Atom(name='atom2')
        atom3 = Atom(name='atom3')

        connect = Angle(connection_members=[atom1, atom2, atom3])
        assert connect.angle_type is None
Esempio n. 6
0
 def test_angle_fake_angletype(self):
     atom1 = Atom(name='atom1')
     atom2 = Atom(name='atom2')
     atom3 = Atom(name='atom3')
     with pytest.raises(ValidationError):
         Angle(connection_members=[atom1, atom2, atom3],
               angle_type='Fake angletype')
Esempio n. 7
0
 def test_angle_fake_angletype(self):
     site1 = Site(name='site1')
     site2 = Site(name='site2')
     site3 = Site(name='site3')
     with pytest.raises(GMSOError):
         Angle(connection_members=[site1, site2, site3],
               connection_type='Fake angletype')
Esempio n. 8
0
    def test_add_equivalent_connections(self):
        atom1 = Atom(name="AtomA")
        atom2 = Atom(name="AtomB")
        atom3 = Atom(name="AtomC")

        angle = Angle(connection_members=[atom1, atom2, atom3])
        angle_eq = Angle(connection_members=[atom3, atom2, atom1])
        angle_not_eq = Angle(connection_members=[atom1, atom3, atom2])

        top = Topology()
        top.add_connection(angle)
        top.add_connection(angle_eq)
        assert top.n_angles == 1

        top.add_connection(angle_not_eq)
        assert top.n_angles == 2
Esempio n. 9
0
    def test_equivalent_members_set(self):
        atom1 = Atom(name="AtomA")
        atom2 = Atom(name="AtomB")
        atom3 = Atom(name="AtomC")

        angle = Angle(connection_members=[atom1, atom2, atom3])
        angle_eq = Angle(connection_members=[atom3, atom2, atom1])
        angle_not_eq = Angle(connection_members=[atom1, atom3, atom2])

        assert tuple(angle_eq.connection_members) in angle.equivalent_members()
        assert tuple(angle.connection_members) in angle_eq.equivalent_members()
        assert not (tuple(angle.connection_members)
                    in angle_not_eq.equivalent_members())
Esempio n. 10
0
 def test_angle_to_json_loop(self, typed_ethane, are_equivalent_atoms):
     for angle in typed_ethane.angles:
         angle_json = angle.json()
         angle_copy = Angle.parse_raw(angle_json)
         for member1, member2 in zip(angle.connection_members,
                                     angle_copy.connection_members):
             assert are_equivalent_atoms(member1, member2)
         assert angle.angle_type == angle_copy.angle_type
Esempio n. 11
0
 def test_angle_fake_angletype(self):
     atom1 = Atom(name="atom1")
     atom2 = Atom(name="atom2")
     atom3 = Atom(name="atom3")
     with pytest.raises(ValidationError):
         Angle(
             connection_members=[atom1, atom2, atom3],
             angle_type="Fake angletype",
         )
Esempio n. 12
0
    def test_angle_parametrized(self):
        atom1 = Atom(name='atom1')
        atom2 = Atom(name='atom2')
        atom3 = Atom(name='atom3')

        angle_type = AngleType()

        connect = Angle(connection_members=[atom1, atom2, atom3],
                        angle_type=angle_type,
                        name='angle_name')

        assert len(connect.connection_members) == 3
        assert connect.angle_type is not None
        assert connect.name == 'angle_name'
Esempio n. 13
0
    def test_angle_nonparametrized(self):
        site1 = Site(name='site1')
        site2 = Site(name='site2')
        site3 = Site(name='site3')

        assert site1.n_connections == 0
        assert site2.n_connections == 0
        assert site3.n_connections == 0

        connect = Angle(connection_members=[site1, site2, site3])

        assert site1.n_connections == 1
        assert site2.n_connections == 1
        assert site3.n_connections == 1
        assert connect.connection_type is None
Esempio n. 14
0
 def test_angle_constituent_types(self):
     site1 = Site(name='site1',
                  position=[0, 0, 0],
                  atom_type=AtomType(name='A'))
     site2 = Site(name='site2',
                  position=[1, 0, 0],
                  atom_type=AtomType(name='B'))
     site3 = Site(name='site3',
                  position=[1, 1, 0],
                  atom_type=AtomType(name='C'))
     angtype = AngleType(member_types=[
         site1.atom_type.name, site2.atom_type.name, site3.atom_type.name
     ])
     ang = Angle(connection_members=[site1, site2, site3],
                 connection_type=angtype)
     assert 'A' in ang.connection_type.member_types
     assert 'B' in ang.connection_type.member_types
     assert 'C' in ang.connection_type.member_types
Esempio n. 15
0
 def test_angle_constituent_types(self):
     atom1 = Atom(name='atom1',
                  position=[0, 0, 0],
                  atom_type=AtomType(name='A'))
     atom2 = Atom(name='atom2',
                  position=[1, 0, 0],
                  atom_type=AtomType(name='B'))
     atom3 = Atom(name='atom3',
                  position=[1, 1, 0],
                  atom_type=AtomType(name='C'))
     angtype = AngleType(member_types=[
         atom1.atom_type.name, atom2.atom_type.name, atom3.atom_type.name
     ])
     ang = Angle(connection_members=[atom1, atom2, atom3],
                 angle_type=angtype)
     assert 'A' in ang.angle_type.member_types
     assert 'B' in ang.angle_type.member_types
     assert 'C' in ang.angle_type.member_types
Esempio n. 16
0
    def test_angle_angletype_update(self):
        top = Topology()

        atype1 = AtomType(expression='sigma + epsilon')
        atype2 = AtomType(expression='sigma * epsilon')
        site1 = Site('a', atom_type=atype1)
        site2 = Site('b', atom_type=atype2)
        site3 = Site('c', atom_type=atype2)
        atype = AngleType()
        angle = Angle(connection_members=[site1, site2, site3], connection_type=atype, name='angle_name')
        top.add_site(site1)
        top.add_site(site2)
        top.add_site(site3)
        top.add_connection(angle)

        assert top.n_angles == 1
        assert len(top.angle_types) == 1
        assert len(top.angle_type_expressions) == 1
        assert len(top.atom_type_expressions) == 2
Esempio n. 17
0
 def test_angle_constituent_types(self):
     atom1 = Atom(name="atom1",
                  position=[0, 0, 0],
                  atom_type=AtomType(name="A"))
     atom2 = Atom(name="atom2",
                  position=[1, 0, 0],
                  atom_type=AtomType(name="B"))
     atom3 = Atom(name="atom3",
                  position=[1, 1, 0],
                  atom_type=AtomType(name="C"))
     angtype = AngleType(member_types=[
         atom1.atom_type.name,
         atom2.atom_type.name,
         atom3.atom_type.name,
     ])
     ang = Angle(connection_members=[atom1, atom2, atom3],
                 angle_type=angtype)
     assert "A" in ang.angle_type.member_types
     assert "B" in ang.angle_type.member_types
     assert "C" in ang.angle_type.member_types
Esempio n. 18
0
    def test_angle_parametrized(self):
        site1 = Site(name='site1')
        site2 = Site(name='site2')
        site3 = Site(name='site3')

        assert site1.n_connections == 0
        assert site2.n_connections == 0
        assert site3.n_connections == 0
        angle_type = AngleType()

        connect = Angle(connection_members=[site1, site2, site3],
                        connection_type=angle_type,
                        name='angle_name')

        assert site1.n_connections == 1
        assert site2.n_connections == 1
        assert site3.n_connections == 1
        assert len(connect.connection_members) == 3
        assert connect.connection_type is not None
        assert connect.name == 'angle_name'
Esempio n. 19
0
    def test_angle_angletype_update(self):
        top = Topology()

        atype1 = AtomType(expression='sigma + epsilon*r')
        atype2 = AtomType(expression='sigma * epsilon*r')
        atom1 = Atom(name='a', atom_type=atype1)
        atom2 = Atom(name='b', atom_type=atype2)
        atom3 = Atom(name='c', atom_type=atype2)
        atype = AngleType()
        angle = Angle(connection_members=[atom1, atom2, atom3],
                      angle_type=atype,
                      name='angle_name')
        top.add_site(atom1)
        top.add_site(atom2)
        top.add_site(atom3)
        top.add_connection(angle)

        assert top.n_angles == 1
        assert len(top.angle_types) == 1
        assert len(top.angle_type_expressions) == 1
        assert len(top.atom_type_expressions) == 2
Esempio n. 20
0
    def typed_water_system(self, water_system):
        top = water_system

        ff = ForceField(get_path('tip3p.xml'))

        element_map = {"O": "opls_111", "H": "opls_112"}

        for atom in top.sites:
            atom.atom_type = ff.atom_types[atom.name]

        for bond in top.bonds:
            bond.connection_type = ff.bond_types["opls_111~opls_112"]

        for subtop in top.subtops:
            angle = Angle(
                connection_members=[site for site in subtop.sites],
                name="opls_112~opls_111~opls_112",
                connection_type=ff.angle_types["opls_112~opls_111~opls_112"])
            top.add_connection(angle)

        top.update_topology()
        return top
Esempio n. 21
0
def _get_connection(filename, topology, unit_style, connection_type):
    """General function to parse connection types
    """
    with open(filename, 'r') as lammps_file:
        types = False
        for i, line in enumerate(lammps_file):
            if connection_type in line.split():
                n_connection_types = int(line.split()[0])
                types = True
            if connection_type.capitalize() in line.split():
                break
    if types == False:
        return topology
    connection_type_lines = open(filename, 'r').readlines()[i+2:i+n_connection_types+2]
    connection_type_list = list()
    for line in connection_type_lines:
        if connection_type == 'bond':
            c_type = BondType(name=line.split()[0]
                    )
            # Multiply 'k' by 2 since LAMMPS includes 1/2 in the term
            c_type.parameters['k']=float(line.split()[1])*u.Unit(
                                     get_units(unit_style)['energy']/
                                     get_units(unit_style)['distance']**2
                                     )*2
            c_type.parameters['r_eq']=float(line.split()[2])*(get_units(unit_style)['distance']**2)
        elif connection_type == 'angle':
            c_type = AngleType(name=line.split()[0]
                    )
            # Multiply 'k' by 2 since LAMMPS includes 1/2 in the term
            c_type.parameters['k']=float(line.split()[1])*u.Unit(
                                     get_units(unit_style)['energy']/
                                     get_units(unit_style)['angle_k']**2
                                     )*2
            c_type.parameters['theta_eq']=float(line.split()[2])*u.Unit(
                                     get_units(unit_style)['angle'])

        connection_type_list.append(c_type)

    with open(filename, 'r') as lammps_file:
        for i, line in enumerate(lammps_file):
            if connection_type + 's' in line.split():
                n_connections = int(line.split()[0])
            if connection_type.capitalize() + 's' in line.split():
                break
    connection_lines = open(filename, 'r').readlines()[i+2:i+n_connections+2]
    # Determine number of sites to generate
    if connection_type == 'bond':
        n_sites = 2
    elif connection_type == 'angle':
        n_sites = 3
    else:
        n_sites = 4
    for i, line in enumerate(connection_lines):
        site_list = list()
        for j in range(n_sites):
            site = topology.sites[int(line.split()[j+2])-1]
            site_list.append(site)
        if connection_type == 'bond':
            connection = Bond(
                connection_members=site_list,
                connection_type=connection_type_list[int(line.split()[1])-1],
                    )
        elif connection_type == 'angle':
            connection = Angle(
                connection_members=site_list,
                connection_type=connection_type_list[int(line.split()[1])-1],
                    )
        topology.add_connection(connection)

    return topology
Esempio n. 22
0
 def test_angle_fake(self):
     site1 = Site(name='site1')
     site2 = Site(name='site2')
     site3 = Site(name='site3')
     with pytest.raises(GMSOError):
         Angle(connection_members=['fakesite1', 'fakesite2', 4.2])
Esempio n. 23
0
def _get_connection(filename, topology, unit_style, connection_type):
    """Parse connection types."""
    with open(filename, "r") as lammps_file:
        types = False
        for i, line in enumerate(lammps_file):
            if connection_type in line.split():
                n_connection_types = int(line.split()[0])
                types = True
            if connection_type.capitalize() in line.split():
                break
    if types == False:
        return topology
    connection_type_lines = open(
        filename, "r").readlines()[i + 2:i + n_connection_types + 2]
    connection_type_list = list()
    for line in connection_type_lines:
        if connection_type == "bond":
            c_type = BondType(name=line.split()[0])
            # Multiply 'k' by 2 since LAMMPS includes 1/2 in the term
            c_type.parameters["k"] = (float(line.split()[1]) * u.Unit(
                get_units(unit_style)["energy"] /
                get_units(unit_style)["distance"]**2) * 2)
            c_type.parameters["r_eq"] = float(
                line.split()[2]) * (get_units(unit_style)["distance"]**2)
        elif connection_type == "angle":
            c_type = AngleType(name=line.split()[0])
            # Multiply 'k' by 2 since LAMMPS includes 1/2 in the term
            c_type.parameters["k"] = (float(line.split()[1]) * u.Unit(
                get_units(unit_style)["energy"] /
                get_units(unit_style)["angle_k"]**2) * 2)
            c_type.parameters["theta_eq"] = float(line.split()[2]) * u.Unit(
                get_units(unit_style)["angle"])

        connection_type_list.append(c_type)

    with open(filename, "r") as lammps_file:
        for i, line in enumerate(lammps_file):
            if connection_type + "s" in line.split():
                n_connections = int(line.split()[0])
            if connection_type.capitalize() + "s" in line.split():
                break
    connection_lines = open(filename,
                            "r").readlines()[i + 2:i + n_connections + 2]
    # Determine number of sites to generate
    if connection_type == "bond":
        n_sites = 2
    elif connection_type == "angle":
        n_sites = 3
    else:
        n_sites = 4
    for i, line in enumerate(connection_lines):
        site_list = list()
        for j in range(n_sites):
            site = topology.sites[int(line.split()[j + 2]) - 1]
            site_list.append(site)
        if connection_type == "bond":
            connection = Bond(
                connection_members=site_list,
                bond_type=connection_type_list[int(line.split()[1]) - 1],
            )
        elif connection_type == "angle":
            connection = Angle(
                connection_members=site_list,
                angle_type=connection_type_list[int(line.split()[1]) - 1],
            )
        topology.add_connection(connection)

    return topology
Esempio n. 24
0
 def test_angle_fake(self):
     atom1 = Atom(name='atom1')
     atom2 = Atom(name='atom2')
     atom3 = Atom(name='atom3')
     with pytest.raises(ValidationError):
         Angle(connection_members=['fakesite1', 'fakesite2', 4.2])
Esempio n. 25
0
 def test_angle_fake(self):
     atom1 = Atom(name="atom1")
     atom2 = Atom(name="atom2")
     atom3 = Atom(name="atom3")
     with pytest.raises(ValidationError):
         Angle(connection_members=["fakesite1", "fakesite2", 4.2])