1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 """The R1 and R2 exponential relaxation curve fitting parameter functions."""
24
25
26 from numpy import array, float64, zeros
27 from re import search
28
29
31 """Assemble the exponential curve parameter vector (as a numpy array).
32
33 @keyword spin: The spin data container.
34 @type spin: SpinContainer instance
35 @keyword sim_index: The optional MC simulation index.
36 @type sim_index: int
37 @return: An array of the parameter values of the exponential model.
38 @rtype: numpy array
39 """
40
41
42 param_vector = []
43
44
45 for i in range(len(spin.params)):
46
47 if spin.params[i] == 'rx':
48 if sim_index != None:
49 param_vector.append(spin.rx_sim[sim_index])
50 elif spin.rx == None:
51 param_vector.append(None)
52 else:
53 param_vector.append(spin.rx)
54
55
56 elif spin.params[i] == 'i0':
57 if sim_index != None:
58 param_vector.append(spin.i0_sim[sim_index])
59 elif spin.i0 == None:
60 param_vector.append(None)
61 else:
62 param_vector.append(spin.i0)
63
64
65 elif spin.params[i] == 'iinf':
66 if sim_index != None:
67 param_vector.append(spin.iinf_sim[sim_index])
68 elif spin.iinf == None:
69 param_vector.append(None)
70 else:
71 param_vector.append(spin.iinf)
72
73
74 return array(param_vector, float64)
75
76
78 """Disassemble the parameter vector.
79
80 @keyword param_vector: The parameter vector.
81 @type param_vector: numpy array
82 @keyword spin: The spin data container.
83 @type spin: SpinContainer instance
84 @keyword sim_index: The optional MC simulation index.
85 @type sim_index: int
86 """
87
88
89 if sim_index != None:
90
91 if spin.model == 'exp':
92 spin.rx_sim[sim_index] = param_vector[0]
93 spin.i0_sim[sim_index] = param_vector[1]
94
95
96 elif spin.model == 'inv':
97 spin.rx_sim[sim_index] = param_vector[0]
98 spin.i0_sim[sim_index] = param_vector[1]
99 spin.iinf_sim[sim_index] = param_vector[2]
100
101
102 elif spin.model == 'sat':
103 spin.rx_sim[sim_index] = param_vector[0]
104 spin.iinf_sim[sim_index] = param_vector[1]
105
106
107 else:
108
109 if spin.model == 'exp':
110 spin.rx = param_vector[0]
111 spin.i0 = param_vector[1]
112
113
114 elif spin.model == 'inv':
115 spin.rx = param_vector[0]
116 spin.i0 = param_vector[1]
117 spin.iinf = param_vector[2]
118
119
120 elif spin.model == 'sat':
121 spin.rx = param_vector[0]
122 spin.iinf = param_vector[1]
123
124
126 """Set up the relaxation curve fitting linear constraint matrices A and b.
127
128 Standard notation
129 =================
130
131 The relaxation rate constraints are::
132
133 Rx >= 0
134
135 The intensity constraints are::
136
137 I0 >= 0
138 Iinf >= 0
139
140
141 Matrix notation
142 ===============
143
144 In the notation A.x >= b, where A is an matrix of coefficients, x is an array of parameter values, and b is a vector of scalars, these inequality constraints are::
145
146 | 1 0 0 | | Rx | | 0 |
147 | | | | | |
148 | 1 0 0 | . | I0 | >= | 0 |
149 | | | | | |
150 | 1 0 0 | | Iinf | | 0 |
151
152
153 @keyword spin: The spin data container.
154 @type spin: SpinContainer instance
155 @keyword scaling_matrix: The diagonal, square scaling matrix.
156 @type scaling_matrix: numpy diagonal matrix
157 """
158
159
160 A = []
161 b = []
162 n = len(spin.params)
163 zero_array = zeros(n, float64)
164 i = 0
165 j = 0
166
167
168 for k in range(len(spin.params)):
169
170 if spin.params[k] == 'rx':
171
172 A.append(zero_array * 0.0)
173 A[j][i] = 1.0
174 b.append(0.0)
175 j = j + 1
176
177
178 elif search('^i', spin.params[k]):
179
180 A.append(zero_array * 0.0)
181 A[j][i] = 1.0
182 b.append(0.0)
183 j = j + 1
184
185
186 i = i + 1
187
188
189 A = array(A, float64)
190 b = array(b, float64)
191
192 return A, b
193