class MinimizationTestCase(unittest.TestCase): def setUp(self): self.molecule = Molecule(pdb_file_location='tests/data/ref01.pdb') self.parameters = Parameters() self.molecule.set_force_field_parameters(self.parameters) self.optimization = GradientDescent(self.atom_energy_function) self.optimization.dimensions_number = 3 self.optimization.iterations = 40 self.optimization.precision = 0.01 self.optimization.small_step = 0.00015 self.optimization.smallest_step = self.optimization.small_step / 128 self.force_field = ForceField(self.parameters) self.atom_index = 0 def test_gradient_descent(self): self.atom_index = 0 for j in range(5): self.optimization.run() atom = self.molecule.atoms[self.atom_index] atom.translate_starting_point( self.optimization.best_particle.dimensions) self.atom_index += 1 energy = self.force_field.calculate_energy(self.molecule) # self.force_field.print_energy() self.assertEqual(energy, 599.882043366674) def atom_energy_function(self, particle): a = self.molecule.atoms[self.atom_index] a.translate_starting_point(particle.dimensions) return self.force_field.calculate_energy(self.molecule, atom=a, protect_bonds=False)
def setUp(self): self.molecule = Molecule(pdb_file_location='tests/data/ref01.pdb') self.parameters = Parameters() self.molecule.set_force_field_parameters(self.parameters) self.optimization = GradientDescent(self.atom_energy_function) self.optimization.dimensions_number = 3 self.optimization.iterations = 40 self.optimization.precision = 0.01 self.optimization.small_step = 0.00015 self.optimization.smallest_step = self.optimization.small_step / 128 self.force_field = ForceField(self.parameters) self.atom_index = 0
def _populate_molecule(self): pointer = np.array([0, 0, 0]) c_n_separator = np.array([1.3350, 0, 0]) i = 0 for a in self.sequence: i += 1 abbreviation = code_map[a] residue = Molecule(pdb_file_location='data/catalog/' + abbreviation + '.pdb') if i == 1: Fasta._add_n_terminal_hydrogen(residue) if i == len(self.sequence): Fasta._add_c_terminal_oxygen(residue) n_terminal = residue.amino_acids[0].atoms_map['N'] c_terminal = residue.amino_acids[0].atoms_map['C'] delta = np.array(n_terminal.point) - np.array(pointer) residue.translate(-delta) for a in residue.atoms: a.res_seq = i self.molecule.atoms.append(a.copy()) pointer = np.array(c_terminal.point) + c_n_separator
def test_rotation(self): parameters = Parameters() self.generated.set_force_field_parameters(parameters) topology = self.generated.get_topology() phi = [] psi = [] for i in range(len(input_phi_psi)): phi.append(input_phi_psi[i][1]) psi.append(input_phi_psi[i][2]) topology.rotate_backbone('PHI', phi) topology.rotate_backbone('PSI', psi) expected = Molecule(pdb_file_location='tests/data/rotated.pdb') rmsd = self.generated.rmsd(expected) self.assertLess(rmsd, 0.05)
def __init__(self, sequence): self.sequence = sequence self.molecule = Molecule()
class Fasta: def __init__(self, sequence): self.sequence = sequence self.molecule = Molecule() def to_pdb(self): self._populate_molecule() self.molecule.add_sequential_ids() self.molecule.update_internal_state() parameters = Parameters() self.molecule.set_force_field_parameters(parameters) self._rotate_to_default_position() return self.molecule def _populate_molecule(self): pointer = np.array([0, 0, 0]) c_n_separator = np.array([1.3350, 0, 0]) i = 0 for a in self.sequence: i += 1 abbreviation = code_map[a] residue = Molecule(pdb_file_location='data/catalog/' + abbreviation + '.pdb') if i == 1: Fasta._add_n_terminal_hydrogen(residue) if i == len(self.sequence): Fasta._add_c_terminal_oxygen(residue) n_terminal = residue.amino_acids[0].atoms_map['N'] c_terminal = residue.amino_acids[0].atoms_map['C'] delta = np.array(n_terminal.point) - np.array(pointer) residue.translate(-delta) for a in residue.atoms: a.res_seq = i self.molecule.atoms.append(a.copy()) pointer = np.array(c_terminal.point) + c_n_separator def _rotate_to_default_position(self): topology = self.molecule.get_topology() for i in range(len(self.molecule.amino_acids)): amino_acid = self.molecule.amino_acids[i] backbone_torsions_map = topology.backbone_torsions_map[ amino_acid.sequence] if not amino_acid.is_last(): topology.fix_nitrogen(amino_acid, self.molecule.amino_acids[i + 1]) topology.fix_alpha_carbon(amino_acid, self.molecule.amino_acids[i + 1]) if 'PSI' in backbone_torsions_map: topology.rotate_proper_dihedral(backbone_torsions_map['PSI'], 180.0) if 'PHI' in backbone_torsions_map: topology.rotate_proper_dihedral(backbone_torsions_map['PHI'], 180.0) if 'OMEGA' in backbone_torsions_map: topology.rotate_proper_dihedral(backbone_torsions_map['OMEGA'], 180.0) # if not amino_acid.is_first(): topology.set_side_chain_torsion(amino_acid, 0) for i in range(len(self.molecule.amino_acids)): amino_acid = self.molecule.amino_acids[i] if not amino_acid.is_last(): topology.fix_oxygen(amino_acid, self.molecule.amino_acids[i + 1]) topology.fix_amine_hydrogen_torsion( amino_acid, self.molecule.amino_acids[i + 1]) topology.fix_amine_hydrogen(amino_acid, self.molecule.amino_acids[i + 1]) topology.fix_amine_hydrogen_angle_to_ca(amino_acid) @staticmethod def _add_n_terminal_hydrogen(residue): n = residue.amino_acids[0].atoms_map['N'] h1 = residue.amino_acids[0].atoms_map['H'] h1.name = 'H1' # ATOM 9 H1 ASN A 1 -8.330 3.957 0.261 1.00 0.00 H # ATOM 10 H2 ASN A 1 -8.740 5.068 -0.889 1.00 0.00 H # ATOM 11 H3 ASN A 1 -9.877 4.041 -0.293 1.00 0.00 H h2 = h1.copy().translate([-0.3, -0.5, -1.3]) h3 = h1.copy().translate([0, -1.1, -0.3]) h2.name = 'H2' h3.name = 'H3' residue.atoms.append(h2) residue.atoms.append(h3) residue.update_internal_state() @staticmethod def _add_c_terminal_oxygen(residue): o_atom = residue.amino_acids[0].atoms_map['O'] oxt_atom = o_atom.copy().translate([-1.5, +0.0, 1.7]) oxt_atom.name = 'OXT' residue.atoms.append(oxt_atom) residue.update_internal_state()
def test_generate_molecule(self): expected = Molecule(pdb_file_location='tests/data/generated.pdb') rmsd = self.generated.rmsd(expected) self.assertLess(rmsd, 0.0006)
def setUp(self): self.parameters = Parameters() self.ligand = Molecule(pdb_file_location='tests/data/ligand.pdb')
def test_read_molecule(self): molecule = Molecule(pdb_file_location='tests/data/1l2y-01.pdb') self.assertEqual(len(molecule.amino_acids), 20)