Changeset 76c1727 in sasview
- Timestamp:
- Jan 21, 2010 4:42:07 PM (15 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- deeba75
- Parents:
- 889d5ab4
- Location:
- Invariant
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
Invariant/invariant.py
raafa962 r76c1727 24 24 function given some x, y 25 25 """ 26 def linearize_data(self, x, y, dy=None): 26 27 def linearize_data(self, data): 27 28 """ 28 29 Linearize data so that a linear fit can be performed. 29 30 Filter out the data that can't be transformed. 30 @param x: array of q values 31 @param y: array of I(q) values 32 @param dy: array of dI(q) values 31 @param data : LoadData1D instance 32 """ 33 # Check that the vector lengths are equal 34 assert(len(data.x)==len(data.y)) 35 if data.dy is not None: 36 assert(len(data.x)==len(data.dy)) 37 dy = data.dy 38 else: 39 dy = numpy.array([math.sqrt(math.fabs(j)) for j in data.y]) 40 # Transform smear info 41 dxl_out = None 42 dxw_out = None 43 dx_out = None 44 first_x = data.x#[0] 45 #if first_x == 0: 46 # first_x = data.x[1] 47 48 49 data_points = zip(data.x, data.y, dy) 50 51 # Transform the data 52 output_points = [(self.linearize_q_value(p[0]), 53 math.log(p[1]), 54 p[2]/p[1]) for p in data_points if p[0]>0 and p[1]>0] 55 56 x_out, y_out, dy_out = zip(*output_points) 57 58 #Transform smear info 59 if data.dxl is not None and len(data.dxl)>0: 60 dxl_out = self.linearize_dq_value(x=x_out, dx=data.dxl[:len(x_out)]) 61 if data.dxw is not None and len(data.dxw)>0: 62 dxw_out = self.linearize_dq_value(x=x_out, dx=data.dxw[:len(x_out)]) 63 if data.dx is not None and len(data.dx)>0: 64 dx_out = self.linearize_dq_value(x=x_out, dx=data.dx[:len(x_out)]) 65 x_out = numpy.asarray(x_out) 66 y_out = numpy.asarray(y_out) 67 dy_out = numpy.asarray(dy_out) 68 linear_data = LoaderData1D(x=x_out, y=y_out, dx=dx_out, dy=dy_out) 69 linear_data.dxl = dxl_out 70 linear_data.dxw = dxw_out 71 72 return linear_data 73 def linearize_dq_value(self, x, dx): 74 """ 75 Transform the input dq-value for linearization 33 76 """ 34 77 return NotImplemented 35 78 36 79 def linearize_q_value(self, value): 37 80 """ … … 61 104 self.scale = scale 62 105 self.radius = radius 63 64 def linearize_data(self, x, y, dy=None): 65 """ 66 Linearize data so that a linear fit can be performed. 67 Filter out the data that can't be transformed. 68 @param x: array of q values 69 @param y: array of I(q) values 70 @param dy: array of dI(q) values 71 """ 72 # Check that the vector lengths are equal 73 assert(len(x)==len(y)) 74 if dy is not None: 75 assert(len(x)==len(dy)) 76 else: 77 dy = numpy.array([math.sqrt(math.fabs(j)) for j in y]) 78 79 data_points = zip(x,y,dy) 80 81 # Transform the data 82 output_points = [(self.linearize_q_value(p[0]), 83 math.log(p[1]), 84 p[2]/p[1]) for p in data_points if p[0]>0 and p[1]>0] 85 86 x_out, y_out, dy_out = zip(*output_points) 87 88 return numpy.asarray(x_out), numpy.asarray(y_out), numpy.asarray(dy_out) 106 107 def linearize_dq_value(self, x, dx): 108 """ 109 Transform the input dq-value for linearization 110 """ 111 return numpy.array([2*x[0]*dx[0] for i in xrange(len(x))]) 89 112 90 113 def linearize_q_value(self, value): … … 138 161 self.scale = scale 139 162 self.power = power 140 141 def linearize_data(self, x, y, dy=None): 142 """ 143 Linearize data so that a linear fit can be performed. 144 Filter out the data that can't be transformed. 145 @param x: array of q values 146 @param y: array of I(q) values 147 @param dy: array of dI(q) values 148 """ 149 # Check that the vector lengths are equal 150 assert(len(x)==len(y)) 151 if dy is not None: 152 assert(len(x)==len(dy)) 153 else: 154 dy = numpy.array([math.sqrt(math.fabs(j)) for j in y]) 155 156 data_points = zip(x,y,dy) 157 158 # Transform the data 159 output_points = [(self.linearize_q_value(p[0]), 160 math.log(p[1]), 161 p[2]/p[1]) for p in data_points if p[0]>0 and p[1]>0] 162 163 x_out, y_out, dy_out = zip(*output_points) 164 165 return numpy.asarray(x_out), numpy.asarray(y_out), numpy.asarray(dy_out) 166 163 164 def linearize_dq_value(self, x, dx): 165 """ 166 Transform the input dq-value for linearization 167 """ 168 return numpy.array([dx[0]/x[0] for i in xrange(len(x))]) 169 167 170 def linearize_q_value(self, value): 168 171 """ … … 301 304 @note: Some computations depends on each others. 302 305 """ 303 304 305 306 def __init__(self, data, background=0, scale=1 ): 306 307 """ … … 365 366 """ 366 367 # Linearize the data in preparation for fitting 367 fit_x, fit_y, fit_dy = model.linearize_data(self._data.x, self._data.y, self._data.dy) 368 368 fit_data = model.linearize_data(self._data) 369 369 qmin = model.linearize_q_value(qmin) 370 370 qmax = model.linearize_q_value(qmax) 371 372 # Create a new Data1D object for processing 373 fit_data = LoaderData1D(x=fit_x, y=fit_y, dy=fit_dy) 374 fit_data.dxl = self._data.dxl 375 fit_data.dxw = self._data.dxw 371 # Get coefficient cmoning out of the fit 376 372 extrapolator = Extrapolator(data=fit_data) 377 373 extrapolator.set_fit_range(qmin=qmin, qmax=qmax) … … 592 588 sum += (data.x[i] * data.dxl[i] * dy[i] * dxi)**2 593 589 return math.sqrt(sum) 594 595 def get_qstar_low(self):596 """597 Compute the invariant for extrapolated data at low q range.598 599 Implementation:600 data = self.get_extra_data_low()601 return self._get_qstar()602 603 @return q_star: the invariant for data extrapolated at low q.604 """605 data = self.get_extra_data_low()606 return self._get_qstar(data=data)607 608 def get_qstar_high(self):609 """610 Compute the invariant for extrapolated data at high q range.611 612 Implementation:613 data = self.get_extra_data_high()614 return self._get_qstar()615 616 @return q_star: the invariant for data extrapolated at high q.617 """618 data = self.get_extra_data_high()619 return self._get_qstar(data=data)620 590 621 591 def _get_extrapolated_data(self, model, npts=INTEGRATION_NSTEPS, … … 657 627 result_data.dxw = dxw 658 628 return result_data 659 660 def get_extra_data_low(self):629 630 def _get_extra_data_low(self): 661 631 """ 662 632 This method creates a new data set from the invariant calculator. … … 689 659 qmax=qmax, 690 660 power=self._low_extrapolation_power) 661 q_start = Q_MINIMUM 691 662 #q_start point 692 q_start = Q_MINIMUM693 663 if Q_MINIMUM >= qmin: 694 664 q_start = qmin/10 … … 699 669 return data_min 700 670 701 def get_extra_data_high(self):671 def _get_extra_data_high(self): 702 672 """ 703 673 This method creates a new data from the invariant calculator. … … 730 700 q_start=qmax, q_end=q_end) 731 701 return data_max 702 703 def get_qstar_low(self): 704 """ 705 Compute the invariant for extrapolated data at low q range. 706 707 Implementation: 708 data = self._get_extra_data_low() 709 return self._get_qstar() 710 711 @return q_star: the invariant for data extrapolated at low q. 712 """ 713 data = self._get_extra_data_low() 714 715 return self._get_qstar(data=data) 716 717 def get_qstar_high(self): 718 """ 719 Compute the invariant for extrapolated data at high q range. 720 721 Implementation: 722 data = self._get_extra_data_high() 723 return self._get_qstar() 724 725 @return q_star: the invariant for data extrapolated at high q. 726 """ 727 data = self._get_extra_data_high() 728 return self._get_qstar(data=data) 729 730 def get_extra_data_low(self, npts_in=None, q_start=Q_MINIMUM, nsteps=INTEGRATION_NSTEPS): 731 """ 732 This method creates a new data set from the invariant calculator. 733 734 It will use the extrapolation parameters kept as private data members. 735 736 self._low_extrapolation_npts is the number of data points to use in to fit. 737 self._low_extrapolation_function will be used as the fit function. 738 739 740 741 It takes npts first points of data, fits them with a given model 742 then uses the new parameters resulting from the fit to create a new data set. 743 744 The new data first point is Q_MINIMUM. 745 746 The last point of the new data is the first point of the original data. 747 the number of q points of this data is INTEGRATION_NSTEPS. 748 749 @return: a new data of type Data1D 750 """ 751 #Create a data from result of the fit for a range outside of the data 752 # at low q range 753 data_out_range = self._get_extra_data_low() 754 755 if q_start != Q_MINIMUM or nsteps != INTEGRATION_NSTEPS: 756 qmin = min(self._data.x) 757 if q_start < Q_MINIMUM: 758 q_start = Q_MINIMUM 759 elif q_start >= qmin: 760 q_start = qmin/10 761 762 #compute the new data with the proper result of the fit for different 763 #boundary and step, outside of data 764 data_out_range = self._get_extrapolated_data(model=self._low_extrapolation_function, 765 npts=nsteps, 766 q_start=q_start, q_end=qmin) 767 #Create data from the result of the fit for a range inside data q range for 768 #low q 769 if npts_in is None : 770 npts_in = self._low_extrapolation_npts 771 772 x = self._data.x[:npts_in] 773 y = self._low_extrapolation_function.evaluate_model(x=x) 774 dy = None 775 dx = None 776 dxl = None 777 dxw = None 778 if self._data.dx is not None: 779 dx = self._data.dx[:npts_in] 780 if self._data.dy is not None: 781 dy = self._data.dy[:npts_in] 782 if self._data.dxl is not None and len(self._data.dxl)>0: 783 dxl = self._data.dxl[:npts_in] 784 if self._data.dxw is not None and len(self._data.dxw)>0: 785 dxw = self._data.dxw[:npts_in] 786 #Crate new data 787 data_in_range = LoaderData1D(x=x, y=y, dx=dx, dy=dy) 788 data_in_range.clone_without_data(clone=self._data) 789 data_in_range.dxl = dxl 790 data_in_range.dxw = dxw 791 792 return data_out_range, data_in_range 793 794 def get_extra_data_high(self, npts_in=None, q_end=Q_MAXIMUM, nsteps=INTEGRATION_NSTEPS ): 795 """ 796 This method creates a new data from the invariant calculator. 797 798 It takes npts last points of data, fits them with a given model 799 (for this function only power_law will be use), then uses 800 the new parameters resulting from the fit to create a new data set. 801 The first point is the last point of data. 802 The last point of the new data is Q_MAXIMUM. 803 The number of q points of this data is INTEGRATION_NSTEPS. 804 805 806 @return: a new data of type Data1D 807 """ 808 #Create a data from result of the fit for a range outside of the data 809 # at low q range 810 data_out_range = self._get_extra_data_high() 811 qmax = max(self._data.x) 812 if q_end != Q_MAXIMUM or nsteps != INTEGRATION_NSTEPS: 813 if q_end > Q_MAXIMUM: 814 q_end = Q_MAXIMUM 815 elif q_end <= qmax: 816 q_end = qmax * 10 817 818 #compute the new data with the proper result of the fit for different 819 #boundary and step, outside of data 820 data_out_range = self._get_extrapolated_data(model=self._high_extrapolation_function, 821 npts=nsteps, 822 q_start=qmax, q_end=q_end) 823 #Create data from the result of the fit for a range inside data q range for 824 #high q 825 if npts_in is None : 826 npts_in = self._high_extrapolation_npts 827 828 x_len = len(self._data.x) 829 x = self._data.x[(x_len-npts_in):] 830 y = self._high_extrapolation_function.evaluate_model(x=x) 831 dy = None 832 dx = None 833 dxl = None 834 dxw = None 835 836 if self._data.dx is not None: 837 dx = self._data.dx[(x_len-npts_in):] 838 if self._data.dy is not None: 839 dy = self._data.dy[(x_len-npts_in):] 840 if self._data.dxl is not None and len(self._data.dxl)>0: 841 dxl = self._data.dxl[(x_len-npts_in):] 842 if self._data.dxw is not None and len(self._data.dxw)>0: 843 dxw = self._data.dxw[(x_len-npts_in):] 844 #Crate new data 845 data_in_range = LoaderData1D(x=x, y=y, dx=dx, dy=dy) 846 data_in_range.clone_without_data(clone=self._data) 847 data_in_range.dxl = dxl 848 data_in_range.dxw = dxw 849 850 return data_out_range, data_in_range 851 732 852 733 853 def set_extrapolation(self, range, npts=4, function=None, power=None): -
Invariant/test/utest_data_handling.py
r889d5ab4 r76c1727 192 192 def test_guinier_incompatible_length(self): 193 193 g = invariant.Guinier() 194 self.assertRaises(AssertionError, g.linearize_data, [1],[1,2],None) 195 self.assertRaises(AssertionError, g.linearize_data, [1,2],[1,2],[1]) 194 data_in = Data1D(x=[1], y=[1,2], dy=None) 195 self.assertRaises(AssertionError, g.linearize_data, data_in) 196 data_in = Data1D(x=[1,1], y=[1,2], dy=[1]) 197 self.assertRaises(AssertionError, g.linearize_data, data_in) 196 198 197 199 def test_linearization(self): … … 203 205 y = numpy.asarray(numpy.asarray([1,1,1,1])) 204 206 g = invariant.Guinier() 205 x_out, y_out, dy_out = g.linearize_data(x,y,None) 207 data_in = Data1D(x=x, y=y) 208 data_out = g.linearize_data(data_in) 209 x_out, y_out, dy_out = data_out.x, data_out.y, data_out.dy 206 210 self.assertEqual(len(x_out), 3) 207 211 self.assertEqual(len(y_out), 3) … … 261 265 class TestDataExtraLowSlit(unittest.TestCase): 262 266 """ 263 Generate a Guinier distribution and verify that the extrapolation 264 produce the correct ditribution. Tested if the data generated by the 265 invariant calculator is correct 266 """ 267 268 def setUp(self): 269 """ 270 Generate a Guinier distribution. After extrapolating, we will 271 verify that we obtain the scale and rg parameters 267 for a smear data, test that the fitting go through 268 reel data for the 2 first points 269 """ 270 def setUp(self): 271 """ 272 Reel data containing slit smear information 273 .Use 2 points of data to fit with power_law when exptrapolating 272 274 """ 273 275 list = Loader().load("latex_smeared.xml") … … 275 277 self.data.dxl = list[0].dxl 276 278 self.data.dxw = list[0].dxw 279 self.npts = 2 277 280 278 281 def test_low_q(self): … … 283 286 inv = invariant.InvariantCalculator(data=self.data) 284 287 # Set the extrapolation parameters for the low-Q range 285 inv.set_extrapolation(range='low', npts= 20, function='guinier')286 287 self.assertEqual(inv._low_extrapolation_npts, 20)288 self.assertEqual(inv._low_extrapolation_function.__class__, invariant. Guinier)288 inv.set_extrapolation(range='low', npts=self.npts, function='power_law') 289 290 self.assertEqual(inv._low_extrapolation_npts, self.npts) 291 self.assertEqual(inv._low_extrapolation_function.__class__, invariant.PowerLaw) 289 292 290 293 # Data boundaries for fiiting … … 298 301 power=inv._low_extrapolation_power) 299 302 300 301 303 qstar = inv.get_qstar(extrapolation='low') 302 304 reel_y = self.data.y … … 304 306 #low data . expect the fit engine to have been already called and the guinier 305 307 # to have the radius and the scale fitted 306 307 test_y = inv._low_extrapolation_function.evaluate_model(x=self.data.x) 308 for i in range(len(self.data.x)): 308 test_y = inv._low_extrapolation_function.evaluate_model(x=self.data.x[:inv._low_extrapolation_npts]) 309 #Check any points generated from the reel data and the extrapolation have 310 #very close value 311 self.assert_(len(test_y))== len(reel_y[:inv._low_extrapolation_npts]) 312 for i in range(inv._low_extrapolation_npts): 313 value = math.fabs(test_y[i]-reel_y[i])/reel_y[i] 314 self.assert_(value < 0.001) 315 data_out_range, data_in_range= inv.get_extra_data_low(npts_in=None) 316 317 class TestDataExtraLowSlitGuinier(unittest.TestCase): 318 """ 319 for a smear data, test that the fitting go through 320 reel data for atleast the 2 first points 321 """ 322 323 def setUp(self): 324 """ 325 Generate a Guinier distribution. After extrapolating, we will 326 verify that we obtain the scale and rg parameters 327 """ 328 self.scale = 1.5 329 self.rg = 30.0 330 x = numpy.arange(0.0001, 0.1, 0.0001) 331 y = numpy.asarray([self.scale * math.exp( -(q*self.rg)**2 / 3.0 ) for q in x]) 332 dy = y*.1 333 dxl = 0.117 * numpy.ones(len(x)) 334 self.data = Data1D(x=x, y=y, dy=dy) 335 self.data.dxl = dxl 336 self.npts = len(x)-10 337 338 def test_low_q(self): 339 """ 340 Invariant with low-Q extrapolation with slit smear 341 """ 342 # Create invariant object. Background and scale left as defaults. 343 inv = invariant.InvariantCalculator(data=self.data) 344 # Set the extrapolation parameters for the low-Q range 345 inv.set_extrapolation(range='low', npts=self.npts, function='guinier') 346 347 self.assertEqual(inv._low_extrapolation_npts, self.npts) 348 self.assertEqual(inv._low_extrapolation_function.__class__, invariant.Guinier) 349 350 # Data boundaries for fiiting 351 qmin = inv._data.x[0] 352 qmax = inv._data.x[inv._low_extrapolation_npts - 1] 353 354 # Extrapolate the low-Q data 355 a, b = inv._fit(model=inv._low_extrapolation_function, 356 qmin=qmin, 357 qmax=qmax, 358 power=inv._low_extrapolation_power) 359 360 361 qstar = inv.get_qstar(extrapolation='low') 362 reel_y = self.data.y 363 #Compution the y 's coming out of the invariant when computing extrapolated 364 #low data . expect the fit engine to have been already called and the guinier 365 # to have the radius and the scale fitted 366 test_y = inv._low_extrapolation_function.evaluate_model(x=self.data.x[:inv._low_extrapolation_npts]) 367 self.assert_(len(test_y))== len(reel_y[:inv._low_extrapolation_npts]) 368 369 for i in range(inv._low_extrapolation_npts): 309 370 value = math.fabs(test_y[i]-reel_y[i])/reel_y[i] 310 371 self.assert_(value < 0.001) 311 372 373 def test_low_data(self): 374 """ 375 Invariant with low-Q extrapolation with slit smear 376 """ 377 # Create invariant object. Background and scale left as defaults. 378 inv = invariant.InvariantCalculator(data=self.data) 379 # Set the extrapolation parameters for the low-Q range 380 inv.set_extrapolation(range='low', npts=self.npts, function='guinier') 381 382 self.assertEqual(inv._low_extrapolation_npts, self.npts) 383 self.assertEqual(inv._low_extrapolation_function.__class__, invariant.Guinier) 384 385 # Data boundaries for fiiting 386 qmin = inv._data.x[0] 387 qmax = inv._data.x[inv._low_extrapolation_npts - 1] 388 389 # Extrapolate the low-Q data 390 a, b = inv._fit(model=inv._low_extrapolation_function, 391 qmin=qmin, 392 qmax=qmax, 393 power=inv._low_extrapolation_power) 394 395 396 qstar = inv.get_qstar(extrapolation='low') 397 reel_y = self.data.y 398 #Compution the y 's coming out of the invariant when computing extrapolated 399 #low data . expect the fit engine to have been already called and the guinier 400 # to have the radius and the scale fitted 401 data_out_range, data_in_range= inv.get_extra_data_low() 402 test_y = data_in_range.y 403 self.assert_(len(test_y))== len(reel_y[:inv._low_extrapolation_npts]) 404 for i in range(inv._low_extrapolation_npts): 405 value = math.fabs(test_y[i]-reel_y[i])/reel_y[i] 406 self.assert_(value < 0.001) 407 408 data_out_range, data_in_range= inv.get_extra_data_low(npts_in= 2, nsteps=10, 409 q_start= 1e-4) 410 test_y = data_in_range.y 411 self.assert_(len(test_y))== len(reel_y[:2]) 412 for i in range(2): 413 value = math.fabs(test_y[i]-reel_y[i])/reel_y[i] 414 self.assert_(value < 0.001) 415 #test the data out of range 416 test_out_y = data_out_range.y 417 self.assertEqual(len(test_out_y), 10) 312 418 419 class TestDataExtraHighSlitPowerLaw(unittest.TestCase): 420 """ 421 for a smear data, test that the fitting go through 422 reel data for atleast the 2 first points 423 """ 424 425 def setUp(self): 426 """ 427 Generate a Guinier distribution. After extrapolating, we will 428 verify that we obtain the scale and rg parameters 429 """ 430 self.scale = 1.5 431 self.m = 3.0 432 x = numpy.arange(0.0001, 0.1, 0.0001) 433 y = numpy.asarray([self.scale * math.pow(q ,-1.0*self.m) for q in x]) 434 dy = y*.1 435 self.data = Data1D(x=x, y=y, dy=dy) 436 dxl = 0.117 * numpy.ones(len(x)) 437 self.data.dxl = dxl 438 self.npts = 20 439 440 def test_high_q(self): 441 """ 442 Invariant with high-Q extrapolation with slit smear 443 """ 444 # Create invariant object. Background and scale left as defaults. 445 inv = invariant.InvariantCalculator(data=self.data) 446 # Set the extrapolation parameters for the low-Q range 447 inv.set_extrapolation(range='high', npts=self.npts, function='power_law') 448 449 self.assertEqual(inv._high_extrapolation_npts, self.npts) 450 self.assertEqual(inv._high_extrapolation_function.__class__, invariant.PowerLaw) 451 452 # Data boundaries for fiiting 453 xlen = len(self.data.x) 454 start = xlen - inv._high_extrapolation_npts 455 qmin = inv._data.x[start] 456 qmax = inv._data.x[xlen-1] 457 458 # Extrapolate the high-Q data 459 a, b = inv._fit(model=inv._high_extrapolation_function, 460 qmin=qmin, 461 qmax=qmax, 462 power=inv._high_extrapolation_power) 463 464 465 qstar = inv.get_qstar(extrapolation='high') 466 reel_y = self.data.y 467 #Compution the y 's coming out of the invariant when computing extrapolated 468 #low data . expect the fit engine to have been already called and the power law 469 # to have the radius and the scale fitted 470 471 472 test_y = inv._high_extrapolation_function.evaluate_model(x=self.data.x[start: ]) 473 self.assert_(len(test_y))== len(reel_y[start:]) 474 475 for i in range(len(self.data.x[start:])): 476 value = math.fabs(test_y[i]-reel_y[start+i])/reel_y[start+i] 477 self.assert_(value < 0.001) 478 479 def test_high_data(self): 480 """ 481 Invariant with low-Q extrapolation with slit smear 482 """ 483 # Create invariant object. Background and scale left as defaults. 484 inv = invariant.InvariantCalculator(data=self.data) 485 # Set the extrapolation parameters for the low-Q range 486 inv.set_extrapolation(range='high', npts=self.npts, function='power_law') 487 488 self.assertEqual(inv._high_extrapolation_npts, self.npts) 489 self.assertEqual(inv._high_extrapolation_function.__class__, invariant.PowerLaw) 490 491 # Data boundaries for fiiting 492 xlen = len(self.data.x) 493 start = xlen - inv._high_extrapolation_npts 494 qmin = inv._data.x[start] 495 qmax = inv._data.x[xlen-1] 496 497 # Extrapolate the high-Q data 498 a, b = inv._fit(model=inv._high_extrapolation_function, 499 qmin=qmin, 500 qmax=qmax, 501 power=inv._high_extrapolation_power) 502 503 504 qstar = inv.get_qstar(extrapolation='high') 505 reel_y = self.data.y 506 #Compution the y 's coming out of the invariant when computing extrapolated 507 #low data . expect the fit engine to have been already called and the power law 508 # to have the radius and the scale fitted 509 510 data_out_range, data_in_range= inv.get_extra_data_high() 511 test_y = data_in_range.y 512 self.assert_(len(test_y))== len(reel_y[start:]) 513 temp = reel_y[start:] 514 515 for i in range(len(self.data.x[start:])): 516 value = math.fabs(test_y[i]- temp[i])/temp[i] 517 self.assert_(value < 0.001) 313 518 314 519 data_out_range, data_in_range= inv.get_extra_data_high(npts_in=5, nsteps=10, 520 q_end= 2) 521 test_y = data_in_range.y 522 self.assert_(len(test_y)==5) 523 temp = reel_y[start:start+5] 524 525 for i in range(len(self.data.x[start:start+5])): 526 527 value = math.fabs(test_y[i]- temp[i])/temp[i] 528 self.assert_(value < 0.06) 529 #test the data out of range 530 test_out_y = data_out_range.y 531 self.assertEqual(len(test_out_y), 10) 532 -
Invariant/test/utest_use_cases.py
raafa962 r76c1727 326 326 # Test results 327 327 self.assertAlmostEquals(qstar, 4.1539e-4, 2) 328 self.assertAlmostEquals(v, 0.032164596, 3)328 self.assertAlmostEquals(v, 0.032164596, 2) 329 329 self.assertAlmostEquals(s , 941.7452, 3) 330 330
Note: See TracChangeset
for help on using the changeset viewer.