masster 0.4.17__tar.gz → 0.4.18__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.
Files changed (96) hide show
  1. {masster-0.4.17 → masster-0.4.18}/PKG-INFO +1 -1
  2. {masster-0.4.17 → masster-0.4.18}/pyproject.toml +1 -1
  3. {masster-0.4.17 → masster-0.4.18}/src/masster/_version.py +1 -1
  4. {masster-0.4.17 → masster-0.4.18}/src/masster/study/defaults/merge_def.py +10 -9
  5. {masster-0.4.17 → masster-0.4.18}/src/masster/study/merge.py +85 -17
  6. {masster-0.4.17 → masster-0.4.18}/src/masster/study/processing.py +0 -1
  7. {masster-0.4.17 → masster-0.4.18}/uv.lock +1 -1
  8. {masster-0.4.17 → masster-0.4.18}/.github/workflows/publish.yml +0 -0
  9. {masster-0.4.17 → masster-0.4.18}/.github/workflows/security.yml +0 -0
  10. {masster-0.4.17 → masster-0.4.18}/.github/workflows/test.yml +0 -0
  11. {masster-0.4.17 → masster-0.4.18}/.gitignore +0 -0
  12. {masster-0.4.17 → masster-0.4.18}/.pre-commit-config.yaml +0 -0
  13. {masster-0.4.17 → masster-0.4.18}/LICENSE +0 -0
  14. {masster-0.4.17 → masster-0.4.18}/Makefile +0 -0
  15. {masster-0.4.17 → masster-0.4.18}/README.md +0 -0
  16. {masster-0.4.17 → masster-0.4.18}/TESTING.md +0 -0
  17. {masster-0.4.17 → masster-0.4.18}/demo/example_batch_process.py +0 -0
  18. {masster-0.4.17 → masster-0.4.18}/demo/example_sample_process.py +0 -0
  19. {masster-0.4.17 → masster-0.4.18}/src/masster/__init__.py +0 -0
  20. {masster-0.4.17 → masster-0.4.18}/src/masster/chromatogram.py +0 -0
  21. {masster-0.4.17 → masster-0.4.18}/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
  22. {masster-0.4.17 → masster-0.4.18}/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
  23. {masster-0.4.17 → masster-0.4.18}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_MS1_C-MiLUT_C008_v6_r38_01.sample5 +0 -0
  24. {masster-0.4.17 → masster-0.4.18}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_MS1_C-MiLUT_C008_v7_r37_01.sample5 +0 -0
  25. {masster-0.4.17 → masster-0.4.18}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_MS1_C-MiLUT_C017_v5_r99_01.sample5 +0 -0
  26. {masster-0.4.17 → masster-0.4.18}/src/masster/data/libs/ccm.csv +0 -0
  27. {masster-0.4.17 → masster-0.4.18}/src/masster/data/libs/urine.csv +0 -0
  28. {masster-0.4.17 → masster-0.4.18}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.timeseries.data +0 -0
  29. {masster-0.4.17 → masster-0.4.18}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.wiff +0 -0
  30. {masster-0.4.17 → masster-0.4.18}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.wiff.scan +0 -0
  31. {masster-0.4.17 → masster-0.4.18}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.wiff2 +0 -0
  32. {masster-0.4.17 → masster-0.4.18}/src/masster/lib/__init__.py +0 -0
  33. {masster-0.4.17 → masster-0.4.18}/src/masster/lib/lib.py +0 -0
  34. {masster-0.4.17 → masster-0.4.18}/src/masster/logger.py +0 -0
  35. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/__init__.py +0 -0
  36. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/adducts.py +0 -0
  37. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/defaults/__init__.py +0 -0
  38. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/defaults/find_adducts_def.py +0 -0
  39. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/defaults/find_features_def.py +0 -0
  40. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/defaults/find_ms2_def.py +0 -0
  41. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/defaults/get_spectrum_def.py +0 -0
  42. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/defaults/sample_def.py +0 -0
  43. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/h5.py +0 -0
  44. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/helpers.py +0 -0
  45. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/lib.py +0 -0
  46. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/load.py +0 -0
  47. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/parameters.py +0 -0
  48. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/plot.py +0 -0
  49. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/processing.py +0 -0
  50. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/quant.py +0 -0
  51. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/sample.py +0 -0
  52. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/sample5_schema.json +0 -0
  53. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/save.py +0 -0
  54. {masster-0.4.17 → masster-0.4.18}/src/masster/sample/sciex.py +0 -0
  55. {masster-0.4.17 → masster-0.4.18}/src/masster/spectrum.py +0 -0
  56. {masster-0.4.17 → masster-0.4.18}/src/masster/study/__init__.py +0 -0
  57. {masster-0.4.17 → masster-0.4.18}/src/masster/study/defaults/__init__.py +0 -0
  58. {masster-0.4.17 → masster-0.4.18}/src/masster/study/defaults/align_def.py +0 -0
  59. {masster-0.4.17 → masster-0.4.18}/src/masster/study/defaults/export_def.py +0 -0
  60. {masster-0.4.17 → masster-0.4.18}/src/masster/study/defaults/fill_chrom_def.py +0 -0
  61. {masster-0.4.17 → masster-0.4.18}/src/masster/study/defaults/fill_def.py +0 -0
  62. {masster-0.4.17 → masster-0.4.18}/src/masster/study/defaults/find_consensus_def.py +0 -0
  63. {masster-0.4.17 → masster-0.4.18}/src/masster/study/defaults/find_ms2_def.py +0 -0
  64. {masster-0.4.17 → masster-0.4.18}/src/masster/study/defaults/identify_def.py +0 -0
  65. {masster-0.4.17 → masster-0.4.18}/src/masster/study/defaults/integrate_chrom_def.py +0 -0
  66. {masster-0.4.17 → masster-0.4.18}/src/masster/study/defaults/integrate_def.py +0 -0
  67. {masster-0.4.17 → masster-0.4.18}/src/masster/study/defaults/study_def.py +0 -0
  68. {masster-0.4.17 → masster-0.4.18}/src/masster/study/export.py +0 -0
  69. {masster-0.4.17 → masster-0.4.18}/src/masster/study/h5.py +0 -0
  70. {masster-0.4.17 → masster-0.4.18}/src/masster/study/helpers.py +0 -0
  71. {masster-0.4.17 → masster-0.4.18}/src/masster/study/id.py +0 -0
  72. {masster-0.4.17 → masster-0.4.18}/src/masster/study/load.py +0 -0
  73. {masster-0.4.17 → masster-0.4.18}/src/masster/study/parameters.py +0 -0
  74. {masster-0.4.17 → masster-0.4.18}/src/masster/study/plot.py +0 -0
  75. {masster-0.4.17 → masster-0.4.18}/src/masster/study/save.py +0 -0
  76. {masster-0.4.17 → masster-0.4.18}/src/masster/study/study.py +0 -0
  77. {masster-0.4.17 → masster-0.4.18}/src/masster/study/study5_schema.json +0 -0
  78. {masster-0.4.17 → masster-0.4.18}/src/masster/wizard/README.md +0 -0
  79. {masster-0.4.17 → masster-0.4.18}/src/masster/wizard/__init__.py +0 -0
  80. {masster-0.4.17 → masster-0.4.18}/src/masster/wizard/example.py +0 -0
  81. {masster-0.4.17 → masster-0.4.18}/src/masster/wizard/test_structure.py +0 -0
  82. {masster-0.4.17 → masster-0.4.18}/src/masster/wizard/test_wizard.py +0 -0
  83. {masster-0.4.17 → masster-0.4.18}/src/masster/wizard/wizard.py +0 -0
  84. {masster-0.4.17 → masster-0.4.18}/src/masster/wizard.py +0 -0
  85. {masster-0.4.17 → masster-0.4.18}/tests/conftest.py +0 -0
  86. {masster-0.4.17 → masster-0.4.18}/tests/test_chromatogram.py +0 -0
  87. {masster-0.4.17 → masster-0.4.18}/tests/test_defaults.py +0 -0
  88. {masster-0.4.17 → masster-0.4.18}/tests/test_imports.py +0 -0
  89. {masster-0.4.17 → masster-0.4.18}/tests/test_integration.py +0 -0
  90. {masster-0.4.17 → masster-0.4.18}/tests/test_logger.py +0 -0
  91. {masster-0.4.17 → masster-0.4.18}/tests/test_parameters.py +0 -0
  92. {masster-0.4.17 → masster-0.4.18}/tests/test_sample.py +0 -0
  93. {masster-0.4.17 → masster-0.4.18}/tests/test_spectrum.py +0 -0
  94. {masster-0.4.17 → masster-0.4.18}/tests/test_study.py +0 -0
  95. {masster-0.4.17 → masster-0.4.18}/tests/test_version.py +0 -0
  96. {masster-0.4.17 → masster-0.4.18}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: masster
