masster 0.5.11__tar.gz → 0.5.12__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.

Files changed (95) hide show
  1. {masster-0.5.11 → masster-0.5.12}/PKG-INFO +1 -1
  2. {masster-0.5.11 → masster-0.5.12}/pyproject.toml +1 -1
  3. {masster-0.5.11 → masster-0.5.12}/src/masster/_version.py +1 -1
  4. {masster-0.5.11 → masster-0.5.12}/src/masster/study/h5.py +41 -2
  5. {masster-0.5.11 → masster-0.5.12}/src/masster/study/merge.py +4 -9
  6. {masster-0.5.11 → masster-0.5.12}/uv.lock +1 -1
  7. {masster-0.5.11 → masster-0.5.12}/.github/workflows/publish.yml +0 -0
  8. {masster-0.5.11 → masster-0.5.12}/.github/workflows/security.yml +0 -0
  9. {masster-0.5.11 → masster-0.5.12}/.github/workflows/test.yml +0 -0
  10. {masster-0.5.11 → masster-0.5.12}/.gitignore +0 -0
  11. {masster-0.5.11 → masster-0.5.12}/.pre-commit-config.yaml +0 -0
  12. {masster-0.5.11 → masster-0.5.12}/LICENSE +0 -0
  13. {masster-0.5.11 → masster-0.5.12}/Makefile +0 -0
  14. {masster-0.5.11 → masster-0.5.12}/README.md +0 -0
  15. {masster-0.5.11 → masster-0.5.12}/TESTING.md +0 -0
  16. {masster-0.5.11 → masster-0.5.12}/demo/example_batch_process.py +0 -0
  17. {masster-0.5.11 → masster-0.5.12}/demo/example_sample_process.py +0 -0
  18. {masster-0.5.11 → masster-0.5.12}/src/masster/__init__.py +0 -0
  19. {masster-0.5.11 → masster-0.5.12}/src/masster/chromatogram.py +0 -0
  20. {masster-0.5.11 → masster-0.5.12}/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
  21. {masster-0.5.11 → masster-0.5.12}/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
  22. {masster-0.5.11 → masster-0.5.12}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_MS1_C-MiLUT_C008_v6_r38_01.sample5 +0 -0
  23. {masster-0.5.11 → masster-0.5.12}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_MS1_C-MiLUT_C008_v7_r37_01.sample5 +0 -0
  24. {masster-0.5.11 → masster-0.5.12}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_MS1_C-MiLUT_C017_v5_r99_01.sample5 +0 -0
  25. {masster-0.5.11 → masster-0.5.12}/src/masster/data/libs/aa.csv +0 -0
  26. {masster-0.5.11 → masster-0.5.12}/src/masster/data/libs/ccm.csv +0 -0
  27. {masster-0.5.11 → masster-0.5.12}/src/masster/data/libs/hilic.csv +0 -0
  28. {masster-0.5.11 → masster-0.5.12}/src/masster/data/libs/urine.csv +0 -0
  29. {masster-0.5.11 → masster-0.5.12}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.timeseries.data +0 -0
  30. {masster-0.5.11 → masster-0.5.12}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.wiff +0 -0
  31. {masster-0.5.11 → masster-0.5.12}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.wiff.scan +0 -0
  32. {masster-0.5.11 → masster-0.5.12}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.wiff2 +0 -0
  33. {masster-0.5.11 → masster-0.5.12}/src/masster/lib/__init__.py +0 -0
  34. {masster-0.5.11 → masster-0.5.12}/src/masster/lib/lib.py +0 -0
  35. {masster-0.5.11 → masster-0.5.12}/src/masster/logger.py +0 -0
  36. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/__init__.py +0 -0
  37. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/adducts.py +0 -0
  38. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/defaults/__init__.py +0 -0
  39. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/defaults/find_adducts_def.py +0 -0
  40. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/defaults/find_features_def.py +0 -0
  41. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/defaults/find_ms2_def.py +0 -0
  42. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/defaults/get_spectrum_def.py +0 -0
  43. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/defaults/sample_def.py +0 -0
  44. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/h5.py +0 -0
  45. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/helpers.py +0 -0
  46. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/lib.py +0 -0
  47. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/load.py +0 -0
  48. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/parameters.py +0 -0
  49. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/plot.py +0 -0
  50. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/processing.py +0 -0
  51. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/quant.py +0 -0
  52. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/sample.py +0 -0
  53. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/sample5_schema.json +0 -0
  54. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/save.py +0 -0
  55. {masster-0.5.11 → masster-0.5.12}/src/masster/sample/sciex.py +0 -0
  56. {masster-0.5.11 → masster-0.5.12}/src/masster/spectrum.py +0 -0
  57. {masster-0.5.11 → masster-0.5.12}/src/masster/study/__init__.py +0 -0
  58. {masster-0.5.11 → masster-0.5.12}/src/masster/study/analysis.py +0 -0
  59. {masster-0.5.11 → masster-0.5.12}/src/masster/study/defaults/__init__.py +0 -0
  60. {masster-0.5.11 → masster-0.5.12}/src/masster/study/defaults/align_def.py +0 -0
  61. {masster-0.5.11 → masster-0.5.12}/src/masster/study/defaults/export_def.py +0 -0
  62. {masster-0.5.11 → masster-0.5.12}/src/masster/study/defaults/fill_def.py +0 -0
  63. {masster-0.5.11 → masster-0.5.12}/src/masster/study/defaults/find_consensus_def.py +0 -0
  64. {masster-0.5.11 → masster-0.5.12}/src/masster/study/defaults/find_ms2_def.py +0 -0
  65. {masster-0.5.11 → masster-0.5.12}/src/masster/study/defaults/identify_def.py +0 -0
  66. {masster-0.5.11 → masster-0.5.12}/src/masster/study/defaults/integrate_chrom_def.py +0 -0
  67. {masster-0.5.11 → masster-0.5.12}/src/masster/study/defaults/integrate_def.py +0 -0
  68. {masster-0.5.11 → masster-0.5.12}/src/masster/study/defaults/merge_def.py +0 -0
  69. {masster-0.5.11 → masster-0.5.12}/src/masster/study/defaults/study_def.py +0 -0
  70. {masster-0.5.11 → masster-0.5.12}/src/masster/study/export.py +0 -0
  71. {masster-0.5.11 → masster-0.5.12}/src/masster/study/helpers.py +0 -0
  72. {masster-0.5.11 → masster-0.5.12}/src/masster/study/id.py +0 -0
  73. {masster-0.5.11 → masster-0.5.12}/src/masster/study/load.py +0 -0
  74. {masster-0.5.11 → masster-0.5.12}/src/masster/study/parameters.py +0 -0
  75. {masster-0.5.11 → masster-0.5.12}/src/masster/study/plot.py +0 -0
  76. {masster-0.5.11 → masster-0.5.12}/src/masster/study/processing.py +0 -0
  77. {masster-0.5.11 → masster-0.5.12}/src/masster/study/save.py +0 -0
  78. {masster-0.5.11 → masster-0.5.12}/src/masster/study/study.py +0 -0
  79. {masster-0.5.11 → masster-0.5.12}/src/masster/study/study5_schema.json +0 -0
  80. {masster-0.5.11 → masster-0.5.12}/src/masster/wizard/README.md +0 -0
  81. {masster-0.5.11 → masster-0.5.12}/src/masster/wizard/__init__.py +0 -0
  82. {masster-0.5.11 → masster-0.5.12}/src/masster/wizard/example.py +0 -0
  83. {masster-0.5.11 → masster-0.5.12}/src/masster/wizard/wizard.py +0 -0
  84. {masster-0.5.11 → masster-0.5.12}/tests/conftest.py +0 -0
  85. {masster-0.5.11 → masster-0.5.12}/tests/test_chromatogram.py +0 -0
  86. {masster-0.5.11 → masster-0.5.12}/tests/test_defaults.py +0 -0
  87. {masster-0.5.11 → masster-0.5.12}/tests/test_imports.py +0 -0
  88. {masster-0.5.11 → masster-0.5.12}/tests/test_integration.py +0 -0
  89. {masster-0.5.11 → masster-0.5.12}/tests/test_logger.py +0 -0
  90. {masster-0.5.11 → masster-0.5.12}/tests/test_parameters.py +0 -0
  91. {masster-0.5.11 → masster-0.5.12}/tests/test_sample.py +0 -0
  92. {masster-0.5.11 → masster-0.5.12}/tests/test_spectrum.py +0 -0
  93. {masster-0.5.11 → masster-0.5.12}/tests/test_study.py +0 -0
  94. {masster-0.5.11 → masster-0.5.12}/tests/test_version.py +0 -0
  95. {masster-0.5.11 → masster-0.5.12}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: masster
