@@ -145,35 +145,23 @@ impl XASSpectrum {
145145 energy : T ,
146146 ) -> Result < & mut Self , XAFSError > {
147147 self . energy = Some ( energy. into ( ) ) ;
148-
149- let energy = self . energy . clone ( ) . ok_or_else ( || DataError :: MissingData {
148+ let energy = self . energy . as_ref ( ) . ok_or_else ( || DataError :: MissingData {
150149 field : "energy" . to_string ( ) ,
151150 } ) ?;
152- let mu = self
153- . raw_mu
154- . clone ( )
155- . ok_or_else ( || DataError :: MissingData {
156- field : "raw_mu" . to_string ( ) ,
157- } ) ?
158- . data
159- . as_vec ( )
160- . to_vec ( ) ;
161- let knot = self
162- . raw_energy
163- . clone ( )
164- . ok_or_else ( || DataError :: MissingData {
165- field : "raw_energy" . to_string ( ) ,
166- } ) ?
167- . data
168- . as_vec ( )
169- . to_vec ( ) ;
151+ let mu = self . raw_mu . as_ref ( ) . ok_or_else ( || DataError :: MissingData {
152+ field : "raw_mu" . to_string ( ) ,
153+ } ) ?;
154+ let knot = self . raw_energy . as_ref ( ) . ok_or_else ( || DataError :: MissingData {
155+ field : "raw_energy" . to_string ( ) ,
156+ } ) ?;
170157
171- self . mu = Some ( energy. interpolate ( & knot, & mu ) . map_err ( |e| {
158+ let interpolated = energy. interpolate ( knot. as_slice ( ) , mu . as_slice ( ) ) . map_err ( |e| {
172159 super :: errors:: MathError :: SplineEvalFailed {
173160 x : 0.0 ,
174161 reason : e. to_string ( ) ,
175162 }
176- } ) ?) ;
163+ } ) ?;
164+ self . mu = Some ( interpolated) ;
177165
178166 Ok ( self )
179167 }
@@ -649,6 +637,46 @@ pub mod tests {
649637 ) ) ;
650638 }
651639
640+ #[ test]
641+ fn test_interpolate_spectrum_updates_energy_and_mu ( ) {
642+ let mut spectrum = XASSpectrum :: new ( ) ;
643+ spectrum. set_spectrum ( vec ! [ 0.0 , 1.0 , 2.0 , 3.0 ] , vec ! [ 0.0 , 2.0 , 4.0 , 6.0 ] ) ;
644+
645+ spectrum
646+ . interpolate_spectrum ( vec ! [ 0.5 , 1.5 , 2.5 ] )
647+ . unwrap ( ) ;
648+
649+ assert_eq ! (
650+ spectrum. energy. as_ref( ) . unwrap( ) ,
651+ & DVector :: from_vec( vec![ 0.5 , 1.5 , 2.5 ] )
652+ ) ;
653+
654+ let mu = spectrum. mu . as_ref ( ) . unwrap ( ) ;
655+ assert_abs_diff_eq ! ( mu[ 0 ] , 1.0 , epsilon = TEST_TOL ) ;
656+ assert_abs_diff_eq ! ( mu[ 1 ] , 3.0 , epsilon = TEST_TOL ) ;
657+ assert_abs_diff_eq ! ( mu[ 2 ] , 5.0 , epsilon = TEST_TOL ) ;
658+ }
659+
660+ #[ test]
661+ fn test_interpolate_spectrum_missing_raw_mu_keeps_existing_mu ( ) {
662+ let mut spectrum = XASSpectrum :: new ( ) ;
663+ spectrum. raw_energy = Some ( DVector :: from_vec ( vec ! [ 0.0 , 1.0 ] ) ) ;
664+ spectrum. raw_mu = None ;
665+ spectrum. mu = Some ( DVector :: from_vec ( vec ! [ 42.0 ] ) ) ;
666+
667+ let err = spectrum. interpolate_spectrum ( vec ! [ 0.25 , 0.75 ] ) . unwrap_err ( ) ;
668+ assert ! ( matches!(
669+ err,
670+ XAFSError :: Data ( DataError :: MissingData { ref field } ) if field == "raw_mu"
671+ ) ) ;
672+
673+ assert_eq ! (
674+ spectrum. energy. as_ref( ) . unwrap( ) ,
675+ & DVector :: from_vec( vec![ 0.25 , 0.75 ] )
676+ ) ;
677+ assert_eq ! ( spectrum. mu. as_ref( ) . unwrap( ) , & DVector :: from_vec( vec![ 42.0 ] ) ) ;
678+ }
679+
652680 #[ test]
653681 #[ cfg( feature = "ndarray-compat" ) ]
654682 fn test_borrowed_k_chi_views_match_owned_getters ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
0 commit comments