1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16   
 17   
 18   
 19   
 20   
 21   
 22   
 23   
 24  """Module containing the base class for the automatic NOE analysis frames.""" 
 25   
 26   
 27  from os import sep 
 28  import wx 
 29   
 30   
 31  from auto_analyses.noe import NOE_calc 
 32  from data_store import Relax_data_store; ds = Relax_data_store() 
 33  from graphics import ANALYSIS_IMAGE_PATH, IMAGE_PATH, fetch_icon 
 34  from gui.analyses.base import Base_analysis 
 35  from gui.analyses.elements.text_element import Text_ctrl 
 36  from gui.analyses.execute import Execute 
 37  from gui.analyses.results_analysis import color_code_noe 
 38  from gui.base_classes import Container 
 39  from gui.components.spectrum import Spectra_list 
 40  from gui.filedialog import RelaxDirDialog 
 41  from gui.message import error_message, Missing_data 
 42  from gui.string_conv import gui_to_str, str_to_gui 
 43  from gui.uf_objects import Uf_storage; uf_store = Uf_storage() 
 44  from gui.wizards.peak_intensity import Peak_intensity_wizard 
 45  from pipe_control.mol_res_spin import exists_mol_res_spin_data 
 46  from pipe_control.pipes import has_bundle, has_pipe 
 47  from status import Status; status = Status() 
 48   
 49   
 51      """The base class for the noe frames.""" 
 52   
 53       
 54      analysis_type = None 
 55      bitmap = [ANALYSIS_IMAGE_PATH+"noe_200x200.png", 
 56                IMAGE_PATH+'noe.png'] 
 57      label = None 
 58   
 59 -    def __init__(self, parent, id=-1, pos=wx.Point(-1, -1), size=wx.Size(-1, -1), style=524288, name='scrolledpanel', gui=None, analysis_name=None, pipe_name=None, pipe_bundle=None, uf_exec=[], data_index=None): 
  60          """Build the automatic NOE analysis GUI frame elements. 
 61   
 62          @param parent:          The parent wx element. 
 63          @type parent:           wx object 
 64          @keyword id:            The unique ID number. 
 65          @type id:               int 
 66          @keyword pos:           The position. 
 67          @type pos:              wx.Size object 
 68          @keyword size:          The size. 
 69          @type size:             wx.Size object 
 70          @keyword style:         The style. 
 71          @type style:            int 
 72          @keyword name:          The name for the panel. 
 73          @type name:             unicode 
 74          @keyword gui:           The main GUI class. 
 75          @type gui:              gui.relax_gui.Main instance 
 76          @keyword analysis_name: The name of the analysis (the name in the tab part of the notebook). 
 77          @type analysis_name:    str 
 78          @keyword pipe_name:     The name of the data pipe associated with this analysis. 
 79          @type pipe_name:        str 
 80          @keyword pipe_bundle:   The name of the data pipe bundle associated with this analysis. 
 81          @type pipe_bundle:      str 
 82          @keyword uf_exec:       The list of user function on_execute methods returned from the new analysis wizard. 
 83          @type uf_exec:          list of methods 
 84          @keyword data_index:    The index of the analysis in the relax data store (set to None if no data currently exists). 
 85          @type data_index:       None or int 
 86          """ 
 87   
 88           
 89          self.gui = gui 
 90   
 91           
 92          self.init_flag = True 
 93   
 94           
 95          if data_index == None: 
 96               
 97              if not has_pipe(pipe_name): 
 98                  self.gui.interpreter.apply('pipe.create', pipe_name=pipe_name, pipe_type='noe', bundle=pipe_bundle) 
 99   
100               
101              if not has_bundle(pipe_bundle): 
102                  self.gui.interpreter.apply('pipe.bundle', bundle=pipe_bundle, pipe=pipe_name) 
103   
104               
105              data_index = ds.relax_gui.analyses.add('NOE') 
106   
107               
108              ds.relax_gui.analyses[data_index].analysis_name = analysis_name 
109              ds.relax_gui.analyses[data_index].pipe_name = pipe_name 
110              ds.relax_gui.analyses[data_index].pipe_bundle = pipe_bundle 
111   
112               
113              ds.relax_gui.analyses[data_index].frq = '' 
114              ds.relax_gui.analyses[data_index].save_dir = self.gui.launch_dir 
115   
116           
117          self.data = ds.relax_gui.analyses[data_index] 
118          self.data_index = data_index 
119   
120           
121          self.observer_register() 
122   
123           
124          super(Auto_noe, self).__init__(parent, id=id, pos=pos, size=size, style=style, name=name) 
 125   