3
- Version: 0.4.17
3
+ Version: 0.4.18
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
@@ -1,7 +1,7 @@
1
1
 
2
2
  [project]
3
3
  name = "masster"
4
- version = "0.4.17"
4
+ version = "0.4.18"
5
5
  description = "Mass spectrometry data analysis package"
6
6
  authors = [
7
7
  { name = "Zamboni Lab" }
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
 
4
- __version__ = "0.4.17"
4
+ __version__ = "0.4.18"
5
5
 
6
6
 
7
7
  def get_version():
@@ -25,25 +25,25 @@ class merge_defaults:
25
25
  link_ms2 (bool): Whether to link MS2 spectra to consensus features. Default is True.
26
26
  """
27
27
 
28
- method: str = "quality"
29
- min_samples: int = 10
28
+ method: str = "qt"
29
+ min_samples: int = 2
30
30
  rt_tol: float = 5.0
31
31
  mz_tol: float = 0.01
32
- chunk_size: int = 300
32
+ chunk_size: int = 500
33
33
  nr_partitions: int = 1000
34
- min_rel_cc_size: float = 0.2
34
+ min_rel_cc_size: float = 0.1
35
35
  max_pairwise_log_fc: float = -1.0
36
36
  max_nr_conflicts: int = 0
37
37
  link_ms2: bool = True
38
38
 
39
39
  # KD-Strict specific parameters
40
40
  optimize_rt_tol: bool = False
41
- rt_tol_range: tuple = (0.8, 2.0)
42
- rt_tol_steps: int = 5
43
- secondary_merge_rt_tol: float = 0.5
41
+ rt_tol_range: tuple = (0.5, 4.0)
42
+ rt_tol_steps: int = 7
43
+ secondary_merge_rt_tol: float = 1.0
44
44
  secondary_merge_mz_tol: float = 0.005
45
45
  min_sample_overlap: float = 0.8
46
- max_rt_spread: float = None # Will default to 2x rt_tol
46
+ max_rt_spread: float = 2.0 # Will default to 2x rt_tol
47
47
  min_coherence: float = 0.0
48
48
 
49
49
  _param_metadata: dict[str, dict[str, Any]] = field(
@@ -53,7 +53,8 @@ class merge_defaults:
53
53
  "description": "Merge method (algorithm) to use",
54
54
  "default": "quality",
55
55
  "allowed_values": ["sensitivity", "qt", "nowarp", "chunked", "quality",
56
- "kd", "kd-nowarp", "kd_nowarp", "kd-strict", "kd_strict"],
56
+ "kd", "kd-nowarp", "kd_nowarp", "kd-strict", "kd_strict",
57
+ "kd_chunked", "kd-chunked", "qt_chunked", "qt-chunked"],
57
58
  },
58
59
  "min_samples": {
59
60
  "dtype": int,
@@ -1,6 +1,6 @@
1
1
  """
2
2
  Unified merge module for the Study class.
3
- Supports multiple merge methods: 'kd', 'qt', 'kd-nowarp', 'chunked'
3
+ Supports multiple merge methods: 'kd', 'qt', 'kd-nowarp', 'kd_chunked', 'qt_chunked'
4
4
  """
5
5
 
6
6
  import time
@@ -25,7 +25,7 @@ def merge(self, **kwargs) -> None:
25
25
  **kwargs : dict
26
26
  Parameters from merge_defaults class:
27
27
  - method : str, default 'quality'
28
- Merge algorithm: 'sensitivity', 'qt', 'nowarp', 'chunked', 'quality'
28
+ Merge algorithm: 'sensitivity', 'qt', 'nowarp', 'kd_chunked', 'qt_chunked', 'quality'
29
29
  - min_samples : int, default 10
30
30
  Minimum number of samples for consensus feature
31
31
  - rt_tol : float, default 2.0
@@ -52,9 +52,11 @@ def merge(self, **kwargs) -> None:
52
52
  - Sensitivity: Best raw sensitivity, O(n log n), maximum feature detection
53
53
  - QT: Thorough but slow O(n²), good for <1000 samples
54
54
  - NoWarp: Memory efficient KD without RT warping for large datasets
55
- - Chunked: Memory-optimized KD algorithm for very large datasets (>5000 samples)
55
+ - KD-Chunked: Memory-optimized KD algorithm for very large datasets (>5000 samples)
56
56
  Uses optimized partitioning for better memory management while maintaining
57
57
  full cross-sample consensus feature detection.
58
+ - QT-Chunked: Memory-optimized QT algorithm for very large datasets (>5000 samples)
59
+ Uses QT clustering in first stage with optimized cross-chunk consensus building.
58
60
  """
59
61
  start_time = time.time()
60
62
 
@@ -76,7 +78,12 @@ def merge(self, **kwargs) -> None:
76
78
  'kd_nowarp': 'nowarp',
77
79
  'kd-strict': 'quality',
78
80
  'kd_strict': 'quality',
79
- 'kdstrict': 'quality'
81
+ 'kdstrict': 'quality',
82
+ 'chunked': 'kd_chunked', # Map old 'chunked' to 'kd_chunked'
83
+ 'qtchunked': 'qt_chunked', # QT chunked variants
84
+ 'qt-chunked': 'qt_chunked',
85
+ 'kdchunked': 'kd_chunked', # KD chunked variants
86
+ 'kd-chunked': 'kd_chunked'
80
87
  }
