masster 0.5.3__py3-none-any.whl → 0.5.4__py3-none-any.whl

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/_version.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
 
4
- __version__ = "0.5.4"
4
+ __version__ = "0.5.5"
5
5
 
6
6
 
7
7
  def get_version():
masster/sample/adducts.py CHANGED
@@ -473,7 +473,7 @@ def find_adducts(self, **kwargs):
473
473
  self.logger.debug(f"Min probability threshold: {min_probability}")
474
474
 
475
475
  # Generate comprehensive adduct specifications using the Sample method
476
- adducts_df = self._get_adducts(
476
+ adducts_df = _get_adducts(self,
477
477
  adducts_list=adducts_list,
478
478
  charge_min=charge_min,
479
479
  charge_max=charge_max,
masster/sample/h5.py CHANGED
@@ -62,8 +62,8 @@ def _save_sample5(
62
62
  return
63
63
 
64
64
  # synchronize feature_map if it exists
65
- if hasattr(self, "_feature_map") and self._feature_map is not None:
66
- self._features_sync()
65
+ #if hasattr(self, "_feature_map") and self._feature_map is not None:
66
+ # self._features_sync()
67
67
 
68
68
  # if no extension is given, add .sample5
69
69
  if not filename.endswith(".sample5"):
@@ -1057,15 +1057,15 @@ def _load_sample5(self, filename: str, map: bool = False):
1057
1057
  # Parameters are now loaded from metadata JSON (see above)
1058
1058
  # Lib and lib_match are no longer saved/loaded
1059
1059
 
1060
- if map:
1061
- featureXML = filename.replace(".sample5", ".featureXML")
1062
- if os.path.exists(featureXML):
1063
- self._load_featureXML(featureXML)
1064
- self._features_sync()
1065
- else:
1066
- self.logger.warning(
1067
- f"Feature XML file {featureXML} not found, skipping loading.",
1068
- )
1060
+ #if map:
1061
+ # featureXML = filename.replace(".sample5", ".featureXML")
1062
+ # if os.path.exists(featureXML):
1063
+ # self._load_featureXML(featureXML)
1064
+ # #self._features_sync()
1065
+ # else:
1066
+ # self.logger.warning(
1067
+ # f"Feature XML file {featureXML} not found, skipping loading.",
1068
+ # )
1069
1069
 
1070
1070
  # set self.file_path to *.sample5
1071
1071
  self.file_path = filename
masster/sample/helpers.py CHANGED
@@ -569,7 +569,7 @@ def select(
569
569
  self.logger.info(f"Selected features. Features remaining: {len(feats)}")
570
570
  return feats
571
571
 
572
-
572
+ '''
573
573
  def _features_sync(self):
574
574
  """
575
575
  Synchronizes the cached FeatureMap with features_df.
@@ -675,7 +675,7 @@ def _features_sync(self):
675
675
  self.logger.warning("PyOpenMS not available, cannot sync FeatureMap")
676
676
  except Exception as e:
677
677
  self.logger.error(f"Error during feature synchronization: {e}")
678
-
678
+ '''
679
679
 
680
680
  def features_delete(self, features: list | None = None):
681
681
  """
masster/sample/load.py CHANGED
@@ -46,6 +46,7 @@ import polars as pl
46
46
  from tqdm import tqdm
47
47
 
48
48
  from masster.chromatogram import Chromatogram
49
+ from .h5 import _load_sample5
49
50
  from masster.spectrum import Spectrum
50
51
 
51
52
  # Suppress pyOpenMS warnings globally
@@ -96,13 +97,13 @@ def load(
96
97
 
97
98
  # check if file is mzML
98
99
  if filename.lower().endswith(".mzml"):
99
- self._load_mzML(filename)
100
+ _load_mzML(self, filename)
100
101
  elif filename.lower().endswith(".wiff") or filename.lower().endswith(".wiff2"):
101
- self._load_wiff(filename)
102
+ _load_wiff(self, filename)
102
103
  elif filename.lower().endswith(".raw"):
103
- self._load_raw(filename)
104
+ _load_raw(self, filename)
104
105
  elif filename.lower().endswith(".sample5"):
105
- self._load_sample5(filename)
106
+ _load_sample5(self, filename)
106
107
  # elif filename.lower().endswith(".h5"):
107
108
  # self._load_h5(filename)
108
109
  else:
@@ -795,7 +795,7 @@ def find_features(self, **kwargs):
795
795
  )
796
796
 
797
797
  self.features_df = df
798
- self._features_sync()
798
+ #self._features_sync()
799
799
  self.logger.info(f"Feature detection completed. Total features: {len(df)}")
800
800
 
801
801
  # store params
masster/sample/sample.py CHANGED
@@ -48,9 +48,9 @@ from masster.sample.defaults.find_ms2_def import find_ms2_defaults
48
48
  from masster.sample.defaults.get_spectrum_def import get_spectrum_defaults
49
49
 
50
50
  # Sample-specific imports - keeping these private, only for internal use
51
- # from masster.sample.h5 import _load_sample5
51
+ from masster.sample.h5 import _load_sample5
52
52
  # from masster.sample.h5 import _load_sample5_study
53
- # from masster.sample.h5 import _save_sample5
53
+ from masster.sample.h5 import _save_sample5
54
54
  # from masster.sample.helpers import _delete_ms2
55
55
  from masster.sample.helpers import _estimate_memory_usage
56
56
  from masster.sample.helpers import _get_scan_uids
@@ -263,12 +263,16 @@ class Sample:
263
263
  _get_feature_map = _get_feature_map
264
264
 
265
265
  # Additional method assignments for all imported functions
266
- # Removed internal-only methods: _load_sample5, _load_sample5_study, _save_sample5, _delete_ms2, _features_sync
266
+ # Removed internal-only methods: _load_sample5_study, _delete_ms2, _features_sync
267
267
  _estimate_memory_usage = _estimate_memory_usage
268
268
  _get_scan_uids = _get_scan_uids
269
269
  _get_feature_uids = _get_feature_uids
270
270
  features_delete = features_delete
271
271
  features_filter = features_filter
272
+ _save_sample5 = _save_sample5
273
+ _load_sample5 = _load_sample5
274
+
275
+
272
276
  # Removed internal-only load methods: _load_featureXML, _load_ms2data, _load_mzML, _load_raw, _load_wiff
273
277
  chrom_extract = chrom_extract
274
278
  _index_file = _index_file # Renamed from index_file to be internal-only
masster/study/h5.py CHANGED
@@ -304,6 +304,30 @@ def _save_object_columns_optimized(group, df, object_cols, logger, chunk_size):
304
304
  serialized_chunk.append(item.to_json())
305
305
  else:
306
306
  serialized_chunk.append("None")
307
+ elif col_name == "iso":
308
+ # Handle isotope patterns (numpy arrays with [mz, intensity] data)
309
+ for item in chunk_data:
310
+ if item is not None:
311
+ try:
312
+ # Convert numpy array to nested list for JSON serialization
313
+ serialized_chunk.append(json.dumps(item.tolist()))
314
+ except (AttributeError, TypeError):
315
+ # Fallback for non-numpy data
316
+ serialized_chunk.append(json.dumps(list(item) if hasattr(item, '__iter__') else []))
317
+ else:
318
+ serialized_chunk.append("None")
319
+ elif col_name == "ms1_spec":
320
+ # Handle MS1 spectra patterns (numpy arrays with [mz, intensity] data)
321
+ for item in chunk_data:
322
+ if item is not None:
323
+ try:
324
+ # Convert numpy array to nested list for JSON serialization
325
+ serialized_chunk.append(json.dumps(item.tolist()))
326
+ except (AttributeError, TypeError):
327
+ # Fallback for non-numpy data
328
+ serialized_chunk.append(json.dumps(list(item) if hasattr(item, '__iter__') else []))
329
+ else:
330
+ serialized_chunk.append("None")
307
331
  else:
308
332
  logger.warning(
309
333
  f"Unknown object column '{col_name}', using default serialization",
@@ -564,6 +588,34 @@ def _save_dataframe_column_legacy(
564
588
  else:
565
589
  data_as_str.append("None")
566
590
  group.create_dataset(col, data=data_as_str, compression=compression)
591
+ elif col == "iso":
592
+ # Handle isotope patterns (numpy arrays with [mz, intensity] data)
593
+ data_as_json_strings = []
594
+ for item in data:
595
+ if item is not None:
596
+ try:
597
+ # Convert numpy array to nested list for JSON serialization
598
+ data_as_json_strings.append(json.dumps(item.tolist()))
599
+ except (AttributeError, TypeError):
600
+ # Fallback for non-numpy data
601
+ data_as_json_strings.append(json.dumps(list(item) if hasattr(item, '__iter__') else []))
602
+ else:
603
+ data_as_json_strings.append("None")
604
+ group.create_dataset(col, data=data_as_json_strings, **optimal_compression)
605
+ elif col == "ms1_spec":
606
+ # Handle MS1 spectra patterns (numpy arrays with [mz, intensity] data)
607
+ data_as_json_strings = []
608
+ for item in data:
609
+ if item is not None:
610
+ try:
611
+ # Convert numpy array to nested list for JSON serialization
612
+ data_as_json_strings.append(json.dumps(item.tolist()))
613
+ except (AttributeError, TypeError):
614
+ # Fallback for non-numpy data
615
+ data_as_json_strings.append(json.dumps(list(item) if hasattr(item, '__iter__') else []))
616
+ else:
617
+ data_as_json_strings.append("None")
618
+ group.create_dataset(col, data=data_as_json_strings, **optimal_compression)
567
619
  else:
568
620
  logger.warning(
569
621
  f"Unexpectedly, column '{col}' has dtype '{dtype}'. Implement serialization for this column.",
@@ -666,6 +718,24 @@ def _reconstruct_object_column(data_col, col_name: str):
666
718
  },
667
719
  )
668
720
  reconstructed_data.append(converted_adducts)
721
+ elif col_name == "iso":
722
+ # Handle isotope patterns (numpy arrays with [mz, intensity] data)
723
+ try:
724
+ import numpy as np
725
+ iso_data = json.loads(item)
726
+ # Convert back to numpy array
727
+ reconstructed_data.append(np.array(iso_data) if iso_data else None)
728
+ except (json.JSONDecodeError, ValueError, ImportError):
729
+ reconstructed_data.append(None)
730
+ elif col_name == "ms1_spec":
731
+ # Handle MS1 spectra patterns (numpy arrays with [mz, intensity] data)
732
+ try:
733
+ import numpy as np
734
+ ms1_spec_data = json.loads(item)
735
+ # Convert back to numpy array
736
+ reconstructed_data.append(np.array(ms1_spec_data) if ms1_spec_data else None)
737
+ except (json.JSONDecodeError, ValueError, ImportError):
738
+ reconstructed_data.append(None)
669
739
  else:
670
740
  # Unknown object column
671
741
  reconstructed_data.append(None)
masster/study/plot.py CHANGED
@@ -603,7 +603,7 @@ def plot_consensus_2d(
603
603
  pl.when(
604
604
  (pl.col(sizeby).is_not_null()) & (pl.col(sizeby).is_finite()) & (pl.col(sizeby) > 0),
605
605
  )
606
- .then((pl.col(sizeby).log10() * markersize / 12).pow(2))
606
+ .then((pl.col(sizeby).log10() * markersize / 12).pow(1.5))
607
607
  .otherwise(markersize)
608
608
  .alias("markersize"),
609
609
  ])
@@ -1421,46 +1421,60 @@ def plot_rt_correction(
1421
1421
  p.xaxis.axis_label = f"Retention Time ({rt_unit})"
1422
1422
  p.yaxis.axis_label = "RT - RT_original (s)"
1423
1423
 
1424
- samples_info = None
1424
+ # Create sample name lookup dictionary from samples_df (all in Polars)
1425
+ sample_names_dict = {}
1425
1426
  if hasattr(self, "samples_df") and self.samples_df is not None:
1426
1427
  try:
1427
- samples_info = self.samples_df.to_pandas()
1428
+ sample_name_mapping = (
1429
+ self.samples_df
1430
+ .filter(pl.col("sample_uid").is_in(sample_uids))
1431
+ .select(["sample_uid", "sample_name"])
1432
+ )
1433
+ sample_names_dict = dict(zip(
1434
+ sample_name_mapping["sample_uid"].to_list(),
1435
+ sample_name_mapping["sample_name"].to_list()
1436
+ ))
1428
1437
  except Exception:
1429
- samples_info = None
1438
+ pass
1430
1439
 
1431
1440
  renderers = []
1432
1441
 
1433
- # Iterate samples and build curves
1434
- for uid in sample_uids:
1435
- # Select features belonging to this sample
1436
- try:
1437
- if "sample_uid" in self.features_df.columns:
1438
- sample_feats = self.features_df.filter(pl.col("sample_uid") == uid)
1439
- elif "sample_name" in self.features_df.columns:
1440
- sample_feats = self.features_df.filter(pl.col("sample_name") == uid)
1441
- else:
1442
- self.logger.debug("No sample identifier column in features_df; skipping sample filtering")
1443
- continue
1444
- except Exception as e:
1445
- self.logger.debug(f"Error filtering features for sample {uid}: {e}")
1446
- continue
1442
+ # Check sample identifier column
1443
+ if "sample_uid" not in self.features_df.columns:
1444
+ if "sample_name" in self.features_df.columns:
1445
+ sample_id_col = "sample_name"
1446
+ else:
1447
+ self.logger.debug("No sample identifier column in features_df")
1448
+ return
1449
+ else:
1450
+ sample_id_col = "sample_uid"
1447
1451
 
1448
- if sample_feats.is_empty():
1449
- continue
1452
+ # OPTIMIZED: Filter once, group once instead of per-sample filtering
1453
+ try:
1454
+ # Filter all data once for selected samples and required conditions
1455
+ all_sample_feats = self.features_df.filter(
1456
+ pl.col(sample_id_col).is_in(sample_uids)
1457
+ )
1458
+
1459
+ if all_sample_feats.is_empty():
1460
+ self.logger.warning("No features found for the selected samples.")
1461
+ return
1450
1462
 
1451
- # Filter to only use features with filled==False
1452
- if "filled" in sample_feats.columns:
1453
- sample_feats = sample_feats.filter(~pl.col("filled"))
1454
- if sample_feats.is_empty():
1455
- continue
1463
+ # Filter to only use features with filled==False if column exists
1464
+ if "filled" in all_sample_feats.columns:
1465
+ all_sample_feats = all_sample_feats.filter(~pl.col("filled"))
1466
+ if all_sample_feats.is_empty():
1467
+ self.logger.warning("No non-filled features found for the selected samples.")
1468
+ return
1456
1469
 
1457
- # Stay in Polars - much faster than pandas conversion!
1458
- if "rt" not in sample_feats.columns or "rt_original" not in sample_feats.columns:
1459
- continue
1470
+ # Check required columns
1471
+ if "rt" not in all_sample_feats.columns or "rt_original" not in all_sample_feats.columns:
1472
+ self.logger.error("Required columns 'rt' or 'rt_original' not found in features_df.")
1473
+ return
1460
1474
 
1461
- # Filter nulls and add delta column in Polars
1462
- sample_feats = (
1463
- sample_feats
1475
+ # Filter nulls, add delta column, and sort - all in one operation
1476
+ all_sample_feats = (
1477
+ all_sample_feats
1464
1478
  .filter(
1465
1479
  pl.col("rt").is_not_null() &
1466
1480
  pl.col("rt_original").is_not_null()
@@ -1468,33 +1482,36 @@ def plot_rt_correction(
1468
1482
  .with_columns([
1469
1483
  (pl.col("rt") - pl.col("rt_original")).alias("delta")
1470
1484
  ])
1471
- .sort("rt")
1485
+ .sort([sample_id_col, "rt"])
1472
1486
  )
1473
1487
 
1474
- if sample_feats.is_empty():
1475
- continue
1488
+ if all_sample_feats.is_empty():
1489
+ self.logger.warning("No valid RT data found for the selected samples.")
1490
+ return
1476
1491
 
1477
- # Extract arrays directly from Polars
1478
- rt = sample_feats["rt"].to_numpy()
1479
- delta = sample_feats["delta"].to_numpy()
1492
+ # Group by sample and process each group (much faster than individual filtering)
1493
+ for (sample_uid,), sample_group in all_sample_feats.group_by(sample_id_col):
1494
+ if sample_group.is_empty():
1495
+ continue
1480
1496
 
1481
- sample_name = str(uid)
1482
- if samples_info is not None:
1483
- try:
1484
- row = samples_info[samples_info["sample_uid"] == uid]
1485
- if not row.empty:
1486
- sample_name = row.iloc[0].get("sample_name", sample_name)
1487
- except Exception:
1488
- pass
1497
+ # Extract arrays directly from Polars
1498
+ rt = sample_group["rt"].to_numpy()
1499
+ delta = sample_group["delta"].to_numpy()
1489
1500
 
1490
- color = color_map.get(uid, "#000000")
1501
+ # Get sample name efficiently from pre-built dictionary
1502
+ sample_name = sample_names_dict.get(sample_uid, str(sample_uid))
1503
+ color = color_map.get(sample_uid, "#000000")
1491
1504
 
1492
- data = {"rt": rt, "delta": delta, "sample": [sample_name] * len(rt), "sample_color": [color] * len(rt)}
1493
- src = ColumnDataSource(data)
1505
+ data = {"rt": rt, "delta": delta, "sample": [sample_name] * len(rt), "sample_color": [color] * len(rt)}
1506
+ src = ColumnDataSource(data)
1494
1507
 
1495
- r_line = p.line("rt", "delta", source=src, line_width=1, color=color)
1496
- p.scatter("rt", "delta", source=src, size=2, color=color, alpha=0.6)
1497
- renderers.append(r_line)
1508
+ r_line = p.line("rt", "delta", source=src, line_width=1, color=color)
1509
+ p.scatter("rt", "delta", source=src, size=2, color=color, alpha=0.6)
1510
+ renderers.append(r_line)
1511
+
1512
+ except Exception as e:
1513
+ self.logger.error(f"Error in optimized RT correction plotting: {e}")
1514
+ return
1498
1515
 
1499
1516
  if not renderers:
1500
1517
  self.logger.warning("No RT correction curves to plot for the selected samples.")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: masster
3
- Version: 0.5.3
3
+ Version: 0.5.4
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,5 +1,5 @@
1
1
  masster/__init__.py,sha256=ueZ224WPNRRjQEYTaQUol818nwQgJwB93HbEfmtPRmg,1041
2
- masster/_version.py,sha256=ugCZC9n8XchZWXe4FUzXQCUPt7xKbTwRFRBFdsN0tkI,256
2
+ masster/_version.py,sha256=gwA0FHD4Z-_YF_DHvv1fia5KlwKC04Tq47mBa_FkOEo,256
3
3
  masster/chromatogram.py,sha256=iYpdv8C17zVnlWvOFgAn9ns2uFGiF-GgoYf5QVVAbHs,19319
4
4
  masster/logger.py,sha256=tR65N23zfrNpcZNbZm2ot_Aual9XrGB1MWjLrovZkMs,16749
5
5
  masster/spectrum.py,sha256=XJSUrqXZSzfpWnD8v5IMClXMRZLKLYIk014qaMOS9_k,49738
@@ -18,16 +18,16 @@ masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecR
18
18
  masster/lib/__init__.py,sha256=TcePNx3SYZHz6763TL9Sg4gUNXaRWjlrOtyS6vsu-hg,178
19
19
  masster/lib/lib.py,sha256=SSN06UtiM-hIdjS3eCiIHsJ_8S4YHRGOLGmdPIh-efo,27481
20
20
  masster/sample/__init__.py,sha256=HL0m1ept0PMAYUCQtDDnkdOS12IFl6oLAq4TZQz83uY,170
21
- masster/sample/adducts.py,sha256=S7meba3L1tSdjoDhkSiTI71H2NJLu4i1dtJwfDKWI1M,32591
22
- masster/sample/h5.py,sha256=B0gAmhrnoFoybotqsqiT8s-PkeZWUdIQfI-4cnM52Zc,115430
23
- masster/sample/helpers.py,sha256=JhzFpNh7j7YVUibIMuPQ50hBcGDEBCaBbmwA3Z5OhgM,41336
21
+ masster/sample/adducts.py,sha256=5aEZPVcjGywCsN06ZuUWIi7h1817NsUp6o8L26P0bpY,32592
22
+ masster/sample/h5.py,sha256=tlTPGrT9AMUhduvY_YPDzk6dZF5dI-9NRc1xeiuze5c,115442
23
+ masster/sample/helpers.py,sha256=avW7gKT1wH47NUU0tEB3hkzm6ayQdfHpWR730kgWPSI,41342
24
24
  masster/sample/lib.py,sha256=E-j9c3Wd8f9a-H8xj7CAOwlA8KcyXPoFyYm3c8r7LtI,33755
25
- masster/sample/load.py,sha256=jVgni8eFG8ubxX2K0ygzHQuMbZv0hfRP1kFomVTe9t4,51784
25
+ masster/sample/load.py,sha256=swjRBCoFGni9iPztHIKPVB5ru_xDMVryB_inPXdujTw,51819
26
26
  masster/sample/parameters.py,sha256=Gg2KcuNbV_wZ_Wwv93QlM5J19ji0oSIvZLPV1NoBmq0,4456
27
27
  masster/sample/plot.py,sha256=0v4FzO_yzpUdATjdHZU4YO7UoW73Xlf51vVQByQ33X0,82574
28
- masster/sample/processing.py,sha256=Sh6IFxuFcmCspyizUPghd4Qqqk1mTPCNtvdxmyy0eKQ,55914
28
+ masster/sample/processing.py,sha256=CjaLCElDKECeCvYWqzT5EH_-rPQ0Y4A30zKjZfqmS5s,55915
29
29
  masster/sample/quant.py,sha256=tHNjvUFTdehKR31BXBZnVsBxMD9XJHgaltITOjr71uE,7562
30
- masster/sample/sample.py,sha256=_IUvUIlW2F4NRxsOdtBb1NePJJX_9FDcT5ZgM4O7ZRs,20534
30
+ masster/sample/sample.py,sha256=O2PY7DnRx7VkASBU4qKQcTqND1aRfd0OCjKK9Rjn5uw,20574
31
31
  masster/sample/sample5_schema.json,sha256=H5e2T6rHIDzul2kp_yP-ILUUWUpW08wP2pEQjMR0nSk,3977
32
32
  masster/sample/save.py,sha256=2yQtcQcRJjgAKPImTydj7LpyyMop_Q9JKRlNEK4yU6k,36339
33
33
  masster/sample/sciex.py,sha256=vnbxsq_qnAQVuzcpziP1o3IC4kM5amGBcPmC2TAuDLw,46319
@@ -40,13 +40,13 @@ masster/sample/defaults/sample_def.py,sha256=keoXyMyrm_iLgbYqfIbqCpJ3XHBVlNwCNmb
40
40
  masster/study/__init__.py,sha256=55axdFuqRX4aXtJ8ocnhcLB32fNtmmJpCi58moO0r4g,237
41
41
  masster/study/analysis.py,sha256=L-wXBnGZCLB5UUDrjIdOiMG9zdej3Tw_SftcEmmTukM,84264
42
42
  masster/study/export.py,sha256=joFK9jip2UM4lVAvhkdKVeUdNdM4D8uP2WE49IaVJgw,60172
43
- masster/study/h5.py,sha256=rMY8lgXPrU41L_bgzVl7J-uDWzb6thG2-ibw71JP0Ss,91376
43
+ masster/study/h5.py,sha256=84plxM7gYFdn_mNbcg8XxE_NRZmiIBqs_XhfHMiXshk,95364
44
44
  masster/study/helpers.py,sha256=s5jLUmxDAs_Qn6dVwpkwlwuwliMDEBjmeikS6OrxdSE,183137
45
45
  masster/study/id.py,sha256=r_vZQYNxqNXf_pjgk_CLkl1doLnLa956mTuVmlHN52o,80075
46
46
  masster/study/load.py,sha256=7d11294YYEGrSKox3cwvetv2vqcstYT1SnyAhHH5V_Q,107706
47
47
  masster/study/merge.py,sha256=D9xNRlEaMPTPZQAZhiBBSzQ-27lD60fCDmKb0cYST-M,149764
48
48
  masster/study/parameters.py,sha256=bTvmcwX9INxzcrEAmTiFH8qeWVhwkvMTZjuP394pz5o,3279
49
- masster/study/plot.py,sha256=cS4haKL8PA9q7qgkv_0S7JY6PfFV5nKZH33thSnjwtM,102113
49
+ masster/study/plot.py,sha256=wg2X3P-0J6mW0N0dJS0dX6KLGtt9mXj6w1j3E9nvlvo,103086
50
50
  masster/study/processing.py,sha256=O6X7wgeq0kXSyMO12g23cqB8cYO60gLRMxuJC2uhSMY,58644
51
51
  masster/study/save.py,sha256=47AP518epJJ9TjaGGyrLKsMsyjIk8_J4ka7bmsnRtFQ,9268
52
52
  masster/study/study.py,sha256=TnZkTLB8Z5R-AVqoHfUNvmkTthfUI4OPmBo_LYR_e8g,38654
@@ -66,8 +66,8 @@ masster/wizard/README.md,sha256=mL1A3YWJZOefpJ6D0-HqGLkVRmUlOpwyVFdvJBeeoZM,1414
66
66
  masster/wizard/__init__.py,sha256=a2hcZnHASjfuw1lqZhZnvTR58rc33rRnoGAY_JfvGhI,683
67
67
  masster/wizard/example.py,sha256=xEZFTH9UZ8HKOm6s3JL8Js0Uw5ChnISWBHSZCL32vsM,7983
68
68
  masster/wizard/wizard.py,sha256=6VqeOyKJ-9n0376CVbNuQo4vKLFjE0Sl2KexWZclQew,38580
69
- masster-0.5.3.dist-info/METADATA,sha256=qYfl6QVz7POBKlmRQ0UDR6ZR9SdUgjaXw3LFpajZKHM,45113
70
- masster-0.5.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
71
- masster-0.5.3.dist-info/entry_points.txt,sha256=ZHguQ_vPmdbpqq2uGtmEOLJfgP-DQ1T0c07Lxh30wc8,58
72
- masster-0.5.3.dist-info/licenses/LICENSE,sha256=bx5iLIKjgAdYQ7sISn7DsfHRKkoCUm1154sJJKhgqnU,35184
73
- masster-0.5.3.dist-info/RECORD,,
69
+ masster-0.5.4.dist-info/METADATA,sha256=wjgydggoAm3JBUOi0PrJ1oPUgUTvB3qKZ1MorC8NBOE,45113
70
+ masster-0.5.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
71
+ masster-0.5.4.dist-info/entry_points.txt,sha256=ZHguQ_vPmdbpqq2uGtmEOLJfgP-DQ1T0c07Lxh30wc8,58
72
+ masster-0.5.4.dist-info/licenses/LICENSE,sha256=bx5iLIKjgAdYQ7sISn7DsfHRKkoCUm1154sJJKhgqnU,35184
73
+ masster-0.5.4.dist-info/RECORD,,