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.
- masster/__init__.py +8 -8
- masster/_version.py +1 -1
- masster/chromatogram.py +3 -9
- masster/data/libs/README.md +1 -1
- masster/data/libs/ccm.csv +120 -120
- masster/data/libs/ccm.py +116 -62
- masster/data/libs/central_carbon_README.md +1 -1
- masster/data/libs/urine.py +161 -65
- masster/data/libs/urine_metabolites.csv +4693 -4693
- masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.mzML +2 -2
- masster/logger.py +43 -78
- masster/sample/__init__.py +1 -1
- masster/sample/adducts.py +264 -338
- masster/sample/defaults/find_adducts_def.py +8 -21
- masster/sample/defaults/find_features_def.py +1 -6
- masster/sample/defaults/get_spectrum_def.py +1 -5
- masster/sample/defaults/sample_def.py +1 -5
- masster/sample/h5.py +282 -561
- masster/sample/helpers.py +75 -131
- masster/sample/lib.py +17 -42
- masster/sample/load.py +17 -31
- masster/sample/parameters.py +2 -6
- masster/sample/plot.py +27 -88
- masster/sample/processing.py +87 -117
- masster/sample/quant.py +51 -57
- masster/sample/sample.py +90 -103
- masster/sample/sample5_schema.json +44 -44
- masster/sample/save.py +12 -35
- masster/sample/sciex.py +19 -66
- masster/spectrum.py +20 -58
- masster/study/__init__.py +1 -1
- masster/study/defaults/align_def.py +1 -5
- masster/study/defaults/fill_chrom_def.py +1 -5
- masster/study/defaults/fill_def.py +1 -5
- masster/study/defaults/integrate_chrom_def.py +1 -5
- masster/study/defaults/integrate_def.py +1 -5
- masster/study/defaults/study_def.py +25 -58
- masster/study/export.py +207 -233
- masster/study/h5.py +136 -470
- masster/study/helpers.py +202 -495
- masster/study/helpers_optimized.py +13 -40
- masster/study/id.py +110 -213
- masster/study/load.py +143 -230
- masster/study/plot.py +257 -518
- masster/study/processing.py +257 -469
- masster/study/save.py +5 -15
- masster/study/study.py +276 -379
- masster/study/study5_schema.json +96 -96
- {masster-0.4.0.dist-info → masster-0.4.1.dist-info}/METADATA +1 -1
- masster-0.4.1.dist-info/RECORD +67 -0
- masster-0.4.0.dist-info/RECORD +0 -67
- {masster-0.4.0.dist-info → masster-0.4.1.dist-info}/WHEEL +0 -0
- {masster-0.4.0.dist-info → masster-0.4.1.dist-info}/entry_points.txt +0 -0
- {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>
|
|
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>
|
|
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
|
|
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
|
|
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"
|
|
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
|
|
77
|
-
class
|
|
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 =
|
|
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(
|
|
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
|
|
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 =
|
|
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(
|
|
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
|
|
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 =
|
|
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(
|
|
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
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
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"
|
|
332
|
+
return f"MassterLogger(type={self.instance_type}, id={self.instance_id}, level={self.level})"
|
masster/sample/__init__.py
CHANGED