81
88
 
82
89
  if params.method in method_mapping:
@@ -85,8 +92,8 @@ def merge(self, **kwargs) -> None:
85
92
  self.logger.info(f"Method '{old_method}' is deprecated. Using '{params.method}' instead.")
86
93
 
87
94
  # Validate method
88
- if params.method not in ['sensitivity', 'qt', 'nowarp', 'chunked', 'quality']:
89
- raise ValueError(f"Invalid method '{params.method}'. Must be one of: ['sensitivity', 'qt', 'nowarp', 'chunked', 'quality']")
95
+ if params.method not in ['sensitivity', 'qt', 'nowarp', 'kd_chunked', 'qt_chunked', 'quality']:
96
+ raise ValueError(f"Invalid method '{params.method}'. Must be one of: ['sensitivity', 'qt', 'nowarp', 'kd_chunked', 'qt_chunked', 'quality']")
90
97
 
91
98
  # Persist last used params for diagnostics
92
99
  try:
@@ -147,9 +154,12 @@ def merge(self, **kwargs) -> None:
147
154
  elif params.method == 'quality':
148
155
  consensus_map = _merge_kd_strict(self, params)
149
156
  # Note: _merge_kd_strict handles both consensus_df and consensus_mapping_df directly
150
- elif params.method == 'chunked':
151
- consensus_map = _merge_chunked(self, params, cached_adducts_df, cached_valid_adducts)
152
- # Note: _merge_chunked populates consensus_df directly, no need to extract
157
+ elif params.method == 'kd_chunked':
158
+ consensus_map = _merge_kd_chunked(self, params, cached_adducts_df, cached_valid_adducts)
159
+ # Note: _merge_kd_chunked populates consensus_df directly, no need to extract
160
+ elif params.method == 'qt_chunked':
161
+ consensus_map = _merge_qt_chunked(self, params, cached_adducts_df, cached_valid_adducts)
162
+ # Note: _merge_qt_chunked populates consensus_df directly, no need to extract
153
163
 
