masster 0.4.0__py3-none-any.whl → 0.4.1__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.
Files changed (54) hide show
  1. masster/__init__.py +8 -8
  2. masster/_version.py +1 -1
  3. masster/chromatogram.py +3 -9
  4. masster/data/libs/README.md +1 -1
  5. masster/data/libs/ccm.csv +120 -120
  6. masster/data/libs/ccm.py +116 -62
  7. masster/data/libs/central_carbon_README.md +1 -1
  8. masster/data/libs/urine.py +161 -65
  9. masster/data/libs/urine_metabolites.csv +4693 -4693
  10. masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.mzML +2 -2
  11. masster/logger.py +43 -78
  12. masster/sample/__init__.py +1 -1
  13. masster/sample/adducts.py +264 -338
  14. masster/sample/defaults/find_adducts_def.py +8 -21
  15. masster/sample/defaults/find_features_def.py +1 -6
  16. masster/sample/defaults/get_spectrum_def.py +1 -5
  17. masster/sample/defaults/sample_def.py +1 -5
  18. masster/sample/h5.py +282 -561
  19. masster/sample/helpers.py +75 -131
  20. masster/sample/lib.py +17 -42
  21. masster/sample/load.py +17 -31
  22. masster/sample/parameters.py +2 -6
  23. masster/sample/plot.py +27 -88
  24. masster/sample/processing.py +87 -117
  25. masster/sample/quant.py +51 -57
  26. masster/sample/sample.py +90 -103
  27. masster/sample/sample5_schema.json +44 -44
  28. masster/sample/save.py +12 -35
  29. masster/sample/sciex.py +19 -66
  30. masster/spectrum.py +20 -58
  31. masster/study/__init__.py +1 -1
  32. masster/study/defaults/align_def.py +1 -5
  33. masster/study/defaults/fill_chrom_def.py +1 -5
  34. masster/study/defaults/fill_def.py +1 -5
  35. masster/study/defaults/integrate_chrom_def.py +1 -5
  36. masster/study/defaults/integrate_def.py +1 -5
  37. masster/study/defaults/study_def.py +25 -58
  38. masster/study/export.py +207 -233
  39. masster/study/h5.py +136 -470
  40. masster/study/helpers.py +202 -495
  41. masster/study/helpers_optimized.py +13 -40
  42. masster/study/id.py +110 -213
  43. masster/study/load.py +143 -230
  44. masster/study/plot.py +257 -518
  45. masster/study/processing.py +257 -469
  46. masster/study/save.py +5 -15
  47. masster/study/study.py +276 -379
  48. masster/study/study5_schema.json +96 -96
  49. {masster-0.4.0.dist-info → masster-0.4.1.dist-info}/METADATA +1 -1
  50. masster-0.4.1.dist-info/RECORD +67 -0
  51. masster-0.4.0.dist-info/RECORD +0 -67
  52. {masster-0.4.0.dist-info → masster-0.4.1.dist-info}/WHEEL +0 -0
  53. {masster-0.4.0.dist-info → masster-0.4.1.dist-info}/entry_points.txt +0 -0
  54. {masster-0.4.0.dist-info → masster-0.4.1.dist-info}/licenses/LICENSE +0 -0
@@ -3737,7 +3737,7 @@
3737
3737
  <cvParam cvRef="MS" accession="MS:1000523" name="64-bit float" value=""/>
3738
3738
  <cvParam cvRef="MS" accession="MS:1000574" name="zlib compression" value=""/>
3739
3739
  <cvParam cvRef="MS" accession="MS:1000514" name="m/z array" value="" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
3740
- <binary>eJxLc8kSdWiMd7jv0xLzySnJ4ZJviuSrjeUOAqceWutcqnA4P61n2WPLOodZoY1nuYPrHASHqhXP</binary>
3740
+ <binary>eJxLc8kSdWiMd7jv0xLzySnJ4ZJviuSrjeUOAqceWutcqnA4P61n2WPLOodZoY1nuYPrHAAHqhXP</binary>
3741
3741
  </binaryDataArray>
3742
3742
  <binaryDataArray encodedLength="80">
3743
3743
  <cvParam cvRef="MS" accession="MS:1000523" name="64-bit float" value=""/>
@@ -59915,7 +59915,7 @@
59915
59915
  <cvParam cvRef="MS" accession="MS:1000523" name="64-bit float" value=""/>
59916
59916
  <cvParam cvRef="MS" accession="MS:1000574" name="zlib compression" value=""/>
