Changeset 46d50ca in sasview
- Timestamp:
- Jan 9, 2010 3:41:56 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:
- 9e37661
- Parents:
- b345c45
- Location:
- Invariant
- Files:
-
- 1 added
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
Invariant/invariant.py
r4d270706 r46d50ca 7 7 import numpy 8 8 9 from sans.guiframe.dataFittingimport Data1D as LoaderData1D9 from DataLoader.data_info import Data1D as LoaderData1D 10 10 from DataLoader.qsmearing import smear_selection 11 11 … … 66 66 """ 67 67 self.data = data 68 x_len = len(self.data.x) -1 69 #fitting range 70 self.qmin = self.data.x[0] 71 if self.qmin == 0: 72 self.qmin = Q_MINIMUM 73 74 self.qmax = self.data.x[x_len] 75 #Unsmeared q range 76 self._qmin_unsmeared = 0 77 self._qmax_unsmeared = self.data.x[x_len] 78 79 #bin for smear data 80 self._first_unsmeared_bin = 0 81 self._last_unsmeared_bin = x_len 82 83 # Identify the bin range for the unsmeared and smeared spaces 84 self.idx = (self.data.x >= self.qmin) & (self.data.x <= self.qmax) 85 self.idx_unsmeared = (self.data.x >= self._qmin_unsmeared) \ 86 & (self.data.x <= self._qmax_unsmeared) 87 68 69 # Set qmin as the lowest non-zero value 70 self.qmin = Q_MINIMUM 71 for q_value in self.data.x: 72 if q_value>0: 73 self.qmin = q_value 74 break 75 self.qmax = max(self.data.x) 76 88 77 #get the smear object of data 89 78 self.smearer = smear_selection( self.data ) 79 # Set the q-range information to allow smearing 80 self.set_fit_range() 90 81 91 82 def set_fit_range(self ,qmin=None, qmax=None): … … 101 92 self._qmax_unsmeared = self.qmax 102 93 103 self._first_unsmeared_bin = 0 104 self._last_unsmeared_bin = len(self.data.x)-1 105 106 if self.smearer!=None: 94 if self.smearer is not None: 107 95 self._first_unsmeared_bin, self._last_unsmeared_bin = self.smearer.get_bin_range(self.qmin, self.qmax) 108 96 self._qmin_unsmeared = self.data.x[self._first_unsmeared_bin] … … 119 107 @param power = a fixed, otherwise None 120 108 """ 121 power = power122 109 fx = numpy.zeros(len(self.data.x)) 123 one = numpy.ones(len(self.data.x)) 124 125 #define dy^2 126 try: 127 sigma = self.data.dy[self.idx_unsmeared ] 128 except: 129 print "The dy data for Invariant calculation should be prepared before get to FitFunctor.fit()..." 130 sigma = one[self.idx_unsmeared ] 131 sigma2 = sigma * sigma 110 111 # Uncertainty 112 if type(self.data.y)==numpy.ndarray and len(self.data.y)==len(self.data.x): 113 sigma = self.data.y 114 else: 115 sigma = numpy.ones(len(self.data.x)) 132 116 133 117 # Compute theory data f(x) 134 fx = self.data.y[self.idx_unsmeared ]/sigma118 fx[self.idx_unsmeared] = self.data.y[self.idx_unsmeared]/sigma[self.idx_unsmeared] 135 119 ## Smear theory data 136 120 if self.smearer is not None: … … 139 123 ##power is given only for function = power_law 140 124 if power != None: 125 sigma2 = sigma * sigma 141 126 a = -(power) 142 b = (numpy.sum(fx /sigma) - a*numpy.sum(self.data.x[self.idx]/sigma2))/numpy.sum(numpy.ones(len(sigma2))/sigma2)127 b = (numpy.sum(fx[self.idx]/sigma[self.idx]) - a*numpy.sum(self.data.x[self.idx]/sigma2[self.idx]))/numpy.sum(numpy.ones(len(sigma2[self.idx]))/sigma2[self.idx]) 143 128 return a, b 144 129 else: 145 A = numpy.vstack([ self.data.x[self.idx]/sigma ,146 numpy.ones(len(self.data.x[self.idx]))/sigma ]).T130 A = numpy.vstack([ self.data.x[self.idx]/sigma[self.idx], 131 numpy.ones(len(self.data.x[self.idx]))/sigma[self.idx]]).T 147 132 148 a, b = numpy.linalg.lstsq(A, fx )[0]133 a, b = numpy.linalg.lstsq(A, fx[self.idx])[0] 149 134 return a, b 150 135 … … 165 150 Initialize variables 166 151 @param data: data must be of type DataLoader.Data1D 167 @param contrast: contrast value of type float168 @param pConst: Porod Constant of type float152 @param background: Background value. The data will be corrected before processing 153 @param scale: Scaling factor for I(q). The data will be corrected before processing 169 154 """ 170 155 # Background and scale should be private data member if the only way to … … 202 187 #Process only data that inherited from DataLoader.Data_info.Data1D 203 188 raise ValueError,"Data must be of type DataLoader.Data1D" 204 new_data = self._scale * data - self._background 205 try: 206 #All data should pass here. 207 new_data.dy = data.dy 208 new_data.dxl = data.dxl 209 new_data.dxw = data.dxw 210 except: 211 #in case... 212 new_data.dy = numpy.ones(len(data.x)) 213 new_data.dxl = numpy.zeros(len(data.x)) 214 new_data.dxw = numpy.zeros(len(data.x)) 189 190 new_data = (self._scale * data) - self._background 191 192 # Copy data that is not copied by the operations 193 #TODO: fix this in DataLoader 194 new_data.dxl = data.dxl 195 new_data.dxw = data.dxw 215 196 216 197 return new_data … … 410 391 note: if data doesn't contain dy assume dy= math.sqrt(data.y) 411 392 """ 412 if data is None:413 data = self.data414 415 393 if len(data.x) <= 1 or len(data.y) <= 1 or \ 416 394 len(self.data.x) != len(self.data.y): … … 548 526 qmin = self._data.x[0] 549 527 qmax = self._data.x[self._low_extrapolation_npts - 1] 550 try: 551 # fit the data with a model to get the appropriate parameters 552 a, b = self._fit(function=self._low_extrapolation_function, 553 qmin=qmin, 554 qmax=qmax, 555 power=self._low_extrapolation_power) 556 except: 557 #raise 558 return None 528 529 # Extrapolate the low-Q data 530 #TODO: this fit fails. Fix it. 531 a, b = self._fit(function=self._low_extrapolation_function, 532 qmin=qmin, 533 qmax=qmax, 534 power=self._low_extrapolation_power) 559 535 560 536 #q_start point -
Invariant/test/utest_use_cases.py
rb345c45 r46d50ca 96 96 def test_wrong_data(self): 97 97 """ test receiving Data1D not of type loader""" 98 # That just doesn;t make sense 99 100 wrong_data= Data1D() 101 invariant.InvariantCalculator(wrong_data) 102 103 try: 104 self.assertRaises(ValueError,invariant.InvariantCalculator(wrong_data)) 105 except ValueError, msg: 106 print "test pass "+ str(msg) 107 else: raise ValueError, "fail to raise exception when expected" 108 109 print "test" 110 self.assertRaises(ValueError,invariant.InvariantCalculator, wrong_data ) 98 99 100 self.assertRaises(ValueError,invariant.InvariantCalculator, Data1D()) 111 101 112 102 def test_use_case_1(self):
Note: See TracChangeset
for help on using the changeset viewer.