1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16   
 17   
 18   
 19   
 20   
 21   
 22   
 23   
 24   
 25  from os import sep 
 26  from os.path import basename, dirname 
 27  from tempfile import mkdtemp, NamedTemporaryFile 
 28   
 29   
 30  from data_store import Relax_data_store; ds = Relax_data_store() 
 31  import dep_check 
 32  from pipe_control.mol_res_spin import spin_loop 
 33  from status import Status; status = Status() 
 34  from test_suite.system_tests.base_classes import SystemTestCase 
 35   
 36   
 38      """TestCase class for the functional tests for the support of different spectrum intensity calculation or errors, signal to noise and plotting.""" 
 39   
 40   
 42          """Set up for all the functional tests.""" 
 43   
 44           
 45          ds.tmpdir = mkdtemp() 
 46          self.tmpdir = ds.tmpdir 
  47   
 49          """Setup intensity data. 
 50   
 51          This uses the data from paper at U{http://dx.doi.org/10.1073/pnas.0509100103}.  This is CPMG data with a fixed relaxation time period.  Experiment in 0.48 M GuHCl (guanidine hydrochloride). 
 52          """ 
 53   
 54           
 55          pipe_name = 'base pipe' 
 56          pipe_bundle = 'relax_disp' 
 57          pipe_type = 'relax_disp' 
 58   
 59           
 60          self.interpreter.pipe.create(pipe_name=pipe_name, bundle=pipe_bundle, pipe_type=pipe_type) 
 61   
 62          data_path = status.install_path + sep+'test_suite'+sep+'shared_data'+sep+'dispersion'+sep+'KTeilum_FMPoulsen_MAkke_2006'+sep+'bug_neg_int_acbp_cpmg_disp_048MGuHCl_40C_041223' 
 63   
 64           
 65          self.interpreter.spectrum.read_spins(file="peaks_list_max_standard.ser", dir=data_path) 
 66   
 67           
 68          self.interpreter.spin.isotope(isotope='15N') 
 69   
 70           
 71          self.interpreter.spectrum.read_intensities(file="peaks_list_max_standard.ser", dir=data_path, spectrum_id='auto', int_method='height') 
 72   
 73           
 74          ncycfile=open(data_path + sep + 'ncyc.txt', 'r') 
 75   
 76           
 77          ncyclist = [] 
 78   
 79          i = 0 
 80          for line in ncycfile: 
 81              ncyc = line.split()[0] 
 82              time_T2 = float(line.split()[1]) 
 83              vcpmg = line.split()[2] 
 84              set_sfrq = float(line.split()[3]) 
 85              rmsd_err = float(line.split()[4]) 
 86   
 87               
 88              if float(vcpmg) == 0.0: 
 89                  vcpmg = None 
 90              else: 
 91                  vcpmg = round(float(vcpmg), 3) 
 92   
 93               
 94              ncyclist.append(int(ncyc)) 
 95   
 96               
 97              current_id = "Z_A%s"%(i) 
 98   
 99               
