1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from warnings import warn
24
25
26 from lib.errors import RelaxNoPdbError
27 from lib.structure.mass import centre_of_mass
28 from lib.warnings import RelaxWarning
29 from pipe_control.structure.checks import check_structure
30
31
32 -def pipe_centre_of_mass(atom_id=None, model=None, return_mass=False, verbosity=1, missing_error=True):
33 """Calculate and return the centre of mass of the structures in the current data pipe.
34
35 @keyword atom_id: The molecule, residue, and atom identifier string. Only atoms matching this selection will be used.
36 @type atom_id: str or None
37 @keyword model: Only use a specific model.
38 @type model: int or None
39 @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.
40 @type return_mass: bool
41 @keyword verbosity: The amount of text to print out. 0 results in no printouts, 1 the full amount.
42 @type verbosity: int
43 @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.
44 @type missing_error: bool
45 @return: The centre of mass vector, and additionally the mass.
46 @rtype: list of 3 floats (or tuple of a list of 3 floats and one float)
47 """
48
49
50 if missing_error:
51 check_structure()
52 else:
53 if not check_structure(escalate=1):
54 return [0.0, 0.0, 0.0]
55
56
57 selection = cdp.structure.selection(atom_id=atom_id)
58
59
60 coord = []
61 element_list = []
62 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):
63
64 id = ''
65
66
67 if mol_name != None:
68 id = id + '#' + mol_name
69
70
71 if res_num != None:
72 id = id + ':' + repr(res_num)
73
74
75 if atom_num != None:
76 id = id + '@' + repr(atom_num)
77
78
79 if element == None:
80 warn(RelaxWarning("Skipping the atom '%s' as the element type cannot be determined." % id))
81 continue
82
83
84 coord.append(pos)
85 element_list.append(element)
86
87
88 com, mass = centre_of_mass(pos=coord, elements=element_list, verbosity=verbosity)
89
90
91 if return_mass:
92 return com, mass
93 else:
94 return com
95