CoreMS 4.0.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.
Files changed (171) hide show
  1. corems/__init__.py +63 -0
  2. corems/chroma_peak/__init__.py +0 -0
  3. corems/chroma_peak/calc/ChromaPeakCalc.py +480 -0
  4. corems/chroma_peak/calc/__init__.py +0 -0
  5. corems/chroma_peak/calc/subset.py +196 -0
  6. corems/chroma_peak/factory/__init__.py +0 -0
  7. corems/chroma_peak/factory/chroma_peak_classes.py +1178 -0
  8. corems/encapsulation/__init__.py +0 -0
  9. corems/encapsulation/constant.py +1283 -0
  10. corems/encapsulation/factory/__init__.py +0 -0
  11. corems/encapsulation/factory/parameters.py +392 -0
  12. corems/encapsulation/factory/processingSetting.py +1244 -0
  13. corems/encapsulation/input/__init__.py +0 -0
  14. corems/encapsulation/input/parameter_from_json.py +579 -0
  15. corems/encapsulation/output/__init__.py +0 -0
  16. corems/encapsulation/output/parameter_to_dict.py +142 -0
  17. corems/encapsulation/output/parameter_to_json.py +332 -0
  18. corems/mass_spectra/__init__.py +0 -0
  19. corems/mass_spectra/calc/GC_Calc.py +84 -0
  20. corems/mass_spectra/calc/GC_Deconvolution.py +558 -0
  21. corems/mass_spectra/calc/GC_RI_Calibration.py +44 -0
  22. corems/mass_spectra/calc/MZSearch.py +249 -0
  23. corems/mass_spectra/calc/SignalProcessing.py +656 -0
  24. corems/mass_spectra/calc/__init__.py +0 -0
  25. corems/mass_spectra/calc/lc_calc.py +5790 -0
  26. corems/mass_spectra/calc/lc_calc_operations.py +1127 -0
  27. corems/mass_spectra/factory/GC_Class.py +791 -0
  28. corems/mass_spectra/factory/__init__.py +0 -0
  29. corems/mass_spectra/factory/chromat_data.py +51 -0
  30. corems/mass_spectra/factory/lc_class.py +2721 -0
  31. corems/mass_spectra/input/__init__.py +0 -0
  32. corems/mass_spectra/input/andiNetCDF.py +200 -0
  33. corems/mass_spectra/input/boosterHDF5.py +216 -0
  34. corems/mass_spectra/input/brukerSolarix.py +153 -0
  35. corems/mass_spectra/input/brukerSolarix_utils.py +73 -0
  36. corems/mass_spectra/input/corems_hdf5.py +1710 -0
  37. corems/mass_spectra/input/massList.py +133 -0
  38. corems/mass_spectra/input/mzml.py +668 -0
  39. corems/mass_spectra/input/parserbase.py +239 -0
  40. corems/mass_spectra/input/rawFileReader.py +1839 -0
  41. corems/mass_spectra/output/__init__.py +0 -0
  42. corems/mass_spectra/output/export.py +2800 -0
  43. corems/mass_spectrum/__init__.py +0 -0
  44. corems/mass_spectrum/calc/AutoRecalibration.py +237 -0
  45. corems/mass_spectrum/calc/Calibration.py +602 -0
  46. corems/mass_spectrum/calc/CalibrationCalc.py +253 -0
  47. corems/mass_spectrum/calc/KendrickGroup.py +239 -0
  48. corems/mass_spectrum/calc/MassErrorPrediction.py +436 -0
  49. corems/mass_spectrum/calc/MassSpectrumCalc.py +303 -0
  50. corems/mass_spectrum/calc/MeanResolvingPowerFilter.py +212 -0
  51. corems/mass_spectrum/calc/NoiseCalc.py +371 -0
  52. corems/mass_spectrum/calc/NoiseCalc_Bayes.py +93 -0
  53. corems/mass_spectrum/calc/PeakPicking.py +994 -0
  54. corems/mass_spectrum/calc/__init__.py +0 -0
  55. corems/mass_spectrum/factory/MassSpectrumClasses.py +1753 -0
  56. corems/mass_spectrum/factory/__init__.py +0 -0
  57. corems/mass_spectrum/input/__init__.py +0 -0
  58. corems/mass_spectrum/input/baseClass.py +531 -0
  59. corems/mass_spectrum/input/boosterHDF5.py +161 -0
  60. corems/mass_spectrum/input/coremsHDF5.py +475 -0
  61. corems/mass_spectrum/input/massList.py +402 -0
  62. corems/mass_spectrum/input/numpyArray.py +133 -0
  63. corems/mass_spectrum/output/__init__.py +0 -0
  64. corems/mass_spectrum/output/export.py +841 -0
  65. corems/molecular_formula/__init__.py +0 -0
  66. corems/molecular_formula/calc/MolecularFormulaCalc.py +885 -0
  67. corems/molecular_formula/calc/__init__.py +0 -0
  68. corems/molecular_formula/factory/MolecularFormulaFactory.py +895 -0
  69. corems/molecular_formula/factory/__init__.py +0 -0
  70. corems/molecular_formula/input/__init__.py +0 -0
  71. corems/molecular_formula/input/masslist_ref.py +355 -0
  72. corems/molecular_id/__init__.py +0 -0
  73. corems/molecular_id/calc/ClusterFilter.py +251 -0
  74. corems/molecular_id/calc/MolecularFilter.py +122 -0
  75. corems/molecular_id/calc/SpectralSimilarity.py +632 -0
  76. corems/molecular_id/calc/__init__.py +0 -0
  77. corems/molecular_id/calc/math_distance.py +1637 -0
  78. corems/molecular_id/data/FAMES_REF.msp +980 -0
  79. corems/molecular_id/data/PNNLMetV20191015.msp +157267 -0
  80. corems/molecular_id/factory/EI_SQL.py +650 -0
  81. corems/molecular_id/factory/MolecularLookupTable.py +914 -0
  82. corems/molecular_id/factory/__init__.py +0 -0
  83. corems/molecular_id/factory/classification.py +884 -0
  84. corems/molecular_id/factory/lipid_molecular_metadata.py +50 -0
  85. corems/molecular_id/factory/molecularSQL.py +827 -0
  86. corems/molecular_id/factory/spectrum_search_results.py +119 -0
  87. corems/molecular_id/input/__init__.py +0 -0
  88. corems/molecular_id/input/nistMSI.py +148 -0
  89. corems/molecular_id/search/__init__.py +0 -0
  90. corems/molecular_id/search/compoundSearch.py +214 -0
  91. corems/molecular_id/search/database_interfaces.py +1527 -0
  92. corems/molecular_id/search/findOxygenPeaks.py +330 -0
  93. corems/molecular_id/search/lcms_spectral_search.py +348 -0
  94. corems/molecular_id/search/molecularFormulaSearch.py +1117 -0
  95. corems/molecular_id/search/priorityAssignment.py +723 -0
  96. corems/ms_peak/__init__.py +0 -0
  97. corems/ms_peak/calc/MSPeakCalc.py +1010 -0
  98. corems/ms_peak/calc/__init__.py +0 -0
  99. corems/ms_peak/factory/MSPeakClasses.py +542 -0
  100. corems/ms_peak/factory/__init__.py +0 -0
  101. corems/transient/__init__.py +0 -0
  102. corems/transient/calc/TransientCalc.py +362 -0
  103. corems/transient/calc/__init__.py +0 -0
  104. corems/transient/factory/TransientClasses.py +457 -0
  105. corems/transient/factory/__init__.py +0 -0
  106. corems/transient/input/__init__.py +0 -0
  107. corems/transient/input/brukerSolarix.py +461 -0
  108. corems/transient/input/midasDatFile.py +172 -0
  109. corems-4.0.0.dist-info/METADATA +475 -0
  110. corems-4.0.0.dist-info/RECORD +171 -0
  111. corems-4.0.0.dist-info/WHEEL +5 -0
  112. corems-4.0.0.dist-info/licenses/LICENSE +22 -0
  113. corems-4.0.0.dist-info/top_level.txt +4 -0
  114. examples/archive/scripts/CoreMS_tutorial.py +94 -0
  115. examples/archive/scripts/DI HR-MS Halogens Bruker.py +196 -0
  116. examples/archive/scripts/DI HR-MS MassList.py +385 -0
  117. examples/archive/scripts/GC-MS MetabRef.py +213 -0
  118. examples/archive/scripts/GC-MS NetCDF.py +217 -0
  119. examples/archive/scripts/HR-MS Thermo Raw 21T.py +136 -0
  120. examples/archive/scripts/LC-ICPMS_metal_peaks.py +297 -0
  121. examples/archive/scripts/LCMS-Thermo.py +460 -0
  122. examples/archive/scripts/LCMS_isotopes.py +283 -0
  123. examples/archive/scripts/MSParams_example.py +21 -0
  124. examples/archive/scripts/Molecular Formula Data Aggreation.py +84 -0
  125. examples/archive/scripts/Single Mz Search.py +69 -0
  126. examples/test_notebooks.py +145 -0
  127. ext_lib/ChemstationMSFileReader.dll +0 -0
  128. ext_lib/ChemstationMSFileReader.xml +126 -0
  129. ext_lib/RawFileReaderLicense.doc +0 -0
  130. ext_lib/ThermoFisher.CommonCore.BackgroundSubtraction.dll +0 -0
  131. ext_lib/ThermoFisher.CommonCore.BackgroundSubtraction.xml +2307 -0
  132. ext_lib/ThermoFisher.CommonCore.Data.dll +0 -0
  133. ext_lib/ThermoFisher.CommonCore.Data.xml +28974 -0
  134. ext_lib/ThermoFisher.CommonCore.MassPrecisionEstimator.dll +0 -0
  135. ext_lib/ThermoFisher.CommonCore.MassPrecisionEstimator.xml +241 -0
  136. ext_lib/ThermoFisher.CommonCore.RawFileReader.dll +0 -0
  137. ext_lib/ThermoFisher.CommonCore.RawFileReader.xml +31174 -0
  138. ext_lib/__init__.py +0 -0
  139. ext_lib/dotnet/OpenMcdf.Extensions.dll +0 -0
  140. ext_lib/dotnet/OpenMcdf.dll +0 -0
  141. ext_lib/dotnet/OpenMcdf.xml +1154 -0
  142. ext_lib/dotnet/System.IO.FileSystem.AccessControl.dll +0 -0
  143. ext_lib/dotnet/System.IO.FileSystem.AccessControl.xml +506 -0
  144. ext_lib/dotnet/System.Security.AccessControl.dll +0 -0
  145. ext_lib/dotnet/System.Security.AccessControl.xml +2043 -0
  146. ext_lib/dotnet/System.Security.Principal.Windows.dll +0 -0
  147. ext_lib/dotnet/System.Security.Principal.Windows.xml +1011 -0
  148. ext_lib/dotnet/ThermoFisher.CommonCore.BackgroundSubtraction.dll +0 -0
  149. ext_lib/dotnet/ThermoFisher.CommonCore.BackgroundSubtraction.xml +2307 -0
  150. ext_lib/dotnet/ThermoFisher.CommonCore.Data.dll +0 -0
  151. ext_lib/dotnet/ThermoFisher.CommonCore.Data.xml +29148 -0
  152. ext_lib/dotnet/ThermoFisher.CommonCore.MassPrecisionEstimator.dll +0 -0
  153. ext_lib/dotnet/ThermoFisher.CommonCore.MassPrecisionEstimator.xml +241 -0
  154. ext_lib/dotnet/ThermoFisher.CommonCore.RawFileReader.dll +0 -0
  155. ext_lib/dotnet/ThermoFisher.CommonCore.RawFileReader.xml +31492 -0
  156. ext_lib/version +18 -0
  157. support_code/atom_parsers/AtomsDescription.py +359 -0
  158. support_code/atom_parsers/CreateAtomsDescription.py +56 -0
  159. support_code/nmdc/filefinder.py +90 -0
  160. support_code/nmdc/lipidomics/lipidomics_workflow.py +748 -0
  161. support_code/nmdc/lipidomics/manifest_examples.py +49 -0
  162. support_code/nmdc/metabolomics/gcms_workflow.py +158 -0
  163. support_code/nmdc/metabolomics/lcms_metabolomics_targeted_search.py +59 -0
  164. support_code/nmdc/metabolomics/lcms_metabolomics_workflow.py +248 -0
  165. support_code/nmdc/metabolomics/metabolomics_collection.py +628 -0
  166. support_code/nmdc/metadata/dms_api.py +42 -0
  167. support_code/nmdc/nom/archived_scripts/nmdc_metadata_gen.py +288 -0
  168. support_code/nmdc/nom/archived_scripts/nom_grow_workflow.py +209 -0
  169. support_code/nmdc/nom/nom_workflow.py +312 -0
  170. support_code/windows_only_importers/BrukerCompassXtract.py +180 -0
  171. support_code/windows_only_importers/ThermoMSFileReader.py +405 -0
@@ -0,0 +1,249 @@
1
+ __author__ = "Yuri E. Corilo"
2
+ __date__ = "Jun 09, 2021"
3
+
4
+ from threading import Thread
5
+ from dataclasses import dataclass
6
+ from typing import List
7
+
8
+
9
+ @dataclass
10
+ class SearchResults:
11
+ calculated_mz: float
12
+ exp_mz: float
13
+ error: float
14
+ tolerance: float
15
+
16
+
17
+ class MZSearch(Thread):
18
+ def __init__(
19
+ self,
20
+ exp_mzs: List[float],
21
+ calculated_mzs: List[float],
22
+ tolerance,
23
+ method="ppm",
24
+ average_target_mz=True,
25
+ ):
26
+ """
27
+ Parameters
28
+ ----------
29
+ calculated_mzs: [float] calculated m/z
30
+ exp_mzs: [float] experimental m/z
31
+ method: string,
32
+ ppm or ppb
33
+ call run to trigger the m/z search algorithm
34
+ or start if using it as thread
35
+ """
36
+ Thread.__init__(self)
37
+ # placeholder for the results
38
+ self._matched_mz = {}
39
+
40
+ self._calculated_mzs = calculated_mzs
41
+
42
+ self._matched_mz = {}
43
+
44
+ self._averaged_target_mz = []
45
+
46
+ self._exp_mzs = exp_mzs
47
+
48
+ self._tolerance = tolerance
49
+ self.method = method
50
+
51
+ if average_target_mz:
52
+ self.colapse_calculated()
53
+
54
+ @property
55
+ def results(self):
56
+ """{calculated_mz: [SearchResults]}
57
+ contains the results of the search
58
+ """
59
+ return self._matched_mz
60
+
61
+ @property
62
+ def averaged_target_mz(self):
63
+ """[float]
64
+ contains the average target m/z to be searched against
65
+ """
66
+ return self._averaged_target_mz
67
+
68
+ @property
69
+ def calculated_mzs(self):
70
+ """[float]
71
+ contains the mz target to be searched against
72
+ """
73
+ if self.averaged_target_mz:
74
+ return sorted(self.averaged_target_mz)
75
+ else:
76
+ return sorted(list(self._calculated_mzs))
77
+
78
+ @property
79
+ def exp_mzs(self):
80
+ """[float]
81
+ contains the exp mz to be searched against
82
+ """
83
+ return self._exp_mzs
84
+
85
+ @property
86
+ def method(self):
87
+ return self._method
88
+
89
+ @method.setter
90
+ def method(self, method):
91
+ """
92
+ method: string,
93
+ ppm or ppb
94
+ """
95
+ if method not in ["ppm" or "ppb"]:
96
+ raise ValueError("Method should be ppm or ppb")
97
+ self._method = method
98
+
99
+ @property
100
+ def tolerance(self):
101
+ return self._tolerance
102
+
103
+ @tolerance.setter
104
+ def tolerance(self, tolerance):
105
+ """
106
+ method: string,
107
+ ppm or ppb
108
+ """
109
+ if tolerance < 0:
110
+ raise ValueError("Tolerance needs to be a positive number")
111
+ self._tolerance = tolerance
112
+
113
+ def colapse_calculated(self):
114
+ if len(self.calculated_mzs) > 1:
115
+ all_mz = []
116
+ subset = set()
117
+
118
+ i = -1
119
+ while True:
120
+ i = i + 1
121
+
122
+ if i == len(self.calculated_mzs) - 1:
123
+ all_mz.append({i})
124
+ # print(i, 'break1')
125
+ break
126
+
127
+ if i >= len(self.calculated_mzs) - 1:
128
+ # print(i, 'break2')
129
+ break
130
+
131
+ error = self.calc_mz_error(
132
+ self.calculated_mzs[i], self.calculated_mzs[i + 1]
133
+ )
134
+
135
+ # print(self.tolerance)
136
+
137
+ check_error = self.check_ppm_error(self.tolerance, error)
138
+
139
+ if not check_error:
140
+ start_list = {i}
141
+
142
+ else:
143
+ start_list = set()
144
+
145
+ while check_error:
146
+ start_list.add(i)
147
+ start_list.add(i + 1)
148
+
149
+ i = i + 1
150
+
151
+ if i == len(self.calculated_mzs) - 1:
152
+ start_list.add(i)
153
+ # print(i, 'break3')
154
+ break
155
+
156
+ error = self.calc_mz_error(
157
+ self.calculated_mzs[i], self.calculated_mzs[i + 1]
158
+ )
159
+ check_error = self.check_ppm_error(self.tolerance, error)
160
+
161
+ if start_list:
162
+ all_mz.append(start_list)
163
+
164
+ results = []
165
+ for each in all_mz:
166
+ # print(each)
167
+ mzs = [self.calculated_mzs[i] for i in each]
168
+ results.append(sum(mzs) / len(mzs))
169
+
170
+ # print(results)
171
+ self._averaged_target_mz = results
172
+
173
+ def run(self):
174
+ dict_nominal_exp_mz = self.get_nominal_exp(self.exp_mzs)
175
+
176
+ for calculated_mz in self.calculated_mzs:
177
+ nominal_selected_mz = int(calculated_mz)
178
+
179
+ if nominal_selected_mz in dict_nominal_exp_mz.keys():
180
+ self.search_mz(self.results, dict_nominal_exp_mz, calculated_mz, 0)
181
+
182
+ elif nominal_selected_mz - 1 in dict_nominal_exp_mz.keys():
183
+ self.search_mz(self.results, dict_nominal_exp_mz, calculated_mz, -1)
184
+
185
+ elif nominal_selected_mz + 1 in dict_nominal_exp_mz.keys():
186
+ self.search_mz(self.results, dict_nominal_exp_mz, calculated_mz, +1)
187
+
188
+ else:
189
+ continue
190
+
191
+ @staticmethod
192
+ def calc_mz_error(calculated_mz, exp_mz, method="ppm"):
193
+ """
194
+ Parameters
195
+ ----------
196
+ calculated_mz: float,
197
+ exp_mz:float
198
+ method: string,
199
+ ppm or ppb
200
+ """
201
+ if method == "ppm":
202
+ multi_factor = 1000000
203
+
204
+ elif method == "ppb":
205
+ multi_factor = 1000000
206
+
207
+ else:
208
+ raise Exception(
209
+ "method needs to be ppm or ppb, \
210
+ you have entered %s"
211
+ % method
212
+ )
213
+
214
+ return ((exp_mz - calculated_mz) / calculated_mz) * multi_factor
215
+
216
+ @staticmethod
217
+ def check_ppm_error(tolerance, error):
218
+ return True if -tolerance <= error <= tolerance else False
219
+
220
+ def get_nominal_exp(self, exp_mzs) -> dict:
221
+ dict_nominal_exp_mz = {}
222
+
223
+ for exp_mz in exp_mzs:
224
+ nominal_mz = int(exp_mz)
225
+
226
+ if nominal_mz not in dict_nominal_exp_mz.keys():
227
+ dict_nominal_exp_mz[int(exp_mz)] = [exp_mz]
228
+ else:
229
+ dict_nominal_exp_mz[int(exp_mz)].append(exp_mz)
230
+
231
+ return dict_nominal_exp_mz
232
+
233
+ def search_mz(self, results, dict_nominal_exp_mz, calculated_mz, offset) -> None:
234
+ nominal_calculated_mz = int(calculated_mz) + offset
235
+ matched_n_precursors = dict_nominal_exp_mz.get(nominal_calculated_mz)
236
+
237
+ for precursor_mz in matched_n_precursors:
238
+ error = self.calc_mz_error(calculated_mz, precursor_mz, method=self.method)
239
+
240
+ if self.check_ppm_error(self.tolerance, error):
241
+ new_match = SearchResults(
242
+ calculated_mz, precursor_mz, error, self.tolerance
243
+ )
244
+
245
+ if calculated_mz not in results.keys():
246
+ results[calculated_mz] = [new_match]
247
+
248
+ else:
249
+ results[calculated_mz].append(new_match)