1818from refnx ._lib import flatten
1919
2020
21+ def circular_distance (angle1 , angle2 , period = 360 ):
22+ """
23+ Calculates the circular distance between two angles.
24+ Units (rad or deg) do not matter as long as they are
25+ consistent.
26+
27+ Parameters
28+ ----------
29+ angle1 : float, np.ndarray
30+ First angle
31+ angle2 : float, np.ndarray
32+ Second angle
33+ period : float
34+ The period of the circular domain (e.g.,360 for full circle).
35+
36+ Returns:
37+ float or np.ndarray: The shortest circular distance between the angles.
38+ """
39+ diff = np .abs (angle1 - angle2 )
40+ return np .minimum (diff , period - diff )
41+
42+
2143class ObjectiveSE (BaseObjective ):
2244 """
2345 Objective function for using with curvefitters such as
@@ -178,9 +200,9 @@ def residuals(self, pvals=None):
178200
179201 wavelength , aoi , psi_d , delta_d = self .data .data
180202 wavelength_aoi = np .c_ [wavelength , aoi ]
181-
182203 psi , delta = self .model (wavelength_aoi )
183- return np .r_ [psi - psi_d , delta - delta_d ]
204+ delta_err = circular_distance (delta , delta_d , period = 360 )
205+ return np .r_ [psi - psi_d , delta_err ]
184206
185207 def chisqr (self , pvals = None ):
186208 """
@@ -369,16 +391,16 @@ def logl(self, pvals=None):
369391
370392 psi , delta = self .model (wavelength_aoi )
371393
372- model = np .r_ [psi , delta ]
373-
374394 logl = 0.0
375395
376396 # TODO investigate ellipsometry uncertainties
377397 # here just set it to unity
378398 y_err = 1
379399 if self .lnsigma is not None :
400+ _model = np .r_ [psi , delta ]
380401 var_y = (
381- y_err * y_err + np .exp (2 * float (self .lnsigma )) * model * model
402+ y_err * y_err
403+ + np .exp (2 * float (self .lnsigma )) * _model * _model
382404 )
383405 else :
384406 var_y = y_err ** 2
@@ -387,7 +409,8 @@ def logl(self, pvals=None):
387409 if self .weighted :
388410 logl += np .log (2 * np .pi * var_y )
389411
390- logl += (np .r_ [psi_d , delta_d ] - model ) ** 2 / var_y
412+ res = self .residuals (None )
413+ logl += (res ) ** 2 / var_y
391414
392415 # nans play havoc
393416 if np .isnan (logl ).any ():
0 commit comments