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,179 @@
1
+ /**
2
+ * The window a chart opens on, worked out from the spectra it was handed.
3
+ *
4
+ * This is what "zoom to fit" and the first render both call, so it has to be
5
+ * right for a peak table of four rows and for a profile scan of half a million
6
+ * points alike, and it has to answer something usable when it is handed nothing
7
+ * at all — a chart with no data is still mounted, still measured, and still
8
+ * builds its scales.
9
+ */
10
+ import { xMaxValue } from 'ml-spectra-processing';
11
+ /**
12
+ * How much air is left either side of the outermost peak, as a fraction.
13
+ *
14
+ * A stick drawn exactly on the axis reads as a spectrum that was cut off there;
15
+ * two percent is enough to show that it was not.
16
+ */
17
+ export const X_DOMAIN_PADDING = 0.02;
18
+ /**
19
+ * How far above the tallest peak the intensity axis runs.
20
+ *
21
+ * The base peak carries the label nobody wants to lose — its m/z and its
22
+ * intensity, on two lines — and it is drawn above the stick. Twenty percent is
23
+ * the room those lines take at the top of a chart of any usual height.
24
+ */
25
+ export const Y_DOMAIN_HEADROOM = 1.2;
26
+ /**
27
+ * The window that shows everything currently drawn.
28
+ *
29
+ * A spectrum marked `excludeFromDomain` is left out of the extents, because it
30
+ * is a preview rather than data: a predicted pattern that appears and
31
+ * disappears with the pointer would throw away the zoom the user set every
32
+ * time it moved the axes. The exclusion is dropped when it would leave nothing
33
+ * at all — previewing into an empty chart has to show the preview, not an empty
34
+ * axis from 0 to 1.
35
+ *
36
+ * In mirror mode the negative half is the reflection of the positive one rather
37
+ * than its own extent. Two spectra compared head-to-head are only comparable if
38
+ * a peak of the same height means the same intensity in both halves; giving each
39
+ * half its own scale makes the weaker spectrum look as intense as the stronger,
40
+ * which is precisely the comparison the view exists to make.
41
+ * @param spectra - What the chart draws.
42
+ * @param mirror - Whether the chart reflects its spectra about zero. Defaults
43
+ * to `false`.
44
+ * @returns The window, in m/z and in intensity.
45
+ */
46
+ export function fullDomain(spectra, mirror = false) {
47
+ const extent = traceExtent(spectra, false) ?? traceExtent(spectra, true);
48
+ if (extent === null)
49
+ return { x: [0, 1], y: [0, 1] };
50
+ const { xMinimum, xMaximum, yMaximum } = extent;
51
+ const padding = (xMaximum - xMinimum) * X_DOMAIN_PADDING;
52
+ // A single peak, or several at one m/z, has no width to take a fraction of.
53
+ const x = padding > 0
54
+ ? [xMinimum - padding, xMaximum + padding]
55
+ : [xMinimum - 1, xMaximum + 1];
56
+ const top = yMaximum > 0 ? yMaximum * Y_DOMAIN_HEADROOM : 1;
57
+ return { x, y: mirror ? [-top, top] : [0, top] };
58
+ }
59
+ /**
60
+ * What a fitted window was fitted *to*, as one string two renders can compare.
61
+ *
62
+ * The chart puts its window back to `fullDomain` when it is handed different
63
+ * data, and must not when the same data is merely drawn differently — so
64
+ * something has to tell the two apart. It is the identities that are compared
65
+ * and never the extents: a spectrum switched from its profile to its sticks
66
+ * moves the fitted window by a hair, and refitting on a hair throws away the
67
+ * zoom somebody set, which is the whole reason this exists. Loading a spectrum,
68
+ * closing one and reflecting the chart about zero are the changes that have to
69
+ * be shown, and every one of them shows up here.
70
+ *
71
+ * A spectrum kept out of the automatic domain is kept out of this too, for the
72
+ * reason it is kept out of the extents: a predicted pattern previewed under the
73
+ * pointer comes and goes with the pointer, and refitting on it would throw the
74
+ * zoom away every time a search result is read. The identities are joined by a
75
+ * character no identity holds, so `a b` and `a` then `b` are two fits.
76
+ * @param spectra - What the chart draws.
77
+ * @param mirror - Whether the chart reflects its spectra about zero. Defaults
78
+ * to `false`.
79
+ * @returns A string equal to itself exactly when a fit would be made to the
80
+ * same thing.
81
+ */
82
+ export function fittedTo(spectra, mirror = false) {
83
+ let key = mirror ? 'mirror' : 'upward';
84
+ for (const spectrum of spectra) {
85
+ if (spectrum.excludeFromDomain)
86
+ continue;
87
+ key += `\u0000${spectrum.id}`;
88
+ }
89
+ return key;
90
+ }
91
+ /**
92
+ * The tallest intensity among the traces a set of spectra currently draws.
93
+ *
94
+ * What "how tall is this chart" comes to, in the units the spectra are in, with
95
+ * the headroom `fullDomain` adds left off — so it answers a question about the
96
+ * measurement rather than about the plot. A preview kept out of the extents is
97
+ * kept out of this too, and a chart holding nothing but a preview is measured
98
+ * by it rather than answering zero.
99
+ * @param spectra - The spectra to measure, drawn or not.
100
+ * @returns The tallest intensity drawn, or `0` when nothing is.
101
+ */
102
+ export function basePeakOf(spectra) {
103
+ const extent = traceExtent(spectra, false) ?? traceExtent(spectra, true);
104
+ return extent === null ? 0 : extent.yMaximum;
105
+ }
106
+ /**
107
+ * How much of the axis framing a peak shows, either side of its mass.
108
+ *
109
+ * Wide enough to hold the isotopologue cluster of a singly charged ion, because
110
+ * a peak is read in its cluster and not alone: the M+1 says how much carbon it
111
+ * holds and the spacing says what charge it carries.
112
+ */
113
+ export const MZ_FRAME_HALF_WIDTH = 2.5;
114
+ /**
115
+ * The window that frames one mass, keeping the intensity axis where it was.
116
+ *
117
+ * The vertical extent is deliberately not recomputed from what falls inside the
118
+ * new window: a click is a request to look somewhere else along the m/z axis,
119
+ * and rescaling the height at the same time makes whatever was just clicked fill
120
+ * the plot, so every peak looks like the base peak and the one number the eye
121
+ * reads off a spectrum stops meaning anything. It is only worked out from the
122
+ * spectra when the chart has no window of its own to keep.
123
+ * @param mz - The mass to frame.
124
+ * @param spectra - What the chart is drawing, for the height it opens on.
125
+ * @param domain - The window the chart is showing, `null` when it is fitting.
126
+ * @param options - How wide a window, and whether the chart is mirrored.
127
+ * @returns The window to show.
128
+ */
129
+ export function mzFrame(mz, spectra, domain, options = {}) {
130
+ const { halfWidth = MZ_FRAME_HALF_WIDTH, mirror = false } = options;
131
+ const y = domain?.y ?? fullDomain(spectra, mirror).y;
132
+ return { x: [mz - halfWidth, mz + halfWidth], y };
133
+ }
134
+ /**
135
+ * The extremes over every trace that is currently drawn.
136
+ * @param spectra - What the chart draws.
137
+ * @param includeExcluded - Whether to count the spectra kept out of the domain.
138
+ * @returns The extremes, or `null` when nothing is drawn.
139
+ */
140
+ function traceExtent(spectra, includeExcluded) {
141
+ let extent = null;
142
+ for (const spectrum of spectra) {
143
+ if (!includeExcluded && spectrum.excludeFromDomain)
144
+ continue;
145
+ if (spectrum.showProfile && spectrum.profile !== null) {
146
+ extent = widen(extent, spectrum.profile);
147
+ }
148
+ if (spectrum.showCentroid)
149
+ extent = widen(extent, spectrum.centroid);
150
+ }
151
+ return extent;
152
+ }
153
+ /**
154
+ * Grow an extent to cover one more trace.
155
+ *
156
+ * The m/z ends are read off the first and last sample rather than searched for:
157
+ * `MassTrace.x` is increasing by construction, so a scan would walk several
158
+ * hundred thousand points of a profile to learn what index zero already says.
159
+ * @param extent - What has been covered so far, `null` for nothing.
160
+ * @param trace - The trace to cover as well.
161
+ * @returns The grown extent, unchanged when the trace holds no point.
162
+ */
163
+ function widen(extent, trace) {
164
+ const { x, y } = trace;
165
+ if (x.length === 0 || y.length === 0)
166
+ return extent;
167
+ const first = x[0];
168
+ const last = x.at(-1);
169
+ const tallest = xMaxValue(y);
170
+ if (extent === null) {
171
+ return { xMinimum: first, xMaximum: last, yMaximum: tallest };
172
+ }
173
+ return {
174
+ xMinimum: Math.min(extent.xMinimum, first),
175
+ xMaximum: Math.max(extent.xMaximum, last),
176
+ yMaximum: Math.max(extent.yMaximum, tallest),
177
+ };
178
+ }
179
+ //# sourceMappingURL=massDomain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"massDomain.js","sourceRoot":"","sources":["../../../src/mass/core/massDomain.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAErC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAErC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,UAAU,CACxB,OAAgC,EAChC,MAAM,GAAG,KAAK;IAEd,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzE,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAErD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAChD,MAAM,OAAO,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,gBAAgB,CAAC;IACzD,4EAA4E;IAC5E,MAAM,CAAC,GACL,OAAO,GAAG,CAAC;QACT,CAAC,CAAC,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC;QAC1C,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACnD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,QAAQ,CACtB,OAAgC,EAChC,MAAM,GAAG,KAAK;IAEd,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACvC,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,QAAQ,CAAC,iBAAiB;YAAE,SAAS;QACzC,GAAG,IAAI,SAAS,QAAQ,CAAC,EAAE,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,OAAgC;IACzD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzE,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAiBvC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,OAAO,CACrB,EAAU,EACV,OAAgC,EAChC,MAAyB,EACzB,UAA0B,EAAE;IAE5B,MAAM,EAAE,SAAS,GAAG,mBAAmB,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACpE,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;AACpD,CAAC;AAYD;;;;;GAKG;AACH,SAAS,WAAW,CAClB,OAAgC,EAChC,eAAwB;IAExB,IAAI,MAAM,GAAuB,IAAI,CAAC;IACtC,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,eAAe,IAAI,QAAQ,CAAC,iBAAiB;YAAE,SAAS;QAC7D,IAAI,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACtD,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,QAAQ,CAAC,YAAY;YAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,KAAK,CACZ,MAA0B,EAC1B,KAAgB;IAEhB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAW,CAAC;IAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,CAAC;IAChC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAChE,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC1C,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;QACzC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;KAC7C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * The handle a host drives the viewer through.
3
+ *
4
+ * A handle rather than props, for the reason NMRium uses one: "frame this peak"
5
+ * and "take these spectra" are *gestures*, and a gesture expressed as a prop has
6
+ * to change to be obeyed — so asking for the same window twice does nothing the
7
+ * second time, and a host ends up inventing a nonce to make it work.
8
+ */
9
+ import type { MassDomain, MassSpectrum } from './massSpectrum.ts';
10
+ /** How much room to leave either side of a mass a host asks to be framed. */
11
+ export interface ZoomToMzOptions {
12
+ /**
13
+ * How much of the m/z axis to show either side of the mass.
14
+ * @default MZ_FRAME_HALF_WIDTH
15
+ */
16
+ halfWidth?: number;
17
+ }
18
+ /** What a host can ask of the viewer. */
19
+ export interface MassEditorHandle {
20
+ /** The spectra that are open, in the order they were loaded. */
21
+ getSpectra: () => MassSpectrum[];
22
+ /** Draw these instead of what is open, and refit to them. */
23
+ setSpectra: (spectra: MassSpectrum[]) => void;
24
+ /** Draw these as well as what is open. */
25
+ addSpectra: (spectra: MassSpectrum[]) => void;
26
+ /**
27
+ * Read files the way a drop on the chart reads them, and add what they hold.
28
+ * Resolves once every file has been read; what could not be read is said in
29
+ * the status bar.
30
+ */
31
+ openFiles: (files: readonly File[]) => Promise<void>;
32
+ /** Close every spectrum. */
33
+ clear: () => void;
34
+ /** Show this window. */
35
+ setDomain: (domain: MassDomain) => void;
36
+ /** Show what fits. */
37
+ resetDomain: () => void;
38
+ /**
39
+ * Frame a mass, keeping the intensity axis as it is.
40
+ *
41
+ * The commonest thing a host wants: a peak named in a table beside the viewer
42
+ * is clicked, and the chart should go there.
43
+ */
44
+ zoomToMz: (mz: number, options?: ZoomToMzOptions) => void;
45
+ /** Point the panels at one spectrum, or at none. */
46
+ selectSpectrum: (id: string | null) => void;
47
+ }
48
+ /**
49
+ * A click on the plot, as the viewer tells its host about it.
50
+ *
51
+ * A click is a press let go over the plot without travelling: the end of a zoom
52
+ * drag is never one, and a click on the axis labels is not reported.
53
+ */
54
+ export interface MassPlotClick {
55
+ /** Where it landed on the m/z axis. */
56
+ mz: number;
57
+ /**
58
+ * The m/z of the picked peak within reach of the click, `null` when it landed
59
+ * on none — an empty stretch of the plot is not a peak of zero.
60
+ */
61
+ peakMz: number | null;
62
+ /** Identity of the spectrum selected when it was made, `null` for none. */
63
+ spectrumId: string | null;
64
+ }
65
+ //# sourceMappingURL=massEditorApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"massEditorApi.d.ts","sourceRoot":"","sources":["../../../src/mass/core/massEditorApi.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAElE,6EAA6E;AAC7E,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,yCAAyC;AACzC,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,UAAU,EAAE,MAAM,YAAY,EAAE,CAAC;IACjC,6DAA6D;IAC7D,UAAU,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAC9C,0CAA0C;IAC1C,UAAU,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAC9C;;;;OAIG;IACH,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,4BAA4B;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,wBAAwB;IACxB,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,sBAAsB;IACtB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1D,oDAAoD;IACpD,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC7C;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,2EAA2E;IAC3E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The handle a host drives the viewer through.
3
+ *
4
+ * A handle rather than props, for the reason NMRium uses one: "frame this peak"
5
+ * and "take these spectra" are *gestures*, and a gesture expressed as a prop has
6
+ * to change to be obeyed — so asking for the same window twice does nothing the
7
+ * second time, and a host ends up inventing a nonce to make it work.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=massEditorApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"massEditorApi.js","sourceRoot":"","sources":["../../../src/mass/core/massEditorApi.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * How every number about a mass spectrum is written, wherever it is written.
3
+ *
4
+ * An m/z is written to the decimals the spectra on screen resolve — four for a
5
+ * high-resolution measurement, none for a nominal-mass table, as
6
+ * `mzDecimalsOf` settles it for all of them at once — and an intensity follows
7
+ * it. Settled once here, so a table, an axis label and a tooltip never disagree
8
+ * about how wide one number is.
9
+ */
10
+ import type { MassResolution } from './massResolution.ts';
11
+ import type { MassFormat } from './massSpectrum.ts';
12
+ /** Decimals an intensity is written with, on the 0–100 scale. */
13
+ export declare const INTENSITY_DECIMALS = 2;
14
+ /**
15
+ * An m/z as every table, axis label and tooltip writes it.
16
+ *
17
+ * Always a fixed number of decimals, never `toPrecision` and never the shortest
18
+ * form that round-trips: a column of masses is read by running an eye down it,
19
+ * and `163` above `162.9871` above `164.1` is unreadable in a way that
20
+ * `163.0000` above `162.9871` above `164.1000` is not.
21
+ * @param mz - The mass-to-charge ratio.
22
+ * @param decimals - How many decimals the spectra on screen resolve, as
23
+ * `mzDecimalsOf` decides. Defaults to the high-resolution four.
24
+ * @returns The number as it is written.
25
+ */
26
+ export declare function formatMz(mz: number, decimals?: number): string;
27
+ /**
28
+ * An intensity as every table and tooltip writes it, on the 0–100 scale.
29
+ *
30
+ * It follows the m/z rather than being decided on its own: a nominal-mass peak
31
+ * table quotes relative intensities as whole percentages too, and one column of
32
+ * the same table rounded and the other not looks like a bug. Past the chart's
33
+ * own `SCIENTIFIC_ABOVE`, and under a hundredth — where two decimals would write
34
+ * a zero that is not one — the intensity is written as a power of ten, which is
35
+ * how the axis beside it spells such numbers too.
36
+ * @param intensity - The intensity, normalised to a base peak of 100, or the
37
+ * counts themselves for a spectrum that kept them.
38
+ * @param mzDecimals - How many decimals the masses beside it are written with.
39
+ * Defaults to the high-resolution four.
40
+ * @returns The number as it is written.
41
+ */
42
+ export declare function formatIntensity(intensity: number, mzDecimals?: number): string;
43
+ /**
44
+ * A range of masses, low end first, as the list and the table write it.
45
+ * @param masses - The m/z of every peak, ascending.
46
+ * @param decimals - How many decimals to write them with.
47
+ * @returns `43.8490 – 223.6762`, or `''` for a spectrum holding no peak.
48
+ */
49
+ export declare function formatMzRange(masses: Float64Array, decimals: number): string;
50
+ /**
51
+ * A format as a chemist writes it rather than as the code spells it.
52
+ * @param format - The format the spectrum was read from.
53
+ * @returns Its name; a format this package does not read, as it was given.
54
+ */
55
+ export declare function massFormatLabel(format: MassFormat): string;
56
+ /**
57
+ * What a resolution verdict is called, in the words a status line uses.
58
+ * @param resolution - The verdict.
59
+ * @returns `high resolution`, `low resolution` or `nominal mass`.
60
+ */
61
+ export declare function resolutionLabel(resolution: MassResolution): string;
62
+ /**
63
+ * A resolving power as it is quoted: approximately, and to two figures.
64
+ *
65
+ * Two significant figures because that is all a median over a score of peaks
66
+ * can claim, and because `R ≈ 47,000` is how an instrument's resolution is
67
+ * quoted on its data sheet.
68
+ * @param resolvingPower - The resolving power `m / Δm`.
69
+ * @returns `R ≈ 47,000`.
70
+ */
71
+ export declare function resolvingPowerLabel(resolvingPower: number): string;
72
+ /**
73
+ * How a verdict was reached, said as a reader would want it said.
74
+ * @param resolution - The verdict.
75
+ * @returns The sentence fragment, e.g. `measured on the peak widths`.
76
+ */
77
+ export declare function resolutionBasisLabel(resolution: MassResolution): string;
78
+ //# sourceMappingURL=massFormat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"massFormat.d.ts","sourceRoot":"","sources":["../../../src/mass/core/massFormat.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,SAAmB,GAAG,MAAM,CAExE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,UAAU,SAAmB,GAC5B,MAAM,CAQR;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK5E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,cAAc,GAAG,MAAM,CAElE;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,cAAc,GAAG,MAAM,CAEvE"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * How every number about a mass spectrum is written, wherever it is written.
3
+ *
4
+ * An m/z is written to the decimals the spectra on screen resolve — four for a
5
+ * high-resolution measurement, none for a nominal-mass table, as
6
+ * `mzDecimalsOf` settles it for all of them at once — and an intensity follows
7
+ * it. Settled once here, so a table, an axis label and a tooltip never disagree
8
+ * about how wide one number is.
9
+ */
10
+ import { SCIENTIFIC_ABOVE, formatScientific, } from "../../chart/core/axisLabels.js";
11
+ import { formatInteger } from "../../format/core/numbers.js";
12
+ import { MZ_DECIMALS } from "./massResolution.js";
13
+ /** Decimals an intensity is written with, on the 0–100 scale. */
14
+ export const INTENSITY_DECIMALS = 2;
15
+ /**
16
+ * An m/z as every table, axis label and tooltip writes it.
17
+ *
18
+ * Always a fixed number of decimals, never `toPrecision` and never the shortest
19
+ * form that round-trips: a column of masses is read by running an eye down it,
20
+ * and `163` above `162.9871` above `164.1` is unreadable in a way that
21
+ * `163.0000` above `162.9871` above `164.1000` is not.
22
+ * @param mz - The mass-to-charge ratio.
23
+ * @param decimals - How many decimals the spectra on screen resolve, as
24
+ * `mzDecimalsOf` decides. Defaults to the high-resolution four.
25
+ * @returns The number as it is written.
26
+ */
27
+ export function formatMz(mz, decimals = MZ_DECIMALS.high) {
28
+ return mz.toFixed(decimals);
29
+ }
30
+ /**
31
+ * An intensity as every table and tooltip writes it, on the 0–100 scale.
32
+ *
33
+ * It follows the m/z rather than being decided on its own: a nominal-mass peak
34
+ * table quotes relative intensities as whole percentages too, and one column of
35
+ * the same table rounded and the other not looks like a bug. Past the chart's
36
+ * own `SCIENTIFIC_ABOVE`, and under a hundredth — where two decimals would write
37
+ * a zero that is not one — the intensity is written as a power of ten, which is
38
+ * how the axis beside it spells such numbers too.
39
+ * @param intensity - The intensity, normalised to a base peak of 100, or the
40
+ * counts themselves for a spectrum that kept them.
41
+ * @param mzDecimals - How many decimals the masses beside it are written with.
42
+ * Defaults to the high-resolution four.
43
+ * @returns The number as it is written.
44
+ */
45
+ export function formatIntensity(intensity, mzDecimals = MZ_DECIMALS.high) {
46
+ const decimals = mzDecimals === 0 ? 0 : INTENSITY_DECIMALS;
47
+ if (intensity === 0)
48
+ return (0).toFixed(decimals);
49
+ const size = Math.abs(intensity);
50
+ if (size >= SCIENTIFIC_ABOVE || size < PLAIN_BELOW) {
51
+ return formatScientific(intensity, INTENSITY_DECIMALS);
52
+ }
53
+ return intensity.toFixed(decimals);
54
+ }
55
+ /**
56
+ * A range of masses, low end first, as the list and the table write it.
57
+ * @param masses - The m/z of every peak, ascending.
58
+ * @param decimals - How many decimals to write them with.
59
+ * @returns `43.8490 – 223.6762`, or `''` for a spectrum holding no peak.
60
+ */
61
+ export function formatMzRange(masses, decimals) {
62
+ if (masses.length === 0)
63
+ return '';
64
+ const first = masses[0];
65
+ const last = masses.at(-1);
66
+ return `${formatMz(first, decimals)} – ${formatMz(last, decimals)}`;
67
+ }
68
+ /**
69
+ * A format as a chemist writes it rather than as the code spells it.
70
+ * @param format - The format the spectrum was read from.
71
+ * @returns Its name; a format this package does not read, as it was given.
72
+ */
73
+ export function massFormatLabel(format) {
74
+ return FORMAT_LABELS.get(format) ?? format;
75
+ }
76
+ /**
77
+ * What a resolution verdict is called, in the words a status line uses.
78
+ * @param resolution - The verdict.
79
+ * @returns `high resolution`, `low resolution` or `nominal mass`.
80
+ */
81
+ export function resolutionLabel(resolution) {
82
+ return RESOLUTION_LABELS[resolution.kind];
83
+ }
84
+ /**
85
+ * A resolving power as it is quoted: approximately, and to two figures.
86
+ *
87
+ * Two significant figures because that is all a median over a score of peaks
88
+ * can claim, and because `R ≈ 47,000` is how an instrument's resolution is
89
+ * quoted on its data sheet.
90
+ * @param resolvingPower - The resolving power `m / Δm`.
91
+ * @returns `R ≈ 47,000`.
92
+ */
93
+ export function resolvingPowerLabel(resolvingPower) {
94
+ return `R ≈ ${formatInteger(Number(resolvingPower.toPrecision(2)))}`;
95
+ }
96
+ /**
97
+ * How a verdict was reached, said as a reader would want it said.
98
+ * @param resolution - The verdict.
99
+ * @returns The sentence fragment, e.g. `measured on the peak widths`.
100
+ */
101
+ export function resolutionBasisLabel(resolution) {
102
+ return BASIS_LABELS[resolution.basis];
103
+ }
104
+ /**
105
+ * The intensity below which two decimals have nothing left to say it in.
106
+ *
107
+ * A hundredth, which is exactly where `INTENSITY_DECIMALS` runs out: `0.01` is
108
+ * the smallest number two decimals can write, and everything under it rounds to
109
+ * a zero that is not one.
110
+ */
111
+ const PLAIN_BELOW = 1e-2;
112
+ /**
113
+ * How each format is spelled where it is shown: `mzML` and `netCDF` are the
114
+ * names of the standards, capitals and all, and a table that showed `mzml`
115
+ * would read as a typo in a panel whose whole purpose is to quote the file
116
+ * faithfully. Every format a reader of the family hands spectra over in, the
117
+ * vendor ones included, since a host reading them hands the format over too.
118
+ */
119
+ const FORMAT_LABELS = new Map([
120
+ ['jcamp', 'JCAMP-DX'],
121
+ ['text', 'Text, two columns'],
122
+ ['calculated', 'Calculated'],
123
+ ['mzml', 'mzML'],
124
+ ['mzxml', 'mzXML'],
125
+ ['mzdata', 'mzData'],
126
+ ['imzml', 'imzML'],
127
+ ['mzmlb', 'mzMLb'],
128
+ ['netcdf', 'netCDF'],
129
+ ['mgf', 'MGF'],
130
+ ['msp', 'MSP library'],
131
+ ['msn', 'MS1/MS2 text'],
132
+ ['dta', 'Sequest DTA'],
133
+ ['pkl', 'Micromass peak list'],
134
+ ['asm', 'Allotrope ASM'],
135
+ ['thermo', 'Thermo RAW'],
136
+ ['uep', 'Waters UNIFI package'],
137
+ ['watersraw', 'Waters RAW'],
138
+ ['wiff', 'SCIEX WIFF'],
139
+ ['wiff2', 'SCIEX WIFF2'],
140
+ ['wiffscan', 'SCIEX WIFF scan file'],
141
+ ['shimadzu', 'Shimadzu'],
142
+ ['chemstationms', 'Agilent ChemStation MS'],
143
+ ['chemstationch', 'Agilent ChemStation trace'],
144
+ ['chemstationuv', 'Agilent ChemStation UV'],
145
+ ['agilentdad', 'Agilent MassHunter device'],
146
+ ['masshunter', 'Agilent MassHunter'],
147
+ ['brukerflex', 'Bruker flex'],
148
+ ['brukertsf', 'Bruker timsTOF (TSF)'],
149
+ ['brukertdf', 'Bruker timsTOF (TDF)'],
150
+ ['penx', 'PerkinElmer TotalChrom'],
151
+ ['varian', 'Varian Saturn'],
152
+ ['spc', 'Galactic SPC'],
153
+ ['wdf', 'Renishaw WDF'],
154
+ ['targetraster', 'AP-MALDI target raster'],
155
+ ]);
156
+ /** How each kind of resolution is named. */
157
+ const RESOLUTION_LABELS = {
158
+ high: 'high resolution',
159
+ low: 'low resolution',
160
+ nominal: 'nominal mass',
161
+ };
162
+ /** How each basis of a verdict is said. */
163
+ const BASIS_LABELS = {
164
+ peakWidth: 'measured on the peak widths',
165
+ instrument: 'stated by the file',
166
+ decimals: 'read off the decimals written',
167
+ };
168
+ //# sourceMappingURL=massFormat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"massFormat.js","sourceRoot":"","sources":["../../../src/mass/core/massFormat.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,iEAAiE;AACjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAU,EAAE,QAAQ,GAAG,WAAW,CAAC,IAAI;IAC9D,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,UAAU,GAAG,WAAW,CAAC,IAAI;IAE7B,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAC3D,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,IAAI,IAAI,gBAAgB,IAAI,IAAI,GAAG,WAAW,EAAE,CAAC;QACnD,OAAO,gBAAgB,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,MAAoB,EAAE,QAAgB;IAClE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAW,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,CAAC;IACrC,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;AACtE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAkB;IAChD,OAAO,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,UAA0B;IACxD,OAAO,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,cAAsB;IACxD,OAAO,OAAO,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAA0B;IAC7D,OAAO,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAqB;IAChD,CAAC,OAAO,EAAE,UAAU,CAAC;IACrB,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAC7B,CAAC,YAAY,EAAE,YAAY,CAAC;IAC5B,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,KAAK,EAAE,aAAa,CAAC;IACtB,CAAC,KAAK,EAAE,cAAc,CAAC;IACvB,CAAC,KAAK,EAAE,aAAa,CAAC;IACtB,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAC9B,CAAC,KAAK,EAAE,eAAe,CAAC;IACxB,CAAC,QAAQ,EAAE,YAAY,CAAC;IACxB,CAAC,KAAK,EAAE,sBAAsB,CAAC;IAC/B,CAAC,WAAW,EAAE,YAAY,CAAC;IAC3B,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,OAAO,EAAE,aAAa,CAAC;IACxB,CAAC,UAAU,EAAE,sBAAsB,CAAC;IACpC,CAAC,UAAU,EAAE,UAAU,CAAC;IACxB,CAAC,eAAe,EAAE,wBAAwB,CAAC;IAC3C,CAAC,eAAe,EAAE,2BAA2B,CAAC;IAC9C,CAAC,eAAe,EAAE,wBAAwB,CAAC;IAC3C,CAAC,YAAY,EAAE,2BAA2B,CAAC;IAC3C,CAAC,YAAY,EAAE,oBAAoB,CAAC;IACpC,CAAC,YAAY,EAAE,aAAa,CAAC;IAC7B,CAAC,WAAW,EAAE,sBAAsB,CAAC;IACrC,CAAC,WAAW,EAAE,sBAAsB,CAAC;IACrC,CAAC,MAAM,EAAE,wBAAwB,CAAC;IAClC,CAAC,QAAQ,EAAE,eAAe,CAAC;IAC3B,CAAC,KAAK,EAAE,cAAc,CAAC;IACvB,CAAC,KAAK,EAAE,cAAc,CAAC;IACvB,CAAC,cAAc,EAAE,wBAAwB,CAAC;CAC3C,CAAC,CAAC;AAEH,4CAA4C;AAC5C,MAAM,iBAAiB,GAA2C;IAChE,IAAI,EAAE,iBAAiB;IACvB,GAAG,EAAE,gBAAgB;IACrB,OAAO,EAAE,cAAc;CACxB,CAAC;AAEF,2CAA2C;AAC3C,MAAM,YAAY,GAA4C;IAC5D,SAAS,EAAE,6BAA6B;IACxC,UAAU,EAAE,oBAAoB;IAChC,QAAQ,EAAE,+BAA+B;CAC1C,CAAC"}
@@ -0,0 +1,85 @@
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 type { MassMeta } from './massSpectrum.ts';
18
+ /**
19
+ * The two record bags a JCAMP reader offers.
20
+ *
21
+ * `jcampconverter` splits the records in two — `##ORIGIN=` and the other
22
+ * standard labels into `info`, keyed without their spaces, and the
23
+ * `$`-prefixed user-defined ones into `meta` with the `$` stripped — and a
24
+ * record belongs to one bag or the other, never both.
25
+ */
26
+ export interface MassMetaSource {
27
+ /**
28
+ * The standard records, keyed without their `##` and without spaces.
29
+ * @default undefined
30
+ */
31
+ info?: Record<string, unknown>;
32
+ /**
33
+ * The `$`-prefixed user-defined records, keyed without their `##$`.
34
+ * @default undefined
35
+ */
36
+ meta?: Record<string, unknown>;
37
+ /**
38
+ * The title, when the reader kept it apart from the records.
39
+ * @default undefined
40
+ */
41
+ title?: string;
42
+ }
43
+ /** One record a row of the table can be read from, and written back to. */
44
+ export interface MassMetaRecord {
45
+ /** The record's label as the reader keys it, without its `##` or its `$`. */
46
+ key: string;
47
+ /** Whether it is a standard record rather than a `$`-prefixed one. */
48
+ info: boolean;
49
+ }
50
+ /**
51
+ * Read the acquisition metadata a file carries.
52
+ *
53
+ * Returns `null` rather than an empty table when the file said nothing at all,
54
+ * so the panel can leave the section out instead of drawing a heading over
55
+ * nothing — the normal outcome for a pasted peak list.
56
+ * @param source - The record bags the reader recovered.
57
+ * @returns The metadata, or `null` when the file carries none.
58
+ */
59
+ export declare function buildMassMeta(source: MassMetaSource): MassMeta | null;
60
+ /**
61
+ * The record a row of the table is written back to.
62
+ *
63
+ * The inverse of the table below, and it lives beside it for that reason: a
64
+ * writer holding a second list of record names is a writer whose `MSLEVEL`
65
+ * becomes `MS_LEVEL` the day a spelling is added here, and the round trip then
66
+ * loses the field without anything going wrong loudly. Only the first of each
67
+ * row's records is offered — the others exist to read what other exporters
68
+ * wrote, and writing our own file is not the place to imitate them.
69
+ * @param label - The row's label, as the table displays it.
70
+ * @returns The record, or `null` when the label is not one of the table's rows.
71
+ */
72
+ export declare function metaRecord(label: string): MassMetaRecord | null;
73
+ /**
74
+ * A record's value as a trimmed string, whatever dynamic typing made of it.
75
+ *
76
+ * `jcampconverter` reads `##$SCANS=1` as the number `1` and a record written
77
+ * twice as an array of both values, so a row that is only ever shown has to
78
+ * accept all three shapes. A repeated record shows its first occurrence, which
79
+ * is the one the exporter wrote for the acquisition rather than for a later
80
+ * reprocessing of it.
81
+ * @param value - The record, as dynamic typing left it.
82
+ * @returns The value as text, `''` when there is none.
83
+ */
84
+ export declare function recordText(value: unknown): string;
85
+ //# sourceMappingURL=massMeta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"massMeta.d.ts","sourceRoot":"","sources":["../../../src/mass/core/massMeta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,mBAAmB,CAAC;AAGjE;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,IAAI,CAkBrE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAK/D;AAwHD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOjD"}