1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16   
 17   
 18   
 19   
 20   
 21   
 22   
 23  """The data pipe objects of the relax data store.""" 
 24   
 25   
 26  from re import match 
 27   
 28   
 29  from data_store.align_tensor import AlignTensorList 
 30  from data_store.diff_tensor import DiffTensorData 
 31  from data_store.exp_info import ExpInfo 
 32  from data_store.interatomic import InteratomList 
 33  from data_store.mol_res_spin import MoleculeList 
 34  from data_store.prototype import Prototype 
 35  from lib.errors import RelaxFromXMLNotEmptyError 
 36  from lib.structure.internal.object import Internal 
 37  from lib.xml import fill_object_contents, node_value_to_python, xml_to_object 
 38   
 39   
 41      """Class containing all the program data.""" 
 42   
 44          """Set up all the PipeContainer data structures.""" 
 45   
 46           
 47          self.mol = MoleculeList() 
 48   
 49           
 50          self.interatomic = InteratomList() 
 51   
 52           
 53          self.pipe_type = None 
 54   
 55           
 56          self.hybrid_pipes = [] 
  57   
 58   
 60          """The string representation of the object. 
 61   
 62          Rather than using the standard Python conventions (either the string representation of the 
 63          value or the "<...desc...>" notation), a rich-formatted description of the object is given. 
 64          """ 
 65   
 66           
 67          text = "The data pipe storage object.\n" 
 68   
 69           
 70          spec_obj = ['exp_info', 'mol', 'interatomic', 'diff_tensor', 'structure'] 
 71   
 72           
 73          text = text + "\n" 
 74          text = text + "Objects:\n" 
 75          for name in dir(self): 
 76               
 77              if name == 'mol': 
 78                  text = text + "  mol: The molecule list (for the storage of the spin system specific data)\n" 
 79   
 80               
 81              if name == 'interatomic': 
 82                  text = text + "  interatomic: The interatomic data list (for the storage of the inter-spin system data)\n" 
 83   
 84               
 85              if name == 'diff_tensor': 
 86                  text = text + "  diff_tensor: The Brownian rotational diffusion tensor data object\n" 
 87   
 88               
 89              if name == 'structure': 
 90                  text = text + "  structure: The 3D molecular data object\n" 
 91   
 92               
 93              if name == 'exp_info': 
 94                  text = text + "  exp_info: The data container for experimental information\n" 
 95   
 96               
 97              if name in self.__class__.__dict__: 
 98                  continue 
 99   
100               
101              if match("^_", name) or name in spec_obj: 
102                  continue 
103   
104               
105              text = text + "  " + name + ": " + repr(getattr(self, name)) + "\n" 
106   
107           
108          return text 
 109   
110   
112          """Method for converting old data structures to the new ones. 
113   
114          @keyword file_version:  The relax XML version of the XML file. 
115          @type file_version:     int 
116          """ 
117   
118           
119          self._back_compat_hook_ri_data() 
 120   
121   
123          """Converting the old relaxation data structures to the new ones.""" 
124   
125           
126          if not (hasattr(cdp, 'frq_labels') and hasattr(cdp, 'noe_r1_table') and hasattr(cdp, 'remap_table')): 
127              return 
128   
129           
130          cdp.ri_ids = [] 
131          cdp.ri_type = {} 
132          frq = {}     
133   
134           
135          for i in range(cdp.num_ri): 
136               
137              ri_id = "%s_%s" % (cdp.ri_labels[i], cdp.frq_labels[cdp.remap_table[i]]) 
138   
139               
140              if ri_id in cdp.ri_ids: 
141                   
142                  for j in range(100): 
143                       
144                      new_id = "%s_%s" % (ri_id, j) 
145   
146                       
147                      if not new_id in cdp.ri_ids: 
148                          ri_id = new_id 
149                          break 
150   
151               
152              cdp.ri_ids.append(ri_id) 
153   
154               
155              cdp.ri_type[ri_id] = cdp.ri_labels[i] 
156   
157               
158              frq[ri_id] = cdp.frq[cdp.remap_table[i]] 
159   
160           
161          del cdp.frq 
162          del cdp.frq_labels 
163          del cdp.noe_r1_table 
164          del cdp.num_frq 
165          del cdp.num_ri 
166          del cdp.remap_table 
167          del cdp.ri_labels 
168   
169           
170          cdp.frq = frq 
 171   