100              self.interpreter.relax_disp.exp_type(spectrum_id=current_id, exp_type='SQ CPMG') 
101   
102               
103              self.interpreter.spectrum.baseplane_rmsd(error=rmsd_err, spectrum_id=current_id) 
104   
105               
106              self.interpreter.spectrometer.frequency(id=current_id, frq=set_sfrq, units='MHz') 
107   
108               
109              self.interpreter.relax_disp.relax_time(spectrum_id=current_id, time=time_T2) 
110   
111               
112              self.interpreter.relax_disp.cpmg_setup(spectrum_id=current_id, cpmg_frq=vcpmg) 
113   
114              i += 1 
115   
116           
117          self.interpreter.spectrum.error_analysis_per_field() 
118   
119           
120          ds.data = [ 
121          [1, 1711.104, 3040.110, 8.514, 121.681, +5.586445e+05, 'A3N-HN', 1.0000, 1.7492, 0.9997, 1.0075, 1.0081, 0.8991, 1.0205, 0.9893, 1.0145, 1.0078, 1.0133, 1.0020, 0.9995, 1.0020, 1.0249, 1.7571, 1.0016], 
122          [2, 2011.491, 4112.494, 8.025, 117.805, +6.213668e+05, 'E4N-HN', 1.0000, 1.6032, -0.8322, 0.9920, 0.9951, 0.8300, 0.9458, 0.9689, 0.9246, 0.9936, 0.9914, 0.9842, 1.0011, 0.8529, 0.9727, 1.5845, 0.9822], 
123          [3, 1974.019, 2629.250, 8.086, 123.166, +4.592940e+05, 'F5N-HN', 1.0000, 1.8235, 0.8614, 1.0135, 1.0134, 0.8825, 0.9332, 0.9772, 0.9273, 0.9803, 0.9986, 1.0000, 1.0012, 0.8923, 0.9421, 1.8102, 1.0062], 
124          [4, 1608.518, 3683.374, 8.681, 119.356, +5.293190e+05, 'D6N-HN', 1.0000, 1.6865, 0.8531, 1.0052, 1.0065, 0.8530, 0.9280, 0.9594, 0.8989, 0.9914, 1.0115, 0.9743, 1.0063, 0.8177, 0.9264, 1.6855, 0.9981], 
125          ] 
126   
127          ds.rmsd = [2.47e+03, 2.34e+03, 2.41e+03, 2.42e+03, 2.45e+03, 2.42e+03, 2.42e+03, 2.44e+03, 2.39e+03, 2.4e+03, 2.42e+03, 2.46e+03, 2.41e+03, 2.45e+03, 2.45e+03, 2.39e+03, 2.45e+03] 
 128   
129   
131          """Test calculation of signal to noise ratio. 
132          """ 
133   
134   
135           
136          self.setup_signal_noise_ratio() 
137   
138           
139          self.interpreter.spectrum.sn_ratio() 
140   
141           
142          i = 0 
143          for cur_spin, cur_spin_id in spin_loop(return_id=True, skip_desel=True): 
144               
145              self.assertEqual(cur_spin_id, ":%s@N"%ds.data[i][6][1]) 
146   
147               
148              for j in range(17): 
149                   
150                  data_int = ds.data[i][j+7] * ds.data[i][5] 
151                  pint = cur_spin.peak_intensity['Z_A%i'%j] 
152                  self.assertEqual(pint, data_int) 
153   
154                   
155                  data_rmsd = ds.rmsd[j] 
156                  self.assertEqual(cur_spin.baseplane_rmsd['Z_A%i'%j], data_rmsd) 
157   
158                   
159                   
160                  pint_err = cur_spin.peak_intensity_err['Z_A%i'%j] 
161                  self.assertEqual(pint_err, ds.rmsd[j]) 
162   
163                   
164                  sn_ratio = data_int / data_rmsd 
165                  self.assertEqual(cur_spin.sn_ratio['Z_A%i'%j], sn_ratio) 
166                  self.assertEqual(cur_spin.sn_ratio['Z_A%i'%j], pint/pint_err) 
167   
168               
169              i += 1 
 170   
171   
173          """Test grace plotting function for plotting the intensities per residue. 
174          """ 
175   
176   
177           
178          self.setup_signal_noise_ratio() 
179   
180           
181          self.interpreter.deselect.spin(spin_id=':4@N', boolean='AND', change_all=False) 
182   
183           
184          show_grace = False 
185          if show_grace: 
186              outfile= NamedTemporaryFile(delete=False).name 
187              filedir = dirname(outfile) 
188          else: 
189              filedir = self.tmpdir 
190          outfile = 'int.agr' 
191   
192          self.interpreter.grace.write(x_data_type='res_num', y_data_type='peak_intensity', file=outfile, dir=filedir, force=True) 
193   
194           
195          if show_grace: 
196              self.interpreter.grace.view(file=outfile, dir=filedir, grace_exe='xmgrace') 
 197   
198   
200          """Test grace plotting function for plotting the signal to noise ratio per residue. 
201          """ 
202   
203           
204          self.setup_signal_noise_ratio() 
205   
206           
207          self.interpreter.spectrum.sn_ratio() 
208   
209           
210          self.interpreter.deselect.spin(spin_id=':4@N', boolean='AND', change_all=False) 
211   
212           
213          show_grace = False 
214          if show_grace: 
215              outfile= NamedTemporaryFile(delete=False).name 
216              filedir = dirname(outfile) 
217          else: 
218              filedir = self.tmpdir 
219          outfile = 'int_sn.agr' 
220   
221          self.interpreter.grace.write(x_data_type='res_num', y_data_type='sn_ratio', file=outfile, dir=filedir, force=True) 
222   
223           
224          if show_grace: 
225              self.interpreter.grace.view(file=outfile, dir=filedir, grace_exe='xmgrace') 
 226   
