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