3
- Version: 0.5.11
3
+ Version: 0.5.12
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.5.11"
4
+ version = "0.5.12"
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.5.11"
4
+ __version__ = "0.5.12"
5
5
 
6
6
 
7
7
  def get_version():
@@ -874,8 +874,47 @@ def _create_dataframe_with_objects(data: dict, object_columns: list) -> pl.DataF
874
874
 
875
875
  # Create DataFrame with regular columns first
876
876
  if regular_data:
877
- df = pl.DataFrame(regular_data)
878
- # print(f"DEBUG: Created DataFrame with regular columns, shape: {df.shape}")
877
+ # Final safety check: convert any remaining numpy object arrays to Python lists
878
+ # and handle numpy scalars within lists
879
+ safe_regular_data = {}
880
+ import numpy as np
881
+
882
+ def convert_numpy_scalars(value):
883
+ """Convert numpy scalars to Python native types recursively."""
884
+ if isinstance(value, np.generic):
885
+ return value.item() # Convert numpy scalar to Python scalar
886
+ elif isinstance(value, list):
887
+ return [convert_numpy_scalars(item) for item in value]
888
+ else:
889
+ return value
890
+
891
+ for k, v in regular_data.items():
892
+ if hasattr(v, 'dtype') and str(v.dtype) == 'object':
893
+ # Convert numpy object array to Python list
894
+ safe_regular_data[k] = [convert_numpy_scalars(item) for item in (v.tolist() if hasattr(v, 'tolist') else list(v))]
895
+ elif isinstance(v, list):
896
+ # Handle lists that might contain numpy scalars
897
+ safe_regular_data[k] = [convert_numpy_scalars(item) for item in v]
898
+ else:
899
+ safe_regular_data[k] = convert_numpy_scalars(v)
900
+
901
+ # Create DataFrame with proper error handling
902
+ try:
903
+ df = pl.DataFrame(safe_regular_data)
904
+ except Exception as e:
905
+ # If direct creation fails, try creating column by column to identify and handle problematic columns
906
+ df = pl.DataFrame()
907
+ for k, v in safe_regular_data.items():
908
+ try:
909
+ df = df.with_columns([pl.Series(k, v)])
910
+ except Exception:
911
+ # Skip problematic columns or convert them to string as a fallback
912
+ try:
913
+ df = df.with_columns([pl.Series(k, [str(item) for item in v])])
914
+ except Exception:
915
+ # Last resort: skip the column entirely
916
+ continue
917
+
879
918
  # Add Object columns one by one
