rm_lite.utils.fitting¶
Attributes¶
Classes¶
Results of a Gaussian FDF fit |
|
Results of a Stokes I fit |
|
Options for Stokes I model fitting, shared by the 1D and 3D tools |
|
Base class for protocol classes. |
Functions¶
|
Find the best AIC for a set of AICs using Occam's razor. |
|
Monte-Carlo model realisations over the fit covariance, shape |
|
|
|
|
|
|
|
Fit a Stokes I spectrum, or return None when it should not be fitted. |
|
|
|
|
|
|
|
|
|
|
|
Median model and 1-sigma (16th/84th-percentile) error via Monte-Carlo |
|
|
|
|
|
Frequency-averaged Stokes I SNR: mean(I) * sqrt(n) / rms(error). |
|
Module Contents¶
- class rm_lite.utils.fitting.FDFFitResult¶
Bases:
NamedTupleResults of a Gaussian FDF fit
- class rm_lite.utils.fitting.FitResult¶
Bases:
NamedTupleResults of a Stokes I fit
- pcov: numpy.typing.ArrayLike¶
Covariance matrix of the fit
- popt: numpy.typing.ArrayLike¶
Best fit parameters
- stokes_i_model_func: StokesIModel¶
Function of the best fit model
- class rm_lite.utils.fitting.StokesIFitOptions¶
Options for Stokes I model fitting, shared by the 1D and 3D tools
- fit_function: Literal['log', 'linear'] = 'log'¶
“log” fits a power law, “linear” a polynomial
- class rm_lite.utils.fitting.StokesIModel¶
Bases:
ProtocolBase class for protocol classes.
Protocol classes are defined as:
class Proto(Protocol): def meth(self) -> int: ...
Such classes are primarily used with static type checkers that recognize structural subtyping (static duck-typing).
For example:
class C: def meth(self) -> int: return 0 def func(x: Proto) -> int: return x.meth() func(C()) # Passes static type check
See PEP 544 for details. Protocol classes decorated with @typing.runtime_checkable act as simple-minded runtime protocols that check only the presence of given attributes, ignoring their type signatures. Protocol classes can be generic, they are defined as:
class GenProto[T](Protocol): def meth(self) -> T: ...
- rm_lite.utils.fitting.best_aic_func(aics: numpy.typing.NDArray[numpy.float64], n_param: numpy.typing.NDArray[numpy.integer[Any]]) tuple[float, int, int]¶
Find the best AIC for a set of AICs using Occam’s razor.
- rm_lite.utils.fitting.draw_model_samples(fit: FitResult, x_arr: numpy.typing.NDArray[numpy.float64], n_error_samples: int) numpy.typing.NDArray[numpy.float64]¶
Monte-Carlo model realisations over the fit covariance, shape (n_error_samples, len(x_arr)), evaluated at x_arr = freq / ref_freq.
- rm_lite.utils.fitting.dynamic_fit(freq_arr_hz: numpy.typing.NDArray[numpy.float64], ref_freq_hz: float, stokes_i_arr: numpy.typing.NDArray[numpy.float64], stokes_i_error_arr: numpy.typing.NDArray[numpy.float64], fit_order: int = 2, fit_function: Literal['log', 'linear'] = 'log') FitResult¶
- rm_lite.utils.fitting.fit_fdf(fdf_to_fit_arr: numpy.typing.NDArray[numpy.float64], phi_arr_radm2: numpy.typing.NDArray[numpy.float64], fwhm_fdf_radm2: float) FDFFitResult¶
- rm_lite.utils.fitting.fit_rmsf(rmsf_to_fit_arr: numpy.typing.NDArray[numpy.float64], phi_double_arr_radm2: numpy.typing.NDArray[numpy.float64], fwhm_rmsf_radm2: float) float¶
- rm_lite.utils.fitting.fit_stokes_i_model(freq_arr_hz: numpy.typing.NDArray[numpy.float64], ref_freq_hz: float, stokes_i_arr: numpy.typing.NDArray[numpy.float64], stokes_i_error_arr: numpy.typing.NDArray[numpy.float64], options: StokesIFitOptions) FitResult | None¶
Fit a Stokes I spectrum, or return None when it should not be fitted.
Masks non-finite channels first, then returns None if too few finite channels remain (< abs(options.fit_order) + 2) or, when options.snr_cut is given, the frequency-averaged SNR is below it – letting the caller impose a flat model for that spectrum. A fit that cannot converge does not raise: static_fit falls back to a flat (mean) model.
- rm_lite.utils.fitting.gaussian(x: numpy.typing.NDArray[numpy.float64], amplitude: float | complex, mean: float | numpy.typing.NDArray[numpy.float64], stddev: float | None = None, fwhm: float | None = None) numpy.typing.NDArray[numpy.float64]¶
- rm_lite.utils.fitting.gaussian_integrand(amplitude: float, stddev: float | None = None, fwhm: float | None = None) float¶
- rm_lite.utils.fitting.polynomial(order: int) StokesIModel¶
- rm_lite.utils.fitting.power_law(order: int) StokesIModel¶
- rm_lite.utils.fitting.sample_model_error(fit: FitResult, x_arr: numpy.typing.NDArray[numpy.float64], n_error_samples: int) tuple[numpy.typing.NDArray[numpy.float64], numpy.typing.NDArray[numpy.float64]]¶
Median model and 1-sigma (16th/84th-percentile) error via Monte-Carlo over the fit covariance, evaluated at x_arr = freq / ref_freq.
- rm_lite.utils.fitting.static_fit(freq_arr_hz: numpy.typing.NDArray[numpy.float64], ref_freq_hz: float, stokes_i_arr: numpy.typing.NDArray[numpy.float64], stokes_i_error_arr: numpy.typing.NDArray[numpy.float64], fit_order: int = 2, fit_function: Literal['log', 'linear'] = 'log') FitResult¶
- rm_lite.utils.fitting.stokes_i_snr(i_spec: numpy.typing.NDArray[numpy.float64], e_spec: numpy.typing.NDArray[numpy.float64]) float¶
Frequency-averaged Stokes I SNR: mean(I) * sqrt(n) / rms(error).
Averaging n channels beats the noise down by sqrt(n), hence the factor. Returns inf when there is no usable noise (all-zero or non-finite error), so an SNR cut becomes a no-op instead of rejecting everything.
- rm_lite.utils.fitting.unit_centred_gaussian(x: numpy.typing.NDArray[numpy.float64], stddev: float | None = None, fwhm: float | None = None) numpy.typing.NDArray[numpy.float64]¶
- rm_lite.utils.fitting.unit_gaussian(x: numpy.typing.NDArray[numpy.float64], mean: float, stddev: float | None = None, fwhm: float | None = None) numpy.typing.NDArray[numpy.float64]¶
- rm_lite.utils.fitting.GAUSSIAN_SIGMA_TO_FWHM¶