Skip to content

Commit

Permalink
chore: add many minor changes
Browse files Browse the repository at this point in the history
  • Loading branch information
David Wallace committed Mar 10, 2024
1 parent 6b42cf8 commit 33f3f22
Show file tree
Hide file tree
Showing 20 changed files with 129 additions and 152 deletions.
40 changes: 29 additions & 11 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ sources = ["src"]

# testing
[tool.pytest.ini_options]
minversion = "6.0"
minversion = "7.0"
pythonpath = "src"
addopts = [
"--import-mode=importlib",
Expand All @@ -96,6 +96,34 @@ testpaths = [

[tool.coverage.run]
source = ["src"]
omit = [
"*/example_fixtures/*",
]

[tool.coverage.report]
# Regexes for lines to exclude from consideration
exclude_also = [
# Don't complain about missing debug-only code:
"def __repr__",
"if self\\.debug",

# Don't complain if tests don't hit defensive assertion code:
"raise AssertionError",
"raise NotImplementedError",

# Don't complain if non-runnable code isn't run:
"if 0:",
"if __name__ == .__main__.:",

# Don't complain about abstract methods, they aren't run:
"@(abc\\.)?abstractmethod",
]

ignore_errors = true

[tool.coverage.html]
directory = "coverage_html_report"


[tool.bumpversion]
current_version = "0.8.0"
Expand All @@ -117,16 +145,6 @@ filename= "README.md"
search = "The current version is v{current_version}"
replace = "The current version is v{new_version}"

# [[bumpversion.files]]
# filename= "src/raman_fitting/__init__.py"
# search = "__version__ = '{current_version}'"
# replace = "__version__ = '{new_version}'"

# [[bumpversion.files]]
# filename= "src/raman_fitting/_version.py"
# search = "version = '{current_version}'"
# replace = "version = '{new_version}'"

[[tool.bumpversion.files]]
filename= "pyproject.toml"
search = "current_version = '{current_version}'"
Expand Down
15 changes: 0 additions & 15 deletions src/raman_fitting/MANIFEST.in

This file was deleted.

43 changes: 12 additions & 31 deletions src/raman_fitting/delegating/main_delegator.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# pylint: disable=W0614,W0401,W0611,W0622,C0103,E0401,E0402
from dataclasses import dataclass, field
from typing import Dict, List, Sequence, Any
from typing import TypeAlias


from raman_fitting.config.path_settings import (
Expand All @@ -16,8 +15,6 @@
from raman_fitting.models.deconvolution.base_model import (
get_models_and_peaks_from_definitions,
)
from raman_fitting.models.spectrum import SpectrumData
from raman_fitting.models.fit_models import SpectrumFitModel
from raman_fitting.models.splitter import RegionNames
from raman_fitting.exports.exporter import ExportManager
from raman_fitting.imports.files.file_indexer import (
Expand All @@ -34,12 +31,11 @@
from raman_fitting.delegating.pre_processing import (
prepare_aggregated_spectrum_from_files,
)

from loguru import logger
from raman_fitting.types import LMFitModelCollection
from .run_fit_spectrum import run_fit_over_selected_models


LMFitModelCollection: TypeAlias = Dict[str, Dict[str, BaseLMFitModel]]
SpectrumFitModelCollection: TypeAlias = Dict[str, Dict[str, SpectrumFitModel]]
from loguru import logger


@dataclass
Expand All @@ -53,6 +49,7 @@ class MainDelegator:
"""

run_mode: RunModes
use_multiprocessing: bool = False
lmfit_models: LMFitModelCollection = field(
default_factory=get_models_and_peaks_from_definitions
)
Expand Down Expand Up @@ -142,6 +139,7 @@ def main_run(self):
logger.info("No fit models were selected.")

Check warning on line 139 in src/raman_fitting/delegating/main_delegator.py

View check run for this annotation

Codecov / codecov/patch

src/raman_fitting/delegating/main_delegator.py#L139

Added line #L139 was not covered by tests

results = {}

for group_name, grp in groupby_sample_group(selection):
results[group_name] = {}
for sample_id, sample_grp in groupby_sample_id(grp):
Expand All @@ -162,13 +160,17 @@ def main_run(self):
_error_msg = f"Handle multiple source files for a single position on a sample, {group_name} {sample_id}"
results[group_name][sample_id]["errors"] = _error_msg
logger.debug(_error_msg)
model_result = run_fit_over_selected_models(sgrp, self.selected_models)
model_result = run_fit_over_selected_models(
sgrp,
self.selected_models,
use_multiprocessing=self.use_multiprocessing,
)
results[group_name][sample_id]["fit_results"] = model_result
self.results = results


def run_fit_over_selected_models(
raman_files: List[RamanFileInfo], models: LMFitModelCollection
def get_results_over_selected_models(
raman_files: List[RamanFileInfo], models: LMFitModelCollection, fit_model_results
) -> Dict[RegionNames, AggregatedSampleSpectrumFitResult]:
results = {}
for region_name, region_grp in models.items():
Expand All @@ -177,12 +179,6 @@ def run_fit_over_selected_models(
)
if aggregated_spectrum is None:
continue
fit_model_results = {}
for model_name, model in region_grp.items():
spectrum_fit = run_sample_fit_with_model(
aggregated_spectrum.spectrum, model
)
fit_model_results[model_name] = spectrum_fit
fit_region_results = AggregatedSampleSpectrumFitResult(

Check warning on line 182 in src/raman_fitting/delegating/main_delegator.py

View check run for this annotation

Codecov / codecov/patch

src/raman_fitting/delegating/main_delegator.py#L180-L182

Added lines #L180 - L182 were not covered by tests
region_name=region_name,
aggregated_spectrum=aggregated_spectrum,
Expand All @@ -192,21 +188,6 @@ def run_fit_over_selected_models(
return results

Check warning on line 188 in src/raman_fitting/delegating/main_delegator.py

View check run for this annotation

Codecov / codecov/patch

src/raman_fitting/delegating/main_delegator.py#L187-L188

Added lines #L187 - L188 were not covered by tests


def run_sample_fit_with_model(
spectrum: SpectrumData, model: BaseLMFitModel
) -> SpectrumFitModel:
name = model.name
region = model.region_name.name
spec_fit = SpectrumFitModel(spectrum=spectrum, model=model, region=region)
# include optional https://lmfit.github.io/lmfit-py/model.html#saving-and-loading-modelresults
spec_fit.run_fit()
logger.debug(
f"Fit with model {name} on {region} success: {spec_fit.fit_result.success} in {spec_fit.elapsed_time:.2f}s."
)
# spec_fit.fit_result.plot(show_init=True)
return spec_fit


def make_examples():
# breakpoint()
_main_run = MainDelegator(

Check warning on line 193 in src/raman_fitting/delegating/main_delegator.py

View check run for this annotation

Codecov / codecov/patch

src/raman_fitting/delegating/main_delegator.py#L193

Added line #L193 was not covered by tests
Expand Down
27 changes: 1 addition & 26 deletions src/raman_fitting/imports/spectrum/datafile_parsers.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
from typing import List, Sequence
from typing import Sequence
from pathlib import Path

import numpy as np
import pandas as pd
from tablib import Dataset

from loguru import logger
Expand Down Expand Up @@ -84,27 +83,3 @@ def use_np_loadtxt(filepath, usecols=(0, 1), **kwargs) -> np.array:
logger.error(_msg)
raise ValueError(_msg) from exc
return array

Check warning on line 85 in src/raman_fitting/imports/spectrum/datafile_parsers.py

View check run for this annotation

Codecov / codecov/patch

src/raman_fitting/imports/spectrum/datafile_parsers.py#L72-L85

Added lines #L72 - L85 were not covered by tests


def cast_array_into_spectrum_frame(array, keys: List[str] = None) -> pd.DataFrame:
"""cast array into spectrum frame"""
if array.ndim != len(keys):
raise ValueError(
f"Array dimension {array.ndim} does not match the number of keys {len(keys)}"
)

try:
spectrum_data = pd.DataFrame(array, columns=keys)
return spectrum_data
except Exception as exc:
_msg = f"Can not create DataFrame from array object: {array}\n{exc}"
logger.error(_msg)
raise ValueError(_msg) from exc


def load_spectrum_from_txt(filepath, **kwargs) -> pd.DataFrame:
"""load spectrum from txt file"""
keys = kwargs.pop("keys")
array = use_np_loadtxt(filepath, **kwargs)
spectrum_data = cast_array_into_spectrum_frame(array, keys=keys)
return spectrum_data
16 changes: 10 additions & 6 deletions src/raman_fitting/imports/spectrumdata_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
}


def get_file_parser(filepath: Path) -> Callable[Path, Dataset]:
def get_file_parser(filepath: Path) -> Callable[[Path], Dataset]:
"Get callable file parser function."
suffix = filepath.suffix
parser = SPECTRUM_FILETYPE_PARSERS[suffix]["method"]
Expand All @@ -49,9 +49,9 @@ def get_file_parser(filepath: Path) -> Callable[Path, Dataset]:
@dataclass
class SpectrumReader:
"""
Reads a clean spectrum from a file Path or str
Reads a spectrum from a 'raw' data file Path or str
with columns "ramanshift" and "intensity".
with spectrum_data_keys "ramanshift" and "intensity".
Double checks the values
Sets a hash attribute afterwards
"""
Expand All @@ -65,14 +65,14 @@ class SpectrumReader:
spectrum_hash: str = field(default=None, repr=False)
spectrum_length: int = field(default=0, init=False)

def __post_init__(self, **kwargs):
def __post_init__(self):
super().__init__()

self.filepath = validate_filepath(self.filepath)
self.spectrum_length = 0

if self.filepath is None:
return
raise ValueError(f"File is not valid. {self.filepath}")
parser = get_file_parser(self.filepath)
parsed_spectrum = parser(self.filepath, self.spectrum_data_keys)
if parsed_spectrum is None:
Expand All @@ -86,7 +86,11 @@ def __post_init__(self, **kwargs):
logger.warning(
f"The values of {spectrum_key} of this spectrum are invalid. {validator}"
)
spec_init = {"label": self.label, "region_name": self.region_name}
spec_init = {
"label": self.label,
"region_name": self.region_name,
"source": self.filepath,
}
_parsed_spec_dict = {
k: parsed_spectrum[k] for k in spectrum_keys_expected_values.keys()
}
Expand Down
14 changes: 2 additions & 12 deletions src/raman_fitting/models/deconvolution/base_peak.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
parmeter_to_dict,
)
from raman_fitting.config.default_models import load_config_from_toml_files
from raman_fitting.utils.string_operations import prepare_text_from_param

ParamHintDict = Dict[str, Dict[str, Optional[float | bool | str]]]

Expand Down Expand Up @@ -197,19 +198,8 @@ def __str__(self):


def make_string_from_param_hints(param_hints: Parameters) -> str:
text = ""
param_center = param_hints.get("center", {})
if param_center:
center_txt = ""
center_val = param_center.value
center_min = param_center.min
if center_min != center_val:
center_txt += f"{center_min} < "
center_txt += f"{center_val}"
center_max = param_center.max
if center_max != center_val:
center_txt += f" > {center_max}"
text += f", center : {center_txt}"
text = prepare_text_from_param(param_center)
return text

Check warning on line 203 in src/raman_fitting/models/deconvolution/base_peak.py

View check run for this annotation

Codecov / codecov/patch

src/raman_fitting/models/deconvolution/base_peak.py#L201-L203

Added lines #L201 - L203 were not covered by tests


Expand Down
2 changes: 1 addition & 1 deletion src/raman_fitting/models/deconvolution/lmfit_parameter.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from logging import warn
import math
from enum import StrEnum
from typing import List, Optional, Dict
from warnings import warn

from lmfit import Parameter
from lmfit.models import GaussianModel, LorentzianModel, Model, VoigtModel
Expand Down
2 changes: 1 addition & 1 deletion src/raman_fitting/models/spectrum.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class SpectrumData(BaseModel):
intensity: pnd.Np1DArrayFp32 = Field(repr=False)
label: str
region_name: str | None = None
source: Sequence[str] | None = None
source: FilePath | Sequence[FilePath] | str | Sequence[str] | None = None

@model_validator(mode="after")
def validate_equal_length(self):
Expand Down
8 changes: 7 additions & 1 deletion src/raman_fitting/models/splitter.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ def process_spectrum(self) -> "SplitSpectrum":
self.spectrum.intensity,
spec_region_limits=self.region_limits,
label=self.spectrum.label,
source=self.spectrum.source,
)
self.spec_regions = spec_regions
return self
Expand Down Expand Up @@ -56,7 +57,11 @@ def get_default_spectrum_region_limits(


def split_spectrum_data_in_regions(
ramanshift: np.array, intensity: np.array, spec_region_limits=None, label=None
ramanshift: np.array,
intensity: np.array,
spec_region_limits=None,
label=None,
source=None,
) -> Dict[str, SpectrumData]:
"""
For splitting of spectra into the several SpectrumRegionLimits,
Expand All @@ -78,6 +83,7 @@ def split_spectrum_data_in_regions(
"intensity": intensity[ind],
"label": region_lbl,
"region_name": region_name,
"source": source,
}
spec_regions[region_lbl] = SpectrumData(**_data)
return spec_regions
17 changes: 3 additions & 14 deletions src/raman_fitting/processing/baseline_subtraction.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def subtract_baseline_per_region(spec: SpectrumData, split_spectrum: SplitSpectr


def subtract_baseline_from_split_spectrum(
split_spectrum: SplitSpectrum, label=None
split_spectrum: SplitSpectrum = None, label=None
) -> SplitSpectrum:
_bl_spec_regions = {}
_info = {}
Expand All @@ -53,7 +53,8 @@ def subtract_baseline_from_split_spectrum(
"ramanshift": spec.ramanshift,
"intensity": blcorr_int,
"label": new_label,
"regionn_name": region_name,
"region_name": region_name,
"source": spec.source,
}
)
_bl_spec_regions.update(**{region_name: spec})
Expand All @@ -62,15 +63,3 @@ def subtract_baseline_from_split_spectrum(
update={"spec_regions": _bl_spec_regions, "info": _info}
)
return bl_corrected_spectra


def subtract_baseline(
ramanshift: np.array, intensity: np.array, label: str = None
) -> SplitSpectrum:
"Subtract the a baseline of background intensity of a spectrum."
spectrum = SpectrumData(ramanshift=ramanshift, intensity=intensity, label=label)
split_spectrum = SplitSpectrum(spectrum=spectrum)
blcorrected_spectrum = subtract_baseline_from_split_spectrum(
split_spectrum, label=label
)
return blcorrected_spectrum
4 changes: 2 additions & 2 deletions src/raman_fitting/processing/despike.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class SpectrumDespiker(BaseModel):
moving_region_size: int = 1
ignore_lims: Tuple[int, int] = (20, 46)
info: Dict = Field(default_factory=dict)
despiked_spectrum: SpectrumData = Field(None)
processed_spectrum: SpectrumData = Field(None)

@model_validator(mode="after")
def process_spectrum(self) -> "SpectrumDespiker":
Expand All @@ -36,7 +36,7 @@ def process_spectrum(self) -> "SpectrumDespiker":
update={"intensity": despiked_intensity}, deep=True
)
SpectrumData.model_validate(despiked_spec, from_attributes=True)
self.despiked_spectrum = despiked_spec
self.processed_spectrum = despiked_spec
self.info.update(**result_info)
return self

Expand Down
Loading

0 comments on commit 33f3f22

Please sign in to comment.