1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16   
 17   
 18   
 19   
 20   
 21   
 22   
 23  """Analysis specific code for the hybridisation of different data pipes.""" 
 24   
 25   
 26  from lib.errors import RelaxError, RelaxNoSequenceError, RelaxPipeError, RelaxSequenceError 
 27  from pipe_control import pipes 
 28  from pipe_control.mol_res_spin import exists_mol_res_spin_data 
 29  from pipe_control.sequence import compare_sequence 
 30   
 31   
 33      """Class containing function specific to hybrid models.""" 
 34   
 35 -    def _hybridise(self, hybrid=None, pipe_list=None): 
  74   
 75   
 76 -    def duplicate_data(self, pipe_from=None, pipe_to=None, model_info=None, global_stats=False, verbose=True): 
  77          """Duplicate the data specific to a single hybrid data pipe. 
 78   
 79          @keyword pipe_from:     The data pipe to copy the data from. 
 80          @type pipe_from:        str 
 81          @keyword pipe_to:       The data pipe to copy the data to. 
 82          @type pipe_to:          str 
 83          @keyword model_info:    The model information from model_info(). 
 84          @type model_info:       int 
 85          @keyword global_stats:  The global statistics flag. 
 86          @type global_stats:     bool 
 87          @keyword verbose:       A flag which if True will cause info to be printed out. 
 88          @type verbose:          bool 
 89          """ 
 90   
 91           
 92          if not pipes.has_pipe(pipe_to): 
 93              pipes.create(pipe_to, pipe_type='hybrid', switch=False) 
 94   
 95           
 96          dp_from = pipes.get_pipe(pipe_from) 
 97          dp_to = pipes.get_pipe(pipe_to) 
 98   
 99           
100          if not exists_mol_res_spin_data(pipe_to): 
101              raise RelaxSequenceError(pipe_to) 
102   
103           
104          dp_to.hybrid_pipes = dp_from.hybrid_pipes 
 105   
106   
108          """Return a description of the model. 
109   
110          @param model_info:  The model information from the model_loop().  This is unused. 
111          @type model_info:   int 
112          @return:            The model description. 
113          @rtype:             str 
114          """ 
115   
116          return "hybrid model" 
 117   
118   
120          """Dummy generator method - this should be a global model!""" 
121   
122          yield 0 
 123   
124   
126          """Method stating that this is a global model.""" 
127   
128          return 'global' 
 129   
130   
132          """Return the k, n, and chi2 model statistics of the hybrid. 
133   
134          k - number of parameters. 
135          n - number of data points. 
136          chi2 - the chi-squared value. 
137   
138   
139          @keyword model_index:   The model index.  This is zero for the global models or equal to the 
140                                  global spin index (which covers the molecule, residue, and spin 
141                                  indices).  This originates from the model_loop(). 
142          @type model_index:      int 
143          @keyword spin_id:       The spin identification string.  Either this or the instance keyword 
144                                  argument must be supplied. 
145          @type spin_id:          None or str 
146          @keyword global_stats:  A parameter which determines if global or local statistics are 
147                                  returned.  If None, then the appropriateness of global or local 
148                                  statistics is automatically determined. 
149          @type global_stats:     None or bool 
150          @return:                The optimisation statistics, in tuple format, of the number of 
151                                  parameters (k), the number of data points (n), and the chi-squared 
152                                  value (chi2). 
153          @rtype:                 tuple of int, int, float 
154          """ 
155   
156           
157          if model_info == None and spin_id == None: 
158              raise RelaxError("Either the model_info or spin_id argument must be supplied.") 
159          elif model_info != None and spin_id != None: 
160              raise RelaxError("The model_info arg " + repr(model_info) + " and spin_id arg " + repr(spin_id) + " clash.  Only one should be supplied.") 
161   
162           
163          k_total = 0 
164          n_total = 0 
165          chi2_total = 0.0 
166   
167           
168          for pipe in cdp.hybrid_pipes: 
169               
170              pipes.switch(pipe) 
171   
172               
173              model_statistics = setup.get_specific_fn('model_stats', pipes.get_type(pipe)) 
174   
175               
176               
177               
178              k, n, chi2 = model_statistics(model_info=model_info, spin_id=spin_id, global_stats=global_stats) 
179   
180               
181              if k == None or n == None or chi2 == None: 
182                  continue 
183   
184               
185              k_total = k_total + k 
186              n_total = n_total + n 
187              chi2_total = chi2_total + chi2 
188   
189           
190          return k_total, n_total, chi2_total 
 191   
192   
194          """Return the number of instances, which for hybrids is always 1. 
195   
196          @return:    The number of instances. 
197          @rtype:     int 
198          """ 
199   
200          return 1 
 201   
202   
204          """Dummy function. 
205   
206          @param model_info:  The model index from model_loop(). 
207          @type model_info:   int 
208          @return:            True if the data should be skipped, False otherwise. 
209          @rtype:             bool 
210          """ 
211   
212           
213          return False 
  214