59917
59917
  <cvParam cvRef="MS" accession="MS:1000514" name="m/z array" value="" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
59918
- <binary>eJxTnsnTIfu52MHt1MT0v7uaHAS51weV</binary>
59918
+ <binary>eJxTnsnTIfu52MHt1MT0v7uaHAA51weV</binary>
59919
59919
  </binaryDataArray>
59920
59920
  <binaryDataArray encodedLength="36">
59921
59921
  <cvParam cvRef="MS" accession="MS:1000523" name="64-bit float" value=""/>
masster/logger.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # masster/logger.py
2
2
  """
3
- Simple logger system for master Study and Sample instances.
3
+ Simple logger system for masster Study and Sample instances.
4
4
  Uses basic Python logging timestamp = dt.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
5
5
 
6
6
  # Loguru-style colors for different log levels
@@ -25,7 +25,7 @@ import datetime
25
25
  from typing import Any
26
26
 
27
27
 
28
- class MasterLogger:
28
+ class MassterLogger:
29
29
  """Simple logger wrapper for Study/Sample instances.
30
30
  Each instance gets its own Python logger to avoid conflicts.
31
31
 
@@ -59,7 +59,7 @@ class MasterLogger:
59
59
  self.sink = sink
60
60
 
61
61
  # Create a unique logger name for this instance
62
- self.logger_name = f"master.{self.instance_type}.{self.instance_id}"
62
+ self.logger_name = f"masster.{self.instance_type}.{self.instance_id}"
63
63
 
64
64
  # Get a Python logger instance
65
65
  self.logger_instance = logging.getLogger(self.logger_name)
@@ -73,8 +73,8 @@ class MasterLogger:
73
73
  # Create a stream handler
74
74
  self.handler = logging.StreamHandler(self.sink)
75
75
 
76
- # Create formatter that matches the original master style
77
- class masterFormatter(logging.Formatter):
76
+ # Create formatter that matches the original masster style
77
+ class massterFormatter(logging.Formatter):
78
78
  def __init__(self, label):
79
79
  super().__init__()
80
80
  self.label = label
@@ -82,9 +82,7 @@ class MasterLogger:
82
82
  def format(self, record):
83
83
  # Create timestamp in the same format as loguru
84
84
  dt = datetime.datetime.fromtimestamp(record.created)
85
- timestamp = dt.strftime("%Y-%m-%d %H:%M:%S.%f")[
86
- :-3
87
- ] # Remove last 3 digits for milliseconds
85
+ timestamp = dt.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] # Remove last 3 digits for milliseconds
88
86
 
89
87
  # Loguru-style colors for different log levels
90
88
  level_colors = {
@@ -98,10 +96,7 @@ class MasterLogger:
98
96
  }
99
97
 
100
98
  level_str = record.levelname.ljust(8)
101
- level_color = level_colors.get(
102
- record.levelname,
103
- "\x1b[37m",
104
- ) # default white
99
+ level_color = level_colors.get(record.levelname, "\x1b[37m") # default white
105
100
  label_part = self.label + " | " if self.label else ""
106
101
 
107
102
  # For DEBUG and TRACE levels, add module/location information
@@ -109,20 +104,16 @@ class MasterLogger:
109
104
  if record.levelname in ["TRACE"]:
110
105
  # Use caller information if available (from extra), otherwise fall back to record info
111
106
  if hasattr(record, "caller_module"):
112
- module_name = (
113
- record.caller_module.split(".")[-1]
114
- if record.caller_module
115
- else "unknown"
116
- )
107
+ module_name = record.caller_module.split(".")[-1] if record.caller_module else "unknown"
117
108
  line_no = record.caller_lineno
118
109
  func_name = record.caller_funcname
119
110
  else:
120
- module_name = (
121
- record.module if hasattr(record, "module") else "unknown"
122
- )
111
+ module_name = record.module if hasattr(record, "module") else "unknown"
123
112
  line_no = record.lineno
124
113
  func_name = record.funcName
125
- location_info = f"\x1b[90m{module_name}:{func_name}:{line_no}\x1b[0m | " # dim gray for location info
114
+ location_info = (
115
+ f"\x1b[90m{module_name}:{func_name}:{line_no}\x1b[0m | " # dim gray for location info
116
+ )
126
117
 
127
118
  # Loguru-style format: <white>timestamp</white> | <level>LEVEL</level> | <location> | <cyan>label</cyan> - <level>message</level>
