masster 0.2.5__py3-none-any.whl → 0.3.0__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.

Files changed (55) hide show
  1. masster/__init__.py +27 -27
  2. masster/_version.py +17 -17
  3. masster/chromatogram.py +497 -503
  4. masster/data/examples/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.featureXML +199787 -0
  5. masster/data/examples/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.sample5 +0 -0
  6. masster/logger.py +318 -244
  7. masster/sample/__init__.py +9 -9
  8. masster/sample/defaults/__init__.py +15 -15
  9. masster/sample/defaults/find_adducts_def.py +325 -325
  10. masster/sample/defaults/find_features_def.py +366 -366
  11. masster/sample/defaults/find_ms2_def.py +285 -285
  12. masster/sample/defaults/get_spectrum_def.py +314 -318
  13. masster/sample/defaults/sample_def.py +374 -378
  14. masster/sample/h5.py +1321 -1297
  15. masster/sample/helpers.py +833 -364
  16. masster/sample/lib.py +762 -0
  17. masster/sample/load.py +1220 -1187
  18. masster/sample/parameters.py +131 -131
  19. masster/sample/plot.py +1610 -1622
  20. masster/sample/processing.py +1402 -1416
  21. masster/sample/quant.py +209 -0
  22. masster/sample/sample.py +391 -387
  23. masster/sample/sample5_schema.json +181 -181
  24. masster/sample/save.py +737 -736
  25. masster/sample/sciex.py +1213 -0
  26. masster/spectrum.py +1287 -1319
  27. masster/study/__init__.py +9 -9
  28. masster/study/defaults/__init__.py +21 -19
  29. masster/study/defaults/align_def.py +267 -267
  30. masster/study/defaults/export_def.py +41 -40
  31. masster/study/defaults/fill_chrom_def.py +264 -264
  32. masster/study/defaults/fill_def.py +260 -0
  33. masster/study/defaults/find_consensus_def.py +256 -256
  34. masster/study/defaults/find_ms2_def.py +163 -163
  35. masster/study/defaults/integrate_chrom_def.py +225 -225
  36. masster/study/defaults/integrate_def.py +221 -0
  37. masster/study/defaults/merge_def.py +256 -0
  38. masster/study/defaults/study_def.py +272 -269
  39. masster/study/export.py +674 -287
  40. masster/study/h5.py +1398 -886
  41. masster/study/helpers.py +1650 -433
  42. masster/study/helpers_optimized.py +317 -0
  43. masster/study/load.py +1201 -1078
  44. masster/study/parameters.py +99 -99
  45. masster/study/plot.py +632 -645
  46. masster/study/processing.py +1057 -1046
  47. masster/study/save.py +149 -134
  48. masster/study/study.py +606 -522
  49. masster/study/study5_schema.json +247 -241
  50. {masster-0.2.5.dist-info → masster-0.3.0.dist-info}/METADATA +15 -10
  51. masster-0.3.0.dist-info/RECORD +59 -0
  52. {masster-0.2.5.dist-info → masster-0.3.0.dist-info}/licenses/LICENSE +661 -661
  53. masster-0.2.5.dist-info/RECORD +0 -50
  54. {masster-0.2.5.dist-info → masster-0.3.0.dist-info}/WHEEL +0 -0
  55. {masster-0.2.5.dist-info → masster-0.3.0.dist-info}/entry_points.txt +0 -0
