masster 0.5.9__tar.gz → 0.5.11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of masster might be problematic. Click here for more details.
- {masster-0.5.9 → masster-0.5.11}/PKG-INFO +3 -1
- {masster-0.5.9 → masster-0.5.11}/pyproject.toml +3 -1
- {masster-0.5.9 → masster-0.5.11}/src/masster/_version.py +1 -1
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/adducts.py +2 -2
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/helpers.py +47 -15
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/plot.py +1209 -912
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/processing.py +1 -1
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/sample.py +91 -48
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/export.py +4 -6
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/h5.py +66 -15
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/helpers.py +24 -5
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/load.py +1 -164
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/merge.py +16 -18
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/plot.py +105 -35
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/processing.py +17 -14
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/study5_schema.json +3 -0
- {masster-0.5.9 → masster-0.5.11}/uv.lock +79 -16
- {masster-0.5.9 → masster-0.5.11}/.github/workflows/publish.yml +0 -0
- {masster-0.5.9 → masster-0.5.11}/.github/workflows/security.yml +0 -0
- {masster-0.5.9 → masster-0.5.11}/.github/workflows/test.yml +0 -0
- {masster-0.5.9 → masster-0.5.11}/.gitignore +0 -0
- {masster-0.5.9 → masster-0.5.11}/.pre-commit-config.yaml +0 -0
- {masster-0.5.9 → masster-0.5.11}/LICENSE +0 -0
- {masster-0.5.9 → masster-0.5.11}/Makefile +0 -0
- {masster-0.5.9 → masster-0.5.11}/README.md +0 -0
- {masster-0.5.9 → masster-0.5.11}/TESTING.md +0 -0
- {masster-0.5.9 → masster-0.5.11}/demo/example_batch_process.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/demo/example_sample_process.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/__init__.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/chromatogram.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_DDA_OT_C-MiLUT_QC_dil2_01_20250602151849.sample5 +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_DDA_OT_C-MiLUT_QC_dil3_01_20250602150634.sample5 +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_MS1_C-MiLUT_C008_v6_r38_01.sample5 +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_MS1_C-MiLUT_C008_v7_r37_01.sample5 +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_MS1_C-MiLUT_C017_v5_r99_01.sample5 +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/data/libs/aa.csv +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/data/libs/ccm.csv +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/data/libs/hilic.csv +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/data/libs/urine.csv +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.timeseries.data +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.wiff +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.wiff.scan +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.wiff2 +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/lib/__init__.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/lib/lib.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/logger.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/__init__.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/defaults/__init__.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/defaults/find_adducts_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/defaults/find_features_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/defaults/find_ms2_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/defaults/get_spectrum_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/defaults/sample_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/h5.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/lib.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/load.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/parameters.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/quant.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/sample5_schema.json +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/save.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/sample/sciex.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/spectrum.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/__init__.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/analysis.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/defaults/__init__.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/defaults/align_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/defaults/export_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/defaults/fill_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/defaults/find_consensus_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/defaults/find_ms2_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/defaults/identify_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/defaults/integrate_chrom_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/defaults/integrate_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/defaults/merge_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/defaults/study_def.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/id.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/parameters.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/save.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/study/study.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/wizard/README.md +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/wizard/__init__.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/wizard/example.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/src/masster/wizard/wizard.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/tests/conftest.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/tests/test_chromatogram.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/tests/test_defaults.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/tests/test_imports.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/tests/test_integration.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/tests/test_logger.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/tests/test_parameters.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/tests/test_sample.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/tests/test_spectrum.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/tests/test_study.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/tests/test_version.py +0 -0
- {masster-0.5.9 → masster-0.5.11}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: masster
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.11
|
|
4
4
|
Summary: Mass spectrometry data analysis package
|
|
5
5
|
Project-URL: homepage, https://github.com/zamboni-lab/masster
|
|
6
6
|
Project-URL: repository, https://github.com/zamboni-lab/masster
|
|
@@ -685,6 +685,7 @@ Requires-Dist: altair>=5.5.0
|
|
|
685
685
|
Requires-Dist: bokeh>=3.7.3
|
|
686
686
|
Requires-Dist: cmap>=0.6.2
|
|
687
687
|
Requires-Dist: datashader>=0.18.1
|
|
688
|
+
Requires-Dist: get-gecko-driver>=1.4
|
|
688
689
|
Requires-Dist: h5py>=3.14.0
|
|
689
690
|
Requires-Dist: hdbscan>=0.8.40
|
|
690
691
|
Requires-Dist: holoviews>=1.21.0
|
|
@@ -703,6 +704,7 @@ Requires-Dist: scikit-learn>=1.7.1
|
|
|
703
704
|
Requires-Dist: scipy>=1.12.0
|
|
704
705
|
Requires-Dist: tqdm>=4.65.0
|
|
705
706
|
Requires-Dist: umap-learn>=0.5.9.post2
|
|
707
|
+
Requires-Dist: webdriver-manager>=4.0.2
|
|
706
708
|
Provides-Extra: dev
|
|
707
709
|
Requires-Dist: bandit>=1.7.0; extra == 'dev'
|
|
708
710
|
Requires-Dist: black>=23.0.0; extra == 'dev'
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
[project]
|
|
3
3
|
name = "masster"
|
|
4
|
-
version = "0.5.
|
|
4
|
+
version = "0.5.11"
|
|
5
5
|
description = "Mass spectrometry data analysis package"
|
|
6
6
|
authors = [
|
|
7
7
|
{ name = "Zamboni Lab" }
|
|
@@ -49,6 +49,8 @@ dependencies = [
|
|
|
49
49
|
"scikit-learn>=1.7.1",
|
|
50
50
|
"umap-learn>=0.5.9.post2",
|
|
51
51
|
"hdbscan>=0.8.40",
|
|
52
|
+
"get-gecko-driver>=1.4",
|
|
53
|
+
"webdriver-manager>=4.0.2",
|
|
52
54
|
]
|
|
53
55
|
|
|
54
56
|
[project.optional-dependencies]
|
|
@@ -798,8 +798,8 @@ def find_adducts(self, **kwargs):
|
|
|
798
798
|
total_with_adducts = sum(1 for x in final_adducts if x is not None)
|
|
799
799
|
total_groups = max(final_groups) if final_groups else 0
|
|
800
800
|
|
|
801
|
-
self.logger.
|
|
802
|
-
f"Adduct detection completed: {total_with_adducts}
|
|
801
|
+
self.logger.success(
|
|
802
|
+
f"Adduct detection completed. Features with adducts: {total_with_adducts}. Adduct groups: {total_groups}.",
|
|
803
803
|
)
|
|
804
804
|
|
|
805
805
|
# Store parameters including the actual processed adducts list
|
|
@@ -360,6 +360,7 @@ def get_eic(self, mz, mz_tol=None):
|
|
|
360
360
|
|
|
361
361
|
def features_select(
|
|
362
362
|
self,
|
|
363
|
+
uid=None,
|
|
363
364
|
mz=None,
|
|
364
365
|
rt=None,
|
|
365
366
|
coherence=None,
|
|
@@ -369,15 +370,16 @@ def features_select(
|
|
|
369
370
|
iso_of=None,
|
|
370
371
|
has_MS2=None,
|
|
371
372
|
prominence_scaled=None,
|
|
372
|
-
height_scaled=None,
|
|
373
373
|
prominence=None,
|
|
374
|
+
height_scaled=None,
|
|
374
375
|
height=None,
|
|
375
|
-
|
|
376
|
+
adduct_group=None,
|
|
376
377
|
):
|
|
377
378
|
"""
|
|
378
379
|
Select features based on specified criteria and return the filtered DataFrame.
|
|
379
380
|
|
|
380
381
|
Parameters:
|
|
382
|
+
uid: feature UID filter (list of feature UIDs, tuple for range of feature UIDs, polars/pandas DataFrame with feature_uid/feature_id column, or None for all features)
|
|
381
383
|
mz: m/z range filter (tuple for range, single value for minimum)
|
|
382
384
|
rt: retention time range filter (tuple for range, single value for minimum)
|
|
383
385
|
coherence: chromatogram coherence filter (tuple for range, single value for minimum)
|
|
@@ -390,8 +392,7 @@ def features_select(
|
|
|
390
392
|
height_scaled: scaled height filter (tuple for range, single value for minimum)
|
|
391
393
|
prominence: prominence filter (tuple for range, single value for minimum)
|
|
392
394
|
height: height filter (tuple for range, single value for minimum)
|
|
393
|
-
|
|
394
|
-
|
|
395
|
+
adduct_group: adduct group filter (single value for exact match, list of values for multiple groups, tuple for range, or None for all)
|
|
395
396
|
Returns:
|
|
396
397
|
polars.DataFrame: Filtered features DataFrame
|
|
397
398
|
"""
|
|
@@ -402,17 +403,29 @@ def features_select(
|
|
|
402
403
|
feats = self.features_df.clone()
|
|
403
404
|
|
|
404
405
|
# Filter by feature UIDs if provided
|
|
405
|
-
if
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
406
|
+
if uid is not None:
|
|
407
|
+
if isinstance(uid, tuple) and len(uid) == 2:
|
|
408
|
+
# Handle tuple as range of feature UIDs
|
|
409
|
+
min_uid, max_uid = uid
|
|
410
|
+
feats_len_before_filter = len(feats)
|
|
411
|
+
feats = feats.filter(
|
|
412
|
+
(pl.col("feature_uid") >= min_uid) & (pl.col("feature_uid") <= max_uid)
|
|
413
|
+
)
|
|
414
|
+
self.logger.debug(
|
|
415
|
+
f"Selected features by UID range ({min_uid}-{max_uid}). Features removed: {feats_len_before_filter - len(feats)}",
|
|
416
|
+
)
|
|
417
|
+
else:
|
|
418
|
+
# Handle list or DataFrame input
|
|
419
|
+
feature_uids_to_keep = self._get_feature_uids(features=uid, verbose=True)
|
|
420
|
+
if not feature_uids_to_keep:
|
|
421
|
+
self.logger.warning("No valid feature UIDs provided.")
|
|
422
|
+
return feats.limit(0) # Return empty DataFrame with same structure
|
|
423
|
+
|
|
424
|
+
feats_len_before_filter = len(feats)
|
|
425
|
+
feats = feats.filter(pl.col("feature_uid").is_in(feature_uids_to_keep))
|
|
426
|
+
self.logger.debug(
|
|
427
|
+
f"Selected features by UIDs. Features removed: {feats_len_before_filter - len(feats)}",
|
|
428
|
+
)
|
|
416
429
|
|
|
417
430
|
if coherence is not None:
|
|
418
431
|
has_coherence = "chrom_coherence" in self.features_df.columns
|
|
@@ -579,6 +592,25 @@ def features_select(
|
|
|
579
592
|
self.logger.debug(
|
|
580
593
|
f"Selected features by {height_col}. Features removed: {feats_len_before_filter - len(feats)}",
|
|
581
594
|
)
|
|
595
|
+
|
|
596
|
+
if adduct_group is not None:
|
|
597
|
+
feats_len_before_filter = len(feats)
|
|
598
|
+
if "adduct_group" not in feats.columns:
|
|
599
|
+
self.logger.warning("No adduct_group data found in features.")
|
|
600
|
+
else:
|
|
601
|
+
if isinstance(adduct_group, tuple) and len(adduct_group) == 2:
|
|
602
|
+
min_adduct_group, max_adduct_group = adduct_group
|
|
603
|
+
feats = feats.filter(
|
|
604
|
+
(pl.col("adduct_group") >= min_adduct_group) & (pl.col("adduct_group") <= max_adduct_group)
|
|
605
|
+
)
|
|
606
|
+
elif isinstance(adduct_group, list):
|
|
607
|
+
feats = feats.filter(pl.col("adduct_group").is_in(adduct_group))
|
|
608
|
+
else:
|
|
609
|
+
feats = feats.filter(pl.col("adduct_group") == adduct_group)
|
|
610
|
+
self.logger.debug(
|
|
611
|
+
f"Selected features by adduct_group. Features removed: {feats_len_before_filter - len(feats)}",
|
|
612
|
+
)
|
|
613
|
+
|
|
582
614
|
if len(feats) == 0:
|
|
583
615
|
self.logger.warning("No features remaining after applying selection criteria.")
|
|
584
616
|
else:
|