Package pipe_control :: Package structure :: Module mass
[hide private]
[frames] | no frames]

Source Code for Module pipe_control.structure.mass

 1  ############################################################################### 
 2  #                                                                             # 
 3  # Copyright (C) 2003-2015 Edward d'Auvergne                                   # 
 4  #                                                                             # 
 5  # This file is part of the program relax (http://www.nmr-relax.com).          # 
 6  #                                                                             # 
 7  # This program is free software: you can redistribute it and/or modify        # 
 8  # it under the terms of the GNU General Public License as published by        # 
 9  # the Free Software Foundation, either version 3 of the License, or           # 
10  # (at your option) any later version.                                         # 
11  #                                                                             # 
12  # This program is distributed in the hope that it will be useful,             # 
13  # but WITHOUT ANY WARRANTY; without even the implied warranty of              # 
14  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               # 
15  # GNU General Public License for more details.                                # 
16  #                                                                             # 
17  # You should have received a copy of the GNU General Public License           # 
18  # along with this program.  If not, see <http://www.gnu.org/licenses/>.       # 
19  #                                                                             # 
20  ############################################################################### 
21   
22  # Python module imports. 
23  from warnings import warn 
24   
25  # relax module imports. 
26  from lib.structure.mass import centre_of_mass 
27  from lib.warnings import RelaxWarning 
28  from pipe_control.structure.checks import check_structure 
29   
30   
31 -def pipe_centre_of_mass(atom_id=None, model=None, return_mass=False, verbosity=1, missing_error=True):
32 """Calculate and return the centre of mass of the structures in the current data pipe. 33 34 @keyword atom_id: The molecule, residue, and atom identifier string. Only atoms matching this selection will be used. 35 @type atom_id: str or None 36 @keyword model: Only use a specific model. 37 @type model: int or None 38 @keyword return_mass: A flag which if False will cause only the centre of mass to be returned, but if True will cause the centre of mass and the mass itself to be returned as a tuple. 39 @type return_mass: bool 40 @keyword verbosity: The amount of text to print out. 0 results in no printouts, 1 the full amount. 41 @type verbosity: int 42 @keyword missing_error: A flag which if True will cause an error to be raised if structural data is absent. Otherwise if False, a warning will be given and the CoM of [0, 0, 0] will be returned. 43 @type missing_error: bool 44 @return: The centre of mass vector, and additionally the mass. 45 @rtype: list of 3 floats (or tuple of a list of 3 floats and one float) 46 """ 47 48 # Test if a structure has been loaded. 49 if missing_error: 50 check_structure() 51 else: 52 if not check_structure(escalate=1): 53 return [0.0, 0.0, 0.0] 54 55 # The selection object. 56 selection = cdp.structure.selection(atom_id=atom_id) 57 58 # Loop over all atoms. 59 coord = [] 60 element_list = [] 61 for mol_name, res_num, res_name, atom_num, atom_name, element, pos in cdp.structure.atom_loop(selection=selection, model_num=model, mol_name_flag=True, res_num_flag=True, res_name_flag=True, atom_num_flag=True, atom_name_flag=True, element_flag=True, pos_flag=True, ave=True): 62 # Initialise the spin 63 id = '' 64 65 # Get the corresponding molecule container. 66 if mol_name != None: 67 id = id + '#' + mol_name 68 69 # Get the corresponding residue container. 70 if res_num != None: 71 id = id + ':' + repr(res_num) 72 73 # Get the corresponding spin container. 74 if atom_num != None: 75 id = id + '@' + repr(atom_num) 76 77 # No element? 78 if element == None: 79 warn(RelaxWarning("Skipping the atom '%s' as the element type cannot be determined." % id)) 80 continue 81 82 # Store the position and element. 83 coord.append(pos) 84 element_list.append(element) 85 86 # Calculate the CoM. 87 com, mass = centre_of_mass(pos=coord, elements=element_list, verbosity=verbosity) 88 89 # Return the centre of mass. 90 if return_mass: 91 return com, mass 92 else: 93 return com
94