880
919
  for col, values in object_data.items():
881
920
  # print(f"DEBUG: Adding object column '{col}', type: {type(values)}, length: {len(values) if values is not None else 'None'}")
@@ -2255,15 +2255,13 @@ def _perform_adduct_grouping(study, rt_tol, mz_tol):
2255
2255
  {
2256
2256
  "consensus_uid": row["consensus_uid"],
2257
2257
  "rt": row["rt"],
2258
- "mz": row["mz"], # Add missing mz field
2258
+ "mz": row["mz"],
2259
2259
  "adduct_mass_neutral_top": row.get("adduct_mass_neutral_top"),
2260
2260
  "adduct_top": row.get("adduct_top"),
2261
2261
  "inty_mean": row.get("inty_mean", 0),
2262
2262
  },
2263
2263
  )
2264
2264
 
2265
- # Use optimized adduct grouping
2266
- #study.logger.info(f"About to call adduct grouping for {len(consensus_data)} consensus features")
2267
2265
  adduct_group_list, adduct_of_list = __merge_adduct_grouping(
2268
2266
  study, consensus_data, rt_tol/3, mz_tol
2269
2267
  )
@@ -2718,8 +2716,6 @@ def __identify_adduct_by_mass_shift(study, rt_tol, cached_adducts_df=None):
2718
2716
  study.logger.debug("No consensus features for adduct identification by mass shift")