154
164
  # Perform adduct grouping
155
165
  self._perform_adduct_grouping(params.rt_tol, params.mz_tol)
@@ -189,9 +199,9 @@ def _merge_kd(self, params: merge_defaults) -> oms.ConsensusMap:
189
199
  params_oms.setValue("warp:mz_tol", params.mz_tol)
190
200
  params_oms.setValue("link:rt_tol", params.rt_tol)
191
201
  params_oms.setValue("link:mz_tol", params.mz_tol)
192
- params_oms.setValue("link:min_rel_cc_size", params.min_rel_cc_size)
193
- params_oms.setValue("link:max_pairwise_log_fc", params.max_pairwise_log_fc)
194
- params_oms.setValue("link:max_nr_conflicts", params.max_nr_conflicts)
202
+ #params_oms.setValue("link:min_rel_cc_size", params.min_rel_cc_size)
203
+ #params_oms.setValue("link:max_pairwise_log_fc", params.max_pairwise_log_fc)
204
+ #params_oms.setValue("link:max_nr_conflicts", params.max_nr_conflicts)
195
205
  #params_oms.setValue("link:charge_merging", "With_charge_zero") THIS LEADS TO A CRASH
196
206
 
197
207
  grouper.setParameters(params_oms)
@@ -227,9 +237,9 @@ def _merge_qt(self, params: merge_defaults) -> oms.ConsensusMap:
227
237
  params_oms.setValue("distance_MZ:max_difference", params.mz_tol)