227   
229          """Test the deselect.sn_ratio for signal to noise ratios, where all ID should evaluate to True. 
230          """ 
231   
232           
233          self.setup_signal_noise_ratio() 
234   
235           
236          self.interpreter.spectrum.sn_ratio() 
237   
238           
239          self.interpreter.deselect.sn_ratio(ratio=400.0, operation='<', all_sn=True) 
240   
241           
242          spin_ids_sel = [] 
243          spin_ids_desel = [] 
244   
245           
246          for cur_spin, cur_spin_id in spin_loop(return_id=True, skip_desel=False): 
247              if cur_spin.select: 
248                  spin_ids_sel.append(cur_spin_id) 
249              else: 
250                  spin_ids_desel.append(cur_spin_id) 
251   
252           
253          self.assertEqual(spin_ids_sel, [':3@N', ':4@N']) 
254          self.assertEqual(spin_ids_desel, [':5@N', ':6@N']) 
 255   
256   
258          """Test the deselect.sn_ratio for signal to noise ratios, where any ID should evaluate to True. 
259          """ 
260   
261           
262          self.setup_signal_noise_ratio() 
263   
264           
265          self.interpreter.spectrum.sn_ratio() 
266   
267           
268          self.interpreter.deselect.sn_ratio(ratio=200.0, operation='<', all_sn=False) 
269   
270           
271          spin_ids_sel = [] 
272          spin_ids_desel = [] 
273   
274           
275          for cur_spin, cur_spin_id in spin_loop(return_id=True, skip_desel=False): 
276              if cur_spin.select: 
277                  spin_ids_sel.append(cur_spin_id) 
278              else: 
279                  spin_ids_desel.append(cur_spin_id) 
280   
281           
282          self.assertEqual(spin_ids_sel, [':3@N']) 
283          self.assertEqual(spin_ids_desel, [':4@N', ':5@N', ':6@N']) 
 284   
285   
287          """Test the select.sn_ratio for signal to noise ratios, where all ID should evaluate to True. 
288          """ 
289   
290           
291          self.setup_signal_noise_ratio() 
292   
293           
294          self.interpreter.spectrum.sn_ratio() 
295   
296           
297          self.interpreter.deselect.all() 
298   
299           
300          self.interpreter.select.sn_ratio(ratio=400.0, operation='<', all_sn=True) 
301   
302           
303          spin_ids_sel = [] 
304          spin_ids_desel = [] 
305   
306           
307          for cur_spin, cur_spin_id in spin_loop(return_id=True, skip_desel=False): 
308              if cur_spin.select: 
309                  spin_ids_sel.append(cur_spin_id) 
310              else: 
311                  spin_ids_desel.append(cur_spin_id) 
312   
313           
314          self.assertEqual(spin_ids_sel, [':5@N', ':6@N']) 
315          self.assertEqual(spin_ids_desel, [':3@N', ':4@N']) 
 316   
317   
319          """Test the select.sn_ratio for signal to noise ratios, where any ID should evaluate to True. 
320          """ 
321   
322           
323          self.setup_signal_noise_ratio() 
324   
325           
326          self.interpreter.spectrum.sn_ratio() 
327   
328           
329          self.interpreter.deselect.all() 
330   
331           
332          self.interpreter.select.sn_ratio(ratio=200.0, operation='<', all_sn=False) 
333   
334           
335          spin_ids_sel = [] 
336          spin_ids_desel = [] 
337   
338           
339          for cur_spin, cur_spin_id in spin_loop(return_id=True, skip_desel=False): 
340              if cur_spin.select: 
341                  spin_ids_sel.append(cur_spin_id) 
342              else: 
343                  spin_ids_desel.append(cur_spin_id) 
344   
345           
346          self.assertEqual(spin_ids_sel, [':4@N', ':5@N', ':6@N']) 
347          self.assertEqual(spin_ids_desel, [':3@N']) 
  348