126   
141   
142   
144          """Assemble the data required for the Auto_noe class. 
145   
146          @return:    A container with all the data required for the auto-analysis. 
147          @rtype:     class instance, list of str 
148          """ 
149   
150           
151          data = Container() 
152          missing = [] 
153   
154           
155          data.pipe_name = self.data.pipe_name 
156          data.pipe_bundle = self.data.pipe_bundle 
157   
158           
159          frq = gui_to_str(self.field_nmr_frq.GetValue()) 
160          if frq == None: 
161              missing.append('NMR frequency') 
162   
163           
164          data.file_root = 'noe.%s' % frq 
165   
166           
167          data.save_dir = self.data.save_dir 
168   
169           
170          if not exists_mol_res_spin_data(): 
171              missing.append("Sequence data") 
172   
173           
174          if not hasattr(cdp, 'spectrum_ids') or len(cdp.spectrum_ids) < 2: 
175              missing.append("Spectral data") 
176   
177           
178          return data, missing 
 179   
180   
182          """Construct the right hand box to pack into the main NOE box. 
183   
184          @return:    The right hand box element containing all NOE GUI elements (excluding the bitmap) to pack into the main Rx box. 
185          @rtype:     wx.BoxSizer instance 
186          """ 
187   
188           
189          box = wx.BoxSizer(wx.VERTICAL) 
190   
191           
192          self.add_title(box, "Steady-state NOE analysis") 
193   
194           
195          Text_ctrl(box, self, text="The data pipe bundle:", default=self.data.pipe_bundle, tooltip="This is the data pipe bundle associated with this analysis.", editable=False, width_text=self.width_text, width_button=self.width_button, spacer=self.spacer_horizontal) 
196   
197           
198          self.field_nmr_frq = Text_ctrl(box, self, text="NMR frequency label [MHz]:", default=self.data.frq, tooltip="This label is added to the output files.  For example if the label is '600', the NOE values will be located in the file 'noe.600.out'.", width_text=self.width_text, width_button=self.width_button, spacer=self.spacer_horizontal) 
199   
200           
201          self.field_results_dir = Text_ctrl(box, self, text="Results directory:", icon=fetch_icon('oxygen.actions.document-open-folder', "16x16"), default=self.data.save_dir, tooltip="The directory in which all automatically created files will be saved.", tooltip_button="Select the results directory.", fn=self.results_directory, button=True, width_text=self.width_text, width_button=self.width_button, spacer=self.spacer_horizontal) 
202   
203           
204          self.add_spin_systems(box, self) 
205   
206           
207          box.AddSpacer(40) 
208          self.peak_intensity = Spectra_list(gui=self.gui, parent=self, box=box, id=str(self.data_index), fn_add=self.peak_wizard_launch, noe_flag=True) 
209   
210           
211          box.AddSpacer(30) 
212          box.AddStretchSpacer() 
213   
214           
215          self.button_exec_relax = self.add_execute_analysis(box, self.execute) 
216   
217           
218          return box 
 219   
220   
229   
230   
271   
272   
293   
294   
296          """Launch the peak loading wizard. 
297   
298          @param event:   The wx event. 
299          @type event:    wx event 
300          """ 
301   
302           
303          self.peak_wizard = Peak_intensity_wizard(noe=True) 
 304   
305   
307          """The results directory selection. 
308   
309          @param event:   The wx event. 
310          @type event:    wx event 
311          """ 
312   
313           
314          dialog = RelaxDirDialog(parent=self, message='Select the results directory', defaultPath=self.field_results_dir.GetValue()) 
315   
316           
317          if status.show_gui and dialog.ShowModal() != wx.ID_OK: 
318               
319              return 
320   
321           
322          path = gui_to_str(dialog.get_path()) 
323          if not path: 
324              return 
325   
326           
327          self.data.save_dir = path 
328   
329           
330          self.field_results_dir.SetValue(str_to_gui(path)) 
 331   
332   
334          """Synchronise the noe analysis frame and the relax data store, both ways. 
335   
336          This method allows the frame information to be uploaded into the relax data store, or for the information in the relax data store to be downloaded by the frame. 
337   
338          @keyword upload:    A flag which if True will cause the frame to send data to the relax data store.  If False, data will be downloaded from the relax data store to update the frame. 
339          @type upload:       bool 
340          """ 
341   
342           
343          if upload: 
344              self.data.frq = gui_to_str(self.field_nmr_frq.GetValue()) 
345          else: 
346              self.field_nmr_frq.SetValue(str_to_gui(self.data.frq)) 
347   
348           
349          if upload: 
350              self.data.save_dir = gui_to_str(self.field_results_dir.GetValue()) 
351          else: 
352              self.field_results_dir.SetValue(str_to_gui(self.data.save_dir)) 
  353   
354   
355   
356   
358      """The NOE analysis execution object.""" 
359   
 378