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