Package test_suite :: Package system_tests :: Module structure
[hide private]
[frames] | no frames]

Source Code for Module test_suite.system_tests.structure

   1  ############################################################################### 
   2  #                                                                             # 
   3  # Copyright (C) 2008-2016 Edward d'Auvergne                                   # 
   4  #                                                                             # 
   5  # This file is part of the program relax (http://www.nmr-relax.com).          # 
   6  #                                                                             # 
   7  # This program is free software: you can redistribute it and/or modify        # 
   8  # it under the terms of the GNU General Public License as published by        # 
   9  # the Free Software Foundation, either version 3 of the License, or           # 
  10  # (at your option) any later version.                                         # 
  11  #                                                                             # 
  12  # This program is distributed in the hope that it will be useful,             # 
  13  # but WITHOUT ANY WARRANTY; without even the implied warranty of              # 
  14  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               # 
  15  # GNU General Public License for more details.                                # 
  16  #                                                                             # 
  17  # You should have received a copy of the GNU General Public License           # 
  18  # along with this program.  If not, see <http://www.gnu.org/licenses/>.       # 
  19  #                                                                             # 
  20  ############################################################################### 
  21   
  22  # Python module imports. 
  23  from math import sqrt 
  24  from numpy import array, average, dot, float64, mean, sign, std, zeros 
  25  from numpy.linalg import norm 
  26  from os import sep 
  27  from re import search 
  28  import sys 
  29  from tempfile import mkdtemp, mktemp 
  30   
  31  # relax module imports. 
  32  from data_store import Relax_data_store; ds = Relax_data_store() 
  33  from pipe_control.mol_res_spin import count_spins, return_spin, spin_loop 
  34  from lib.errors import RelaxError 
  35  from lib.geometry.rotations import axis_angle_to_R, euler_to_R_zyz 
  36  from lib.geometry.vectors import vector_angle_acos 
  37  from lib.io import DummyFileObject 
  38  from status import Status; status = Status() 
  39  from test_suite.system_tests.base_classes import SystemTestCase 
  40   
  41   
42 -class Structure(SystemTestCase):
43 """Class for testing the structural objects.""" 44
45 - def setUp(self):
46 """Set up for all the functional tests.""" 47 48 # Create the data pipe. 49 self.interpreter.pipe.create('mf', 'mf') 50 51 # Create a temporary directory for dumping files. 52 ds.tmpdir = mkdtemp()
53 54
55 - def strip_remarks(self, lines):
56 """Strip out all PDB remark lines. 57 58 @param lines: The list of PDB lines. 59 @type lines: list of str 60 """ 61 62 # Rebuild the list. 63 lines[:] = [x for x in lines if x[:6] != 'REMARK']
64 65
66 - def test_align(self):
67 """Test the U{structure.superimpose user function<http://www.nmr-relax.com/manual/structure_superimpose.html>}.""" 68 69 # Reset relax. 70 self.interpreter.reset() 71 72 # Path of the PDB file. 73 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'diffusion_tensor'+sep+'sphere' 74 75 # Create a data pipe for the reference structure, then load it. 76 self.interpreter.pipe.create('ref', 'N-state') 77 self.interpreter.structure.read_pdb('uniform.pdb', dir=path) 78 79 # Delete a residue and atom. 80 self.interpreter.structure.delete(":8") 81 self.interpreter.structure.delete(":2@N") 82 83 # Output PDB to stdout to help in debugging. 84 self.interpreter.structure.write_pdb(file=sys.stdout) 85 86 # Create a second data pipe for the structures to align and superimpose. 87 self.interpreter.pipe.create('align', 'N-state') 88 89 # Load the PDB twice as different models. 90 self.interpreter.structure.read_pdb('uniform.pdb', dir=path, set_model_num=1) 91 self.interpreter.structure.read_pdb('uniform.pdb', dir=path, set_model_num=2) 92 93 # Delete a residue and atom. 94 self.interpreter.structure.delete(":12") 95 self.interpreter.structure.delete(":20@H") 96 97 # Translate and rotate the models. 98 R = zeros((3, 3), float64) 99 axis_angle_to_R(array([1, 0, 0], float64), 1.0, R) 100 self.interpreter.structure.rotate(R=R, model=1) 101 axis_angle_to_R(array([0, 0, 1], float64), 2.0, R) 102 self.interpreter.structure.rotate(R=R, model=2) 103 self.interpreter.structure.translate(T=[1., 1., 1.], model=1) 104 self.interpreter.structure.translate(T=[0., 0., 1.], model=2) 105 106 # Add some atoms that should not be aligned. 107 self.interpreter.structure.add_atom(mol_name='uniform_mol1', atom_name='Ti', res_name='TST', res_num=100, pos=[[1.0, 2.0, 3.0], [1.0, 2.0, 3.0]], element='Ti', pdb_record='HETATM') 108 109 # The alignment. 110 self.interpreter.structure.superimpose(pipes=['ref', 'align'], method='fit to first', atom_id='@N,H', displace_id='@N,H') 111 112 # Output PDB to stdout to help in debugging. 113 self.interpreter.structure.write_pdb(file=sys.stdout) 114 115 # The atomic data. 116 data = [ 117 ["N", "PRO", 1, 0.000, 0.000, -10.000], 118 ["H", "PRO", 1, 0.000, 0.000, -11.020], 119 ["N", "PRO", 2, 7.454, 0.000, -6.667], 120 ["H", "PRO", 2, 8.214, 0.000, -7.347], 121 ["N", "ILE", 3, 10.000, 0.000, 0.000], 122 ["H", "ILE", 3, 11.020, 0.000, 0.000], 123 ["N", "VAL", 4, 7.454, 0.000, 6.667], 124 ["H", "VAL", 4, 8.214, 0.000, 7.347], 125 ["N", "VAL", 5, 0.000, 0.000, 10.000], 126 ["H", "VAL", 5, 0.000, 0.000, 11.020], 127 ["N", "ASN", 6, 0.000, 0.000, -10.000], 128 ["H", "ASN", 6, 0.000, 0.000, -11.020], 129 ["N", "SER", 7, 3.727, 6.455, -6.667], 130 ["H", "SER", 7, 4.107, 7.113, -7.347], 131 ["N", "LEU", 8, 5.000, 8.660, 0.000], 132 ["H", "LEU", 8, 5.510, 9.544, 0.000], 133 ["N", "SER", 9, 3.727, 6.455, 6.667], 134 ["H", "SER", 9, 4.107, 7.113, 7.347], 135 ["N", "ASN", 10, 0.000, 0.000, 10.000], 136 ["H", "ASN", 10, 0.000, 0.000, 11.020], 137 ["N", "PHE", 11, -0.000, 0.000, -10.000], 138 ["H", "PHE", 11, -0.000, 0.000, -11.020], 139 #["N", "ALA", 12, -3.727, 6.455, -6.667], 140 #["H", "ALA", 12, -4.107, 7.113, -7.347], 141 ["N", "ILE", 13, -5.000, 8.660, 0.000], 142 ["H", "ILE", 13, -5.510, 9.544, 0.000], 143 ["N", "GLY", 14, -3.727, 6.455, 6.667], 144 ["H", "GLY", 14, -4.107, 7.113, 7.347], 145 ["N", "SER", 15, -0.000, 0.000, 10.000], 146 ["H", "SER", 15, -0.000, 0.000, 11.020], 147 ["N", "PHE", 16, -0.000, 0.000, -10.000], 148 ["H", "PHE", 16, -0.000, 0.000, -11.020], 149 ["N", "VAL", 17, -7.454, 0.000, -6.667], 150 ["H", "VAL", 17, -8.214, 0.000, -7.347], 151 ["N", "ILE", 18, -10.000, 0.000, 0.000], 152 ["H", "ILE", 18, -11.020, 0.000, 0.000], 153 ["N", "GLN", 19, -7.454, 0.000, 6.667], 154 ["H", "GLN", 19, -8.214, 0.000, 7.347], 155 ["N", "LEU", 20, -0.000, 0.000, 10.000], 156 #["H", "LEU", 20, -0.000, 0.000, 11.020], 157 ["N", "LEU", 21, -0.000, -0.000, -10.000], 158 ["H", "LEU", 21, -0.000, -0.000, -11.020], 159 ["N", "GLU", 22, -3.727, -6.455, -6.667], 160 ["H", "GLU", 22, -4.107, -7.113, -7.347], 161 ["N", "TRP", 23, -5.000, -8.660, 0.000], 162 ["H", "TRP", 23, -5.510, -9.544, 0.000], 163 ["N", "TYR", 24, -3.727, -6.455, 6.667], 164 ["H", "TYR", 24, -4.107, -7.113, 7.347], 165 ["N", "SER", 25, -0.000, -0.000, 10.000], 166 ["H", "SER", 25, -0.000, -0.000, 11.020], 167 ["N", "ARG", 26, 0.000, -0.000, -10.000], 168 ["H", "ARG", 26, 0.000, -0.000, -11.020], 169 ["N", "TYR", 27, 3.727, -6.455, -6.667], 170 ["H", "TYR", 27, 4.107, -7.113, -7.347], 171 ["N", "LEU", 28, 5.000, -8.660, 0.000], 172 ["H", "LEU", 28, 5.510, -9.544, 0.000], 173 ["N", "HIS", 29, 3.727, -6.455, 6.667], 174 ["H", "HIS", 29, 4.107, -7.113, 7.347], 175 ["N", "ALA", 30, 0.000, -0.000, 10.000], 176 ["H", "ALA", 30, 0.000, -0.000, 11.020], 177 ["Ti", "TST", 100, 1.000, 2.000, 3.000] 178 ] 179 180 # The selection object. 181 selection = cdp.structure.selection() 182 183 # Check the first model. 184 self.assertEqual(len(data), len(cdp.structure.structural_data[0].mol[0].atom_name)) 185 i = 0 186 for res_num, res_name, atom_name, pos in cdp.structure.atom_loop(selection=selection, model_num=1, res_num_flag=True, res_name_flag=True, atom_name_flag=True, pos_flag=True): 187 self.assertEqual(atom_name, data[i][0]) 188 self.assertEqual(res_name, data[i][1]) 189 self.assertEqual(res_num, data[i][2]) 190 self.assertAlmostEqual(pos[0][0], data[i][3]) 191 self.assertAlmostEqual(pos[0][1], data[i][4]) 192 self.assertAlmostEqual(pos[0][2], data[i][5]) 193 i += 1 194 195 # Check the second model. 196 self.assertEqual(len(data), len(cdp.structure.structural_data[1].mol[0].atom_name)) 197 i = 0 198 for res_num, res_name, atom_name, pos in cdp.structure.atom_loop(selection=selection, model_num=2, res_num_flag=True, res_name_flag=True, atom_name_flag=True, pos_flag=True): 199 self.assertEqual(atom_name, data[i][0]) 200 self.assertEqual(res_name, data[i][1]) 201 self.assertEqual(res_num, data[i][2]) 202 self.assertAlmostEqual(pos[0][0], data[i][3]) 203 self.assertAlmostEqual(pos[0][1], data[i][4]) 204 self.assertAlmostEqual(pos[0][2], data[i][5]) 205 i += 1
206 207
208 - def test_align_CaM_BLOSUM62(self):
209 """Test the alignment of CaM molecules from different species using the BLOSUM62 substitution matrix.""" 210 211 # Execute the script. 212 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'n_state_model'+sep+'structure_align.py')
213 214
215 - def test_align_molecules(self):
216 """Test the U{structure.superimpose user function<http://www.nmr-relax.com/manual/structure_superimpose.html>} for aligning different molecules in one pipe.""" 217 218 # Reset relax. 219 self.interpreter.reset() 220 221 # Path of the PDB file. 222 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'diffusion_tensor'+sep+'sphere' 223 224 # Create a data pipe for the reference structure, then load it. 225 self.interpreter.pipe.create('ref', 'N-state') 226 self.interpreter.structure.read_pdb('uniform.pdb', dir=path, set_mol_name='ref') 227 228 # Delete a residue and atom. 229 self.interpreter.structure.delete("#ref:8") 230 self.interpreter.structure.delete("#ref:2@N") 231 232 # Output PDB to stdout to help in debugging. 233 self.interpreter.structure.write_pdb(file=sys.stdout) 234 235 # Create a second data pipe for the structures to align and superimpose. 236 self.interpreter.pipe.create('align', 'N-state') 237 238 # Load the PDB twice as different models. 239 self.interpreter.structure.read_pdb('uniform.pdb', dir=path, set_mol_name='1') 240 self.interpreter.structure.read_pdb('uniform.pdb', dir=path, set_mol_name='2') 241 242 # Delete a residue and atom from these two structures. 243 self.interpreter.structure.delete("#1,2:12") 244 self.interpreter.structure.delete("#1,2:20@H") 245 246 # Translate and rotate the models. 247 R = zeros((3, 3), float64) 248 axis_angle_to_R(array([1, 0, 0], float64), 1.0, R) 249 self.interpreter.structure.rotate(R=R, atom_id='#1') 250 axis_angle_to_R(array([0, 0, 1], float64), 2.0, R) 251 self.interpreter.structure.rotate(R=R, atom_id='#2') 252 self.interpreter.structure.translate(T=[1., 1., 1.], atom_id='#1') 253 self.interpreter.structure.translate(T=[0., 0., 1.], atom_id='#2') 254 255 # Add some atoms that should not be aligned. 256 self.interpreter.structure.add_atom(mol_name='1', atom_name='Ti', res_name='TST', res_num=100, pos=[1.0, 2.0, 3.0], element='Ti', pdb_record='HETATM') 257 self.interpreter.structure.add_atom(mol_name='2', atom_name='Ti', res_name='TST', res_num=100, pos=[1.0, 2.0, 3.0], element='Ti', pdb_record='HETATM') 258 259 # The alignment. 260 self.interpreter.structure.superimpose(pipes=['ref', 'align'], molecules=[['ref'], ['1', '2']], method='fit to first', atom_id='@N,H', displace_id='@N,H') 261 262 # Output PDB to stdout to help in debugging. 263 self.interpreter.structure.write_pdb(file=sys.stdout) 264 265 # The atomic data. 266 data = [ 267 ["N", "PRO", 1, 0.000, 0.000, -10.000], 268 ["H", "PRO", 1, 0.000, 0.000, -11.020], 269 ["N", "PRO", 2, 7.454, 0.000, -6.667], 270 ["H", "PRO", 2, 8.214, 0.000, -7.347], 271 ["N", "ILE", 3, 10.000, 0.000, 0.000], 272 ["H", "ILE", 3, 11.020, 0.000, 0.000], 273 ["N", "VAL", 4, 7.454, 0.000, 6.667], 274 ["H", "VAL", 4, 8.214, 0.000, 7.347], 275 ["N", "VAL", 5, 0.000, 0.000, 10.000], 276 ["H", "VAL", 5, 0.000, 0.000, 11.020], 277 ["N", "ASN", 6, 0.000, 0.000, -10.000], 278 ["H", "ASN", 6, 0.000, 0.000, -11.020], 279 ["N", "SER", 7, 3.727, 6.455, -6.667], 280 ["H", "SER", 7, 4.107, 7.113, -7.347], 281 ["N", "LEU", 8, 5.000, 8.660, 0.000], 282 ["H", "LEU", 8, 5.510, 9.544, 0.000], 283 ["N", "SER", 9, 3.727, 6.455, 6.667], 284 ["H", "SER", 9, 4.107, 7.113, 7.347], 285 ["N", "ASN", 10, 0.000, 0.000, 10.000], 286 ["H", "ASN", 10, 0.000, 0.000, 11.020], 287 ["N", "PHE", 11, -0.000, 0.000, -10.000], 288 ["H", "PHE", 11, -0.000, 0.000, -11.020], 289 #["N", "ALA", 12, -3.727, 6.455, -6.667], 290 #["H", "ALA", 12, -4.107, 7.113, -7.347], 291 ["N", "ILE", 13, -5.000, 8.660, 0.000], 292 ["H", "ILE", 13, -5.510, 9.544, 0.000], 293 ["N", "GLY", 14, -3.727, 6.455, 6.667], 294 ["H", "GLY", 14, -4.107, 7.113, 7.347], 295 ["N", "SER", 15, -0.000, 0.000, 10.000], 296 ["H", "SER", 15, -0.000, 0.000, 11.020], 297 ["N", "PHE", 16, -0.000, 0.000, -10.000], 298 ["H", "PHE", 16, -0.000, 0.000, -11.020], 299 ["N", "VAL", 17, -7.454, 0.000, -6.667], 300 ["H", "VAL", 17, -8.214, 0.000, -7.347], 301 ["N", "ILE", 18, -10.000, 0.000, 0.000], 302 ["H", "ILE", 18, -11.020, 0.000, 0.000], 303 ["N", "GLN", 19, -7.454, 0.000, 6.667], 304 ["H", "GLN", 19, -8.214, 0.000, 7.347], 305 ["N", "LEU", 20, -0.000, 0.000, 10.000], 306 #["H", "LEU", 20, -0.000, 0.000, 11.020], 307 ["N", "LEU", 21, -0.000, -0.000, -10.000], 308 ["H", "LEU", 21, -0.000, -0.000, -11.020], 309 ["N", "GLU", 22, -3.727, -6.455, -6.667], 310 ["H", "GLU", 22, -4.107, -7.113, -7.347], 311 ["N", "TRP", 23, -5.000, -8.660, 0.000], 312 ["H", "TRP", 23, -5.510, -9.544, 0.000], 313 ["N", "TYR", 24, -3.727, -6.455, 6.667], 314 ["H", "TYR", 24, -4.107, -7.113, 7.347], 315 ["N", "SER", 25, -0.000, -0.000, 10.000], 316 ["H", "SER", 25, -0.000, -0.000, 11.020], 317 ["N", "ARG", 26, 0.000, -0.000, -10.000], 318 ["H", "ARG", 26, 0.000, -0.000, -11.020], 319 ["N", "TYR", 27, 3.727, -6.455, -6.667], 320 ["H", "TYR", 27, 4.107, -7.113, -7.347], 321 ["N", "LEU", 28, 5.000, -8.660, 0.000], 322 ["H", "LEU", 28, 5.510, -9.544, 0.000], 323 ["N", "HIS", 29, 3.727, -6.455, 6.667], 324 ["H", "HIS", 29, 4.107, -7.113, 7.347], 325 ["N", "ALA", 30, 0.000, -0.000, 10.000], 326 ["H", "ALA", 30, 0.000, -0.000, 11.020], 327 ["Ti", "TST", 100, 1.000, 2.000, 3.000] 328 ] 329 330 # The selection object. 331 selection = cdp.structure.selection() 332 333 # Check the molecules. 334 self.assertEqual(len(data), len(cdp.structure.structural_data[0].mol[0].atom_name)) 335 self.assertEqual(len(data), len(cdp.structure.structural_data[0].mol[1].atom_name)) 336 current_mol = '' 337 for mol_name, res_num, res_name, atom_name, pos in cdp.structure.atom_loop(selection=selection, mol_name_flag=True, res_num_flag=True, res_name_flag=True, atom_name_flag=True, pos_flag=True): 338 print("Molecule '%s', residue '%s %s', atom '%s', position %s" % (mol_name, res_num, res_name, atom_name, pos)) 339 if mol_name != current_mol: 340 current_mol = mol_name 341 i = 0 342 self.assertEqual(atom_name, data[i][0]) 343 self.assertEqual(res_name, data[i][1]) 344 self.assertEqual(res_num, data[i][2]) 345 self.assertAlmostEqual(pos[0][0], data[i][3]) 346 self.assertAlmostEqual(pos[0][1], data[i][4]) 347 self.assertAlmostEqual(pos[0][2], data[i][5]) 348 i += 1
349 350
351 - def test_align_molecules2(self):
352 """Test of the structure.superimpose user function, fitting to the mean structure.""" 353 354 # Path of the structure file. 355 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'frame_order'+sep+'cam' 356 357 # Load the two rotated structures. 358 self.interpreter.structure.read_pdb('1J7P_1st_NH.pdb', dir=path, set_model_num=1, set_mol_name='CaM A') 359 self.interpreter.structure.read_pdb('1J7P_1st_NH_rot.pdb', dir=path, set_model_num=1, set_mol_name='CaM B') 360 361 # Add an atom that should not be superimposed. 362 self.interpreter.structure.add_atom(mol_name='CaM A', atom_name='Ti', res_name='TST', res_num=1, pos=[1.0, 2.0, 3.0], element='Ti', pdb_record='HETATM') 363 self.interpreter.structure.add_atom(mol_name='CaM B', atom_name='Ti', res_name='TST', res_num=1, pos=[2.0, 3.0, 4.0], element='Ti', pdb_record='HETATM') 364 365 # Superimpose the backbone heavy atoms. 366 self.interpreter.structure.superimpose(method='fit to mean', atom_id='@N,C,CA,O', displace_id=':82-5000') 367 368 # Check that the two structures now have the same atomic coordinates. 369 mol1 = cdp.structure.structural_data[0].mol[0] 370 mol2 = cdp.structure.structural_data[0].mol[1] 371 for i in range(len(mol1.atom_name)): 372 if mol1.res_num[i] == 1: 373 continue 374 self.assertAlmostEqual(mol1.x[i], mol2.x[i], 2) 375 self.assertAlmostEqual(mol1.y[i], mol2.y[i], 2) 376 self.assertAlmostEqual(mol1.z[i], mol2.z[i], 2) 377 378 # The first 'Ti' atom must be different - it is not displaced. 379 self.assertAlmostEqual(mol1.x[0] - mol2.x[0], -1.0, 2) 380 self.assertAlmostEqual(mol1.y[0] - mol2.y[0], -1.0, 2) 381 self.assertAlmostEqual(mol1.z[0] - mol2.z[0], -1.0, 2)
382 383
385 """Test of the structure.superimpose user function, fitting to the mean structure.""" 386 387 # Path of the structure file. 388 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 389 390 # Load the two rotated structures. 391 self.interpreter.structure.read_pdb('1J7O.pdb', dir=path, read_model=1, set_model_num=1, set_mol_name='CaM A') 392 self.interpreter.structure.read_pdb('1J7O.pdb', dir=path, read_model=1, set_model_num=1, set_mol_name='CaM B') 393 self.interpreter.structure.read_pdb('1J7O.pdb', dir=path, read_model=1, set_model_num=1, set_mol_name='CaM C') 394 395 # Delete some end residues. 396 self.interpreter.structure.delete(atom_id="#CaM A:1-4") 397 self.interpreter.structure.delete(atom_id="#CaM A:60-100") 398 self.interpreter.structure.delete(atom_id="#CaM C:1-3") 399 self.interpreter.structure.delete(atom_id="#CaM C:75-100") 400 self.interpreter.structure.delete(atom_id=":1000-1001") 401 402 # Copy the data pipe for late comparison. 403 self.interpreter.pipe.copy('mf', 'comp') 404 405 # Superimpose the backbone heavy atoms. 406 self.interpreter.structure.superimpose(method='fit to mean', atom_id='@N,C,CA,O') 407 408 # Check that nothing has moved. 409 for mol_index in range(3): 410 mol1 = ds['mf'].structure.structural_data[0].mol[mol_index] 411 mol2 = ds['comp'].structure.structural_data[0].mol[mol_index] 412 for i in range(len(mol1.atom_name)): 413 self.assertAlmostEqual(mol1.x[i], mol2.x[i]) 414 self.assertAlmostEqual(mol1.y[i], mol2.y[i]) 415 self.assertAlmostEqual(mol1.z[i], mol2.z[i])
416 417
418 - def test_alt_loc_missing(self):
419 """Test that a RelaxError occurs when the alternate location indicator is present but not specified.""" 420 421 # Path of the structure file. 422 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 423 424 # Load the file, load the spins, and attach the protons. 425 self.assertRaises(RelaxError, self.interpreter.structure.read_pdb, '1OGT_trunc.pdb', dir=path)
426 427
428 - def test_atomic_fluctuations(self):
429 """Check the operation of the structure.atomic_fluctuations user function. 430 431 This checks the interatomic distance fluctuations calculated by the U{structure.atomic_fluctuations user function<http://www.nmr-relax.com/manual/structure_atomic_fluctuations.html>}. 432 """ 433 434 # Load the file. 435 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 436 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path) 437 438 # Run the structure.atomic_fluctuations user function and collect the results in a dummy file object. 439 file = DummyFileObject() 440 self.interpreter.structure.atomic_fluctuations(atom_id='@N,CA', file=file, format='text') 441 442 # The fluctuations. 443 n = array([[ 9.464, -9.232, 27.573], [ 9.211, -9.425, 26.970], [ 7.761, -6.392, 27.161]], float64) 444 ca = array([[10.302, -8.195, 26.930], [10.077, -8.221, 26.720], [ 9.256, -6.332, 27.183]], float64) 445 sd = std(array([norm(n[0] - ca[0]), norm(n[1] - ca[1]), norm(n[2] - ca[2])], float64), ddof=1) 446 expected = [] 447 expected.append("# %18s %20s\n" % (":4@N", ":4@CA")) 448 expected.append("%20.15f %20.15f\n" % (0.0, sd)) 449 expected.append("%20.15f %20.15f\n" % (sd, 0.0)) 450 451 # Check the file. 452 lines = file.readlines() 453 self.assertEqual(len(expected), len(lines)) 454 for i in range(len(lines)): 455 self.assertEqual(expected[i], lines[i])
456 457
459 """Check the angular fluctuations calculated by the structure.atomic_fluctuations user function. 460 461 This checks the text file (with the format argument set to text) of interatomic angle fluctuations calculated by the U{structure.atomic_fluctuations user function<http://www.nmr-relax.com/manual/structure_atomic_fluctuations.html>}. 462 """ 463 464 # Load the file. 465 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 466 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path) 467 468 # Run the structure.atomic_fluctuations user function and collect the results in a dummy file object. 469 file = DummyFileObject() 470 self.interpreter.structure.atomic_fluctuations(measure='angle', atom_id='@N,CA', file=file, format='text') 471 472 # The atom positions. 473 n = array([[ 9.464, -9.232, 27.573], [ 9.211, -9.425, 26.970], [ 7.761, -6.392, 27.161]], float64) 474 ca = array([[10.302, -8.195, 26.930], [10.077, -8.221, 26.720], [ 9.256, -6.332, 27.183]], float64) 475 476 # The interatom vectors. 477 vectors = ca - n 478 479 # The inter-vector angles to the average. 480 vect_ave = average(vectors, axis=0) 481 angles = [ 482 vector_angle_acos(vect_ave, vectors[0]), 483 vector_angle_acos(vect_ave, vectors[1]), 484 vector_angle_acos(vect_ave, vectors[2]) 485 ] 486 487 # The fluctuations. 488 sd = std(array(angles, float64), ddof=1) 489 expected = [] 490 expected.append("# %18s %20s\n" % (":4@N", ":4@CA")) 491 expected.append("%20.15f %20.15f\n" % (0.0, sd)) 492 expected.append("%20.15f %20.15f\n" % (sd, 0.0)) 493 494 # Check the file. 495 lines = file.readlines() 496 self.assertEqual(len(expected), len(lines)) 497 for i in range(len(lines)): 498 self.assertEqual(expected[i], lines[i])
499 500
502 """Check the operation of the structure.atomic_fluctuations user function for creating a gnuplot script. 503 504 This checks the format argument of the U{structure.atomic_fluctuations user function<http://www.nmr-relax.com/manual/structure_atomic_fluctuations.html>} when set to 'gnuplot'. 505 """ 506 507 # Load the file. 508 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 509 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path) 510 511 # Run the structure.atomic_fluctuations user function. 512 self.interpreter.structure.atomic_fluctuations(atom_id='@N,CA', file='matrix', dir=ds.tmpdir, format='gnuplot') 513 514 # The fluctuations. 515 n = array([[ 9.464, -9.232, 27.573], [ 9.211, -9.425, 26.970], [ 7.761, -6.392, 27.161]], float64) 516 ca = array([[10.302, -8.195, 26.930], [10.077, -8.221, 26.720], [ 9.256, -6.332, 27.183]], float64) 517 sd = std(array([norm(n[0] - ca[0]), norm(n[1] - ca[1]), norm(n[2] - ca[2])], float64), ddof=1) 518 expected = [] 519 expected.append("# %18s %20s\n" % (":4@N", ":4@CA")) 520 expected.append("%20.15f %20.15f\n" % (0.0, sd)) 521 expected.append("%20.15f %20.15f\n" % (sd, 0.0)) 522 523 # Check the text file. 524 file = open("%s%s%s" % (ds.tmpdir, sep, 'matrix')) 525 lines = file.readlines() 526 self.assertEqual(len(expected), len(lines)) 527 for i in range(len(lines)): 528 self.assertEqual(expected[i], lines[i]) 529 530 # Check the gnuplot file. 531 script = [ 532 "#!/usr/bin/env gnuplot\n", 533 "\n", 534 "# Set up the terminal type and make the plot square.\n", 535 "set terminal postscript eps size 10,10 enhanced color font 'Helvetica,20' linewidth 0.1\n", 536 "set size square\n", 537 "\n", 538 "# Blue-red colour map.\n", 539 "set palette model RGB\n", 540 "set palette defined\n", 541 "\n", 542 "# Labels.\n", 543 "set xtics out rotate font \",8\" (\":4\\\\@N\" 0, \":4\\\\@CA\" 1)\n", 544 "set ytics out font \",8\" (\":4\\\\@N\" 0, \":4\\\\@CA\" 1)\n", 545 "\n", 546 "# Output to EPS.\n", 547 "set output \"matrix.eps\"\n", 548 "\n", 549 "# Load and show the text data\n", 550 "plot \"matrix\" matrix with image\n" 551 ] 552 file = open("%s%s%s" % (ds.tmpdir, sep, 'matrix.gnu')) 553 lines = file.readlines() 554 print("Script:") 555 print("\"\"\"") 556 for line in lines: 557 print(line[:-1]) 558 print("\"\"\"") 559 self.assertEqual(len(script), len(lines)) 560 for i in range(len(lines)): 561 self.assertEqual(script[i], lines[i])
562 563
565 """Check the operation of the structure.atomic_fluctuations user function when no data matches the atom ID. 566 567 This checks the interatomic distance fluctuations calculated by the U{structure.atomic_fluctuations user function<http://www.nmr-relax.com/manual/structure_atomic_fluctuations.html>}. 568 """ 569 570 # Load the file. 571 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 572 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path) 573 574 # Run the structure.atomic_fluctuations user function and collect the results in a dummy file object. 575 file = DummyFileObject() 576 self.assertRaises(RelaxError, self.interpreter.structure.atomic_fluctuations, atom_id='@X', file=file, format='text')
577 578
580 """Check the parallax shift fluctuations calculated by the structure.atomic_fluctuations user function. 581 582 This checks the text file (with the format argument set to text) of interatomic parallax shift fluctuations calculated by the U{structure.atomic_fluctuations user function<http://www.nmr-relax.com/manual/structure_atomic_fluctuations.html>}. 583 """ 584 585 # Load the file. 586 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 587 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path) 588 589 # Run the structure.atomic_fluctuations user function and collect the results in a dummy file object. 590 file = DummyFileObject() 591 self.interpreter.structure.atomic_fluctuations(measure='parallax shift', atom_id='@N,CA', file=file, format='text') 592 593 # The atom positions. 594 n = array([[ 9.464, -9.232, 27.573], [ 9.211, -9.425, 26.970], [ 7.761, -6.392, 27.161]], float64) 595 ca = array([[10.302, -8.195, 26.930], [10.077, -8.221, 26.720], [ 9.256, -6.332, 27.183]], float64) 596 597 # The interatom vectors. 598 vectors = ca - n 599 600 # The inter-vector projections to the average. 601 vect_ave = average(vectors, axis=0) 602 unit = vect_ave / norm(vect_ave) 603 proj = [ 604 dot(vectors[0], unit) * unit, 605 dot(vectors[1], unit) * unit, 606 dot(vectors[2], unit) * unit 607 ] 608 shift = [ 609 norm(vectors[0] - proj[0]), 610 norm(vectors[1] - proj[1]), 611 norm(vectors[2] - proj[2]) 612 ] 613 614 # The fluctuations. 615 sd = std(array(shift, float64), ddof=1) 616 expected = [] 617 expected.append("# %18s %20s\n" % (":4@N", ":4@CA")) 618 expected.append("%20.15f %20.15f\n" % (0.0, sd)) 619 expected.append("%20.15f %20.15f\n" % (sd, 0.0)) 620 621 # Check the file. 622 lines = file.readlines() 623 self.assertEqual(len(expected), len(lines)) 624 for i in range(len(lines)): 625 self.assertEqual(expected[i], lines[i])
626 627
629 """Catch U{bug #20470<https://web.archive.org/web/https://gna.org/bugs/?20470>}, the alternate location indicator problem.""" 630 631 # Path of the structure file. 632 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 633 634 # Load the file, load the spins, and attach the protons. 635 self.interpreter.structure.read_pdb('1OGT_trunc.pdb', dir=path, alt_loc='A') 636 self.interpreter.structure.load_spins(spin_id='@N', ave_pos=True) 637 self.interpreter.sequence.attach_protons()
638 639
641 """Catch U{bug #21187<https://web.archive.org/web/https://gna.org/bugs/?21187>}, the corrupted PDB with all proton atoms numbers set to zero.""" 642 643 # Path of the structure file. 644 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 645 646 # Load the file. 647 self.interpreter.structure.read_pdb('bug_21187_molecule.pdb', dir=path) 648 649 # Load the @N, @H, and @NE1 spins (needed to create the :60@0 spin to trigger the bug later). 650 self.interpreter.structure.load_spins(spin_id='@N', ave_pos=True) 651 self.interpreter.structure.load_spins(spin_id='@NE1', ave_pos=True) 652 self.interpreter.structure.load_spins(spin_id='@H', ave_pos=True) 653 654 # Load the :60@HE1 spin - this clashes with the :60@H spin as both have the spin ID of ':60@0'. 655 self.interpreter.structure.load_spins(spin_id='@HE1', ave_pos=True)
656 657
659 """Catch U{bug #21522<https://web.archive.org/web/https://gna.org/bugs/?21522>}, the structure.write_pdb user function creating an incorrect MASTER record. 660 661 This also triggers U{bug #21520<https://web.archive.org/web/https://gna.org/bugs/?21520>}, the failure of the structure.write_pdb user function when creating the MASTER record due to too many ATOM and HETATM records being present. 662 """ 663 664 # Create 2 models. 665 self.interpreter.structure.add_model(model_num=1) 666 self.interpreter.structure.add_model(model_num=2) 667 668 # Add a single atom. 669 self.interpreter.structure.add_atom(atom_name='N', res_name='Pro', res_num=2, pos=[1., 2., 3.], element='N') 670 671 # Create a PDB file. 672 file = DummyFileObject() 673 self.interpreter.structure.write_pdb(file=file, force=True) 674 675 # The file contents, without remarks, as they should be. 676 contents = [ 677 "MODEL 1 \n", 678 "ATOM 1 N Pro A 2 1.000 2.000 3.000 1.00 0.00 N \n", 679 "TER 2 Pro A 2 \n", 680 "ENDMDL \n", 681 "MODEL 2 \n", 682 "ATOM 1 N Pro A 2 1.000 2.000 3.000 1.00 0.00 N \n", 683 "TER 2 Pro A 2 \n", 684 "ENDMDL \n", 685 "MASTER 0 0 0 0 0 0 0 0 1 1 0 0 \n", 686 "END \n" 687 ] 688 689 # Check the created PDB file. 690 lines = file.readlines() 691 self.strip_remarks(lines) 692 self.assertEqual(len(contents), len(lines)) 693 for i in range(len(lines)): 694 self.assertEqual(contents[i], lines[i])
695 696
698 """Catch U{bug #21814<https://web.archive.org/web/https://gna.org/bugs/?21814>}, the PDB reading failure when not padded to 80 spaces.""" 699 700 # Path of the structure file. 701 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 702 703 # Load the file. 704 self.interpreter.structure.read_pdb('SpUreE_dimer_H_new', dir=path)
705 706
708 """Catch U{bug #22041<https://web.archive.org/web/https://gna.org/bugs/?22041>}, the atom serial number not being sequential from 1 onwards.""" 709 710 # Path of the structure file. 711 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 712 713 # Read a PDB file twice as two different molecules. 714 self.interpreter.structure.read_pdb('1RTE_trunc.pdb', dir=path, set_mol_name='N-dom') 715 self.interpreter.structure.read_pdb('1RTE_trunc.pdb', dir=path, set_mol_name='C-dom') 716 717 # Create a PDB file. 718 file = DummyFileObject() 719 self.interpreter.structure.write_pdb(file=file, force=True) 720 721 # The file contents, without remarks, as they should be. 722 contents = [ 723 "HET CYN A 445 1 \n", 724 "HET CYN B 445 1 \n", 725 "HETNAM CYN UNKNOWN \n", 726 "FORMUL 1 CYN C1 \n", 727 "ATOM 1 N LEU A 3 49.617 4.693 46.426 1.00 0.00 N \n", 728 "ATOM 2 CA LEU A 3 49.432 5.476 45.190 1.00 0.00 C \n", 729 "ATOM 3 C LEU A 3 50.346 4.980 44.055 1.00 0.00 C \n", 730 "ATOM 4 O LEU A 3 49.924 4.868 42.889 1.00 0.00 O \n", 731 "ATOM 5 CB LEU A 3 49.673 6.968 45.457 1.00 0.00 C \n", 732 "ATOM 6 CG LEU A 3 49.804 7.863 44.222 1.00 0.00 C \n", 733 "ATOM 7 CD1 LEU A 3 48.564 7.837 43.327 1.00 0.00 C \n", 734 "ATOM 8 CD2 LEU A 3 50.075 9.282 44.625 1.00 0.00 C \n", 735 "TER 9 LEU A 3 \n", 736 "HETATM 10 C CYN A 445 29.160 13.127 62.533 1.00 0.00 C \n", 737 "ATOM 11 N LEU B 3 49.617 4.693 46.426 1.00 0.00 N \n", 738 "ATOM 12 CA LEU B 3 49.432 5.476 45.190 1.00 0.00 C \n", 739 "ATOM 13 C LEU B 3 50.346 4.980 44.055 1.00 0.00 C \n", 740 "ATOM 14 O LEU B 3 49.924 4.868 42.889 1.00 0.00 O \n", 741 "ATOM 15 CB LEU B 3 49.673 6.968 45.457 1.00 0.00 C \n", 742 "ATOM 16 CG LEU B 3 49.804 7.863 44.222 1.00 0.00 C \n", 743 "ATOM 17 CD1 LEU B 3 48.564 7.837 43.327 1.00 0.00 C \n", 744 "ATOM 18 CD2 LEU B 3 50.075 9.282 44.625 1.00 0.00 C \n", 745 "TER 19 LEU B 3 \n", 746 "HETATM 20 C CYN B 445 29.160 13.127 62.533 1.00 0.00 C \n", 747 "MASTER 0 0 2 0 0 0 0 0 18 2 0 0 \n", 748 "END \n" 749 ] 750 751 # Check the created PDB file. 752 lines = file.readlines() 753 self.strip_remarks(lines) 754 self.assertEqual(len(contents), len(lines)) 755 for i in range(len(lines)): 756 self.assertEqual(contents[i], lines[i])
757 758
760 """Catch U{bug #22069<https://web.archive.org/web/https://gna.org/bugs/?22069>}, the failure of the structure.delete user function with helix attribute errors.""" 761 762 # Path of the structure file. 763 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'frame_order'+sep+'cam' 764 765 # Load the structure. 766 self.interpreter.structure.read_pdb('1J7P_1st_NH_rot.pdb', dir=path) 767 768 # Delete the calciums. 769 self.interpreter.structure.delete(atom_id='@CA')
770 771
773 """Catch U{bug #22070<https://web.archive.org/web/https://gna.org/bugs/?22070>}, the failure of the structure.superimpose user function after deleting atoms with structure.delete.""" 774 775 # Path of the structure file. 776 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'frame_order'+sep+'cam' 777 778 # Load the structures to superimpose. 779 self.interpreter.structure.read_pdb('1J7P_1st_NH.pdb', dir=path, set_mol_name='C-dom', set_model_num=1) 780 self.interpreter.structure.read_pdb('1J7P_1st_NH_rot.pdb', dir=path, set_mol_name='C-dom', set_model_num=2) 781 782 # Delete the calciums. 783 self.interpreter.structure.delete(atom_id='@CA') 784 785 # Check the deleted atoms of both models (the last atoms should now be the last ATOM record proton and not the HETATOM CA). 786 for i in range(2): 787 print("Checking the last atom of model %s." % i) 788 self.assertEqual(cdp.structure.structural_data[i].mol[0].atom_name[-1], 'H') 789 790 # Superimpose. 791 self.interpreter.structure.superimpose(method='fit to first', centre_type='CoM') 792 793 # Align. 794 self.interpreter.structure.superimpose(method='fit to first', centre_type='CoM')
795 796
798 """Catch U{bug #22860<https://web.archive.org/web/https://gna.org/bugs/?22860>}, the failure of the structure.com user function after calling structure.delete.""" 799 800 # Path of the structure file. 801 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'frame_order'+sep+'cam' 802 803 # Load a random structure, then delete it. 804 self.interpreter.structure.read_pdb('1J7P_1st_NH.pdb', dir=path, set_mol_name='C-dom', set_model_num=1) 805 self.interpreter.structure.delete() 806 807 # CoM. 808 self.assertRaises(RelaxError, self.interpreter.structure.com)
809 810
812 """Catch U{bug #22861<https://web.archive.org/web/https://gna.org/bugs/?22861>}, the chain IDs in the structure.write_pdb user function PDB files are incorrect after calling structure.delete.""" 813 814 # Add one atom to two different molecules. 815 self.interpreter.structure.add_atom(mol_name='A', atom_name='N', res_name='Phe', res_num=1, pos=[1.0, 1.0, 1.0], element='N') 816 self.interpreter.structure.add_atom(mol_name='B', atom_name='N', res_name='Phe', res_num=1, pos=[1.0, 1.0, 1.0], element='N') 817 818 # Add some metadata to demonstrate a problem with the structure.delete user function. 819 cdp.structure.structural_data[0].mol[0].file_name = 'test.pdb' 820 cdp.structure.structural_data[0].mol[1].file_name = 'test2.pdb' 821 822 # Delete the first molecule. 823 self.interpreter.structure.delete('#A') 824 825 # Create a PDB file. 826 file = DummyFileObject() 827 self.interpreter.structure.write_pdb(file=file, force=True) 828 829 # The file contents, without remarks, as they should be. 830 contents = [ 831 "ATOM 1 N Phe A 1 1.000 1.000 1.000 1.00 0.00 N \n", 832 "TER 2 Phe A 1 \n", 833 "MASTER 0 0 0 0 0 0 0 0 1 1 0 0 \n", 834 "END \n" 835 ] 836 837 # Check the created PDB file. 838 lines = file.readlines() 839 self.strip_remarks(lines) 840 self.assertEqual(len(contents), len(lines)) 841 for i in range(len(lines)): 842 self.assertEqual(contents[i], lines[i])
843 844
846 """Catch U{bug #23293<https://web.archive.org/web/https://gna.org/bugs/?23293>}, the PDB HETATM loading error whereby the last HETATM record is sometimes not read from the PDB file.""" 847 848 # Path of the structure file. 849 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 850 851 # Load the file. 852 self.interpreter.structure.read_pdb('bug_23293_missing_hetatm.pdb', dir=path) 853 854 # Create a PDB file. 855 file = DummyFileObject() 856 self.interpreter.structure.write_pdb(file=file, force=True) 857 858 # The file contents, without remarks, as they should be. 859 contents = [ 860 "HET CA A 501 1 \n", 861 "HET CA A 502 1 \n", 862 "HET CA B 503 1 \n", 863 "HET CA B 504 1 \n", 864 "HET CA C 505 1 \n", 865 "HET CA C 506 1 \n", 866 "HETNAM CA UNKNOWN \n", 867 "FORMUL 1 CA CA1 \n", 868 "MODEL 1 \n", 869 "ATOM 1 N LEU A 1 1.000 -2.000 20.000 1.00 0.00 N \n", 870 "ATOM 2 H LEU A 1 2.000 -2.000 20.000 1.00 0.00 H \n", 871 "TER 3 LEU A 1 \n", 872 "HETATM 4 CA CA A 501 17.000 12.000 14.000 1.00 0.00 CA \n", 873 "HETATM 5 CA CA A 502 6.000 9.000 14.000 1.00 0.00 CA \n", 874 "ATOM 6 N LEU B 1 9.000 -9.000 27.000 1.00 0.00 N \n", 875 "ATOM 7 H LEU B 1 8.000 -8.000 27.000 1.00 0.00 H \n", 876 "TER 8 LEU B 1 \n", 877 "HETATM 9 CA CA B 503 17.000 12.000 14.000 1.00 0.00 CA \n", 878 "HETATM 10 CA CA B 504 6.000 9.000 14.000 1.00 0.00 CA \n", 879 "ATOM 11 N LEU C 1 12.000 -12.000 7.000 1.00 0.00 N \n", 880 "ATOM 12 H LEU C 1 11.000 -12.000 7.000 1.00 0.00 H \n", 881 "TER 13 LEU C 1 \n", 882 "HETATM 14 CA CA C 505 31.000 -10.000 -0.000 1.00 0.00 CA \n", 883 "HETATM 15 CA CA C 506 31.000 -19.000 6.000 1.00 0.00 CA \n", 884 "ENDMDL \n", 885 "MASTER 0 0 6 0 0 0 0 0 12 3 0 0 \n", 886 "END \n" 887 ] 888 889 # Check the created PDB file. 890 lines = file.readlines() 891 self.strip_remarks(lines) 892 self.assertEqual(len(contents), len(lines)) 893 for i in range(len(lines)): 894 self.assertEqual(contents[i], lines[i])
895 896
898 """Catch U{bug #23294<https://web.archive.org/web/https://gna.org/bugs/?23294>}, the automatic merging of PDB molecules results in an IndexError.""" 899 900 # Path of the structure file. 901 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 902 903 # Load the file. 904 self.interpreter.structure.read_pdb('bug_23294_multi_mol_automerge.pdb', dir=path, read_model=1, set_mol_name='merged mol') 905 906 # Create a PDB file. 907 file = DummyFileObject() 908 self.interpreter.structure.write_pdb(file=file, force=True) 909 910 # The file contents, without remarks, as they should be. 911 contents = [ 912 "MODEL 1 \n", 913 "ATOM 1 N LEU A 1 1.000 0.000 0.000 1.00 0.00 N \n", 914 "ATOM 2 H LEU A 1 2.000 0.000 0.000 1.00 0.00 H \n", 915 "ATOM 3 N GLU A 2 3.000 0.000 0.000 1.00 0.00 N \n", 916 "ATOM 4 H GLU A 2 4.000 0.000 0.000 1.00 0.00 H \n", 917 "TER 5 GLU A 2 \n", 918 "ENDMDL \n", 919 "MASTER 0 0 0 0 0 0 0 0 4 1 0 0 \n", 920 "END \n" 921 ] 922 923 # Check the created PDB file. 924 lines = file.readlines() 925 self.strip_remarks(lines) 926 self.assertEqual(len(contents), len(lines)) 927 for i in range(len(lines)): 928 self.assertEqual(contents[i], lines[i])
929 930
932 """Catch U{bug #23295<https://web.archive.org/web/https://gna.org/bugs/?23295>}, the PDB secondary structure HELIX and SHEET records not updated when merging molecules.""" 933 934 # Path of the structure file. 935 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 936 937 # Load the file. 938 self.interpreter.structure.read_pdb('2BE6_secondary_structure.pdb', dir=path, read_mol=[1, 4], set_mol_name='CaM A') 939 self.interpreter.structure.read_pdb('2BE6_secondary_structure.pdb', dir=path, read_mol=[2, 5], set_mol_name='CaM B') 940 self.interpreter.structure.read_pdb('2BE6_secondary_structure.pdb', dir=path, read_mol=[3, 6], set_mol_name='CaM C') 941 942 # Create a PDB file. 943 file = DummyFileObject() 944 self.interpreter.structure.write_pdb(file=file, force=True) 945 946 # The HELIX and SHEET contents, as they should be. 947 # First, the original contents: 948 # "HELIX 1 1 THR A 5 ASP A 20 1 16 " 949 # "HELIX 2 2 THR A 28 LEU A 39 1 12 " 950 # "HELIX 3 3 THR A 44 ASP A 56 1 13 " 951 # "HELIX 4 4 PHE A 65 MET A 76 1 12 " 952 # "HELIX 5 5 SER A 81 ASP A 93 1 13 " 953 # "HELIX 6 6 SER A 101 LEU A 112 1 12 " 954 # "HELIX 7 7 THR A 117 ASP A 129 1 13 " 955 # "HELIX 8 8 TYR A 138 THR A 146 1 9 " 956 # "HELIX 9 9 VAL D 1615 GLY D 1638 1 24 " 957 # "HELIX 10 10 THR B 5 ASP B 20 1 16 " 958 # "HELIX 11 11 THR B 28 LEU B 39 1 12 " 959 # "HELIX 12 12 THR B 44 ASP B 56 1 13 " 960 # "HELIX 13 13 PHE B 65 ASP B 78 1 14 " 961 # "HELIX 14 14 GLU B 82 ASP B 93 1 12 " 962 # "HELIX 15 15 SER B 101 GLY B 113 1 13 " 963 # "HELIX 16 16 THR B 117 ASP B 129 1 13 " 964 # "HELIX 17 17 TYR B 138 MET B 145 1 8 " 965 # "HELIX 18 18 GLU E 1612 GLN E 1625 1 14 " 966 # "HELIX 19 19 THR C 5 ASP C 20 1 16 " 967 # "HELIX 20 20 THR C 28 LEU C 39 1 12 " 968 # "HELIX 21 21 THR C 44 ASP C 56 1 13 " 969 # "HELIX 22 22 PHE C 65 LYS C 75 1 11 " 970 # "HELIX 23 23 GLU C 82 ASP C 93 1 12 " 971 # "HELIX 24 24 SER C 101 LEU C 112 1 12 " 972 # "HELIX 25 25 THR C 117 ASP C 129 1 13 " 973 # "HELIX 26 26 TYR C 138 MET C 145 1 8 " 974 # "HELIX 27 27 LYS F 1617 GLU F 1636 1 20 " 975 # "SHEET 1 A 2 THR A 26 ILE A 27 0 " 976 # "SHEET 2 A 2 ILE A 63 ASP A 64 -1 O ILE A 63 N ILE A 27 " 977 # "SHEET 1 B 2 TYR A 99 ILE A 100 0 " 978 # "SHEET 2 B 2 VAL A 136 ASN A 137 -1 O VAL A 136 N ILE A 100 " 979 # "SHEET 1 C 2 THR B 26 ILE B 27 0 " 980 # "SHEET 2 C 2 ILE B 63 ASP B 64 -1 O ILE B 63 N ILE B 27 " 981 # "SHEET 1 D 2 TYR B 99 ILE B 100 0 " 982 # "SHEET 2 D 2 VAL B 136 ASN B 137 -1 O VAL B 136 N ILE B 100 " 983 # "SHEET 1 E 2 THR C 26 ILE C 27 0 " 984 # "SHEET 2 E 2 ILE C 63 ASP C 64 -1 O ILE C 63 N ILE C 27 " 985 # "SHEET 1 F 2 TYR C 99 ILE C 100 0 " 986 # "SHEET 2 F 2 VAL C 136 ASN C 137 -1 O VAL C 136 N ILE C 100 " 987 # Then the modified contents: 988 contents = [ 989 "HELIX 1 1 THR A 5 ASP A 20 1 16 \n", 990 "HELIX 2 2 THR A 28 LEU A 39 1 12 \n", 991 "HELIX 3 3 THR A 44 ASP A 56 1 13 \n", 992 "HELIX 4 4 PHE A 65 MET A 76 1 12 \n", 993 "HELIX 5 5 SER A 81 ASP A 93 1 13 \n", 994 "HELIX 6 6 SER A 101 LEU A 112 1 12 \n", 995 "HELIX 7 7 THR A 117 ASP A 129 1 13 \n", 996 "HELIX 8 8 TYR A 138 THR A 146 1 9 \n", 997 "HELIX 9 9 VAL A 1615 GLY A 1638 1 24 \n", 998 "HELIX 10 10 THR B 5 ASP B 20 1 16 \n", 999 "HELIX 11 11 THR B 28 LEU B 39 1 12 \n", 1000 "HELIX 12 12 THR B 44 ASP B 56 1 13 \n", 1001 "HELIX 13 13 PHE B 65 ASP B 78 1 14 \n", 1002 "HELIX 14 14 GLU B 82 ASP B 93 1 12 \n", 1003 "HELIX 15 15 SER B 101 GLY B 113 1 13 \n", 1004 "HELIX 16 16 THR B 117 ASP B 129 1 13 \n", 1005 "HELIX 17 17 TYR B 138 MET B 145 1 8 \n", 1006 "HELIX 18 18 GLU B 1612 GLN B 1625 1 14 \n", 1007 "HELIX 19 19 THR C 5 ASP C 20 1 16 \n", 1008 "HELIX 20 20 THR C 28 LEU C 39 1 12 \n", 1009 "HELIX 21 21 THR C 44 ASP C 56 1 13 \n", 1010 "HELIX 22 22 PHE C 65 LYS C 75 1 11 \n", 1011 "HELIX 23 23 GLU C 82 ASP C 93 1 12 \n", 1012 "HELIX 24 24 SER C 101 LEU C 112 1 12 \n", 1013 "HELIX 25 25 THR C 117 ASP C 129 1 13 \n", 1014 "HELIX 26 26 TYR C 138 MET C 145 1 8 \n", 1015 "HELIX 27 27 LYS C 1617 GLU C 1636 1 20 \n", 1016 "SHEET 1 A 2 THR A 26 ILE A 27 0 \n", 1017 "SHEET 2 A 2 ILE A 63 ASP A 64 -1 O ILE A 63 N ILE A 27 \n", 1018 "SHEET 1 B 2 TYR A 99 ILE A 100 0 \n", 1019 "SHEET 2 B 2 VAL A 136 ASN A 137 -1 O VAL A 136 N ILE A 100 \n", 1020 "SHEET 1 C 2 THR B 26 ILE B 27 0 \n", 1021 "SHEET 2 C 2 ILE B 63 ASP B 64 -1 O ILE B 63 N ILE B 27 \n", 1022 "SHEET 1 D 2 TYR B 99 ILE B 100 0 \n", 1023 "SHEET 2 D 2 VAL B 136 ASN B 137 -1 O VAL B 136 N ILE B 100 \n", 1024 "SHEET 1 E 2 THR C 26 ILE C 27 0 \n", 1025 "SHEET 2 E 2 ILE C 63 ASP C 64 -1 O ILE C 63 N ILE C 27 \n", 1026 "SHEET 1 F 2 TYR C 99 ILE C 100 0 \n", 1027 "SHEET 2 F 2 VAL C 136 ASN C 137 -1 O VAL C 136 N ILE C 100 \n", 1028 ] 1029 1030 # Check the created PDB file. 1031 lines = file.readlines() 1032 index = 0 1033 for line in lines: 1034 # Skip non-secondary structure records. 1035 if not search('^HELIX', line) and not search('^SHEET', line): 1036 continue 1037 1038 # Check the line. 1039 print("\nOrig: %s" % repr(contents[index])) 1040 print("New: %s" % repr(line)) 1041 self.assertEqual(contents[index], line) 1042 1043 # Increment the secondary structure index. 1044 index += 1 1045 1046 # Check the count to make sure that secondary structure records have at all been created. 1047 self.assertEqual(len(contents), index)
1048 1049
1051 """Test the bug reported as the U{support request #2998<https://web.archive.org/web/https://gna.org/support/?2998>}, the broken CONECT records.""" 1052 1053 # Path of the structure file. 1054 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 1055 1056 # Load the file. 1057 self.interpreter.structure.read_pdb('1RTE_trunc.pdb', dir=path)
1058 1059
1060 - def test_collapse_ensemble(self):
1061 """Test the collapse_ensemble() method of the internal structural object.""" 1062 1063 # Create 2 models. 1064 self.interpreter.structure.add_model(model_num=1) 1065 self.interpreter.structure.add_model(model_num=2) 1066 1067 # Add an atom. 1068 self.interpreter.structure.add_atom(atom_name='H', res_name='Gly', res_num=1, pos=[[0.0, 1.0, 2.0], [1.0, 2.0, 3.0]], element='H') 1069 1070 # Check the atomic data. 1071 for i in range(2): 1072 mol = cdp.structure.structural_data[i].mol[0] 1073 self.assertEqual(len(mol.atom_name), 1) 1074 self.assertEqual(mol.x[0], 0.0+i) 1075 self.assertEqual(mol.y[0], 1.0+i) 1076 self.assertEqual(mol.z[0], 2.0+i) 1077 1078 # Collapse the ensemble to the 2nd model. 1079 cdp.structure.collapse_ensemble(model_num=2, model_to=1) 1080 1081 # Check the collapsed ensemble. 1082 self.assert_(hasattr(cdp, 'structure')) 1083 self.assertEqual(len(cdp.structure.structural_data), 1) 1084 self.assertEqual(cdp.structure.structural_data[0].num, 1) 1085 self.assertEqual(len(cdp.structure.structural_data[0].mol), 1) 1086 1087 # Check the atomic data. 1088 mol = cdp.structure.structural_data[0].mol[0] 1089 self.assertEqual(len(mol.atom_name), 1) 1090 self.assertEqual(mol.x[0], 1.0) 1091 self.assertEqual(mol.y[0], 2.0) 1092 self.assertEqual(mol.z[0], 3.0)
1093 1094
1096 """Test the deletion of non-existent structural data.""" 1097 1098 # Delete all structural data. 1099 self.interpreter.structure.delete() 1100 1101 # Set up a diffusion tensor. 1102 self.interpreter.diffusion_tensor.init((8.5e-9, 1.1, 20.0, 20.0), param_types=2) 1103 1104 # Create the PDB representation. 1105 self.interpreter.structure.create_diff_tensor_pdb(scale=1.8e-06, file='prolate.pdb', dir=ds.tmpdir, force=True)
1106 1107
1109 """Test the creation of the diffusion tensor PDB representation, after deleting structural data.""" 1110 1111 # Path of the files. 1112 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'lactose' 1113 1114 # Read the PDBs. 1115 self.interpreter.structure.read_pdb(file='lactose_MCMM4_S1_1.pdb', dir=path, set_mol_name='L1') 1116 self.interpreter.structure.read_pdb(file='lactose_MCMM4_S1_2.pdb', dir=path, set_mol_name='L2') 1117 1118 # Delete all structural data. 1119 self.interpreter.structure.delete() 1120 1121 # Set up a diffusion tensor. 1122 self.interpreter.diffusion_tensor.init((8.5e-9, 1.1, 20.0, 20.0), param_types=2) 1123 1124 # Create the PDB representation. 1125 self.interpreter.structure.create_diff_tensor_pdb(scale=1.8e-06, file='prolate.pdb', dir=ds.tmpdir, force=True)
1126 1127
1129 """Check that the ellipsoid diffusion tensor optimisation functions correctly.""" 1130 1131 # Reset relax. 1132 self.interpreter.reset() 1133 1134 # Create a temporary file. 1135 ds.tmpfile = mktemp() 1136 1137 # The diffusion type (used by the script). 1138 ds.diff_dir = 'ellipsoid' 1139 ds.diff_type = 'ellipsoid' 1140 1141 # Execute the script. 1142 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 1143 1144 # Create the PDB representation. 1145 self.interpreter.structure.create_diff_tensor_pdb(scale=1.8e-06, file=ds.tmpfile, force=True) 1146 1147 # Read the contents of the file. 1148 file = open(ds.tmpfile) 1149 lines = file.readlines() 1150 file.close() 1151 1152 # What the contents should be, without remarks. 1153 real_data = [ 1154 "HET COM A 1 1 \n", 1155 "HET TNS A 2 240 \n", 1156 "HET AXS A 3 15 \n", 1157 "HETNAM COM CENTRE OF MASS \n", 1158 "HETNAM TNS TENSOR \n", 1159 "HETNAM AXS TENSOR AXES \n", 1160 "FORMUL 1 COM C1 \n", 1161 "FORMUL 2 TNS H240 \n", 1162 "FORMUL 3 AXS C9N6 \n", 1163 "HETATM 1 R COM A 1 -0.000 0.000 0.000 1.00 0.00 C \n", 1164 "HETATM 2 H2 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1165 "HETATM 3 H3 TNS A 2 34.069 -26.135 24.079 1.00 0.00 H \n", 1166 "HETATM 4 H4 TNS A 2 22.441 -24.585 22.046 1.00 0.00 H \n", 1167 "HETATM 5 H5 TNS A 2 12.181 -21.601 18.895 1.00 0.00 H \n", 1168 "HETATM 6 H6 TNS A 2 2.612 -17.891 15.178 1.00 0.00 H \n", 1169 "HETATM 7 H7 TNS A 2 -6.450 -13.649 11.046 1.00 0.00 H \n", 1170 "HETATM 8 H8 TNS A 2 -15.068 -8.941 6.552 1.00 0.00 H \n", 1171 "HETATM 9 H9 TNS A 2 -23.243 -3.767 1.694 1.00 0.00 H \n", 1172 "HETATM 10 H10 TNS A 2 -30.910 1.939 -3.577 1.00 0.00 H \n", 1173 "HETATM 11 H11 TNS A 2 -37.886 8.372 -9.415 1.00 0.00 H \n", 1174 "HETATM 12 H12 TNS A 2 -43.495 16.239 -16.370 1.00 0.00 H \n", 1175 "HETATM 13 H13 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1176 "HETATM 14 H14 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1177 "HETATM 15 H15 TNS A 2 34.065 -22.779 27.601 1.00 0.00 H \n", 1178 "HETATM 16 H16 TNS A 2 22.436 -19.088 27.815 1.00 0.00 H \n", 1179 "HETATM 17 H17 TNS A 2 12.174 -14.935 25.891 1.00 0.00 H \n", 1180 "HETATM 18 H18 TNS A 2 2.605 -10.548 22.885 1.00 0.00 H \n", 1181 "HETATM 19 H19 TNS A 2 -6.458 -5.990 19.085 1.00 0.00 H \n", 1182 "HETATM 20 H20 TNS A 2 -15.076 -1.281 14.590 1.00 0.00 H \n", 1183 "HETATM 21 H21 TNS A 2 -23.250 3.577 9.401 1.00 0.00 H \n", 1184 "HETATM 22 H22 TNS A 2 -30.917 8.606 3.419 1.00 0.00 H \n", 1185 "HETATM 23 H23 TNS A 2 -37.892 13.869 -3.645 1.00 0.00 H \n", 1186 "HETATM 24 H24 TNS A 2 -43.499 19.594 -12.848 1.00 0.00 H \n", 1187 "HETATM 25 H25 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1188 "HETATM 26 H26 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1189 "HETATM 27 H27 TNS A 2 34.523 -19.268 30.401 1.00 0.00 H \n", 1190 "HETATM 28 H28 TNS A 2 23.187 -13.335 32.402 1.00 0.00 H \n", 1191 "HETATM 29 H29 TNS A 2 13.085 -7.958 31.453 1.00 0.00 H \n", 1192 "HETATM 30 H30 TNS A 2 3.608 -2.863 29.011 1.00 0.00 H \n", 1193 "HETATM 31 H31 TNS A 2 -5.412 2.026 25.475 1.00 0.00 H \n", 1194 "HETATM 32 H32 TNS A 2 -14.030 6.734 20.981 1.00 0.00 H \n", 1195 "HETATM 33 H33 TNS A 2 -22.247 11.261 15.528 1.00 0.00 H \n", 1196 "HETATM 34 H34 TNS A 2 -30.006 15.583 8.982 1.00 0.00 H \n", 1197 "HETATM 35 H35 TNS A 2 -37.141 19.622 0.941 1.00 0.00 H \n", 1198 "HETATM 36 H36 TNS A 2 -43.041 23.105 -10.049 1.00 0.00 H \n", 1199 "HETATM 37 H37 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1200 "HETATM 38 H38 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1201 "HETATM 39 H39 TNS A 2 35.399 -15.944 32.204 1.00 0.00 H \n", 1202 "HETATM 40 H40 TNS A 2 24.621 -7.890 35.357 1.00 0.00 H \n", 1203 "HETATM 41 H41 TNS A 2 14.824 -1.355 35.037 1.00 0.00 H \n", 1204 "HETATM 42 H42 TNS A 2 5.523 4.411 32.958 1.00 0.00 H \n", 1205 "HETATM 43 H43 TNS A 2 -3.414 9.612 29.592 1.00 0.00 H \n", 1206 "HETATM 44 H44 TNS A 2 -12.032 14.321 25.098 1.00 0.00 H \n", 1207 "HETATM 45 H45 TNS A 2 -20.332 18.535 19.475 1.00 0.00 H \n", 1208 "HETATM 46 H46 TNS A 2 -28.268 22.186 12.565 1.00 0.00 H \n", 1209 "HETATM 47 H47 TNS A 2 -35.707 25.067 3.896 1.00 0.00 H \n", 1210 "HETATM 48 H48 TNS A 2 -42.165 26.429 -8.245 1.00 0.00 H \n", 1211 "HETATM 49 H49 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1212 "HETATM 50 H50 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1213 "HETATM 51 H51 TNS A 2 36.605 -13.134 32.835 1.00 0.00 H \n", 1214 "HETATM 52 H52 TNS A 2 26.597 -3.285 36.390 1.00 0.00 H \n", 1215 "HETATM 53 H53 TNS A 2 17.220 4.229 36.290 1.00 0.00 H \n", 1216 "HETATM 54 H54 TNS A 2 8.163 10.561 34.339 1.00 0.00 H \n", 1217 "HETATM 55 H55 TNS A 2 -0.660 16.028 31.032 1.00 0.00 H \n", 1218 "HETATM 56 H56 TNS A 2 -9.278 20.736 26.538 1.00 0.00 H \n", 1219 "HETATM 57 H57 TNS A 2 -17.692 24.686 20.856 1.00 0.00 H \n", 1220 "HETATM 58 H58 TNS A 2 -25.871 27.770 13.818 1.00 0.00 H \n", 1221 "HETATM 59 H59 TNS A 2 -33.730 29.672 4.930 1.00 0.00 H \n", 1222 "HETATM 60 H60 TNS A 2 -40.959 29.239 -7.614 1.00 0.00 H \n", 1223 "HETATM 61 H61 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1224 "HETATM 62 H62 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1225 "HETATM 63 H63 TNS A 2 38.024 -11.112 32.231 1.00 0.00 H \n", 1226 "HETATM 64 H64 TNS A 2 28.923 0.028 35.402 1.00 0.00 H \n", 1227 "HETATM 65 H65 TNS A 2 20.041 8.247 35.091 1.00 0.00 H \n", 1228 "HETATM 66 H66 TNS A 2 11.270 14.987 33.018 1.00 0.00 H \n", 1229 "HETATM 67 H67 TNS A 2 2.580 20.644 29.654 1.00 0.00 H \n", 1230 "HETATM 68 H68 TNS A 2 -6.038 25.352 25.160 1.00 0.00 H \n", 1231 "HETATM 69 H69 TNS A 2 -14.585 29.111 19.535 1.00 0.00 H \n", 1232 "HETATM 70 H70 TNS A 2 -23.051 31.787 12.619 1.00 0.00 H \n", 1233 "HETATM 71 H71 TNS A 2 -31.405 32.985 3.941 1.00 0.00 H \n", 1234 "HETATM 72 H72 TNS A 2 -39.540 31.262 -8.218 1.00 0.00 H \n", 1235 "HETATM 73 H73 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1236 "HETATM 74 H74 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1237 "HETATM 75 H75 TNS A 2 39.518 -10.076 30.453 1.00 0.00 H \n", 1238 "HETATM 76 H76 TNS A 2 31.370 1.725 32.487 1.00 0.00 H \n", 1239 "HETATM 77 H77 TNS A 2 23.008 10.305 31.557 1.00 0.00 H \n", 1240 "HETATM 78 H78 TNS A 2 14.538 17.254 29.125 1.00 0.00 H \n", 1241 "HETATM 79 H79 TNS A 2 5.989 23.008 25.594 1.00 0.00 H \n", 1242 "HETATM 80 H80 TNS A 2 -2.629 27.717 21.100 1.00 0.00 H \n", 1243 "HETATM 81 H81 TNS A 2 -11.316 31.378 15.642 1.00 0.00 H \n", 1244 "HETATM 82 H82 TNS A 2 -20.083 33.846 9.085 1.00 0.00 H \n", 1245 "HETATM 83 H83 TNS A 2 -28.958 34.682 1.027 1.00 0.00 H \n", 1246 "HETATM 84 H84 TNS A 2 -38.046 32.298 -9.997 1.00 0.00 H \n", 1247 "HETATM 85 H85 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1248 "HETATM 86 H86 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1249 "HETATM 87 H87 TNS A 2 40.940 -10.127 27.673 1.00 0.00 H \n", 1250 "HETATM 88 H88 TNS A 2 33.699 1.641 27.933 1.00 0.00 H \n", 1251 "HETATM 89 H89 TNS A 2 25.832 10.202 26.033 1.00 0.00 H \n", 1252 "HETATM 90 H90 TNS A 2 17.649 17.141 23.041 1.00 0.00 H \n", 1253 "HETATM 91 H91 TNS A 2 9.234 22.891 19.248 1.00 0.00 H \n", 1254 "HETATM 92 H92 TNS A 2 0.616 27.599 14.754 1.00 0.00 H \n", 1255 "HETATM 93 H93 TNS A 2 -8.205 31.265 9.558 1.00 0.00 H \n", 1256 "HETATM 94 H94 TNS A 2 -17.259 33.743 3.562 1.00 0.00 H \n", 1257 "HETATM 95 H95 TNS A 2 -26.629 34.598 -3.528 1.00 0.00 H \n", 1258 "HETATM 96 H96 TNS A 2 -36.624 32.246 -12.777 1.00 0.00 H \n", 1259 "HETATM 97 H97 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1260 "HETATM 98 H98 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1261 "HETATM 99 H99 TNS A 2 42.150 -11.262 24.164 1.00 0.00 H \n", 1262 "HETATM 100 H100 TNS A 2 35.682 -0.218 22.184 1.00 0.00 H \n", 1263 "HETATM 101 H101 TNS A 2 28.237 7.949 19.062 1.00 0.00 H \n", 1264 "HETATM 102 H102 TNS A 2 20.298 14.659 15.362 1.00 0.00 H \n", 1265 "HETATM 103 H103 TNS A 2 11.997 20.302 11.238 1.00 0.00 H \n", 1266 "HETATM 104 H104 TNS A 2 3.379 25.010 6.744 1.00 0.00 H \n", 1267 "HETATM 105 H105 TNS A 2 -5.557 28.783 1.879 1.00 0.00 H \n", 1268 "HETATM 106 H106 TNS A 2 -14.854 31.490 -3.410 1.00 0.00 H \n", 1269 "HETATM 107 H107 TNS A 2 -24.646 32.739 -9.277 1.00 0.00 H \n", 1270 "HETATM 108 H108 TNS A 2 -35.414 31.112 -16.286 1.00 0.00 H \n", 1271 "HETATM 109 H109 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1272 "HETATM 110 H110 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1273 "HETATM 111 H111 TNS A 2 43.031 -13.367 20.269 1.00 0.00 H \n", 1274 "HETATM 112 H112 TNS A 2 37.125 -3.668 15.803 1.00 0.00 H \n", 1275 "HETATM 113 H113 TNS A 2 29.987 3.765 11.324 1.00 0.00 H \n", 1276 "HETATM 114 H114 TNS A 2 22.225 10.050 6.838 1.00 0.00 H \n", 1277 "HETATM 115 H115 TNS A 2 14.007 15.495 2.348 1.00 0.00 H \n", 1278 "HETATM 116 H116 TNS A 2 5.389 20.203 -2.146 1.00 0.00 H \n", 1279 "HETATM 117 H117 TNS A 2 -3.629 24.175 -6.645 1.00 0.00 H \n", 1280 "HETATM 118 H118 TNS A 2 -13.104 27.306 -11.148 1.00 0.00 H \n", 1281 "HETATM 119 H119 TNS A 2 -23.203 29.289 -15.658 1.00 0.00 H \n", 1282 "HETATM 120 H120 TNS A 2 -34.533 29.006 -20.181 1.00 0.00 H \n", 1283 "HETATM 121 H121 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1284 "HETATM 122 H122 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1285 "HETATM 123 H123 TNS A 2 43.495 -16.239 16.370 1.00 0.00 H \n", 1286 "HETATM 124 H124 TNS A 2 37.886 -8.372 9.415 1.00 0.00 H \n", 1287 "HETATM 125 H125 TNS A 2 30.910 -1.939 3.577 1.00 0.00 H \n", 1288 "HETATM 126 H126 TNS A 2 23.243 3.767 -1.694 1.00 0.00 H \n", 1289 "HETATM 127 H127 TNS A 2 15.068 8.941 -6.552 1.00 0.00 H \n", 1290 "HETATM 128 H128 TNS A 2 6.450 13.649 -11.046 1.00 0.00 H \n", 1291 "HETATM 129 H129 TNS A 2 -2.612 17.891 -15.178 1.00 0.00 H \n", 1292 "HETATM 130 H130 TNS A 2 -12.181 21.601 -18.895 1.00 0.00 H \n", 1293 "HETATM 131 H131 TNS A 2 -22.441 24.585 -22.046 1.00 0.00 H \n", 1294 "HETATM 132 H132 TNS A 2 -34.069 26.135 -24.079 1.00 0.00 H \n", 1295 "HETATM 133 H133 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1296 "HETATM 134 H134 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1297 "HETATM 135 H135 TNS A 2 43.499 -19.594 12.848 1.00 0.00 H \n", 1298 "HETATM 136 H136 TNS A 2 37.892 -13.869 3.645 1.00 0.00 H \n", 1299 "HETATM 137 H137 TNS A 2 30.917 -8.606 -3.419 1.00 0.00 H \n", 1300 "HETATM 138 H138 TNS A 2 23.250 -3.577 -9.401 1.00 0.00 H \n", 1301 "HETATM 139 H139 TNS A 2 15.076 1.281 -14.590 1.00 0.00 H \n", 1302 "HETATM 140 H140 TNS A 2 6.458 5.990 -19.085 1.00 0.00 H \n", 1303 "HETATM 141 H141 TNS A 2 -2.605 10.548 -22.885 1.00 0.00 H \n", 1304 "HETATM 142 H142 TNS A 2 -12.174 14.935 -25.891 1.00 0.00 H \n", 1305 "HETATM 143 H143 TNS A 2 -22.436 19.088 -27.815 1.00 0.00 H \n", 1306 "HETATM 144 H144 TNS A 2 -34.065 22.779 -27.601 1.00 0.00 H \n", 1307 "HETATM 145 H145 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1308 "HETATM 146 H146 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1309 "HETATM 147 H147 TNS A 2 43.041 -23.105 10.049 1.00 0.00 H \n", 1310 "HETATM 148 H148 TNS A 2 37.141 -19.622 -0.941 1.00 0.00 H \n", 1311 "HETATM 149 H149 TNS A 2 30.006 -15.583 -8.982 1.00 0.00 H \n", 1312 "HETATM 150 H150 TNS A 2 22.247 -11.261 -15.528 1.00 0.00 H \n", 1313 "HETATM 151 H151 TNS A 2 14.030 -6.734 -20.981 1.00 0.00 H \n", 1314 "HETATM 152 H152 TNS A 2 5.412 -2.026 -25.475 1.00 0.00 H \n", 1315 "HETATM 153 H153 TNS A 2 -3.608 2.863 -29.011 1.00 0.00 H \n", 1316 "HETATM 154 H154 TNS A 2 -13.085 7.958 -31.453 1.00 0.00 H \n", 1317 "HETATM 155 H155 TNS A 2 -23.187 13.335 -32.402 1.00 0.00 H \n", 1318 "HETATM 156 H156 TNS A 2 -34.523 19.268 -30.401 1.00 0.00 H \n", 1319 "HETATM 157 H157 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1320 "HETATM 158 H158 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1321 "HETATM 159 H159 TNS A 2 42.165 -26.429 8.245 1.00 0.00 H \n", 1322 "HETATM 160 H160 TNS A 2 35.707 -25.067 -3.896 1.00 0.00 H \n", 1323 "HETATM 161 H161 TNS A 2 28.268 -22.186 -12.565 1.00 0.00 H \n", 1324 "HETATM 162 H162 TNS A 2 20.332 -18.535 -19.475 1.00 0.00 H \n", 1325 "HETATM 163 H163 TNS A 2 12.032 -14.321 -25.098 1.00 0.00 H \n", 1326 "HETATM 164 H164 TNS A 2 3.414 -9.612 -29.592 1.00 0.00 H \n", 1327 "HETATM 165 H165 TNS A 2 -5.523 -4.411 -32.958 1.00 0.00 H \n", 1328 "HETATM 166 H166 TNS A 2 -14.824 1.355 -35.037 1.00 0.00 H \n", 1329 "HETATM 167 H167 TNS A 2 -24.621 7.890 -35.357 1.00 0.00 H \n", 1330 "HETATM 168 H168 TNS A 2 -35.399 15.944 -32.204 1.00 0.00 H \n", 1331 "HETATM 169 H169 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1332 "HETATM 170 H170 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1333 "HETATM 171 H171 TNS A 2 40.959 -29.239 7.614 1.00 0.00 H \n", 1334 "HETATM 172 H172 TNS A 2 33.730 -29.672 -4.930 1.00 0.00 H \n", 1335 "HETATM 173 H173 TNS A 2 25.871 -27.770 -13.818 1.00 0.00 H \n", 1336 "HETATM 174 H174 TNS A 2 17.692 -24.686 -20.856 1.00 0.00 H \n", 1337 "HETATM 175 H175 TNS A 2 9.278 -20.736 -26.538 1.00 0.00 H \n", 1338 "HETATM 176 H176 TNS A 2 0.660 -16.028 -31.032 1.00 0.00 H \n", 1339 "HETATM 177 H177 TNS A 2 -8.163 -10.561 -34.339 1.00 0.00 H \n", 1340 "HETATM 178 H178 TNS A 2 -17.220 -4.229 -36.290 1.00 0.00 H \n", 1341 "HETATM 179 H179 TNS A 2 -26.597 3.285 -36.390 1.00 0.00 H \n", 1342 "HETATM 180 H180 TNS A 2 -36.605 13.134 -32.835 1.00 0.00 H \n", 1343 "HETATM 181 H181 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1344 "HETATM 182 H182 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1345 "HETATM 183 H183 TNS A 2 39.540 -31.262 8.218 1.00 0.00 H \n", 1346 "HETATM 184 H184 TNS A 2 31.405 -32.985 -3.941 1.00 0.00 H \n", 1347 "HETATM 185 H185 TNS A 2 23.051 -31.787 -12.619 1.00 0.00 H \n", 1348 "HETATM 186 H186 TNS A 2 14.585 -29.111 -19.535 1.00 0.00 H \n", 1349 "HETATM 187 H187 TNS A 2 6.038 -25.352 -25.160 1.00 0.00 H \n", 1350 "HETATM 188 H188 TNS A 2 -2.580 -20.644 -29.654 1.00 0.00 H \n", 1351 "HETATM 189 H189 TNS A 2 -11.270 -14.987 -33.018 1.00 0.00 H \n", 1352 "HETATM 190 H190 TNS A 2 -20.041 -8.247 -35.091 1.00 0.00 H \n", 1353 "HETATM 191 H191 TNS A 2 -28.923 -0.028 -35.402 1.00 0.00 H \n", 1354 "HETATM 192 H192 TNS A 2 -38.024 11.112 -32.231 1.00 0.00 H \n", 1355 "HETATM 193 H193 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1356 "HETATM 194 H194 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1357 "HETATM 195 H195 TNS A 2 38.046 -32.298 9.997 1.00 0.00 H \n", 1358 "HETATM 196 H196 TNS A 2 28.958 -34.682 -1.027 1.00 0.00 H \n", 1359 "HETATM 197 H197 TNS A 2 20.083 -33.846 -9.085 1.00 0.00 H \n", 1360 "HETATM 198 H198 TNS A 2 11.316 -31.378 -15.642 1.00 0.00 H \n", 1361 "HETATM 199 H199 TNS A 2 2.629 -27.717 -21.100 1.00 0.00 H \n", 1362 "HETATM 200 H200 TNS A 2 -5.989 -23.008 -25.594 1.00 0.00 H \n", 1363 "HETATM 201 H201 TNS A 2 -14.538 -17.254 -29.125 1.00 0.00 H \n", 1364 "HETATM 202 H202 TNS A 2 -23.008 -10.305 -31.557 1.00 0.00 H \n", 1365 "HETATM 203 H203 TNS A 2 -31.370 -1.725 -32.487 1.00 0.00 H \n", 1366 "HETATM 204 H204 TNS A 2 -39.518 10.076 -30.453 1.00 0.00 H \n", 1367 "HETATM 205 H205 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1368 "HETATM 206 H206 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1369 "HETATM 207 H207 TNS A 2 36.624 -32.246 12.777 1.00 0.00 H \n", 1370 "HETATM 208 H208 TNS A 2 26.629 -34.598 3.528 1.00 0.00 H \n", 1371 "HETATM 209 H209 TNS A 2 17.259 -33.743 -3.562 1.00 0.00 H \n", 1372 "HETATM 210 H210 TNS A 2 8.205 -31.265 -9.558 1.00 0.00 H \n", 1373 "HETATM 211 H211 TNS A 2 -0.616 -27.599 -14.754 1.00 0.00 H \n", 1374 "HETATM 212 H212 TNS A 2 -9.234 -22.891 -19.248 1.00 0.00 H \n", 1375 "HETATM 213 H213 TNS A 2 -17.649 -17.141 -23.041 1.00 0.00 H \n", 1376 "HETATM 214 H214 TNS A 2 -25.832 -10.202 -26.033 1.00 0.00 H \n", 1377 "HETATM 215 H215 TNS A 2 -33.699 -1.641 -27.933 1.00 0.00 H \n", 1378 "HETATM 216 H216 TNS A 2 -40.940 10.127 -27.673 1.00 0.00 H \n", 1379 "HETATM 217 H217 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1380 "HETATM 218 H218 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1381 "HETATM 219 H219 TNS A 2 35.414 -31.112 16.286 1.00 0.00 H \n", 1382 "HETATM 220 H220 TNS A 2 24.646 -32.739 9.277 1.00 0.00 H \n", 1383 "HETATM 221 H221 TNS A 2 14.854 -31.490 3.410 1.00 0.00 H \n", 1384 "HETATM 222 H222 TNS A 2 5.557 -28.783 -1.879 1.00 0.00 H \n", 1385 "HETATM 223 H223 TNS A 2 -3.379 -25.010 -6.744 1.00 0.00 H \n", 1386 "HETATM 224 H224 TNS A 2 -11.997 -20.302 -11.238 1.00 0.00 H \n", 1387 "HETATM 225 H225 TNS A 2 -20.298 -14.659 -15.362 1.00 0.00 H \n", 1388 "HETATM 226 H226 TNS A 2 -28.237 -7.949 -19.062 1.00 0.00 H \n", 1389 "HETATM 227 H227 TNS A 2 -35.682 0.218 -22.184 1.00 0.00 H \n", 1390 "HETATM 228 H228 TNS A 2 -42.150 11.262 -24.164 1.00 0.00 H \n", 1391 "HETATM 229 H229 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1392 "HETATM 230 H230 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 1393 "HETATM 231 H231 TNS A 2 34.533 -29.006 20.181 1.00 0.00 H \n", 1394 "HETATM 232 H232 TNS A 2 23.203 -29.289 15.658 1.00 0.00 H \n", 1395 "HETATM 233 H233 TNS A 2 13.104 -27.306 11.148 1.00 0.00 H \n", 1396 "HETATM 234 H234 TNS A 2 3.629 -24.175 6.645 1.00 0.00 H \n", 1397 "HETATM 235 H235 TNS A 2 -5.389 -20.203 2.146 1.00 0.00 H \n", 1398 "HETATM 236 H236 TNS A 2 -14.007 -15.495 -2.348 1.00 0.00 H \n", 1399 "HETATM 237 H237 TNS A 2 -22.225 -10.050 -6.838 1.00 0.00 H \n", 1400 "HETATM 238 H238 TNS A 2 -29.987 -3.765 -11.324 1.00 0.00 H \n", 1401 "HETATM 239 H239 TNS A 2 -37.125 3.668 -15.803 1.00 0.00 H \n", 1402 "HETATM 240 H240 TNS A 2 -43.031 13.367 -20.269 1.00 0.00 H \n", 1403 "HETATM 241 H241 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 1404 "HETATM 242 R AXS A 3 -0.000 0.000 0.000 1.00 0.00 C \n", 1405 "HETATM 243 Dx AXS A 3 -10.813 -11.352 8.843 1.00 0.00 C \n", 1406 "HETATM 244 Dx AXS A 3 10.813 11.352 -8.843 1.00 0.00 C \n", 1407 "HETATM 245 Dx AXS A 3 -11.895 -12.487 9.728 1.00 0.00 N \n", 1408 "HETATM 246 Dx AXS A 3 11.895 12.487 -9.728 1.00 0.00 N \n", 1409 "HETATM 247 R AXS A 3 -0.000 0.000 0.000 1.00 0.00 C \n", 1410 "HETATM 248 Dy AXS A 3 -1.738 23.114 27.545 1.00 0.00 C \n", 1411 "HETATM 249 Dy AXS A 3 1.738 -23.114 -27.545 1.00 0.00 C \n", 1412 "HETATM 250 Dy AXS A 3 -1.912 25.425 30.300 1.00 0.00 N \n", 1413 "HETATM 251 Dy AXS A 3 1.912 -25.425 -30.300 1.00 0.00 N \n", 1414 "HETATM 252 R AXS A 3 -0.000 0.000 0.000 1.00 0.00 C \n", 1415 "HETATM 253 Dz AXS A 3 -43.091 23.541 -22.472 1.00 0.00 C \n", 1416 "HETATM 254 Dz AXS A 3 43.091 -23.541 22.472 1.00 0.00 C \n", 1417 "HETATM 255 Dz AXS A 3 -47.400 25.895 -24.719 1.00 0.00 N \n", 1418 "HETATM 256 Dz AXS A 3 47.400 -25.895 24.719 1.00 0.00 N \n", 1419 "CONECT 2 3 14 230 \n", 1420 "CONECT 3 2 4 15 231 \n", 1421 "CONECT 4 3 5 16 232 \n", 1422 "CONECT 5 4 6 17 233 \n", 1423 "CONECT 6 5 7 18 234 \n", 1424 "CONECT 7 6 8 19 235 \n", 1425 "CONECT 8 7 9 20 236 \n", 1426 "CONECT 9 8 10 21 237 \n", 1427 "CONECT 10 9 11 22 238 \n", 1428 "CONECT 11 10 12 23 239 \n", 1429 "CONECT 12 11 13 24 240 \n", 1430 "CONECT 13 12 25 241 \n", 1431 "CONECT 14 2 15 26 \n", 1432 "CONECT 15 14 3 16 27 \n", 1433 "CONECT 16 15 4 17 28 \n", 1434 "CONECT 17 16 5 18 29 \n", 1435 "CONECT 18 17 6 19 30 \n", 1436 "CONECT 19 18 7 20 31 \n", 1437 "CONECT 20 19 8 21 32 \n", 1438 "CONECT 21 20 9 22 33 \n", 1439 "CONECT 22 21 10 23 34 \n", 1440 "CONECT 23 22 11 24 35 \n", 1441 "CONECT 24 23 12 25 36 \n", 1442 "CONECT 25 24 13 37 \n", 1443 "CONECT 26 14 27 38 \n", 1444 "CONECT 27 26 15 28 39 \n", 1445 "CONECT 28 27 16 29 40 \n", 1446 "CONECT 29 28 17 30 41 \n", 1447 "CONECT 30 29 18 31 42 \n", 1448 "CONECT 31 30 19 32 43 \n", 1449 "CONECT 32 31 20 33 44 \n", 1450 "CONECT 33 32 21 34 45 \n", 1451 "CONECT 34 33 22 35 46 \n", 1452 "CONECT 35 34 23 36 47 \n", 1453 "CONECT 36 35 24 37 48 \n", 1454 "CONECT 37 36 25 49 \n", 1455 "CONECT 38 26 39 50 \n", 1456 "CONECT 39 38 27 40 51 \n", 1457 "CONECT 40 39 28 41 52 \n", 1458 "CONECT 41 40 29 42 53 \n", 1459 "CONECT 42 41 30 43 54 \n", 1460 "CONECT 43 42 31 44 55 \n", 1461 "CONECT 44 43 32 45 56 \n", 1462 "CONECT 45 44 33 46 57 \n", 1463 "CONECT 46 45 34 47 58 \n", 1464 "CONECT 47 46 35 48 59 \n", 1465 "CONECT 48 47 36 49 60 \n", 1466 "CONECT 49 48 37 61 \n", 1467 "CONECT 50 38 51 62 \n", 1468 "CONECT 51 50 39 52 63 \n", 1469 "CONECT 52 51 40 53 64 \n", 1470 "CONECT 53 52 41 54 65 \n", 1471 "CONECT 54 53 42 55 66 \n", 1472 "CONECT 55 54 43 56 67 \n", 1473 "CONECT 56 55 44 57 68 \n", 1474 "CONECT 57 56 45 58 69 \n", 1475 "CONECT 58 57 46 59 70 \n", 1476 "CONECT 59 58 47 60 71 \n", 1477 "CONECT 60 59 48 61 72 \n", 1478 "CONECT 61 60 49 73 \n", 1479 "CONECT 62 50 63 74 \n", 1480 "CONECT 63 62 51 64 75 \n", 1481 "CONECT 64 63 52 65 76 \n", 1482 "CONECT 65 64 53 66 77 \n", 1483 "CONECT 66 65 54 67 78 \n", 1484 "CONECT 67 66 55 68 79 \n", 1485 "CONECT 68 67 56 69 80 \n", 1486 "CONECT 69 68 57 70 81 \n", 1487 "CONECT 70 69 58 71 82 \n", 1488 "CONECT 71 70 59 72 83 \n", 1489 "CONECT 72 71 60 73 84 \n", 1490 "CONECT 73 72 61 85 \n", 1491 "CONECT 74 62 75 86 \n", 1492 "CONECT 75 74 63 76 87 \n", 1493 "CONECT 76 75 64 77 88 \n", 1494 "CONECT 77 76 65 78 89 \n", 1495 "CONECT 78 77 66 79 90 \n", 1496 "CONECT 79 78 67 80 91 \n", 1497 "CONECT 80 79 68 81 92 \n", 1498 "CONECT 81 80 69 82 93 \n", 1499 "CONECT 82 81 70 83 94 \n", 1500 "CONECT 83 82 71 84 95 \n", 1501 "CONECT 84 83 72 85 96 \n", 1502 "CONECT 85 84 73 97 \n", 1503 "CONECT 86 74 87 98 \n", 1504 "CONECT 87 86 75 88 99 \n", 1505 "CONECT 88 87 76 89 100 \n", 1506 "CONECT 89 88 77 90 101 \n", 1507 "CONECT 90 89 78 91 102 \n", 1508 "CONECT 91 90 79 92 103 \n", 1509 "CONECT 92 91 80 93 104 \n", 1510 "CONECT 93 92 81 94 105 \n", 1511 "CONECT 94 93 82 95 106 \n", 1512 "CONECT 95 94 83 96 107 \n", 1513 "CONECT 96 95 84 97 108 \n", 1514 "CONECT 97 96 85 109 \n", 1515 "CONECT 98 86 99 110 \n", 1516 "CONECT 99 98 87 100 111 \n", 1517 "CONECT 100 99 88 101 112 \n", 1518 "CONECT 101 100 89 102 113 \n", 1519 "CONECT 102 101 90 103 114 \n", 1520 "CONECT 103 102 91 104 115 \n", 1521 "CONECT 104 103 92 105 116 \n", 1522 "CONECT 105 104 93 106 117 \n", 1523 "CONECT 106 105 94 107 118 \n", 1524 "CONECT 107 106 95 108 119 \n", 1525 "CONECT 108 107 96 109 120 \n", 1526 "CONECT 109 108 97 121 \n", 1527 "CONECT 110 98 111 122 \n", 1528 "CONECT 111 110 99 112 123 \n", 1529 "CONECT 112 111 100 113 124 \n", 1530 "CONECT 113 112 101 114 125 \n", 1531 "CONECT 114 113 102 115 126 \n", 1532 "CONECT 115 114 103 116 127 \n", 1533 "CONECT 116 115 104 117 128 \n", 1534 "CONECT 117 116 105 118 129 \n", 1535 "CONECT 118 117 106 119 130 \n", 1536 "CONECT 119 118 107 120 131 \n", 1537 "CONECT 120 119 108 121 132 \n", 1538 "CONECT 121 120 109 133 \n", 1539 "CONECT 122 110 123 134 \n", 1540 "CONECT 123 122 111 124 135 \n", 1541 "CONECT 124 123 112 125 136 \n", 1542 "CONECT 125 124 113 126 137 \n", 1543 "CONECT 126 125 114 127 138 \n", 1544 "CONECT 127 126 115 128 139 \n", 1545 "CONECT 128 127 116 129 140 \n", 1546 "CONECT 129 128 117 130 141 \n", 1547 "CONECT 130 129 118 131 142 \n", 1548 "CONECT 131 130 119 132 143 \n", 1549 "CONECT 132 131 120 133 144 \n", 1550 "CONECT 133 132 121 145 \n", 1551 "CONECT 134 122 135 146 \n", 1552 "CONECT 135 134 123 136 147 \n", 1553 "CONECT 136 135 124 137 148 \n", 1554 "CONECT 137 136 125 138 149 \n", 1555 "CONECT 138 137 126 139 150 \n", 1556 "CONECT 139 138 127 140 151 \n", 1557 "CONECT 140 139 128 141 152 \n", 1558 "CONECT 141 140 129 142 153 \n", 1559 "CONECT 142 141 130 143 154 \n", 1560 "CONECT 143 142 131 144 155 \n", 1561 "CONECT 144 143 132 145 156 \n", 1562 "CONECT 145 144 133 157 \n", 1563 "CONECT 146 134 147 158 \n", 1564 "CONECT 147 146 135 148 159 \n", 1565 "CONECT 148 147 136 149 160 \n", 1566 "CONECT 149 148 137 150 161 \n", 1567 "CONECT 150 149 138 151 162 \n", 1568 "CONECT 151 150 139 152 163 \n", 1569 "CONECT 152 151 140 153 164 \n", 1570 "CONECT 153 152 141 154 165 \n", 1571 "CONECT 154 153 142 155 166 \n", 1572 "CONECT 155 154 143 156 167 \n", 1573 "CONECT 156 155 144 157 168 \n", 1574 "CONECT 157 156 145 169 \n", 1575 "CONECT 158 146 159 170 \n", 1576 "CONECT 159 158 147 160 171 \n", 1577 "CONECT 160 159 148 161 172 \n", 1578 "CONECT 161 160 149 162 173 \n", 1579 "CONECT 162 161 150 163 174 \n", 1580 "CONECT 163 162 151 164 175 \n", 1581 "CONECT 164 163 152 165 176 \n", 1582 "CONECT 165 164 153 166 177 \n", 1583 "CONECT 166 165 154 167 178 \n", 1584 "CONECT 167 166 155 168 179 \n", 1585 "CONECT 168 167 156 169 180 \n", 1586 "CONECT 169 168 157 181 \n", 1587 "CONECT 170 158 171 182 \n", 1588 "CONECT 171 170 159 172 183 \n", 1589 "CONECT 172 171 160 173 184 \n", 1590 "CONECT 173 172 161 174 185 \n", 1591 "CONECT 174 173 162 175 186 \n", 1592 "CONECT 175 174 163 176 187 \n", 1593 "CONECT 176 175 164 177 188 \n", 1594 "CONECT 177 176 165 178 189 \n", 1595 "CONECT 178 177 166 179 190 \n", 1596 "CONECT 179 178 167 180 191 \n", 1597 "CONECT 180 179 168 181 192 \n", 1598 "CONECT 181 180 169 193 \n", 1599 "CONECT 182 170 183 194 \n", 1600 "CONECT 183 182 171 184 195 \n", 1601 "CONECT 184 183 172 185 196 \n", 1602 "CONECT 185 184 173 186 197 \n", 1603 "CONECT 186 185 174 187 198 \n", 1604 "CONECT 187 186 175 188 199 \n", 1605 "CONECT 188 187 176 189 200 \n", 1606 "CONECT 189 188 177 190 201 \n", 1607 "CONECT 190 189 178 191 202 \n", 1608 "CONECT 191 190 179 192 203 \n", 1609 "CONECT 192 191 180 193 204 \n", 1610 "CONECT 193 192 181 205 \n", 1611 "CONECT 194 182 195 206 \n", 1612 "CONECT 195 194 183 196 207 \n", 1613 "CONECT 196 195 184 197 208 \n", 1614 "CONECT 197 196 185 198 209 \n", 1615 "CONECT 198 197 186 199 210 \n", 1616 "CONECT 199 198 187 200 211 \n", 1617 "CONECT 200 199 188 201 212 \n", 1618 "CONECT 201 200 189 202 213 \n", 1619 "CONECT 202 201 190 203 214 \n", 1620 "CONECT 203 202 191 204 215 \n", 1621 "CONECT 204 203 192 205 216 \n", 1622 "CONECT 205 204 193 217 \n", 1623 "CONECT 206 194 207 218 \n", 1624 "CONECT 207 206 195 208 219 \n", 1625 "CONECT 208 207 196 209 220 \n", 1626 "CONECT 209 208 197 210 221 \n", 1627 "CONECT 210 209 198 211 222 \n", 1628 "CONECT 211 210 199 212 223 \n", 1629 "CONECT 212 211 200 213 224 \n", 1630 "CONECT 213 212 201 214 225 \n", 1631 "CONECT 214 213 202 215 226 \n", 1632 "CONECT 215 214 203 216 227 \n", 1633 "CONECT 216 215 204 217 228 \n", 1634 "CONECT 217 216 205 229 \n", 1635 "CONECT 218 206 219 230 \n", 1636 "CONECT 219 218 207 220 231 \n", 1637 "CONECT 220 219 208 221 232 \n", 1638 "CONECT 221 220 209 222 233 \n", 1639 "CONECT 222 221 210 223 234 \n", 1640 "CONECT 223 222 211 224 235 \n", 1641 "CONECT 224 223 212 225 236 \n", 1642 "CONECT 225 224 213 226 237 \n", 1643 "CONECT 226 225 214 227 238 \n", 1644 "CONECT 227 226 215 228 239 \n", 1645 "CONECT 228 227 216 229 240 \n", 1646 "CONECT 229 228 217 241 \n", 1647 "CONECT 230 218 2 231 \n", 1648 "CONECT 231 230 219 3 232 \n", 1649 "CONECT 232 231 220 4 233 \n", 1650 "CONECT 233 232 221 5 234 \n", 1651 "CONECT 234 233 222 6 235 \n", 1652 "CONECT 235 234 223 7 236 \n", 1653 "CONECT 236 235 224 8 237 \n", 1654 "CONECT 237 236 225 9 238 \n", 1655 "CONECT 238 237 226 10 239 \n", 1656 "CONECT 239 238 227 11 240 \n", 1657 "CONECT 240 239 228 12 241 \n", 1658 "CONECT 241 240 229 13 \n", 1659 "CONECT 242 243 244 \n", 1660 "CONECT 243 242 \n", 1661 "CONECT 244 242 \n", 1662 "CONECT 247 248 249 \n", 1663 "CONECT 248 247 \n", 1664 "CONECT 249 247 \n", 1665 "CONECT 252 253 254 \n", 1666 "CONECT 253 252 \n", 1667 "CONECT 254 252 \n", 1668 "MASTER 0 0 3 0 0 0 0 0 256 0 249 0 \n", 1669 "END \n" 1670 ] 1671 1672 # Check the data. 1673 self.strip_remarks(lines) 1674 self.assertEqual(len(real_data), len(lines)) 1675 for i in range(len(lines)): 1676 self.assertEqual(real_data[i], lines[i])
1677 1678
1680 """Check the 3D coordinates of the PDB representation of the optimised oblate diffusion tensor.""" 1681 1682 # Reset relax. 1683 self.interpreter.reset() 1684 1685 # Create a temporary file. 1686 ds.tmpfile = mktemp() 1687 1688 # The diffusion type and directory (used by the script). 1689 ds.diff_dir = 'spheroid_oblate' 1690 ds.diff_type = 'oblate' 1691 1692 # Execute the script. 1693 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 1694 1695 # Create the PDB representation. 1696 self.interpreter.structure.create_diff_tensor_pdb(scale=1.8e-06, file=ds.tmpfile, force=True) 1697 1698 # Read the contents of the file. 1699 file = open(ds.tmpfile) 1700 lines = file.readlines() 1701 file.close() 1702 1703 # What the contents should be, without remarks. 1704 real_data = [ 1705 "HET COM A 1 1 \n", 1706 "HET TNS A 2 240 \n", 1707 "HET AXS A 3 5 \n", 1708 "HETNAM COM CENTRE OF MASS \n", 1709 "HETNAM TNS TENSOR \n", 1710 "HETNAM AXS TENSOR AXES \n", 1711 "FORMUL 1 COM C1 \n", 1712 "FORMUL 2 TNS H240 \n", 1713 "FORMUL 3 AXS C3N2 \n", 1714 "HETATM 1 R COM A 1 -0.000 0.000 0.000 1.00 0.00 C \n", 1715 "HETATM 2 H2 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1716 "HETATM 3 H3 TNS A 2 -31.028 -24.990 -4.071 1.00 0.00 H \n", 1717 "HETATM 4 H4 TNS A 2 -34.085 -23.357 -20.368 1.00 0.00 H \n", 1718 "HETATM 5 H5 TNS A 2 -33.789 -20.404 -30.870 1.00 0.00 H \n", 1719 "HETATM 6 H6 TNS A 2 -31.796 -16.782 -38.439 1.00 0.00 H \n", 1720 "HETATM 7 H7 TNS A 2 -28.560 -12.670 -43.859 1.00 0.00 H \n", 1721 "HETATM 8 H8 TNS A 2 -24.234 -8.130 -47.396 1.00 0.00 H \n", 1722 "HETATM 9 H9 TNS A 2 -18.820 -3.160 -49.051 1.00 0.00 H \n", 1723 "HETATM 10 H10 TNS A 2 -12.162 2.300 -48.557 1.00 0.00 H \n", 1724 "HETATM 11 H11 TNS A 2 -3.807 8.428 -45.129 1.00 0.00 H \n", 1725 "HETATM 12 H12 TNS A 2 7.900 15.877 -35.907 1.00 0.00 H \n", 1726 "HETATM 13 H13 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1727 "HETATM 14 H14 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1728 "HETATM 15 H15 TNS A 2 -35.049 -19.300 -1.685 1.00 0.00 H \n", 1729 "HETATM 16 H16 TNS A 2 -40.673 -14.036 -16.459 1.00 0.00 H \n", 1730 "HETATM 17 H17 TNS A 2 -41.778 -9.100 -26.129 1.00 0.00 H \n", 1731 "HETATM 18 H18 TNS A 2 -40.596 -4.331 -33.217 1.00 0.00 H \n", 1732 "HETATM 19 H19 TNS A 2 -37.739 0.317 -38.412 1.00 0.00 H \n", 1733 "HETATM 20 H20 TNS A 2 -33.413 4.857 -41.949 1.00 0.00 H \n", 1734 "HETATM 21 H21 TNS A 2 -27.620 9.291 -43.829 1.00 0.00 H \n", 1735 "HETATM 22 H22 TNS A 2 -20.152 13.604 -43.816 1.00 0.00 H \n", 1736 "HETATM 23 H23 TNS A 2 -10.396 17.749 -41.220 1.00 0.00 H \n", 1737 "HETATM 24 H24 TNS A 2 3.879 21.567 -33.521 1.00 0.00 H \n", 1738 "HETATM 25 H25 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1739 "HETATM 26 H26 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1740 "HETATM 27 H27 TNS A 2 -37.545 -13.722 2.425 1.00 0.00 H \n", 1741 "HETATM 28 H28 TNS A 2 -44.762 -4.897 -9.726 1.00 0.00 H \n", 1742 "HETATM 29 H29 TNS A 2 -46.737 1.983 -17.965 1.00 0.00 H \n", 1743 "HETATM 30 H30 TNS A 2 -46.058 7.877 -24.224 1.00 0.00 H \n", 1744 "HETATM 31 H31 TNS A 2 -43.435 13.050 -29.032 1.00 0.00 H \n", 1745 "HETATM 32 H32 TNS A 2 -39.110 17.591 -32.569 1.00 0.00 H \n", 1746 "HETATM 33 H33 TNS A 2 -33.082 21.500 -34.836 1.00 0.00 H \n", 1747 "HETATM 34 H34 TNS A 2 -25.110 24.687 -35.652 1.00 0.00 H \n", 1748 "HETATM 35 H35 TNS A 2 -14.484 26.889 -34.487 1.00 0.00 H \n", 1749 "HETATM 36 H36 TNS A 2 1.383 27.145 -29.411 1.00 0.00 H \n", 1750 "HETATM 37 H37 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1751 "HETATM 38 H38 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1752 "HETATM 39 H39 TNS A 2 -38.271 -8.800 7.855 1.00 0.00 H \n", 1753 "HETATM 40 H40 TNS A 2 -45.951 3.167 -0.830 1.00 0.00 H \n", 1754 "HETATM 41 H41 TNS A 2 -48.179 11.761 -7.177 1.00 0.00 H \n", 1755 "HETATM 42 H42 TNS A 2 -47.646 18.648 -12.340 1.00 0.00 H \n", 1756 "HETATM 43 H43 TNS A 2 -45.092 24.284 -16.637 1.00 0.00 H \n", 1757 "HETATM 44 H44 TNS A 2 -40.767 28.825 -20.174 1.00 0.00 H \n", 1758 "HETATM 45 H45 TNS A 2 -34.670 32.270 -22.952 1.00 0.00 H \n", 1759 "HETATM 46 H46 TNS A 2 -26.552 34.465 -24.863 1.00 0.00 H \n", 1760 "HETATM 47 H47 TNS A 2 -15.673 34.952 -25.591 1.00 0.00 H \n", 1761 "HETATM 48 H48 TNS A 2 0.657 32.067 -23.981 1.00 0.00 H \n", 1762 "HETATM 49 H49 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1763 "HETATM 50 H50 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1764 "HETATM 51 H51 TNS A 2 -37.156 -5.018 14.074 1.00 0.00 H \n", 1765 "HETATM 52 H52 TNS A 2 -44.124 9.364 9.360 1.00 0.00 H \n", 1766 "HETATM 53 H53 TNS A 2 -45.963 19.276 5.180 1.00 0.00 H \n", 1767 "HETATM 54 H54 TNS A 2 -45.206 26.926 1.271 1.00 0.00 H \n", 1768 "HETATM 55 H55 TNS A 2 -42.546 32.919 -2.440 1.00 0.00 H \n", 1769 "HETATM 56 H56 TNS A 2 -38.221 37.460 -5.977 1.00 0.00 H \n", 1770 "HETATM 57 H57 TNS A 2 -32.230 40.549 -9.341 1.00 0.00 H \n", 1771 "HETATM 58 H58 TNS A 2 -24.336 41.980 -12.507 1.00 0.00 H \n", 1772 "HETATM 59 H59 TNS A 2 -13.846 41.149 -15.401 1.00 0.00 H \n", 1773 "HETATM 60 H60 TNS A 2 1.772 35.849 -17.762 1.00 0.00 H \n", 1774 "HETATM 61 H61 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1775 "HETATM 62 H62 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1776 "HETATM 63 H63 TNS A 2 -34.309 -2.744 20.474 1.00 0.00 H \n", 1777 "HETATM 64 H64 TNS A 2 -39.459 13.089 19.845 1.00 0.00 H \n", 1778 "HETATM 65 H65 TNS A 2 -40.307 23.794 17.895 1.00 0.00 H \n", 1779 "HETATM 66 H66 TNS A 2 -38.975 31.902 15.277 1.00 0.00 H \n", 1780 "HETATM 67 H67 TNS A 2 -36.048 38.109 12.169 1.00 0.00 H \n", 1781 "HETATM 68 H68 TNS A 2 -31.722 42.650 8.631 1.00 0.00 H \n", 1782 "HETATM 69 H69 TNS A 2 -25.999 45.525 4.665 1.00 0.00 H \n", 1783 "HETATM 70 H70 TNS A 2 -18.680 46.498 0.209 1.00 0.00 H \n", 1784 "HETATM 71 H71 TNS A 2 -9.182 44.875 -4.916 1.00 0.00 H \n", 1785 "HETATM 72 H72 TNS A 2 4.619 38.123 -11.362 1.00 0.00 H \n", 1786 "HETATM 73 H73 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1787 "HETATM 74 H74 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1788 "HETATM 75 H75 TNS A 2 -30.009 -2.202 26.428 1.00 0.00 H \n", 1789 "HETATM 76 H76 TNS A 2 -32.414 13.977 29.600 1.00 0.00 H \n", 1790 "HETATM 77 H77 TNS A 2 -31.763 24.871 29.724 1.00 0.00 H \n", 1791 "HETATM 78 H78 TNS A 2 -29.565 33.089 28.307 1.00 0.00 H \n", 1792 "HETATM 79 H79 TNS A 2 -26.232 39.346 25.759 1.00 0.00 H \n", 1793 "HETATM 80 H80 TNS A 2 -21.907 43.887 22.222 1.00 0.00 H \n", 1794 "HETATM 81 H81 TNS A 2 -16.589 46.711 17.695 1.00 0.00 H \n", 1795 "HETATM 82 H82 TNS A 2 -10.136 47.575 12.038 1.00 0.00 H \n", 1796 "HETATM 83 H83 TNS A 2 -2.137 45.763 4.838 1.00 0.00 H \n", 1797 "HETATM 84 H84 TNS A 2 8.920 38.665 -5.408 1.00 0.00 H \n", 1798 "HETATM 85 H85 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1799 "HETATM 86 H86 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1800 "HETATM 87 H87 TNS A 2 -24.676 -3.444 31.353 1.00 0.00 H \n", 1801 "HETATM 88 H88 TNS A 2 -23.678 11.942 37.669 1.00 0.00 H \n", 1802 "HETATM 89 H89 TNS A 2 -21.169 22.402 39.510 1.00 0.00 H \n", 1803 "HETATM 90 H90 TNS A 2 -17.895 30.369 39.085 1.00 0.00 H \n", 1804 "HETATM 91 H91 TNS A 2 -14.061 36.510 37.002 1.00 0.00 H \n", 1805 "HETATM 92 H92 TNS A 2 -9.735 41.051 33.464 1.00 0.00 H \n", 1806 "HETATM 93 H93 TNS A 2 -4.919 43.992 28.473 1.00 0.00 H \n", 1807 "HETATM 94 H94 TNS A 2 0.458 45.106 21.823 1.00 0.00 H \n", 1808 "HETATM 95 H95 TNS A 2 6.599 43.727 12.907 1.00 0.00 H \n", 1809 "HETATM 96 H96 TNS A 2 14.252 37.423 -0.483 1.00 0.00 H \n", 1810 "HETATM 97 H97 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1811 "HETATM 98 H98 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1812 "HETATM 99 H99 TNS A 2 -18.834 -6.350 34.767 1.00 0.00 H \n", 1813 "HETATM 100 H100 TNS A 2 -14.106 7.181 43.262 1.00 0.00 H \n", 1814 "HETATM 101 H101 TNS A 2 -9.561 16.629 46.293 1.00 0.00 H \n", 1815 "HETATM 102 H102 TNS A 2 -5.109 24.011 46.557 1.00 0.00 H \n", 1816 "HETATM 103 H103 TNS A 2 -0.724 29.878 44.795 1.00 0.00 H \n", 1817 "HETATM 104 H104 TNS A 2 3.601 34.418 41.258 1.00 0.00 H \n", 1818 "HETATM 105 H105 TNS A 2 7.867 37.633 35.945 1.00 0.00 H \n", 1819 "HETATM 106 H106 TNS A 2 12.065 39.333 28.606 1.00 0.00 H \n", 1820 "HETATM 107 H107 TNS A 2 16.171 38.967 18.501 1.00 0.00 H \n", 1821 "HETATM 108 H108 TNS A 2 20.094 34.517 2.931 1.00 0.00 H \n", 1822 "HETATM 109 H109 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1823 "HETATM 110 H110 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1824 "HETATM 111 H111 TNS A 2 -13.053 -10.634 36.336 1.00 0.00 H \n", 1825 "HETATM 112 H112 TNS A 2 -4.635 0.162 45.833 1.00 0.00 H \n", 1826 "HETATM 113 H113 TNS A 2 1.924 8.118 49.411 1.00 0.00 H \n", 1827 "HETATM 114 H114 TNS A 2 7.542 14.635 49.991 1.00 0.00 H \n", 1828 "HETATM 115 H115 TNS A 2 12.471 20.098 48.377 1.00 0.00 H \n", 1829 "HETATM 116 H116 TNS A 2 16.797 24.639 44.840 1.00 0.00 H \n", 1830 "HETATM 117 H117 TNS A 2 20.518 28.257 39.379 1.00 0.00 H \n", 1831 "HETATM 118 H118 TNS A 2 23.551 30.821 31.724 1.00 0.00 H \n", 1832 "HETATM 119 H119 TNS A 2 25.642 31.948 21.072 1.00 0.00 H \n", 1833 "HETATM 120 H120 TNS A 2 25.875 30.233 4.500 1.00 0.00 H \n", 1834 "HETATM 121 H121 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1835 "HETATM 122 H122 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1836 "HETATM 123 H123 TNS A 2 -7.900 -15.877 35.907 1.00 0.00 H \n", 1837 "HETATM 124 H124 TNS A 2 3.807 -8.428 45.129 1.00 0.00 H \n", 1838 "HETATM 125 H125 TNS A 2 12.162 -2.300 48.557 1.00 0.00 H \n", 1839 "HETATM 126 H126 TNS A 2 18.820 3.160 49.051 1.00 0.00 H \n", 1840 "HETATM 127 H127 TNS A 2 24.234 8.130 47.396 1.00 0.00 H \n", 1841 "HETATM 128 H128 TNS A 2 28.560 12.670 43.859 1.00 0.00 H \n", 1842 "HETATM 129 H129 TNS A 2 31.796 16.782 38.439 1.00 0.00 H \n", 1843 "HETATM 130 H130 TNS A 2 33.789 20.404 30.870 1.00 0.00 H \n", 1844 "HETATM 131 H131 TNS A 2 34.085 23.357 20.368 1.00 0.00 H \n", 1845 "HETATM 132 H132 TNS A 2 31.028 24.990 4.071 1.00 0.00 H \n", 1846 "HETATM 133 H133 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1847 "HETATM 134 H134 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1848 "HETATM 135 H135 TNS A 2 -3.879 -21.567 33.521 1.00 0.00 H \n", 1849 "HETATM 136 H136 TNS A 2 10.396 -17.749 41.220 1.00 0.00 H \n", 1850 "HETATM 137 H137 TNS A 2 20.152 -13.604 43.816 1.00 0.00 H \n", 1851 "HETATM 138 H138 TNS A 2 27.620 -9.291 43.829 1.00 0.00 H \n", 1852 "HETATM 139 H139 TNS A 2 33.413 -4.857 41.949 1.00 0.00 H \n", 1853 "HETATM 140 H140 TNS A 2 37.739 -0.317 38.412 1.00 0.00 H \n", 1854 "HETATM 141 H141 TNS A 2 40.596 4.331 33.217 1.00 0.00 H \n", 1855 "HETATM 142 H142 TNS A 2 41.778 9.100 26.129 1.00 0.00 H \n", 1856 "HETATM 143 H143 TNS A 2 40.673 14.036 16.459 1.00 0.00 H \n", 1857 "HETATM 144 H144 TNS A 2 35.049 19.300 1.685 1.00 0.00 H \n", 1858 "HETATM 145 H145 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1859 "HETATM 146 H146 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1860 "HETATM 147 H147 TNS A 2 -1.383 -27.145 29.411 1.00 0.00 H \n", 1861 "HETATM 148 H148 TNS A 2 14.484 -26.889 34.487 1.00 0.00 H \n", 1862 "HETATM 149 H149 TNS A 2 25.110 -24.687 35.652 1.00 0.00 H \n", 1863 "HETATM 150 H150 TNS A 2 33.082 -21.500 34.836 1.00 0.00 H \n", 1864 "HETATM 151 H151 TNS A 2 39.110 -17.591 32.569 1.00 0.00 H \n", 1865 "HETATM 152 H152 TNS A 2 43.435 -13.050 29.032 1.00 0.00 H \n", 1866 "HETATM 153 H153 TNS A 2 46.058 -7.877 24.224 1.00 0.00 H \n", 1867 "HETATM 154 H154 TNS A 2 46.737 -1.983 17.965 1.00 0.00 H \n", 1868 "HETATM 155 H155 TNS A 2 44.762 4.897 9.726 1.00 0.00 H \n", 1869 "HETATM 156 H156 TNS A 2 37.545 13.722 -2.425 1.00 0.00 H \n", 1870 "HETATM 157 H157 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1871 "HETATM 158 H158 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1872 "HETATM 159 H159 TNS A 2 -0.657 -32.067 23.981 1.00 0.00 H \n", 1873 "HETATM 160 H160 TNS A 2 15.673 -34.952 25.591 1.00 0.00 H \n", 1874 "HETATM 161 H161 TNS A 2 26.552 -34.465 24.863 1.00 0.00 H \n", 1875 "HETATM 162 H162 TNS A 2 34.670 -32.270 22.952 1.00 0.00 H \n", 1876 "HETATM 163 H163 TNS A 2 40.767 -28.825 20.174 1.00 0.00 H \n", 1877 "HETATM 164 H164 TNS A 2 45.092 -24.284 16.637 1.00 0.00 H \n", 1878 "HETATM 165 H165 TNS A 2 47.646 -18.648 12.340 1.00 0.00 H \n", 1879 "HETATM 166 H166 TNS A 2 48.179 -11.761 7.177 1.00 0.00 H \n", 1880 "HETATM 167 H167 TNS A 2 45.951 -3.167 0.830 1.00 0.00 H \n", 1881 "HETATM 168 H168 TNS A 2 38.271 8.800 -7.855 1.00 0.00 H \n", 1882 "HETATM 169 H169 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1883 "HETATM 170 H170 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1884 "HETATM 171 H171 TNS A 2 -1.772 -35.849 17.762 1.00 0.00 H \n", 1885 "HETATM 172 H172 TNS A 2 13.846 -41.149 15.401 1.00 0.00 H \n", 1886 "HETATM 173 H173 TNS A 2 24.336 -41.980 12.507 1.00 0.00 H \n", 1887 "HETATM 174 H174 TNS A 2 32.230 -40.549 9.341 1.00 0.00 H \n", 1888 "HETATM 175 H175 TNS A 2 38.221 -37.460 5.977 1.00 0.00 H \n", 1889 "HETATM 176 H176 TNS A 2 42.546 -32.919 2.440 1.00 0.00 H \n", 1890 "HETATM 177 H177 TNS A 2 45.206 -26.926 -1.271 1.00 0.00 H \n", 1891 "HETATM 178 H178 TNS A 2 45.963 -19.276 -5.180 1.00 0.00 H \n", 1892 "HETATM 179 H179 TNS A 2 44.124 -9.364 -9.360 1.00 0.00 H \n", 1893 "HETATM 180 H180 TNS A 2 37.156 5.018 -14.074 1.00 0.00 H \n", 1894 "HETATM 181 H181 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1895 "HETATM 182 H182 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1896 "HETATM 183 H183 TNS A 2 -4.619 -38.123 11.362 1.00 0.00 H \n", 1897 "HETATM 184 H184 TNS A 2 9.182 -44.875 4.916 1.00 0.00 H \n", 1898 "HETATM 185 H185 TNS A 2 18.680 -46.498 -0.209 1.00 0.00 H \n", 1899 "HETATM 186 H186 TNS A 2 25.999 -45.525 -4.665 1.00 0.00 H \n", 1900 "HETATM 187 H187 TNS A 2 31.722 -42.650 -8.631 1.00 0.00 H \n", 1901 "HETATM 188 H188 TNS A 2 36.048 -38.109 -12.169 1.00 0.00 H \n", 1902 "HETATM 189 H189 TNS A 2 38.975 -31.902 -15.277 1.00 0.00 H \n", 1903 "HETATM 190 H190 TNS A 2 40.307 -23.794 -17.895 1.00 0.00 H \n", 1904 "HETATM 191 H191 TNS A 2 39.459 -13.089 -19.845 1.00 0.00 H \n", 1905 "HETATM 192 H192 TNS A 2 34.309 2.744 -20.474 1.00 0.00 H \n", 1906 "HETATM 193 H193 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1907 "HETATM 194 H194 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1908 "HETATM 195 H195 TNS A 2 -8.920 -38.665 5.408 1.00 0.00 H \n", 1909 "HETATM 196 H196 TNS A 2 2.137 -45.763 -4.838 1.00 0.00 H \n", 1910 "HETATM 197 H197 TNS A 2 10.136 -47.575 -12.038 1.00 0.00 H \n", 1911 "HETATM 198 H198 TNS A 2 16.589 -46.711 -17.695 1.00 0.00 H \n", 1912 "HETATM 199 H199 TNS A 2 21.907 -43.887 -22.222 1.00 0.00 H \n", 1913 "HETATM 200 H200 TNS A 2 26.232 -39.346 -25.759 1.00 0.00 H \n", 1914 "HETATM 201 H201 TNS A 2 29.565 -33.089 -28.307 1.00 0.00 H \n", 1915 "HETATM 202 H202 TNS A 2 31.763 -24.871 -29.724 1.00 0.00 H \n", 1916 "HETATM 203 H203 TNS A 2 32.414 -13.977 -29.600 1.00 0.00 H \n", 1917 "HETATM 204 H204 TNS A 2 30.009 2.202 -26.428 1.00 0.00 H \n", 1918 "HETATM 205 H205 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1919 "HETATM 206 H206 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1920 "HETATM 207 H207 TNS A 2 -14.252 -37.423 0.483 1.00 0.00 H \n", 1921 "HETATM 208 H208 TNS A 2 -6.599 -43.727 -12.907 1.00 0.00 H \n", 1922 "HETATM 209 H209 TNS A 2 -0.458 -45.106 -21.823 1.00 0.00 H \n", 1923 "HETATM 210 H210 TNS A 2 4.919 -43.992 -28.473 1.00 0.00 H \n", 1924 "HETATM 211 H211 TNS A 2 9.735 -41.051 -33.464 1.00 0.00 H \n", 1925 "HETATM 212 H212 TNS A 2 14.061 -36.510 -37.002 1.00 0.00 H \n", 1926 "HETATM 213 H213 TNS A 2 17.895 -30.369 -39.085 1.00 0.00 H \n", 1927 "HETATM 214 H214 TNS A 2 21.169 -22.402 -39.510 1.00 0.00 H \n", 1928 "HETATM 215 H215 TNS A 2 23.678 -11.942 -37.669 1.00 0.00 H \n", 1929 "HETATM 216 H216 TNS A 2 24.676 3.444 -31.353 1.00 0.00 H \n", 1930 "HETATM 217 H217 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1931 "HETATM 218 H218 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1932 "HETATM 219 H219 TNS A 2 -20.094 -34.517 -2.931 1.00 0.00 H \n", 1933 "HETATM 220 H220 TNS A 2 -16.171 -38.967 -18.501 1.00 0.00 H \n", 1934 "HETATM 221 H221 TNS A 2 -12.065 -39.333 -28.606 1.00 0.00 H \n", 1935 "HETATM 222 H222 TNS A 2 -7.867 -37.633 -35.945 1.00 0.00 H \n", 1936 "HETATM 223 H223 TNS A 2 -3.601 -34.418 -41.258 1.00 0.00 H \n", 1937 "HETATM 224 H224 TNS A 2 0.724 -29.878 -44.795 1.00 0.00 H \n", 1938 "HETATM 225 H225 TNS A 2 5.109 -24.011 -46.557 1.00 0.00 H \n", 1939 "HETATM 226 H226 TNS A 2 9.561 -16.629 -46.293 1.00 0.00 H \n", 1940 "HETATM 227 H227 TNS A 2 14.106 -7.181 -43.262 1.00 0.00 H \n", 1941 "HETATM 228 H228 TNS A 2 18.834 6.350 -34.767 1.00 0.00 H \n", 1942 "HETATM 229 H229 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1943 "HETATM 230 H230 TNS A 2 -21.627 -22.704 17.687 1.00 0.00 H \n", 1944 "HETATM 231 H231 TNS A 2 -25.875 -30.233 -4.500 1.00 0.00 H \n", 1945 "HETATM 232 H232 TNS A 2 -25.642 -31.948 -21.072 1.00 0.00 H \n", 1946 "HETATM 233 H233 TNS A 2 -23.551 -30.821 -31.724 1.00 0.00 H \n", 1947 "HETATM 234 H234 TNS A 2 -20.518 -28.257 -39.379 1.00 0.00 H \n", 1948 "HETATM 235 H235 TNS A 2 -16.797 -24.639 -44.840 1.00 0.00 H \n", 1949 "HETATM 236 H236 TNS A 2 -12.471 -20.098 -48.377 1.00 0.00 H \n", 1950 "HETATM 237 H237 TNS A 2 -7.542 -14.635 -49.991 1.00 0.00 H \n", 1951 "HETATM 238 H238 TNS A 2 -1.924 -8.118 -49.411 1.00 0.00 H \n", 1952 "HETATM 239 H239 TNS A 2 4.635 -0.162 -45.833 1.00 0.00 H \n", 1953 "HETATM 240 H240 TNS A 2 13.053 10.634 -36.336 1.00 0.00 H \n", 1954 "HETATM 241 H241 TNS A 2 21.627 22.704 -17.687 1.00 0.00 H \n", 1955 "HETATM 242 R AXS A 3 -0.000 0.000 0.000 1.00 0.00 C \n", 1956 "HETATM 243 Dpar AXS A 3 21.627 22.704 -17.687 1.00 0.00 C \n", 1957 "HETATM 244 Dpar AXS A 3 -21.627 -22.704 17.687 1.00 0.00 C \n", 1958 "HETATM 245 Dpar AXS A 3 23.789 24.974 -19.455 1.00 0.00 N \n", 1959 "HETATM 246 Dpar AXS A 3 -23.789 -24.974 19.455 1.00 0.00 N \n", 1960 "CONECT 2 3 14 230 \n", 1961 "CONECT 3 2 4 15 231 \n", 1962 "CONECT 4 3 5 16 232 \n", 1963 "CONECT 5 4 6 17 233 \n", 1964 "CONECT 6 5 7 18 234 \n", 1965 "CONECT 7 6 8 19 235 \n", 1966 "CONECT 8 7 9 20 236 \n", 1967 "CONECT 9 8 10 21 237 \n", 1968 "CONECT 10 9 11 22 238 \n", 1969 "CONECT 11 10 12 23 239 \n", 1970 "CONECT 12 11 13 24 240 \n", 1971 "CONECT 13 12 25 241 \n", 1972 "CONECT 14 2 15 26 \n", 1973 "CONECT 15 14 3 16 27 \n", 1974 "CONECT 16 15 4 17 28 \n", 1975 "CONECT 17 16 5 18 29 \n", 1976 "CONECT 18 17 6 19 30 \n", 1977 "CONECT 19 18 7 20 31 \n", 1978 "CONECT 20 19 8 21 32 \n", 1979 "CONECT 21 20 9 22 33 \n", 1980 "CONECT 22 21 10 23 34 \n", 1981 "CONECT 23 22 11 24 35 \n", 1982 "CONECT 24 23 12 25 36 \n", 1983 "CONECT 25 24 13 37 \n", 1984 "CONECT 26 14 27 38 \n", 1985 "CONECT 27 26 15 28 39 \n", 1986 "CONECT 28 27 16 29 40 \n", 1987 "CONECT 29 28 17 30 41 \n", 1988 "CONECT 30 29 18 31 42 \n", 1989 "CONECT 31 30 19 32 43 \n", 1990 "CONECT 32 31 20 33 44 \n", 1991 "CONECT 33 32 21 34 45 \n", 1992 "CONECT 34 33 22 35 46 \n", 1993 "CONECT 35 34 23 36 47 \n", 1994 "CONECT 36 35 24 37 48 \n", 1995 "CONECT 37 36 25 49 \n", 1996 "CONECT 38 26 39 50 \n", 1997 "CONECT 39 38 27 40 51 \n", 1998 "CONECT 40 39 28 41 52 \n", 1999 "CONECT 41 40 29 42 53 \n", 2000 "CONECT 42 41 30 43 54 \n", 2001 "CONECT 43 42 31 44 55 \n", 2002 "CONECT 44 43 32 45 56 \n", 2003 "CONECT 45 44 33 46 57 \n", 2004 "CONECT 46 45 34 47 58 \n", 2005 "CONECT 47 46 35 48 59 \n", 2006 "CONECT 48 47 36 49 60 \n", 2007 "CONECT 49 48 37 61 \n", 2008 "CONECT 50 38 51 62 \n", 2009 "CONECT 51 50 39 52 63 \n", 2010 "CONECT 52 51 40 53 64 \n", 2011 "CONECT 53 52 41 54 65 \n", 2012 "CONECT 54 53 42 55 66 \n", 2013 "CONECT 55 54 43 56 67 \n", 2014 "CONECT 56 55 44 57 68 \n", 2015 "CONECT 57 56 45 58 69 \n", 2016 "CONECT 58 57 46 59 70 \n", 2017 "CONECT 59 58 47 60 71 \n", 2018 "CONECT 60 59 48 61 72 \n", 2019 "CONECT 61 60 49 73 \n", 2020 "CONECT 62 50 63 74 \n", 2021 "CONECT 63 62 51 64 75 \n", 2022 "CONECT 64 63 52 65 76 \n", 2023 "CONECT 65 64 53 66 77 \n", 2024 "CONECT 66 65 54 67 78 \n", 2025 "CONECT 67 66 55 68 79 \n", 2026 "CONECT 68 67 56 69 80 \n", 2027 "CONECT 69 68 57 70 81 \n", 2028 "CONECT 70 69 58 71 82 \n", 2029 "CONECT 71 70 59 72 83 \n", 2030 "CONECT 72 71 60 73 84 \n", 2031 "CONECT 73 72 61 85 \n", 2032 "CONECT 74 62 75 86 \n", 2033 "CONECT 75 74 63 76 87 \n", 2034 "CONECT 76 75 64 77 88 \n", 2035 "CONECT 77 76 65 78 89 \n", 2036 "CONECT 78 77 66 79 90 \n", 2037 "CONECT 79 78 67 80 91 \n", 2038 "CONECT 80 79 68 81 92 \n", 2039 "CONECT 81 80 69 82 93 \n", 2040 "CONECT 82 81 70 83 94 \n", 2041 "CONECT 83 82 71 84 95 \n", 2042 "CONECT 84 83 72 85 96 \n", 2043 "CONECT 85 84 73 97 \n", 2044 "CONECT 86 74 87 98 \n", 2045 "CONECT 87 86 75 88 99 \n", 2046 "CONECT 88 87 76 89 100 \n", 2047 "CONECT 89 88 77 90 101 \n", 2048 "CONECT 90 89 78 91 102 \n", 2049 "CONECT 91 90 79 92 103 \n", 2050 "CONECT 92 91 80 93 104 \n", 2051 "CONECT 93 92 81 94 105 \n", 2052 "CONECT 94 93 82 95 106 \n", 2053 "CONECT 95 94 83 96 107 \n", 2054 "CONECT 96 95 84 97 108 \n", 2055 "CONECT 97 96 85 109 \n", 2056 "CONECT 98 86 99 110 \n", 2057 "CONECT 99 98 87 100 111 \n", 2058 "CONECT 100 99 88 101 112 \n", 2059 "CONECT 101 100 89 102 113 \n", 2060 "CONECT 102 101 90 103 114 \n", 2061 "CONECT 103 102 91 104 115 \n", 2062 "CONECT 104 103 92 105 116 \n", 2063 "CONECT 105 104 93 106 117 \n", 2064 "CONECT 106 105 94 107 118 \n", 2065 "CONECT 107 106 95 108 119 \n", 2066 "CONECT 108 107 96 109 120 \n", 2067 "CONECT 109 108 97 121 \n", 2068 "CONECT 110 98 111 122 \n", 2069 "CONECT 111 110 99 112 123 \n", 2070 "CONECT 112 111 100 113 124 \n", 2071 "CONECT 113 112 101 114 125 \n", 2072 "CONECT 114 113 102 115 126 \n", 2073 "CONECT 115 114 103 116 127 \n", 2074 "CONECT 116 115 104 117 128 \n", 2075 "CONECT 117 116 105 118 129 \n", 2076 "CONECT 118 117 106 119 130 \n", 2077 "CONECT 119 118 107 120 131 \n", 2078 "CONECT 120 119 108 121 132 \n", 2079 "CONECT 121 120 109 133 \n", 2080 "CONECT 122 110 123 134 \n", 2081 "CONECT 123 122 111 124 135 \n", 2082 "CONECT 124 123 112 125 136 \n", 2083 "CONECT 125 124 113 126 137 \n", 2084 "CONECT 126 125 114 127 138 \n", 2085 "CONECT 127 126 115 128 139 \n", 2086 "CONECT 128 127 116 129 140 \n", 2087 "CONECT 129 128 117 130 141 \n", 2088 "CONECT 130 129 118 131 142 \n", 2089 "CONECT 131 130 119 132 143 \n", 2090 "CONECT 132 131 120 133 144 \n", 2091 "CONECT 133 132 121 145 \n", 2092 "CONECT 134 122 135 146 \n", 2093 "CONECT 135 134 123 136 147 \n", 2094 "CONECT 136 135 124 137 148 \n", 2095 "CONECT 137 136 125 138 149 \n", 2096 "CONECT 138 137 126 139 150 \n", 2097 "CONECT 139 138 127 140 151 \n", 2098 "CONECT 140 139 128 141 152 \n", 2099 "CONECT 141 140 129 142 153 \n", 2100 "CONECT 142 141 130 143 154 \n", 2101 "CONECT 143 142 131 144 155 \n", 2102 "CONECT 144 143 132 145 156 \n", 2103 "CONECT 145 144 133 157 \n", 2104 "CONECT 146 134 147 158 \n", 2105 "CONECT 147 146 135 148 159 \n", 2106 "CONECT 148 147 136 149 160 \n", 2107 "CONECT 149 148 137 150 161 \n", 2108 "CONECT 150 149 138 151 162 \n", 2109 "CONECT 151 150 139 152 163 \n", 2110 "CONECT 152 151 140 153 164 \n", 2111 "CONECT 153 152 141 154 165 \n", 2112 "CONECT 154 153 142 155 166 \n", 2113 "CONECT 155 154 143 156 167 \n", 2114 "CONECT 156 155 144 157 168 \n", 2115 "CONECT 157 156 145 169 \n", 2116 "CONECT 158 146 159 170 \n", 2117 "CONECT 159 158 147 160 171 \n", 2118 "CONECT 160 159 148 161 172 \n", 2119 "CONECT 161 160 149 162 173 \n", 2120 "CONECT 162 161 150 163 174 \n", 2121 "CONECT 163 162 151 164 175 \n", 2122 "CONECT 164 163 152 165 176 \n", 2123 "CONECT 165 164 153 166 177 \n", 2124 "CONECT 166 165 154 167 178 \n", 2125 "CONECT 167 166 155 168 179 \n", 2126 "CONECT 168 167 156 169 180 \n", 2127 "CONECT 169 168 157 181 \n", 2128 "CONECT 170 158 171 182 \n", 2129 "CONECT 171 170 159 172 183 \n", 2130 "CONECT 172 171 160 173 184 \n", 2131 "CONECT 173 172 161 174 185 \n", 2132 "CONECT 174 173 162 175 186 \n", 2133 "CONECT 175 174 163 176 187 \n", 2134 "CONECT 176 175 164 177 188 \n", 2135 "CONECT 177 176 165 178 189 \n", 2136 "CONECT 178 177 166 179 190 \n", 2137 "CONECT 179 178 167 180 191 \n", 2138 "CONECT 180 179 168 181 192 \n", 2139 "CONECT 181 180 169 193 \n", 2140 "CONECT 182 170 183 194 \n", 2141 "CONECT 183 182 171 184 195 \n", 2142 "CONECT 184 183 172 185 196 \n", 2143 "CONECT 185 184 173 186 197 \n", 2144 "CONECT 186 185 174 187 198 \n", 2145 "CONECT 187 186 175 188 199 \n", 2146 "CONECT 188 187 176 189 200 \n", 2147 "CONECT 189 188 177 190 201 \n", 2148 "CONECT 190 189 178 191 202 \n", 2149 "CONECT 191 190 179 192 203 \n", 2150 "CONECT 192 191 180 193 204 \n", 2151 "CONECT 193 192 181 205 \n", 2152 "CONECT 194 182 195 206 \n", 2153 "CONECT 195 194 183 196 207 \n", 2154 "CONECT 196 195 184 197 208 \n", 2155 "CONECT 197 196 185 198 209 \n", 2156 "CONECT 198 197 186 199 210 \n", 2157 "CONECT 199 198 187 200 211 \n", 2158 "CONECT 200 199 188 201 212 \n", 2159 "CONECT 201 200 189 202 213 \n", 2160 "CONECT 202 201 190 203 214 \n", 2161 "CONECT 203 202 191 204 215 \n", 2162 "CONECT 204 203 192 205 216 \n", 2163 "CONECT 205 204 193 217 \n", 2164 "CONECT 206 194 207 218 \n", 2165 "CONECT 207 206 195 208 219 \n", 2166 "CONECT 208 207 196 209 220 \n", 2167 "CONECT 209 208 197 210 221 \n", 2168 "CONECT 210 209 198 211 222 \n", 2169 "CONECT 211 210 199 212 223 \n", 2170 "CONECT 212 211 200 213 224 \n", 2171 "CONECT 213 212 201 214 225 \n", 2172 "CONECT 214 213 202 215 226 \n", 2173 "CONECT 215 214 203 216 227 \n", 2174 "CONECT 216 215 204 217 228 \n", 2175 "CONECT 217 216 205 229 \n", 2176 "CONECT 218 206 219 230 \n", 2177 "CONECT 219 218 207 220 231 \n", 2178 "CONECT 220 219 208 221 232 \n", 2179 "CONECT 221 220 209 222 233 \n", 2180 "CONECT 222 221 210 223 234 \n", 2181 "CONECT 223 222 211 224 235 \n", 2182 "CONECT 224 223 212 225 236 \n", 2183 "CONECT 225 224 213 226 237 \n", 2184 "CONECT 226 225 214 227 238 \n", 2185 "CONECT 227 226 215 228 239 \n", 2186 "CONECT 228 227 216 229 240 \n", 2187 "CONECT 229 228 217 241 \n", 2188 "CONECT 230 218 2 231 \n", 2189 "CONECT 231 230 219 3 232 \n", 2190 "CONECT 232 231 220 4 233 \n", 2191 "CONECT 233 232 221 5 234 \n", 2192 "CONECT 234 233 222 6 235 \n", 2193 "CONECT 235 234 223 7 236 \n", 2194 "CONECT 236 235 224 8 237 \n", 2195 "CONECT 237 236 225 9 238 \n", 2196 "CONECT 238 237 226 10 239 \n", 2197 "CONECT 239 238 227 11 240 \n", 2198 "CONECT 240 239 228 12 241 \n", 2199 "CONECT 241 240 229 13 \n", 2200 "CONECT 242 243 244 \n", 2201 "CONECT 243 242 \n", 2202 "CONECT 244 242 \n", 2203 "MASTER 0 0 3 0 0 0 0 0 246 0 243 0 \n", 2204 "END \n" 2205 ] 2206 2207 # Check the data. 2208 self.strip_remarks(lines) 2209 self.assertEqual(len(real_data), len(lines)) 2210 for i in range(len(lines)): 2211 self.assertEqual(real_data[i], lines[i])
2212 2213
2215 """Check the 3D coordinates of the PDB representation of the optimised prolate diffusion tensor.""" 2216 2217 # Reset relax. 2218 self.interpreter.reset() 2219 2220 # Create a temporary file. 2221 ds.tmpfile = mktemp() 2222 2223 # The diffusion type (used by the script). 2224 ds.diff_dir = 'spheroid_prolate' 2225 ds.diff_type = 'prolate' 2226 2227 # Execute the script. 2228 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 2229 2230 # Create the PDB representation. 2231 self.interpreter.structure.create_diff_tensor_pdb(scale=1.8e-06, file=ds.tmpfile, force=True) 2232 2233 # Read the contents of the file. 2234 file = open(ds.tmpfile) 2235 lines = file.readlines() 2236 file.close() 2237 2238 # What the contents should be, without remarks. 2239 real_data = [ 2240 "HET COM A 1 1 \n", 2241 "HET TNS A 2 240 \n", 2242 "HET AXS A 3 5 \n", 2243 "HETNAM COM CENTRE OF MASS \n", 2244 "HETNAM TNS TENSOR \n", 2245 "HETNAM AXS TENSOR AXES \n", 2246 "FORMUL 1 COM C1 \n", 2247 "FORMUL 2 TNS H240 \n", 2248 "FORMUL 3 AXS C3N2 \n", 2249 "HETATM 1 R COM A 1 -0.000 0.000 0.000 1.00 0.00 C \n", 2250 "HETATM 2 H2 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2251 "HETATM 3 H3 TNS A 2 48.132 -10.602 13.384 1.00 0.00 H \n", 2252 "HETATM 4 H4 TNS A 2 45.482 0.862 4.523 1.00 0.00 H \n", 2253 "HETATM 5 H5 TNS A 2 40.121 9.258 -2.355 1.00 0.00 H \n", 2254 "HETATM 6 H6 TNS A 2 33.389 16.101 -8.229 1.00 0.00 H \n", 2255 "HETATM 7 H7 TNS A 2 25.651 21.806 -13.368 1.00 0.00 H \n", 2256 "HETATM 8 H8 TNS A 2 17.033 26.514 -17.862 1.00 0.00 H \n", 2257 "HETATM 9 H9 TNS A 2 7.534 30.226 -21.713 1.00 0.00 H \n", 2258 "HETATM 10 H10 TNS A 2 -2.970 32.799 -24.827 1.00 0.00 H \n", 2259 "HETATM 11 H11 TNS A 2 -14.846 33.819 -26.938 1.00 0.00 H \n", 2260 "HETATM 12 H12 TNS A 2 -29.432 31.771 -27.066 1.00 0.00 H \n", 2261 "HETATM 13 H13 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2262 "HETATM 14 H14 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2263 "HETATM 15 H15 TNS A 2 48.114 -14.010 9.849 1.00 0.00 H \n", 2264 "HETATM 16 H16 TNS A 2 45.452 -4.720 -1.268 1.00 0.00 H \n", 2265 "HETATM 17 H17 TNS A 2 40.086 2.489 -9.378 1.00 0.00 H \n", 2266 "HETATM 18 H18 TNS A 2 33.349 8.645 -15.965 1.00 0.00 H \n", 2267 "HETATM 19 H19 TNS A 2 25.610 14.029 -21.436 1.00 0.00 H \n", 2268 "HETATM 20 H20 TNS A 2 16.992 18.737 -25.931 1.00 0.00 H \n", 2269 "HETATM 21 H21 TNS A 2 7.495 22.769 -29.448 1.00 0.00 H \n", 2270 "HETATM 22 H22 TNS A 2 -3.005 26.030 -31.850 1.00 0.00 H \n", 2271 "HETATM 23 H23 TNS A 2 -14.875 28.237 -32.729 1.00 0.00 H \n", 2272 "HETATM 24 H24 TNS A 2 -29.450 28.364 -30.600 1.00 0.00 H \n", 2273 "HETATM 25 H25 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2274 "HETATM 26 H26 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2275 "HETATM 27 H27 TNS A 2 47.182 -18.119 7.330 1.00 0.00 H \n", 2276 "HETATM 28 H28 TNS A 2 43.926 -11.453 -5.396 1.00 0.00 H \n", 2277 "HETATM 29 H29 TNS A 2 38.235 -5.676 -14.383 1.00 0.00 H \n", 2278 "HETATM 30 H30 TNS A 2 31.311 -0.350 -21.478 1.00 0.00 H \n", 2279 "HETATM 31 H31 TNS A 2 23.484 4.647 -27.187 1.00 0.00 H \n", 2280 "HETATM 32 H32 TNS A 2 14.866 9.356 -31.681 1.00 0.00 H \n", 2281 "HETATM 33 H33 TNS A 2 5.456 13.775 -34.961 1.00 0.00 H \n", 2282 "HETATM 34 H34 TNS A 2 -4.856 17.864 -36.855 1.00 0.00 H \n", 2283 "HETATM 35 H35 TNS A 2 -16.401 21.504 -36.856 1.00 0.00 H \n", 2284 "HETATM 36 H36 TNS A 2 -30.382 24.254 -33.119 1.00 0.00 H \n", 2285 "HETATM 37 H37 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2286 "HETATM 38 H38 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2287 "HETATM 39 H39 TNS A 2 45.428 -22.529 6.073 1.00 0.00 H \n", 2288 "HETATM 40 H40 TNS A 2 41.053 -18.678 -7.455 1.00 0.00 H \n", 2289 "HETATM 41 H41 TNS A 2 34.751 -14.438 -16.880 1.00 0.00 H \n", 2290 "HETATM 42 H42 TNS A 2 27.473 -10.001 -24.229 1.00 0.00 H \n", 2291 "HETATM 43 H43 TNS A 2 19.481 -5.419 -30.056 1.00 0.00 H \n", 2292 "HETATM 44 H44 TNS A 2 10.862 -0.711 -34.550 1.00 0.00 H \n", 2293 "HETATM 45 H45 TNS A 2 1.618 4.124 -37.712 1.00 0.00 H \n", 2294 "HETATM 46 H46 TNS A 2 -8.341 9.103 -39.352 1.00 0.00 H \n", 2295 "HETATM 47 H47 TNS A 2 -19.275 14.279 -38.915 1.00 0.00 H \n", 2296 "HETATM 48 H48 TNS A 2 -32.136 19.844 -34.376 1.00 0.00 H \n", 2297 "HETATM 49 H49 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2298 "HETATM 50 H50 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2299 "HETATM 51 H51 TNS A 2 43.024 -26.808 6.202 1.00 0.00 H \n", 2300 "HETATM 52 H52 TNS A 2 37.114 -25.688 -7.244 1.00 0.00 H \n", 2301 "HETATM 53 H53 TNS A 2 29.974 -22.939 -16.625 1.00 0.00 H \n", 2302 "HETATM 54 H54 TNS A 2 22.211 -19.364 -23.948 1.00 0.00 H \n", 2303 "HETATM 55 H55 TNS A 2 13.992 -15.186 -29.763 1.00 0.00 H \n", 2304 "HETATM 56 H56 TNS A 2 5.374 -10.478 -34.257 1.00 0.00 H \n", 2305 "HETATM 57 H57 TNS A 2 -3.644 -5.240 -37.431 1.00 0.00 H \n", 2306 "HETATM 58 H58 TNS A 2 -13.117 0.602 -39.097 1.00 0.00 H \n", 2307 "HETATM 59 H59 TNS A 2 -23.214 7.269 -38.705 1.00 0.00 H \n", 2308 "HETATM 60 H60 TNS A 2 -34.540 15.565 -34.248 1.00 0.00 H \n", 2309 "HETATM 61 H61 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2310 "HETATM 62 H62 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2311 "HETATM 63 H63 TNS A 2 40.204 -30.536 7.703 1.00 0.00 H \n", 2312 "HETATM 64 H64 TNS A 2 32.494 -31.797 -4.785 1.00 0.00 H \n", 2313 "HETATM 65 H65 TNS A 2 24.372 -30.346 -13.643 1.00 0.00 H \n", 2314 "HETATM 66 H66 TNS A 2 16.040 -27.524 -20.663 1.00 0.00 H \n", 2315 "HETATM 67 H67 TNS A 2 7.556 -23.696 -26.336 1.00 0.00 H \n", 2316 "HETATM 68 H68 TNS A 2 -1.062 -18.988 -30.831 1.00 0.00 H \n", 2317 "HETATM 69 H69 TNS A 2 -9.814 -13.399 -34.146 1.00 0.00 H \n", 2318 "HETATM 70 H70 TNS A 2 -18.719 -6.806 -36.115 1.00 0.00 H \n", 2319 "HETATM 71 H71 TNS A 2 -27.833 1.160 -36.246 1.00 0.00 H \n", 2320 "HETATM 72 H72 TNS A 2 -37.360 11.837 -32.747 1.00 0.00 H \n", 2321 "HETATM 73 H73 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2322 "HETATM 74 H74 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2323 "HETATM 75 H75 TNS A 2 37.246 -33.350 10.430 1.00 0.00 H \n", 2324 "HETATM 76 H76 TNS A 2 27.647 -36.406 -0.318 1.00 0.00 H \n", 2325 "HETATM 77 H77 TNS A 2 18.493 -35.935 -8.225 1.00 0.00 H \n", 2326 "HETATM 78 H78 TNS A 2 9.565 -33.680 -14.695 1.00 0.00 H \n", 2327 "HETATM 79 H79 TNS A 2 0.802 -30.118 -20.112 1.00 0.00 H \n", 2328 "HETATM 80 H80 TNS A 2 -7.816 -25.409 -24.606 1.00 0.00 H \n", 2329 "HETATM 81 H81 TNS A 2 -16.290 -19.556 -28.178 1.00 0.00 H \n", 2330 "HETATM 82 H82 TNS A 2 -24.598 -12.395 -30.697 1.00 0.00 H \n", 2331 "HETATM 83 H83 TNS A 2 -32.681 -3.448 -31.778 1.00 0.00 H \n", 2332 "HETATM 84 H84 TNS A 2 -40.318 9.024 -30.020 1.00 0.00 H \n", 2333 "HETATM 85 H85 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2334 "HETATM 86 H86 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2335 "HETATM 87 H87 TNS A 2 34.437 -34.972 14.115 1.00 0.00 H \n", 2336 "HETATM 88 H88 TNS A 2 23.045 -39.064 5.721 1.00 0.00 H \n", 2337 "HETATM 89 H89 TNS A 2 12.913 -39.159 -0.903 1.00 0.00 H \n", 2338 "HETATM 90 H90 TNS A 2 3.419 -37.231 -6.629 1.00 0.00 H \n", 2339 "HETATM 91 H91 TNS A 2 -5.609 -33.821 -11.699 1.00 0.00 H \n", 2340 "HETATM 92 H92 TNS A 2 -14.227 -29.113 -16.193 1.00 0.00 H \n", 2341 "HETATM 93 H93 TNS A 2 -22.436 -23.107 -20.112 1.00 0.00 H \n", 2342 "HETATM 94 H94 TNS A 2 -30.178 -15.618 -23.374 1.00 0.00 H \n", 2343 "HETATM 95 H95 TNS A 2 -37.282 -6.107 -25.740 1.00 0.00 H \n", 2344 "HETATM 96 H96 TNS A 2 -43.127 7.401 -26.334 1.00 0.00 H \n", 2345 "HETATM 97 H97 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2346 "HETATM 98 H98 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2347 "HETATM 99 H99 TNS A 2 32.054 -35.245 18.399 1.00 0.00 H \n", 2348 "HETATM 100 H100 TNS A 2 19.141 -39.511 12.739 1.00 0.00 H \n", 2349 "HETATM 101 H101 TNS A 2 8.178 -39.702 7.608 1.00 0.00 H \n", 2350 "HETATM 102 H102 TNS A 2 -1.797 -37.829 2.746 1.00 0.00 H \n", 2351 "HETATM 103 H103 TNS A 2 -11.049 -34.445 -1.921 1.00 0.00 H \n", 2352 "HETATM 104 H104 TNS A 2 -19.667 -29.737 -6.415 1.00 0.00 H \n", 2353 "HETATM 105 H105 TNS A 2 -27.651 -23.705 -10.738 1.00 0.00 H \n", 2354 "HETATM 106 H106 TNS A 2 -34.913 -16.161 -14.864 1.00 0.00 H \n", 2355 "HETATM 107 H107 TNS A 2 -41.187 -6.554 -18.722 1.00 0.00 H \n", 2356 "HETATM 108 H108 TNS A 2 -45.510 7.128 -22.051 1.00 0.00 H \n", 2357 "HETATM 109 H109 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2358 "HETATM 110 H110 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2359 "HETATM 111 H111 TNS A 2 30.329 -34.142 22.861 1.00 0.00 H \n", 2360 "HETATM 112 H112 TNS A 2 16.316 -37.704 20.050 1.00 0.00 H \n", 2361 "HETATM 113 H113 TNS A 2 4.752 -37.510 16.474 1.00 0.00 H \n", 2362 "HETATM 114 H114 TNS A 2 -5.571 -35.415 12.511 1.00 0.00 H \n", 2363 "HETATM 115 H115 TNS A 2 -14.985 -31.927 8.265 1.00 0.00 H \n", 2364 "HETATM 116 H116 TNS A 2 -23.603 -27.219 3.771 1.00 0.00 H \n", 2365 "HETATM 117 H117 TNS A 2 -31.426 -21.291 -0.972 1.00 0.00 H \n", 2366 "HETATM 118 H118 TNS A 2 -38.339 -13.970 -5.998 1.00 0.00 H \n", 2367 "HETATM 119 H119 TNS A 2 -44.012 -4.747 -11.411 1.00 0.00 H \n", 2368 "HETATM 120 H120 TNS A 2 -47.235 8.231 -17.588 1.00 0.00 H \n", 2369 "HETATM 121 H121 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2370 "HETATM 122 H122 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2371 "HETATM 123 H123 TNS A 2 29.432 -31.771 27.066 1.00 0.00 H \n", 2372 "HETATM 124 H124 TNS A 2 14.846 -33.819 26.938 1.00 0.00 H \n", 2373 "HETATM 125 H125 TNS A 2 2.970 -32.799 24.827 1.00 0.00 H \n", 2374 "HETATM 126 H126 TNS A 2 -7.534 -30.226 21.713 1.00 0.00 H \n", 2375 "HETATM 127 H127 TNS A 2 -17.033 -26.514 17.862 1.00 0.00 H \n", 2376 "HETATM 128 H128 TNS A 2 -25.651 -21.806 13.368 1.00 0.00 H \n", 2377 "HETATM 129 H129 TNS A 2 -33.389 -16.101 8.229 1.00 0.00 H \n", 2378 "HETATM 130 H130 TNS A 2 -40.121 -9.258 2.355 1.00 0.00 H \n", 2379 "HETATM 131 H131 TNS A 2 -45.482 -0.862 -4.523 1.00 0.00 H \n", 2380 "HETATM 132 H132 TNS A 2 -48.132 10.602 -13.384 1.00 0.00 H \n", 2381 "HETATM 133 H133 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2382 "HETATM 134 H134 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2383 "HETATM 135 H135 TNS A 2 29.450 -28.364 30.600 1.00 0.00 H \n", 2384 "HETATM 136 H136 TNS A 2 14.875 -28.237 32.729 1.00 0.00 H \n", 2385 "HETATM 137 H137 TNS A 2 3.005 -26.030 31.850 1.00 0.00 H \n", 2386 "HETATM 138 H138 TNS A 2 -7.495 -22.769 29.448 1.00 0.00 H \n", 2387 "HETATM 139 H139 TNS A 2 -16.992 -18.737 25.931 1.00 0.00 H \n", 2388 "HETATM 140 H140 TNS A 2 -25.610 -14.029 21.436 1.00 0.00 H \n", 2389 "HETATM 141 H141 TNS A 2 -33.349 -8.645 15.965 1.00 0.00 H \n", 2390 "HETATM 142 H142 TNS A 2 -40.086 -2.489 9.378 1.00 0.00 H \n", 2391 "HETATM 143 H143 TNS A 2 -45.452 4.720 1.268 1.00 0.00 H \n", 2392 "HETATM 144 H144 TNS A 2 -48.114 14.010 -9.849 1.00 0.00 H \n", 2393 "HETATM 145 H145 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2394 "HETATM 146 H146 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2395 "HETATM 147 H147 TNS A 2 30.382 -24.254 33.119 1.00 0.00 H \n", 2396 "HETATM 148 H148 TNS A 2 16.401 -21.504 36.856 1.00 0.00 H \n", 2397 "HETATM 149 H149 TNS A 2 4.856 -17.864 36.855 1.00 0.00 H \n", 2398 "HETATM 150 H150 TNS A 2 -5.456 -13.775 34.961 1.00 0.00 H \n", 2399 "HETATM 151 H151 TNS A 2 -14.866 -9.356 31.681 1.00 0.00 H \n", 2400 "HETATM 152 H152 TNS A 2 -23.484 -4.647 27.187 1.00 0.00 H \n", 2401 "HETATM 153 H153 TNS A 2 -31.311 0.350 21.478 1.00 0.00 H \n", 2402 "HETATM 154 H154 TNS A 2 -38.235 5.676 14.383 1.00 0.00 H \n", 2403 "HETATM 155 H155 TNS A 2 -43.926 11.453 5.396 1.00 0.00 H \n", 2404 "HETATM 156 H156 TNS A 2 -47.182 18.119 -7.330 1.00 0.00 H \n", 2405 "HETATM 157 H157 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2406 "HETATM 158 H158 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2407 "HETATM 159 H159 TNS A 2 32.136 -19.844 34.376 1.00 0.00 H \n", 2408 "HETATM 160 H160 TNS A 2 19.275 -14.279 38.915 1.00 0.00 H \n", 2409 "HETATM 161 H161 TNS A 2 8.341 -9.103 39.352 1.00 0.00 H \n", 2410 "HETATM 162 H162 TNS A 2 -1.618 -4.124 37.712 1.00 0.00 H \n", 2411 "HETATM 163 H163 TNS A 2 -10.862 0.711 34.550 1.00 0.00 H \n", 2412 "HETATM 164 H164 TNS A 2 -19.481 5.419 30.056 1.00 0.00 H \n", 2413 "HETATM 165 H165 TNS A 2 -27.473 10.001 24.229 1.00 0.00 H \n", 2414 "HETATM 166 H166 TNS A 2 -34.751 14.438 16.880 1.00 0.00 H \n", 2415 "HETATM 167 H167 TNS A 2 -41.053 18.678 7.455 1.00 0.00 H \n", 2416 "HETATM 168 H168 TNS A 2 -45.428 22.529 -6.073 1.00 0.00 H \n", 2417 "HETATM 169 H169 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2418 "HETATM 170 H170 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2419 "HETATM 171 H171 TNS A 2 34.540 -15.565 34.248 1.00 0.00 H \n", 2420 "HETATM 172 H172 TNS A 2 23.214 -7.269 38.705 1.00 0.00 H \n", 2421 "HETATM 173 H173 TNS A 2 13.117 -0.602 39.097 1.00 0.00 H \n", 2422 "HETATM 174 H174 TNS A 2 3.644 5.240 37.431 1.00 0.00 H \n", 2423 "HETATM 175 H175 TNS A 2 -5.374 10.478 34.257 1.00 0.00 H \n", 2424 "HETATM 176 H176 TNS A 2 -13.992 15.186 29.763 1.00 0.00 H \n", 2425 "HETATM 177 H177 TNS A 2 -22.211 19.364 23.948 1.00 0.00 H \n", 2426 "HETATM 178 H178 TNS A 2 -29.974 22.939 16.625 1.00 0.00 H \n", 2427 "HETATM 179 H179 TNS A 2 -37.114 25.688 7.244 1.00 0.00 H \n", 2428 "HETATM 180 H180 TNS A 2 -43.024 26.808 -6.202 1.00 0.00 H \n", 2429 "HETATM 181 H181 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2430 "HETATM 182 H182 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2431 "HETATM 183 H183 TNS A 2 37.360 -11.837 32.747 1.00 0.00 H \n", 2432 "HETATM 184 H184 TNS A 2 27.833 -1.160 36.246 1.00 0.00 H \n", 2433 "HETATM 185 H185 TNS A 2 18.719 6.806 36.115 1.00 0.00 H \n", 2434 "HETATM 186 H186 TNS A 2 9.814 13.399 34.146 1.00 0.00 H \n", 2435 "HETATM 187 H187 TNS A 2 1.062 18.988 30.831 1.00 0.00 H \n", 2436 "HETATM 188 H188 TNS A 2 -7.556 23.696 26.336 1.00 0.00 H \n", 2437 "HETATM 189 H189 TNS A 2 -16.040 27.524 20.663 1.00 0.00 H \n", 2438 "HETATM 190 H190 TNS A 2 -24.372 30.346 13.643 1.00 0.00 H \n", 2439 "HETATM 191 H191 TNS A 2 -32.494 31.797 4.785 1.00 0.00 H \n", 2440 "HETATM 192 H192 TNS A 2 -40.204 30.536 -7.703 1.00 0.00 H \n", 2441 "HETATM 193 H193 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2442 "HETATM 194 H194 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2443 "HETATM 195 H195 TNS A 2 40.318 -9.024 30.020 1.00 0.00 H \n", 2444 "HETATM 196 H196 TNS A 2 32.681 3.448 31.778 1.00 0.00 H \n", 2445 "HETATM 197 H197 TNS A 2 24.598 12.395 30.697 1.00 0.00 H \n", 2446 "HETATM 198 H198 TNS A 2 16.290 19.556 28.178 1.00 0.00 H \n", 2447 "HETATM 199 H199 TNS A 2 7.816 25.409 24.606 1.00 0.00 H \n", 2448 "HETATM 200 H200 TNS A 2 -0.802 30.118 20.112 1.00 0.00 H \n", 2449 "HETATM 201 H201 TNS A 2 -9.565 33.680 14.695 1.00 0.00 H \n", 2450 "HETATM 202 H202 TNS A 2 -18.493 35.935 8.225 1.00 0.00 H \n", 2451 "HETATM 203 H203 TNS A 2 -27.647 36.406 0.318 1.00 0.00 H \n", 2452 "HETATM 204 H204 TNS A 2 -37.246 33.350 -10.430 1.00 0.00 H \n", 2453 "HETATM 205 H205 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2454 "HETATM 206 H206 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2455 "HETATM 207 H207 TNS A 2 43.127 -7.401 26.334 1.00 0.00 H \n", 2456 "HETATM 208 H208 TNS A 2 37.282 6.107 25.740 1.00 0.00 H \n", 2457 "HETATM 209 H209 TNS A 2 30.178 15.618 23.374 1.00 0.00 H \n", 2458 "HETATM 210 H210 TNS A 2 22.436 23.107 20.112 1.00 0.00 H \n", 2459 "HETATM 211 H211 TNS A 2 14.227 29.113 16.193 1.00 0.00 H \n", 2460 "HETATM 212 H212 TNS A 2 5.609 33.821 11.699 1.00 0.00 H \n", 2461 "HETATM 213 H213 TNS A 2 -3.419 37.231 6.629 1.00 0.00 H \n", 2462 "HETATM 214 H214 TNS A 2 -12.913 39.159 0.903 1.00 0.00 H \n", 2463 "HETATM 215 H215 TNS A 2 -23.045 39.064 -5.721 1.00 0.00 H \n", 2464 "HETATM 216 H216 TNS A 2 -34.437 34.972 -14.115 1.00 0.00 H \n", 2465 "HETATM 217 H217 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2466 "HETATM 218 H218 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2467 "HETATM 219 H219 TNS A 2 45.510 -7.128 22.051 1.00 0.00 H \n", 2468 "HETATM 220 H220 TNS A 2 41.187 6.554 18.722 1.00 0.00 H \n", 2469 "HETATM 221 H221 TNS A 2 34.913 16.161 14.864 1.00 0.00 H \n", 2470 "HETATM 222 H222 TNS A 2 27.651 23.705 10.738 1.00 0.00 H \n", 2471 "HETATM 223 H223 TNS A 2 19.667 29.737 6.415 1.00 0.00 H \n", 2472 "HETATM 224 H224 TNS A 2 11.049 34.445 1.921 1.00 0.00 H \n", 2473 "HETATM 225 H225 TNS A 2 1.797 37.829 -2.746 1.00 0.00 H \n", 2474 "HETATM 226 H226 TNS A 2 -8.178 39.702 -7.608 1.00 0.00 H \n", 2475 "HETATM 227 H227 TNS A 2 -19.141 39.511 -12.739 1.00 0.00 H \n", 2476 "HETATM 228 H228 TNS A 2 -32.054 35.245 -18.399 1.00 0.00 H \n", 2477 "HETATM 229 H229 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2478 "HETATM 230 H230 TNS A 2 43.091 -23.541 22.472 1.00 0.00 H \n", 2479 "HETATM 231 H231 TNS A 2 47.235 -8.231 17.588 1.00 0.00 H \n", 2480 "HETATM 232 H232 TNS A 2 44.012 4.747 11.411 1.00 0.00 H \n", 2481 "HETATM 233 H233 TNS A 2 38.339 13.970 5.998 1.00 0.00 H \n", 2482 "HETATM 234 H234 TNS A 2 31.426 21.291 0.972 1.00 0.00 H \n", 2483 "HETATM 235 H235 TNS A 2 23.603 27.219 -3.771 1.00 0.00 H \n", 2484 "HETATM 236 H236 TNS A 2 14.985 31.927 -8.265 1.00 0.00 H \n", 2485 "HETATM 237 H237 TNS A 2 5.571 35.415 -12.511 1.00 0.00 H \n", 2486 "HETATM 238 H238 TNS A 2 -4.752 37.510 -16.474 1.00 0.00 H \n", 2487 "HETATM 239 H239 TNS A 2 -16.316 37.704 -20.050 1.00 0.00 H \n", 2488 "HETATM 240 H240 TNS A 2 -30.329 34.142 -22.861 1.00 0.00 H \n", 2489 "HETATM 241 H241 TNS A 2 -43.091 23.541 -22.472 1.00 0.00 H \n", 2490 "HETATM 242 R AXS A 3 -0.000 0.000 0.000 1.00 0.00 C \n", 2491 "HETATM 243 Dpar AXS A 3 -43.091 23.541 -22.472 1.00 0.00 C \n", 2492 "HETATM 244 Dpar AXS A 3 43.091 -23.541 22.472 1.00 0.00 C \n", 2493 "HETATM 245 Dpar AXS A 3 -47.400 25.895 -24.719 1.00 0.00 N \n", 2494 "HETATM 246 Dpar AXS A 3 47.400 -25.895 24.719 1.00 0.00 N \n", 2495 "CONECT 2 3 14 230 \n", 2496 "CONECT 3 2 4 15 231 \n", 2497 "CONECT 4 3 5 16 232 \n", 2498 "CONECT 5 4 6 17 233 \n", 2499 "CONECT 6 5 7 18 234 \n", 2500 "CONECT 7 6 8 19 235 \n", 2501 "CONECT 8 7 9 20 236 \n", 2502 "CONECT 9 8 10 21 237 \n", 2503 "CONECT 10 9 11 22 238 \n", 2504 "CONECT 11 10 12 23 239 \n", 2505 "CONECT 12 11 13 24 240 \n", 2506 "CONECT 13 12 25 241 \n", 2507 "CONECT 14 2 15 26 \n", 2508 "CONECT 15 14 3 16 27 \n", 2509 "CONECT 16 15 4 17 28 \n", 2510 "CONECT 17 16 5 18 29 \n", 2511 "CONECT 18 17 6 19 30 \n", 2512 "CONECT 19 18 7 20 31 \n", 2513 "CONECT 20 19 8 21 32 \n", 2514 "CONECT 21 20 9 22 33 \n", 2515 "CONECT 22 21 10 23 34 \n", 2516 "CONECT 23 22 11 24 35 \n", 2517 "CONECT 24 23 12 25 36 \n", 2518 "CONECT 25 24 13 37 \n", 2519 "CONECT 26 14 27 38 \n", 2520 "CONECT 27 26 15 28 39 \n", 2521 "CONECT 28 27 16 29 40 \n", 2522 "CONECT 29 28 17 30 41 \n", 2523 "CONECT 30 29 18 31 42 \n", 2524 "CONECT 31 30 19 32 43 \n", 2525 "CONECT 32 31 20 33 44 \n", 2526 "CONECT 33 32 21 34 45 \n", 2527 "CONECT 34 33 22 35 46 \n", 2528 "CONECT 35 34 23 36 47 \n", 2529 "CONECT 36 35 24 37 48 \n", 2530 "CONECT 37 36 25 49 \n", 2531 "CONECT 38 26 39 50 \n", 2532 "CONECT 39 38 27 40 51 \n", 2533 "CONECT 40 39 28 41 52 \n", 2534 "CONECT 41 40 29 42 53 \n", 2535 "CONECT 42 41 30 43 54 \n", 2536 "CONECT 43 42 31 44 55 \n", 2537 "CONECT 44 43 32 45 56 \n", 2538 "CONECT 45 44 33 46 57 \n", 2539 "CONECT 46 45 34 47 58 \n", 2540 "CONECT 47 46 35 48 59 \n", 2541 "CONECT 48 47 36 49 60 \n", 2542 "CONECT 49 48 37 61 \n", 2543 "CONECT 50 38 51 62 \n", 2544 "CONECT 51 50 39 52 63 \n", 2545 "CONECT 52 51 40 53 64 \n", 2546 "CONECT 53 52 41 54 65 \n", 2547 "CONECT 54 53 42 55 66 \n", 2548 "CONECT 55 54 43 56 67 \n", 2549 "CONECT 56 55 44 57 68 \n", 2550 "CONECT 57 56 45 58 69 \n", 2551 "CONECT 58 57 46 59 70 \n", 2552 "CONECT 59 58 47 60 71 \n", 2553 "CONECT 60 59 48 61 72 \n", 2554 "CONECT 61 60 49 73 \n", 2555 "CONECT 62 50 63 74 \n", 2556 "CONECT 63 62 51 64 75 \n", 2557 "CONECT 64 63 52 65 76 \n", 2558 "CONECT 65 64 53 66 77 \n", 2559 "CONECT 66 65 54 67 78 \n", 2560 "CONECT 67 66 55 68 79 \n", 2561 "CONECT 68 67 56 69 80 \n", 2562 "CONECT 69 68 57 70 81 \n", 2563 "CONECT 70 69 58 71 82 \n", 2564 "CONECT 71 70 59 72 83 \n", 2565 "CONECT 72 71 60 73 84 \n", 2566 "CONECT 73 72 61 85 \n", 2567 "CONECT 74 62 75 86 \n", 2568 "CONECT 75 74 63 76 87 \n", 2569 "CONECT 76 75 64 77 88 \n", 2570 "CONECT 77 76 65 78 89 \n", 2571 "CONECT 78 77 66 79 90 \n", 2572 "CONECT 79 78 67 80 91 \n", 2573 "CONECT 80 79 68 81 92 \n", 2574 "CONECT 81 80 69 82 93 \n", 2575 "CONECT 82 81 70 83 94 \n", 2576 "CONECT 83 82 71 84 95 \n", 2577 "CONECT 84 83 72 85 96 \n", 2578 "CONECT 85 84 73 97 \n", 2579 "CONECT 86 74 87 98 \n", 2580 "CONECT 87 86 75 88 99 \n", 2581 "CONECT 88 87 76 89 100 \n", 2582 "CONECT 89 88 77 90 101 \n", 2583 "CONECT 90 89 78 91 102 \n", 2584 "CONECT 91 90 79 92 103 \n", 2585 "CONECT 92 91 80 93 104 \n", 2586 "CONECT 93 92 81 94 105 \n", 2587 "CONECT 94 93 82 95 106 \n", 2588 "CONECT 95 94 83 96 107 \n", 2589 "CONECT 96 95 84 97 108 \n", 2590 "CONECT 97 96 85 109 \n", 2591 "CONECT 98 86 99 110 \n", 2592 "CONECT 99 98 87 100 111 \n", 2593 "CONECT 100 99 88 101 112 \n", 2594 "CONECT 101 100 89 102 113 \n", 2595 "CONECT 102 101 90 103 114 \n", 2596 "CONECT 103 102 91 104 115 \n", 2597 "CONECT 104 103 92 105 116 \n", 2598 "CONECT 105 104 93 106 117 \n", 2599 "CONECT 106 105 94 107 118 \n", 2600 "CONECT 107 106 95 108 119 \n", 2601 "CONECT 108 107 96 109 120 \n", 2602 "CONECT 109 108 97 121 \n", 2603 "CONECT 110 98 111 122 \n", 2604 "CONECT 111 110 99 112 123 \n", 2605 "CONECT 112 111 100 113 124 \n", 2606 "CONECT 113 112 101 114 125 \n", 2607 "CONECT 114 113 102 115 126 \n", 2608 "CONECT 115 114 103 116 127 \n", 2609 "CONECT 116 115 104 117 128 \n", 2610 "CONECT 117 116 105 118 129 \n", 2611 "CONECT 118 117 106 119 130 \n", 2612 "CONECT 119 118 107 120 131 \n", 2613 "CONECT 120 119 108 121 132 \n", 2614 "CONECT 121 120 109 133 \n", 2615 "CONECT 122 110 123 134 \n", 2616 "CONECT 123 122 111 124 135 \n", 2617 "CONECT 124 123 112 125 136 \n", 2618 "CONECT 125 124 113 126 137 \n", 2619 "CONECT 126 125 114 127 138 \n", 2620 "CONECT 127 126 115 128 139 \n", 2621 "CONECT 128 127 116 129 140 \n", 2622 "CONECT 129 128 117 130 141 \n", 2623 "CONECT 130 129 118 131 142 \n", 2624 "CONECT 131 130 119 132 143 \n", 2625 "CONECT 132 131 120 133 144 \n", 2626 "CONECT 133 132 121 145 \n", 2627 "CONECT 134 122 135 146 \n", 2628 "CONECT 135 134 123 136 147 \n", 2629 "CONECT 136 135 124 137 148 \n", 2630 "CONECT 137 136 125 138 149 \n", 2631 "CONECT 138 137 126 139 150 \n", 2632 "CONECT 139 138 127 140 151 \n", 2633 "CONECT 140 139 128 141 152 \n", 2634 "CONECT 141 140 129 142 153 \n", 2635 "CONECT 142 141 130 143 154 \n", 2636 "CONECT 143 142 131 144 155 \n", 2637 "CONECT 144 143 132 145 156 \n", 2638 "CONECT 145 144 133 157 \n", 2639 "CONECT 146 134 147 158 \n", 2640 "CONECT 147 146 135 148 159 \n", 2641 "CONECT 148 147 136 149 160 \n", 2642 "CONECT 149 148 137 150 161 \n", 2643 "CONECT 150 149 138 151 162 \n", 2644 "CONECT 151 150 139 152 163 \n", 2645 "CONECT 152 151 140 153 164 \n", 2646 "CONECT 153 152 141 154 165 \n", 2647 "CONECT 154 153 142 155 166 \n", 2648 "CONECT 155 154 143 156 167 \n", 2649 "CONECT 156 155 144 157 168 \n", 2650 "CONECT 157 156 145 169 \n", 2651 "CONECT 158 146 159 170 \n", 2652 "CONECT 159 158 147 160 171 \n", 2653 "CONECT 160 159 148 161 172 \n", 2654 "CONECT 161 160 149 162 173 \n", 2655 "CONECT 162 161 150 163 174 \n", 2656 "CONECT 163 162 151 164 175 \n", 2657 "CONECT 164 163 152 165 176 \n", 2658 "CONECT 165 164 153 166 177 \n", 2659 "CONECT 166 165 154 167 178 \n", 2660 "CONECT 167 166 155 168 179 \n", 2661 "CONECT 168 167 156 169 180 \n", 2662 "CONECT 169 168 157 181 \n", 2663 "CONECT 170 158 171 182 \n", 2664 "CONECT 171 170 159 172 183 \n", 2665 "CONECT 172 171 160 173 184 \n", 2666 "CONECT 173 172 161 174 185 \n", 2667 "CONECT 174 173 162 175 186 \n", 2668 "CONECT 175 174 163 176 187 \n", 2669 "CONECT 176 175 164 177 188 \n", 2670 "CONECT 177 176 165 178 189 \n", 2671 "CONECT 178 177 166 179 190 \n", 2672 "CONECT 179 178 167 180 191 \n", 2673 "CONECT 180 179 168 181 192 \n", 2674 "CONECT 181 180 169 193 \n", 2675 "CONECT 182 170 183 194 \n", 2676 "CONECT 183 182 171 184 195 \n", 2677 "CONECT 184 183 172 185 196 \n", 2678 "CONECT 185 184 173 186 197 \n", 2679 "CONECT 186 185 174 187 198 \n", 2680 "CONECT 187 186 175 188 199 \n", 2681 "CONECT 188 187 176 189 200 \n", 2682 "CONECT 189 188 177 190 201 \n", 2683 "CONECT 190 189 178 191 202 \n", 2684 "CONECT 191 190 179 192 203 \n", 2685 "CONECT 192 191 180 193 204 \n", 2686 "CONECT 193 192 181 205 \n", 2687 "CONECT 194 182 195 206 \n", 2688 "CONECT 195 194 183 196 207 \n", 2689 "CONECT 196 195 184 197 208 \n", 2690 "CONECT 197 196 185 198 209 \n", 2691 "CONECT 198 197 186 199 210 \n", 2692 "CONECT 199 198 187 200 211 \n", 2693 "CONECT 200 199 188 201 212 \n", 2694 "CONECT 201 200 189 202 213 \n", 2695 "CONECT 202 201 190 203 214 \n", 2696 "CONECT 203 202 191 204 215 \n", 2697 "CONECT 204 203 192 205 216 \n", 2698 "CONECT 205 204 193 217 \n", 2699 "CONECT 206 194 207 218 \n", 2700 "CONECT 207 206 195 208 219 \n", 2701 "CONECT 208 207 196 209 220 \n", 2702 "CONECT 209 208 197 210 221 \n", 2703 "CONECT 210 209 198 211 222 \n", 2704 "CONECT 211 210 199 212 223 \n", 2705 "CONECT 212 211 200 213 224 \n", 2706 "CONECT 213 212 201 214 225 \n", 2707 "CONECT 214 213 202 215 226 \n", 2708 "CONECT 215 214 203 216 227 \n", 2709 "CONECT 216 215 204 217 228 \n", 2710 "CONECT 217 216 205 229 \n", 2711 "CONECT 218 206 219 230 \n", 2712 "CONECT 219 218 207 220 231 \n", 2713 "CONECT 220 219 208 221 232 \n", 2714 "CONECT 221 220 209 222 233 \n", 2715 "CONECT 222 221 210 223 234 \n", 2716 "CONECT 223 222 211 224 235 \n", 2717 "CONECT 224 223 212 225 236 \n", 2718 "CONECT 225 224 213 226 237 \n", 2719 "CONECT 226 225 214 227 238 \n", 2720 "CONECT 227 226 215 228 239 \n", 2721 "CONECT 228 227 216 229 240 \n", 2722 "CONECT 229 228 217 241 \n", 2723 "CONECT 230 218 2 231 \n", 2724 "CONECT 231 230 219 3 232 \n", 2725 "CONECT 232 231 220 4 233 \n", 2726 "CONECT 233 232 221 5 234 \n", 2727 "CONECT 234 233 222 6 235 \n", 2728 "CONECT 235 234 223 7 236 \n", 2729 "CONECT 236 235 224 8 237 \n", 2730 "CONECT 237 236 225 9 238 \n", 2731 "CONECT 238 237 226 10 239 \n", 2732 "CONECT 239 238 227 11 240 \n", 2733 "CONECT 240 239 228 12 241 \n", 2734 "CONECT 241 240 229 13 \n", 2735 "CONECT 242 243 244 \n", 2736 "CONECT 243 242 \n", 2737 "CONECT 244 242 \n", 2738 "MASTER 0 0 3 0 0 0 0 0 246 0 243 0 \n", 2739 "END \n" 2740 ] 2741 2742 # Check the data. 2743 self.strip_remarks(lines) 2744 self.assertEqual(len(real_data), len(lines)) 2745 for i in range(len(lines)): 2746 self.assertEqual(real_data[i], lines[i])
2747 2748
2750 """Check that the sphere diffusion tensor optimisation functions correctly.""" 2751 2752 # Reset relax. 2753 self.interpreter.reset() 2754 2755 # Create a temporary file. 2756 ds.tmpfile = mktemp() 2757 2758 # The diffusion type (used by the script). 2759 ds.diff_dir = 'sphere' 2760 ds.diff_type = 'sphere' 2761 2762 # Execute the script. 2763 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'diff_tensor'+sep+'tensor_opt.py') 2764 2765 # Create the PDB representation. 2766 self.interpreter.structure.create_diff_tensor_pdb(scale=1.8e-06, file=ds.tmpfile, force=True) 2767 2768 # Read the contents of the file. 2769 file = open(ds.tmpfile) 2770 lines = file.readlines() 2771 file.close() 2772 2773 # What the contents should be, without remarks. 2774 real_data = [ 2775 "HET COM A 1 1 \n", 2776 "HET TNS A 2 240 \n", 2777 "HETNAM COM CENTRE OF MASS \n", 2778 "HETNAM TNS TENSOR \n", 2779 "FORMUL 1 COM C1 \n", 2780 "FORMUL 2 TNS H240 \n", 2781 "HETATM 1 R COM A 1 -0.000 0.000 0.000 1.00 0.00 C \n", 2782 "HETATM 2 H2 TNS A 2 0.000 0.000 -36.000 1.00 0.00 H \n", 2783 "HETATM 3 H3 TNS A 2 15.692 0.000 -32.400 1.00 0.00 H \n", 2784 "HETATM 4 H4 TNS A 2 25.709 0.000 -25.200 1.00 0.00 H \n", 2785 "HETATM 5 H5 TNS A 2 31.177 0.000 -18.000 1.00 0.00 H \n", 2786 "HETATM 6 H6 TNS A 2 34.342 0.000 -10.800 1.00 0.00 H \n", 2787 "HETATM 7 H7 TNS A 2 35.820 0.000 -3.600 1.00 0.00 H \n", 2788 "HETATM 8 H8 TNS A 2 35.820 0.000 3.600 1.00 0.00 H \n", 2789 "HETATM 9 H9 TNS A 2 34.342 0.000 10.800 1.00 0.00 H \n", 2790 "HETATM 10 H10 TNS A 2 31.177 0.000 18.000 1.00 0.00 H \n", 2791 "HETATM 11 H11 TNS A 2 25.709 0.000 25.200 1.00 0.00 H \n", 2792 "HETATM 12 H12 TNS A 2 15.692 0.000 32.400 1.00 0.00 H \n", 2793 "HETATM 13 H13 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2794 "HETATM 14 H14 TNS A 2 0.000 0.000 -36.000 1.00 0.00 H \n", 2795 "HETATM 15 H15 TNS A 2 14.924 4.849 -32.400 1.00 0.00 H \n", 2796 "HETATM 16 H16 TNS A 2 24.451 7.945 -25.200 1.00 0.00 H \n", 2797 "HETATM 17 H17 TNS A 2 29.651 9.634 -18.000 1.00 0.00 H \n", 2798 "HETATM 18 H18 TNS A 2 32.661 10.612 -10.800 1.00 0.00 H \n", 2799 "HETATM 19 H19 TNS A 2 34.066 11.069 -3.600 1.00 0.00 H \n", 2800 "HETATM 20 H20 TNS A 2 34.066 11.069 3.600 1.00 0.00 H \n", 2801 "HETATM 21 H21 TNS A 2 32.661 10.612 10.800 1.00 0.00 H \n", 2802 "HETATM 22 H22 TNS A 2 29.651 9.634 18.000 1.00 0.00 H \n", 2803 "HETATM 23 H23 TNS A 2 24.451 7.945 25.200 1.00 0.00 H \n", 2804 "HETATM 24 H24 TNS A 2 14.924 4.849 32.400 1.00 0.00 H \n", 2805 "HETATM 25 H25 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2806 "HETATM 26 H26 TNS A 2 0.000 0.000 -36.000 1.00 0.00 H \n", 2807 "HETATM 27 H27 TNS A 2 12.695 9.224 -32.400 1.00 0.00 H \n", 2808 "HETATM 28 H28 TNS A 2 20.799 15.111 -25.200 1.00 0.00 H \n", 2809 "HETATM 29 H29 TNS A 2 25.223 18.325 -18.000 1.00 0.00 H \n", 2810 "HETATM 30 H30 TNS A 2 27.783 20.186 -10.800 1.00 0.00 H \n", 2811 "HETATM 31 H31 TNS A 2 28.979 21.054 -3.600 1.00 0.00 H \n", 2812 "HETATM 32 H32 TNS A 2 28.979 21.054 3.600 1.00 0.00 H \n", 2813 "HETATM 33 H33 TNS A 2 27.783 20.186 10.800 1.00 0.00 H \n", 2814 "HETATM 34 H34 TNS A 2 25.223 18.325 18.000 1.00 0.00 H \n", 2815 "HETATM 35 H35 TNS A 2 20.799 15.111 25.200 1.00 0.00 H \n", 2816 "HETATM 36 H36 TNS A 2 12.695 9.224 32.400 1.00 0.00 H \n", 2817 "HETATM 37 H37 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2818 "HETATM 38 H38 TNS A 2 0.000 0.000 -36.000 1.00 0.00 H \n", 2819 "HETATM 39 H39 TNS A 2 9.224 12.695 -32.400 1.00 0.00 H \n", 2820 "HETATM 40 H40 TNS A 2 15.111 20.799 -25.200 1.00 0.00 H \n", 2821 "HETATM 41 H41 TNS A 2 18.325 25.223 -18.000 1.00 0.00 H \n", 2822 "HETATM 42 H42 TNS A 2 20.186 27.783 -10.800 1.00 0.00 H \n", 2823 "HETATM 43 H43 TNS A 2 21.054 28.979 -3.600 1.00 0.00 H \n", 2824 "HETATM 44 H44 TNS A 2 21.054 28.979 3.600 1.00 0.00 H \n", 2825 "HETATM 45 H45 TNS A 2 20.186 27.783 10.800 1.00 0.00 H \n", 2826 "HETATM 46 H46 TNS A 2 18.325 25.223 18.000 1.00 0.00 H \n", 2827 "HETATM 47 H47 TNS A 2 15.111 20.799 25.200 1.00 0.00 H \n", 2828 "HETATM 48 H48 TNS A 2 9.224 12.695 32.400 1.00 0.00 H \n", 2829 "HETATM 49 H49 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2830 "HETATM 50 H50 TNS A 2 0.000 0.000 -36.000 1.00 0.00 H \n", 2831 "HETATM 51 H51 TNS A 2 4.849 14.924 -32.400 1.00 0.00 H \n", 2832 "HETATM 52 H52 TNS A 2 7.945 24.451 -25.200 1.00 0.00 H \n", 2833 "HETATM 53 H53 TNS A 2 9.634 29.651 -18.000 1.00 0.00 H \n", 2834 "HETATM 54 H54 TNS A 2 10.612 32.661 -10.800 1.00 0.00 H \n", 2835 "HETATM 55 H55 TNS A 2 11.069 34.066 -3.600 1.00 0.00 H \n", 2836 "HETATM 56 H56 TNS A 2 11.069 34.066 3.600 1.00 0.00 H \n", 2837 "HETATM 57 H57 TNS A 2 10.612 32.661 10.800 1.00 0.00 H \n", 2838 "HETATM 58 H58 TNS A 2 9.634 29.651 18.000 1.00 0.00 H \n", 2839 "HETATM 59 H59 TNS A 2 7.945 24.451 25.200 1.00 0.00 H \n", 2840 "HETATM 60 H60 TNS A 2 4.849 14.924 32.400 1.00 0.00 H \n", 2841 "HETATM 61 H61 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2842 "HETATM 62 H62 TNS A 2 -0.000 0.000 -36.000 1.00 0.00 H \n", 2843 "HETATM 63 H63 TNS A 2 0.000 15.692 -32.400 1.00 0.00 H \n", 2844 "HETATM 64 H64 TNS A 2 0.000 25.709 -25.200 1.00 0.00 H \n", 2845 "HETATM 65 H65 TNS A 2 0.000 31.177 -18.000 1.00 0.00 H \n", 2846 "HETATM 66 H66 TNS A 2 0.000 34.342 -10.800 1.00 0.00 H \n", 2847 "HETATM 67 H67 TNS A 2 0.000 35.820 -3.600 1.00 0.00 H \n", 2848 "HETATM 68 H68 TNS A 2 0.000 35.820 3.600 1.00 0.00 H \n", 2849 "HETATM 69 H69 TNS A 2 0.000 34.342 10.800 1.00 0.00 H \n", 2850 "HETATM 70 H70 TNS A 2 0.000 31.177 18.000 1.00 0.00 H \n", 2851 "HETATM 71 H71 TNS A 2 0.000 25.709 25.200 1.00 0.00 H \n", 2852 "HETATM 72 H72 TNS A 2 0.000 15.692 32.400 1.00 0.00 H \n", 2853 "HETATM 73 H73 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2854 "HETATM 74 H74 TNS A 2 -0.000 0.000 -36.000 1.00 0.00 H \n", 2855 "HETATM 75 H75 TNS A 2 -4.849 14.924 -32.400 1.00 0.00 H \n", 2856 "HETATM 76 H76 TNS A 2 -7.945 24.451 -25.200 1.00 0.00 H \n", 2857 "HETATM 77 H77 TNS A 2 -9.634 29.651 -18.000 1.00 0.00 H \n", 2858 "HETATM 78 H78 TNS A 2 -10.612 32.661 -10.800 1.00 0.00 H \n", 2859 "HETATM 79 H79 TNS A 2 -11.069 34.066 -3.600 1.00 0.00 H \n", 2860 "HETATM 80 H80 TNS A 2 -11.069 34.066 3.600 1.00 0.00 H \n", 2861 "HETATM 81 H81 TNS A 2 -10.612 32.661 10.800 1.00 0.00 H \n", 2862 "HETATM 82 H82 TNS A 2 -9.634 29.651 18.000 1.00 0.00 H \n", 2863 "HETATM 83 H83 TNS A 2 -7.945 24.451 25.200 1.00 0.00 H \n", 2864 "HETATM 84 H84 TNS A 2 -4.849 14.924 32.400 1.00 0.00 H \n", 2865 "HETATM 85 H85 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2866 "HETATM 86 H86 TNS A 2 -0.000 0.000 -36.000 1.00 0.00 H \n", 2867 "HETATM 87 H87 TNS A 2 -9.224 12.695 -32.400 1.00 0.00 H \n", 2868 "HETATM 88 H88 TNS A 2 -15.111 20.799 -25.200 1.00 0.00 H \n", 2869 "HETATM 89 H89 TNS A 2 -18.325 25.223 -18.000 1.00 0.00 H \n", 2870 "HETATM 90 H90 TNS A 2 -20.186 27.783 -10.800 1.00 0.00 H \n", 2871 "HETATM 91 H91 TNS A 2 -21.054 28.979 -3.600 1.00 0.00 H \n", 2872 "HETATM 92 H92 TNS A 2 -21.054 28.979 3.600 1.00 0.00 H \n", 2873 "HETATM 93 H93 TNS A 2 -20.186 27.783 10.800 1.00 0.00 H \n", 2874 "HETATM 94 H94 TNS A 2 -18.325 25.223 18.000 1.00 0.00 H \n", 2875 "HETATM 95 H95 TNS A 2 -15.111 20.799 25.200 1.00 0.00 H \n", 2876 "HETATM 96 H96 TNS A 2 -9.224 12.695 32.400 1.00 0.00 H \n", 2877 "HETATM 97 H97 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2878 "HETATM 98 H98 TNS A 2 -0.000 0.000 -36.000 1.00 0.00 H \n", 2879 "HETATM 99 H99 TNS A 2 -12.695 9.224 -32.400 1.00 0.00 H \n", 2880 "HETATM 100 H100 TNS A 2 -20.799 15.111 -25.200 1.00 0.00 H \n", 2881 "HETATM 101 H101 TNS A 2 -25.223 18.325 -18.000 1.00 0.00 H \n", 2882 "HETATM 102 H102 TNS A 2 -27.783 20.186 -10.800 1.00 0.00 H \n", 2883 "HETATM 103 H103 TNS A 2 -28.979 21.054 -3.600 1.00 0.00 H \n", 2884 "HETATM 104 H104 TNS A 2 -28.979 21.054 3.600 1.00 0.00 H \n", 2885 "HETATM 105 H105 TNS A 2 -27.783 20.186 10.800 1.00 0.00 H \n", 2886 "HETATM 106 H106 TNS A 2 -25.223 18.325 18.000 1.00 0.00 H \n", 2887 "HETATM 107 H107 TNS A 2 -20.799 15.111 25.200 1.00 0.00 H \n", 2888 "HETATM 108 H108 TNS A 2 -12.695 9.224 32.400 1.00 0.00 H \n", 2889 "HETATM 109 H109 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2890 "HETATM 110 H110 TNS A 2 -0.000 0.000 -36.000 1.00 0.00 H \n", 2891 "HETATM 111 H111 TNS A 2 -14.924 4.849 -32.400 1.00 0.00 H \n", 2892 "HETATM 112 H112 TNS A 2 -24.451 7.945 -25.200 1.00 0.00 H \n", 2893 "HETATM 113 H113 TNS A 2 -29.651 9.634 -18.000 1.00 0.00 H \n", 2894 "HETATM 114 H114 TNS A 2 -32.661 10.612 -10.800 1.00 0.00 H \n", 2895 "HETATM 115 H115 TNS A 2 -34.066 11.069 -3.600 1.00 0.00 H \n", 2896 "HETATM 116 H116 TNS A 2 -34.066 11.069 3.600 1.00 0.00 H \n", 2897 "HETATM 117 H117 TNS A 2 -32.661 10.612 10.800 1.00 0.00 H \n", 2898 "HETATM 118 H118 TNS A 2 -29.651 9.634 18.000 1.00 0.00 H \n", 2899 "HETATM 119 H119 TNS A 2 -24.451 7.945 25.200 1.00 0.00 H \n", 2900 "HETATM 120 H120 TNS A 2 -14.924 4.849 32.400 1.00 0.00 H \n", 2901 "HETATM 121 H121 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2902 "HETATM 122 H122 TNS A 2 -0.000 0.000 -36.000 1.00 0.00 H \n", 2903 "HETATM 123 H123 TNS A 2 -15.692 0.000 -32.400 1.00 0.00 H \n", 2904 "HETATM 124 H124 TNS A 2 -25.709 0.000 -25.200 1.00 0.00 H \n", 2905 "HETATM 125 H125 TNS A 2 -31.177 0.000 -18.000 1.00 0.00 H \n", 2906 "HETATM 126 H126 TNS A 2 -34.342 0.000 -10.800 1.00 0.00 H \n", 2907 "HETATM 127 H127 TNS A 2 -35.820 0.000 -3.600 1.00 0.00 H \n", 2908 "HETATM 128 H128 TNS A 2 -35.820 0.000 3.600 1.00 0.00 H \n", 2909 "HETATM 129 H129 TNS A 2 -34.342 0.000 10.800 1.00 0.00 H \n", 2910 "HETATM 130 H130 TNS A 2 -31.177 0.000 18.000 1.00 0.00 H \n", 2911 "HETATM 131 H131 TNS A 2 -25.709 0.000 25.200 1.00 0.00 H \n", 2912 "HETATM 132 H132 TNS A 2 -15.692 0.000 32.400 1.00 0.00 H \n", 2913 "HETATM 133 H133 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2914 "HETATM 134 H134 TNS A 2 -0.000 -0.000 -36.000 1.00 0.00 H \n", 2915 "HETATM 135 H135 TNS A 2 -14.924 -4.849 -32.400 1.00 0.00 H \n", 2916 "HETATM 136 H136 TNS A 2 -24.451 -7.945 -25.200 1.00 0.00 H \n", 2917 "HETATM 137 H137 TNS A 2 -29.651 -9.634 -18.000 1.00 0.00 H \n", 2918 "HETATM 138 H138 TNS A 2 -32.661 -10.612 -10.800 1.00 0.00 H \n", 2919 "HETATM 139 H139 TNS A 2 -34.066 -11.069 -3.600 1.00 0.00 H \n", 2920 "HETATM 140 H140 TNS A 2 -34.066 -11.069 3.600 1.00 0.00 H \n", 2921 "HETATM 141 H141 TNS A 2 -32.661 -10.612 10.800 1.00 0.00 H \n", 2922 "HETATM 142 H142 TNS A 2 -29.651 -9.634 18.000 1.00 0.00 H \n", 2923 "HETATM 143 H143 TNS A 2 -24.451 -7.945 25.200 1.00 0.00 H \n", 2924 "HETATM 144 H144 TNS A 2 -14.924 -4.849 32.400 1.00 0.00 H \n", 2925 "HETATM 145 H145 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2926 "HETATM 146 H146 TNS A 2 -0.000 -0.000 -36.000 1.00 0.00 H \n", 2927 "HETATM 147 H147 TNS A 2 -12.695 -9.224 -32.400 1.00 0.00 H \n", 2928 "HETATM 148 H148 TNS A 2 -20.799 -15.111 -25.200 1.00 0.00 H \n", 2929 "HETATM 149 H149 TNS A 2 -25.223 -18.325 -18.000 1.00 0.00 H \n", 2930 "HETATM 150 H150 TNS A 2 -27.783 -20.186 -10.800 1.00 0.00 H \n", 2931 "HETATM 151 H151 TNS A 2 -28.979 -21.054 -3.600 1.00 0.00 H \n", 2932 "HETATM 152 H152 TNS A 2 -28.979 -21.054 3.600 1.00 0.00 H \n", 2933 "HETATM 153 H153 TNS A 2 -27.783 -20.186 10.800 1.00 0.00 H \n", 2934 "HETATM 154 H154 TNS A 2 -25.223 -18.325 18.000 1.00 0.00 H \n", 2935 "HETATM 155 H155 TNS A 2 -20.799 -15.111 25.200 1.00 0.00 H \n", 2936 "HETATM 156 H156 TNS A 2 -12.695 -9.224 32.400 1.00 0.00 H \n", 2937 "HETATM 157 H157 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2938 "HETATM 158 H158 TNS A 2 -0.000 -0.000 -36.000 1.00 0.00 H \n", 2939 "HETATM 159 H159 TNS A 2 -9.224 -12.695 -32.400 1.00 0.00 H \n", 2940 "HETATM 160 H160 TNS A 2 -15.111 -20.799 -25.200 1.00 0.00 H \n", 2941 "HETATM 161 H161 TNS A 2 -18.325 -25.223 -18.000 1.00 0.00 H \n", 2942 "HETATM 162 H162 TNS A 2 -20.186 -27.783 -10.800 1.00 0.00 H \n", 2943 "HETATM 163 H163 TNS A 2 -21.054 -28.979 -3.600 1.00 0.00 H \n", 2944 "HETATM 164 H164 TNS A 2 -21.054 -28.979 3.600 1.00 0.00 H \n", 2945 "HETATM 165 H165 TNS A 2 -20.186 -27.783 10.800 1.00 0.00 H \n", 2946 "HETATM 166 H166 TNS A 2 -18.325 -25.223 18.000 1.00 0.00 H \n", 2947 "HETATM 167 H167 TNS A 2 -15.111 -20.799 25.200 1.00 0.00 H \n", 2948 "HETATM 168 H168 TNS A 2 -9.224 -12.695 32.400 1.00 0.00 H \n", 2949 "HETATM 169 H169 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2950 "HETATM 170 H170 TNS A 2 -0.000 -0.000 -36.000 1.00 0.00 H \n", 2951 "HETATM 171 H171 TNS A 2 -4.849 -14.924 -32.400 1.00 0.00 H \n", 2952 "HETATM 172 H172 TNS A 2 -7.945 -24.451 -25.200 1.00 0.00 H \n", 2953 "HETATM 173 H173 TNS A 2 -9.634 -29.651 -18.000 1.00 0.00 H \n", 2954 "HETATM 174 H174 TNS A 2 -10.612 -32.661 -10.800 1.00 0.00 H \n", 2955 "HETATM 175 H175 TNS A 2 -11.069 -34.066 -3.600 1.00 0.00 H \n", 2956 "HETATM 176 H176 TNS A 2 -11.069 -34.066 3.600 1.00 0.00 H \n", 2957 "HETATM 177 H177 TNS A 2 -10.612 -32.661 10.800 1.00 0.00 H \n", 2958 "HETATM 178 H178 TNS A 2 -9.634 -29.651 18.000 1.00 0.00 H \n", 2959 "HETATM 179 H179 TNS A 2 -7.945 -24.451 25.200 1.00 0.00 H \n", 2960 "HETATM 180 H180 TNS A 2 -4.849 -14.924 32.400 1.00 0.00 H \n", 2961 "HETATM 181 H181 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2962 "HETATM 182 H182 TNS A 2 -0.000 -0.000 -36.000 1.00 0.00 H \n", 2963 "HETATM 183 H183 TNS A 2 -0.000 -15.692 -32.400 1.00 0.00 H \n", 2964 "HETATM 184 H184 TNS A 2 -0.000 -25.709 -25.200 1.00 0.00 H \n", 2965 "HETATM 185 H185 TNS A 2 -0.000 -31.177 -18.000 1.00 0.00 H \n", 2966 "HETATM 186 H186 TNS A 2 -0.000 -34.342 -10.800 1.00 0.00 H \n", 2967 "HETATM 187 H187 TNS A 2 -0.000 -35.820 -3.600 1.00 0.00 H \n", 2968 "HETATM 188 H188 TNS A 2 -0.000 -35.820 3.600 1.00 0.00 H \n", 2969 "HETATM 189 H189 TNS A 2 -0.000 -34.342 10.800 1.00 0.00 H \n", 2970 "HETATM 190 H190 TNS A 2 -0.000 -31.177 18.000 1.00 0.00 H \n", 2971 "HETATM 191 H191 TNS A 2 -0.000 -25.709 25.200 1.00 0.00 H \n", 2972 "HETATM 192 H192 TNS A 2 -0.000 -15.692 32.400 1.00 0.00 H \n", 2973 "HETATM 193 H193 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2974 "HETATM 194 H194 TNS A 2 0.000 -0.000 -36.000 1.00 0.00 H \n", 2975 "HETATM 195 H195 TNS A 2 4.849 -14.924 -32.400 1.00 0.00 H \n", 2976 "HETATM 196 H196 TNS A 2 7.945 -24.451 -25.200 1.00 0.00 H \n", 2977 "HETATM 197 H197 TNS A 2 9.634 -29.651 -18.000 1.00 0.00 H \n", 2978 "HETATM 198 H198 TNS A 2 10.612 -32.661 -10.800 1.00 0.00 H \n", 2979 "HETATM 199 H199 TNS A 2 11.069 -34.066 -3.600 1.00 0.00 H \n", 2980 "HETATM 200 H200 TNS A 2 11.069 -34.066 3.600 1.00 0.00 H \n", 2981 "HETATM 201 H201 TNS A 2 10.612 -32.661 10.800 1.00 0.00 H \n", 2982 "HETATM 202 H202 TNS A 2 9.634 -29.651 18.000 1.00 0.00 H \n", 2983 "HETATM 203 H203 TNS A 2 7.945 -24.451 25.200 1.00 0.00 H \n", 2984 "HETATM 204 H204 TNS A 2 4.849 -14.924 32.400 1.00 0.00 H \n", 2985 "HETATM 205 H205 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2986 "HETATM 206 H206 TNS A 2 0.000 -0.000 -36.000 1.00 0.00 H \n", 2987 "HETATM 207 H207 TNS A 2 9.224 -12.695 -32.400 1.00 0.00 H \n", 2988 "HETATM 208 H208 TNS A 2 15.111 -20.799 -25.200 1.00 0.00 H \n", 2989 "HETATM 209 H209 TNS A 2 18.325 -25.223 -18.000 1.00 0.00 H \n", 2990 "HETATM 210 H210 TNS A 2 20.186 -27.783 -10.800 1.00 0.00 H \n", 2991 "HETATM 211 H211 TNS A 2 21.054 -28.979 -3.600 1.00 0.00 H \n", 2992 "HETATM 212 H212 TNS A 2 21.054 -28.979 3.600 1.00 0.00 H \n", 2993 "HETATM 213 H213 TNS A 2 20.186 -27.783 10.800 1.00 0.00 H \n", 2994 "HETATM 214 H214 TNS A 2 18.325 -25.223 18.000 1.00 0.00 H \n", 2995 "HETATM 215 H215 TNS A 2 15.111 -20.799 25.200 1.00 0.00 H \n", 2996 "HETATM 216 H216 TNS A 2 9.224 -12.695 32.400 1.00 0.00 H \n", 2997 "HETATM 217 H217 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 2998 "HETATM 218 H218 TNS A 2 0.000 -0.000 -36.000 1.00 0.00 H \n", 2999 "HETATM 219 H219 TNS A 2 12.695 -9.224 -32.400 1.00 0.00 H \n", 3000 "HETATM 220 H220 TNS A 2 20.799 -15.111 -25.200 1.00 0.00 H \n", 3001 "HETATM 221 H221 TNS A 2 25.223 -18.325 -18.000 1.00 0.00 H \n", 3002 "HETATM 222 H222 TNS A 2 27.783 -20.186 -10.800 1.00 0.00 H \n", 3003 "HETATM 223 H223 TNS A 2 28.979 -21.054 -3.600 1.00 0.00 H \n", 3004 "HETATM 224 H224 TNS A 2 28.979 -21.054 3.600 1.00 0.00 H \n", 3005 "HETATM 225 H225 TNS A 2 27.783 -20.186 10.800 1.00 0.00 H \n", 3006 "HETATM 226 H226 TNS A 2 25.223 -18.325 18.000 1.00 0.00 H \n", 3007 "HETATM 227 H227 TNS A 2 20.799 -15.111 25.200 1.00 0.00 H \n", 3008 "HETATM 228 H228 TNS A 2 12.695 -9.224 32.400 1.00 0.00 H \n", 3009 "HETATM 229 H229 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 3010 "HETATM 230 H230 TNS A 2 0.000 -0.000 -36.000 1.00 0.00 H \n", 3011 "HETATM 231 H231 TNS A 2 14.924 -4.849 -32.400 1.00 0.00 H \n", 3012 "HETATM 232 H232 TNS A 2 24.451 -7.945 -25.200 1.00 0.00 H \n", 3013 "HETATM 233 H233 TNS A 2 29.651 -9.634 -18.000 1.00 0.00 H \n", 3014 "HETATM 234 H234 TNS A 2 32.661 -10.612 -10.800 1.00 0.00 H \n", 3015 "HETATM 235 H235 TNS A 2 34.066 -11.069 -3.600 1.00 0.00 H \n", 3016 "HETATM 236 H236 TNS A 2 34.066 -11.069 3.600 1.00 0.00 H \n", 3017 "HETATM 237 H237 TNS A 2 32.661 -10.612 10.800 1.00 0.00 H \n", 3018 "HETATM 238 H238 TNS A 2 29.651 -9.634 18.000 1.00 0.00 H \n", 3019 "HETATM 239 H239 TNS A 2 24.451 -7.945 25.200 1.00 0.00 H \n", 3020 "HETATM 240 H240 TNS A 2 14.924 -4.849 32.400 1.00 0.00 H \n", 3021 "HETATM 241 H241 TNS A 2 -0.000 0.000 36.000 1.00 0.00 H \n", 3022 "CONECT 2 3 14 230 \n", 3023 "CONECT 3 2 4 15 231 \n", 3024 "CONECT 4 3 5 16 232 \n", 3025 "CONECT 5 4 6 17 233 \n", 3026 "CONECT 6 5 7 18 234 \n", 3027 "CONECT 7 6 8 19 235 \n", 3028 "CONECT 8 7 9 20 236 \n", 3029 "CONECT 9 8 10 21 237 \n", 3030 "CONECT 10 9 11 22 238 \n", 3031 "CONECT 11 10 12 23 239 \n", 3032 "CONECT 12 11 13 24 240 \n", 3033 "CONECT 13 12 25 241 \n", 3034 "CONECT 14 2 15 26 \n", 3035 "CONECT 15 14 3 16 27 \n", 3036 "CONECT 16 15 4 17 28 \n", 3037 "CONECT 17 16 5 18 29 \n", 3038 "CONECT 18 17 6 19 30 \n", 3039 "CONECT 19 18 7 20 31 \n", 3040 "CONECT 20 19 8 21 32 \n", 3041 "CONECT 21 20 9 22 33 \n", 3042 "CONECT 22 21 10 23 34 \n", 3043 "CONECT 23 22 11 24 35 \n", 3044 "CONECT 24 23 12 25 36 \n", 3045 "CONECT 25 24 13 37 \n", 3046 "CONECT 26 14 27 38 \n", 3047 "CONECT 27 26 15 28 39 \n", 3048 "CONECT 28 27 16 29 40 \n", 3049 "CONECT 29 28 17 30 41 \n", 3050 "CONECT 30 29 18 31 42 \n", 3051 "CONECT 31 30 19 32 43 \n", 3052 "CONECT 32 31 20 33 44 \n", 3053 "CONECT 33 32 21 34 45 \n", 3054 "CONECT 34 33 22 35 46 \n", 3055 "CONECT 35 34 23 36 47 \n", 3056 "CONECT 36 35 24 37 48 \n", 3057 "CONECT 37 36 25 49 \n", 3058 "CONECT 38 26 39 50 \n", 3059 "CONECT 39 38 27 40 51 \n", 3060 "CONECT 40 39 28 41 52 \n", 3061 "CONECT 41 40 29 42 53 \n", 3062 "CONECT 42 41 30 43 54 \n", 3063 "CONECT 43 42 31 44 55 \n", 3064 "CONECT 44 43 32 45 56 \n", 3065 "CONECT 45 44 33 46 57 \n", 3066 "CONECT 46 45 34 47 58 \n", 3067 "CONECT 47 46 35 48 59 \n", 3068 "CONECT 48 47 36 49 60 \n", 3069 "CONECT 49 48 37 61 \n", 3070 "CONECT 50 38 51 62 \n", 3071 "CONECT 51 50 39 52 63 \n", 3072 "CONECT 52 51 40 53 64 \n", 3073 "CONECT 53 52 41 54 65 \n", 3074 "CONECT 54 53 42 55 66 \n", 3075 "CONECT 55 54 43 56 67 \n", 3076 "CONECT 56 55 44 57 68 \n", 3077 "CONECT 57 56 45 58 69 \n", 3078 "CONECT 58 57 46 59 70 \n", 3079 "CONECT 59 58 47 60 71 \n", 3080 "CONECT 60 59 48 61 72 \n", 3081 "CONECT 61 60 49 73 \n", 3082 "CONECT 62 50 63 74 \n", 3083 "CONECT 63 62 51 64 75 \n", 3084 "CONECT 64 63 52 65 76 \n", 3085 "CONECT 65 64 53 66 77 \n", 3086 "CONECT 66 65 54 67 78 \n", 3087 "CONECT 67 66 55 68 79 \n", 3088 "CONECT 68 67 56 69 80 \n", 3089 "CONECT 69 68 57 70 81 \n", 3090 "CONECT 70 69 58 71 82 \n", 3091 "CONECT 71 70 59 72 83 \n", 3092 "CONECT 72 71 60 73 84 \n", 3093 "CONECT 73 72 61 85 \n", 3094 "CONECT 74 62 75 86 \n", 3095 "CONECT 75 74 63 76 87 \n", 3096 "CONECT 76 75 64 77 88 \n", 3097 "CONECT 77 76 65 78 89 \n", 3098 "CONECT 78 77 66 79 90 \n", 3099 "CONECT 79 78 67 80 91 \n", 3100 "CONECT 80 79 68 81 92 \n", 3101 "CONECT 81 80 69 82 93 \n", 3102 "CONECT 82 81 70 83 94 \n", 3103 "CONECT 83 82 71 84 95 \n", 3104 "CONECT 84 83 72 85 96 \n", 3105 "CONECT 85 84 73 97 \n", 3106 "CONECT 86 74 87 98 \n", 3107 "CONECT 87 86 75 88 99 \n", 3108 "CONECT 88 87 76 89 100 \n", 3109 "CONECT 89 88 77 90 101 \n", 3110 "CONECT 90 89 78 91 102 \n", 3111 "CONECT 91 90 79 92 103 \n", 3112 "CONECT 92 91 80 93 104 \n", 3113 "CONECT 93 92 81 94 105 \n", 3114 "CONECT 94 93 82 95 106 \n", 3115 "CONECT 95 94 83 96 107 \n", 3116 "CONECT 96 95 84 97 108 \n", 3117 "CONECT 97 96 85 109 \n", 3118 "CONECT 98 86 99 110 \n", 3119 "CONECT 99 98 87 100 111 \n", 3120 "CONECT 100 99 88 101 112 \n", 3121 "CONECT 101 100 89 102 113 \n", 3122 "CONECT 102 101 90 103 114 \n", 3123 "CONECT 103 102 91 104 115 \n", 3124 "CONECT 104 103 92 105 116 \n", 3125 "CONECT 105 104 93 106 117 \n", 3126 "CONECT 106 105 94 107 118 \n", 3127 "CONECT 107 106 95 108 119 \n", 3128 "CONECT 108 107 96 109 120 \n", 3129 "CONECT 109 108 97 121 \n", 3130 "CONECT 110 98 111 122 \n", 3131 "CONECT 111 110 99 112 123 \n", 3132 "CONECT 112 111 100 113 124 \n", 3133 "CONECT 113 112 101 114 125 \n", 3134 "CONECT 114 113 102 115 126 \n", 3135 "CONECT 115 114 103 116 127 \n", 3136 "CONECT 116 115 104 117 128 \n", 3137 "CONECT 117 116 105 118 129 \n", 3138 "CONECT 118 117 106 119 130 \n", 3139 "CONECT 119 118 107 120 131 \n", 3140 "CONECT 120 119 108 121 132 \n", 3141 "CONECT 121 120 109 133 \n", 3142 "CONECT 122 110 123 134 \n", 3143 "CONECT 123 122 111 124 135 \n", 3144 "CONECT 124 123 112 125 136 \n", 3145 "CONECT 125 124 113 126 137 \n", 3146 "CONECT 126 125 114 127 138 \n", 3147 "CONECT 127 126 115 128 139 \n", 3148 "CONECT 128 127 116 129 140 \n", 3149 "CONECT 129 128 117 130 141 \n", 3150 "CONECT 130 129 118 131 142 \n", 3151 "CONECT 131 130 119 132 143 \n", 3152 "CONECT 132 131 120 133 144 \n", 3153 "CONECT 133 132 121 145 \n", 3154 "CONECT 134 122 135 146 \n", 3155 "CONECT 135 134 123 136 147 \n", 3156 "CONECT 136 135 124 137 148 \n", 3157 "CONECT 137 136 125 138 149 \n", 3158 "CONECT 138 137 126 139 150 \n", 3159 "CONECT 139 138 127 140 151 \n", 3160 "CONECT 140 139 128 141 152 \n", 3161 "CONECT 141 140 129 142 153 \n", 3162 "CONECT 142 141 130 143 154 \n", 3163 "CONECT 143 142 131 144 155 \n", 3164 "CONECT 144 143 132 145 156 \n", 3165 "CONECT 145 144 133 157 \n", 3166 "CONECT 146 134 147 158 \n", 3167 "CONECT 147 146 135 148 159 \n", 3168 "CONECT 148 147 136 149 160 \n", 3169 "CONECT 149 148 137 150 161 \n", 3170 "CONECT 150 149 138 151 162 \n", 3171 "CONECT 151 150 139 152 163 \n", 3172 "CONECT 152 151 140 153 164 \n", 3173 "CONECT 153 152 141 154 165 \n", 3174 "CONECT 154 153 142 155 166 \n", 3175 "CONECT 155 154 143 156 167 \n", 3176 "CONECT 156 155 144 157 168 \n", 3177 "CONECT 157 156 145 169 \n", 3178 "CONECT 158 146 159 170 \n", 3179 "CONECT 159 158 147 160 171 \n", 3180 "CONECT 160 159 148 161 172 \n", 3181 "CONECT 161 160 149 162 173 \n", 3182 "CONECT 162 161 150 163 174 \n", 3183 "CONECT 163 162 151 164 175 \n", 3184 "CONECT 164 163 152 165 176 \n", 3185 "CONECT 165 164 153 166 177 \n", 3186 "CONECT 166 165 154 167 178 \n", 3187 "CONECT 167 166 155 168 179 \n", 3188 "CONECT 168 167 156 169 180 \n", 3189 "CONECT 169 168 157 181 \n", 3190 "CONECT 170 158 171 182 \n", 3191 "CONECT 171 170 159 172 183 \n", 3192 "CONECT 172 171 160 173 184 \n", 3193 "CONECT 173 172 161 174 185 \n", 3194 "CONECT 174 173 162 175 186 \n", 3195 "CONECT 175 174 163 176 187 \n", 3196 "CONECT 176 175 164 177 188 \n", 3197 "CONECT 177 176 165 178 189 \n", 3198 "CONECT 178 177 166 179 190 \n", 3199 "CONECT 179 178 167 180 191 \n", 3200 "CONECT 180 179 168 181 192 \n", 3201 "CONECT 181 180 169 193 \n", 3202 "CONECT 182 170 183 194 \n", 3203 "CONECT 183 182 171 184 195 \n", 3204 "CONECT 184 183 172 185 196 \n", 3205 "CONECT 185 184 173 186 197 \n", 3206 "CONECT 186 185 174 187 198 \n", 3207 "CONECT 187 186 175 188 199 \n", 3208 "CONECT 188 187 176 189 200 \n", 3209 "CONECT 189 188 177 190 201 \n", 3210 "CONECT 190 189 178 191 202 \n", 3211 "CONECT 191 190 179 192 203 \n", 3212 "CONECT 192 191 180 193 204 \n", 3213 "CONECT 193 192 181 205 \n", 3214 "CONECT 194 182 195 206 \n", 3215 "CONECT 195 194 183 196 207 \n", 3216 "CONECT 196 195 184 197 208 \n", 3217 "CONECT 197 196 185 198 209 \n", 3218 "CONECT 198 197 186 199 210 \n", 3219 "CONECT 199 198 187 200 211 \n", 3220 "CONECT 200 199 188 201 212 \n", 3221 "CONECT 201 200 189 202 213 \n", 3222 "CONECT 202 201 190 203 214 \n", 3223 "CONECT 203 202 191 204 215 \n", 3224 "CONECT 204 203 192 205 216 \n", 3225 "CONECT 205 204 193 217 \n", 3226 "CONECT 206 194 207 218 \n", 3227 "CONECT 207 206 195 208 219 \n", 3228 "CONECT 208 207 196 209 220 \n", 3229 "CONECT 209 208 197 210 221 \n", 3230 "CONECT 210 209 198 211 222 \n", 3231 "CONECT 211 210 199 212 223 \n", 3232 "CONECT 212 211 200 213 224 \n", 3233 "CONECT 213 212 201 214 225 \n", 3234 "CONECT 214 213 202 215 226 \n", 3235 "CONECT 215 214 203 216 227 \n", 3236 "CONECT 216 215 204 217 228 \n", 3237 "CONECT 217 216 205 229 \n", 3238 "CONECT 218 206 219 230 \n", 3239 "CONECT 219 218 207 220 231 \n", 3240 "CONECT 220 219 208 221 232 \n", 3241 "CONECT 221 220 209 222 233 \n", 3242 "CONECT 222 221 210 223 234 \n", 3243 "CONECT 223 222 211 224 235 \n", 3244 "CONECT 224 223 212 225 236 \n", 3245 "CONECT 225 224 213 226 237 \n", 3246 "CONECT 226 225 214 227 238 \n", 3247 "CONECT 227 226 215 228 239 \n", 3248 "CONECT 228 227 216 229 240 \n", 3249 "CONECT 229 228 217 241 \n", 3250 "CONECT 230 218 2 231 \n", 3251 "CONECT 231 230 219 3 232 \n", 3252 "CONECT 232 231 220 4 233 \n", 3253 "CONECT 233 232 221 5 234 \n", 3254 "CONECT 234 233 222 6 235 \n", 3255 "CONECT 235 234 223 7 236 \n", 3256 "CONECT 236 235 224 8 237 \n", 3257 "CONECT 237 236 225 9 238 \n", 3258 "CONECT 238 237 226 10 239 \n", 3259 "CONECT 239 238 227 11 240 \n", 3260 "CONECT 240 239 228 12 241 \n", 3261 "CONECT 241 240 229 13 \n", 3262 "MASTER 0 0 2 0 0 0 0 0 241 0 240 0 \n", 3263 "END \n" 3264 ] 3265 3266 # Check the data. 3267 self.strip_remarks(lines) 3268 self.assertEqual(len(real_data), len(lines)) 3269 for i in range(len(lines)): 3270 self.assertEqual(real_data[i], lines[i])
3271 3272
3273 - def test_delete_atom(self):
3274 """Test the deletion of a single atom using the U{structure.delete user function<http://www.nmr-relax.com/manual/structure_delete.html>}""" 3275 3276 # Load the test structure. 3277 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'diffusion_tensor'+sep+'sphere' 3278 self.interpreter.structure.read_pdb(file='uniform.pdb', dir=path) 3279 3280 # Delete some atoms, testing different combinations. 3281 self.interpreter.structure.delete(atom_id=':4@N', verbosity=1) 3282 self.interpreter.structure.delete(atom_id=':19', verbosity=1) 3283 self.interpreter.structure.delete(atom_id=':16@H', verbosity=1) 3284 self.interpreter.structure.delete(atom_id=':21-100', verbosity=1) 3285 3286 # The expected atomic data after deletion. 3287 data = [ 3288 ["N", "PRO", 1, 0.000, 0.000, -10.000, 0, [1]], 3289 ["H", "PRO", 1, 0.000, 0.000, -11.020, 1, [0]], 3290 ["N", "PRO", 2, 7.454, 0.000, -6.667, 2, [3]], 3291 ["H", "PRO", 2, 8.214, 0.000, -7.347, 3, [2]], 3292 ["N", "ILE", 3, 10.000, 0.000, 0.000, 4, [5]], 3293 ["H", "ILE", 3, 11.020, 0.000, 0.000, 5, [4]], 3294 ["H", "VAL", 4, 8.214, 0.000, 7.347, 6, []], 3295 ["N", "VAL", 5, 0.000, 0.000, 10.000, 7, [8]], 3296 ["H", "VAL", 5, 0.000, 0.000, 11.020, 8, [7]], 3297 ["N", "ASN", 6, 0.000, 0.000, -10.000, 9, [10]], 3298 ["H", "ASN", 6, 0.000, 0.000, -11.020, 10, [9]], 3299 ["N", "SER", 7, 3.727, 6.455, -6.667, 11, [12]], 3300 ["H", "SER", 7, 4.107, 7.113, -7.347, 12, [11]], 3301 ["N", "LEU", 8, 5.000, 8.660, 0.000, 13, [14]], 3302 ["H", "LEU", 8, 5.510, 9.544, 0.000, 14, [13]], 3303 ["N", "SER", 9, 3.727, 6.455, 6.667, 15, [16]], 3304 ["H", "SER", 9, 4.107, 7.113, 7.347, 16, [15]], 3305 ["N", "ASN", 10, 0.000, 0.000, 10.000, 17, [18]], 3306 ["H", "ASN", 10, 0.000, 0.000, 11.020, 18, [17]], 3307 ["N", "PHE", 11, -0.000, 0.000, -10.000, 19, [20]], 3308 ["H", "PHE", 11, -0.000, 0.000, -11.020, 20, [19]], 3309 ["N", "ALA", 12, -3.727, 6.455, -6.667, 21, [22]], 3310 ["H", "ALA", 12, -4.107, 7.113, -7.347, 22, [21]], 3311 ["N", "ILE", 13, -5.000, 8.660, 0.000, 23, [24]], 3312 ["H", "ILE", 13, -5.510, 9.544, 0.000, 24, [23]], 3313 ["N", "GLY", 14, -3.727, 6.455, 6.667, 25, [26]], 3314 ["H", "GLY", 14, -4.107, 7.113, 7.347, 26, [25]], 3315 ["N", "SER", 15, -0.000, 0.000, 10.000, 27, [28]], 3316 ["H", "SER", 15, -0.000, 0.000, 11.020, 28, [27]], 3317 ["N", "PHE", 16, -0.000, 0.000, -10.000, 29, []], 3318 ["N", "VAL", 17, -7.454, 0.000, -6.667, 30, [31]], 3319 ["H", "VAL", 17, -8.214, 0.000, -7.347, 31, [30]], 3320 ["N", "ILE", 18, -10.000, 0.000, 0.000, 32, [33]], 3321 ["H", "ILE", 18, -11.020, 0.000, 0.000, 33, [32]], 3322 ["N", "LEU", 20, -0.000, 0.000, 10.000, 34, [35]], 3323 ["H", "LEU", 20, -0.000, 0.000, 11.020, 35, [34]] 3324 ] 3325 3326 # The selection object. 3327 selection = cdp.structure.selection() 3328 3329 # Check the structural object. 3330 mol = cdp.structure.structural_data[0].mol[0] 3331 self.assertEqual(len(data), len(mol.atom_name)) 3332 for i in range(len(mol.atom_name)): 3333 print("Checking :%i@%s" % (data[i][2], data[i][0])) 3334 self.assertEqual(mol.atom_name[i], data[i][0]) 3335 self.assertEqual(mol.res_name[i], data[i][1]) 3336 self.assertEqual(mol.res_num[i], data[i][2]) 3337 self.assertEqual(mol.x[i], data[i][3]) 3338 self.assertEqual(mol.y[i], data[i][4]) 3339 self.assertEqual(mol.z[i], data[i][5]) 3340 self.assertEqual(mol.bonded[i], data[i][7]) 3341 3342 # Output PDB to stdout to help in debugging. 3343 self.interpreter.structure.write_pdb(file=sys.stdout) 3344 3345 # Write out the file. 3346 self.tmpfile = mktemp() + '.pdb' 3347 self.interpreter.structure.write_pdb(self.tmpfile) 3348 3349 # Read the contents of the file. 3350 file = open(self.tmpfile) 3351 lines = file.readlines() 3352 file.close() 3353 3354 # Check the CONECT records. 3355 print("\nChecking CONECT records from the structure.write user function:") 3356 connected = [ 3357 [ 0, 1], 3358 [ 1, 0], 3359 [ 2, 3], 3360 [ 3, 2], 3361 [ 4, 5], 3362 [ 5, 4], 3363 [ 7, 8], 3364 [ 8, 7], 3365 [ 9, 10], 3366 [10, 9], 3367 [11, 12], 3368 [12, 11], 3369 [13, 14], 3370 [14, 13], 3371 [15, 16], 3372 [16, 15], 3373 [17, 18], 3374 [18, 17], 3375 [19, 20], 3376 [20, 19], 3377 [21, 22], 3378 [22, 21], 3379 [23, 24], 3380 [24, 23], 3381 [25, 26], 3382 [26, 25], 3383 [27, 28], 3384 [28, 27], 3385 [30, 31], 3386 [31, 30], 3387 [32, 33], 3388 [33, 32], 3389 [34, 35], 3390 [35, 34] 3391 ] 3392 i = 0 3393 for line in lines: 3394 # Not a CONECT record. 3395 if not search('^CONECT', line): 3396 continue 3397 3398 # Debugging printout. 3399 sys.stdout.write(line) 3400 3401 # Split up the line. 3402 row = line.split() 3403 3404 # Check and increment. 3405 self.assertEqual(int(row[1]), connected[i][0]+1) 3406 self.assertEqual(int(row[2]), connected[i][1]+1) 3407 i += 1
3408 3409
3410 - def test_delete_empty(self):
3411 """Test the deletion of non-existent structural data.""" 3412 3413 # Delete all structural data. 3414 self.interpreter.structure.delete()
3415 3416
3417 - def test_delete_model(self):
3418 """Test the deletion of a single structural model.""" 3419 3420 # Path of the structure file. 3421 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 3422 3423 # Load the file as two models. 3424 self.interpreter.structure.read_pdb('Ap4Aase_res1-12.pdb', dir=path, set_model_num=1) 3425 self.interpreter.structure.read_pdb('Ap4Aase_res1-12.pdb', dir=path, set_model_num=2) 3426 3427 # Test the structure metadata. 3428 self.assert_(hasattr(cdp, 'structure')) 3429 self.assert_(hasattr(cdp.structure, 'structural_data')) 3430 self.assertEqual(len(cdp.structure.structural_data), 2) 3431 self.assertEqual(cdp.structure.structural_data[0].num, 1) 3432 self.assertEqual(cdp.structure.structural_data[1].num, 2) 3433 3434 # Delete model 1. 3435 self.interpreter.structure.delete(model=1) 3436 3437 # Test the structure metadata. 3438 self.assert_(hasattr(cdp, 'structure')) 3439 self.assert_(hasattr(cdp.structure, 'structural_data')) 3440 self.assertEqual(len(cdp.structure.structural_data), 1) 3441 self.assertEqual(cdp.structure.structural_data[0].num, 2) 3442 3443 # Load another model, then delete it. 3444 self.interpreter.structure.read_pdb('Ap4Aase_res1-12.pdb', dir=path, set_model_num=3) 3445 self.interpreter.structure.delete(model=3) 3446 3447 # Test the structure metadata. 3448 self.assert_(hasattr(cdp, 'structure')) 3449 self.assert_(hasattr(cdp.structure, 'structural_data')) 3450 self.assertEqual(len(cdp.structure.structural_data), 1) 3451 self.assertEqual(cdp.structure.structural_data[0].num, 2) 3452 3453 # Load another model, then delete number 2. 3454 self.interpreter.structure.read_pdb('Ap4Aase_res1-12.pdb', dir=path, set_model_num=10) 3455 self.interpreter.structure.delete(model=2) 3456 3457 # Test the structure metadata. 3458 self.assert_(hasattr(cdp, 'structure')) 3459 self.assert_(hasattr(cdp.structure, 'structural_data')) 3460 self.assertEqual(len(cdp.structure.structural_data), 1) 3461 self.assertEqual(cdp.structure.structural_data[0].num, 10)
3462 3463
3464 - def test_delete_multi_pipe(self):
3465 """Test the deletion of structural data in only one pipe.""" 3466 3467 # Create a structure with a single atom. 3468 self.interpreter.structure.add_atom(atom_name='PIV', res_name='M1', res_num=1, pos=[0., 1., 2.], element='S') 3469 3470 # Create a new data pipe. 3471 self.interpreter.pipe.create('new', 'N-state') 3472 3473 # Create a structure with a single atom. 3474 self.interpreter.structure.add_atom(atom_name='PIV', res_name='M1', res_num=2, pos=[4., 5., 6.], element='S') 3475 3476 # Delete all structural data. 3477 self.interpreter.structure.delete() 3478 3479 # Checks. 3480 self.assert_(hasattr(cdp, 'structure')) 3481 self.assertEqual(len(cdp.structure.structural_data), 0) 3482 self.interpreter.pipe.switch('mf') 3483 self.assert_(hasattr(cdp, 'structure')) 3484 self.assertEqual(len(cdp.structure.structural_data), 1)
3485 3486
3487 - def test_displacement(self):
3488 """Test of the structure.displacement user function.""" 3489 3490 # Path of the structure file. 3491 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 3492 3493 # Load the file as two models. 3494 self.interpreter.structure.read_pdb('Ap4Aase_res1-12.pdb', dir=path, set_model_num=1) 3495 self.interpreter.structure.read_pdb('Ap4Aase_res1-12.pdb', dir=path, set_model_num=2) 3496 3497 # A rotation. 3498 R = zeros((3, 3), float64) 3499 euler_to_R_zyz(1.3, 0.4, 4.5, R) 3500 3501 # Rotate the second model. 3502 self.interpreter.structure.rotate(R, model=2) 3503 3504 # Calculate the displacement. 3505 self.interpreter.structure.displacement() 3506 3507 # Shift a third structure back using the calculated displacement. 3508 self.interpreter.structure.read_pdb('Ap4Aase_res1-12.pdb', dir=path, set_model_num=3) 3509 self.interpreter.structure.rotate(R, model=3) 3510 3511 # The data to check. 3512 ids = ['model 1, Ap4Aase_res1-12_mol1', 'model 2, Ap4Aase_res1-12_mol1'] 3513 trans_vect = [ 3514 [[0.0, 0.0, 0.0], 3515 [ 2.270857972754659, -1.811667138656451, 1.878400649688508]], 3516 [[ -2.270857972754659, 1.811667138656451, -1.878400649688508], 3517 [0.0, 0.0, 0.0]] 3518 ] 3519 dist = [ 3520 [0.0000000000000000, 3.4593818457148173], 3521 [3.4593818457148173, 0.0000000000000000] 3522 ] 3523 rot_axis = [ 3524 [None, 3525 [ 0.646165066909452, 0.018875759848125, -0.762964227206007]], 3526 [[ -0.646165066909452, -0.018875759848125, 0.762964227206007], 3527 None] 3528 ] 3529 angle = [ 3530 [0.0000000000000000, 0.6247677290742989], 3531 [0.6247677290742989, 0.0000000000000000] 3532 ] 3533 3534 # Test the results. 3535 self.assert_(hasattr(cdp.structure, 'displacements')) 3536 for i in range(len(ids)): 3537 for j in range(len(ids)): 3538 # Check the translation. 3539 self.assertAlmostEqual(cdp.structure.displacements._translation_distance[ids[i]][ids[j]], dist[i][j]) 3540 for k in range(3): 3541 self.assertAlmostEqual(cdp.structure.displacements._translation_vector[ids[i]][ids[j]][k], trans_vect[i][j][k]) 3542 3543 # Check the rotation. 3544 self.assertAlmostEqual(cdp.structure.displacements._rotation_angle[ids[i]][ids[j]], angle[i][j]) 3545 if rot_axis[i][j] != None: 3546 for k in range(3): 3547 self.assertAlmostEqual(cdp.structure.displacements._rotation_axis[ids[i]][ids[j]][k], rot_axis[i][j][k]) 3548 3549 # Save the results. 3550 self.tmpfile = mktemp() 3551 self.interpreter.state.save(self.tmpfile, dir=None, force=True) 3552 3553 # Reset relax. 3554 self.interpreter.reset() 3555 3556 # Load the results. 3557 self.interpreter.state.load(self.tmpfile) 3558 3559 # Test the re-loaded data. 3560 self.assert_(hasattr(cdp.structure, 'displacements')) 3561 for i in range(len(ids)): 3562 for j in range(len(ids)): 3563 # Check the translation. 3564 self.assertAlmostEqual(cdp.structure.displacements._translation_distance[ids[i]][ids[j]], dist[i][j]) 3565 for k in range(3): 3566 self.assertAlmostEqual(cdp.structure.displacements._translation_vector[ids[i]][ids[j]][k], trans_vect[i][j][k]) 3567 3568 # Check the rotation. 3569 self.assertAlmostEqual(cdp.structure.displacements._rotation_angle[ids[i]][ids[j]], angle[i][j]) 3570 if rot_axis[i][j] != None: 3571 for k in range(3): 3572 self.assertAlmostEqual(cdp.structure.displacements._rotation_axis[ids[i]][ids[j]][k], rot_axis[i][j][k])
3573 3574
3576 """Test of the structure.displacement user function for different molecules in one pipe. 3577 3578 This checks the molecules argument of the U{structure.displacement user function<http://www.nmr-relax.com/manual/structure_displacement.html>}. 3579 """ 3580 3581 # Path of the structure file. 3582 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 3583 3584 # Load the file as two molecules. 3585 self.interpreter.structure.read_pdb('Ap4Aase_res1-12.pdb', dir=path, set_mol_name='1') 3586 self.interpreter.structure.read_pdb('Ap4Aase_res1-12.pdb', dir=path, set_mol_name='2') 3587 3588 # A rotation. 3589 R = zeros((3, 3), float64) 3590 euler_to_R_zyz(1.3, 0.4, 4.5, R) 3591 3592 # Rotate the second molecule. 3593 self.interpreter.structure.rotate(R, atom_id='#2') 3594 3595 # Calculate the displacement. 3596 self.interpreter.structure.displacement(molecules=[['1', '2']]) 3597 3598 # Shift a third structure back using the calculated displacement. 3599 self.interpreter.structure.read_pdb('Ap4Aase_res1-12.pdb', dir=path, set_mol_name='3') 3600 self.interpreter.structure.rotate(R, atom_id='#3') 3601 3602 # The data to check. 3603 ids = ['1', '2'] 3604 trans_vect = [ 3605 [[0.0, 0.0, 0.0], 3606 [ 2.270857972754659, -1.811667138656451, 1.878400649688508]], 3607 [[ -2.270857972754659, 1.811667138656451, -1.878400649688508], 3608 [0.0, 0.0, 0.0]] 3609 ] 3610 dist = [ 3611 [0.0000000000000000, 3.4593818457148173], 3612 [3.4593818457148173, 0.0000000000000000] 3613 ] 3614 rot_axis = [ 3615 [None, 3616 [ 0.646165066909452, 0.018875759848125, -0.762964227206007]], 3617 [[ -0.646165066909452, -0.018875759848125, 0.762964227206007], 3618 None] 3619 ] 3620 angle = [ 3621 [0.0000000000000000, 0.6247677290742989], 3622 [0.6247677290742989, 0.0000000000000000] 3623 ] 3624 3625 # Test the results. 3626 self.assert_(hasattr(cdp.structure, 'displacements')) 3627 for i in range(len(ids)): 3628 for j in range(len(ids)): 3629 # Check the translation. 3630 self.assertAlmostEqual(cdp.structure.displacements._translation_distance[ids[i]][ids[j]], dist[i][j]) 3631 for k in range(3): 3632 self.assertAlmostEqual(cdp.structure.displacements._translation_vector[ids[i]][ids[j]][k], trans_vect[i][j][k]) 3633 3634 # Check the rotation. 3635 self.assertAlmostEqual(cdp.structure.displacements._rotation_angle[ids[i]][ids[j]], angle[i][j]) 3636 if rot_axis[i][j] != None: 3637 for k in range(3): 3638 self.assertAlmostEqual(cdp.structure.displacements._rotation_axis[ids[i]][ids[j]][k], rot_axis[i][j][k]) 3639 3640 # Save the results. 3641 self.tmpfile = mktemp() 3642 self.interpreter.state.save(self.tmpfile, dir=None, force=True) 3643 3644 # Reset relax. 3645 self.interpreter.reset() 3646 3647 # Load the results. 3648 self.interpreter.state.load(self.tmpfile) 3649 3650 # Test the re-loaded data. 3651 self.assert_(hasattr(cdp.structure, 'displacements')) 3652 for i in range(len(ids)): 3653 for j in range(len(ids)): 3654 # Check the translation. 3655 self.assertAlmostEqual(cdp.structure.displacements._translation_distance[ids[i]][ids[j]], dist[i][j]) 3656 for k in range(3): 3657 self.assertAlmostEqual(cdp.structure.displacements._translation_vector[ids[i]][ids[j]][k], trans_vect[i][j][k]) 3658 3659 # Check the rotation. 3660 self.assertAlmostEqual(cdp.structure.displacements._rotation_angle[ids[i]][ids[j]], angle[i][j]) 3661 if rot_axis[i][j] != None: 3662 for k in range(3): 3663 self.assertAlmostEqual(cdp.structure.displacements._rotation_axis[ids[i]][ids[j]][k], rot_axis[i][j][k])
3664 3665
3666 - def test_find_pivot(self):
3667 """Test the structure.find_pivot user function. 3668 3669 This checks the default operation of the U{structure.find_pivot user function<http://www.nmr-relax.com/manual/structure_find_pivot.html>}. 3670 """ 3671 3672 # Path of the PDB file. 3673 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 3674 3675 # Load the PDB three times as different models. 3676 self.interpreter.structure.read_pdb('Ap4Aase_res1-12.pdb', dir=path, set_model_num=1) 3677 self.interpreter.structure.read_pdb('Ap4Aase_res1-12.pdb', dir=path, set_model_num=2) 3678 self.interpreter.structure.read_pdb('Ap4Aase_res1-12.pdb', dir=path, set_model_num=3) 3679 3680 # Rotate two of the models (the pivot will be the origin). 3681 pivot = [1., 2., 3.] 3682 R = zeros((3, 3), float64) 3683 axis_angle_to_R(array([1, 0, 0], float64), 0.1, R) 3684 self.interpreter.structure.rotate(R=R, model=2, origin=pivot) 3685 axis_angle_to_R(array([0, 1, 0], float64), 0.2, R) 3686 self.interpreter.structure.rotate(R=R, model=3, origin=pivot) 3687 3688 # Find the pivot. 3689 self.interpreter.structure.find_pivot(init_pos=[0.95, 2.05, 3.02]) 3690 3691 # Check the pivot. 3692 self.assertAlmostEqual(cdp.structure.pivot[0], pivot[0], 3) 3693 self.assertAlmostEqual(cdp.structure.pivot[1], pivot[1], 3) 3694 self.assertAlmostEqual(cdp.structure.pivot[2], pivot[2], 3)
3695 3696
3697 - def test_find_pivot_molecules(self):
3698 """Test the structure.find_pivot user function. 3699 3700 This checks the U{structure.find_pivot user function<http://www.nmr-relax.com/manual/structure_find_pivot.html>} when the molecules argument is given. 3701 """ 3702 3703 # Path of the PDB file. 3704 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'diffusion_tensor'+sep+'sphere' 3705 3706 # Load the PDB twice as different molecules. 3707 self.interpreter.structure.read_pdb('uniform.pdb', dir=path, set_mol_name='X') 3708 self.interpreter.structure.read_pdb('uniform.pdb', dir=path, set_mol_name='Y') 3709 self.interpreter.structure.read_pdb('uniform.pdb', dir=path, set_mol_name='Z') 3710 3711 # Delete some structural info. 3712 self.interpreter.structure.delete("#X:8") 3713 self.interpreter.structure.delete("#X:2@N") 3714 self.interpreter.structure.delete("#Y:12") 3715 self.interpreter.structure.delete("#Y:20@H") 3716 3717 # Rotate two of the models (the pivot will be the origin). 3718 pivot = [1., 2., 3.] 3719 R = zeros((3, 3), float64) 3720 axis_angle_to_R(array([1, 0, 0], float64), 0.1, R) 3721 self.interpreter.structure.rotate(R=R, atom_id='#Y', origin=pivot) 3722 axis_angle_to_R(array([0, 1, 0], float64), 0.2, R) 3723 self.interpreter.structure.rotate(R=R, atom_id='#Z', origin=pivot) 3724 3725 # Find the pivot. 3726 self.interpreter.structure.find_pivot(molecules=[['X', 'Y', 'Z']], init_pos=[0.95, 2.05, 3.02], func_tol=1e-7) 3727 3728 # Check the pivot. 3729 self.assertAlmostEqual(cdp.structure.pivot[0], pivot[0], 3) 3730 self.assertAlmostEqual(cdp.structure.pivot[1], pivot[1], 3) 3731 self.assertAlmostEqual(cdp.structure.pivot[2], pivot[2], 3)
3732 3733
3734 - def test_get_model(self):
3735 """Test the get_model() method of the internal structural object.""" 3736 3737 # Create 2 models. 3738 self.interpreter.structure.add_model(model_num=1) 3739 self.interpreter.structure.add_model(model_num=2) 3740 3741 # Get the first model. 3742 model = cdp.structure.get_model(1) 3743 3744 # Check it. 3745 self.assertNotEqual(model, None) 3746 self.assertEqual(model.num, 1) 3747 self.assertEqual(len(model.mol), 0)
3748 3749
3750 - def test_load_internal_results(self):
3751 """Load the PDB file using the information in a results file (using the internal structural object).""" 3752 3753 # Path of the files. 3754 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 3755 3756 # Read the results file. 3757 self.interpreter.results.read(file='str_internal', dir=path) 3758 3759 # Test the structure metadata. 3760 self.assert_(hasattr(cdp, 'structure')) 3761 self.assert_(hasattr(cdp.structure, 'structural_data')) 3762 self.assert_(len(cdp.structure.structural_data)) 3763 self.assert_(len(cdp.structure.structural_data[0].mol)) 3764 3765 mol = cdp.structure.structural_data[0].mol[0] 3766 self.assertEqual(mol.file_name, 'Ap4Aase_res1-12.pdb') 3767 self.assertEqual(mol.file_path, '') 3768 self.assertEqual(mol.file_model, 1) 3769 self.assertEqual(mol.file_mol_num, 1) 3770 3771 # The real atomic data. 3772 atom_name = ['N', 'CA', '1HA', '2HA', 'C', 'O', '1HT', '2HT', '3HT', 'N', 'CD', 'CA', 'HA', 'CB', '1HB', '2HB', 'CG', '1HG', '2HG', '1HD', '2HD', 'C', 'O', 'N', 'H', 'CA', 'HA', 'CB', '1HB', '2HB', 'CG', 'HG', 'CD1', '1HD1', '2HD1', '3HD1', 'CD2', '1HD2', '2HD2', '3HD2', 'C', 'O', 'N', 'H', 'CA', '1HA', '2HA', 'C', 'O', 'N', 'H', 'CA', 'HA', 'CB', '1HB', '2HB', 'OG', 'HG', 'C', 'O', 'N', 'H', 'CA', 'HA', 'CB', '1HB', '2HB', 'CG', '1HG', '2HG', 'SD', 'CE', '1HE', '2HE', '3HE', 'C', 'O', 'N', 'H', 'CA', 'HA', 'CB', '1HB', '2HB', 'CG', 'OD1', 'OD2', 'C', 'O', 'N', 'H', 'CA', 'HA', 'CB', '1HB', '2HB', 'OG', 'HG', 'C', 'O', 'N', 'CD', 'CA', 'HA', 'CB', '1HB', '2HB', 'CG', '1HG', '2HG', '1HD', '2HD', 'C', 'O', 'N', 'CD', 'CA', 'HA', 'CB', '1HB', '2HB', 'CG', '1HG', '2HG', '1HD', '2HD', 'C', 'O', 'N', 'H', 'CA', 'HA', 'CB', '1HB', '2HB', 'CG', '1HG', '2HG', 'CD', 'OE1', 'OE2', 'C', 'O', 'N', 'H', 'CA', '1HA', '2HA', 'C', 'O'] 3773 bonded = [[]]*174 3774 element = ['N', 'C', 'H', 'H', 'C', 'O', 'H', 'H', 'H', 'N', 'C', 'C', 'H', 'C', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'C', 'O', 'N', 'H', 'C', 'H', 'C', 'H', 'H', 'C', 'H', 'C', 'H', 'H', 'H', 'C', 'H', 'H', 'H', 'C', 'O', 'N', 'H', 'C', 'H', 'H', 'C', 'O', 'N', 'H', 'C', 'H', 'C', 'H', 'H', 'O', 'H', 'C', 'O', 'N', 'H', 'C', 'H', 'C', 'H', 'H', 'C', 'H', 'H', 'S', 'C', 'H', 'H', 'H', 'C', 'O', 'N', 'H', 'C', 'H', 'C', 'H', 'H', 'C', 'O', 'O', 'C', 'O', 'N', 'H', 'C', 'H', 'C', 'H', 'H', 'O', 'H', 'C', 'O', 'N', 'C', 'C', 'H', 'C', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'C', 'O', 'N', 'C', 'C', 'H', 'C', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'C', 'O', 'N', 'H', 'C', 'H', 'C', 'H', 'H', 'C', 'H', 'H', 'C', 'O', 'O', 'C', 'O', 'N', 'H', 'C', 'H', 'H', 'C', 'O'] 3775 pdb_record = ['ATOM']*174 3776 res_name = ['GLY', 'GLY', 'GLY', 'GLY', 'GLY', 'GLY', 'GLY', 'GLY', 'GLY', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'LEU', 'GLY', 'GLY', 'GLY', 'GLY', 'GLY', 'GLY', 'GLY', 'SER', 'SER', 'SER', 'SER', 'SER', 'SER', 'SER', 'SER', 'SER', 'SER', 'SER', 'MET', 'MET', 'MET', 'MET', 'MET', 'MET', 'MET', 'MET', 'MET', 'MET', 'MET', 'MET', 'MET', 'MET', 'MET', 'MET', 'MET', 'ASP', 'ASP', 'ASP', 'ASP', 'ASP', 'ASP', 'ASP', 'ASP', 'ASP', 'ASP', 'ASP', 'ASP', 'SER', 'SER', 'SER', 'SER', 'SER', 'SER', 'SER', 'SER', 'SER', 'SER', 'SER', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'PRO', 'GLU', 'GLU', 'GLU', 'GLU', 'GLU', 'GLU', 'GLU', 'GLU', 'GLU', 'GLU', 'GLU', 'GLU', 'GLU', 'GLU', 'GLU', 'GLY', 'GLY', 'GLY', 'GLY', 'GLY', 'GLY', 'GLY'] 3777 res_num = [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12] 3778 seg_id = [None]*174 3779 x = [8.442, 7.469, 8.013, 6.825, 6.610, 6.827, 9.398, 8.180, 8.448, 5.613, 5.281, 4.714, 5.222, 3.646, 3.332, 2.800, 4.319, 4.853, 3.587, 6.162, 4.805, 4.075, 3.593, 4.074, 4.475, 3.498, 3.572, 2.025, 1.965, 1.609, 1.176, 1.823, 0.176, 0.096, 0.509, -0.789, 0.474, 0.809, -0.595, 0.707, 4.264, 4.364, 4.809, 4.697, 5.561, 6.220, 6.156, 4.659, 4.746, 3.786, 3.770, 2.851, 2.368, 1.785, 1.177, 1.165, 2.360, 1.690, 3.546, 3.804, 3.814, 3.563, 4.442, 4.984, 5.411, 6.192, 4.872, 6.068, 6.868, 5.332, 6.747, 6.155, 5.409, 6.977, 5.721, 3.369, 2.255, 3.703, 4.604, 2.753, 1.851, 3.329, 4.182, 3.644, 2.319, 1.992, 1.854, 2.419, 1.251, 3.451, 4.359, 3.267, 2.246, 4.223, 4.054, 4.040, 5.573, 6.142, 3.488, 4.276, 2.795, 1.828, 2.929, 2.810, 1.772, 0.912, 2.067, 1.505, 0.464, 2.138, 0.938, 2.273, 4.268, 4.585, 5.076, 4.776, 6.392, 6.925, 7.120, 7.968, 7.464, 6.130, 6.384, 6.135, 4.210, 4.246, 6.325, 5.263, 7.477, 8.281, 7.587, 7.039, 9.047, 9.133, 9.654, 9.590, 10.670, 9.215, 9.190, 10.055, 8.012, 7.007, 7.361, 6.144, 5.925, 5.555, 6.329, 4.814, 4.894, 4.761] 3780 y = [10.188, 9.889, 9.712, 10.745, 8.674, 7.991, 10.291, 11.073, 9.416, 8.385, 9.152, 7.243, 6.302, 7.443, 6.483, 7.963, 8.253, 7.605, 8.842, 9.327, 10.088, 7.251, 8.285, 6.099, 5.309, 5.986, 4.953, 6.396, 7.471, 6.106, 5.775, 5.225, 4.796, 4.954, 3.787, 4.949, 6.853, 7.828, 6.775, 6.720, 6.853, 8.068, 6.222, 5.251, 6.956, 6.273, 7.706, 7.634, 8.841, 6.847, 5.889, 7.360, 6.511, 8.230, 7.620, 8.669, 9.269, 9.652, 8.174, 9.362, 7.546, 6.604, 8.253, 9.095, 7.354, 7.976, 6.886, 6.258, 5.824, 5.499, 6.846, 5.570, 5.985, 5.190, 4.766, 8.771, 8.245, 9.789, 10.161, 10.351, 10.605, 11.610, 11.341, 12.287, 12.322, 11.787, 13.410, 9.322, 9.015, 8.776, 9.052, 7.758, 7.826, 7.990, 8.977, 7.248, 7.894, 8.285, 6.370, 6.214, 5.342, 5.431, 3.973, 3.943, 3.230, 3.234, 2.212, 3.991, 3.892, 3.624, 5.960, 5.908, 3.339, 3.179, 2.980, 3.150, 2.375, 2.876, 2.616, 3.262, 1.675, 3.264, 4.305, 2.758, 4.055, 2.299, 0.876, 0.258, 0.312, 0.871, -1.106, -1.253, -1.489, -2.564, -1.049, -1.041, -1.011, -0.052, -1.970, -2.740, -1.931, -2.037, -1.962, -2.949, -2.983, -3.917, -4.588, -4.488, -3.289, -3.932] 3781 z = [6.302, 7.391, 8.306, 7.526, 7.089, 6.087, 6.697, 5.822, 5.604, 7.943, 9.155, 7.752, 7.908, 8.829, 9.212, 8.407, 9.880, 10.560, 10.415, 9.754, 8.900, 6.374, 5.909, 5.719, 6.139, 4.391, 4.081, 4.415, 4.326, 5.367, 3.307, 2.640, 3.889, 4.956, 3.700, 3.430, 2.493, 2.814, 2.633, 1.449, 3.403, 3.572, 2.369, 2.281, 1.371, 0.855, 1.868, 0.359, 0.149, -0.269, -0.055, -1.268, -1.726, -0.608, 0.037, -1.377, 0.162, 0.731, -2.354, -2.175, -3.496, -3.603, -4.606, -4.199, -5.387, -5.803, -6.196, -4.563, -5.146, -4.350, -3.001, -1.895, -1.241, -1.307, -2.472, -5.551, -5.582, -6.328, -6.269, -7.274, -6.735, -7.913, -8.518, -7.133, -8.791, -9.871, -8.395, -8.346, -8.584, -8.977, -8.732, -10.002, -10.355, -11.174, -11.584, -11.936, -10.759, -11.425, -9.403, -8.469, -9.921, -11.030, -9.410, -8.336, -10.080, -9.428, -10.291, -11.333, -11.606, -12.128, -10.723, -11.893, -9.781, -10.959, -8.768, -7.344, -8.971, -9.765, -7.642, -7.816, -7.251, -6.715, -6.584, -5.765, -7.175, -6.955, -9.288, -9.222, -9.654, -9.696, -10.009, -10.928, -10.249, -10.194, -9.475, -11.596, -11.540, -11.813, -12.724, -13.193, -13.137, -8.947, -7.774, -9.383, -10.338, -8.477, -8.138, -9.017, -7.265, -6.226] 3782 3783 # Test the atomic data. 3784 mol = cdp.structure.structural_data[0].mol[0] 3785 for i in range(len(mol.atom_name)): 3786 self.assertEqual(mol.atom_name[i], atom_name[i]) 3787 self.assertEqual(mol.bonded[i], bonded[i]) 3788 self.assertEqual(mol.element[i], element[i]) 3789 self.assertEqual(mol.pdb_record[i], pdb_record[i]) 3790 self.assertEqual(mol.res_name[i], res_name[i]) 3791 self.assertEqual(mol.res_num[i], res_num[i]) 3792 self.assertEqual(mol.seg_id[i], seg_id[i]) 3793 self.assertEqual(mol.x[i], x[i]) 3794 self.assertEqual(mol.y[i], y[i]) 3795 self.assertEqual(mol.z[i], z[i])
3796 3797
3799 """Load the PDB file using the information in a results file (using the internal structural object).""" 3800 3801 # Path of the files. 3802 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 3803 3804 # Read the results file. 3805 self.interpreter.results.read(file=path+sep+'str_internal')
3806 3807
3808 - def test_load_spins_mol_cat(self):
3809 """Test the loading of spins from different molecules into one molecule container.""" 3810 3811 # Path of the files. 3812 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'lactose' 3813 3814 # Read the PDBs. 3815 self.interpreter.structure.read_pdb(file='lactose_MCMM4_S1_1.pdb', dir=path, set_mol_name='L1') 3816 self.interpreter.structure.read_pdb(file='lactose_MCMM4_S1_2.pdb', dir=path, set_mol_name='L2') 3817 3818 # Load a few protons. 3819 self.interpreter.structure.load_spins('#L1:900@C1', mol_name_target='Lactose') 3820 self.interpreter.structure.load_spins('#L2:900@C2', mol_name_target='Lactose') 3821 3822 # Check the spin data. 3823 self.assertEqual(len(cdp.mol), 1) 3824 self.assertEqual(cdp.mol[0].name, 'Lactose') 3825 self.assertEqual(len(cdp.mol[0].res), 1) 3826 self.assertEqual(cdp.mol[0].res[0].name, 'UNK') 3827 self.assertEqual(cdp.mol[0].res[0].num, 900) 3828 self.assertEqual(len(cdp.mol[0].res[0].spin), 2) 3829 self.assertEqual(cdp.mol[0].res[0].spin[0].name, 'C1') 3830 self.assertEqual(cdp.mol[0].res[0].spin[0].num, 1) 3831 self.assertEqual(cdp.mol[0].res[0].spin[1].name, 'C2') 3832 self.assertEqual(cdp.mol[0].res[0].spin[1].num, 2)
3833 3834
3835 - def test_load_spins_multi_mol(self):
3836 """Test the structure.load_spins user function for loading the same spins from multiple molecules.""" 3837 3838 # Path of the files. 3839 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'lactose' 3840 3841 # Read the PDBs. 3842 self.interpreter.structure.read_pdb(file='lactose_MCMM4_S1_1.pdb', dir=path, set_mol_name='L1') 3843 self.interpreter.structure.read_pdb(file='lactose_MCMM4_S1_2.pdb', dir=path, set_mol_name='L2') 3844 3845 # Delete one of the atoms. 3846 self.interpreter.structure.delete(atom_id='#L2:900@C1') 3847 self.interpreter.structure.delete(atom_id='#L1:900@C3') 3848 3849 # Atom renumbering of the second molecule, to follow from the last atom 103 of the first structure (simulate a single PDB file). 3850 for i in range(len(cdp.structure.structural_data[0].mol[1].atom_num)): 3851 cdp.structure.structural_data[0].mol[1].atom_num[i] = i + 104 3852 3853 # Load a few carbons. 3854 self.interpreter.structure.load_spins(':900@C1,C2,C3', from_mols=['L1', 'L2'], mol_name_target='Lactose') 3855 3856 # Check the sequence data. 3857 self.assertEqual(len(cdp.mol), 1) 3858 self.assertEqual(cdp.mol[0].name, 'Lactose') 3859 self.assertEqual(len(cdp.mol[0].res), 1) 3860 self.assertEqual(cdp.mol[0].res[0].name, 'UNK') 3861 self.assertEqual(cdp.mol[0].res[0].num, 900) 3862 self.assertEqual(len(cdp.mol[0].res[0].spin), 3) 3863 3864 # Check the @C1 spin data. 3865 self.assertEqual(cdp.mol[0].res[0].spin[0].name, 'C1') 3866 self.assertEqual(cdp.mol[0].res[0].spin[0].num, None) 3867 self.assertEqual(len(cdp.mol[0].res[0].spin[0].pos), 2) 3868 self.assertEqual(cdp.mol[0].res[0].spin[0].pos[0][0], 6.250) 3869 self.assertEqual(cdp.mol[0].res[0].spin[0].pos[0][1], 0.948) 3870 self.assertEqual(cdp.mol[0].res[0].spin[0].pos[0][2], 1.968) 3871 self.assertEqual(cdp.mol[0].res[0].spin[0].pos[1], None) 3872 3873 # Check the @C2 spin data. 3874 self.assertEqual(cdp.mol[0].res[0].spin[1].name, 'C2') 3875 self.assertEqual(cdp.mol[0].res[0].spin[1].num, None) 3876 self.assertEqual(len(cdp.mol[0].res[0].spin[1].pos), 2) 3877 self.assertEqual(cdp.mol[0].res[0].spin[1].pos[0][0], 6.250) 3878 self.assertEqual(cdp.mol[0].res[0].spin[1].pos[0][1], 2.488) 3879 self.assertEqual(cdp.mol[0].res[0].spin[1].pos[0][2], 2.102) 3880 self.assertEqual(cdp.mol[0].res[0].spin[1].pos[1][0], 6.824) 3881 self.assertEqual(cdp.mol[0].res[0].spin[1].pos[1][1], 0.916) 3882 self.assertEqual(cdp.mol[0].res[0].spin[1].pos[1][2], 2.283) 3883 3884 # Check the @C3 spin data. 3885 self.assertEqual(cdp.mol[0].res[0].spin[2].name, 'C3') 3886 self.assertEqual(cdp.mol[0].res[0].spin[2].num, None) 3887 self.assertEqual(len(cdp.mol[0].res[0].spin[2].pos), 2) 3888 self.assertEqual(cdp.mol[0].res[0].spin[2].pos[0], None) 3889 self.assertEqual(cdp.mol[0].res[0].spin[2].pos[1][0], 8.062) 3890 self.assertEqual(cdp.mol[0].res[0].spin[2].pos[1][1], 0.431) 3891 self.assertEqual(cdp.mol[0].res[0].spin[2].pos[1][2], 3.048)
3892 3893
3894 - def test_mean(self):
3895 """Test the U{structure.mean user function<http://www.nmr-relax.com/manual/structure_mean.html>}.""" 3896 3897 # Create 2 models. 3898 self.interpreter.structure.add_model(model_num=1) 3899 self.interpreter.structure.add_model(model_num=2) 3900 3901 # Add a single atom. 3902 self.interpreter.structure.add_atom(atom_name='N', res_name='Tyr', res_num=2, pos=[[0., 0., 0.], [1., 2., -2.]], element='N') 3903 self.interpreter.structure.add_atom(atom_name='N', res_name='Phe', res_num=3, pos=[[-1., -2., 2.], [1., 2., -2.]], element='N') 3904 3905 # Calculate the mean. 3906 self.interpreter.structure.mean() 3907 3908 # Test the molecule data. 3909 self.assertEqual(len(cdp.structure.structural_data), 1) 3910 self.assertEqual(len(cdp.structure.structural_data[0].mol), 1) 3911 self.assertEqual(cdp.structure.structural_data[0].num, None) 3912 mol = cdp.structure.structural_data[0].mol[0] 3913 self.assertEqual(len(mol.atom_name), 2) 3914 self.assertEqual(mol.atom_name, ['N', 'N']) 3915 self.assertEqual(mol.atom_num, [None, None]) 3916 self.assertEqual(mol.bonded, [[], []]) 3917 self.assertEqual(mol.element, ['N', 'N']) 3918 self.assertEqual(mol.pdb_record, [None, None]) 3919 self.assertEqual(mol.res_name, ['Tyr', 'Phe']) 3920 self.assertEqual(mol.res_num, [2, 3]) 3921 self.assertEqual(mol.seg_id, [None, None]) 3922 self.assertEqual(mol.x, [0.5, 0.0]) 3923 self.assertEqual(mol.y, [1.0, 0.0]) 3924 self.assertEqual(mol.z, [-1.0, 0.0])
3925 3926
3927 - def test_mean_models(self):
3928 """Test the structure.mean user function for different models. 3929 3930 This checks the molecules argument of the U{structure.mean user function<http://www.nmr-relax.com/manual/structure_mean.html>}. 3931 """ 3932 3933 # Set up 3 models. 3934 self.interpreter.structure.add_model(model_num=1) 3935 self.interpreter.structure.add_model(model_num=2) 3936 self.interpreter.structure.add_model(model_num=4) 3937 3938 # Check that the models were correctly created. 3939 self.assert_(hasattr(cdp, 'structure')) 3940 self.assert_(hasattr(cdp.structure, 'structural_data')) 3941 self.assertEqual(len(cdp.structure.structural_data), 3) 3942 3943 # Create a structure with some atoms. 3944 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=1, pos=[[1., 0., -1.], [0., 0., 0.], [-1., 0., 1.]], element='S') 3945 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=2, pos=[[1., 2., -1.], [0., 2., 0.], [-1., 2., 1.]], element='S') 3946 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=3, pos=[[1., 20., -1.], [0., 20., 0.], [-1., 20., 1.]], element='S') 3947 3948 # Calculate the mean structure and store it as model 3. 3949 self.interpreter.structure.mean(models=[[1, 2, 4]], set_model_num=3) 3950 3951 # The expected data. 3952 model_num = [1, 2, 4, 3] 3953 x = [ 3954 [1., 1., 1.], 3955 [0., 0., 0.], 3956 [-1., -1., -1.], 3957 [0., 0., 0.] 3958 ] 3959 y = [0., 2., 20.] 3960 z = [ 3961 [-1., -1., -1.], 3962 [0., 0., 0.], 3963 [1., 1., 1.], 3964 [0., 0., 0.] 3965 ] 3966 3967 # Check the internal atomic info. 3968 self.assertEqual(len(cdp.structure.structural_data), 4) 3969 for i in range(4): 3970 self.assertEqual(len(cdp.structure.structural_data[i].mol), 1) 3971 self.assertEqual(cdp.structure.structural_data[i].num, model_num[i]) 3972 self.assertEqual(cdp.structure.structural_data[i].mol[0].atom_num, [None, None, None]) 3973 self.assertEqual(cdp.structure.structural_data[i].mol[0].atom_name, ['A', 'A', 'A']) 3974 self.assertEqual(cdp.structure.structural_data[i].mol[0].bonded, [[], [], []]) 3975 self.assertEqual(cdp.structure.structural_data[i].mol[0].element, ['S', 'S', 'S']) 3976 self.assertEqual(cdp.structure.structural_data[i].mol[0].pdb_record, [None, None, None]) 3977 self.assertEqual(cdp.structure.structural_data[i].mol[0].res_name, ['UNK', 'UNK', 'UNK']) 3978 self.assertEqual(cdp.structure.structural_data[i].mol[0].res_num, [1, 2, 3]) 3979 self.assertEqual(cdp.structure.structural_data[i].mol[0].seg_id, [None, None, None]) 3980 self.assertEqual(cdp.structure.structural_data[i].mol[0].x, x[i]) 3981 self.assertEqual(cdp.structure.structural_data[i].mol[0].y, y) 3982 self.assertEqual(cdp.structure.structural_data[i].mol[0].z, z[i])
3983 3984
3985 - def test_mean_molecules(self):
3986 """Test the structure.mean user function for different molecules in one pipe. 3987 3988 This checks the molecules argument of the U{structure.mean user function<http://www.nmr-relax.com/manual/structure_mean.html>}. 3989 """ 3990 3991 # Create three molecules 'X', 'Y', and 'Z' with a some atoms. 3992 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=1, mol_name='X', pos=[1., 0., -1.], element='S') 3993 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=1, mol_name='Y', pos=[0., 0., 0.], element='S') 3994 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=1, mol_name='Z', pos=[-1., 0., 1.], element='S') 3995 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=2, mol_name='X', pos=[1., 2., -1.], element='S') 3996 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=2, mol_name='Y', pos=[0., 2., 0.], element='S') 3997 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=2, mol_name='Z', pos=[-1., 2., 1.], element='S') 3998 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=3, mol_name='X', pos=[1., 20., -1.], element='S') 3999 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=3, mol_name='Y', pos=[0., 20., 0.], element='S') 4000 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=3, mol_name='Z', pos=[-1., 20., 1.], element='S') 4001 4002 # Calculate the mean structure. 4003 self.interpreter.structure.mean(molecules=[['X', 'Y', 'Z']], set_mol_name='A') 4004 4005 # The expected data. 4006 mol_name = ['X', 'Y', 'Z', 'A'] 4007 x = [ 4008 [1., 1., 1.], 4009 [0., 0., 0.], 4010 [-1., -1., -1.], 4011 [0., 0., 0.] 4012 ] 4013 y = [0., 2., 20.] 4014 z = [ 4015 [-1., -1., -1.], 4016 [0., 0., 0.], 4017 [1., 1., 1.], 4018 [0., 0., 0.] 4019 ] 4020 4021 # Check the internal atomic info. 4022 self.assertEqual(len(cdp.structure.structural_data), 1) 4023 for i in range(4): 4024 self.assertEqual(len(cdp.structure.structural_data[0].mol), 4) 4025 self.assertEqual(cdp.structure.structural_data[0].mol[i].mol_name, mol_name[i]) 4026 self.assertEqual(cdp.structure.structural_data[0].mol[i].atom_num, [None, None, None]) 4027 self.assertEqual(cdp.structure.structural_data[0].mol[i].atom_name, ['A', 'A', 'A']) 4028 self.assertEqual(cdp.structure.structural_data[0].mol[i].bonded, [[], [], []]) 4029 self.assertEqual(cdp.structure.structural_data[0].mol[i].element, ['S', 'S', 'S']) 4030 self.assertEqual(cdp.structure.structural_data[0].mol[i].pdb_record, [None, None, None]) 4031 self.assertEqual(cdp.structure.structural_data[0].mol[i].res_name, ['UNK', 'UNK', 'UNK']) 4032 self.assertEqual(cdp.structure.structural_data[0].mol[i].res_num, [1, 2, 3]) 4033 self.assertEqual(cdp.structure.structural_data[0].mol[i].seg_id, [None, None, None]) 4034 self.assertEqual(cdp.structure.structural_data[0].mol[i].x, x[i]) 4035 self.assertEqual(cdp.structure.structural_data[0].mol[i].y, y) 4036 self.assertEqual(cdp.structure.structural_data[0].mol[i].z, z[i])
4037 4038
4039 - def test_metadata_xml(self):
4040 """Test the storage and loading of metadata into an XML state file.""" 4041 4042 # Load the file. 4043 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 4044 self.interpreter.structure.read_pdb('1UBQ.pdb', dir=path) 4045 4046 # Delete a big chunk of the molecule. 4047 self.interpreter.structure.delete(":35-76") 4048 4049 # Delete all waters. 4050 self.interpreter.structure.delete(":HOH") 4051 4052 # Write out the results file. 4053 self.tmpfile = mktemp() + '.bz2' 4054 self.interpreter.results.write(self.tmpfile, dir=None) 4055 4056 # Create a new data pipe and load the results. 4057 self.interpreter.pipe.create('xml text', 'mf') 4058 self.interpreter.results.read(self.tmpfile) 4059 4060 # What the data should look like. 4061 helices = [ 4062 ['H1', 0, 'ILE', 23, 0, 'GLU', 34, 1, 12] 4063 ] 4064 sheets = [ 4065 [1, 'BET', 5, 'GLY', 0, 10, None, 'VAL', 0, 17, None, 0, None, None, None, None, None, None, None, None, None, None], 4066 [2, 'BET', 5, 'MET', 0, 1, None, 'THR', 0, 7, None, -1, None, None, None, None, None, None, None, None, None, None] 4067 ] 4068 4069 # Check the helix data. 4070 self.assert_(hasattr(cdp.structure, 'helices')) 4071 self.assertEqual(len(cdp.structure.helices), 1) 4072 self.assertEqual(cdp.structure.helices[0], helices[0]) 4073 4074 # Check the sheet data. 4075 self.assert_(hasattr(cdp.structure, 'sheets')) 4076 self.assertEqual(len(cdp.structure.sheets), 2) 4077 self.assertEqual(cdp.structure.sheets[0], sheets[0]) 4078 self.assertEqual(cdp.structure.sheets[1], sheets[1])
4079 4080
4082 """Test the loading and writing of a multi-model and multi-molecule PDB file.""" 4083 4084 # Path of the structure file. 4085 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 4086 4087 # Load the file. 4088 self.interpreter.structure.read_pdb('multi_model_and_mol_test.pdb', dir=path) 4089 4090 # Check the model consistency. 4091 cdp.structure.validate_models() 4092 4093 # Create a PDB file. 4094 file = DummyFileObject() 4095 self.interpreter.structure.write_pdb(file=file, force=True) 4096 4097 # The file contents, without remarks, as they should be. 4098 contents = [ 4099 "MODEL 1 \n", 4100 "ATOM 1 N LEU A 1 1.000 -2.000 20.000 1.00 0.00 N \n", 4101 "ATOM 2 H LEU A 1 2.000 -2.000 20.000 1.00 0.00 H \n", 4102 "TER 3 LEU A 1 \n", 4103 "ATOM 4 N LEU B 1 9.000 -9.000 27.000 1.00 0.00 N \n", 4104 "ATOM 5 H LEU B 1 8.000 -8.000 27.000 1.00 0.00 H \n", 4105 "TER 6 LEU B 1 \n", 4106 "ATOM 7 N LEU C 1 12.000 -12.000 7.000 1.00 0.00 N \n", 4107 "ATOM 8 H LEU C 1 11.000 -12.000 7.000 1.00 0.00 H \n", 4108 "TER 9 LEU C 1 \n", 4109 "ENDMDL \n", 4110 "MODEL 2 \n", 4111 "ATOM 1 N LEU A 1 1.000 -2.000 20.000 1.00 0.00 N \n", 4112 "ATOM 2 H LEU A 1 2.000 -2.000 20.000 1.00 0.00 H \n", 4113 "TER 3 LEU A 1 \n", 4114 "ATOM 4 N LEU B 1 9.000 -9.000 27.000 1.00 0.00 N \n", 4115 "ATOM 5 H LEU B 1 8.000 -8.000 27.000 1.00 0.00 H \n", 4116 "TER 6 LEU B 1 \n", 4117 "ATOM 7 N LEU C 1 12.000 -12.000 7.000 1.00 0.00 N \n", 4118 "ATOM 8 H LEU C 1 11.000 -12.000 7.000 1.00 0.00 H \n", 4119 "TER 9 LEU C 1 \n", 4120 "ENDMDL \n", 4121 "MASTER 0 0 0 0 0 0 0 0 6 3 0 0 \n", 4122 "END \n" 4123 ] 4124 4125 # Check the created PDB file. 4126 lines = file.readlines() 4127 self.strip_remarks(lines) 4128 self.assertEqual(len(contents), len(lines)) 4129 for i in range(len(lines)): 4130 self.assertEqual(contents[i], lines[i])
4131 4132
4133 - def test_pca(self):
4134 """Test the principle component analysis of the structure.pca user function.""" 4135 4136 # Execute the script. 4137 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'structure'+sep+'pca.py') 4138 4139 # The Gromacs values (converted from nm to Angstrom). 4140 values = array([0.417808, 0.0164377, 0.000675256, 1.17952e-05], float64) * 100 4141 proj = array([ 4142 [-0.38735, 0.21143, -0.02325, -0.00119], 4143 [ 0.96087, 0.07893, 0.02651, 0.00209], 4144 [-0.84236, -0.05173, 0.03651, -0.00140], 4145 [-0.23302, -0.11191, -0.02209, 0.00530], 4146 [ 0.50186, -0.12672, -0.01767, -0.00481] 4147 ], float64) * 10 4148 4149 # Invert the 3rd and 4th Gromacs eigenvectors to match. 4150 proj[:, 2] = -proj[:, 2] 4151 proj[:, 3] = -proj[:, 3] 4152 4153 # Are more inversion necessary? 4154 for mode in range(4): 4155 if sign(cdp.structure.pca_proj[mode][0]) != sign(proj[0][mode]): 4156 proj[:, mode] = -proj[:, mode] 4157 4158 # Checks. 4159 self.assert_(hasattr(cdp.structure, 'pca_values')) 4160 self.assert_(hasattr(cdp.structure, 'pca_vectors')) 4161 self.assert_(hasattr(cdp.structure, 'pca_proj')) 4162 self.assertEqual(len(cdp.structure.pca_values), 4) 4163 for mode in range(4): 4164 self.assertAlmostEqual(cdp.structure.pca_values[mode], values[mode], 5) 4165 for struct in range(5): 4166 self.assertAlmostEqual(cdp.structure.pca_proj[mode, struct], proj[struct, mode], 4)
4167 4168
4169 - def test_pca_observers(self):
4170 """Test the principle component analysis of the structure.pca user function while using observer molecules.""" 4171 4172 # Execute the script. 4173 self.script_exec(status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'structure'+sep+'pca_observers.py') 4174 4175 # The Gromacs values (converted from nm to Angstrom). 4176 values = array([0.417808, 0.0164377, 0.000675256, 1.17952e-05], float64) * 100 4177 proj = array([ 4178 [-0.38735, 0.21143, -0.02325, -0.00119], 4179 [ 0.96087, 0.07893, 0.02651, 0.00209], 4180 [-0.84236, -0.05173, 0.03651, -0.00140], 4181 [-0.23302, -0.11191, -0.02209, 0.00530], 4182 [ 0.50186, -0.12672, -0.01767, -0.00481] 4183 ], float64) * 10 4184 4185 # Invert the 3rd and 4th Gromacs eigenvectors to match. 4186 proj[:, 2] = -proj[:, 2] 4187 proj[:, 3] = -proj[:, 3] 4188 4189 # Are more inversion necessary? 4190 for mode in range(4): 4191 if sign(cdp.structure.pca_proj[mode][0]) != sign(proj[0][mode]): 4192 proj[:, mode] = -proj[:, mode] 4193 4194 # Checks. 4195 self.assert_(hasattr(cdp.structure, 'pca_values')) 4196 self.assert_(hasattr(cdp.structure, 'pca_vectors')) 4197 self.assert_(hasattr(cdp.structure, 'pca_proj')) 4198 self.assertEqual(len(cdp.structure.pca_values), 4) 4199 for mode in range(4): 4200 self.assertAlmostEqual(cdp.structure.pca_values[mode], values[mode], 5) 4201 for struct in range(5): 4202 self.assertAlmostEqual(cdp.structure.pca_proj[mode, struct], proj[struct, mode], 4)
4203 4204
4206 """Test the handling of secondary structure metadata when combining multiple PDB structures.""" 4207 4208 # Path of the structure file. 4209 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 4210 4211 # Read a PDB file twice as two different molecules. 4212 self.interpreter.structure.read_pdb('1J7O.pdb', dir=path, set_mol_name='N-dom', read_model=1, set_model_num=1) 4213 self.interpreter.structure.read_pdb('1J7P.pdb', dir=path, set_mol_name='C-dom', read_model=1, set_model_num=1) 4214 4215 # Create a PDB file. 4216 file = DummyFileObject() 4217 self.interpreter.structure.write_pdb(file=file, force=True) 4218 4219 # The file secondary structure contents, as they should be. 4220 contents = [ 4221 "HELIX 1 1 THR A 5 ASP A 20 1 16 \n", 4222 "HELIX 2 2 THR A 28 LEU A 39 1 12 \n", 4223 "HELIX 3 3 THR A 44 GLU A 54 1 11 \n", 4224 "HELIX 4 4 ASP A 64 MET A 76 1 13 \n", 4225 "HELIX 5 1 GLU B 82 ASP B 93 1 12 \n", 4226 "HELIX 6 2 SER B 101 LEU B 112 1 12 \n", 4227 "HELIX 7 3 THR B 117 ASP B 129 1 13 \n", 4228 "HELIX 8 4 TYR B 138 THR B 146 1 9 \n", 4229 "SHEET 1 A 2 TYR B 99 ILE B 100 0 \n", 4230 "SHEET 2 A 2 VAL B 136 ASN B 137 -1 O VAL B 136 N ILE B 100 \n" 4231 ] 4232 4233 # Check secondary structure contents of the created PDB file. 4234 lines = file.readlines() 4235 index = 0 4236 print("\n\nChecking the records:\n") 4237 for i in range(len(lines)): 4238 # Only secondary structure records. 4239 if lines[i][:5] not in ['HELIX', 'SHEET']: 4240 continue 4241 4242 # Check and increment the index. 4243 print(lines[i][:-1]) 4244 self.assertEqual(contents[index], lines[i]) 4245 index += 1
4246 4247
4249 """Load the structure from the 'strychnine_opt_cdcl3_b3lyp_gaussian.log.bz2' compressed Gaussian log file.""" 4250 4251 # Path of the files. 4252 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 4253 4254 # Read the XYZ file. 4255 self.interpreter.structure.read_gaussian(file='strychnine_opt_cdcl3_b3lyp_gaussian.log.bz2', dir=path, set_mol_name='strychnine') 4256 4257 # Test the molecule data. 4258 self.assertEqual(len(cdp.structure.structural_data), 1) 4259 self.assertEqual(len(cdp.structure.structural_data[0].mol), 1) 4260 4261 # Load the carbon atoms and test it. 4262 self.interpreter.structure.load_spins('@C') 4263 self.assertEqual(count_spins(), 21) 4264 4265 # Load the protons. 4266 self.interpreter.structure.load_spins('@H') 4267 self.assertEqual(count_spins(), 43) 4268 4269 # And now all the rest of the atoms. 4270 self.interpreter.structure.load_spins() 4271 4272 # The actual data. 4273 data = [ 4274 [ 5, 'C', -0.258837, -2.073956, -0.558021], 4275 [ 6, 'C', -0.824223, -1.406962, -1.808433], 4276 [ 7, 'C', -1.741283, -0.250780, -1.378644], 4277 [ 8, 'C', -0.819735, 0.828965, -0.783392], 4278 [ 9, 'C', 0.003153, 0.334416, 0.415455], 4279 [10, 'C', 2.358372, 0.448322, 0.162421], 4280 [11, 'C', 3.667689, 0.888405, -0.010558], 4281 [12, 'C', 4.632616, -0.056196, -0.360560], 4282 [13, 'C', 4.303015, -1.398582, -0.525823], 4283 [14, 'C', 2.988069, -1.825141, -0.331972], 4284 [15, 'C', 2.015427, -0.899636, 0.012625], 4285 [16, 'C', 0.561728, -1.122705, 0.360284], 4286 [17, 'C', 0.390886, -1.834862, 1.723978], 4287 [18, 'C', -1.067936, -2.282629, 1.709808], 4288 [19, 'C', -2.708975, -2.252045, -0.131301], 4289 [20, 'C', -2.815469, -0.775379, -0.431910], 4290 [21, 'C', -3.718174, 0.023460, 0.134879], 4291 [22, 'C', -3.726395, 1.516213, -0.058936], 4292 [23, 'C', -1.423939, 2.193179, -0.407936], 4293 [24, 'C', -0.372897, 3.059448, 0.332496], 4294 [25, 'C', 1.064718, 2.558120, 0.325331], 4295 [26, 'H', 0.399932, -2.896344, -0.855386], 4296 [27, 'H', -1.364146, -2.140645, -2.409934], 4297 [28, 'H', -0.007016, -1.035292, -2.430851], 4298 [29, 'H', -2.229948, 0.177326, -2.261725], 4299 [30, 'H', -0.101863, 1.055799, -1.581061], 4300 [31, 'H', -0.582210, 0.470722, 1.326014], 4301 [32, 'H', 3.918694, 1.929549, 0.116264], 4302 [33, 'H', 5.656588, 0.267474, -0.505165], 4303 [34, 'H', 5.068478, -2.115052, -0.797816], 4304 [35, 'H', 2.736463, -2.873299, -0.445917], 4305 [36, 'H', 1.059165, -2.698455, 1.760657], 4306 [37, 'H', 0.631843, -1.189746, 2.570301], 4307 [38, 'H', -1.243126, -3.142405, 2.361743], 4308 [39, 'H', -1.719677, -1.470258, 2.058429], 4309 [40, 'H', -3.410692, -2.541912, 0.651788], 4310 [41, 'H', -2.971493, -2.840572, -1.016009], 4311 [42, 'H', -4.455619, -0.395106, 0.813636], 4312 [43, 'H', -3.834304, 1.785629, -1.118252], 4313 [44, 'H', -4.559845, 1.966160, 0.480526], 4314 [45, 'H', -1.736135, 2.699031, -1.329897], 4315 [46, 'H', -0.354638, 4.078330, -0.048526], 4316 [47, 'H', -0.690723, 3.116119, 1.378208], 4317 [ 1, 'O', -2.547545, 2.139059, 0.472310], 4318 [ 2, 'O', 2.015408, 3.324289, 0.213156], 4319 [ 3, 'N', 1.207610, 1.203922, 0.478894], 4320 [ 4, 'N', -1.350394, -2.624460, 0.301178] 4321 ] 4322 4323 # Check the data. 4324 i = 0 4325 for spin in spin_loop(): 4326 self.assertEqual(spin.num, data[i][0]) 4327 self.assertEqual(spin.name, data[i][1]) 4328 self.assertEqual(spin.element, data[i][1]) 4329 self.assertEqual(spin.pos[0], data[i][2]) 4330 self.assertEqual(spin.pos[1], data[i][3]) 4331 self.assertEqual(spin.pos[2], data[i][4]) 4332 4333 # Increment the spin index. 4334 i += 1
4335 4336
4337 - def test_read_merge(self):
4338 """Test the merging of two molecules into one.""" 4339 4340 # Path of the files. 4341 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 4342 4343 # Read the PDB files. 4344 self.interpreter.structure.read_pdb(file='Ap4Aase_res1-6.pdb', dir=path, set_mol_name='Ap4Aase', set_model_num=1) 4345 self.interpreter.structure.read_pdb(file='Ap4Aase_res7-12.pdb', dir=path, set_mol_name='Ap4Aase', set_model_num=1, merge=True) 4346 self.interpreter.structure.read_pdb(file='Ap4Aase_res1-12.pdb', dir=path, set_mol_name='Ap4Aase', set_model_num=2) 4347 4348 # Check that everything is ok. 4349 cdp.structure.validate_models()
4350 4351
4353 """Test the simultaneous merging of two molecules into one.""" 4354 4355 # Path of the files. 4356 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 4357 4358 # Read the PDB files. 4359 self.interpreter.structure.read_pdb(file='2BE6_core_I_IV.pdb', dir=path, read_mol=[1, 3], set_mol_name='CaM A') 4360 4361 # Check that everything is ok. 4362 cdp.structure.validate_models()
4363 4364
4365 - def test_read_not_pdb(self):
4366 """Test the reading of a file by structure.read_pdb that is not a PDB.""" 4367 4368 # Path of the files. 4369 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'saved_states' 4370 4371 # Read the non-PDB file. 4372 self.interpreter.structure.read_pdb(file='basic_single_pipe.bz2', dir=path)
4373 4374
4375 - def test_read_pdb_1UBQ(self):
4376 """Test the reading of the complete 1UBQ PDB file.""" 4377 4378 # Load the file. 4379 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 4380 self.interpreter.structure.read_pdb('1UBQ.pdb', dir=path) 4381 4382 # Check the data. 4383 self.assert_(hasattr(cdp, 'structure')) 4384 self.assert_(hasattr(cdp.structure, 'structural_data')) 4385 self.assertEqual(len(cdp.structure.structural_data), 1) 4386 self.assertEqual(len(cdp.structure.structural_data[0].mol), 1) 4387 4388 # Check the first atom. 4389 self.assertEqual(cdp.structure.structural_data[0].mol[0].atom_num[0], 1) 4390 self.assertEqual(cdp.structure.structural_data[0].mol[0].atom_name[0], 'N') 4391 self.assertEqual(cdp.structure.structural_data[0].mol[0].res_name[0], 'MET') 4392 self.assertEqual(cdp.structure.structural_data[0].mol[0].res_num[0], 1) 4393 self.assertEqual(cdp.structure.structural_data[0].mol[0].x[0], 27.340) 4394 self.assertEqual(cdp.structure.structural_data[0].mol[0].y[0], 24.430) 4395 self.assertEqual(cdp.structure.structural_data[0].mol[0].z[0], 2.614) 4396 self.assertEqual(cdp.structure.structural_data[0].mol[0].element[0], 'N') 4397 4398 # Check the last atom (from the last ATOM record, as water HETATM records are skipped). 4399 self.assertEqual(cdp.structure.structural_data[0].mol[0].atom_num[-1], 602) 4400 self.assertEqual(cdp.structure.structural_data[0].mol[0].atom_name[-1], 'OXT') 4401 self.assertEqual(cdp.structure.structural_data[0].mol[0].res_name[-1], 'GLY') 4402 self.assertEqual(cdp.structure.structural_data[0].mol[0].res_num[-1], 76) 4403 self.assertEqual(cdp.structure.structural_data[0].mol[0].x[-1], 40.862) 4404 self.assertEqual(cdp.structure.structural_data[0].mol[0].y[-1], 39.575) 4405 self.assertEqual(cdp.structure.structural_data[0].mol[0].z[-1], 36.251) 4406 self.assertEqual(cdp.structure.structural_data[0].mol[0].element[-1], 'O')
4407 4408
4410 """Test the packing of models and molecules using 'gromacs.pdb' and 'lactose_MCMM4_S1_*.pdb' (using the internal structural object PDB reader).""" 4411 4412 # Path of the files. 4413 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 4414 4415 # Read the PDB models. 4416 self.interpreter.structure.read_pdb(file='gromacs.pdb', dir=path+sep+'phthalic_acid') 4417 self.interpreter.structure.read_pdb(file='lactose'+sep+'lactose_MCMM4_S1_1.pdb', dir=path, set_model_num=1, set_mol_name='lactose_MCMM4_S1') 4418 self.interpreter.structure.read_pdb(file='lactose'+sep+'lactose_MCMM4_S1_2.pdb', dir=path, set_model_num=2, set_mol_name='lactose_MCMM4_S1') 4419 self.interpreter.structure.read_pdb(file='lactose'+sep+'lactose_MCMM4_S1_3.pdb', dir=path, set_model_num=1, set_mol_name='lactose_MCMM4_S1b') 4420 self.interpreter.structure.read_pdb(file='lactose'+sep+'lactose_MCMM4_S1_4.pdb', dir=path, set_model_num=2, set_mol_name='lactose_MCMM4_S1b') 4421 4422 # Try loading a few protons. 4423 self.interpreter.structure.load_spins('@*H*') 4424 4425 # And now all the rest of the atoms. 4426 self.interpreter.structure.load_spins() 4427 4428 # Test the structural data. 4429 self.assert_(hasattr(cdp, 'structure')) 4430 self.assert_(hasattr(cdp.structure, 'structural_data')) 4431 self.assertEqual(len(cdp.structure.structural_data), 2) 4432 self.assertEqual(len(cdp.structure.structural_data[0].mol), 3) 4433 self.assertEqual(len(cdp.structure.structural_data[1].mol), 3) 4434 4435 files = [['gromacs.pdb', 'lactose_MCMM4_S1_1.pdb', 'lactose_MCMM4_S1_3.pdb'], 4436 ['gromacs.pdb', 'lactose_MCMM4_S1_2.pdb', 'lactose_MCMM4_S1_4.pdb']] 4437 paths = [[path+sep+'phthalic_acid', path+sep+'lactose', path+sep+'lactose'], 4438 [path+sep+'phthalic_acid', path+sep+'lactose', path+sep+'lactose']] 4439 models = [[1, 1, 1], [2, 1, 1]] 4440 4441 for i in range(len(cdp.structure.structural_data)): 4442 for j in range(len(cdp.structure.structural_data[i].mol)): 4443 mol = cdp.structure.structural_data[i].mol[j] 4444 self.assertEqual(mol.file_name, files[i][j]) 4445 self.assertEqual(mol.file_path, paths[i][j]) 4446 self.assertEqual(mol.file_model, models[i][j]) 4447 self.assertEqual(mol.file_mol_num, 1)
4448 4449
4450 - def test_read_pdb_internal1(self):
4451 """Load the '1F35_N_H_molmol.pdb' PDB file (using the internal structural object PDB reader).""" 4452 4453 # Path of the files. 4454 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 4455 4456 # Read the PDB. 4457 self.interpreter.structure.read_pdb(file='1F35_N_H_molmol.pdb', dir=path) 4458 4459 # Test the molecule name. 4460 self.assertEqual(cdp.structure.structural_data[0].mol[0].mol_name, '1F35_N_H_molmol_mol1') 4461 4462 # Load a single atom and test it. 4463 self.interpreter.structure.load_spins('#1F35_N_H_molmol_mol1:3@N') 4464 self.assertEqual(count_spins(), 1) 4465 4466 # Try loading a few protons. 4467 self.interpreter.structure.load_spins('@*H*') 4468 4469 # And now all the rest of the atoms. 4470 self.interpreter.structure.load_spins() 4471 4472 # Extract a N-Ca vector. 4473 self.interpreter.interatom.define(spin_id1='@CA', spin_id2='#1F35_N_H_molmol_mol1:3@N') 4474 self.interpreter.interatom.unit_vectors() 4475 print(cdp.interatomic[0]) 4476 self.assert_(hasattr(cdp.interatomic[0], 'vector'))
4477 4478
4479 - def test_read_pdb_internal2(self):
4480 """Load the 'Ap4Aase_res1-12.pdb' PDB file (using the internal structural object PDB reader).""" 4481 4482 # Path of the files. 4483 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 4484 4485 # Read the PDB. 4486 self.interpreter.structure.read_pdb(file='Ap4Aase_res1-12.pdb', dir=path) 4487 4488 # Try loading a few protons. 4489 self.interpreter.structure.load_spins('@*H*') 4490 4491 # And now all the rest of the atoms. 4492 self.interpreter.structure.load_spins()
4493 4494
4495 - def test_read_pdb_internal3(self):
4496 """Load the 'gromacs.pdb' PDB file (using the internal structural object PDB reader).""" 4497 4498 # Path of the files. 4499 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'phthalic_acid' 4500 4501 # Read the PDB. 4502 self.interpreter.structure.read_pdb(file='gromacs.pdb', dir=path) 4503 4504 # Try loading a few protons, without positions averaging across models. 4505 self.interpreter.structure.load_spins('@*H*', ave_pos=False) 4506 4507 # A test. 4508 self.assertEqual(len(cdp.mol[0].res[0].spin[0].pos), 2) 4509 4510 # And now all the rest of the atoms. 4511 self.interpreter.structure.load_spins(ave_pos=False)
4512 4513
4514 - def test_read_pdb_internal4(self):
4515 """Load the 'tylers_peptide_trunc.pdb' PDB file (using the internal structural object PDB reader).""" 4516 4517 # Path of the files. 4518 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 4519 4520 # Read the PDB. 4521 self.interpreter.structure.read_pdb(file='tylers_peptide_trunc.pdb', dir=path) 4522 4523 # Try loading a few protons. 4524 self.interpreter.structure.load_spins('@*H*') 4525 4526 # And now all the rest of the atoms. 4527 self.interpreter.structure.load_spins()
4528 4529
4530 - def test_read_pdb_internal5(self):
4531 """Load the 'lactose_MCMM4_S1_1.pdb' PDB file (using the internal structural object PDB reader).""" 4532 4533 # Path of the files. 4534 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'lactose' 4535 4536 # Read the PDB. 4537 self.interpreter.structure.read_pdb(file='lactose_MCMM4_S1_1.pdb', dir=path) 4538 4539 # Try loading a few protons. 4540 self.interpreter.structure.load_spins('@*H*') 4541 4542 # And now all the rest of the atoms. 4543 self.interpreter.structure.load_spins()
4544 4545
4546 - def test_read_pdb_internal6(self):
4547 """Load the 'lactose_MCMM4_S1_1.pdb' and 'lactose_MCMM4_S1_2.pdb' PDB files as 2 separate structures (using the internal structural object PDB reader).""" 4548 4549 # Path of the files. 4550 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'lactose' 4551 4552 # Read the PDB twice. 4553 self.interpreter.structure.read_pdb(file='lactose_MCMM4_S1_1.pdb', dir=path) 4554 self.interpreter.structure.read_pdb(file='lactose_MCMM4_S1_2.pdb', dir=path) 4555 4556 # Try loading a few protons. 4557 self.interpreter.structure.load_spins('@*H*') 4558 4559 # And now all the rest of the atoms. 4560 self.interpreter.structure.load_spins()
4561 4562
4563 - def test_read_pdb_internal7(self):
4564 """Load the 'lactose_MCMM4_S1_1.pdb' PDB file twice as 2 separate structures (using the internal structural object PDB reader).""" 4565 4566 # Path of the files. 4567 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'lactose' 4568 4569 # Read the PDB twice. 4570 self.interpreter.structure.read_pdb(file='lactose_MCMM4_S1_1.pdb', dir=path) 4571 self.interpreter.structure.read_pdb(file='lactose_MCMM4_S1_1.pdb', dir=path) 4572 4573 # Try loading a few protons. 4574 self.interpreter.structure.load_spins('@*H*') 4575 4576 # And now all the rest of the atoms. 4577 self.interpreter.structure.load_spins()
4578 4579
4581 """Load the 2 models of the 'gromacs.pdb' PDB file as separate molecules of the same model (using the internal structural object PDB reader).""" 4582 4583 # Path of the files. 4584 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'phthalic_acid' 4585 4586 # Read the PDB models. 4587 self.interpreter.structure.read_pdb(file='gromacs.pdb', dir=path, read_model=1, set_model_num=1) 4588 self.interpreter.structure.read_pdb(file='gromacs.pdb', dir=path, read_model=2, set_model_num=1) 4589 4590 # Try loading a few protons. 4591 self.interpreter.structure.load_spins('@*H*') 4592 4593 # And now all the rest of the atoms. 4594 self.interpreter.structure.load_spins() 4595 4596 # Test the structural data. 4597 self.assert_(hasattr(cdp, 'structure')) 4598 self.assert_(hasattr(cdp.structure, 'structural_data')) 4599 self.assertEqual(len(cdp.structure.structural_data), 1) 4600 self.assertEqual(len(cdp.structure.structural_data[0].mol), 2) 4601 4602 i = 0 4603 for mol in cdp.structure.structural_data[0].mol: 4604 self.assertEqual(mol.file_name, 'gromacs.pdb') 4605 self.assertEqual(mol.file_path, path) 4606 self.assertEqual(mol.file_model, i+1) 4607 self.assertEqual(mol.file_mol_num, 1) 4608 i = i + 1
4609 4610
4612 """Load a few 'lactose_MCMM4_S1_*.pdb' PDB files as models (using the internal structural object PDB reader).""" 4613 4614 # Path of the files. 4615 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures'+sep+'lactose' 4616 4617 # Files. 4618 files = ['lactose_MCMM4_S1_1.pdb', 4619 'lactose_MCMM4_S1_2.pdb', 4620 'lactose_MCMM4_S1_3.pdb'] 4621 4622 # Read the PDBs. 4623 self.interpreter.structure.read_pdb(file=files[0], dir=path, set_model_num=1) 4624 self.interpreter.structure.read_pdb(file=files[1], dir=path, set_model_num=1) 4625 self.interpreter.structure.read_pdb(file=files[2], dir=path, set_model_num=1) 4626 4627 # Try loading a few protons. 4628 self.interpreter.structure.load_spins('@*H*') 4629 4630 # And now all the rest of the atoms. 4631 self.interpreter.structure.load_spins() 4632 4633 # Test the structural data. 4634 self.assert_(hasattr(cdp, 'structure')) 4635 self.assert_(hasattr(cdp.structure, 'structural_data')) 4636 self.assertEqual(len(cdp.structure.structural_data), 1) 4637 self.assertEqual(len(cdp.structure.structural_data[0].mol), 3) 4638 4639 i = 0 4640 for mol in cdp.structure.structural_data[0].mol: 4641 self.assertEqual(mol.file_name, files[i]) 4642 self.assertEqual(mol.file_path, path) 4643 self.assertEqual(mol.file_model, 1) 4644 self.assertEqual(mol.file_mol_num, 1) 4645 i = i + 1
4646 4647
4648 - def test_read_write_pdb_1UBQ(self):
4649 """Test the reading and writing of the 1UBQ PDB file.""" 4650 4651 # Load the file. 4652 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 4653 self.interpreter.structure.read_pdb('1UBQ.pdb', dir=path) 4654 4655 # Delete a big chunk of the molecule. 4656 self.interpreter.structure.delete(":35-76") 4657 4658 # Delete all waters. 4659 self.interpreter.structure.delete(":HOH") 4660 4661 # Write out the file. 4662 self.tmpfile = mktemp() + '.pdb' 4663 self.interpreter.structure.write_pdb(self.tmpfile) 4664 4665 # Read the contents of the file. 4666 file = open(self.tmpfile) 4667 lines = file.readlines() 4668 file.close() 4669 4670 # What the contents should be, without remarks. 4671 real_data = [ 4672 "HELIX 1 H1 ILE A 23 GLU A 34 1 12 \n", 4673 "SHEET 1 BET 5 GLY A 10 VAL A 17 0 \n", 4674 "SHEET 2 BET 5 MET A 1 THR A 7 -1 \n", 4675 "ATOM 1 N MET A 1 27.340 24.430 2.614 1.00 0.00 N \n", 4676 "ATOM 2 CA MET A 1 26.266 25.413 2.842 1.00 0.00 C \n", 4677 "ATOM 3 C MET A 1 26.913 26.639 3.531 1.00 0.00 C \n", 4678 "ATOM 4 O MET A 1 27.886 26.463 4.263 1.00 0.00 O \n", 4679 "ATOM 5 CB MET A 1 25.112 24.880 3.649 1.00 0.00 C \n", 4680 "ATOM 6 CG MET A 1 25.353 24.860 5.134 1.00 0.00 C \n", 4681 "ATOM 7 SD MET A 1 23.930 23.959 5.904 1.00 0.00 S \n", 4682 "ATOM 8 CE MET A 1 24.447 23.984 7.620 1.00 0.00 C \n", 4683 "ATOM 9 N GLN A 2 26.335 27.770 3.258 1.00 0.00 N \n", 4684 "ATOM 10 CA GLN A 2 26.850 29.021 3.898 1.00 0.00 C \n", 4685 "ATOM 11 C GLN A 2 26.100 29.253 5.202 1.00 0.00 C \n", 4686 "ATOM 12 O GLN A 2 24.865 29.024 5.330 1.00 0.00 O \n", 4687 "ATOM 13 CB GLN A 2 26.733 30.148 2.905 1.00 0.00 C \n", 4688 "ATOM 14 CG GLN A 2 26.882 31.546 3.409 1.00 0.00 C \n", 4689 "ATOM 15 CD GLN A 2 26.786 32.562 2.270 1.00 0.00 C \n", 4690 "ATOM 16 OE1 GLN A 2 27.783 33.160 1.870 1.00 0.00 O \n", 4691 "ATOM 17 NE2 GLN A 2 25.562 32.733 1.806 1.00 0.00 N \n", 4692 "ATOM 18 N ILE A 3 26.849 29.656 6.217 1.00 0.00 N \n", 4693 "ATOM 19 CA ILE A 3 26.235 30.058 7.497 1.00 0.00 C \n", 4694 "ATOM 20 C ILE A 3 26.882 31.428 7.862 1.00 0.00 C \n", 4695 "ATOM 21 O ILE A 3 27.906 31.711 7.264 1.00 0.00 O \n", 4696 "ATOM 22 CB ILE A 3 26.344 29.050 8.645 1.00 0.00 C \n", 4697 "ATOM 23 CG1 ILE A 3 27.810 28.748 8.999 1.00 0.00 C \n", 4698 "ATOM 24 CG2 ILE A 3 25.491 27.771 8.287 1.00 0.00 C \n", 4699 "ATOM 25 CD1 ILE A 3 27.967 28.087 10.417 1.00 0.00 C \n", 4700 "ATOM 26 N PHE A 4 26.214 32.097 8.771 1.00 0.00 N \n", 4701 "ATOM 27 CA PHE A 4 26.772 33.436 9.197 1.00 0.00 C \n", 4702 "ATOM 28 C PHE A 4 27.151 33.362 10.650 1.00 0.00 C \n", 4703 "ATOM 29 O PHE A 4 26.350 32.778 11.395 1.00 0.00 O \n", 4704 "ATOM 30 CB PHE A 4 25.695 34.498 8.946 1.00 0.00 C \n", 4705 "ATOM 31 CG PHE A 4 25.288 34.609 7.499 1.00 0.00 C \n", 4706 "ATOM 32 CD1 PHE A 4 24.147 33.966 7.038 1.00 0.00 C \n", 4707 "ATOM 33 CD2 PHE A 4 26.136 35.346 6.640 1.00 0.00 C \n", 4708 "ATOM 34 CE1 PHE A 4 23.812 34.031 5.677 1.00 0.00 C \n", 4709 "ATOM 35 CE2 PHE A 4 25.810 35.392 5.267 1.00 0.00 C \n", 4710 "ATOM 36 CZ PHE A 4 24.620 34.778 4.853 1.00 0.00 C \n", 4711 "ATOM 37 N VAL A 5 28.260 33.943 11.096 1.00 0.00 N \n", 4712 "ATOM 38 CA VAL A 5 28.605 33.965 12.503 1.00 0.00 C \n", 4713 "ATOM 39 C VAL A 5 28.638 35.461 12.900 1.00 0.00 C \n", 4714 "ATOM 40 O VAL A 5 29.522 36.103 12.320 1.00 0.00 O \n", 4715 "ATOM 41 CB VAL A 5 29.963 33.317 12.814 1.00 0.00 C \n", 4716 "ATOM 42 CG1 VAL A 5 30.211 33.394 14.304 1.00 0.00 C \n", 4717 "ATOM 43 CG2 VAL A 5 29.957 31.838 12.352 1.00 0.00 C \n", 4718 "ATOM 44 N LYS A 6 27.751 35.867 13.740 1.00 0.00 N \n", 4719 "ATOM 45 CA LYS A 6 27.691 37.315 14.143 1.00 0.00 C \n", 4720 "ATOM 46 C LYS A 6 28.469 37.475 15.420 1.00 0.00 C \n", 4721 "ATOM 47 O LYS A 6 28.213 36.753 16.411 1.00 0.00 O \n", 4722 "ATOM 48 CB LYS A 6 26.219 37.684 14.307 1.00 0.00 C \n", 4723 "ATOM 49 CG LYS A 6 25.884 39.139 14.615 1.00 0.00 C \n", 4724 "ATOM 50 CD LYS A 6 24.348 39.296 14.642 1.00 0.00 C \n", 4725 "ATOM 51 CE LYS A 6 23.865 40.723 14.749 1.00 0.00 C \n", 4726 "ATOM 52 NZ LYS A 6 22.375 40.720 14.907 1.00 0.00 N \n", 4727 "ATOM 53 N THR A 7 29.426 38.430 15.446 1.00 0.00 N \n", 4728 "ATOM 54 CA THR A 7 30.225 38.643 16.662 1.00 0.00 C \n", 4729 "ATOM 55 C THR A 7 29.664 39.839 17.434 1.00 0.00 C \n", 4730 "ATOM 56 O THR A 7 28.850 40.565 16.859 1.00 0.00 O \n", 4731 "ATOM 57 CB THR A 7 31.744 38.879 16.299 1.00 0.00 C \n", 4732 "ATOM 58 OG1 THR A 7 31.737 40.257 15.824 1.00 0.00 O \n", 4733 "ATOM 59 CG2 THR A 7 32.260 37.969 15.171 1.00 0.00 C \n", 4734 "ATOM 60 N LEU A 8 30.132 40.069 18.642 1.00 0.00 N \n", 4735 "ATOM 61 CA LEU A 8 29.607 41.180 19.467 1.00 0.00 C \n", 4736 "ATOM 62 C LEU A 8 30.075 42.538 18.984 1.00 0.00 C \n", 4737 "ATOM 63 O LEU A 8 29.586 43.570 19.483 1.00 0.00 O \n", 4738 "ATOM 64 CB LEU A 8 29.919 40.890 20.938 1.00 0.00 C \n", 4739 "ATOM 65 CG LEU A 8 29.183 39.722 21.581 1.00 0.00 C \n", 4740 "ATOM 66 CD1 LEU A 8 29.308 39.750 23.095 1.00 0.00 C \n", 4741 "ATOM 67 CD2 LEU A 8 27.700 39.721 21.228 1.00 0.00 C \n", 4742 "ATOM 68 N THR A 9 30.991 42.571 17.998 1.00 0.00 N \n", 4743 "ATOM 69 CA THR A 9 31.422 43.940 17.553 1.00 0.00 C \n", 4744 "ATOM 70 C THR A 9 30.755 44.351 16.277 1.00 0.00 C \n", 4745 "ATOM 71 O THR A 9 31.207 45.268 15.566 1.00 0.00 O \n", 4746 "ATOM 72 CB THR A 9 32.979 43.918 17.445 1.00 0.00 C \n", 4747 "ATOM 73 OG1 THR A 9 33.174 43.067 16.265 1.00 0.00 O \n", 4748 "ATOM 74 CG2 THR A 9 33.657 43.319 18.672 1.00 0.00 C \n", 4749 "ATOM 75 N GLY A 10 29.721 43.673 15.885 1.00 0.00 N \n", 4750 "ATOM 76 CA GLY A 10 28.978 43.960 14.678 1.00 0.00 C \n", 4751 "ATOM 77 C GLY A 10 29.604 43.507 13.393 1.00 0.00 C \n", 4752 "ATOM 78 O GLY A 10 29.219 43.981 12.301 1.00 0.00 O \n", 4753 "ATOM 79 N LYS A 11 30.563 42.623 13.495 1.00 0.00 N \n", 4754 "ATOM 80 CA LYS A 11 31.191 42.012 12.331 1.00 0.00 C \n", 4755 "ATOM 81 C LYS A 11 30.459 40.666 12.130 1.00 0.00 C \n", 4756 "ATOM 82 O LYS A 11 30.253 39.991 13.133 1.00 0.00 O \n", 4757 "ATOM 83 CB LYS A 11 32.672 41.717 12.505 1.00 0.00 C \n", 4758 "ATOM 84 CG LYS A 11 33.280 41.086 11.227 1.00 0.00 C \n", 4759 "ATOM 85 CD LYS A 11 34.762 40.799 11.470 1.00 0.00 C \n", 4760 "ATOM 86 CE LYS A 11 35.614 40.847 10.240 1.00 0.00 C \n", 4761 "ATOM 87 NZ LYS A 11 35.100 40.073 9.101 1.00 0.00 N \n", 4762 "ATOM 88 N THR A 12 30.163 40.338 10.886 1.00 0.00 N \n", 4763 "ATOM 89 CA THR A 12 29.542 39.020 10.653 1.00 0.00 C \n", 4764 "ATOM 90 C THR A 12 30.494 38.261 9.729 1.00 0.00 C \n", 4765 "ATOM 91 O THR A 12 30.849 38.850 8.706 1.00 0.00 O \n", 4766 "ATOM 92 CB THR A 12 28.113 39.049 10.015 1.00 0.00 C \n", 4767 "ATOM 93 OG1 THR A 12 27.280 39.722 10.996 1.00 0.00 O \n", 4768 "ATOM 94 CG2 THR A 12 27.588 37.635 9.715 1.00 0.00 C \n", 4769 "ATOM 95 N ILE A 13 30.795 37.015 10.095 1.00 0.00 N \n", 4770 "ATOM 96 CA ILE A 13 31.720 36.289 9.176 1.00 0.00 C \n", 4771 "ATOM 97 C ILE A 13 30.955 35.211 8.459 1.00 0.00 C \n", 4772 "ATOM 98 O ILE A 13 30.025 34.618 9.040 1.00 0.00 O \n", 4773 "ATOM 99 CB ILE A 13 32.995 35.883 9.934 1.00 0.00 C \n", 4774 "ATOM 100 CG1 ILE A 13 33.306 34.381 9.840 1.00 0.00 C \n", 4775 "ATOM 101 CG2 ILE A 13 33.109 36.381 11.435 1.00 0.00 C \n", 4776 "ATOM 102 CD1 ILE A 13 34.535 34.028 10.720 1.00 0.00 C \n", 4777 "ATOM 103 N THR A 14 31.244 34.986 7.197 1.00 0.00 N \n", 4778 "ATOM 104 CA THR A 14 30.505 33.884 6.512 1.00 0.00 C \n", 4779 "ATOM 105 C THR A 14 31.409 32.680 6.446 1.00 0.00 C \n", 4780 "ATOM 106 O THR A 14 32.619 32.812 6.125 1.00 0.00 O \n", 4781 "ATOM 107 CB THR A 14 30.091 34.393 5.078 1.00 0.00 C \n", 4782 "ATOM 108 OG1 THR A 14 31.440 34.513 4.487 1.00 0.00 O \n", 4783 "ATOM 109 CG2 THR A 14 29.420 35.756 5.119 1.00 0.00 C \n", 4784 "ATOM 110 N LEU A 15 30.884 31.485 6.666 1.00 0.00 N \n", 4785 "ATOM 111 CA LEU A 15 31.677 30.275 6.639 1.00 0.00 C \n", 4786 "ATOM 112 C LEU A 15 31.022 29.288 5.665 1.00 0.00 C \n", 4787 "ATOM 113 O LEU A 15 29.809 29.395 5.545 1.00 0.00 O \n", 4788 "ATOM 114 CB LEU A 15 31.562 29.686 8.045 1.00 0.00 C \n", 4789 "ATOM 115 CG LEU A 15 32.631 29.444 9.060 1.00 0.00 C \n", 4790 "ATOM 116 CD1 LEU A 15 33.814 30.390 9.030 1.00 0.00 C \n", 4791 "ATOM 117 CD2 LEU A 15 31.945 29.449 10.436 1.00 0.00 C \n", 4792 "ATOM 118 N GLU A 16 31.834 28.412 5.125 1.00 0.00 N \n", 4793 "ATOM 119 CA GLU A 16 31.220 27.341 4.275 1.00 0.00 C \n", 4794 "ATOM 120 C GLU A 16 31.440 26.079 5.080 1.00 0.00 C \n", 4795 "ATOM 121 O GLU A 16 32.576 25.802 5.461 1.00 0.00 O \n", 4796 "ATOM 122 CB GLU A 16 31.827 27.262 2.894 1.00 0.00 C \n", 4797 "ATOM 123 CG GLU A 16 31.363 28.410 1.962 1.00 0.00 C \n", 4798 "ATOM 124 CD GLU A 16 31.671 28.291 0.498 1.00 0.00 C \n", 4799 "ATOM 125 OE1 GLU A 16 30.869 28.621 -0.366 1.00 0.00 O \n", 4800 "ATOM 126 OE2 GLU A 16 32.835 27.861 0.278 1.00 0.00 O \n", 4801 "ATOM 127 N VAL A 17 30.310 25.458 5.384 1.00 0.00 N \n", 4802 "ATOM 128 CA VAL A 17 30.288 24.245 6.193 1.00 0.00 C \n", 4803 "ATOM 129 C VAL A 17 29.279 23.227 5.641 1.00 0.00 C \n", 4804 "ATOM 130 O VAL A 17 28.478 23.522 4.725 1.00 0.00 O \n", 4805 "ATOM 131 CB VAL A 17 29.903 24.590 7.665 1.00 0.00 C \n", 4806 "ATOM 132 CG1 VAL A 17 30.862 25.496 8.389 1.00 0.00 C \n", 4807 "ATOM 133 CG2 VAL A 17 28.476 25.135 7.705 1.00 0.00 C \n", 4808 "ATOM 134 N GLU A 18 29.380 22.057 6.232 1.00 0.00 N \n", 4809 "ATOM 135 CA GLU A 18 28.468 20.940 5.980 1.00 0.00 C \n", 4810 "ATOM 136 C GLU A 18 27.819 20.609 7.316 1.00 0.00 C \n", 4811 "ATOM 137 O GLU A 18 28.449 20.674 8.360 1.00 0.00 O \n", 4812 "ATOM 138 CB GLU A 18 29.213 19.697 5.506 1.00 0.00 C \n", 4813 "ATOM 139 CG GLU A 18 29.728 19.755 4.060 1.00 0.00 C \n", 4814 "ATOM 140 CD GLU A 18 28.754 20.061 2.978 1.00 0.00 C \n", 4815 "ATOM 141 OE1 GLU A 18 27.546 19.992 2.985 1.00 0.00 O \n", 4816 "ATOM 142 OE2 GLU A 18 29.336 20.423 1.904 1.00 0.00 O \n", 4817 "ATOM 143 N PRO A 19 26.559 20.220 7.288 1.00 0.00 N \n", 4818 "ATOM 144 CA PRO A 19 25.829 19.825 8.494 1.00 0.00 C \n", 4819 "ATOM 145 C PRO A 19 26.541 18.732 9.251 1.00 0.00 C \n", 4820 "ATOM 146 O PRO A 19 26.333 18.536 10.457 1.00 0.00 O \n", 4821 "ATOM 147 CB PRO A 19 24.469 19.332 7.952 1.00 0.00 C \n", 4822 "ATOM 148 CG PRO A 19 24.299 20.134 6.704 1.00 0.00 C \n", 4823 "ATOM 149 CD PRO A 19 25.714 20.108 6.073 1.00 0.00 C \n", 4824 "ATOM 150 N SER A 20 27.361 17.959 8.559 1.00 0.00 N \n", 4825 "ATOM 151 CA SER A 20 28.054 16.835 9.210 1.00 0.00 C \n", 4826 "ATOM 152 C SER A 20 29.258 17.318 9.984 1.00 0.00 C \n", 4827 "ATOM 153 O SER A 20 29.930 16.477 10.606 1.00 0.00 O \n", 4828 "ATOM 154 CB SER A 20 28.523 15.820 8.182 1.00 0.00 C \n", 4829 "ATOM 155 OG SER A 20 28.946 16.445 6.967 1.00 0.00 O \n", 4830 "ATOM 156 N ASP A 21 29.599 18.599 9.828 1.00 0.00 N \n", 4831 "ATOM 157 CA ASP A 21 30.796 19.083 10.566 1.00 0.00 C \n", 4832 "ATOM 158 C ASP A 21 30.491 19.162 12.040 1.00 0.00 C \n", 4833 "ATOM 159 O ASP A 21 29.367 19.523 12.441 1.00 0.00 O \n", 4834 "ATOM 160 CB ASP A 21 31.155 20.515 10.048 1.00 0.00 C \n", 4835 "ATOM 161 CG ASP A 21 31.923 20.436 8.755 1.00 0.00 C \n", 4836 "ATOM 162 OD1 ASP A 21 32.493 19.374 8.456 1.00 0.00 O \n", 4837 "ATOM 163 OD2 ASP A 21 31.838 21.402 7.968 1.00 0.00 O \n", 4838 "ATOM 164 N THR A 22 31.510 18.936 12.852 1.00 0.00 N \n", 4839 "ATOM 165 CA THR A 22 31.398 19.064 14.286 1.00 0.00 C \n", 4840 "ATOM 166 C THR A 22 31.593 20.553 14.655 1.00 0.00 C \n", 4841 "ATOM 167 O THR A 22 32.159 21.311 13.861 1.00 0.00 O \n", 4842 "ATOM 168 CB THR A 22 32.492 18.193 14.995 1.00 0.00 C \n", 4843 "ATOM 169 OG1 THR A 22 33.778 18.739 14.516 1.00 0.00 O \n", 4844 "ATOM 170 CG2 THR A 22 32.352 16.700 14.630 1.00 0.00 C \n", 4845 "ATOM 171 N ILE A 23 31.113 20.863 15.860 1.00 0.00 N \n", 4846 "ATOM 172 CA ILE A 23 31.288 22.201 16.417 1.00 0.00 C \n", 4847 "ATOM 173 C ILE A 23 32.776 22.519 16.577 1.00 0.00 C \n", 4848 "ATOM 174 O ILE A 23 33.233 23.659 16.384 1.00 0.00 O \n", 4849 "ATOM 175 CB ILE A 23 30.520 22.300 17.764 1.00 0.00 C \n", 4850 "ATOM 176 CG1 ILE A 23 29.006 22.043 17.442 1.00 0.00 C \n", 4851 "ATOM 177 CG2 ILE A 23 30.832 23.699 18.358 1.00 0.00 C \n", 4852 "ATOM 178 CD1 ILE A 23 28.407 22.948 16.366 1.00 0.00 C \n", 4853 "ATOM 179 N GLU A 24 33.548 21.526 16.950 1.00 0.00 N \n", 4854 "ATOM 180 CA GLU A 24 35.031 21.722 17.069 1.00 0.00 C \n", 4855 "ATOM 181 C GLU A 24 35.615 22.190 15.759 1.00 0.00 C \n", 4856 "ATOM 182 O GLU A 24 36.532 23.046 15.724 1.00 0.00 O \n", 4857 "ATOM 183 CB GLU A 24 35.667 20.383 17.447 1.00 0.00 C \n", 4858 "ATOM 184 CG GLU A 24 37.128 20.293 17.872 1.00 0.00 C \n", 4859 "ATOM 185 CD GLU A 24 37.561 18.851 18.082 1.00 0.00 C \n", 4860 "ATOM 186 OE1 GLU A 24 37.758 18.024 17.195 1.00 0.00 O \n", 4861 "ATOM 187 OE2 GLU A 24 37.628 18.599 19.313 1.00 0.00 O \n", 4862 "ATOM 188 N ASN A 25 35.139 21.624 14.662 1.00 0.00 N \n", 4863 "ATOM 189 CA ASN A 25 35.590 21.945 13.302 1.00 0.00 C \n", 4864 "ATOM 190 C ASN A 25 35.238 23.382 12.920 1.00 0.00 C \n", 4865 "ATOM 191 O ASN A 25 36.066 24.109 12.333 1.00 0.00 O \n", 4866 "ATOM 192 CB ASN A 25 35.064 20.957 12.255 1.00 0.00 C \n", 4867 "ATOM 193 CG ASN A 25 35.541 21.418 10.871 1.00 0.00 C \n", 4868 "ATOM 194 OD1 ASN A 25 36.772 21.623 10.676 1.00 0.00 O \n", 4869 "ATOM 195 ND2 ASN A 25 34.628 21.595 9.920 1.00 0.00 N \n", 4870 "ATOM 196 N VAL A 26 34.007 23.745 13.250 1.00 0.00 N \n", 4871 "ATOM 197 CA VAL A 26 33.533 25.097 12.978 1.00 0.00 C \n", 4872 "ATOM 198 C VAL A 26 34.441 26.099 13.684 1.00 0.00 C \n", 4873 "ATOM 199 O VAL A 26 34.883 27.090 13.093 1.00 0.00 O \n", 4874 "ATOM 200 CB VAL A 26 32.060 25.257 13.364 1.00 0.00 C \n", 4875 "ATOM 201 CG1 VAL A 26 31.684 26.749 13.342 1.00 0.00 C \n", 4876 "ATOM 202 CG2 VAL A 26 31.152 24.421 12.477 1.00 0.00 C \n", 4877 "ATOM 203 N LYS A 27 34.734 25.822 14.949 1.00 0.00 N \n", 4878 "ATOM 204 CA LYS A 27 35.596 26.715 15.736 1.00 0.00 C \n", 4879 "ATOM 205 C LYS A 27 36.975 26.826 15.107 1.00 0.00 C \n", 4880 "ATOM 206 O LYS A 27 37.579 27.926 15.159 1.00 0.00 O \n", 4881 "ATOM 207 CB LYS A 27 35.715 26.203 17.172 1.00 0.00 C \n", 4882 "ATOM 208 CG LYS A 27 34.343 26.445 17.898 1.00 0.00 C \n", 4883 "ATOM 209 CD LYS A 27 34.509 26.077 19.360 1.00 0.00 C \n", 4884 "ATOM 210 CE LYS A 27 33.206 26.311 20.122 1.00 0.00 C \n", 4885 "ATOM 211 NZ LYS A 27 33.455 25.910 21.546 1.00 0.00 N \n", 4886 "ATOM 212 N ALA A 28 37.499 25.743 14.571 1.00 0.00 N \n", 4887 "ATOM 213 CA ALA A 28 38.794 25.761 13.880 1.00 0.00 C \n", 4888 "ATOM 214 C ALA A 28 38.728 26.591 12.611 1.00 0.00 C \n", 4889 "ATOM 215 O ALA A 28 39.704 27.346 12.277 1.00 0.00 O \n", 4890 "ATOM 216 CB ALA A 28 39.285 24.336 13.566 1.00 0.00 C \n", 4891 "ATOM 217 N LYS A 29 37.633 26.543 11.867 1.00 0.00 N \n", 4892 "ATOM 218 CA LYS A 29 37.471 27.391 10.668 1.00 0.00 C \n", 4893 "ATOM 219 C LYS A 29 37.441 28.882 11.052 1.00 0.00 C \n", 4894 "ATOM 220 O LYS A 29 38.020 29.772 10.382 1.00 0.00 O \n", 4895 "ATOM 221 CB LYS A 29 36.193 27.058 9.911 1.00 0.00 C \n", 4896 "ATOM 222 CG LYS A 29 36.153 25.620 9.409 1.00 0.00 C \n", 4897 "ATOM 223 CD LYS A 29 34.758 25.280 8.900 1.00 0.00 C \n", 4898 "ATOM 224 CE LYS A 29 34.793 24.264 7.767 1.00 0.00 C \n", 4899 "ATOM 225 NZ LYS A 29 34.914 24.944 6.441 1.00 0.00 N \n", 4900 "ATOM 226 N ILE A 30 36.811 29.170 12.192 1.00 0.00 N \n", 4901 "ATOM 227 CA ILE A 30 36.731 30.570 12.645 1.00 0.00 C \n", 4902 "ATOM 228 C ILE A 30 38.148 30.981 13.069 1.00 0.00 C \n", 4903 "ATOM 229 O ILE A 30 38.544 32.150 12.856 1.00 0.00 O \n", 4904 "ATOM 230 CB ILE A 30 35.708 30.776 13.806 1.00 0.00 C \n", 4905 "ATOM 231 CG1 ILE A 30 34.228 30.630 13.319 1.00 0.00 C \n", 4906 "ATOM 232 CG2 ILE A 30 35.874 32.138 14.512 1.00 0.00 C \n", 4907 "ATOM 233 CD1 ILE A 30 33.284 30.504 14.552 1.00 0.00 C \n", 4908 "ATOM 234 N GLN A 31 38.883 30.110 13.713 1.00 0.00 N \n", 4909 "ATOM 235 CA GLN A 31 40.269 30.508 14.115 1.00 0.00 C \n", 4910 "ATOM 236 C GLN A 31 41.092 30.808 12.851 1.00 0.00 C \n", 4911 "ATOM 237 O GLN A 31 41.828 31.808 12.681 1.00 0.00 O \n", 4912 "ATOM 238 CB GLN A 31 40.996 29.399 14.865 1.00 0.00 C \n", 4913 "ATOM 239 CG GLN A 31 42.445 29.848 15.182 1.00 0.00 C \n", 4914 "ATOM 240 CD GLN A 31 43.090 28.828 16.095 1.00 0.00 C \n", 4915 "ATOM 241 OE1 GLN A 31 42.770 27.655 15.906 1.00 0.00 O \n", 4916 "ATOM 242 NE2 GLN A 31 43.898 29.252 17.050 1.00 0.00 N \n", 4917 "ATOM 243 N ASP A 32 41.001 29.878 11.931 1.00 0.00 N \n", 4918 "ATOM 244 CA ASP A 32 41.718 30.022 10.643 1.00 0.00 C \n", 4919 "ATOM 245 C ASP A 32 41.399 31.338 9.967 1.00 0.00 C \n", 4920 "ATOM 246 O ASP A 32 42.260 32.036 9.381 1.00 0.00 O \n", 4921 "ATOM 247 CB ASP A 32 41.398 28.780 9.810 1.00 0.00 C \n", 4922 "ATOM 248 CG ASP A 32 42.626 28.557 8.928 1.00 0.00 C \n", 4923 "ATOM 249 OD1 ASP A 32 43.666 28.262 9.539 1.00 0.00 O \n", 4924 "ATOM 250 OD2 ASP A 32 42.430 28.812 7.728 1.00 0.00 O \n", 4925 "ATOM 251 N LYS A 33 40.117 31.750 9.988 1.00 0.00 N \n", 4926 "ATOM 252 CA LYS A 33 39.808 32.994 9.233 1.00 0.00 C \n", 4927 "ATOM 253 C LYS A 33 39.837 34.271 9.995 1.00 0.00 C \n", 4928 "ATOM 254 O LYS A 33 40.164 35.323 9.345 1.00 0.00 O \n", 4929 "ATOM 255 CB LYS A 33 38.615 32.801 8.320 1.00 0.00 C \n", 4930 "ATOM 256 CG LYS A 33 37.220 32.822 8.827 1.00 0.00 C \n", 4931 "ATOM 257 CD LYS A 33 36.351 33.613 7.838 1.00 0.00 C \n", 4932 "ATOM 258 CE LYS A 33 36.322 32.944 6.477 1.00 0.00 C \n", 4933 "ATOM 259 NZ LYS A 33 35.768 33.945 5.489 1.00 0.00 N \n", 4934 "ATOM 260 N GLU A 34 39.655 34.335 11.285 1.00 0.00 N \n", 4935 "ATOM 261 CA GLU A 34 39.676 35.547 12.072 1.00 0.00 C \n", 4936 "ATOM 262 C GLU A 34 40.675 35.527 13.200 1.00 0.00 C \n", 4937 "ATOM 263 O GLU A 34 40.814 36.528 13.911 1.00 0.00 O \n", 4938 "ATOM 264 CB GLU A 34 38.290 35.814 12.698 1.00 0.00 C \n", 4939 "ATOM 265 CG GLU A 34 37.156 35.985 11.688 1.00 0.00 C \n", 4940 "ATOM 266 CD GLU A 34 37.192 37.361 11.033 1.00 0.00 C \n", 4941 "ATOM 267 OE1 GLU A 34 37.519 38.360 11.645 1.00 0.00 O \n", 4942 "ATOM 268 OE2 GLU A 34 36.861 37.320 9.822 1.00 0.00 O \n", 4943 "TER 269 GLU A 34 \n", 4944 "MASTER 0 0 0 0 0 0 0 0 268 1 0 0 \n", 4945 "END \n" 4946 ] 4947 4948 # Check the data. 4949 self.strip_remarks(lines) 4950 self.assertEqual(len(real_data), len(lines)) 4951 for i in range(len(real_data)): 4952 self.assertEqual(real_data[i], lines[i])
4953 4954
4955 - def test_read_xyz_internal1(self):
4956 """Load the 'Indol_test.xyz' XYZ file (using the internal structural object XYZ reader).""" 4957 4958 # Path of the files. 4959 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 4960 4961 # Read the XYZ file. 4962 self.interpreter.structure.read_xyz(file='Indol_test.xyz', dir=path) 4963 4964 # Test the molecule name. 4965 self.assertEqual(cdp.structure.structural_data[0].mol[0].mol_name, 'Indol_test_mol1') 4966 4967 # Load a single atom and test it. 4968 self.interpreter.structure.load_spins('#Indol_test_mol1@3') 4969 self.assertEqual(count_spins(), 1) 4970 4971 # Try loading a few protons. 4972 self.interpreter.structure.load_spins('@*H*') 4973 4974 # And now all the rest of the atoms. 4975 self.interpreter.structure.load_spins()
4976 4977
4978 - def test_read_xyz_internal2(self):
4979 """Load the 'SSS-cluster4-new-test.xyz' XYZ file (using the internal structural object XYZ reader).""" 4980 4981 # Path of the files. 4982 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 4983 4984 # Read the XYZ file. 4985 self.interpreter.structure.read_xyz(file='SSS-cluster4-new-test.xyz', dir=path, read_model=[1]) 4986 4987 # Test the molecule name. 4988 self.assertEqual(cdp.structure.structural_data[0].mol[0].mol_name, 'SSS-cluster4-new-test_mol1') 4989 4990 # Load a single atom and test it. 4991 self.interpreter.structure.load_spins('#SSS-cluster4-new-test_mol1@2') 4992 self.assertEqual(count_spins(), 1) 4993 4994 # Test the spin coordinates. 4995 a=return_spin('#SSS-cluster4-new-test_mol1@2') 4996 self.assertAlmostEqual(a.pos[0], -12.398) 4997 self.assertAlmostEqual(a.pos[1], -15.992) 4998 self.assertAlmostEqual(a.pos[2], 11.448) 4999 5000 # Try loading a few protons. 5001 #self.interpreter.structure.load_spins('@H') 5002 5003 # And now all the rest of the atoms. 5004 self.interpreter.structure.load_spins() 5005 5006 # Extract a vector between first two spins. 5007 self.interpreter.interatom.define(spin_id1='@2', spin_id2='@10') 5008 self.interpreter.interatom.unit_vectors() 5009 self.assertAlmostEqual(cdp.interatomic[0].vector[0], -0.4102707) 5010 self.assertAlmostEqual(cdp.interatomic[0].vector[1], 0.62128879) 5011 self.assertAlmostEqual(cdp.interatomic[0].vector[2], -0.6675913)
5012 5013
5014 - def test_read_xyz_strychnine(self):
5015 """Load the 'strychnine.xyz' XYZ file (using the internal structural object XYZ reader).""" 5016 5017 # Path of the files. 5018 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 5019 5020 # Read the XYZ file. 5021 self.interpreter.structure.read_xyz(file='strychnine.xyz', dir=path, set_mol_name='strychnine') 5022 5023 # Test the molecule data. 5024 self.assertEqual(len(cdp.structure.structural_data), 1) 5025 self.assertEqual(len(cdp.structure.structural_data[0].mol), 1) 5026 5027 # Load the carbon atoms and test it. 5028 self.interpreter.structure.load_spins('@C') 5029 self.assertEqual(count_spins(), 21) 5030 5031 # Load the protons. 5032 self.interpreter.structure.load_spins('@H') 5033 self.assertEqual(count_spins(), 43) 5034 5035 # And now all the rest of the atoms. 5036 self.interpreter.structure.load_spins()
5037 5038
5039 - def test_rmsd(self):
5040 """Test the structure.rmsd user function.""" 5041 5042 # Set up 3 models. 5043 self.interpreter.structure.add_model(model_num=1) 5044 self.interpreter.structure.add_model(model_num=2) 5045 self.interpreter.structure.add_model(model_num=4) 5046 5047 # Check that the models were correctly created. 5048 self.assert_(hasattr(cdp, 'structure')) 5049 self.assert_(hasattr(cdp.structure, 'structural_data')) 5050 self.assertEqual(len(cdp.structure.structural_data), 3) 5051 5052 # Create a structure with some atoms. 5053 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=1, pos=[[1., 0., -1.], [0., 0., 0.], [-1., 0., 1.]], element='S') 5054 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=2, pos=[[1., 2., -1.], [0., 2., 0.], [-1., 2., 1.]], element='S') 5055 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=3, pos=[[1., 20., -1.], [0., 20., 0.], [-1., 20., 1.]], element='S') 5056 5057 # Check the internal atomic info. 5058 self.assertEqual(cdp.structure.structural_data[0].mol[0].x, [1., 1., 1.]) 5059 self.assertEqual(cdp.structure.structural_data[0].mol[0].y, [0., 2., 20.]) 5060 self.assertEqual(cdp.structure.structural_data[0].mol[0].z, [-1., -1., -1.]) 5061 self.assertEqual(cdp.structure.structural_data[1].mol[0].x, [0., 0., 0.]) 5062 self.assertEqual(cdp.structure.structural_data[1].mol[0].y, [0., 2., 20.]) 5063 self.assertEqual(cdp.structure.structural_data[1].mol[0].z, [0., 0., 0.]) 5064 self.assertEqual(cdp.structure.structural_data[2].mol[0].x, [-1., -1., -1.]) 5065 self.assertEqual(cdp.structure.structural_data[2].mol[0].y, [0., 2., 20.]) 5066 self.assertEqual(cdp.structure.structural_data[2].mol[0].z, [1., 1., 1.]) 5067 5068 # Calculate the RMSD. 5069 self.interpreter.structure.rmsd() 5070 5071 # Checks. 5072 self.assert_(hasattr(cdp.structure, 'rmsd')) 5073 self.assertAlmostEqual(cdp.structure.rmsd, sqrt(4.0/3.0))
5074 5075
5076 - def test_rmsd_molecules(self):
5077 """Test the structure.rmsd user function for different molecules in one pipe. 5078 5079 This checks the molecules argument of the U{structure.rmsd user function<http://www.nmr-relax.com/manual/structure_rmsd.html>}. 5080 """ 5081 5082 # Create three molecules 'X', 'Y', and 'Z' with a some atoms. 5083 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=1, mol_name='X', pos=[1., 0., -1.], element='S') 5084 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=1, mol_name='Y', pos=[0., 0., 0.], element='S') 5085 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=1, mol_name='Z', pos=[-1., 0., 1.], element='S') 5086 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=2, mol_name='X', pos=[1., 2., -1.], element='S') 5087 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=2, mol_name='Y', pos=[0., 2., 0.], element='S') 5088 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=2, mol_name='Z', pos=[-1., 2., 1.], element='S') 5089 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=3, mol_name='X', pos=[1., 20., -1.], element='S') 5090 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=3, mol_name='Y', pos=[0., 20., 0.], element='S') 5091 self.interpreter.structure.add_atom(atom_name='A', res_name='UNK', res_num=3, mol_name='Z', pos=[-1., 20., 1.], element='S') 5092 5093 # Calculate the RMSD. 5094 self.interpreter.structure.rmsd(molecules=[['X', 'Y', 'Z']]) 5095 5096 # Checks. 5097 self.assert_(hasattr(cdp.structure, 'rmsd')) 5098 self.assertAlmostEqual(cdp.structure.rmsd, sqrt(4.0/3.0))
5099 5100
5101 - def test_rmsd_spins(self):
5102 """Test the structure.rmsd user function for per-atom RMSDs.""" 5103 5104 # Set up 3 models. 5105 self.interpreter.structure.add_model(model_num=1) 5106 self.interpreter.structure.add_model(model_num=2) 5107 self.interpreter.structure.add_model(model_num=4) 5108 5109 # Check that the models were correctly created. 5110 self.assert_(hasattr(cdp, 'structure')) 5111 self.assert_(hasattr(cdp.structure, 'structural_data')) 5112 self.assertEqual(len(cdp.structure.structural_data), 3) 5113 5114 # Create a structure with some atoms. 5115 self.interpreter.structure.add_atom(atom_name='CA', res_name='UNK', res_num=1, pos=[[1., 0., -1.], [0., 0., 0.], [-1., 0., 1.]], element='S') 5116 self.interpreter.structure.add_atom(atom_name='CA', res_name='UNK', res_num=2, pos=[[1., 2., -1.], [0., 2., 0.], [-1., 2., 1.]], element='S') 5117 self.interpreter.structure.add_atom(atom_name='CA', res_name='UNK', res_num=3, pos=[[1., 20., -1.], [0., 20., 0.], [-1., 20., 1.]], element='S') 5118 5119 # Check the internal atomic info. 5120 self.assertEqual(cdp.structure.structural_data[0].mol[0].x, [1., 1., 1.]) 5121 self.assertEqual(cdp.structure.structural_data[0].mol[0].y, [0., 2., 20.]) 5122 self.assertEqual(cdp.structure.structural_data[0].mol[0].z, [-1., -1., -1.]) 5123 self.assertEqual(cdp.structure.structural_data[1].mol[0].x, [0., 0., 0.]) 5124 self.assertEqual(cdp.structure.structural_data[1].mol[0].y, [0., 2., 20.]) 5125 self.assertEqual(cdp.structure.structural_data[1].mol[0].z, [0., 0., 0.]) 5126 self.assertEqual(cdp.structure.structural_data[2].mol[0].x, [-1., -1., -1.]) 5127 self.assertEqual(cdp.structure.structural_data[2].mol[0].y, [0., 2., 20.]) 5128 self.assertEqual(cdp.structure.structural_data[2].mol[0].z, [1., 1., 1.]) 5129 5130 # Create the spins from the structural data. 5131 self.interpreter.structure.load_spins(ave_pos=False) 5132 5133 # Calculate the RMSD. 5134 self.interpreter.structure.rmsd(atomic=True) 5135 5136 # Checks. 5137 self.assertAlmostEqual(cdp.mol[0].res[0].spin[0].pos_rmsd, sqrt(4.0/3.0)) 5138 self.assertAlmostEqual(cdp.mol[0].res[1].spin[0].pos_rmsd, sqrt(4.0/3.0)) 5139 self.assertAlmostEqual(cdp.mol[0].res[2].spin[0].pos_rmsd, sqrt(4.0/3.0))
5140 5141
5142 - def test_rmsd_ubi(self):
5143 """Test the structure.rmsd user function on the truncated ubiquitin ensemble.""" 5144 5145 # Load the structure. 5146 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 5147 self.interpreter.structure.read_pdb('trunc_ubi_pcs.pdb', dir=path) 5148 5149 # Calculate the RMSD. 5150 self.interpreter.structure.rmsd() 5151 5152 # The per-structure RMSDs, and their quadratic average. 5153 all_rmsd = array([1.06994466835, 0.411387603119, 0.647768214719, 0.522216519591, 0.274450954939, 0.979817275482, 0.752817901842, 1.28956426491, 1.12979370978, 0.650514765397], float64) 5154 rmsd = sqrt(mean(all_rmsd**2)) 5155 5156 # Checks (the values match the VMD 1.9.1 RMSD numbers). 5157 self.assert_(hasattr(cdp.structure, 'rmsd')) 5158 self.assertAlmostEqual(cdp.structure.rmsd, rmsd)
5159 5160
5162 """Test of the structure.sequence_alignment user function using the 'Central Star', 'NW70', and 'BLOSUM62' options.""" 5163 5164 # Path of the structure file. 5165 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'frame_order'+sep+'cam' 5166 5167 # Load the two rotated structures. 5168 self.interpreter.structure.read_pdb('1J7P_1st_NH.pdb', dir=path, set_model_num=1, set_mol_name='CaM A') 5169 self.interpreter.structure.read_pdb('1J7P_1st_NH_rot.pdb', dir=path, set_model_num=1, set_mol_name='CaM B') 5170 5171 # Delete some residues. 5172 self.interpreter.structure.delete("#CaM B:82") 5173 self.interpreter.structure.delete("#CaM A:100-120") 5174 5175 # Perform the alignment. 5176 self.interpreter.structure.sequence_alignment(pipes=['mf'], models=[[1, 1]], molecules=[['CaM A', 'CaM B']], msa_algorithm='Central Star', pairwise_algorithm='NW70', matrix='BLOSUM62', gap_open_penalty=10.0, gap_extend_penalty=1.0, end_gap_open_penalty=0.5, end_gap_extend_penalty=0.1) 5177 5178 # Save the relax state. 5179 self.tmpfile = mktemp() 5180 self.interpreter.state.save(self.tmpfile, dir=None, force=True) 5181 5182 # Reset relax. 5183 self.interpreter.reset() 5184 5185 # Load the results. 5186 self.interpreter.state.load(self.tmpfile) 5187 5188 # The real data. 5189 pipes = ['mf', 'mf'] 5190 models = [1, 1] 5191 molecules = ['CaM A', 'CaM B'] 5192 ids = ["Object 'mf'; Model 1; Molecule 'CaM A'", "Object 'mf'; Model 1; Molecule 'CaM B'"] 5193 sequences = [ 5194 'EEEIREAFRVFDKDGNGYVDEMIREADIDGDGQVNYEEFVQMMTAK**', 5195 'EEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMTAK**' 5196 ] 5197 strings = [ 5198 'EEEIREAFRVFDKDGNGY---------------------VDEMIREADIDGDGQVNYEEFVQMMTAK**', 5199 '-EEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMTAK**' 5200 ] 5201 gaps = [] 5202 for i in range(len(strings)): 5203 gaps.append([]) 5204 for j in range(len(strings[0])): 5205 gaps[i].append(0) 5206 for i in range(18, 39): 5207 gaps[0][i] = 1 5208 gaps[1][0] = 1 5209 msa_algorithm = 'Central Star' 5210 pairwise_algorithm = 'NW70' 5211 matrix = 'BLOSUM62' 5212 gap_open_penalty = 10.0 5213 gap_extend_penalty = 1.0 5214 end_gap_open_penalty = 0.5 5215 end_gap_extend_penalty = 0.1 5216 5217 # Check the data. 5218 for i in range(2): 5219 print("Checking \"%s\"" % molecules[i]) 5220 self.assertEqual(ds.sequence_alignments[0].ids[i], ids[i]) 5221 self.assertEqual(ds.sequence_alignments[0].object_ids[i], pipes[i]) 5222 self.assertEqual(ds.sequence_alignments[0].models[i], models[i]) 5223 self.assertEqual(ds.sequence_alignments[0].molecules[i], molecules[i]) 5224 self.assertEqual(ds.sequence_alignments[0].sequences[i], sequences[i]) 5225 self.assertEqual(ds.sequence_alignments[0].strings[i], strings[i]) 5226 for j in range(len(strings[0])): 5227 self.assertEqual(ds.sequence_alignments[0].gaps[i, j], gaps[i][j]) 5228 self.assertEqual(ds.sequence_alignments[0].msa_algorithm, msa_algorithm) 5229 self.assertEqual(ds.sequence_alignments[0].pairwise_algorithm, pairwise_algorithm) 5230 self.assertEqual(ds.sequence_alignments[0].matrix, matrix) 5231 self.assertEqual(ds.sequence_alignments[0].gap_open_penalty, gap_open_penalty) 5232 self.assertEqual(ds.sequence_alignments[0].gap_extend_penalty, gap_extend_penalty) 5233 self.assertEqual(ds.sequence_alignments[0].end_gap_open_penalty, end_gap_open_penalty) 5234 self.assertEqual(ds.sequence_alignments[0].end_gap_extend_penalty, end_gap_extend_penalty)
5235 5236
5238 """Test of the structure.sequence_alignment user function using the 'residue number' MSA algorithm.""" 5239 5240 # Path of the structure file. 5241 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'frame_order'+sep+'cam' 5242 5243 # Load the two rotated structures. 5244 self.interpreter.structure.read_pdb('1J7P_1st_NH.pdb', dir=path, set_model_num=1, set_mol_name='CaM A') 5245 self.interpreter.structure.read_pdb('1J7P_1st_NH_rot.pdb', dir=path, set_model_num=1, set_mol_name='CaM B') 5246 5247 # Delete some residues. 5248 self.interpreter.structure.delete("#CaM B:82") 5249 self.interpreter.structure.delete("#CaM A:100-120") 5250 self.interpreter.structure.delete(":CA") 5251 5252 # Perform the alignment. 5253 self.interpreter.structure.sequence_alignment(pipes=['mf'], models=[[1, 1]], molecules=[['CaM A', 'CaM B']], msa_algorithm='residue number') 5254 5255 # Save the relax state. 5256 self.tmpfile = mktemp() 5257 self.interpreter.state.save(self.tmpfile, dir=None, force=True) 5258 5259 # Reset relax. 5260 self.interpreter.reset() 5261 5262 # Load the results. 5263 self.interpreter.state.load(self.tmpfile) 5264 5265 # The real data. 5266 pipes = ['mf', 'mf'] 5267 models = [1, 1] 5268 molecules = ['CaM A', 'CaM B'] 5269 ids = ["Object 'mf'; Model 1; Molecule 'CaM A'", "Object 'mf'; Model 1; Molecule 'CaM B'"] 5270 sequences = [ 5271 'EEEIREAFRVFDKDGNGYVDEMIREADIDGDGQVNYEEFVQMMTAK', 5272 'EEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMTAK' 5273 ] 5274 strings = [ 5275 'EEEIREAFRVFDKDGNGY---------------------VDEMIREADIDGDGQVNYEEFVQMMTAK', 5276 '-EEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMTAK' 5277 ] 5278 gaps = [] 5279 for i in range(len(strings)): 5280 gaps.append([]) 5281 for j in range(len(strings[0])): 5282 gaps[i].append(0) 5283 for i in range(18, 39): 5284 gaps[0][i] = 1 5285 gaps[1][0] = 1 5286 msa_algorithm = 'residue number' 5287 pairwise_algorithm = None 5288 matrix = None 5289 gap_open_penalty = None 5290 gap_extend_penalty = None 5291 end_gap_open_penalty = None 5292 end_gap_extend_penalty = None 5293 5294 # Check the data. 5295 for i in range(2): 5296 print("Checking \"%s\"" % molecules[i]) 5297 self.assertEqual(ds.sequence_alignments[0].ids[i], ids[i]) 5298 self.assertEqual(ds.sequence_alignments[0].object_ids[i], pipes[i]) 5299 self.assertEqual(ds.sequence_alignments[0].models[i], models[i]) 5300 self.assertEqual(ds.sequence_alignments[0].molecules[i], molecules[i]) 5301 self.assertEqual(ds.sequence_alignments[0].sequences[i], sequences[i]) 5302 self.assertEqual(ds.sequence_alignments[0].strings[i], strings[i]) 5303 for j in range(len(strings[0])): 5304 self.assertEqual(ds.sequence_alignments[0].gaps[i, j], gaps[i][j]) 5305 self.assertEqual(ds.sequence_alignments[0].msa_algorithm, msa_algorithm) 5306 self.assertEqual(ds.sequence_alignments[0].pairwise_algorithm, pairwise_algorithm) 5307 self.assertEqual(ds.sequence_alignments[0].matrix, matrix) 5308 self.assertEqual(ds.sequence_alignments[0].gap_open_penalty, gap_open_penalty) 5309 self.assertEqual(ds.sequence_alignments[0].gap_extend_penalty, gap_extend_penalty) 5310 self.assertEqual(ds.sequence_alignments[0].end_gap_open_penalty, end_gap_open_penalty) 5311 self.assertEqual(ds.sequence_alignments[0].end_gap_extend_penalty, end_gap_extend_penalty)
5312 5313
5315 """Test of the structure.superimpose user function, fitting to the first structure.""" 5316 5317 # Path of the structure file. 5318 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'frame_order'+sep+'cam' 5319 5320 # Load the two rotated structures. 5321 self.interpreter.structure.read_pdb('1J7P_1st_NH.pdb', dir=path, set_model_num=1, set_mol_name='CaM') 5322 self.interpreter.structure.read_pdb('1J7P_1st_NH_rot.pdb', dir=path, set_model_num=2, set_mol_name='CaM') 5323 self.interpreter.structure.read_pdb('1J7P_1st_NH.pdb', dir=path, set_model_num=3, set_mol_name='CaM') 5324 5325 # Superimpose the backbone heavy atoms. 5326 self.interpreter.structure.superimpose(method='fit to first', atom_id='@N,C,CA,O') 5327 5328 # Check that the two structures now have the same atomic coordinates. 5329 model1 = cdp.structure.structural_data[0].mol[0] 5330 model2 = cdp.structure.structural_data[1].mol[0] 5331 model3 = cdp.structure.structural_data[2].mol[0] 5332 for i in range(len(model1.atom_name)): 5333 # Check model 2. 5334 self.assertAlmostEqual(model1.x[i], model2.x[i], 2) 5335 self.assertAlmostEqual(model1.y[i], model2.y[i], 2) 5336 self.assertAlmostEqual(model1.z[i], model2.z[i], 2) 5337 5338 # Check model 3. 5339 self.assertAlmostEqual(model1.x[i], model3.x[i], 2) 5340 self.assertAlmostEqual(model1.y[i], model3.y[i], 2) 5341 self.assertAlmostEqual(model1.z[i], model3.z[i], 2)
5342 5343
5345 """Test of the structure.superimpose user function, fitting to the mean structure.""" 5346 5347 # Path of the structure file. 5348 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'frame_order'+sep+'cam' 5349 5350 # Load the two rotated structures. 5351 self.interpreter.structure.read_pdb('1J7P_1st_NH.pdb', dir=path, set_model_num=1, set_mol_name='CaM') 5352 self.interpreter.structure.read_pdb('1J7P_1st_NH_rot.pdb', dir=path, set_model_num=2, set_mol_name='CaM') 5353 5354 # Add an atom that should not be superimposed. 5355 self.interpreter.structure.add_atom(mol_name='CaM', atom_name='Ti', res_name='TST', res_num=1, pos=[[1.0, 2.0, 3.0], [2.0, 3.0, 4.0]], element='Ti', pdb_record='HETATM') 5356 5357 # Superimpose the backbone heavy atoms. 5358 self.interpreter.structure.superimpose(method='fit to mean', atom_id='@N,C,CA,O', displace_id=':82-5000') 5359 5360 # Check that the two structures now have the same atomic coordinates. 5361 model1 = cdp.structure.structural_data[0].mol[0] 5362 model2 = cdp.structure.structural_data[1].mol[0] 5363 for i in range(len(model1.atom_name)): 5364 if model1.res_num[i] == 1: 5365 continue 5366 self.assertAlmostEqual(model1.x[i], model2.x[i], 2) 5367 self.assertAlmostEqual(model1.y[i], model2.y[i], 2) 5368 self.assertAlmostEqual(model1.z[i], model2.z[i], 2) 5369 5370 # The first 'Ti' atom must be different - it is not displaced. 5371 self.assertAlmostEqual(model1.x[0] - model2.x[0], -1.0, 2) 5372 self.assertAlmostEqual(model1.y[0] - model2.y[0], -1.0, 2) 5373 self.assertAlmostEqual(model1.z[0] - model2.z[0], -1.0, 2)
5374 5375
5377 """Second test of the structure.superimpose user function, fitting to the mean structure.""" 5378 5379 # Path of the structure file. 5380 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'frame_order'+sep+'cam' 5381 5382 # Load the two rotated structures. 5383 self.interpreter.structure.read_pdb('1J7P_1st_NH.pdb', dir=path, set_model_num=1, set_mol_name='CaM') 5384 self.interpreter.structure.read_pdb('1J7P_1st_NH.pdb', dir=path, set_model_num=2, set_mol_name='CaM') 5385 self.interpreter.structure.read_pdb('1J7P_1st_NH.pdb', dir=path, set_model_num=3, set_mol_name='CaM') 5386 5387 # Transpose model 3. 5388 self.interpreter.structure.translate([20.0, 0.0, 0.0], model=3) 5389 5390 # Superimpose the backbone heavy atoms. 5391 self.interpreter.structure.superimpose(models=[[2, 3]], method='fit to mean', atom_id='@N,C,CA,O') 5392 5393 # Check that the two structures now have the same atomic coordinates as the original, but shifted 10 Angstrom in x. 5394 model1 = cdp.structure.structural_data[0].mol[0] 5395 model2 = cdp.structure.structural_data[1].mol[0] 5396 model3 = cdp.structure.structural_data[2].mol[0] 5397 for i in range(len(model1.atom_name)): 5398 # Check model 2. 5399 self.assertAlmostEqual(model1.x[i] + 10, model2.x[i], 2) 5400 self.assertAlmostEqual(model1.y[i], model2.y[i], 2) 5401 self.assertAlmostEqual(model1.z[i], model2.z[i], 2) 5402 5403 # Check model 3. 5404 self.assertAlmostEqual(model2.x[i], model3.x[i], 2) 5405 self.assertAlmostEqual(model2.y[i], model3.y[i], 2) 5406 self.assertAlmostEqual(model2.z[i], model3.z[i], 2)
5407 5408
5409 - def test_web_of_motion_12(self):
5410 """Check the operation of the structure.web_of_motion user function using structural models 1 and 2 (of 3).""" 5411 5412 # Load the file. 5413 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 5414 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path) 5415 5416 # Run the structure.web_of_motion user function and collect the results in a dummy file object. 5417 file = DummyFileObject() 5418 self.interpreter.structure.web_of_motion(file=file, models=[[1, 2]]) 5419 5420 # The result, without remarks. 5421 result = [ 5422 "ATOM 1 N LEU A 4 9.464 -9.232 27.573 1.00 0.00 N ", 5423 "ATOM 2 N LEU A 4 9.211 -9.425 26.970 1.00 0.00 N ", 5424 "ATOM 3 H LEU A 4 8.575 -8.953 27.963 1.00 0.00 H ", 5425 "ATOM 4 H LEU A 4 9.085 -9.743 27.919 1.00 0.00 H ", 5426 "ATOM 5 CA LEU A 4 10.302 -8.195 26.930 1.00 0.00 C ", 5427 "ATOM 6 CA LEU A 4 10.077 -8.221 26.720 1.00 0.00 C ", 5428 "ATOM 7 CB LEU A 4 9.494 -7.221 26.051 1.00 0.00 C ", 5429 "ATOM 8 CB LEU A 4 9.297 -7.096 26.024 1.00 0.00 C ", 5430 "ATOM 9 CG LEU A 4 10.107 -5.862 25.665 1.00 0.00 C ", 5431 "ATOM 10 CG LEU A 4 10.061 -5.803 25.679 1.00 0.00 C ", 5432 "ATOM 11 CD1 LEU A 4 11.182 -6.007 24.608 1.00 0.00 C ", 5433 "ATOM 12 CD1 LEU A 4 11.029 -6.002 24.507 1.00 0.00 C ", 5434 "ATOM 13 CD2 LEU A 4 9.036 -4.875 25.171 1.00 0.00 C ", 5435 "ATOM 14 CD2 LEU A 4 9.120 -4.618 25.384 1.00 0.00 C ", 5436 "ATOM 15 C LEU A 4 10.999 -7.436 28.046 1.00 0.00 C ", 5437 "ATOM 16 C LEU A 4 10.625 -7.721 28.047 1.00 0.00 C ", 5438 "TER 17 LEU A 4 ", 5439 "CONECT 1 2 ", 5440 "CONECT 2 1 ", 5441 "CONECT 3 4 ", 5442 "CONECT 4 3 ", 5443 "CONECT 5 6 ", 5444 "CONECT 6 5 ", 5445 "CONECT 7 8 ", 5446 "CONECT 8 7 ", 5447 "CONECT 9 10 ", 5448 "CONECT 10 9 ", 5449 "CONECT 11 12 ", 5450 "CONECT 12 11 ", 5451 "CONECT 13 14 ", 5452 "CONECT 14 13 ", 5453 "CONECT 15 16 ", 5454 "CONECT 16 15 ", 5455 "MASTER 0 0 0 0 0 0 0 0 16 1 16 0 ", 5456 "END " 5457 ] 5458 5459 # Check the created PDB file. 5460 lines = file.readlines() 5461 self.strip_remarks(lines) 5462 self.assertEqual(len(result), len(lines)) 5463 for i in range(len(lines)): 5464 self.assertEqual(result[i]+'\n', lines[i])
5465 5466
5468 """Check the operation of the structure.web_of_motion user function using molecules 1 and 2 (of 3).""" 5469 5470 # Load the file. 5471 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 5472 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path, read_model=1, set_mol_name='1', set_model_num=1) 5473 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path, read_model=2, set_mol_name='2', set_model_num=1) 5474 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path, read_model=3, set_mol_name='3', set_model_num=1) 5475 5476 # Run the structure.web_of_motion user function and collect the results in a dummy file object. 5477 file = DummyFileObject() 5478 self.interpreter.structure.web_of_motion(file=file, molecules=[['1', '2']]) 5479 5480 # The result, without remarks. 5481 result = [ 5482 "ATOM 1 N LEU A 4 9.464 -9.232 27.573 1.00 0.00 N ", 5483 "ATOM 2 N LEU A 4 9.211 -9.425 26.970 1.00 0.00 N ", 5484 "ATOM 3 H LEU A 4 8.575 -8.953 27.963 1.00 0.00 H ", 5485 "ATOM 4 H LEU A 4 9.085 -9.743 27.919 1.00 0.00 H ", 5486 "ATOM 5 CA LEU A 4 10.302 -8.195 26.930 1.00 0.00 C ", 5487 "ATOM 6 CA LEU A 4 10.077 -8.221 26.720 1.00 0.00 C ", 5488 "ATOM 7 CB LEU A 4 9.494 -7.221 26.051 1.00 0.00 C ", 5489 "ATOM 8 CB LEU A 4 9.297 -7.096 26.024 1.00 0.00 C ", 5490 "ATOM 9 CG LEU A 4 10.107 -5.862 25.665 1.00 0.00 C ", 5491 "ATOM 10 CG LEU A 4 10.061 -5.803 25.679 1.00 0.00 C ", 5492 "ATOM 11 CD1 LEU A 4 11.182 -6.007 24.608 1.00 0.00 C ", 5493 "ATOM 12 CD1 LEU A 4 11.029 -6.002 24.507 1.00 0.00 C ", 5494 "ATOM 13 CD2 LEU A 4 9.036 -4.875 25.171 1.00 0.00 C ", 5495 "ATOM 14 CD2 LEU A 4 9.120 -4.618 25.384 1.00 0.00 C ", 5496 "ATOM 15 C LEU A 4 10.999 -7.436 28.046 1.00 0.00 C ", 5497 "ATOM 16 C LEU A 4 10.625 -7.721 28.047 1.00 0.00 C ", 5498 "TER 17 LEU A 4 ", 5499 "CONECT 1 2 ", 5500 "CONECT 2 1 ", 5501 "CONECT 3 4 ", 5502 "CONECT 4 3 ", 5503 "CONECT 5 6 ", 5504 "CONECT 6 5 ", 5505 "CONECT 7 8 ", 5506 "CONECT 8 7 ", 5507 "CONECT 9 10 ", 5508 "CONECT 10 9 ", 5509 "CONECT 11 12 ", 5510 "CONECT 12 11 ", 5511 "CONECT 13 14 ", 5512 "CONECT 14 13 ", 5513 "CONECT 15 16 ", 5514 "CONECT 16 15 ", 5515 "MASTER 0 0 0 0 0 0 0 0 16 1 16 0 ", 5516 "END " 5517 ] 5518 5519 # Check the created PDB file. 5520 lines = file.readlines() 5521 self.strip_remarks(lines) 5522 self.assertEqual(len(result), len(lines)) 5523 for i in range(len(lines)): 5524 self.assertEqual(result[i]+'\n', lines[i])
5525 5526
5527 - def test_web_of_motion_13(self):
5528 """Check the operation of the structure.web_of_motion user function using structural models 1 and 3 (of 3).""" 5529 5530 # Load the file. 5531 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 5532 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path) 5533 5534 # Run the structure.web_of_motion user function and collect the results in a dummy file object. 5535 file = DummyFileObject() 5536 self.interpreter.structure.web_of_motion(file=file, models=[[1, 3]]) 5537 5538 # The result, without remarks. 5539 result = [ 5540 "ATOM 1 N LEU A 4 9.464 -9.232 27.573 1.00 0.00 N ", 5541 "ATOM 2 N LEU A 4 7.761 -6.392 27.161 1.00 0.00 N ", 5542 "ATOM 3 H LEU A 4 8.575 -8.953 27.963 1.00 0.00 H ", 5543 "ATOM 4 H LEU A 4 7.278 -6.195 28.026 1.00 0.00 H ", 5544 "ATOM 5 CA LEU A 4 10.302 -8.195 26.930 1.00 0.00 C ", 5545 "ATOM 6 CA LEU A 4 9.256 -6.332 27.183 1.00 0.00 C ", 5546 "ATOM 7 CB LEU A 4 9.494 -7.221 26.051 1.00 0.00 C ", 5547 "ATOM 8 CB LEU A 4 9.799 -5.331 26.144 1.00 0.00 C ", 5548 "ATOM 9 CG LEU A 4 10.107 -5.862 25.665 1.00 0.00 C ", 5549 "ATOM 10 CG LEU A 4 10.293 -5.882 24.803 1.00 0.00 C ", 5550 "ATOM 11 CD1 LEU A 4 11.182 -6.007 24.608 1.00 0.00 C ", 5551 "ATOM 12 CD1 LEU A 4 9.404 -6.984 24.274 1.00 0.00 C ", 5552 "ATOM 13 CD2 LEU A 4 9.036 -4.875 25.171 1.00 0.00 C ", 5553 "ATOM 14 CD2 LEU A 4 10.355 -4.772 23.792 1.00 0.00 C ", 5554 "ATOM 15 C LEU A 4 10.999 -7.436 28.046 1.00 0.00 C ", 5555 "ATOM 16 C LEU A 4 9.816 -6.033 28.572 1.00 0.00 C ", 5556 "TER 17 LEU A 4 ", 5557 "CONECT 1 2 ", 5558 "CONECT 2 1 ", 5559 "CONECT 3 4 ", 5560 "CONECT 4 3 ", 5561 "CONECT 5 6 ", 5562 "CONECT 6 5 ", 5563 "CONECT 7 8 ", 5564 "CONECT 8 7 ", 5565 "CONECT 9 10 ", 5566 "CONECT 10 9 ", 5567 "CONECT 11 12 ", 5568 "CONECT 12 11 ", 5569 "CONECT 13 14 ", 5570 "CONECT 14 13 ", 5571 "CONECT 15 16 ", 5572 "CONECT 16 15 ", 5573 "MASTER 0 0 0 0 0 0 0 0 16 1 16 0 ", 5574 "END " 5575 ] 5576 5577 # Check the created PDB file. 5578 lines = file.readlines() 5579 self.strip_remarks(lines) 5580 self.assertEqual(len(result), len(lines)) 5581 for i in range(len(lines)): 5582 self.assertEqual(result[i]+'\n', lines[i])
5583 5584
5586 """Check the operation of the structure.web_of_motion user function using molecules 1 and 3 (of 3).""" 5587 5588 # Load the file. 5589 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 5590 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path, read_model=1, set_mol_name='1', set_model_num=1) 5591 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path, read_model=2, set_mol_name='2', set_model_num=1) 5592 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path, read_model=3, set_mol_name='3', set_model_num=1) 5593 5594 # Run the structure.web_of_motion user function and collect the results in a dummy file object. 5595 file = DummyFileObject() 5596 self.interpreter.structure.web_of_motion(file=file, molecules=[['1', '3']]) 5597 5598 # The result, without remarks. 5599 result = [ 5600 "ATOM 1 N LEU A 4 9.464 -9.232 27.573 1.00 0.00 N ", 5601 "ATOM 2 N LEU A 4 7.761 -6.392 27.161 1.00 0.00 N ", 5602 "ATOM 3 H LEU A 4 8.575 -8.953 27.963 1.00 0.00 H ", 5603 "ATOM 4 H LEU A 4 7.278 -6.195 28.026 1.00 0.00 H ", 5604 "ATOM 5 CA LEU A 4 10.302 -8.195 26.930 1.00 0.00 C ", 5605 "ATOM 6 CA LEU A 4 9.256 -6.332 27.183 1.00 0.00 C ", 5606 "ATOM 7 CB LEU A 4 9.494 -7.221 26.051 1.00 0.00 C ", 5607 "ATOM 8 CB LEU A 4 9.799 -5.331 26.144 1.00 0.00 C ", 5608 "ATOM 9 CG LEU A 4 10.107 -5.862 25.665 1.00 0.00 C ", 5609 "ATOM 10 CG LEU A 4 10.293 -5.882 24.803 1.00 0.00 C ", 5610 "ATOM 11 CD1 LEU A 4 11.182 -6.007 24.608 1.00 0.00 C ", 5611 "ATOM 12 CD1 LEU A 4 9.404 -6.984 24.274 1.00 0.00 C ", 5612 "ATOM 13 CD2 LEU A 4 9.036 -4.875 25.171 1.00 0.00 C ", 5613 "ATOM 14 CD2 LEU A 4 10.355 -4.772 23.792 1.00 0.00 C ", 5614 "ATOM 15 C LEU A 4 10.999 -7.436 28.046 1.00 0.00 C ", 5615 "ATOM 16 C LEU A 4 9.816 -6.033 28.572 1.00 0.00 C ", 5616 "TER 17 LEU A 4 ", 5617 "CONECT 1 2 ", 5618 "CONECT 2 1 ", 5619 "CONECT 3 4 ", 5620 "CONECT 4 3 ", 5621 "CONECT 5 6 ", 5622 "CONECT 6 5 ", 5623 "CONECT 7 8 ", 5624 "CONECT 8 7 ", 5625 "CONECT 9 10 ", 5626 "CONECT 10 9 ", 5627 "CONECT 11 12 ", 5628 "CONECT 12 11 ", 5629 "CONECT 13 14 ", 5630 "CONECT 14 13 ", 5631 "CONECT 15 16 ", 5632 "CONECT 16 15 ", 5633 "MASTER 0 0 0 0 0 0 0 0 16 1 16 0 ", 5634 "END " 5635 ] 5636 5637 # Check the created PDB file. 5638 lines = file.readlines() 5639 self.strip_remarks(lines) 5640 self.assertEqual(len(result), len(lines)) 5641 for i in range(len(lines)): 5642 self.assertEqual(result[i]+'\n', lines[i])
5643 5644
5645 - def test_web_of_motion_all(self):
5646 """Check the operation of the structure.web_of_motion user function using all structural models.""" 5647 5648 # Load the file. 5649 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 5650 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path) 5651 5652 # Run the structure.web_of_motion user function and collect the results in a dummy file object. 5653 file = DummyFileObject() 5654 self.interpreter.structure.web_of_motion(file=file) 5655 5656 # The result, without remarks. 5657 result = [ 5658 "ATOM 1 N LEU A 4 9.464 -9.232 27.573 1.00 0.00 N ", 5659 "ATOM 2 N LEU A 4 9.211 -9.425 26.970 1.00 0.00 N ", 5660 "ATOM 3 N LEU A 4 7.761 -6.392 27.161 1.00 0.00 N ", 5661 "ATOM 4 H LEU A 4 8.575 -8.953 27.963 1.00 0.00 H ", 5662 "ATOM 5 H LEU A 4 9.085 -9.743 27.919 1.00 0.00 H ", 5663 "ATOM 6 H LEU A 4 7.278 -6.195 28.026 1.00 0.00 H ", 5664 "ATOM 7 CA LEU A 4 10.302 -8.195 26.930 1.00 0.00 C ", 5665 "ATOM 8 CA LEU A 4 10.077 -8.221 26.720 1.00 0.00 C ", 5666 "ATOM 9 CA LEU A 4 9.256 -6.332 27.183 1.00 0.00 C ", 5667 "ATOM 10 CB LEU A 4 9.494 -7.221 26.051 1.00 0.00 C ", 5668 "ATOM 11 CB LEU A 4 9.297 -7.096 26.024 1.00 0.00 C ", 5669 "ATOM 12 CB LEU A 4 9.799 -5.331 26.144 1.00 0.00 C ", 5670 "ATOM 13 CG LEU A 4 10.107 -5.862 25.665 1.00 0.00 C ", 5671 "ATOM 14 CG LEU A 4 10.061 -5.803 25.679 1.00 0.00 C ", 5672 "ATOM 15 CG LEU A 4 10.293 -5.882 24.803 1.00 0.00 C ", 5673 "ATOM 16 CD1 LEU A 4 11.182 -6.007 24.608 1.00 0.00 C ", 5674 "ATOM 17 CD1 LEU A 4 11.029 -6.002 24.507 1.00 0.00 C ", 5675 "ATOM 18 CD1 LEU A 4 9.404 -6.984 24.274 1.00 0.00 C ", 5676 "ATOM 19 CD2 LEU A 4 9.036 -4.875 25.171 1.00 0.00 C ", 5677 "ATOM 20 CD2 LEU A 4 9.120 -4.618 25.384 1.00 0.00 C ", 5678 "ATOM 21 CD2 LEU A 4 10.355 -4.772 23.792 1.00 0.00 C ", 5679 "ATOM 22 C LEU A 4 10.999 -7.436 28.046 1.00 0.00 C ", 5680 "ATOM 23 C LEU A 4 10.625 -7.721 28.047 1.00 0.00 C ", 5681 "ATOM 24 C LEU A 4 9.816 -6.033 28.572 1.00 0.00 C ", 5682 "TER 25 LEU A 4 ", 5683 "CONECT 1 2 3 ", 5684 "CONECT 2 1 3 ", 5685 "CONECT 3 1 2 ", 5686 "CONECT 4 5 6 ", 5687 "CONECT 5 4 6 ", 5688 "CONECT 6 4 5 ", 5689 "CONECT 7 8 9 ", 5690 "CONECT 8 7 9 ", 5691 "CONECT 9 7 8 ", 5692 "CONECT 10 11 12 ", 5693 "CONECT 11 10 12 ", 5694 "CONECT 12 10 11 ", 5695 "CONECT 13 14 15 ", 5696 "CONECT 14 13 15 ", 5697 "CONECT 15 13 14 ", 5698 "CONECT 16 17 18 ", 5699 "CONECT 17 16 18 ", 5700 "CONECT 18 16 17 ", 5701 "CONECT 19 20 21 ", 5702 "CONECT 20 19 21 ", 5703 "CONECT 21 19 20 ", 5704 "CONECT 22 23 24 ", 5705 "CONECT 23 22 24 ", 5706 "CONECT 24 22 23 ", 5707 "MASTER 0 0 0 0 0 0 0 0 24 1 24 0 ", 5708 "END " 5709 ] 5710 5711 # Check the created PDB file. 5712 lines = file.readlines() 5713 self.strip_remarks(lines) 5714 self.assertEqual(len(result), len(lines)) 5715 for i in range(len(lines)): 5716 self.assertEqual(result[i]+'\n', lines[i])
5717 5718
5720 """Check the operation of the structure.web_of_motion user function using all molecules.""" 5721 5722 # Load the file. 5723 path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'structures' 5724 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path, read_model=1, set_mol_name='1', set_model_num=1) 5725 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path, read_model=2, set_mol_name='2', set_model_num=1) 5726 self.interpreter.structure.read_pdb('web_of_motion.pdb', dir=path, read_model=3, set_mol_name='3', set_model_num=1) 5727 5728 # Run the structure.web_of_motion user function and collect the results in a dummy file object. 5729 file = DummyFileObject() 5730 self.interpreter.structure.web_of_motion(file=file, molecules=[['1', '2', '3']]) 5731 5732 # The result, without remarks. 5733 result = [ 5734 "ATOM 1 N LEU A 4 9.464 -9.232 27.573 1.00 0.00 N ", 5735 "ATOM 2 N LEU A 4 9.211 -9.425 26.970 1.00 0.00 N ", 5736 "ATOM 3 N LEU A 4 7.761 -6.392 27.161 1.00 0.00 N ", 5737 "ATOM 4 H LEU A 4 8.575 -8.953 27.963 1.00 0.00 H ", 5738 "ATOM 5 H LEU A 4 9.085 -9.743 27.919 1.00 0.00 H ", 5739 "ATOM 6 H LEU A 4 7.278 -6.195 28.026 1.00 0.00 H ", 5740 "ATOM 7 CA LEU A 4 10.302 -8.195 26.930 1.00 0.00 C ", 5741 "ATOM 8 CA LEU A 4 10.077 -8.221 26.720 1.00 0.00 C ", 5742 "ATOM 9 CA LEU A 4 9.256 -6.332 27.183 1.00 0.00 C ", 5743 "ATOM 10 CB LEU A 4 9.494 -7.221 26.051 1.00 0.00 C ", 5744 "ATOM 11 CB LEU A 4 9.297 -7.096 26.024 1.00 0.00 C ", 5745 "ATOM 12 CB LEU A 4 9.799 -5.331 26.144 1.00 0.00 C ", 5746 "ATOM 13 CG LEU A 4 10.107 -5.862 25.665 1.00 0.00 C ", 5747 "ATOM 14 CG LEU A 4 10.061 -5.803 25.679 1.00 0.00 C ", 5748 "ATOM 15 CG LEU A 4 10.293 -5.882 24.803 1.00 0.00 C ", 5749 "ATOM 16 CD1 LEU A 4 11.182 -6.007 24.608 1.00 0.00 C ", 5750 "ATOM 17 CD1 LEU A 4 11.029 -6.002 24.507 1.00 0.00 C ", 5751 "ATOM 18 CD1 LEU A 4 9.404 -6.984 24.274 1.00 0.00 C ", 5752 "ATOM 19 CD2 LEU A 4 9.036 -4.875 25.171 1.00 0.00 C ", 5753 "ATOM 20 CD2 LEU A 4 9.120 -4.618 25.384 1.00 0.00 C ", 5754 "ATOM 21 CD2 LEU A 4 10.355 -4.772 23.792 1.00 0.00 C ", 5755 "ATOM 22 C LEU A 4 10.999 -7.436 28.046 1.00 0.00 C ", 5756 "ATOM 23 C LEU A 4 10.625 -7.721 28.047 1.00 0.00 C ", 5757 "ATOM 24 C LEU A 4 9.816 -6.033 28.572 1.00 0.00 C ", 5758 "TER 25 LEU A 4 ", 5759 "CONECT 1 2 3 ", 5760 "CONECT 2 1 3 ", 5761 "CONECT 3 1 2 ", 5762 "CONECT 4 5 6 ", 5763 "CONECT 5 4 6 ", 5764 "CONECT 6 4 5 ", 5765 "CONECT 7 8 9 ", 5766 "CONECT 8 7 9 ", 5767 "CONECT 9 7 8 ", 5768 "CONECT 10 11 12 ", 5769 "CONECT 11 10 12 ", 5770 "CONECT 12 10 11 ", 5771 "CONECT 13 14 15 ", 5772 "CONECT 14 13 15 ", 5773 "CONECT 15 13 14 ", 5774 "CONECT 16 17 18 ", 5775 "CONECT 17 16 18 ", 5776 "CONECT 18 16 17 ", 5777 "CONECT 19 20 21 ", 5778 "CONECT 20 19 21 ", 5779 "CONECT 21 19 20 ", 5780 "CONECT 22 23 24 ", 5781 "CONECT 23 22 24 ", 5782 "CONECT 24 22 23 ", 5783 "MASTER 0 0 0 0 0 0 0 0 24 1 24 0 ", 5784 "END " 5785 ] 5786 5787 # Check the created PDB file. 5788 lines = file.readlines() 5789 self.strip_remarks(lines) 5790 self.assertEqual(len(result), len(lines)) 5791 for i in range(len(lines)): 5792 self.assertEqual(result[i]+'\n', lines[i])
5793