2719
2717
  return
2720
2718
 
2721
- study.logger.info(f"Identifying coeluting adducts by mass shifts in {len(study.consensus_df)} consensus features...")
2722
-
2723
2719
  # Get adducts DataFrame if not provided
2724
2720
  if cached_adducts_df is None or cached_adducts_df.is_empty():
2725
2721
  try:
@@ -3025,8 +3021,7 @@ def __identify_adduct_by_mass_shift(study, rt_tol, cached_adducts_df=None):
3025
3021
  pl.Series("adduct_mass_neutral_top", new_adduct_mass_neutral_top),
3026
3022
  pl.Series("adduct_mass_shift_top", new_adduct_mass_shift_top)
3027
3023
  ])
3028
-
3029
- study.logger.info(f"Updated adduct assignments for {updated_count} consensus features based on mass shifts")
3024
+ study.logger.success(f"Adduct information updated for {updated_count} consensus features.")
3030
3025
  else:
3031
3026
  study.logger.debug("No consensus features updated based on mass shift analysis")
3032
3027
 
@@ -3395,7 +3390,7 @@ def __merge_adduct_grouping(study, consensus_data, rt_tol, mz_tol):
3395
3390
  adduct_of_list = [0] * len(consensus_data)
3396
3391
  return adduct_group_list, adduct_of_list
3397
3392
 
3398
- study.logger.info(f"Built local intensity matrix: {len(intensity_matrix_pd)} features x {len(intensity_matrix_pd.columns)} samples")
3393
+ study.logger.debug(f"Built local intensity matrix: {len(intensity_matrix_pd)} features x {len(intensity_matrix_pd.columns)} samples")
3399
3394
 
3400
3395
  except Exception as e:
3401
3396
  study.logger.warning(f"Could not build local intensity matrix: {e}. Creating single-feature groups.")
@@ -3405,7 +3400,7 @@ def __merge_adduct_grouping(study, consensus_data, rt_tol, mz_tol):
3405
3400
 
3406
3401
  # Step 2: Get adduct pairs with likelihood information and build hash map for fast lookup
3407
3402
  adduct_pairs_with_likelihood = _get_adduct_deltas_with_likelihood(study)
3408
- study.logger.info(f"Using {len(adduct_pairs_with_likelihood)} adduct pairs with likelihood scoring")
3403
+ study.logger.debug(f"Using {len(adduct_pairs_with_likelihood)} adduct pairs with likelihood scoring")
3409
3404
 
3410
3405
  # Build hash map for O(1) mass shift lookup
3411
3406
  mass_shift_map = {} # rounded_delta -> [(likelihood, adduct1, adduct2), ...]
@@ -1420,7 +1420,7 @@ wheels = [
1420
1420
 
1421
1421
  [[package]]
1422
1422
  name = "masster"
1423
- version = "0.5.11"
1423
+ version = "0.5.12"
1424
1424
  source = { editable = "." }
1425
1425
  dependencies = [
1426
1426
  { 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