128
119
  return (
@@ -133,7 +124,7 @@ class MasterLogger:
133
124
  f"{level_color}{record.getMessage()}\x1b[0m"
134
125
  ) # colored message
135
126
 
136
- self.handler.setFormatter(masterFormatter(self.label))
127
+ self.handler.setFormatter(massterFormatter(self.label))
137
128
  self.logger_instance.addHandler(self.handler)
138
129
 
139
130
  # Prevent propagation to avoid duplicate messages
@@ -141,28 +132,18 @@ class MasterLogger:
141
132
 
142
133
  def update_level(self, level: str):
143
134
  """Update the logging level."""
144
- if level.upper() in [
145
- "TRACE",
146
- "DEBUG",
147
- "INFO",
148
- "SUCCESS",
149
- "WARNING",
150
- "ERROR",
151
- "CRITICAL",
152
- ]:
135
+ if level.upper() in ["TRACE", "DEBUG", "INFO", "SUCCESS", "WARNING", "ERROR", "CRITICAL"]:
153
136
  self.level = level.upper()
154
137
  self.logger_instance.setLevel(getattr(logging, self.level))
155
138
  else:
156
- self.warning(
157
- f"Invalid logging level '{level}'. Keeping current level: {self.level}",
158
- )
139
+ self.warning(f"Invalid logging level '{level}'. Keeping current level: {self.level}")
159
140
 
160
141
  def update_label(self, label: str):
161
142
  """Update the label prefix for log messages."""
162
143
  self.label = label
163
144
 
164
145
  # Update formatter with new label
165
- class masterFormatter(logging.Formatter):
146
+ class massterFormatter(logging.Formatter):
166
147
  def __init__(self, label):
167
148
  super().__init__()
168
149
  self.label = label
@@ -183,10 +164,7 @@ class MasterLogger:
183
164
  }
184
165
 
185
166
  level_str = record.levelname.ljust(8)
186
- level_color = level_colors.get(
187
- record.levelname,
188
- "\x1b[37m",
189
- ) # default white
167
+ level_color = level_colors.get(record.levelname, "\x1b[37m") # default white
190
168
  label_part = self.label + " | " if self.label else ""
191
169
 
192
170
  # For DEBUG and TRACE levels, add module/location information
@@ -194,20 +172,16 @@ class MasterLogger:
194
172
  if record.levelname in ["TRACE"]:
195
173
  # Use caller information if available (from extra), otherwise fall back to record info
196
174
  if hasattr(record, "caller_module"):
197
- module_name = (
198
- record.caller_module.split(".")[-1]
199
- if record.caller_module
200
- else "unknown"
201
- )
175
+ module_name = record.caller_module.split(".")[-1] if record.caller_module else "unknown"
202
176
  line_no = record.caller_lineno
203
177
  func_name = record.caller_funcname
204
178
  else:
205
- module_name = (
206
- record.module if hasattr(record, "module") else "unknown"
207
- )
179
+ module_name = record.module if hasattr(record, "module") else "unknown"
208
180
  line_no = record.lineno
209
181
  func_name = record.funcName
210
- location_info = f"\x1b[90m{module_name}:{func_name}:{line_no}\x1b[0m | " # dim gray for location info
182
+ location_info = (
183
+ f"\x1b[90m{module_name}:{func_name}:{line_no}\x1b[0m | " # dim gray for location info
184
+ )
211
185
 
212
186
  # Loguru-style format: <white>timestamp</white> | <level>LEVEL</level> | <location> | <cyan>label</cyan> - <level>message</level>
213
187
  return (
@@ -218,7 +192,7 @@ class MasterLogger:
218
192
  f"{level_color}{record.getMessage()}\x1b[0m"
219
193
  ) # colored message
220
194
 
221
- self.handler.setFormatter(masterFormatter(self.label))
195
+ self.handler.setFormatter(massterFormatter(self.label))
222
196
 
223
197
  def update_sink(self, sink: Any):
224
198
  """Update the output sink for log messages."""
@@ -233,7 +207,7 @@ class MasterLogger:
233
207
  self.handler = logging.StreamHandler(self.sink)
234
208
 
235
209
  # Apply formatter
236
- class masterFormatter(logging.Formatter):
210
+ class massterFormatter(logging.Formatter):
237
211
  def __init__(self, label):
238
212
  super().__init__()
239
213
  self.label = label
@@ -254,10 +228,7 @@ class MasterLogger:
254
228
  }
255
229
 
256
230
  level_str = record.levelname.ljust(8)
257
- level_color = level_colors.get(
258
- record.levelname,
259
- "\x1b[37m",
260
- ) # default white
231
+ level_color = level_colors.get(record.levelname, "\x1b[37m") # default white
261
232
  label_part = self.label + " | " if self.label else ""
262
233
 
263
234
  # For DEBUG and TRACE levels, add module/location information
@@ -265,18 +236,16 @@ class MasterLogger:
265
236
  if record.levelname in ["TRACE"]:
266
237
  # Use caller information if available (from extra), otherwise fall back to record info
267
238
  if hasattr(record, "caller_module"):
268
- module_name = (
269
- record.caller_module.split(".")[-1]
270
- if record.caller_module
271
- else "unknown"
272
- )
239
+ module_name = record.caller_module.split(".")[-1] if record.caller_module else "unknown"
273
240
  line_no = record.caller_lineno
274
241
  func_name = record.caller_funcname
275
242
  else:
276
243
  module_name = record.module
277
244
  line_no = record.lineno
278
245
  func_name = record.funcName
279
- location_info = f"\x1b[90m{module_name}:{func_name}:{line_no}\x1b[0m | " # dim gray for location info
246
+ location_info = (
247
+ f"\x1b[90m{module_name}:{func_name}:{line_no}\x1b[0m | " # dim gray for location info
248
+ )
280
249
 
281
250
  # Loguru-style format: <white>timestamp</white> | <level>LEVEL</level> | <location> | <cyan>label</cyan> - <level>message</level>
282
251
  return (
@@ -287,7 +256,7 @@ class MasterLogger:
287
256
  f"{level_color}{record.getMessage()}\x1b[0m"
288
257
  ) # colored message
289
258
 
290
- self.handler.setFormatter(masterFormatter(self.label))
259
+ self.handler.setFormatter(massterFormatter(self.label))
291
260
  self.logger_instance.addHandler(self.handler)
292
261
 
293
262
  # Logger method delegates
@@ -300,14 +269,12 @@ class MasterLogger:
300
269
 
301
270
  # Add caller information as extra parameters
302
271
  extra = kwargs.get("extra", {})
303
- extra.update(
304
- {
305
- "caller_module": frame.f_globals.get("__name__", "unknown"),
306
- "caller_filename": frame.f_code.co_filename,
307
- "caller_lineno": frame.f_lineno,
308
- "caller_funcname": frame.f_code.co_name,
309
- },
310
- )
272
+ extra.update({
273
+ "caller_module": frame.f_globals.get("__name__", "unknown"),
274
+ "caller_filename": frame.f_code.co_filename,
275
+ "caller_lineno": frame.f_lineno,
276
+ "caller_funcname": frame.f_code.co_name,
277
+ })
311
278
  kwargs["extra"] = extra
312
279
 
313
280
  self.logger_instance.debug(message, *args, **kwargs)
@@ -321,14 +288,12 @@ class MasterLogger:
321
288
 
322
289
  # Add caller information as extra parameters
323
290
  extra = kwargs.get("extra", {})
324
- extra.update(
325
- {
326
- "caller_module": frame.f_globals.get("__name__", "unknown"),
327
- "caller_filename": frame.f_code.co_filename,
328
- "caller_lineno": frame.f_lineno,
329
- "caller_funcname": frame.f_code.co_name,
330
- },
331
- )
291
+ extra.update({
292
+ "caller_module": frame.f_globals.get("__name__", "unknown"),
293
+ "caller_filename": frame.f_code.co_filename,
294
+ "caller_lineno": frame.f_lineno,
295
+ "caller_funcname": frame.f_code.co_name,
296
+ })
332
297
  kwargs["extra"] = extra
333
298
 
334
299
  self.logger_instance.debug(message, *args, **kwargs)
@@ -364,4 +329,4 @@ class MasterLogger:
364
329
  self.handler = None
365
330
 
366
331
  def __repr__(self):
367
- return f"MasterLogger(type={self.instance_type}, id={self.instance_id}, level={self.level})"
332
+ return f"MassterLogger(type={self.instance_type}, id={self.instance_id}, level={self.level})"
@@ -1,5 +1,5 @@
1
1
  """
2
- Sample module for master.
2
+ Sample module for masster.
3
3
 
4
4
  This module provides the Sample class for handling mass spectrometry data.
5
5
  """