172   
173 -    def from_xml(self, pipe_node, file_version=None, dir=None): 
 174          """Read a pipe container XML element and place the contents into this pipe. 
175   
176          @param pipe_node:       The data pipe XML node. 
177          @type pipe_node:        xml.dom.minidom.Element instance 
178          @keyword file_version:  The relax XML version of the XML file. 
179          @type file_version:     int 
180          @keyword dir:           The name of the directory containing the results file (needed for loading external files). 
181          @type dir:              str 
182          """ 
183   
184           
185          if not self.is_empty(): 
186              raise RelaxFromXMLNotEmptyError(self.__class__.__name__) 
187   
188           
189          global_node = pipe_node.getElementsByTagName('global')[0] 
190          xml_to_object(global_node, self, file_version=file_version) 
191   
192           
193          self._back_compat_hook(file_version) 
194   
195           
196          hybrid_node = pipe_node.getElementsByTagName('hybrid')[0] 
197          pipes_node = hybrid_node.getElementsByTagName('pipes')[0] 
198          setattr(self, 'hybrid_pipes', node_value_to_python(pipes_node.childNodes[0])) 
199   
200           
201          exp_info_nodes = pipe_node.getElementsByTagName('exp_info') 
202          if exp_info_nodes: 
203               
204              self.exp_info = ExpInfo() 
205   
206               
207              self.exp_info.from_xml(exp_info_nodes[0], file_version=file_version) 
208   
209           
210          diff_tensor_nodes = pipe_node.getElementsByTagName('diff_tensor') 
211          if diff_tensor_nodes: 
212               
213              self.diff_tensor = DiffTensorData() 
214   
215               
216              self.diff_tensor.from_xml(diff_tensor_nodes[0], file_version=file_version) 
217   
218           
219          align_tensor_nodes = pipe_node.getElementsByTagName('align_tensors') 
220          if align_tensor_nodes: 
221               
222              self.align_tensors = AlignTensorList() 
223   
224               
225              self.align_tensors.from_xml(align_tensor_nodes[0], file_version=file_version) 
226   
227           
228          interatom_nodes = pipe_node.getElementsByTagName('interatomic') 
229          self.interatomic.from_xml(interatom_nodes, file_version=file_version) 
230   
231           
232          mol_nodes = pipe_node.getElementsByTagName('mol') 
233          self.mol.from_xml(mol_nodes, file_version=file_version) 
234   
235           
236          str_nodes = pipe_node.getElementsByTagName('structure') 
237          if str_nodes: 
238               
239              fail = False 
240              self.structure = Internal() 
241   
242               
243              if not fail: 
244                  self.structure.from_xml(str_nodes[0], dir=dir, file_version=file_version) 
 245   
246   
248          """Method for testing if the data pipe is empty. 
249   
250          @return:    True if the data pipe is empty, False otherwise. 
251          @rtype:     bool 
252          """ 
253   
254           
255          if hasattr(self, 'structure'): 
256              return False 
257   
258           
259          if not self.mol.is_empty(): 
260              return False 
261   
262           
263          if not self.interatomic.is_empty(): 
264              return False 
265   
266           
267          if self.hybrid_pipes: 
268              return False 
269   
270           
271          for name in dir(self): 
272               
273              if name in ['mol', 'interatomic', 'pipe_type', 'hybrid_pipes']: 
274                  continue 
275   
276               
277              if name in self.__class__.__dict__: 
278                  continue 
279   
280               
281              if match("^_", name): 
282                  continue 
283   
284               
285              return False 
286   
287           
288          return True 
 289   
290   
291 -    def to_xml(self, doc, element, pipe_type=None): 
 292          """Create a XML element for the current data pipe. 
293   
294          @param doc:         The XML document object. 
295          @type doc:          xml.dom.minidom.Document instance 
296          @param element:     The XML element to add the pipe XML element to. 
297          @type element:      XML element object 
298          @keyword pipe_type: The type of the pipe being converted to XML. 
299          @type pipe_type:    str 
300          """ 
301   
302           
303          global_element = doc.createElement('global') 
304          element.appendChild(global_element) 
305          global_element.setAttribute('desc', 'Global data located in the top level of the data pipe') 
306          fill_object_contents(doc, global_element, object=self, blacklist=['align_tensors', 'diff_tensor', 'exp_info', 'interatomic', 'hybrid_pipes', 'mol', 'pipe_type', 'structure'] + list(self.__class__.__dict__.keys())) 
307   
308           
309          self.xml_create_hybrid_element(doc, element) 
310   
311           
312          if hasattr(self, 'exp_info'): 
313              self.exp_info.to_xml(doc, element) 
314   
315           
316          if hasattr(self, 'diff_tensor'): 
317              self.diff_tensor.to_xml(doc, element) 
318   
319           
320          if hasattr(self, 'align_tensors'): 
321              self.align_tensors.to_xml(doc, element) 
322   
323           
324          self.mol.to_xml(doc, element, pipe_type=pipe_type) 
325   
326           
327          self.interatomic.to_xml(doc, element, pipe_type=pipe_type) 
328   
329           
330          if hasattr(self, 'structure'): 
331              self.structure.to_xml(doc, element) 
 332   
333   
335          """Create an XML element for the data pipe hybridisation information. 
336   
337          @param doc:     The XML document object. 
338          @type doc:      xml.dom.minidom.Document instance 
339          @param element: The element to add the hybridisation info to. 
340          @type element:  XML element object 
341          """ 
342   
343           
344          hybrid_element = doc.createElement('hybrid') 
345          element.appendChild(hybrid_element) 
346   
347           
348          hybrid_element.setAttribute('desc', 'Data pipe hybridisation information') 
349   
350           
351          list_element = doc.createElement('pipes') 
352          hybrid_element.appendChild(list_element) 
353   
354           
355          text_val = doc.createTextNode(str(self.hybrid_pipes)) 
356          list_element.appendChild(text_val) 
  357