Author: bugman Date: Sun Mar 10 14:48:54 2013 New Revision: 18734 URL: http://svn.gna.org/viewcvs/relax?rev=18734&view=rev Log: Redesign of the generic_fns.mol_res_spin.generate_spin_id() function. The function now tries to generate a unique ID based on the spin information in the specified data pipe. This is to attempt to fix a bug uncovered by the Structure.test_read_xyz_internal2 system test. Defaulting in all cases to the spin name rather than spin number will often fail for a small organic molecule, as the name in XYZ files is the atomic symbol and hence will almost never be unique. Modified: trunk/generic_fns/angles.py trunk/generic_fns/mol_res_spin.py trunk/generic_fns/structure/scientific.py trunk/specific_fns/model_free/results.py trunk/specific_fns/relax_fit.py Modified: trunk/generic_fns/angles.py URL: http://svn.gna.org/viewcvs/relax/trunk/generic_fns/angles.py?rev=18734&r1=18733&r2=18734&view=diff ============================================================================== --- trunk/generic_fns/angles.py (original) +++ trunk/generic_fns/angles.py Sun Mar 10 14:48:54 2013 @@ -77,7 +77,7 @@ # Test if the vector exists. if not hasattr(spin, 'xh_vect'): # Get the spin id string. - spin_id = generate_spin_id(mol_name, res_num, res_name, spin.num, spin.name) + spin_id = generate_spin_id(mol_name=mol_name, res_num=res_num, res_name=res_name, spin_num=spin.num, spin_name=spin.name) # Throw a warning. warn(RelaxWarning("No angles could be calculated for the spin " + repr(spin_id) + ".")) Modified: trunk/generic_fns/mol_res_spin.py URL: http://svn.gna.org/viewcvs/relax/trunk/generic_fns/mol_res_spin.py?rev=18734&r1=18733&r2=18734&view=diff ============================================================================== --- trunk/generic_fns/mol_res_spin.py (original) +++ trunk/generic_fns/mol_res_spin.py Sun Mar 10 14:48:54 2013 @@ -1026,7 +1026,7 @@ status.spin_lock.acquire(sys._getframe().f_code.co_name) try: # Create the molecule if it does not exist. - mol_cont = return_molecule(generate_spin_id(mol_name=mol_name), pipe=pipe) + mol_cont = return_molecule(generate_spin_id(pipe_name=pipe, mol_name=mol_name), pipe=pipe) if mol_cont == None: mol_cont = create_molecule(mol_name=mol_name, pipe=pipe) @@ -1226,7 +1226,7 @@ # The spin index and id. spin_index = len(res_cont.spin) - 1 - spin_id = generate_spin_id(mol_name=mol_name, res_num=res_num, res_name=res_name, spin_num=spin_num, spin_name=spin_name) + spin_id = generate_spin_id(pipe_cont=dp, mol_name=mol_name, res_num=res_num, res_name=res_name, spin_num=spin_num, spin_name=spin_name) # Update the private metadata. if len(res_cont.spin) == 2: @@ -1596,43 +1596,99 @@ return mol.res[0].num -def generate_spin_id(mol_name=None, res_num=None, res_name=None, spin_num=None, spin_name=None): +def generate_spin_id(pipe_cont=None, pipe_name=None, mol_name=None, res_num=None, res_name=None, spin_num=None, spin_name=None): """Generate the spin selection string. - @param mol_name: The molecule name. + @keyword pipe_cont: The data pipe object. + @type pipe_cont: PipeContainer instance + @keyword pipe_name: The data pipe name. + @type pipe_name: str + @keyword mol_name: The molecule name. @type mol_name: str or None - @param res_num: The residue number. + @keyword res_num: The residue number. @type res_num: int or None - @param res_name: The residue name. + @keyword res_name: The residue name. @type res_name: str or None - @param spin_num: The spin number. + @keyword spin_num: The spin number. @type spin_num: int or None - @param spin_name: The spin name. + @keyword spin_name: The spin name. @type spin_name: str or None @return: The spin identification string. @rtype: str """ + # The data pipe. + if pipe_cont == None: + pipe_cont = pipes.get_pipe(pipe_name) + # Init. id = "" - # Molecule name. + # Molecule name and container. if mol_name != None: id = id + "#" + mol_name # Residue data. + res_num_id = '' + res_name_id = '' if res_num != None: - id = id + ":" + str(res_num) + res_num_id = id + ":" + str(res_num) + res_num_exists = res_num_id in pipe_cont.mol._spin_id_lookup + if res_name != None: + res_name_id = id + ":" + res_name + res_name_exists = res_name_id in pipe_cont.mol._spin_id_lookup + + # Select between the name and number, defaulting to the residue number if needed. + if res_name != None and res_num != None: + if res_num_exists and res_name_exists: + id = res_num_id + elif not res_num_exists or not res_name_exists: + id = res_num_id + elif res_num_exists: + id = res_num_id + elif res_name_exists: + id = res_name_id + elif res_num != None: + id = res_num_id + elif res_name != None: + id = res_name_id + elif res_num != None: + id = res_num_id elif res_name != None: - id = id + ":" + res_name + id = res_name_id # Spin data. + spin_num_id = '' + spin_name_id = '' + spin_num_exists = False + spin_name_exists = False + if spin_num != None: + spin_num_id = id + "@" + str(spin_num) + spin_num_exists = spin_num_id in pipe_cont.mol._spin_id_lookup if spin_name != None: - id = id + "@" + spin_name + spin_name_id = id + "@" + spin_name + spin_name_exists = spin_name_id in pipe_cont.mol._spin_id_lookup + + # Select between the name and number, defaulting to the spin name if needed. + if spin_name != None and spin_num != None: + if spin_num_exists and spin_name_exists: + id = spin_name_id + elif not spin_num_exists or not spin_name_exists: + id = spin_name_id + elif spin_name_exists: + id = spin_name_id + elif spin_num_exists: + id = spin_num_id + elif spin_name != None: + id = spin_name_id + elif spin_num != None: + id = spin_num_id + elif spin_name != None: + id = spin_name_id elif spin_num != None: - id = id + "@" + str(spin_num) - - # Return the spin id string. + id = spin_num_id + + # Return the full spin ID string. return id @@ -2041,7 +2097,7 @@ # Alias. mol = dp.mol[i] - # Update the residue metadata. + # Update the molecule metadata. mol._mol_index = i # Loop over the residues. @@ -2130,7 +2186,7 @@ # Generate the spin id. if return_id: - mol_id = generate_spin_id(mol.name) + mol_id = generate_spin_id(pipe_cont=dp, mol_name=mol.name) # Yield the molecule data container. if return_id: @@ -2202,7 +2258,7 @@ # Rename the matching residues. for res, mol_name in residue_loop(res_id, full_info=True): if res.name and not force: - warn(RelaxWarning("The residue '%s' is already named. Set the force flag to rename." % generate_spin_id(mol_name, res.num, res.name))) + warn(RelaxWarning("The residue '%s' is already named. Set the force flag to rename." % generate_spin_id(mol_name=mol_name, res_num=res.num, res_name=res.name))) else: res.name = name @@ -2288,7 +2344,7 @@ # Rename the residue. for res, mol_name in residue_loop(res_id, full_info=True): if res.num and not force: - warn(RelaxWarning("The residue '%s' is already numbered. Set the force flag to renumber." % generate_spin_id(mol_name, res.num, res.name))) + warn(RelaxWarning("The residue '%s' is already numbered. Set the force flag to renumber." % generate_spin_id(mol_name=mol_name, res_num=res.num, res_name=res.name))) else: res.num = number @@ -2526,7 +2582,7 @@ # Generate the spin id. if return_id: - res_id = generate_spin_id(mol.name, res.num, res.name) + res_id = generate_spin_id(pipe_cont=dp, mol_name=mol.name, res_num=res.num, res_name=res.name) # Yield the residue data container. if full_info and return_id: @@ -2756,7 +2812,7 @@ spin_num = spin_num + 1 # Generate as store the spin ID. - spin_ids.append(generate_spin_id(mol_name=mol.name, res_num=res.num, res_name=res.name, spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name, res_num=res.num, res_name=res.name, spin_num=spin.num, spin_name=spin.name)) # No unique identifier. if not multi and spin_num > 1: @@ -2803,7 +2859,7 @@ # Return the spin and the spin_id string. if return_spin_id: # The spin identification string. - spin_id = generate_spin_id(mol_name, res_num, res_name, spin.num, spin.name) + spin_id = generate_spin_id(pipe_name=pipe, mol_name=mol_name, res_num=res_num, res_name=res_name, spin_num=spin.num, spin_name=spin.name) # Return both objects. return spin, spin_id @@ -3212,34 +3268,58 @@ spin_count = len(res.spin) # The spin ID. - spin_ids.append(generate_spin_id(mol_name=mol.name, res_num=res.num, res_name=res.name, spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name, res_num=res.num, res_name=res.name, spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name, res_num=res.num, res_name=res.name, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name, res_num=res.num, res_name=res.name, spin_num=spin.num)) # The spin IDs without spin info. if spin_count == 1: - spin_ids.append(generate_spin_id(mol_name=mol.name, res_num=res.num, res_name=res.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name, res_num=res.num, res_name=res.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name, res_name=res.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name, res_num=res.num)) # The spin IDs without residue info. if res_count == 1: - spin_ids.append(generate_spin_id(mol_name=mol.name, spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name, spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name, spin_num=spin.num)) # The spin IDs without molecule info. if mol_count == 1: - spin_ids.append(generate_spin_id(res_num=res.num, res_name=res.name, spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_num=res.num, res_name=res.name, spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_name=res.name, spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_num=res.num, spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_num=res.num, res_name=res.name, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_num=res.num, res_name=res.name, spin_num=spin.num)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_name=res.name, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_num=res.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_name=res.name, spin_num=spin.num)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_num=res.num, spin_num=spin.num)) # The spin IDs without spin or residue info. if spin_count == 1 and res_count == 1: - spin_ids.append(generate_spin_id(mol_name=mol.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name)) # The spin IDs without spin or molecule info. if spin_count == 1 and mol_count == 1: - spin_ids.append(generate_spin_id(res_num=res.num, res_name=res.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_num=res.num, res_name=res.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_name=res.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_num=res.num)) # The spin IDs without residue or molecule info. if res_count == 1 and mol_count == 1: - spin_ids.append(generate_spin_id(spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, spin_num=spin.num)) + + # Collect the unique IDs. + unique = [] + for id in spin_ids: + if id not in unique: + unique.append(id) # Return the IDs. - return spin_ids + return unique def spin_id_variants_elim(dp=None, mol_index=None, res_index=None, spin_index=None): @@ -3267,36 +3347,36 @@ spin_count = len(res.spin) # The spin ID. - spin_ids.append(generate_spin_id(mol_name=mol.name, res_num=res.num, res_name=res.name, spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name, res_num=res.num, res_name=res.name, spin_num=spin.num, spin_name=spin.name)) # The spin IDs without spin info. if spin_count > 1: - spin_ids.append(generate_spin_id(mol_name=mol.name, res_num=res.num, res_name=res.name)) - spin_ids.append(generate_spin_id(res_num=res.num, res_name=res.name)) - spin_ids.append(generate_spin_id(mol_name=mol.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name, res_num=res.num, res_name=res.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_num=res.num, res_name=res.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name)) # The spin IDs without residue info. if res_count > 1: - spin_ids.append(generate_spin_id(mol_name=mol.name, spin_num=spin.num, spin_name=spin.name)) - spin_ids.append(generate_spin_id(spin_num=spin.num, spin_name=spin.name)) - spin_ids.append(generate_spin_id(mol_name=mol.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name, spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name)) # The spin IDs without molecule info. if mol_count > 1: - spin_ids.append(generate_spin_id(res_num=res.num, res_name=res.name)) - spin_ids.append(generate_spin_id(res_num=res.num, res_name=res.name, spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_num=res.num, res_name=res.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_num=res.num, res_name=res.name, spin_num=spin.num, spin_name=spin.name)) # The spin IDs without spin or residue info. if spin_count > 1 and res_count > 1: - spin_ids.append(generate_spin_id(mol_name=mol.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, mol_name=mol.name)) # The spin IDs without spin or molecule info. if spin_count > 1 and mol_count > 1: - spin_ids.append(generate_spin_id(res_num=res.num, res_name=res.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, res_num=res.num, res_name=res.name)) # The spin IDs without residue or molecule info. if res_count > 1 and mol_count > 1: - spin_ids.append(generate_spin_id(spin_num=spin.num, spin_name=spin.name)) + spin_ids.append(generate_spin_id(pipe_cont=dp, spin_num=spin.num, spin_name=spin.name)) # Return the IDs. return spin_ids @@ -3442,7 +3522,7 @@ # Generate the spin id. if return_id: - spin_id = generate_spin_id(mol.name, res.num, res.name, spin.num, spin.name) + spin_id = generate_spin_id(pipe_cont=dp, mol_name=mol.name, res_num=res.num, res_name=res.name, spin_num=spin.num, spin_name=spin.name) # Yield the data. if full_info and return_id: Modified: trunk/generic_fns/structure/scientific.py URL: http://svn.gna.org/viewcvs/relax/trunk/generic_fns/structure/scientific.py?rev=18734&r1=18733&r2=18734&view=diff ============================================================================== --- trunk/generic_fns/structure/scientific.py (original) +++ trunk/generic_fns/structure/scientific.py Sun Mar 10 14:48:54 2013 @@ -431,7 +431,7 @@ """ # Generate the selection object. - sel_obj = Selection(generate_spin_id(mol_name, res_num, res_name, spin_num, spin_name)) + sel_obj = Selection(generate_spin_id(mol_name=mol_name, res_num=res_num, res_name=res_name, spin_num=spin_num, spin_name=spin_name)) # Initialise some objects. vectors = [] Modified: trunk/specific_fns/model_free/results.py URL: http://svn.gna.org/viewcvs/relax/trunk/specific_fns/model_free/results.py?rev=18734&r1=18733&r2=18734&view=diff ============================================================================== --- trunk/specific_fns/model_free/results.py (original) +++ trunk/specific_fns/model_free/results.py Sun Mar 10 14:48:54 2013 @@ -166,7 +166,7 @@ generic_fns.sequence.generate(mol_name, res_num, res_name, spin_num, spin_name, verbose=False) # Get the spin identification string. - spin_id = generate_spin_id(mol_name, res_num, res_name, spin_num, spin_name) + spin_id = generate_spin_id(mol_name=mol_name, res_num=res_num, res_name=res_name, spin_num=spin_num, spin_name=spin_name) # Set the selection status. select = bool(int(spin_line[col['select']])) @@ -701,7 +701,7 @@ spin_name = file_line[col['spin_name']] # Create the spin ID. - spin_id = generate_spin_id(mol_name, res_num, res_name, spin_num, spin_name) + spin_id = generate_spin_id(mol_name=mol_name, res_num=res_num, res_name=res_name, spin_num=spin_num, spin_name=spin_name) # Get the spin container. spin = return_spin(spin_id) Modified: trunk/specific_fns/relax_fit.py URL: http://svn.gna.org/viewcvs/relax/trunk/specific_fns/relax_fit.py?rev=18734&r1=18733&r2=18734&view=diff ============================================================================== --- trunk/specific_fns/relax_fit.py (original) +++ trunk/specific_fns/relax_fit.py Sun Mar 10 14:48:54 2013 @@ -672,7 +672,7 @@ # Print out. if verbosity >= 1: # Get the spin id string. - spin_id = generate_spin_id(mol_name, res_num, res_name, spin.num, spin.name) + spin_id = generate_spin_id(mol_name=mol_name, res_num=res_num, res_name=res_name, spin_num=spin.num, spin_name=spin.name) # Individual spin printout. if verbosity >= 2: