@@ -481,6 +481,36 @@ def _two_theta_to_q(two_theta: np.ndarray, wavelength: float) -> np.ndarray:
481481 theta_radians = np .deg2rad (np .asarray (two_theta , dtype = float ) / 2.0 )
482482 return 4.0 * np .pi * np .sin (theta_radians ) / float (wavelength )
483483
484+ @staticmethod
485+ def _parse_xrd_alpha (xrd_alpha ) -> float :
486+ """Return a wavelength in Angstrom as float from various input types.
487+
488+ Accepts None, numeric, string, or pint Quantity with units.
489+ Falls back to DEFAULT_XRD_ALPHA_ANGSTROM on failure.
490+ """
491+ if xrd_alpha is None :
492+ return CaPNormalizer .DEFAULT_XRD_ALPHA_ANGSTROM
493+
494+ # Handle pint Quantity-like objects
495+ try :
496+ if hasattr (xrd_alpha , 'to' ) and hasattr (xrd_alpha , 'magnitude' ):
497+ try :
498+ q = xrd_alpha .to ('angstrom' )
499+ return float (q .magnitude )
500+ except Exception :
501+ return float (xrd_alpha .magnitude )
502+ except Exception :
503+ pass
504+
505+ # Fallback: try numeric conversion or parse leading numeric from string
506+ try :
507+ return float (xrd_alpha )
508+ except Exception :
509+ try :
510+ return float (str (xrd_alpha ).split ()[0 ])
511+ except Exception :
512+ return CaPNormalizer .DEFAULT_XRD_ALPHA_ANGSTROM
513+
484514 @staticmethod
485515 def _to_local_maxima (df_local : pd .DataFrame ) -> pd .DataFrame :
486516 """Return local maxima points for stick plotting."""
@@ -548,11 +578,7 @@ def normalize_xrd_data( # noqa: PLR0913
548578 reference_files = CaPNormalizer ._as_list (
549579 reference_files or reference_cif_files
550580 )
551- xrd_alpha_value = (
552- float (xrd_alpha )
553- if xrd_alpha is not None
554- else CaPNormalizer .DEFAULT_XRD_ALPHA_ANGSTROM
555- )
581+ xrd_alpha_value = CaPNormalizer ._parse_xrd_alpha (xrd_alpha )
556582
557583 try :
558584 measurement_df = CaPNormalizer ._read_xyd_df (archive , xrd_file )
0 commit comments