228
238
  params_oms.setValue("distance_MZ:unit", "Da") # QT now uses Da like all other methods
229
239
  params_oms.setValue("ignore_charge", "true")
230
- params_oms.setValue("min_rel_cc_size", params.min_rel_cc_size)
231
- params_oms.setValue("max_pairwise_log_fc", params.max_pairwise_log_fc)
232
- params_oms.setValue("max_nr_conflicts", params.max_nr_conflicts)
240
+ #params_oms.setValue("min_rel_cc_size", params.min_rel_cc_size)
241
+ #params_oms.setValue("max_pairwise_log_fc", params.max_pairwise_log_fc)
242
+ #params_oms.setValue("max_nr_conflicts", params.max_nr_conflicts)
233
243
  params_oms.setValue("nr_partitions", params.nr_partitions)
234
244
 
235
245
  grouper.setParameters(params_oms)
@@ -763,8 +773,8 @@ def _merge_kd_nowarp(self, params: merge_defaults) -> oms.ConsensusMap:
763
773
  return consensus_map
764
774
 
765
775
 
766
- def _merge_chunked(self, params: merge_defaults, cached_adducts_df=None, cached_valid_adducts=None) -> oms.ConsensusMap:
767
- """Chunked merge with proper cross-chunk consensus building"""
776
+ def _merge_kd_chunked(self, params: merge_defaults, cached_adducts_df=None, cached_valid_adducts=None) -> oms.ConsensusMap:
777
+ """KD-based chunked merge with proper cross-chunk consensus building"""
768
778
 
769
779
  n_samples = len(self.features_maps)
770
780
  if n_samples <= params.chunk_size:
