Author: bugman Date: Tue Feb 10 12:54:17 2015 New Revision: 27614 URL: http://svn.gna.org/viewcvs/relax?rev=27614&view=rev Log: Huge speed up of the internal structural object validate_models() method. The string formatting to create pseudo-PDB records and the large number of calls to the _translate() method for atomic information string formatting has been shifted to only be called when atomic information does not match. Instead the structural information is directly compared within a large if-else statement. Modified: trunk/lib/structure/internal/object.py Modified: trunk/lib/structure/internal/object.py URL: http://svn.gna.org/viewcvs/relax/trunk/lib/structure/internal/object.py?rev=27614&r1=27613&r2=27614&view=diff ============================================================================== --- trunk/lib/structure/internal/object.py (original) +++ trunk/lib/structure/internal/object.py Tue Feb 10 12:54:17 2015 @@ -2689,14 +2689,27 @@ # Loop over the atoms. for k in range(len(mol.atom_name)): - # Create pseudo-pdb formatted records (with no atomic coordinates). - atom = "%-6s%5s %4s%1s%3s %1s%4s%1s %8s%8s%8s%6.2f%6.2f %4s%2s%2s" % ('ATOM', mol.atom_num[k], self._translate(mol.atom_name[k]), '', self._translate(mol.res_name[k]), self._translate(mol.chain_id[k]), self._translate(mol.res_num[k]), '', '#', '#', '#', 1.0, 0, self._translate(mol.seg_id[k]), self._translate(mol.element[k]), '') - atom_ref = "%-6s%5s %4s%1s%3s %1s%4s%1s %8s%8s%8s%6.2f%6.2f %4s%2s%2s" % ('ATOM', mol_ref.atom_num[k], self._translate(mol_ref.atom_name[k]), '', self._translate(mol_ref.res_name[k]), self._translate(mol_ref.chain_id[k]), self._translate(mol_ref.res_num[k]), '', '#', '#', '#', 1.0, 0, self._translate(mol_ref.seg_id[k]), self._translate(mol_ref.element[k]), '') - - # Check the atom info. - if atom != atom_ref: - print(atom) - print(atom_ref) + # Check all data. + same = True + if mol.chain_id[k] != mol_ref.chain_id[k]: + same = False + elif mol.atom_num[k] != mol_ref.atom_num[k]: + same = False + elif mol.atom_name[k] != mol_ref.atom_name[k]: + same = False + elif mol.res_name[k] != mol_ref.res_name[k]: + same = False + elif mol.res_num[k] != mol_ref.res_num[k]: + same = False + elif mol.seg_id[k] != mol_ref.seg_id[k]: + same = False + elif mol.element[k] != mol_ref.element[k]: + same = False + + # Failure. + if not same: + print("%-6s%5s %4s%1s%3s %1s%4s%1s %8s%8s%8s%6.2f%6.2f %4s%2s%2s" % ('ATOM', mol.atom_num[k], self._translate(mol.atom_name[k]), '', self._translate(mol.res_name[k]), self._translate(mol.chain_id[k]), self._translate(mol.res_num[k]), '', '#', '#', '#', 1.0, 0, self._translate(mol.seg_id[k]), self._translate(mol.element[k]), '')) + print("%-6s%5s %4s%1s%3s %1s%4s%1s %8s%8s%8s%6.2f%6.2f %4s%2s%2s" % ('ATOM', mol_ref.atom_num[k], self._translate(mol_ref.atom_name[k]), '', self._translate(mol_ref.res_name[k]), self._translate(mol_ref.chain_id[k]), self._translate(mol_ref.res_num[k]), '', '#', '#', '#', 1.0, 0, self._translate(mol_ref.seg_id[k]), self._translate(mol_ref.element[k]), '')) raise RelaxError("The atoms of model %i do not match the first model." % self.structural_data[i].num) # Final printout.