@@ -146,80 +146,35 @@ def get_cell_params(spg, hkls, two_thetas, wave_length=1.54184):
146146 cell_values .append ((a , b , c ))
147147 except np .linalg .LinAlgError :
148148 continue
149- # Generate all possible triplets
150- #n_hkls = len(hkls)
151- #from itertools import combinations
152- #triplet_indices = list(combinations(range(n_hkls), 3))
153- #
154- #if len(triplet_indices) == 0:
155- # return []
156- #
157- ## Convert to arrays for vectorized operations
158- #triplets = np.array(triplet_indices) # Shape: (n_triplets, 3)
159- #
160- ## Get all triplets of hkls and d-spacings
161- #hkls_triplets = hkls[triplets] # Shape: (n_triplets, 3, 3)
162- #d_triplets = d_spacings[triplets] # Shape: (n_triplets, 3)
163- #
164- ## Build coefficient matrices for all triplets
165- #A = np.zeros((len(triplets), 3, 3))
166- #A[:, :, 0] = hkls_triplets[:, :, 0]**2 # h²
167- #A[:, :, 1] = hkls_triplets[:, :, 1]**2 # k²
168- #A[:, :, 2] = hkls_triplets[:, :, 2]**2 # l²
169- #
170- #b = 1/d_triplets**2 # Shape: (n_triplets, 3)
171- #
172- #try:
173- # x = np.linalg.solve(A, b) # Shape: (n_triplets, 3)
174- # # Filter valid solutions
175- # valid = np.all(x > 0, axis=1)
176- # x_valid = x[valid]
177- #
178- # if len(x_valid) > 0:
179- # a_values = np.sqrt(1/x_valid[:, 0])
180- # b_values = np.sqrt(1/x_valid[:, 1])
181- # c_values = np.sqrt(1/x_valid[:, 2])
182- # cell_values = list(zip(a_values, b_values, c_values))
183- #except np.linalg.LinAlgError:
184- # pass
185149
186150 elif 3 <= spg <= 15 : # monoclinic, need a, b, c, beta
187151 # need four hkls to determine a, b, c, beta
188- len_solutions = len (hkls ) // 4
152+ N = 4
153+ len_solutions = len (hkls ) // N
189154 for i in range (len_solutions ):
190- (h1 , k1 , l1 ), (h2 , k2 , l2 ), (h3 , k3 , l3 ), (h4 , k4 , l4 ) = hkls [4 * i ], hkls [4 * i + 1 ], hkls [4 * i + 2 ], hkls [4 * i + 3 ]
191- theta1 = np .radians (two_thetas [4 * i ] / 2 )
192- theta2 = np .radians (two_thetas [4 * i + 1 ] / 2 )
193- theta3 = np .radians (two_thetas [4 * i + 2 ] / 2 )
194- theta4 = np .radians (two_thetas [4 * i + 3 ] / 2 )
195- d1 = wave_length / (2 * np .sin (theta1 ))
196- d2 = wave_length / (2 * np .sin (theta2 ))
197- d3 = wave_length / (2 * np .sin (theta3 ))
198- d4 = wave_length / (2 * np .sin (theta4 ))
155+ hkls_sub = hkls [N * i :N * i + N ]
156+ thetas_sub = np .radians (two_thetas [N * i :N * i + N ]/ 2 )
157+ d_sub = (1 / wave_length / (2 * np .sin (thetas_sub )))** 2
158+
199159 # Non-linear system; use numerical methods
200160 from scipy .optimize import minimize
201-
202161 def objective (params ):
203- a , b , c , beta_deg = params
204- beta = np .radians (beta_deg )
205- eqs = []
206- for (h , k , l ), d_obs in zip ([(h1 , k1 , l1 ), (h2 , k2 , l2 ), (h3 , k3 , l3 ), (h4 , k4 , l4 )],
207- [d1 , d2 , d3 , d4 ]):
208- sin_beta_sq = np .sin (beta )** 2
209- d_calc_inv_sq = (h ** 2 / (a ** 2 * sin_beta_sq )) + (k ** 2 / b ** 2 ) + \
210- (l ** 2 / (c ** 2 * sin_beta_sq )) - \
211- (2 * h * l * np .cos (beta ) / (a * c * sin_beta_sq ))
212- eqs .append ((1 / d_obs ** 2 - d_calc_inv_sq )** 2 )
213- return sum (eqs )
214- initial_guess = [2.0 , 2.0 , 2.0 , 90.0 ]
215- result = minimize (objective , initial_guess )#; print(result.x, result.fun)
216- if result .success :
162+ a , b , c , beta = params
163+ sin_beta2 = np .sin (beta )** 2
164+ cos_beta = np .cos (beta )
165+ h , k , l = hkls_sub [:, 0 ], hkls_sub [:, 1 ], hkls_sub [:, 2 ]
166+ d_inv_sq = (h ** 2 / (a ** 2 * sin_beta2 )) + (k ** 2 / b ** 2 ) + \
167+ (l ** 2 / (c ** 2 * sin_beta2 )) - \
168+ (2 * h * l * cos_beta / (a * c * sin_beta2 ))
169+ return np .sum ((d_sub - d_inv_sq )** 2 )
170+
171+ initial_guess = [2.0 , 2.0 , 2.0 , np .pi / 2 ]
172+ bounds = [(1.8 , 50 ), (1.8 , 50 ), (1.8 , 50 ), (np .pi / 4 , np .pi * 3 / 4 )]
173+ result = minimize (objective , initial_guess , bounds = bounds )
174+ if result .success and result .fun < 1e-5 :
217175 a , b , c , beta = result .x
218- if a > 50 or b > 50 or c > 50 or beta <= 45 or beta >= 135 :
219- continue
220- if a < 0 or b < 0 or c < 0 :
221- continue
222- cell_values .append ((a , b , c , beta ))
176+ cell_values .append ((a , b , c , np .degrees (beta )))
177+ #print(result.x, result.fun, hkls_sub, thetas_sub)
223178 else :
224179 msg = "Only cubic, tetragonal, hexagonal, and orthorhombic systems are supported."
225180 raise NotImplementedError (msg )
@@ -442,7 +397,6 @@ def get_cell_from_multi_hkls(spg, hkls, two_thetas, long_thetas=None, wave_lengt
442397 # Filter out None values
443398 valid_mask = expected_thetas != None
444399 valid_thetas = expected_thetas [valid_mask ]
445- valid_hkls = test_hkls [valid_mask ]
446400 # Now try to index all other peaks using this 'a'
447401
448402 if len (valid_thetas ) > 0 :
0 commit comments