@@ -1,225 +1,225 @@
1
- """Parameter class for Study integrate_chrom method."""
2
-
3
- from dataclasses import dataclass, field
4
- from typing import Optional, Any
5
-
6
-
7
- @dataclass
8
- class integrate_chrom_defaults:
9
- """
10
- Parameter class for Study integrate_chrom method.
11
-
12
- This class encapsulates parameters for chromatogram integration across
13
- consensus features, including integration boundaries and tolerances.
14
-
15
- Attributes:
16
- uids (Optional[list]): List of consensus UIDs to integrate. Default is None (all).
17
- rt_tol (float): RT tolerance for integration boundaries. Default is 0.0.
18
- """
19
-
20
- uids: Optional[list] = None
21
- rt_tol: float = 0.0
22
-
23
- _param_metadata: dict[str, dict[str, Any]] = field(
24
- default_factory=lambda: {
25
- "uids": {
26
- "dtype": "Optional[list]",
27
- "description": "List of consensus UIDs to integrate (None for all)",
28
- "default": None,
29
- },
30
- "rt_tol": {
31
- "dtype": float,
32
- "description": "RT tolerance for integration boundaries (seconds)",
33
- "default": 0.0,
34
- "min_value": 0.0,
35
- "max_value": 60.0,
36
- },
37
- },
38
- repr=False,
39
- )
40
-
41
- def get_info(self, param_name: str) -> dict[str, Any]:
42
- """
43
- Get information about a specific parameter.
44
-
45
- Args:
46
- param_name: Name of the parameter
47
-
48
- Returns:
49
- Dictionary containing parameter metadata
50
-
51
- Raises:
52
- KeyError: If parameter name is not found
53
- """
54
- if param_name not in self._param_metadata:
55
- raise KeyError(f"Parameter '{param_name}' not found")
56
- return self._param_metadata[param_name]
57
-
58
- def get_description(self, param_name: str) -> str:
59
- """
60
- Get description for a specific parameter.
61
-
62
- Args:
63
- param_name: Name of the parameter
64
-
65
- Returns:
66
- Parameter description string
67
- """
68
- return str(self.get_info(param_name)["description"])
69
-
70
- def validate(self, param_name: str, value: Any) -> bool:
71
- """
72
- Validate a parameter value against its constraints.
73
-
74
- Args:
75
- param_name: Name of the parameter
76
- value: Value to validate
77
-
78
- Returns:
79
- True if value is valid, False otherwise
80
- """
81
- if param_name not in self._param_metadata:
82
- return False
83
-
84
- metadata = self._param_metadata[param_name]
85
- expected_dtype = metadata["dtype"]
86
-
87
- # Handle optional types
88
- if isinstance(expected_dtype, str) and expected_dtype.startswith("Optional"):
89
- if value is None:
90
- return True
91
- # Extract the inner type for validation
92
- if "list" in expected_dtype:
93
- expected_dtype = list
94
-
95
- # Type checking
96
- if expected_dtype is float:
97
- if not isinstance(value, (int, float)):
98
- try:
99
- value = float(value)
100
- except (ValueError, TypeError):
101
- return False
102
- elif expected_dtype is list:
103
- if not isinstance(value, list):
104
- return False
105
-
106
- # Range validation for numeric types
107
- if expected_dtype is float and isinstance(value, (int, float)):
108
- if "min_value" in metadata and value < metadata["min_value"]:
109
- return False
110
- if "max_value" in metadata and value > metadata["max_value"]:
111
- return False
112
-
113
- return True
114
-
115
- def set(self, param_name: str, value: Any, validate: bool = True) -> bool:
116
- """
117
- Set a parameter value with optional validation.
118
-
119
- Args:
120
- param_name: Name of the parameter
121
- value: New value for the parameter
122
- validate: Whether to validate the value before setting
123
-
124
- Returns:
125
- True if parameter was set successfully, False otherwise
126
- """
127
- if not hasattr(self, param_name):
128
- return False
129
-
130
- if validate and not self.validate(param_name, value):
131
- return False
132
-
133
- # Convert to expected type if needed
134
- if param_name in self._param_metadata:
135
- expected_dtype = self._param_metadata[param_name]["dtype"]
136
-
137
- # Handle optional types
138
- if (
139
- isinstance(expected_dtype, str)
140
- and expected_dtype.startswith("Optional")
141
- and value is not None
142
- ):
143
- if "float" in expected_dtype and not isinstance(value, float):
144
- try:
145
- value = float(value)
146
- except (ValueError, TypeError):
147
- if validate:
148
- return False
149
-
150
- setattr(self, param_name, value)
151
- return True
152
-
153
- def get(self, param_name: str) -> Any:
154
- """
155
- Get the value of a parameter by name.
156
-
157
- Args:
158
- param_name: Name of the parameter
159
-
160
- Returns:
161
- Current value of the parameter
162
- """
163
- if not hasattr(self, param_name):
164
- raise KeyError(f"Parameter '{param_name}' not found")
165
- return getattr(self, param_name)
166
-
167
- def set_from_dict(
168
- self,
169
- param_dict: dict[str, Any],
170
- validate: bool = True,
171
- ) -> list[str]:
172
- """
173
- Update multiple parameters from a dictionary.
174
-
175
- Args:
176
- param_dict: Dictionary of parameter names and values
177
- validate: Whether to validate values before setting
178
-
179
- Returns:
180
- List of parameter names that could not be set
181
- """
182
- failed_params = []
183
-
184
- for param_name, value in param_dict.items():
185
- if not self.set(param_name, value, validate):
186
- failed_params.append(param_name)
187
-
188
- return failed_params
189
-
190
- def to_dict(self) -> dict[str, Any]:
191
- """
192
- Convert parameters to dictionary, excluding metadata.
193
-
194
- Returns:
195
- Dictionary of parameter names and values
196
- """
197
- return {k: v for k, v in self.__dict__.items() if not k.startswith("_")}
198
-
199
- def list_parameters(self) -> list[str]:
200
- """
201
- Get list of all parameter names.
202
-
203
- Returns:
204
- List of parameter names
205
- """
206
- return [k for k in self.__dict__.keys() if not k.startswith("_")]
207
-
208
- def validate_all(self) -> tuple[bool, list[str]]:
209
- """
210
- Validate all parameters in the instance.
211
-
212
- Returns:
213
- Tuple of (all_valid, list_of_invalid_params)
214
- - all_valid: True if all parameters are valid, False otherwise
215
- - list_of_invalid_params: List of parameter names that failed validation
216
- """
217
- invalid_params = []
218
-
219
- for param_name in self.list_parameters():
220
- if param_name in self._param_metadata:
221
- current_value = getattr(self, param_name)
222
- if not self.validate(param_name, current_value):
223
- invalid_params.append(param_name)
224
-
225
- return len(invalid_params) == 0, invalid_params
1
+ """Parameter class for Study integrate_chrom method."""
2
+
3
+ from dataclasses import dataclass, field
4
+ from typing import Optional, Any
5
+
6
+
7
+ @dataclass
8
+ class integrate_chrom_defaults:
9
+ """
10
+ Parameter class for Study integrate_chrom method.
11
+
12
+ This class encapsulates parameters for chromatogram integration across
13
+ consensus features, including integration boundaries and tolerances.
14
+
15
+ Attributes:
16
+ uids (Optional[list]): List of consensus UIDs to integrate. Default is None (all).
17
+ rt_tol (float): RT tolerance for integration boundaries. Default is 0.0.
18
+ """
19
+
20
+ uids: Optional[list] = None
21
+ rt_tol: float = 0.0
22
+
23
+ _param_metadata: dict[str, dict[str, Any]] = field(
24
+ default_factory=lambda: {
25
+ "uids": {
26
+ "dtype": "Optional[list]",
27
+ "description": "List of consensus UIDs to integrate (None for all)",
28
+ "default": None,
29
+ },
30
+ "rt_tol": {
31
+ "dtype": float,
32
+ "description": "RT tolerance for integration boundaries (seconds)",
33
+ "default": 0.0,
34
+ "min_value": 0.0,
35
+ "max_value": 60.0,
36
+ },
37
+ },
38
+ repr=False,
39
+ )
40
+
41
+ def get_info(self, param_name: str) -> dict[str, Any]:
42
+ """
43
+ Get information about a specific parameter.
44
+
45
+ Args:
46
+ param_name: Name of the parameter
47
+
48
+ Returns:
49
+ Dictionary containing parameter metadata
50
+
51
+ Raises:
52
+ KeyError: If parameter name is not found
53
+ """
54
+ if param_name not in self._param_metadata:
55
+ raise KeyError(f"Parameter '{param_name}' not found")
56
+ return self._param_metadata[param_name]
57
+
58
+ def get_description(self, param_name: str) -> str:
59
+ """
60
+ Get description for a specific parameter.
61
+
62
+ Args:
63
+ param_name: Name of the parameter
64
+
65
+ Returns:
66
+ Parameter description string
67
+ """
68
+ return str(self.get_info(param_name)["description"])
69
+
70
+ def validate(self, param_name: str, value: Any) -> bool:
71
+ """
72
+ Validate a parameter value against its constraints.
73
+
74
+ Args:
75
+ param_name: Name of the parameter
76
+ value: Value to validate
77
+
78
+ Returns:
79
+ True if value is valid, False otherwise
80
+ """
81
+ if param_name not in self._param_metadata:
82
+ return False
83
+
84
+ metadata = self._param_metadata[param_name]
85
+ expected_dtype = metadata["dtype"]
86
+
87
+ # Handle optional types
88
+ if isinstance(expected_dtype, str) and expected_dtype.startswith("Optional"):
89
+ if value is None:
90
+ return True
91
+ # Extract the inner type for validation
92
+ if "list" in expected_dtype:
93
+ expected_dtype = list
94
+
95
+ # Type checking
96
+ if expected_dtype is float:
97
+ if not isinstance(value, (int, float)):
98
+ try:
99
+ value = float(value)
100
+ except (ValueError, TypeError):
101
+ return False
102
+ elif expected_dtype is list:
103
+ if not isinstance(value, list):
104
+ return False
105
+
106
+ # Range validation for numeric types
107
+ if expected_dtype is float and isinstance(value, (int, float)):
108
+ if "min_value" in metadata and value < metadata["min_value"]:
109
+ return False
110
+ if "max_value" in metadata and value > metadata["max_value"]:
111
+ return False
112
+
113
+ return True
114
+
115
+ def set(self, param_name: str, value: Any, validate: bool = True) -> bool:
116
+ """
117
+ Set a parameter value with optional validation.
118
+
119
+ Args:
120
+ param_name: Name of the parameter
121
+ value: New value for the parameter
122
+ validate: Whether to validate the value before setting
123
+
124
+ Returns:
125
+ True if parameter was set successfully, False otherwise
126
+ """
127
+ if not hasattr(self, param_name):
128
+ return False
129
+
130
+ if validate and not self.validate(param_name, value):
131
+ return False
132
+
133
+ # Convert to expected type if needed
134
+ if param_name in self._param_metadata:
135
+ expected_dtype = self._param_metadata[param_name]["dtype"]
136
+
137
+ # Handle optional types
138
+ if (
139
+ isinstance(expected_dtype, str)
140
+ and expected_dtype.startswith("Optional")
141
+ and value is not None
142
+ ):
143
+ if "float" in expected_dtype and not isinstance(value, float):
144
+ try:
145
+ value = float(value)
146
+ except (ValueError, TypeError):
147
+ if validate:
148
+ return False
149
+
150
+ setattr(self, param_name, value)
151
+ return True
152
+
153
+ def get(self, param_name: str) -> Any:
154
+ """
155
+ Get the value of a parameter by name.
156
+
157
+ Args:
158
+ param_name: Name of the parameter
159
+
160
+ Returns:
161
+ Current value of the parameter
162
+ """
163
+ if not hasattr(self, param_name):
164
+ raise KeyError(f"Parameter '{param_name}' not found")
165
+ return getattr(self, param_name)
166
+
167
+ def set_from_dict(
168
+ self,
169
+ param_dict: dict[str, Any],
170
+ validate: bool = True,
171
+ ) -> list[str]:
172
+ """
173
+ Update multiple parameters from a dictionary.
174
+
175
+ Args:
176
+ param_dict: Dictionary of parameter names and values
177
+ validate: Whether to validate values before setting
178
+
179
+ Returns:
180
+ List of parameter names that could not be set
181
+ """
182
+ failed_params = []
183
+
184
+ for param_name, value in param_dict.items():
185
+ if not self.set(param_name, value, validate):
186
+ failed_params.append(param_name)
187
+
188
+ return failed_params
189
+
190
+ def to_dict(self) -> dict[str, Any]:
191
+ """
192
+ Convert parameters to dictionary, excluding metadata.
193
+
194
+ Returns:
195
+ Dictionary of parameter names and values
196
+ """
197
+ return {k: v for k, v in self.__dict__.items() if not k.startswith("_")}
198
+
199
+ def list_parameters(self) -> list[str]:
200
+ """
201
+ Get list of all parameter names.
202
+
203
+ Returns:
204
+ List of parameter names
205
+ """
206
+ return [k for k in self.__dict__.keys() if not k.startswith("_")]
207
+
208
+ def validate_all(self) -> tuple[bool, list[str]]:
209
+ """
210
+ Validate all parameters in the instance.
211
+
212
+ Returns:
213
+ Tuple of (all_valid, list_of_invalid_params)
214
+ - all_valid: True if all parameters are valid, False otherwise
215
+ - list_of_invalid_params: List of parameter names that failed validation
216
+ """
217
+ invalid_params = []
218
+
219
+ for param_name in self.list_parameters():
220
+ if param_name in self._param_metadata:
221
+ current_value = getattr(self, param_name)
222
+ if not self.validate(param_name, current_value):
223
+ invalid_params.append(param_name)
224
+
225
+ return len(invalid_params) == 0, invalid_params
@@ -0,0 +1,221 @@
1
+ """Parameter class for Study integrate method."""
2
+
3
+ from dataclasses import dataclass, field
4
+ from typing import Optional, Any
5
+
6
+
7
+ @dataclass
8
+ class integrate_defaults:
9
+ """
10
+ Parameter class for Study integrate method.
11
+
12
+ This class encapsulates parameters for chromatogram integration across
13
+ consensus features, including integration boundaries and tolerances.
14
+
15
+ Attributes:
16
+ uids (Optional[list]): List of consensus UIDs to integrate. Default is None (all).
17
+ rt_tol (float): RT tolerance for integration boundaries. Default is 0.0.
18
+ """
19
+
20
+ uids: Optional[list] = None
21
+ rt_tol: float = 0.0
22
+
23
+ _param_metadata: dict[str, dict[str, Any]] = field(
24
+ default_factory=lambda: {
25
+ "uids": {
26
+ "dtype": "Optional[list]",
27
+ "description": "List of consensus UIDs to integrate (None for all)",
28
+ "default": None,
29
+ },
30
+ "rt_tol": {
31
+ "dtype": float,
32
+ "description": "RT tolerance for integration boundaries (seconds)",
33
+ "default": 0.0,
34
+ "min_value": 0.0,
35
+ "max_value": 60.0,
36
+ },
37
+ },
38
+ repr=False,
39
+ )
40
+
41
+ def get_info(self, param_name: str) -> dict[str, Any]:
42
+ """
43
+ Get information about a specific parameter.
44
+
45
+ Args:
46
+ param_name: Name of the parameter
47
+
48
+ Returns:
49
+ Dictionary containing parameter metadata
50
+
51
+ Raises:
52
+ KeyError: If parameter name is not found
53
+ """
54
+ if param_name not in self._param_metadata:
55
+ raise KeyError(f"Parameter '{param_name}' not found")
56
+ return self._param_metadata[param_name]
57
+
58
+ def get_description(self, param_name: str) -> str:
59
+ """
60
+ Get description for a specific parameter.
61
+
62
+ Args:
63
+ param_name: Name of the parameter
64
+
65
+ Returns:
66
+ Parameter description string
67
+ """
68
+ return str(self.get_info(param_name)["description"])
69
+
70
+ def validate(self, param_name: str, value: Any) -> bool:
71
+ """
72
+ Validate a parameter value against its constraints.
73
+
74
+ Args:
75
+ param_name: Name of the parameter
76
+ value: Value to validate
77
+
78
+ Returns:
79
+ True if value is valid, False otherwise
80
+ """
81
+ if param_name not in self._param_metadata:
82
+ return False
83
+
84
+ metadata = self._param_metadata[param_name]
85
+ expected_dtype = metadata["dtype"]
86
+
87
+ # Handle optional types
88
+ if isinstance(expected_dtype, str) and expected_dtype.startswith("Optional"):
89
+ if value is None:
90
+ return True
91
+ # Extract the inner type for validation
92
+ if "list" in expected_dtype:
93
+ expected_dtype = list
94
+
95
+ # Type checking
96
+ if expected_dtype is float:
97
+ if not isinstance(value, (int, float)):
98
+ try:
99
+ value = float(value)
100
+ except (ValueError, TypeError):
101
+ return False
102
+ elif expected_dtype is list:
103
+ if not isinstance(value, list):
104
+ return False
105
+
106
+ # Range validation for numeric types
107
+ if expected_dtype is float and isinstance(value, (int, float)):
108
+ if "min_value" in metadata and value < metadata["min_value"]:
109
+ return False
110
+ if "max_value" in metadata and value > metadata["max_value"]:
111
+ return False
112
+
113
+ return True
114
+
115
+ def set(self, param_name: str, value: Any, validate: bool = True) -> bool:
116
+ """
117
+ Set a parameter value with optional validation.
118
+
119
+ Args:
120
+ param_name: Name of the parameter
121
+ value: New value for the parameter
122
+ validate: Whether to validate the value before setting
123
+
124
+ Returns:
125
+ True if parameter was set successfully, False otherwise
126
+ """
127
+ if not hasattr(self, param_name):
128
+ return False
129
+
130
+ if validate and not self.validate(param_name, value):
131
+ return False
132
+
133
+ # Convert to expected type if needed
134
+ if param_name in self._param_metadata:
135
+ expected_dtype = self._param_metadata[param_name]["dtype"]
136
+
137
+ # Handle optional types
138
+ if isinstance(expected_dtype, str) and expected_dtype.startswith("Optional") and value is not None:
139
+ if "float" in expected_dtype and not isinstance(value, float):
140
+ try:
141
+ value = float(value)
142
+ except (ValueError, TypeError):
143
+ if validate:
144
+ return False
145
+
146
+ setattr(self, param_name, value)
147
+ return True
148
+
149
+ def get(self, param_name: str) -> Any:
150
+ """
151
+ Get the value of a parameter by name.
152
+
153
+ Args:
154
+ param_name: Name of the parameter
155
+
156
+ Returns:
157
+ Current value of the parameter
158
+ """
159
+ if not hasattr(self, param_name):
160
+ raise KeyError(f"Parameter '{param_name}' not found")
161
+ return getattr(self, param_name)
162
+
163
+ def set_from_dict(
164
+ self,
165
+ param_dict: dict[str, Any],
166
+ validate: bool = True,
167
+ ) -> list[str]:
168
+ """
169
+ Update multiple parameters from a dictionary.
170
+
171
+ Args:
172
+ param_dict: Dictionary of parameter names and values
173
+ validate: Whether to validate values before setting
174
+
175
+ Returns:
176
+ List of parameter names that could not be set
177
+ """
178
+ failed_params = []
179
+
180
+ for param_name, value in param_dict.items():
181
+ if not self.set(param_name, value, validate):
182
+ failed_params.append(param_name)
183
+
184
+ return failed_params
185
+
186
+ def to_dict(self) -> dict[str, Any]:
187
+ """
188
+ Convert parameters to dictionary, excluding metadata.
189
+
190
+ Returns:
191
+ Dictionary of parameter names and values
192
+ """
193
+ return {k: v for k, v in self.__dict__.items() if not k.startswith("_")}
194
+
195
+ def list_parameters(self) -> list[str]:
196
+ """
197
+ Get list of all parameter names.
198
+
199
+ Returns:
200
+ List of parameter names
201
+ """
202
+ return [k for k in self.__dict__.keys() if not k.startswith("_")]
203
+
204
+ def validate_all(self) -> tuple[bool, list[str]]:
205
+ """
206
+ Validate all parameters in the instance.
207
+
208
+ Returns:
209
+ Tuple of (all_valid, list_of_invalid_params)
210
+ - all_valid: True if all parameters are valid, False otherwise
211
+ - list_of_invalid_params: List of parameter names that failed validation
212
+ """
213
+ invalid_params = []
214
+
215
+ for param_name in self.list_parameters():
216
+ if param_name in self._param_metadata:
217
+ current_value = getattr(self, param_name)
218
+ if not self.validate(param_name, current_value):
219
+ invalid_params.append(param_name)
220
+
221
+ return len(invalid_params) == 0, invalid_params