@@ -826,6 +836,64 @@ def _merge_chunked(self, params: merge_defaults, cached_adducts_df=None, cached_
826
836
  return consensus_map
827
837
 
828
838
 
839
+ def _merge_qt_chunked(self, params: merge_defaults, cached_adducts_df=None, cached_valid_adducts=None) -> oms.ConsensusMap:
840
+ """QT-based chunked merge with proper cross-chunk consensus building"""
841
+
842
+ n_samples = len(self.features_maps)
843
+ if n_samples <= params.chunk_size:
844
+ self.logger.info(f"Dataset size ({n_samples}) ≤ chunk_size, using QT merge")
845
+ consensus_map = _merge_qt(self, params)
846
+ # Extract consensus features to populate consensus_df for chunked method consistency
847
+ self._extract_consensus_features(consensus_map, params.min_samples, cached_adducts_df, cached_valid_adducts)
848
+ return consensus_map
849
+
850
+ # Process in chunks
851
+ chunks = []
852
+ for i in range(0, n_samples, params.chunk_size):
853
+ chunk_end = min(i + params.chunk_size, n_samples)
854
+ chunks.append((i, self.features_maps[i:chunk_end]))
855
+
856
+ self.logger.debug(f"Processing {len(chunks)} chunks of max {params.chunk_size} samples")
857
+
858
+ # Process each chunk to create chunk consensus maps
859
+ chunk_consensus_maps = []
860
+
861
+ for chunk_idx, (chunk_start_idx, chunk_maps) in enumerate(tqdm(chunks, desc="Chunk", disable=self.log_level not in ["TRACE", "DEBUG", "INFO"])):
862
+ chunk_consensus_map = oms.ConsensusMap()
863
+
864
+ # Set up file descriptions for chunk
865
+ file_descriptions = chunk_consensus_map.getColumnHeaders()
866
+ for j, feature_map in enumerate(chunk_maps):
867
+ file_description = file_descriptions.get(j, oms.ColumnHeader())
868
+ file_description.filename = self.samples_df.row(chunk_start_idx + j, named=True)["sample_name"]
869
+ file_description.size = feature_map.size()
870
+ file_description.unique_id = feature_map.getUniqueId()
871
+ file_descriptions[j] = file_description
872
+
873
+ chunk_consensus_map.setColumnHeaders(file_descriptions)
874
+
875
+ # Use QT algorithm for chunk (main difference from KD chunked)
876
+ grouper = oms.FeatureGroupingAlgorithmQT()
877
+ chunk_params = grouper.getParameters()
878
+ chunk_params.setValue("distance_RT:max_difference", params.rt_tol)
879
+ chunk_params.setValue("distance_MZ:max_difference", params.mz_tol)
880
+ chunk_params.setValue("distance_MZ:unit", "Da")
881
+ chunk_params.setValue("ignore_charge", "true")
882
+ chunk_params.setValue("nr_partitions", params.nr_partitions)
883
+
884
+ grouper.setParameters(chunk_params)
885
+ grouper.group(chunk_maps, chunk_consensus_map)
886
+
887
+ chunk_consensus_maps.append((chunk_start_idx, chunk_consensus_map))
888
+
889
+ # Merge chunk results with proper cross-chunk consensus building
890
+ _merge_chunk_results(self, chunk_consensus_maps, params, cached_adducts_df, cached_valid_adducts)
891
+
892
+ # Create a dummy consensus map for compatibility (since other functions expect it)
893
+ consensus_map = oms.ConsensusMap()
894
+ return consensus_map
895
+
896
+
829
897
  def _merge_chunk_results(self, chunk_consensus_maps: list, params: merge_defaults, cached_adducts_df=None, cached_valid_adducts=None) -> None:
830
898
  """
831
899
  Scalable aggregation of chunk consensus maps into final consensus_df.
@@ -97,7 +97,6 @@ def align(self, **kwargs):
97
97
  _align_kd_algorithm(self, fmaps, params)
98
98
  else:
99
99
  self.logger.error(f"Unknown alignment algorithm '{algorithm}'")
100
- self.logger.error(f"Unknown alignment algorithm '{algorithm}'")
101
100
 
102
101
  # check if rt_original exists in features_df, if not, add it after rt
103
102
  if "rt_original" not in self.features_df.columns:
@@ -1374,7 +1374,7 @@ wheels = [
1374
1374
 
1375
1375
  [[package]]
1376
1376
  name = "masster"
1377
- version = "0.4.17"
1377
+ version = "0.4.18"
1378
1378
  source = { editable = "." }
1379
1379
  dependencies = [
1380
1380
  { name = "alpharaw" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes