react-cheminfo 0.69.0 → 0.71.0

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 (616) hide show
  1. package/README.md +70 -2
  2. package/lib/about/core/providers.d.ts +6 -0
  3. package/lib/about/core/providers.d.ts.map +1 -1
  4. package/lib/about/core/providers.js +7 -0
  5. package/lib/about/core/providers.js.map +1 -1
  6. package/lib/about/ui/AboutProvidedBy.js +34 -0
  7. package/lib/about/ui/AboutProvidedBy.js.map +1 -1
  8. package/lib/chart/ui/useChartPointer.d.ts +9 -1
  9. package/lib/chart/ui/useChartPointer.d.ts.map +1 -1
  10. package/lib/chart/ui/useChartPointer.js +11 -3
  11. package/lib/chart/ui/useChartPointer.js.map +1 -1
  12. package/lib/credits/core/credits.d.ts +41 -0
  13. package/lib/credits/core/credits.d.ts.map +1 -1
  14. package/lib/credits/core/credits.js +50 -0
  15. package/lib/credits/core/credits.js.map +1 -1
  16. package/lib/download/core/drawingMarkup.d.ts +8 -1
  17. package/lib/download/core/drawingMarkup.d.ts.map +1 -1
  18. package/lib/download/core/drawingMarkup.js +13 -1
  19. package/lib/download/core/drawingMarkup.js.map +1 -1
  20. package/lib/download/core/figurePng.d.ts +14 -0
  21. package/lib/download/core/figurePng.d.ts.map +1 -1
  22. package/lib/download/core/figurePng.js +21 -6
  23. package/lib/download/core/figurePng.js.map +1 -1
  24. package/lib/download/core/figureSvg.d.ts.map +1 -1
  25. package/lib/download/core/figureSvg.js +5 -3
  26. package/lib/download/core/figureSvg.js.map +1 -1
  27. package/lib/download/core/figureTarget.d.ts +13 -0
  28. package/lib/download/core/figureTarget.d.ts.map +1 -1
  29. package/lib/download/core/figureTarget.js +25 -5
  30. package/lib/download/core/figureTarget.js.map +1 -1
  31. package/lib/download/core/svgBounds.d.ts +15 -0
  32. package/lib/download/core/svgBounds.d.ts.map +1 -1
  33. package/lib/download/core/svgBounds.js +20 -0
  34. package/lib/download/core/svgBounds.js.map +1 -1
  35. package/lib/download/core/svgToPng.d.ts.map +1 -1
  36. package/lib/download/core/svgToPng.js +4 -2
  37. package/lib/download/core/svgToPng.js.map +1 -1
  38. package/lib/format/core/relativeTime.d.ts +8 -3
  39. package/lib/format/core/relativeTime.d.ts.map +1 -1
  40. package/lib/format/core/relativeTime.js +19 -7
  41. package/lib/format/core/relativeTime.js.map +1 -1
  42. package/lib/host/core/connectHost.d.ts +25 -34
  43. package/lib/host/core/connectHost.d.ts.map +1 -1
  44. package/lib/host/core/connectHost.js +43 -89
  45. package/lib/host/core/connectHost.js.map +1 -1
  46. package/lib/host/core/hostOutputs.d.ts +58 -0
  47. package/lib/host/core/hostOutputs.d.ts.map +1 -0
  48. package/lib/host/core/hostOutputs.js +151 -0
  49. package/lib/host/core/hostOutputs.js.map +1 -0
  50. package/lib/host/core/index.d.ts +9 -3
  51. package/lib/host/core/index.d.ts.map +1 -1
  52. package/lib/host/core/index.js +4 -1
  53. package/lib/host/core/index.js.map +1 -1
  54. package/lib/host/core/irKinds.d.ts +124 -0
  55. package/lib/host/core/irKinds.d.ts.map +1 -0
  56. package/lib/host/core/irKinds.js +46 -0
  57. package/lib/host/core/irKinds.js.map +1 -0
  58. package/lib/host/core/kinds.d.ts +13 -5
  59. package/lib/host/core/kinds.d.ts.map +1 -1
  60. package/lib/host/core/kinds.js +11 -5
  61. package/lib/host/core/kinds.js.map +1 -1
  62. package/lib/host/core/protocol.d.ts +50 -7
  63. package/lib/host/core/protocol.d.ts.map +1 -1
  64. package/lib/host/core/protocol.js +10 -6
  65. package/lib/host/core/protocol.js.map +1 -1
  66. package/lib/host/core/selectInputs.d.ts +37 -0
  67. package/lib/host/core/selectInputs.d.ts.map +1 -0
  68. package/lib/host/core/selectInputs.js +110 -0
  69. package/lib/host/core/selectInputs.js.map +1 -0
  70. package/lib/host/testing/sciPeaks.d.ts +31 -0
  71. package/lib/host/testing/sciPeaks.d.ts.map +1 -1
  72. package/lib/host/testing/sciPeaks.js +73 -0
  73. package/lib/host/testing/sciPeaks.js.map +1 -1
  74. package/lib/host/testing/standInHost.d.ts +9 -1
  75. package/lib/host/testing/standInHost.d.ts.map +1 -1
  76. package/lib/host/testing/standInHost.js +19 -1
  77. package/lib/host/testing/standInHost.js.map +1 -1
  78. package/lib/host/ui/useHostConnection.d.ts +13 -5
  79. package/lib/host/ui/useHostConnection.d.ts.map +1 -1
  80. package/lib/host/ui/useHostConnection.js +4 -3
  81. package/lib/host/ui/useHostConnection.js.map +1 -1
  82. package/lib/host-testing.d.ts +2 -2
  83. package/lib/host-testing.d.ts.map +1 -1
  84. package/lib/host-testing.js +2 -2
  85. package/lib/host-testing.js.map +1 -1
  86. package/lib/i18n/core/chromeCatalog.d.ts +1 -1
  87. package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
  88. package/lib/ir/core/handPicking.d.ts +58 -0
  89. package/lib/ir/core/handPicking.d.ts.map +1 -0
  90. package/lib/ir/core/handPicking.js +130 -0
  91. package/lib/ir/core/handPicking.js.map +1 -0
  92. package/lib/ir/core/index.d.ts +3 -0
  93. package/lib/ir/core/index.d.ts.map +1 -1
  94. package/lib/ir/core/index.js +3 -0
  95. package/lib/ir/core/index.js.map +1 -1
  96. package/lib/ir/core/irBandState.d.ts +57 -0
  97. package/lib/ir/core/irBandState.d.ts.map +1 -0
  98. package/lib/ir/core/irBandState.js +119 -0
  99. package/lib/ir/core/irBandState.js.map +1 -0
  100. package/lib/ir/core/irCommands.d.ts +11 -0
  101. package/lib/ir/core/irCommands.d.ts.map +1 -1
  102. package/lib/ir/core/irCommands.js +6 -0
  103. package/lib/ir/core/irCommands.js.map +1 -1
  104. package/lib/ir/core/irPeaks.d.ts +28 -0
  105. package/lib/ir/core/irPeaks.d.ts.map +1 -0
  106. package/lib/ir/core/irPeaks.js +66 -0
  107. package/lib/ir/core/irPeaks.js.map +1 -0
  108. package/lib/ir/core/irReducer.d.ts +8 -0
  109. package/lib/ir/core/irReducer.d.ts.map +1 -1
  110. package/lib/ir/core/irReducer.js +15 -32
  111. package/lib/ir/core/irReducer.js.map +1 -1
  112. package/lib/ir/core/irSpectrum.d.ts +15 -0
  113. package/lib/ir/core/irSpectrum.d.ts.map +1 -1
  114. package/lib/ir/core/irSpectrum.js.map +1 -1
  115. package/lib/ir/core/irState.d.ts +9 -6
  116. package/lib/ir/core/irState.d.ts.map +1 -1
  117. package/lib/ir/core/irState.js +10 -6
  118. package/lib/ir/core/irState.js.map +1 -1
  119. package/lib/ir/core/pickBands.d.ts +14 -0
  120. package/lib/ir/core/pickBands.d.ts.map +1 -1
  121. package/lib/ir/core/pickBands.js +39 -33
  122. package/lib/ir/core/pickBands.js.map +1 -1
  123. package/lib/ir/core/ramanBands.d.ts +9 -1
  124. package/lib/ir/core/ramanBands.d.ts.map +1 -1
  125. package/lib/ir/core/ramanBands.js +2 -2
  126. package/lib/ir/core/ramanBands.js.map +1 -1
  127. package/lib/ir/core/spectrumBands.d.ts +46 -0
  128. package/lib/ir/core/spectrumBands.d.ts.map +1 -0
  129. package/lib/ir/core/spectrumBands.js +98 -0
  130. package/lib/ir/core/spectrumBands.js.map +1 -0
  131. package/lib/ir/ui/BandRow.d.ts +5 -0
  132. package/lib/ir/ui/BandRow.d.ts.map +1 -1
  133. package/lib/ir/ui/BandRow.js +4 -3
  134. package/lib/ir/ui/BandRow.js.map +1 -1
  135. package/lib/ir/ui/BandsPanel.d.ts +5 -0
  136. package/lib/ir/ui/BandsPanel.d.ts.map +1 -1
  137. package/lib/ir/ui/BandsPanel.js +36 -16
  138. package/lib/ir/ui/BandsPanel.js.map +1 -1
  139. package/lib/ir/ui/BandsToolbar.d.ts +9 -0
  140. package/lib/ir/ui/BandsToolbar.d.ts.map +1 -0
  141. package/lib/ir/ui/BandsToolbar.js +61 -0
  142. package/lib/ir/ui/BandsToolbar.js.map +1 -0
  143. package/lib/ir/ui/IrCanvas.d.ts +2 -1
  144. package/lib/ir/ui/IrCanvas.d.ts.map +1 -1
  145. package/lib/ir/ui/IrCanvas.js +19 -5
  146. package/lib/ir/ui/IrCanvas.js.map +1 -1
  147. package/lib/ir/ui/IrChart.d.ts.map +1 -1
  148. package/lib/ir/ui/IrChart.js +8 -1
  149. package/lib/ir/ui/IrChart.js.map +1 -1
  150. package/lib/ir/ui/IrDocumentationDialog.js +1 -1
  151. package/lib/ir/ui/IrDocumentationDialog.js.map +1 -1
  152. package/lib/ir/ui/IrEditor.d.ts +4 -2
  153. package/lib/ir/ui/IrEditor.d.ts.map +1 -1
  154. package/lib/ir/ui/IrEditor.js.map +1 -1
  155. package/lib/ir/ui/IrShell.d.ts.map +1 -1
  156. package/lib/ir/ui/IrShell.js +6 -0
  157. package/lib/ir/ui/IrShell.js.map +1 -1
  158. package/lib/ir/ui/IrStatusBar.d.ts.map +1 -1
  159. package/lib/ir/ui/IrStatusBar.js +1 -1
  160. package/lib/ir/ui/IrStatusBar.js.map +1 -1
  161. package/lib/ir/ui/IrToolbar.d.ts +4 -3
  162. package/lib/ir/ui/IrToolbar.d.ts.map +1 -1
  163. package/lib/ir/ui/IrToolbar.js +5 -4
  164. package/lib/ir/ui/IrToolbar.js.map +1 -1
  165. package/lib/ir/ui/VibrationalEditor.d.ts +2 -1
  166. package/lib/ir/ui/VibrationalEditor.d.ts.map +1 -1
  167. package/lib/ir/ui/VibrationalEditor.js.map +1 -1
  168. package/lib/ir/ui/irActions.d.ts +5 -0
  169. package/lib/ir/ui/irActions.d.ts.map +1 -1
  170. package/lib/ir/ui/irActions.js +6 -0
  171. package/lib/ir/ui/irActions.js.map +1 -1
  172. package/lib/ir/ui/irChartProps.d.ts +4 -1
  173. package/lib/ir/ui/irChartProps.d.ts.map +1 -1
  174. package/lib/ir/ui/useIrEditor.d.ts +5 -11
  175. package/lib/ir/ui/useIrEditor.d.ts.map +1 -1
  176. package/lib/ir/ui/useIrEditor.js +17 -18
  177. package/lib/ir/ui/useIrEditor.js.map +1 -1
  178. package/lib/locales/de.json +63 -0
  179. package/lib/locales/en.json +63 -0
  180. package/lib/locales/es.json +63 -0
  181. package/lib/locales/fr.json +63 -0
  182. package/lib/locales/it.json +63 -0
  183. package/lib/mass/core/analyseSpectrum.d.ts +85 -0
  184. package/lib/mass/core/analyseSpectrum.d.ts.map +1 -0
  185. package/lib/mass/core/analyseSpectrum.js +101 -0
  186. package/lib/mass/core/analyseSpectrum.js.map +1 -0
  187. package/lib/mass/core/ascendingTrace.d.ts +24 -0
  188. package/lib/mass/core/ascendingTrace.d.ts.map +1 -0
  189. package/lib/mass/core/ascendingTrace.js +57 -0
  190. package/lib/mass/core/ascendingTrace.js.map +1 -0
  191. package/lib/mass/core/centroidPeaks.d.ts +77 -0
  192. package/lib/mass/core/centroidPeaks.d.ts.map +1 -0
  193. package/lib/mass/core/centroidPeaks.js +62 -0
  194. package/lib/mass/core/centroidPeaks.js.map +1 -0
  195. package/lib/mass/core/detectMassFormat.d.ts +24 -0
  196. package/lib/mass/core/detectMassFormat.d.ts.map +1 -0
  197. package/lib/mass/core/detectMassFormat.js +105 -0
  198. package/lib/mass/core/detectMassFormat.js.map +1 -0
  199. package/lib/mass/core/downloadSpectra.d.ts +24 -0
  200. package/lib/mass/core/downloadSpectra.d.ts.map +1 -0
  201. package/lib/mass/core/downloadSpectra.js +35 -0
  202. package/lib/mass/core/downloadSpectra.js.map +1 -0
  203. package/lib/mass/core/fromJcamp.d.ts +46 -0
  204. package/lib/mass/core/fromJcamp.d.ts.map +1 -0
  205. package/lib/mass/core/fromJcamp.js +123 -0
  206. package/lib/mass/core/fromJcamp.js.map +1 -0
  207. package/lib/mass/core/fromText.d.ts +30 -0
  208. package/lib/mass/core/fromText.d.ts.map +1 -0
  209. package/lib/mass/core/fromText.js +39 -0
  210. package/lib/mass/core/fromText.js.map +1 -0
  211. package/lib/mass/core/index.d.ts +70 -0
  212. package/lib/mass/core/index.d.ts.map +1 -0
  213. package/lib/mass/core/index.js +42 -0
  214. package/lib/mass/core/index.js.map +1 -0
  215. package/lib/mass/core/jcampTechnique.d.ts +38 -0
  216. package/lib/mass/core/jcampTechnique.d.ts.map +1 -0
  217. package/lib/mass/core/jcampTechnique.js +70 -0
  218. package/lib/mass/core/jcampTechnique.js.map +1 -0
  219. package/lib/mass/core/labelStackBox.d.ts +49 -0
  220. package/lib/mass/core/labelStackBox.d.ts.map +1 -0
  221. package/lib/mass/core/labelStackBox.js +44 -0
  222. package/lib/mass/core/labelStackBox.js.map +1 -0
  223. package/lib/mass/core/labelledPeaks.d.ts +79 -0
  224. package/lib/mass/core/labelledPeaks.d.ts.map +1 -0
  225. package/lib/mass/core/labelledPeaks.js +74 -0
  226. package/lib/mass/core/labelledPeaks.js.map +1 -0
  227. package/lib/mass/core/loadMassSpectra.d.ts +57 -0
  228. package/lib/mass/core/loadMassSpectra.d.ts.map +1 -0
  229. package/lib/mass/core/loadMassSpectra.js +45 -0
  230. package/lib/mass/core/loadMassSpectra.js.map +1 -0
  231. package/lib/mass/core/loadedMassSpectrum.d.ts +42 -0
  232. package/lib/mass/core/loadedMassSpectrum.d.ts.map +1 -0
  233. package/lib/mass/core/loadedMassSpectrum.js +15 -0
  234. package/lib/mass/core/loadedMassSpectrum.js.map +1 -0
  235. package/lib/mass/core/massCommands.d.ts +170 -0
  236. package/lib/mass/core/massCommands.d.ts.map +1 -0
  237. package/lib/mass/core/massCommands.js +95 -0
  238. package/lib/mass/core/massCommands.js.map +1 -0
  239. package/lib/mass/core/massDomain.d.ts +121 -0
  240. package/lib/mass/core/massDomain.d.ts.map +1 -0
  241. package/lib/mass/core/massDomain.js +179 -0
  242. package/lib/mass/core/massDomain.js.map +1 -0
  243. package/lib/mass/core/massEditorApi.d.ts +65 -0
  244. package/lib/mass/core/massEditorApi.d.ts.map +1 -0
  245. package/lib/mass/core/massEditorApi.js +10 -0
  246. package/lib/mass/core/massEditorApi.js.map +1 -0
  247. package/lib/mass/core/massFormat.d.ts +78 -0
  248. package/lib/mass/core/massFormat.d.ts.map +1 -0
  249. package/lib/mass/core/massFormat.js +168 -0
  250. package/lib/mass/core/massFormat.js.map +1 -0
  251. package/lib/mass/core/massMeta.d.ts +85 -0
  252. package/lib/mass/core/massMeta.d.ts.map +1 -0
  253. package/lib/mass/core/massMeta.js +182 -0
  254. package/lib/mass/core/massMeta.js.map +1 -0
  255. package/lib/mass/core/massReducer.d.ts +82 -0
  256. package/lib/mass/core/massReducer.d.ts.map +1 -0
  257. package/lib/mass/core/massReducer.js +163 -0
  258. package/lib/mass/core/massReducer.js.map +1 -0
  259. package/lib/mass/core/massResolution.d.ts +92 -0
  260. package/lib/mass/core/massResolution.d.ts.map +1 -0
  261. package/lib/mass/core/massResolution.js +126 -0
  262. package/lib/mass/core/massResolution.js.map +1 -0
  263. package/lib/mass/core/massSidePanels.d.ts +28 -0
  264. package/lib/mass/core/massSidePanels.d.ts.map +1 -0
  265. package/lib/mass/core/massSidePanels.js +12 -0
  266. package/lib/mass/core/massSidePanels.js.map +1 -0
  267. package/lib/mass/core/massSpectrum.d.ts +206 -0
  268. package/lib/mass/core/massSpectrum.d.ts.map +1 -0
  269. package/lib/mass/core/massSpectrum.js +41 -0
  270. package/lib/mass/core/massSpectrum.js.map +1 -0
  271. package/lib/mass/core/massState.d.ts +145 -0
  272. package/lib/mass/core/massState.d.ts.map +1 -0
  273. package/lib/mass/core/massState.js +102 -0
  274. package/lib/mass/core/massState.js.map +1 -0
  275. package/lib/mass/core/massStateEdits.d.ts +51 -0
  276. package/lib/mass/core/massStateEdits.d.ts.map +1 -0
  277. package/lib/mass/core/massStateEdits.js +90 -0
  278. package/lib/mass/core/massStateEdits.js.map +1 -0
  279. package/lib/mass/core/massSummary.d.ts +77 -0
  280. package/lib/mass/core/massSummary.d.ts.map +1 -0
  281. package/lib/mass/core/massSummary.js +174 -0
  282. package/lib/mass/core/massSummary.js.map +1 -0
  283. package/lib/mass/core/mzDecimalsSetting.d.ts +36 -0
  284. package/lib/mass/core/mzDecimalsSetting.d.ts.map +1 -0
  285. package/lib/mass/core/mzDecimalsSetting.js +42 -0
  286. package/lib/mass/core/mzDecimalsSetting.js.map +1 -0
  287. package/lib/mass/core/nearestPeak.d.ts +75 -0
  288. package/lib/mass/core/nearestPeak.d.ts.map +1 -0
  289. package/lib/mass/core/nearestPeak.js +99 -0
  290. package/lib/mass/core/nearestPeak.js.map +1 -0
  291. package/lib/mass/core/peakLabelLines.d.ts +77 -0
  292. package/lib/mass/core/peakLabelLines.d.ts.map +1 -0
  293. package/lib/mass/core/peakLabelLines.js +54 -0
  294. package/lib/mass/core/peakLabelLines.js.map +1 -0
  295. package/lib/mass/core/peakLabelPlan.d.ts +109 -0
  296. package/lib/mass/core/peakLabelPlan.d.ts.map +1 -0
  297. package/lib/mass/core/peakLabelPlan.js +143 -0
  298. package/lib/mass/core/peakLabelPlan.js.map +1 -0
  299. package/lib/mass/core/peakTable.d.ts +54 -0
  300. package/lib/mass/core/peakTable.d.ts.map +1 -0
  301. package/lib/mass/core/peakTable.js +53 -0
  302. package/lib/mass/core/peakTable.js.map +1 -0
  303. package/lib/mass/core/resolutionOf.d.ts +60 -0
  304. package/lib/mass/core/resolutionOf.d.ts.map +1 -0
  305. package/lib/mass/core/resolutionOf.js +84 -0
  306. package/lib/mass/core/resolutionOf.js.map +1 -0
  307. package/lib/mass/core/scanFilter.d.ts +25 -0
  308. package/lib/mass/core/scanFilter.d.ts.map +1 -0
  309. package/lib/mass/core/scanFilter.js +107 -0
  310. package/lib/mass/core/scanFilter.js.map +1 -0
  311. package/lib/mass/core/spectrumJcamp.d.ts +47 -0
  312. package/lib/mass/core/spectrumJcamp.d.ts.map +1 -0
  313. package/lib/mass/core/spectrumJcamp.js +167 -0
  314. package/lib/mass/core/spectrumJcamp.js.map +1 -0
  315. package/lib/mass/core/toMassSpectrum.d.ts +67 -0
  316. package/lib/mass/core/toMassSpectrum.d.ts.map +1 -0
  317. package/lib/mass/core/toMassSpectrum.js +78 -0
  318. package/lib/mass/core/toMassSpectrum.js.map +1 -0
  319. package/lib/mass/core/traceIcon.d.ts +82 -0
  320. package/lib/mass/core/traceIcon.d.ts.map +1 -0
  321. package/lib/mass/core/traceIcon.js +66 -0
  322. package/lib/mass/core/traceIcon.js.map +1 -0
  323. package/lib/mass/core/writtenResolution.d.ts +40 -0
  324. package/lib/mass/core/writtenResolution.d.ts.map +1 -0
  325. package/lib/mass/core/writtenResolution.js +77 -0
  326. package/lib/mass/core/writtenResolution.js.map +1 -0
  327. package/lib/mass/ui/MassAboutDialog.d.ts +16 -0
  328. package/lib/mass/ui/MassAboutDialog.d.ts.map +1 -0
  329. package/lib/mass/ui/MassAboutDialog.js +44 -0
  330. package/lib/mass/ui/MassAboutDialog.js.map +1 -0
  331. package/lib/mass/ui/MassCanvas.d.ts +46 -0
  332. package/lib/mass/ui/MassCanvas.d.ts.map +1 -0
  333. package/lib/mass/ui/MassCanvas.js +84 -0
  334. package/lib/mass/ui/MassCanvas.js.map +1 -0
  335. package/lib/mass/ui/MassChart.d.ts +21 -0
  336. package/lib/mass/ui/MassChart.d.ts.map +1 -0
  337. package/lib/mass/ui/MassChart.js +139 -0
  338. package/lib/mass/ui/MassChart.js.map +1 -0
  339. package/lib/mass/ui/MassCommandProvider.d.ts +15 -0
  340. package/lib/mass/ui/MassCommandProvider.d.ts.map +1 -0
  341. package/lib/mass/ui/MassCommandProvider.js +14 -0
  342. package/lib/mass/ui/MassCommandProvider.js.map +1 -0
  343. package/lib/mass/ui/MassCommandTooltip.d.ts +16 -0
  344. package/lib/mass/ui/MassCommandTooltip.d.ts.map +1 -0
  345. package/lib/mass/ui/MassCommandTooltip.js +22 -0
  346. package/lib/mass/ui/MassCommandTooltip.js.map +1 -0
  347. package/lib/mass/ui/MassDocumentationDialog.d.ts +18 -0
  348. package/lib/mass/ui/MassDocumentationDialog.d.ts.map +1 -0
  349. package/lib/mass/ui/MassDocumentationDialog.js +70 -0
  350. package/lib/mass/ui/MassDocumentationDialog.js.map +1 -0
  351. package/lib/mass/ui/MassEditor.d.ts +78 -0
  352. package/lib/mass/ui/MassEditor.d.ts.map +1 -0
  353. package/lib/mass/ui/MassEditor.js +42 -0
  354. package/lib/mass/ui/MassEditor.js.map +1 -0
  355. package/lib/mass/ui/MassHeader.d.ts +12 -0
  356. package/lib/mass/ui/MassHeader.d.ts.map +1 -0
  357. package/lib/mass/ui/MassHeader.js +20 -0
  358. package/lib/mass/ui/MassHeader.js.map +1 -0
  359. package/lib/mass/ui/MassLogo.d.ts +21 -0
  360. package/lib/mass/ui/MassLogo.d.ts.map +1 -0
  361. package/lib/mass/ui/MassLogo.js +36 -0
  362. package/lib/mass/ui/MassLogo.js.map +1 -0
  363. package/lib/mass/ui/MassPointerTracker.d.ts +44 -0
  364. package/lib/mass/ui/MassPointerTracker.d.ts.map +1 -0
  365. package/lib/mass/ui/MassPointerTracker.js +29 -0
  366. package/lib/mass/ui/MassPointerTracker.js.map +1 -0
  367. package/lib/mass/ui/MassShell.d.ts +29 -0
  368. package/lib/mass/ui/MassShell.d.ts.map +1 -0
  369. package/lib/mass/ui/MassShell.js +133 -0
  370. package/lib/mass/ui/MassShell.js.map +1 -0
  371. package/lib/mass/ui/MassSidePanel.d.ts +32 -0
  372. package/lib/mass/ui/MassSidePanel.d.ts.map +1 -0
  373. package/lib/mass/ui/MassSidePanel.js +44 -0
  374. package/lib/mass/ui/MassSidePanel.js.map +1 -0
  375. package/lib/mass/ui/MassStateProvider.d.ts +19 -0
  376. package/lib/mass/ui/MassStateProvider.d.ts.map +1 -0
  377. package/lib/mass/ui/MassStateProvider.js +16 -0
  378. package/lib/mass/ui/MassStateProvider.js.map +1 -0
  379. package/lib/mass/ui/MassStatusBar.d.ts +15 -0
  380. package/lib/mass/ui/MassStatusBar.d.ts.map +1 -0
  381. package/lib/mass/ui/MassStatusBar.js +50 -0
  382. package/lib/mass/ui/MassStatusBar.js.map +1 -0
  383. package/lib/mass/ui/MassToolbar.d.ts +24 -0
  384. package/lib/mass/ui/MassToolbar.d.ts.map +1 -0
  385. package/lib/mass/ui/MassToolbar.js +36 -0
  386. package/lib/mass/ui/MassToolbar.js.map +1 -0
  387. package/lib/mass/ui/MetadataPanel.d.ts +35 -0
  388. package/lib/mass/ui/MetadataPanel.d.ts.map +1 -0
  389. package/lib/mass/ui/MetadataPanel.js +100 -0
  390. package/lib/mass/ui/MetadataPanel.js.map +1 -0
  391. package/lib/mass/ui/MzDecimalsMenu.d.ts +28 -0
  392. package/lib/mass/ui/MzDecimalsMenu.d.ts.map +1 -0
  393. package/lib/mass/ui/MzDecimalsMenu.js +40 -0
  394. package/lib/mass/ui/MzDecimalsMenu.js.map +1 -0
  395. package/lib/mass/ui/PeakLabels.d.ts +93 -0
  396. package/lib/mass/ui/PeakLabels.d.ts.map +1 -0
  397. package/lib/mass/ui/PeakLabels.js +91 -0
  398. package/lib/mass/ui/PeakLabels.js.map +1 -0
  399. package/lib/mass/ui/PeakTable.d.ts +34 -0
  400. package/lib/mass/ui/PeakTable.d.ts.map +1 -0
  401. package/lib/mass/ui/PeakTable.js +49 -0
  402. package/lib/mass/ui/PeakTable.js.map +1 -0
  403. package/lib/mass/ui/PeaksPanel.d.ts +31 -0
  404. package/lib/mass/ui/PeaksPanel.d.ts.map +1 -0
  405. package/lib/mass/ui/PeaksPanel.js +53 -0
  406. package/lib/mass/ui/PeaksPanel.js.map +1 -0
  407. package/lib/mass/ui/SpectraPanel.d.ts +17 -0
  408. package/lib/mass/ui/SpectraPanel.d.ts.map +1 -0
  409. package/lib/mass/ui/SpectraPanel.js +76 -0
  410. package/lib/mass/ui/SpectraPanel.js.map +1 -0
  411. package/lib/mass/ui/SpectrumRow.d.ts +26 -0
  412. package/lib/mass/ui/SpectrumRow.d.ts.map +1 -0
  413. package/lib/mass/ui/SpectrumRow.js +141 -0
  414. package/lib/mass/ui/SpectrumRow.js.map +1 -0
  415. package/lib/mass/ui/SpectrumTrace.d.ts +46 -0
  416. package/lib/mass/ui/SpectrumTrace.d.ts.map +1 -0
  417. package/lib/mass/ui/SpectrumTrace.js +68 -0
  418. package/lib/mass/ui/SpectrumTrace.js.map +1 -0
  419. package/lib/mass/ui/index.d.ts +69 -0
  420. package/lib/mass/ui/index.d.ts.map +1 -0
  421. package/lib/mass/ui/index.js +42 -0
  422. package/lib/mass/ui/index.js.map +1 -0
  423. package/lib/mass/ui/massActions.d.ts +52 -0
  424. package/lib/mass/ui/massActions.d.ts.map +1 -0
  425. package/lib/mass/ui/massActions.js +62 -0
  426. package/lib/mass/ui/massActions.js.map +1 -0
  427. package/lib/mass/ui/massChartProps.d.ts +128 -0
  428. package/lib/mass/ui/massChartProps.d.ts.map +1 -0
  429. package/lib/mass/ui/massChartProps.js +14 -0
  430. package/lib/mass/ui/massChartProps.js.map +1 -0
  431. package/lib/mass/ui/massCommandContext.d.ts +36 -0
  432. package/lib/mass/ui/massCommandContext.d.ts.map +1 -0
  433. package/lib/mass/ui/massCommandContext.js +45 -0
  434. package/lib/mass/ui/massCommandContext.js.map +1 -0
  435. package/lib/mass/ui/massHostPanels.d.ts +48 -0
  436. package/lib/mass/ui/massHostPanels.d.ts.map +1 -0
  437. package/lib/mass/ui/massHostPanels.js +41 -0
  438. package/lib/mass/ui/massHostPanels.js.map +1 -0
  439. package/lib/mass/ui/massStateContext.d.ts +26 -0
  440. package/lib/mass/ui/massStateContext.d.ts.map +1 -0
  441. package/lib/mass/ui/massStateContext.js +37 -0
  442. package/lib/mass/ui/massStateContext.js.map +1 -0
  443. package/lib/mass/ui/useIntensityZoom.d.ts +20 -0
  444. package/lib/mass/ui/useIntensityZoom.d.ts.map +1 -0
  445. package/lib/mass/ui/useIntensityZoom.js +42 -0
  446. package/lib/mass/ui/useIntensityZoom.js.map +1 -0
  447. package/lib/mass/ui/useMassEditor.d.ts +52 -0
  448. package/lib/mass/ui/useMassEditor.d.ts.map +1 -0
  449. package/lib/mass/ui/useMassEditor.js +93 -0
  450. package/lib/mass/ui/useMassEditor.js.map +1 -0
  451. package/lib/mass/ui/useMassFiles.d.ts +22 -0
  452. package/lib/mass/ui/useMassFiles.d.ts.map +1 -0
  453. package/lib/mass/ui/useMassFiles.js +71 -0
  454. package/lib/mass/ui/useMassFiles.js.map +1 -0
  455. package/lib/mass/ui/useMassHandle.d.ts +15 -0
  456. package/lib/mass/ui/useMassHandle.d.ts.map +1 -0
  457. package/lib/mass/ui/useMassHandle.js +35 -0
  458. package/lib/mass/ui/useMassHandle.js.map +1 -0
  459. package/lib/mass/ui/useMassPointer.d.ts +70 -0
  460. package/lib/mass/ui/useMassPointer.d.ts.map +1 -0
  461. package/lib/mass/ui/useMassPointer.js +57 -0
  462. package/lib/mass/ui/useMassPointer.js.map +1 -0
  463. package/lib/mass/ui/useMassShortcuts.d.ts +21 -0
  464. package/lib/mass/ui/useMassShortcuts.d.ts.map +1 -0
  465. package/lib/mass/ui/useMassShortcuts.js +66 -0
  466. package/lib/mass/ui/useMassShortcuts.js.map +1 -0
  467. package/lib/mass/ui/useMassSide.d.ts +27 -0
  468. package/lib/mass/ui/useMassSide.d.ts.map +1 -0
  469. package/lib/mass/ui/useMassSide.js +45 -0
  470. package/lib/mass/ui/useMassSide.js.map +1 -0
  471. package/lib/mass/ui/useMassZoom.d.ts +92 -0
  472. package/lib/mass/ui/useMassZoom.d.ts.map +1 -0
  473. package/lib/mass/ui/useMassZoom.js +65 -0
  474. package/lib/mass/ui/useMassZoom.js.map +1 -0
  475. package/lib/mass.d.ts +16 -0
  476. package/lib/mass.d.ts.map +1 -0
  477. package/lib/mass.js +16 -0
  478. package/lib/mass.js.map +1 -0
  479. package/lib/panel/ui/PanelRail.d.ts.map +1 -1
  480. package/lib/panel/ui/PanelRail.js +6 -1
  481. package/lib/panel/ui/PanelRail.js.map +1 -1
  482. package/lib/slides/ui/slideSanitizeSchema.d.ts +3 -2
  483. package/lib/slides/ui/slideSanitizeSchema.d.ts.map +1 -1
  484. package/lib/slides/ui/slideSanitizeSchema.js +82 -2
  485. package/lib/slides/ui/slideSanitizeSchema.js.map +1 -1
  486. package/package.json +6 -1
  487. package/src/about/core/providers.ts +7 -0
  488. package/src/about/ui/AboutProvidedBy.tsx +49 -0
  489. package/src/chart/ui/useChartPointer.ts +18 -4
  490. package/src/credits/core/credits.ts +53 -0
  491. package/src/download/core/drawingMarkup.ts +18 -1
  492. package/src/download/core/figurePng.ts +21 -8
  493. package/src/download/core/figureSvg.ts +5 -2
  494. package/src/download/core/figureTarget.ts +28 -3
  495. package/src/download/core/svgBounds.ts +21 -0
  496. package/src/download/core/svgToPng.ts +3 -4
  497. package/src/format/core/relativeTime.ts +29 -7
  498. package/src/host/core/connectHost.ts +77 -120
  499. package/src/host/core/hostOutputs.ts +197 -0
  500. package/src/host/core/index.ts +13 -7
  501. package/src/host/core/irKinds.ts +92 -0
  502. package/src/host/core/kinds.ts +16 -6
  503. package/src/host/core/protocol.ts +50 -8
  504. package/src/host/core/selectInputs.ts +145 -0
  505. package/src/host/testing/sciPeaks.ts +140 -0
  506. package/src/host/testing/standInHost.ts +30 -5
  507. package/src/host/ui/useHostConnection.ts +17 -8
  508. package/src/host-testing.ts +4 -0
  509. package/src/ir/core/handPicking.ts +154 -0
  510. package/src/ir/core/index.ts +14 -0
  511. package/src/ir/core/irBandState.ts +155 -0
  512. package/src/ir/core/irCommands.ts +7 -0
  513. package/src/ir/core/irPeaks.ts +79 -0
  514. package/src/ir/core/irReducer.ts +27 -34
  515. package/src/ir/core/irSpectrum.ts +16 -0
  516. package/src/ir/core/irState.ts +15 -8
  517. package/src/ir/core/pickBands.ts +46 -39
  518. package/src/ir/core/ramanBands.ts +2 -2
  519. package/src/ir/core/spectrumBands.ts +113 -0
  520. package/src/ir/ui/BandRow.tsx +20 -2
  521. package/src/ir/ui/BandsPanel.tsx +46 -88
  522. package/src/ir/ui/BandsToolbar.tsx +152 -0
  523. package/src/ir/ui/IrCanvas.tsx +22 -11
  524. package/src/ir/ui/IrChart.tsx +10 -1
  525. package/src/ir/ui/IrDocumentationDialog.tsx +7 -0
  526. package/src/ir/ui/IrEditor.tsx +4 -2
  527. package/src/ir/ui/IrShell.tsx +5 -0
  528. package/src/ir/ui/IrStatusBar.tsx +4 -1
  529. package/src/ir/ui/IrToolbar.tsx +14 -5
  530. package/src/ir/ui/VibrationalEditor.tsx +2 -1
  531. package/src/ir/ui/irActions.ts +11 -0
  532. package/src/ir/ui/irChartProps.ts +4 -1
  533. package/src/ir/ui/useIrEditor.ts +21 -21
  534. package/src/locales/de.json +63 -0
  535. package/src/locales/en.json +63 -0
  536. package/src/locales/es.json +63 -0
  537. package/src/locales/fr.json +63 -0
  538. package/src/locales/it.json +63 -0
  539. package/src/mass/core/analyseSpectrum.ts +191 -0
  540. package/src/mass/core/ascendingTrace.ts +62 -0
  541. package/src/mass/core/centroidPeaks.ts +114 -0
  542. package/src/mass/core/detectMassFormat.ts +113 -0
  543. package/src/mass/core/downloadSpectra.ts +52 -0
  544. package/src/mass/core/fromJcamp.ts +151 -0
  545. package/src/mass/core/fromText.ts +58 -0
  546. package/src/mass/core/index.ts +194 -0
  547. package/src/mass/core/jcampTechnique.ts +87 -0
  548. package/src/mass/core/labelStackBox.ts +75 -0
  549. package/src/mass/core/labelledPeaks.ts +135 -0
  550. package/src/mass/core/loadMassSpectra.ts +86 -0
  551. package/src/mass/core/loadedMassSpectrum.ts +43 -0
  552. package/src/mass/core/massCommands.ts +156 -0
  553. package/src/mass/core/massDomain.ts +229 -0
  554. package/src/mass/core/massEditorApi.ts +68 -0
  555. package/src/mass/core/massFormat.ts +187 -0
  556. package/src/mass/core/massMeta.ts +239 -0
  557. package/src/mass/core/massReducer.ts +232 -0
  558. package/src/mass/core/massResolution.ts +169 -0
  559. package/src/mass/core/massSidePanels.ts +27 -0
  560. package/src/mass/core/massSpectrum.ts +220 -0
  561. package/src/mass/core/massState.ts +206 -0
  562. package/src/mass/core/massStateEdits.ts +104 -0
  563. package/src/mass/core/massSummary.ts +213 -0
  564. package/src/mass/core/mzDecimalsSetting.ts +52 -0
  565. package/src/mass/core/nearestPeak.ts +130 -0
  566. package/src/mass/core/peakLabelLines.ts +112 -0
  567. package/src/mass/core/peakLabelPlan.ts +246 -0
  568. package/src/mass/core/peakTable.ts +82 -0
  569. package/src/mass/core/resolutionOf.ts +100 -0
  570. package/src/mass/core/scanFilter.ts +119 -0
  571. package/src/mass/core/spectrumJcamp.ts +186 -0
  572. package/src/mass/core/toMassSpectrum.ts +126 -0
  573. package/src/mass/core/traceIcon.ts +105 -0
  574. package/src/mass/core/writtenResolution.ts +81 -0
  575. package/src/mass/ui/MassAboutDialog.tsx +89 -0
  576. package/src/mass/ui/MassCanvas.tsx +170 -0
  577. package/src/mass/ui/MassChart.tsx +266 -0
  578. package/src/mass/ui/MassCommandProvider.tsx +34 -0
  579. package/src/mass/ui/MassCommandTooltip.tsx +36 -0
  580. package/src/mass/ui/MassDocumentationDialog.tsx +136 -0
  581. package/src/mass/ui/MassEditor.tsx +130 -0
  582. package/src/mass/ui/MassHeader.tsx +38 -0
  583. package/src/mass/ui/MassLogo.tsx +84 -0
  584. package/src/mass/ui/MassPointerTracker.tsx +72 -0
  585. package/src/mass/ui/MassShell.tsx +237 -0
  586. package/src/mass/ui/MassSidePanel.tsx +107 -0
  587. package/src/mass/ui/MassStateProvider.tsx +32 -0
  588. package/src/mass/ui/MassStatusBar.tsx +108 -0
  589. package/src/mass/ui/MassToolbar.tsx +120 -0
  590. package/src/mass/ui/MetadataPanel.tsx +201 -0
  591. package/src/mass/ui/MzDecimalsMenu.tsx +86 -0
  592. package/src/mass/ui/PeakLabels.tsx +242 -0
  593. package/src/mass/ui/PeakTable.tsx +199 -0
  594. package/src/mass/ui/PeaksPanel.tsx +182 -0
  595. package/src/mass/ui/SpectraPanel.tsx +153 -0
  596. package/src/mass/ui/SpectrumRow.tsx +246 -0
  597. package/src/mass/ui/SpectrumTrace.tsx +119 -0
  598. package/src/mass/ui/index.ts +69 -0
  599. package/src/mass/ui/massActions.ts +109 -0
  600. package/src/mass/ui/massChartProps.ts +130 -0
  601. package/src/mass/ui/massCommandContext.tsx +65 -0
  602. package/src/mass/ui/massHostPanels.ts +71 -0
  603. package/src/mass/ui/massStateContext.ts +48 -0
  604. package/src/mass/ui/useIntensityZoom.ts +55 -0
  605. package/src/mass/ui/useMassEditor.ts +156 -0
  606. package/src/mass/ui/useMassFiles.ts +91 -0
  607. package/src/mass/ui/useMassHandle.ts +58 -0
  608. package/src/mass/ui/useMassPointer.ts +120 -0
  609. package/src/mass/ui/useMassShortcuts.ts +85 -0
  610. package/src/mass/ui/useMassSide.ts +63 -0
  611. package/src/mass/ui/useMassZoom.ts +157 -0
  612. package/src/mass.ts +16 -0
  613. package/src/panel/ui/PanelRail.tsx +5 -1
  614. package/src/slides/ui/slideSanitizeSchema.ts +86 -2
  615. package/styles/chrome.css +7 -0
  616. package/styles/slides.css +47 -0
@@ -0,0 +1,182 @@
1
+ /**
2
+ * What the file says about how the spectrum was acquired, made displayable.
3
+ *
4
+ * A JCAMP written by a Thermo instrument carries the answer to every question a
5
+ * chemist asks of a spectrum — which analyser, which polarity, which collision
6
+ * energy — but carries it in whichever of two record bags the exporting
7
+ * software felt like using, and leaves half of them blank. A JCAMP of the older
8
+ * MS dialect states the same facts under standard records of its own,
9
+ * `##.SPECTROMETER TYPE=` and `##.IONIZATION MODE=`. So each field names the
10
+ * records it may live in, in the order they are worth trying, and anything
11
+ * still blank falls back to the instrument's own scan description.
12
+ *
13
+ * A field that is absent or empty is left out entirely rather than shown as a
14
+ * dash, which is what keeps the table short enough to read at a glance: every
15
+ * line in it is a fact the file actually stated.
16
+ */
17
+ import { parseScanFilter } from "./scanFilter.js";
18
+ /**
19
+ * Read the acquisition metadata a file carries.
20
+ *
21
+ * Returns `null` rather than an empty table when the file said nothing at all,
22
+ * so the panel can leave the section out instead of drawing a heading over
23
+ * nothing — the normal outcome for a pasted peak list.
24
+ * @param source - The record bags the reader recovered.
25
+ * @returns The metadata, or `null` when the file carries none.
26
+ */
27
+ export function buildMassMeta(source) {
28
+ const bags = { info: source.info ?? {}, meta: source.meta ?? {} };
29
+ const conditions = recordText(bags.meta.CONDITIONS);
30
+ const derived = parseScanFilter(conditions);
31
+ const fields = [];
32
+ for (const field of FIELDS) {
33
+ const value = firstValue(bags, field.records) || (derived[field.label] ?? '');
34
+ if (value)
35
+ fields.push({ label: field.label, value });
36
+ }
37
+ const title = recordText(source.title) || recordText(bags.info.TITLE) || null;
38
+ const molecularFormula = firstValue(bags, MOLECULAR_FORMULA_RECORDS) || null;
39
+ if (fields.length === 0 && !title && !conditions && !molecularFormula) {
40
+ return null;
41
+ }
42
+ return { title, molecularFormula, fields, conditions: conditions || null };
43
+ }
44
+ /**
45
+ * The record a row of the table is written back to.
46
+ *
47
+ * The inverse of the table below, and it lives beside it for that reason: a
48
+ * writer holding a second list of record names is a writer whose `MSLEVEL`
49
+ * becomes `MS_LEVEL` the day a spelling is added here, and the round trip then
50
+ * loses the field without anything going wrong loudly. Only the first of each
51
+ * row's records is offered — the others exist to read what other exporters
52
+ * wrote, and writing our own file is not the place to imitate them.
53
+ * @param label - The row's label, as the table displays it.
54
+ * @returns The record, or `null` when the label is not one of the table's rows.
55
+ */
56
+ export function metaRecord(label) {
57
+ for (const field of FIELDS) {
58
+ if (field.label === label)
59
+ return field.records[0] ?? null;
60
+ }
61
+ return null;
62
+ }
63
+ /**
64
+ * A standard record.
65
+ * @param key - Its label without spaces.
66
+ * @returns The record.
67
+ */
68
+ function standard(key) {
69
+ return { key, info: true };
70
+ }
71
+ /**
72
+ * A `$`-prefixed record.
73
+ * @param key - Its label without the `$`.
74
+ * @returns The record.
75
+ */
76
+ function custom(key) {
77
+ return { key, info: false };
78
+ }
79
+ /**
80
+ * Every row the table can show, in the order it shows them.
81
+ *
82
+ * The order runs from what the sample was measured on down to who measured it,
83
+ * because that is the order a chemist reads a method in. The alternatives on
84
+ * each row are the records real exporters were observed to write: `IONISATION`
85
+ * and `IONIZATION` are the same field spelled by two vendors.
86
+ *
87
+ * `EXPERIMENT` is deliberately not a fallback for the collision energy, however
88
+ * tempting the name is: on real Orbitrap exports it holds what kind of run this
89
+ * was — `MS/MS`, `Accurate mass` — while the energy is in `REPORT` or in the
90
+ * instrument's own scan filter.
91
+ */
92
+ const FIELDS = [
93
+ { label: 'Source', records: [standard('ORIGIN')] },
94
+ {
95
+ label: 'Instrument',
96
+ records: [custom('INSTRUMENT'), standard('SPECTROMETER/DATASYSTEM')],
97
+ },
98
+ {
99
+ label: 'Analyser',
100
+ records: [
101
+ custom('ANALYZER'),
102
+ custom('ANALYSER'),
103
+ standard('.SPECTROMETERTYPE'),
104
+ ],
105
+ },
106
+ {
107
+ label: 'Instrument parameters',
108
+ records: [standard('.INSTRUMENTPARAMETERS')],
109
+ },
110
+ {
111
+ label: 'Ionization',
112
+ records: [
113
+ custom('IONISATION'),
114
+ custom('IONIZATION'),
115
+ standard('.IONIZATIONMODE'),
116
+ ],
117
+ },
118
+ { label: 'Inlet', records: [custom('INJECTION'), standard('.INLET')] },
119
+ { label: 'Polarity', records: [custom('MODE'), custom('POLARITY')] },
120
+ { label: 'Experiment', records: [custom('EXPERIMENT')] },
121
+ { label: 'MS level', records: [custom('MSLEVEL')] },
122
+ { label: 'Isolation m/z', records: [custom('ISOLATION')] },
123
+ {
124
+ label: 'Collision energy',
125
+ records: [custom('COLLISIONENERGY'), custom('REPORT')],
126
+ },
127
+ { label: 'Scan range', records: [custom('SCANRANGE')] },
128
+ { label: 'Retention time', records: [custom('RETENTIONTIME')] },
129
+ { label: 'Scans', records: [custom('SCANS')] },
130
+ { label: 'Averaged scans', records: [custom('AVERAGEDSCANS')] },
131
+ { label: 'Raw file', records: [custom('RAWFILE')] },
132
+ {
133
+ label: 'Operator',
134
+ records: [custom('USER'), custom('OWNER'), standard('OWNER')],
135
+ },
136
+ { label: 'Note', records: [custom('NOTE')] },
137
+ ];
138
+ /**
139
+ * Where the formula the file was measured for may be stated: the standard
140
+ * record first, then the one an accurate-mass tool writes its answer into.
141
+ */
142
+ const MOLECULAR_FORMULA_RECORDS = [
143
+ standard('MOLFORM'),
144
+ standard('MOLFORMULA'),
145
+ custom('ACCURATE_MF'),
146
+ ];
147
+ /**
148
+ * The first record that holds anything.
149
+ * @param bags - The records to look in.
150
+ * @param records - The records to try, in order.
151
+ * @returns The value as the file states it, or `''` when none is populated.
152
+ */
153
+ function firstValue(bags, records) {
154
+ for (const record of records) {
155
+ const value = recordText((record.info ? bags.info : bags.meta)[record.key]);
156
+ if (value)
157
+ return value;
158
+ }
159
+ return '';
160
+ }
161
+ /**
162
+ * A record's value as a trimmed string, whatever dynamic typing made of it.
163
+ *
164
+ * `jcampconverter` reads `##$SCANS=1` as the number `1` and a record written
165
+ * twice as an array of both values, so a row that is only ever shown has to
166
+ * accept all three shapes. A repeated record shows its first occurrence, which
167
+ * is the one the exporter wrote for the acquisition rather than for a later
168
+ * reprocessing of it.
169
+ * @param value - The record, as dynamic typing left it.
170
+ * @returns The value as text, `''` when there is none.
171
+ */
172
+ export function recordText(value) {
173
+ if (typeof value === 'string')
174
+ return value.trim();
175
+ if (typeof value === 'number' || typeof value === 'boolean') {
176
+ return String(value);
177
+ }
178
+ if (Array.isArray(value))
179
+ return recordText(value[0]);
180
+ return '';
181
+ }
182
+ //# sourceMappingURL=massMeta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"massMeta.js","sourceRoot":"","sources":["../../../src/mass/core/massMeta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAoClD;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,MAAsB;IAClD,MAAM,IAAI,GAAS,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;IACxE,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GACT,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAClE,IAAI,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC9E,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,EAAE,yBAAyB,CAAC,IAAI,IAAI,CAAC;IAC7E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,IAAI,IAAI,EAAE,CAAC;AAC7E,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAkBD;;;;GAIG;AACH,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED;;;;GAIG;AACH,SAAS,MAAM,CAAC,GAAW;IACzB,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,GAAyB;IACnC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE;IAClD;QACE,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,yBAAyB,CAAC,CAAC;KACrE;IACD;QACE,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE;YACP,MAAM,CAAC,UAAU,CAAC;YAClB,MAAM,CAAC,UAAU,CAAC;YAClB,QAAQ,CAAC,mBAAmB,CAAC;SAC9B;KACF;IACD;QACE,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;KAC7C;IACD;QACE,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE;YACP,MAAM,CAAC,YAAY,CAAC;YACpB,MAAM,CAAC,YAAY,CAAC;YACpB,QAAQ,CAAC,iBAAiB,CAAC;SAC5B;KACF;IACD,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE;IACtE,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE;IACpE,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE;IACxD,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE;IACnD,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE;IAC1D;QACE,KAAK,EAAE,kBAAkB;QACzB,OAAO,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;KACvD;IACD,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE;IACvD,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE;IAC/D,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;IAC9C,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE;IAC/D,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE;IACnD;QACE,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;KAC9D;IACD,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;CAC7C,CAAC;AAEF;;;GAGG;AACH,MAAM,yBAAyB,GAA8B;IAC3D,QAAQ,CAAC,SAAS,CAAC;IACnB,QAAQ,CAAC,YAAY,CAAC;IACtB,MAAM,CAAC,aAAa,CAAC;CACtB,CAAC;AAEF;;;;;GAKG;AACH,SAAS,UAAU,CAAC,IAAU,EAAE,OAAkC;IAChE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5E,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Every change the viewer can undergo, as one function over one object.
3
+ *
4
+ * A reducer rather than a graph of signals: a published component must not
5
+ * impose a state library on the page that mounts it, and two viewers on one
6
+ * page must not share a module-level singleton. The state is a plain object, so
7
+ * a host can save it, restore it and compare it.
8
+ *
9
+ * Every case returns the state **itself** when it has nothing to do, so a render
10
+ * memoised on the state is not defeated by an action that changed nothing —
11
+ * selecting the spectrum already selected, closing an error already closed.
12
+ */
13
+ import type { MassPanelId } from './massSidePanels.ts';
14
+ import type { MassDomain, MassSpectrum } from './massSpectrum.ts';
15
+ import type { MassSettings, MassState, MassTool, PartialMassState } from './massState.ts';
16
+ /**
17
+ * Which of a spectrum's two traces are drawn. Both are named every time,
18
+ * because they are an either/or: drawing one is also the gesture that puts the
19
+ * other away.
20
+ */
21
+ export interface SpectrumVisibility {
22
+ /** Whether the continuous trace is drawn. */
23
+ showProfile: boolean;
24
+ /** Whether the centroid sticks are drawn. */
25
+ showCentroid: boolean;
26
+ }
27
+ /** Everything that can be asked of the viewer. */
28
+ export type MassAction = {
29
+ type: 'addSpectra';
30
+ spectra: MassSpectrum[];
31
+ } | {
32
+ type: 'setSpectra';
33
+ spectra: MassSpectrum[];
34
+ } | {
35
+ type: 'removeSpectrum';
36
+ id: string;
37
+ } | {
38
+ type: 'renameSpectrum';
39
+ id: string;
40
+ name: string;
41
+ } | {
42
+ type: 'setSpectrumColor';
43
+ id: string;
44
+ color: string;
45
+ } | {
46
+ type: 'setSpectrumVisibility';
47
+ id: string;
48
+ visibility: SpectrumVisibility;
49
+ } | {
50
+ type: 'selectSpectrum';
51
+ id: string | null;
52
+ } | {
53
+ type: 'setDomain';
54
+ domain: MassDomain;
55
+ } | {
56
+ type: 'resetDomain';
57
+ } | {
58
+ type: 'setTool';
59
+ tool: MassTool;
60
+ } | {
61
+ type: 'togglePanel';
62
+ panelId: MassPanelId;
63
+ } | {
64
+ type: 'setError';
65
+ error: string | null;
66
+ } | {
67
+ type: 'setSettings';
68
+ settings: Partial<MassSettings>;
69
+ } | {
70
+ type: 'loadState';
71
+ state: PartialMassState;
72
+ } | {
73
+ type: 'clear';
74
+ };
75
+ /**
76
+ * Fold one action into the state.
77
+ * @param state - The state in force.
78
+ * @param action - What is being asked.
79
+ * @returns The new state, or the old one when nothing changed.
80
+ */
81
+ export declare function massReducer(state: MassState, action: MassAction): MassState;
82
+ //# sourceMappingURL=massReducer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"massReducer.d.ts","sourceRoot":"","sources":["../../../src/mass/core/massReducer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AASxB;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,WAAW,EAAE,OAAO,CAAC;IACrB,6CAA6C;IAC7C,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,kDAAkD;AAClD,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvD;IACE,IAAI,EAAE,uBAAuB,CAAC;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,kBAAkB,CAAC;CAChC,GACD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtB;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,CAkK3E"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Every change the viewer can undergo, as one function over one object.
3
+ *
4
+ * A reducer rather than a graph of signals: a published component must not
5
+ * impose a state library on the page that mounts it, and two viewers on one
6
+ * page must not share a module-level singleton. The state is a plain object, so
7
+ * a host can save it, restore it and compare it.
8
+ *
9
+ * Every case returns the state **itself** when it has nothing to do, so a render
10
+ * memoised on the state is not defeated by an action that changed nothing —
11
+ * selecting the spectrum already selected, closing an error already closed.
12
+ */
13
+ import { isMassWindow, mergeMassSettings } from "./massState.js";
14
+ import { arriving, mapSpectrum, restoreState, withError, } from "./massStateEdits.js";
15
+ /**
16
+ * Fold one action into the state.
17
+ * @param state - The state in force.
18
+ * @param action - What is being asked.
19
+ * @returns The new state, or the old one when nothing changed.
20
+ */
21
+ export function massReducer(state, action) {
22
+ switch (action.type) {
23
+ case 'addSpectra': {
24
+ const added = arriving(state, action.spectra);
25
+ if (added.length === 0)
26
+ return state;
27
+ return {
28
+ ...state,
29
+ data: { spectra: [...state.data.spectra, ...added] },
30
+ view: {
31
+ ...state.view,
32
+ // Whatever arrived is what somebody wants to look at, so it takes the
33
+ // selection — but only when nothing was selected, since a spectrum
34
+ // added for comparison must not steal the panels from the one being
35
+ // read.
36
+ selectedId: state.view.selectedId ?? added[0]?.id ?? null,
37
+ error: null,
38
+ },
39
+ };
40
+ }
41
+ case 'setSpectra': {
42
+ const spectra = arriving({ ...state, data: { spectra: [] } }, action.spectra);
43
+ return {
44
+ ...state,
45
+ data: { spectra },
46
+ view: {
47
+ ...state.view,
48
+ selectedId: spectra[0]?.id ?? null,
49
+ // Replacing what is drawn is the one change that throws the window
50
+ // away: a window over one spectrum's masses means nothing over
51
+ // another's, and the chart refits when it is handed `null`.
52
+ domain: null,
53
+ error: null,
54
+ },
55
+ };
56
+ }
57
+ case 'removeSpectrum': {
58
+ const spectra = state.data.spectra.filter((spectrum) => spectrum.id !== action.id);
59
+ if (spectra.length === state.data.spectra.length)
60
+ return state;
61
+ return {
62
+ ...state,
63
+ data: { spectra },
64
+ view: {
65
+ ...state.view,
66
+ selectedId: state.view.selectedId === action.id
67
+ ? (spectra[0]?.id ?? null)
68
+ : state.view.selectedId,
69
+ },
70
+ };
71
+ }
72
+ case 'renameSpectrum': {
73
+ const name = action.name.trim();
74
+ if (name === '') {
75
+ return withError(state, 'A spectrum needs a name to be called by.');
76
+ }
77
+ return mapSpectrum(state, action.id, (spectrum) => spectrum.name === name ? spectrum : { ...spectrum, name });
78
+ }
79
+ case 'setSpectrumColor': {
80
+ return mapSpectrum(state, action.id, (spectrum) => spectrum.color === action.color
81
+ ? spectrum
82
+ : { ...spectrum, color: action.color });
83
+ }
84
+ case 'setSpectrumVisibility': {
85
+ return mapSpectrum(state, action.id, (spectrum) => {
86
+ // A spectrum read from a peak table has no profile to draw, and asking
87
+ // for one must not leave it drawn as nothing at all.
88
+ const showProfile = action.visibility.showProfile && spectrum.profile !== null;
89
+ const { showCentroid } = action.visibility;
90
+ return spectrum.showProfile === showProfile &&
91
+ spectrum.showCentroid === showCentroid
92
+ ? spectrum
93
+ : { ...spectrum, showProfile, showCentroid };
94
+ });
95
+ }
96
+ case 'selectSpectrum': {
97
+ if (state.view.selectedId === action.id)
98
+ return state;
99
+ return { ...state, view: { ...state.view, selectedId: action.id } };
100
+ }
101
+ case 'setDomain': {
102
+ if (!isMassWindow(action.domain))
103
+ return state;
104
+ return { ...state, view: { ...state.view, domain: action.domain } };
105
+ }
106
+ case 'resetDomain': {
107
+ if (state.view.domain === null)
108
+ return state;
109
+ return { ...state, view: { ...state.view, domain: null } };
110
+ }
111
+ case 'setTool': {
112
+ if (state.view.tool === action.tool)
113
+ return state;
114
+ return { ...state, view: { ...state.view, tool: action.tool } };
115
+ }
116
+ case 'togglePanel': {
117
+ const { openPanelIds } = state.view;
118
+ const open = openPanelIds.includes(action.panelId);
119
+ return {
120
+ ...state,
121
+ view: {
122
+ ...state.view,
123
+ openPanelIds: open
124
+ ? openPanelIds.filter((id) => id !== action.panelId)
125
+ : [...openPanelIds, action.panelId],
126
+ },
127
+ };
128
+ }
129
+ case 'setError': {
130
+ if (state.view.error === action.error)
131
+ return state;
132
+ return { ...state, view: { ...state.view, error: action.error } };
133
+ }
134
+ case 'setSettings': {
135
+ const settings = mergeMassSettings(state.settings, action.settings);
136
+ const { showLabels, labelLimit, showCharges, mzDecimals } = state.settings;
137
+ if (settings.showLabels === showLabels &&
138
+ settings.labelLimit === labelLimit &&
139
+ settings.showCharges === showCharges &&
140
+ settings.mzDecimals === mzDecimals) {
141
+ return state;
142
+ }
143
+ return { ...state, settings };
144
+ }
145
+ case 'loadState': {
146
+ return restoreState(state, action.state);
147
+ }
148
+ case 'clear': {
149
+ if (state.data.spectra.length === 0 && state.view.error === null) {
150
+ return state;
151
+ }
152
+ return {
153
+ ...state,
154
+ data: { spectra: [] },
155
+ view: { ...state.view, selectedId: null, domain: null, error: null },
156
+ };
157
+ }
158
+ /* Every action is handled above, and TypeScript is what keeps that true
159
+ when one is added — so there is nothing for a fallback to do. */
160
+ // no default
161
+ }
162
+ }
163
+ //# sourceMappingURL=massReducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"massReducer.js","sourceRoot":"","sources":["../../../src/mass/core/massReducer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Whether a spectrum resolves masses finely enough for their decimals to mean
3
+ * anything.
4
+ *
5
+ * A peak table typed out of a low-resolution instrument report holds whole
6
+ * numbers — `163`, `325`, `487` — and writing them as `163.0000` claims four
7
+ * digits of accuracy nobody measured. A high-resolution measurement is the
8
+ * opposite case: `325.1129` and `325.1503` are different ions, and rounding them
9
+ * together loses the whole point of having measured them. Nothing about a single
10
+ * number says which of the two it is, so the answer is read off the spectrum.
11
+ *
12
+ * Three kinds of evidence are read, and the strongest one present decides —
13
+ * `decideResolution` is where they are weighed:
14
+ *
15
+ * 1. **The peaks themselves.** A profile carries the width of every peak, and
16
+ * the resolving power `m / Δm` at half height is what "high resolution" is
17
+ * defined by. This is a measurement, so it is believed over anything a file
18
+ * says about itself.
19
+ * 2. **What the file says the instrument was.** A Thermo scan filter starting
20
+ * `FTMS` is an Orbitrap, one starting `ITMS` an ion trap, and a JCAMP of the
21
+ * old MS dialect writes `##.INSTRUMENT PARAMETERS= LOW RESOLUTION` outright.
22
+ * 3. **How many decimals the masses were written with**, which is all a bare
23
+ * peak table has to say — `writtenResolution.ts`.
24
+ */
25
+ import type { MassMeta } from './massSpectrum.ts';
26
+ /** How finely a spectrum resolves masses. */
27
+ export type MassResolutionKind = 'high' | 'low' | 'nominal';
28
+ /** Which evidence the verdict was read from, the strongest first. */
29
+ export type MassResolutionBasis = 'peakWidth' | 'instrument' | 'decimals';
30
+ /** The verdict on one spectrum, and what it rests on. */
31
+ export interface MassResolution {
32
+ /** Whether the masses are resolved, resolved coarsely, or written whole. */
33
+ kind: MassResolutionKind;
34
+ /**
35
+ * The resolving power `m / Δm` at half height, the median over the tallest
36
+ * peaks — `null` unless it was measured, which needs a profile.
37
+ */
38
+ resolvingPower: number | null;
39
+ /** What the verdict was read from. */
40
+ basis: MassResolutionBasis;
41
+ /** How many decimals an m/z of this spectrum is written with. */
42
+ decimals: number;
43
+ }
44
+ /** A picked peak with the width the peak picking measured for it. */
45
+ export interface WidthPeak {
46
+ /** Where it sits, in m/z. */
47
+ x: number;
48
+ /** How tall it is. */
49
+ y: number;
50
+ /** Its width between inflection points, in m/z, as `ml-gsd` reports it. */
51
+ width: number;
52
+ }
53
+ /**
54
+ * The resolving power from which a spectrum counts as high resolution.
55
+ *
56
+ * Ten thousand at half height is the conventional threshold, and it falls in
57
+ * the gap between the two families of instrument rather than inside either:
58
+ * quadrupoles, ion traps and linear time-of-flights work at a few thousand at
59
+ * most, while reflectron time-of-flights, Orbitraps and FT-ICRs start above it.
60
+ */
61
+ export declare const HIGH_RESOLVING_POWER = 10000;
62
+ /** How many of the tallest peaks the resolving power is the median of. */
63
+ export declare const MEASURED_PEAKS = 20;
64
+ /** How many decimals an m/z is written with, for each kind of spectrum. */
65
+ export declare const MZ_DECIMALS: Readonly<Record<MassResolutionKind, number>>;
66
+ /**
67
+ * The resolving power measured on the peaks of a profile.
68
+ *
69
+ * The median over the tallest peaks rather than over all of them, because a
70
+ * peak a few counts above the noise has a width the noise decided, and rather
71
+ * than the base peak alone, because one peak sitting on an unresolved shoulder
72
+ * would decide the whole spectrum. The width `ml-gsd` reports is the distance
73
+ * between the inflection points, which is converted to the width at half height
74
+ * as a gaussian's is: what a resolving power is quoted against.
75
+ * @param peaks - The peaks the profile was picked into, each with its width.
76
+ * @returns The verdict, `null` when no peak carries a usable width.
77
+ */
78
+ export declare function measuredResolution(peaks: readonly WidthPeak[]): MassResolution | null;
79
+ /**
80
+ * The resolution the file says the instrument worked at, when it says so.
81
+ *
82
+ * Only the rows that name an instrument are read, and a high verdict is looked
83
+ * for first: an `LTQ-Orbitrap` names an ion trap and an Orbitrap, and the
84
+ * spectrum came out of the Orbitrap. A time-of-flight is deliberately left
85
+ * undecided — a reflectron one is high resolution and a linear one is not, and
86
+ * the name is the same.
87
+ * @param meta - What the file said about the acquisition.
88
+ * @returns The verdict, `null` when the file names no instrument it can be
89
+ * read off.
90
+ */
91
+ export declare function statedResolution(meta: MassMeta | null): MassResolution | null;
92
+ //# sourceMappingURL=massResolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"massResolution.d.ts","sourceRoot":"","sources":["../../../src/mass/core/massResolution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,6CAA6C;AAC7C,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAE5D,qEAAqE;AACrE,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;AAE1E,yDAAyD;AACzD,MAAM,WAAW,cAAc;IAC7B,4EAA4E;IAC5E,IAAI,EAAE,kBAAkB,CAAC;IACzB;;;OAGG;IACH,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,sCAAsC;IACtC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACxB,6BAA6B;IAC7B,CAAC,EAAE,MAAM,CAAC;IACV,sBAAsB;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,0EAA0E;AAC1E,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,2EAA2E;AAC3E,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAIpE,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,SAAS,EAAE,GAC1B,cAAc,GAAG,IAAI,CAyBvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,cAAc,GAAG,IAAI,CAmB7E"}