Author: bugman Date: Fri Mar 19 10:58:07 2010 New Revision: 11028 URL: http://svn.gna.org/viewcvs/relax?rev=11028&view=rev Log: Fix for the internal structural object PDB writing. The PDB format was not being followed correctly! The TER record comes after ATOM records but before HETATM records. It is not needed if there are no ATOM records. Modified: 1.3/generic_fns/structure/internal.py 1.3/test_suite/shared_data/diffusion_tensor/uniform.pdb 1.3/test_suite/shared_data/structures/diff_tensors/ellipsoid.pdb 1.3/test_suite/shared_data/structures/diff_tensors/sphere.pdb 1.3/test_suite/shared_data/structures/diff_tensors/spheroid.pdb Modified: 1.3/generic_fns/structure/internal.py URL: http://svn.gna.org/viewcvs/relax/1.3/generic_fns/structure/internal.py?rev=11028&r1=11027&r2=11028&view=diff ============================================================================== --- 1.3/generic_fns/structure/internal.py (original) +++ 1.3/generic_fns/structure/internal.py Fri Mar 19 10:58:07 2010 @@ -349,6 +349,41 @@ # Check the other lengths. if len(struct.bonded) != num and len(struct.chain_id) != num and len(struct.element) != num and len(struct.pdb_record) != num and len(struct.res_name) != num and len(struct.res_num) != num and len(struct.seg_id) != num and len(struct.x) != num and len(struct.y) != num and len(struct.z) != num: raise RelaxError("The structural data is invalid.") + + + def _translate(self, data, format='str'): + """Convert the data into a format for writing to file. + + @param data: The data to convert to the required format. + @type data: anything + @keyword format: The format to convert to. This can be 'str', 'float', or 'int'. + @type format: str + @return: The converted version of the data. + @rtype: str + """ + + # Conversion to string. + if format == 'str': + # None values. + if data == None: + data = '' + + # Force convert to string. + if not isinstance(data, str): + data = repr(data) + + # Conversion to float. + if format == 'float': + # None values. + if data == None: + data = 0.0 + + # Force convert to float. + if not isinstance(data, float): + data = float(data) + + # Return the converted data. + return data def atom_loop(self, atom_id=None, str_id=None, model_num_flag=False, mol_name_flag=False, res_num_flag=False, res_name_flag=False, atom_num_flag=False, atom_name_flag=False, element_flag=False, pos_flag=False, ave=False): @@ -909,52 +944,25 @@ print("ATOM, HETATM, TER") # Loop over the atomic data. + atom_record = False for i in xrange(len(mol.atom_name)): - # Aliases. - atom_num = mol.atom_num[i] - atom_name = mol.atom_name[i] - res_name = mol.res_name[i] - chain_id = mol.chain_id[i] - res_num = mol.res_num[i] - x = mol.x[i] - y = mol.y[i] - z = mol.z[i] - seg_id = mol.seg_id[i] - element = mol.element[i] - - # Replace None with ''. - if atom_name == None: - atom_name = '' - if res_name == None: - res_name = '' - if chain_id == None: - chain_id = '' - if res_num == None: - res_num = '' - if x == None: - x = '' - if y == None: - y = '' - if z == None: - z = '' - if seg_id == None: - seg_id = '' - if element == None: - element = '' - # Write the ATOM record. if mol.pdb_record[i] == 'ATOM': - file.write("%-6s%5s %4s%1s%3s %1s%4s%1s %8.3f%8.3f%8.3f%6.2f%6.2f %4s%2s%2s\n" % ('ATOM', atom_num, atom_name, '', res_name, chain_id, res_num, '', x, y, z, 1.0, 0, seg_id, element, '')) + atom_record = True + file.write("%-6s%5s %4s%1s%3s %1s%4s%1s %8.3f%8.3f%8.3f%6.2f%6.2f %4s%2s%2s\n" % ('ATOM', mol.atom_num[i], self._translate(mol.atom_name[i]), '', self._translate(mol.res_name[i]), self._translate(mol.chain_id[i]), self._translate(mol.res_num[i]), '', self._translate(mol.x[i], 'float'), self._translate(mol.y[i], 'float'), self._translate(mol.z[i], 'float'), 1.0, 0, self._translate(mol.seg_id[i]), self._translate(mol.element[i]), '')) num_atom = num_atom + 1 + # Finish the ATOM section with the TER record. + if atom_record: + file.write("%-6s%5s %3s %1s%4s%1s\n" % ('TER', num_atom+1, self._translate(mol.res_name[i]), self._translate(mol.chain_id[i]), self._translate(mol.res_num[i]), '')) + num_ter = num_ter + 1 + + # Loop over the atomic data. + for i in xrange(len(mol.atom_name)): # Write the HETATM record. if mol.pdb_record[i] == 'HETATM': - file.write("%-6s%5s %4s%1s%3s %1s%4s%1s %8.3f%8.3f%8.3f%6.2f%6.2f %4s%2s%2s\n" % ('HETATM', atom_num, atom_name, '', res_name, chain_id, res_num, '', x, y, z, 1.0, 0, seg_id, element, '')) + file.write("%-6s%5s %4s%1s%3s %1s%4s%1s %8.3f%8.3f%8.3f%6.2f%6.2f %4s%2s%2s\n" % ('HETATM', mol.atom_num[i], self._translate(mol.atom_name[i]), '', self._translate(mol.res_name[i]), self._translate(mol.chain_id[i]), self._translate(mol.res_num[i]), '', self._translate(mol.x[i], 'float'), self._translate(mol.y[i], 'float'), self._translate(mol.z[i], 'float'), 1.0, 0, self._translate(mol.seg_id[i]), self._translate(mol.element[i]), '')) num_hetatm = num_hetatm + 1 - - # Finish off with the TER record. - file.write("%-6s%5s %3s %1s%4s%1s\n" % ('TER', atom_num+1, res_name, chain_id, res_num, '')) - num_ter = num_ter + 1 # ENDMDL record, for multiple structures. Modified: 1.3/test_suite/shared_data/diffusion_tensor/uniform.pdb URL: http://svn.gna.org/viewcvs/relax/1.3/test_suite/shared_data/diffusion_tensor/uniform.pdb?rev=11028&r1=11027&r2=11028&view=diff ============================================================================== --- 1.3/test_suite/shared_data/diffusion_tensor/uniform.pdb (original) +++ 1.3/test_suite/shared_data/diffusion_tensor/uniform.pdb Fri Mar 19 10:58:07 2010 @@ -146,7 +146,6 @@ HETATM 94 H NH 47 0.390 0.256 -0.907 1.00 0.00 H HETATM 95 N NH 48 0.000 0.000 0.000 1.00 0.00 N HETATM 96 H NH 48 0.501 0.780 -0.424 1.00 0.00 H -TER 97 NH 48 CONECT 1 2 CONECT 2 1 CONECT 3 4 @@ -243,5 +242,5 @@ CONECT 94 93 CONECT 95 96 CONECT 96 95 -MASTER 0 0 48 0 0 0 0 0 96 1 96 0 +MASTER 0 0 48 0 0 0 0 0 96 0 96 0 END Modified: 1.3/test_suite/shared_data/structures/diff_tensors/ellipsoid.pdb URL: http://svn.gna.org/viewcvs/relax/1.3/test_suite/shared_data/structures/diff_tensors/ellipsoid.pdb?rev=11028&r1=11027&r2=11028&view=diff ============================================================================== --- 1.3/test_suite/shared_data/structures/diff_tensors/ellipsoid.pdb (original) +++ 1.3/test_suite/shared_data/structures/diff_tensors/ellipsoid.pdb Fri Mar 19 10:58:07 2010 @@ -312,7 +312,6 @@ HETATM 284 Dz SIM A 17 12.266 53.751 -21.178 1.00 0.00 C HETATM 285 Dz SIM A 18 -2.208 -43.113 12.070 1.00 0.00 C HETATM 286 Dz SIM A 18 11.473 54.226 -19.868 1.00 0.00 C -TER 287 SIM A 18 CONECT 2 3 14 230 CONECT 3 2 4 15 231 CONECT 4 3 5 16 232 @@ -598,5 +597,5 @@ CONECT 284 272 CONECT 285 272 CONECT 286 272 -MASTER 0 0 18 0 0 0 0 0 286 1 285 0 +MASTER 0 0 18 0 0 0 0 0 286 0 285 0 END Modified: 1.3/test_suite/shared_data/structures/diff_tensors/sphere.pdb URL: http://svn.gna.org/viewcvs/relax/1.3/test_suite/shared_data/structures/diff_tensors/sphere.pdb?rev=11028&r1=11027&r2=11028&view=diff ============================================================================== --- 1.3/test_suite/shared_data/structures/diff_tensors/sphere.pdb (original) +++ 1.3/test_suite/shared_data/structures/diff_tensors/sphere.pdb Fri Mar 19 10:58:07 2010 @@ -247,7 +247,6 @@ HETATM 239 H239 TNS A 2 25.008 -1.064 17.101 1.00 0.00 H HETATM 240 H240 TNS A 2 17.069 1.516 23.101 1.00 0.00 H HETATM 241 H241 TNS A 2 4.632 5.557 26.101 1.00 0.00 H -TER 242 TNS A 2 CONECT 2 3 14 230 CONECT 3 2 4 15 231 CONECT 4 3 5 16 232 @@ -488,5 +487,5 @@ CONECT 239 238 227 11 240 CONECT 240 239 228 12 241 CONECT 241 240 229 13 -MASTER 0 0 2 0 0 0 0 0 241 1 240 0 +MASTER 0 0 2 0 0 0 0 0 241 0 240 0 END Modified: 1.3/test_suite/shared_data/structures/diff_tensors/spheroid.pdb URL: http://svn.gna.org/viewcvs/relax/1.3/test_suite/shared_data/structures/diff_tensors/spheroid.pdb?rev=11028&r1=11027&r2=11028&view=diff ============================================================================== --- 1.3/test_suite/shared_data/structures/diff_tensors/spheroid.pdb (original) +++ 1.3/test_suite/shared_data/structures/diff_tensors/spheroid.pdb Fri Mar 19 10:58:07 2010 @@ -272,7 +272,6 @@ HETATM 254 Dpar SIM A 7 46.793 -9.433 -4.830 1.00 0.00 C HETATM 255 Dpar SIM A 8 -36.166 15.610 -0.919 1.00 0.00 C HETATM 256 Dpar SIM A 8 45.431 -4.496 -6.879 1.00 0.00 C -TER 257 SIM A 8 CONECT 2 3 14 230 CONECT 3 2 4 15 231 CONECT 4 3 5 16 232 @@ -528,5 +527,5 @@ CONECT 254 242 CONECT 255 242 CONECT 256 242 -MASTER 0 0 8 0 0 0 0 0 256 1 255 0 +MASTER 0 0 8 0 0 0 0 0 256 0 255 0 END