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,213 @@
1
+ /**
2
+ * What a spectrum can be said to be, when the file said little or nothing.
3
+ *
4
+ * A two-column paste is most pastes, and it carries no acquisition metadata at
5
+ * all: no instrument, no polarity, no collision energy. A panel that answered
6
+ * that with an empty table would be saying "this file is a mystery" when the
7
+ * truth is far more useful — it is this file, read as that format, holding so
8
+ * many peaks between these two masses. So the facts the viewer knows about
9
+ * every spectrum, whatever it came from, are gathered here as rows of the same
10
+ * two-column table the metadata itself fills, and a panel renders one table
11
+ * either way.
12
+ *
13
+ * Everything here is a pure function of one spectrum, so what the panels say
14
+ * can be tested without mounting them.
15
+ */
16
+
17
+ import {
18
+ formatMz,
19
+ formatMzRange,
20
+ massFormatLabel,
21
+ resolutionBasisLabel,
22
+ resolutionLabel,
23
+ resolvingPowerLabel,
24
+ } from './massFormat.ts';
25
+ import { MZ_DECIMALS } from './massResolution.ts';
26
+ import type { MassMetaField, MassSpectrum } from './massSpectrum.ts';
27
+ import { resolutionOf } from './resolutionOf.ts';
28
+
29
+ /**
30
+ * The rows the acquisition table shows for a spectrum.
31
+ *
32
+ * The file's own records win whenever it wrote any, in the order
33
+ * `buildMassMeta` fixed — that order is how a method is read, from what the
34
+ * sample was measured on down to who measured it, and re-sorting it here would
35
+ * scatter a method across the table. A file that wrote none falls back to what
36
+ * the viewer knows regardless.
37
+ * @param spectrum - The spectrum the panel is about.
38
+ * @param mzDecimals - How many decimals its masses are written with. Defaults
39
+ * to four.
40
+ * @returns The rows, in display order, never empty.
41
+ */
42
+ export function spectrumMetaRows(
43
+ spectrum: MassSpectrum,
44
+ mzDecimals = MZ_DECIMALS.high,
45
+ ): MassMetaField[] {
46
+ const fields = spectrum.meta?.fields ?? [];
47
+ return fields.length > 0 ? fields : spectrumFileFields(spectrum, mzDecimals);
48
+ }
49
+
50
+ /**
51
+ * What the viewer knows about a spectrum without the file's help.
52
+ *
53
+ * Every row is read off the spectrum as it was loaded — where it came from,
54
+ * which acquisition of it, and how many points survived the peak picking — so
55
+ * this answers for a pasted peak list exactly as well as for a scan of a run.
56
+ * @param spectrum - The spectrum the panel is about.
57
+ * @param mzDecimals - How many decimals its masses are written with. Defaults
58
+ * to four.
59
+ * @returns The rows, in display order.
60
+ */
61
+ export function spectrumFileFields(
62
+ spectrum: MassSpectrum,
63
+ mzDecimals = MZ_DECIMALS.high,
64
+ ): MassMetaField[] {
65
+ const { origin, centroid, profile } = spectrum;
66
+ const rows: MassMetaField[] = [{ label: 'Name', value: spectrum.name }];
67
+
68
+ if (origin.fileName === undefined) {
69
+ rows.push({
70
+ label: 'Source',
71
+ value:
72
+ origin.format === 'calculated'
73
+ ? 'Calculated in the viewer'
74
+ : 'Pasted, not read from a file',
75
+ });
76
+ } else {
77
+ rows.push({ label: 'File', value: origin.fileName });
78
+ }
79
+ rows.push({ label: 'Format', value: massFormatLabel(origin.format) });
80
+
81
+ if (origin.scanIndex !== undefined) {
82
+ rows.push({ label: 'Scan', value: scanNumber(origin.scanIndex) });
83
+ }
84
+ if (origin.msLevel !== undefined) {
85
+ rows.push({ label: 'MS level', value: String(origin.msLevel) });
86
+ }
87
+ if (origin.polarity !== undefined) {
88
+ rows.push({ label: 'Polarity', value: origin.polarity });
89
+ }
90
+ if (origin.precursorMz !== undefined) {
91
+ rows.push({ label: 'Precursor m/z', value: formatMz(origin.precursorMz) });
92
+ }
93
+ // Only where it differs from the row above. Listed always, it would repeat
94
+ // the precursor on nearly every Thermo scan and say nothing; listed here, it
95
+ // is the one place a reader learns that the instrument was after a molecule
96
+ // the window it cut does not contain.
97
+ if (
98
+ origin.precursorMonoisotopicMz !== undefined &&
99
+ origin.precursorMonoisotopicMz !== origin.precursorMz
100
+ ) {
101
+ rows.push({
102
+ label: 'Monoisotopic m/z',
103
+ value: formatMz(origin.precursorMonoisotopicMz),
104
+ });
105
+ }
106
+ if (origin.retentionTime !== undefined) {
107
+ rows.push({
108
+ label: 'Retention time',
109
+ value: `${origin.retentionTime.toFixed(2)} min`,
110
+ });
111
+ }
112
+
113
+ rows.push({ label: 'Peaks', value: String(centroid.x.length) });
114
+ if (profile !== null) {
115
+ rows.push({ label: 'Profile points', value: String(profile.x.length) });
116
+ }
117
+ const range = formatMzRange(centroid.x, mzDecimals);
118
+ if (range !== '') rows.push({ label: 'm/z range', value: range });
119
+ return rows;
120
+ }
121
+
122
+ /**
123
+ * The rows that say how finely a spectrum resolves masses, and how that was
124
+ * decided — the verdict read off the decimals of a peak table is a weaker claim
125
+ * than one measured on the widths of its peaks, and the table says which.
126
+ * @param spectrum - The spectrum the panel is about.
127
+ * @returns One row, or two when a resolving power was measured.
128
+ */
129
+ export function spectrumResolutionRows(
130
+ spectrum: MassSpectrum,
131
+ ): MassMetaField[] {
132
+ const resolution = resolutionOf(spectrum);
133
+ const rows: MassMetaField[] = [
134
+ {
135
+ label: 'Resolution',
136
+ value: `${resolutionLabel(resolution)}, ${resolutionBasisLabel(resolution)}`,
137
+ },
138
+ ];
139
+ if (resolution.resolvingPower !== null) {
140
+ rows.push({
141
+ label: 'Resolving power',
142
+ value: `${resolvingPowerLabel(resolution.resolvingPower)} at half height`,
143
+ });
144
+ }
145
+ return rows;
146
+ }
147
+
148
+ /** What the line under a spectrum's name says besides its acquisition. */
149
+ export interface SpectrumSubtitleOptions {
150
+ /**
151
+ * Whether the line also says what kind of spectrum it is — profile or
152
+ * centroid first, and its resolution last. Worth it on a list of files that
153
+ * differ in exactly that; noise on a list of scans out of one run, every one
154
+ * of which is the same kind as the next.
155
+ * @default false
156
+ */
157
+ describeKind?: boolean;
158
+ }
159
+
160
+ /**
161
+ * The one line under a spectrum's name in the list.
162
+ *
163
+ * A file of a thousand scans gives a thousand rows whose names all start with
164
+ * the same file name, so the row has to carry whatever tells one acquisition
165
+ * from the next — which scan, which MS level, what was fragmented and when it
166
+ * eluted. Those are exactly the facts the row is picked by.
167
+ * @param spectrum - The spectrum the row is of.
168
+ * @param options - See {@link SpectrumSubtitleOptions}.
169
+ * @returns The line, the peak count alone for a spectrum with no origin facts.
170
+ * @example
171
+ * spectrumSubtitle(scan); // 'Scan 12 · MS2 · precursor 452.1900 · 3.42 min · 128 peaks'
172
+ * spectrumSubtitle(file, { describeKind: true }); // 'profile · 10 peaks · high resolution'
173
+ */
174
+ export function spectrumSubtitle(
175
+ spectrum: MassSpectrum,
176
+ options: SpectrumSubtitleOptions = {},
177
+ ): string {
178
+ const { describeKind = false } = options;
179
+ const { origin, centroid, profile } = spectrum;
180
+ const parts: string[] = [];
181
+
182
+ if (describeKind) parts.push(profile === null ? 'centroid' : 'profile');
183
+
184
+ if (origin.scanIndex !== undefined) {
185
+ parts.push(`Scan ${scanNumber(origin.scanIndex)}`);
186
+ }
187
+ if (origin.msLevel !== undefined) parts.push(`MS${origin.msLevel}`);
188
+ if (origin.polarity !== undefined) parts.push(origin.polarity);
189
+ if (origin.precursorMz !== undefined) {
190
+ parts.push(`precursor ${formatMz(origin.precursorMz)}`);
191
+ }
192
+ if (origin.retentionTime !== undefined) {
193
+ parts.push(`${origin.retentionTime.toFixed(2)} min`);
194
+ }
195
+
196
+ const peaks = centroid.x.length;
197
+ parts.push(`${peaks} peak${peaks === 1 ? '' : 's'}`);
198
+ if (describeKind) parts.push(resolutionLabel(resolutionOf(spectrum)));
199
+ return parts.join(' · ');
200
+ }
201
+
202
+ /**
203
+ * Which acquisition of its file a scan is, counted from one as every list of
204
+ * scans counts them — `MassOrigin.scanIndex` counts from zero, and a scan
205
+ * listed as 23 in one table and 24 in the next reads as two scans.
206
+ * @param scanIndex - Which acquisition of the file, counted from zero.
207
+ * @returns Its number, counted from one.
208
+ * @example
209
+ * scanNumber(23); // '24'
210
+ */
211
+ function scanNumber(scanIndex: number): string {
212
+ return String(scanIndex + 1);
213
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * How many decimals the masses on screen are written with: as the spectra
3
+ * decide, or as the reader chose.
4
+ *
5
+ * The spectra decide well for what they are — an Orbitrap scan to four
6
+ * decimals, a library spectrum in whole masses — but not for what the reader
7
+ * is doing with them: an ion-trap run read against its precursors wants a
8
+ * decimal its verdict calls noise, and a table pasted into a report wants
9
+ * fewer digits than the instrument gave. So the decision is a setting, `'auto'`
10
+ * until somebody picks a number.
11
+ */
12
+
13
+ import type { MassSpectrum } from './massSpectrum.ts';
14
+ import { mzDecimalsOf } from './resolutionOf.ts';
15
+
16
+ /** `'auto'` to let the spectra decide, or the number of decimals chosen. */
17
+ export type MzDecimalsSetting = 'auto' | number;
18
+
19
+ /** The most decimals that can be chosen; past it a mass is all noise. */
20
+ export const MAXIMUM_MZ_DECIMALS = 5;
21
+
22
+ /**
23
+ * How many decimals the masses of spectra shown together are written with.
24
+ * @param setting - What the reader chose, `'auto'` for nothing.
25
+ * @param spectra - The spectra being shown together.
26
+ * @returns The decimals: the choice, or what `mzDecimalsOf` decides.
27
+ */
28
+ export function mzDecimalsFor(
29
+ setting: MzDecimalsSetting,
30
+ spectra: readonly MassSpectrum[],
31
+ ): number {
32
+ return setting === 'auto' ? mzDecimalsOf(spectra) : setting;
33
+ }
34
+
35
+ /**
36
+ * A decimals setting as it may be stored, read back from whatever was.
37
+ *
38
+ * A setting arrives from a saved workspace, a host's props or a URL, none of
39
+ * which this viewer wrote, so anything other than `'auto'` or a finite number
40
+ * is not a setting at all — and a number is rounded and held to what can be
41
+ * chosen rather than refused, since `4.0` and `9` both say plainly enough what
42
+ * was meant.
43
+ * @param value - What was stored.
44
+ * @returns The setting, or `undefined` for something that is not one.
45
+ */
46
+ export function readMzDecimalsSetting(
47
+ value: unknown,
48
+ ): MzDecimalsSetting | undefined {
49
+ if (value === 'auto') return 'auto';
50
+ if (typeof value !== 'number' || !Number.isFinite(value)) return undefined;
51
+ return Math.min(MAXIMUM_MZ_DECIMALS, Math.max(0, Math.round(value)));
52
+ }
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Which peak the pointer is asking about.
3
+ *
4
+ * One question, asked by the crosshair, by the click that frames a peak and by
5
+ * the hover that lights a row of the peak table — so it is answered once, here,
6
+ * and all three agree about what is under the pointer.
7
+ */
8
+
9
+ import { xFindClosestIndex } from 'ml-spectra-processing';
10
+
11
+ import type { ChartScale } from '../../chart/core/chartScale.ts';
12
+ import { chartPixel, chartValue } from '../../chart/core/chartScale.ts';
13
+
14
+ import type { MassSpectrum } from './massSpectrum.ts';
15
+ import { isSpectrumDrawn } from './massSpectrum.ts';
16
+
17
+ /**
18
+ * How far from a stick the pointer may be and still be on it, in screen pixels.
19
+ *
20
+ * A screen distance, not a mass one: it is the size of a pointing gesture and
21
+ * has nothing to say about how close two m/z values are. Six pixels is about the
22
+ * jitter of a hand resting on a trackpad, and narrow enough that two sticks a
23
+ * few tenths apart on a zoomed axis stay separately reachable.
24
+ */
25
+ export const PEAK_HIT_RADIUS = 6;
26
+
27
+ /** The peak under the pointer, and which spectrum it belongs to. */
28
+ export interface NearestPeak {
29
+ /** The spectrum whose centroid holds it. */
30
+ spectrumId: string;
31
+ /** Where it sits in that centroid, for looking its charge up. */
32
+ index: number;
33
+ /** Its m/z, exactly as the centroid records it. */
34
+ mz: number;
35
+ /** Its intensity. */
36
+ intensity: number;
37
+ }
38
+
39
+ /**
40
+ * The peak the pointer is on, tested on m/z alone.
41
+ *
42
+ * Only the horizontal distance is measured, so the whole column above a stick is
43
+ * within reach up to the top of the plot. Matching in two dimensions instead
44
+ * sounds more precise and is unusable: the target for a peak at one percent of
45
+ * the base peak would be the few pixels around its tip, so the smallest peaks —
46
+ * the ones worth interrogating — become the hardest to reach.
47
+ * @param spectra - What the chart draws; those with neither trace drawn are
48
+ * skipped. A spectrum drawn as its profile answers with its picked peaks all the
49
+ * same — they are what the pointer is really asking after.
50
+ * @param xScale - The m/z axis as it is currently zoomed.
51
+ * @param pixelX - Where the pointer is, in the same pixels the scale speaks.
52
+ * @param maxDistance - How far away a stick may be, in pixels; a stick exactly
53
+ * that far away misses. Defaults to `PEAK_HIT_RADIUS`.
54
+ * @returns The closest peak within that distance, `null` when there is none.
55
+ */
56
+ export function nearestPeakMz(
57
+ spectra: readonly MassSpectrum[],
58
+ xScale: ChartScale,
59
+ pixelX: number,
60
+ maxDistance = PEAK_HIT_RADIUS,
61
+ ): NearestPeak | null {
62
+ const target = chartValue(xScale, pixelX);
63
+ let best: NearestPeak | null = null;
64
+ let bestDistance = maxDistance;
65
+ for (const spectrum of spectra) {
66
+ if (!isSpectrumDrawn(spectrum)) continue;
67
+ const { x, y } = spectrum.centroid;
68
+ if (x.length === 0) continue;
69
+ const index = xFindClosestIndex(x, target);
70
+ const mz = x[index] as number;
71
+ const distance = Math.abs(chartPixel(xScale, mz) - pixelX);
72
+ if (distance < bestDistance) {
73
+ bestDistance = distance;
74
+ best = {
75
+ spectrumId: spectrum.id,
76
+ index,
77
+ mz,
78
+ intensity: y[index] as number,
79
+ };
80
+ }
81
+ }
82
+ return best;
83
+ }
84
+
85
+ /**
86
+ * The peak a gesture landed on, given where it landed in m/z.
87
+ *
88
+ * A gesture is reported in the units the chart is measured in, while how near a
89
+ * stick has to be to be the one meant is a distance on the screen — so the mass
90
+ * goes back through the scale rather than the radius being turned into a mass,
91
+ * which would be a different tolerance at every zoom.
92
+ * @param spectra - What the chart draws.
93
+ * @param xScale - The m/z axis as it is currently zoomed.
94
+ * @param mz - Where the gesture landed, in m/z.
95
+ * @param maxDistance - How far away a stick may be, in pixels. Defaults to
96
+ * `PEAK_HIT_RADIUS`.
97
+ * @returns The closest peak within that distance, `null` when there is none.
98
+ */
99
+ export function peakAtMz(
100
+ spectra: readonly MassSpectrum[],
101
+ xScale: ChartScale,
102
+ mz: number,
103
+ maxDistance = PEAK_HIT_RADIUS,
104
+ ): NearestPeak | null {
105
+ return nearestPeakMz(spectra, xScale, chartPixel(xScale, mz), maxDistance);
106
+ }
107
+
108
+ /**
109
+ * Whether two answers about the peak under the pointer say the same thing.
110
+ *
111
+ * The m/z is compared exactly, and that is not an oversight: both numbers were
112
+ * read out of the same centroid by the same index, so either they are the very
113
+ * same measurement or they are two different peaks. A tolerance here would
114
+ * declare an isotopologue pair a millimass unit apart to be one peak.
115
+ * @param current - What was last reported.
116
+ * @param next - What would be reported now.
117
+ * @returns Whether the report can be skipped.
118
+ */
119
+ export function sameNearestPeak(
120
+ current: NearestPeak | null,
121
+ next: NearestPeak | null,
122
+ ): boolean {
123
+ if (current === next) return true;
124
+ if (current === null || next === null) return false;
125
+ return (
126
+ current.spectrumId === next.spectrumId &&
127
+ current.index === next.index &&
128
+ current.mz === next.mz
129
+ );
130
+ }
@@ -0,0 +1,112 @@
1
+ /**
2
+ * What the stack of labels above a peak says.
3
+ *
4
+ * A label is never one line: a peak carries its m/z and its intensity always,
5
+ * its charge when one was established, and the name of whatever explains it
6
+ * when a host says something does. Which of those are present changes from peak
7
+ * to peak, so the stack is built as a list and measured from its length — **an
8
+ * absent line consumes no slot**, and a peak nothing explains is not drawn with
9
+ * a gap where its name would have been.
10
+ *
11
+ * The lines come back farthest-from-the-peak first, which for a stack standing
12
+ * over a stick is also top-to-bottom reading order. Where those lines are then
13
+ * written is `labelStackBaselines` in the shared chart, which is the same sum
14
+ * for every kind of spectrum.
15
+ */
16
+
17
+ import type { MassPeakObject } from './centroidPeaks.ts';
18
+ import { formatIntensity, formatMz } from './massFormat.ts';
19
+ import { MZ_DECIMALS } from './massResolution.ts';
20
+
21
+ /** What one line of a stack is about. */
22
+ export type PeakLabelLineKind = 'annotation' | 'charge' | 'mz' | 'intensity';
23
+
24
+ /** One line of the stack above a peak. */
25
+ export interface PeakLabelLine {
26
+ /** What it is about, which is also its key within the stack. */
27
+ kind: PeakLabelLineKind;
28
+ /** What it says. */
29
+ text: string;
30
+ }
31
+
32
+ /** What a stack is allowed to say about one peak. */
33
+ export interface PeakLabelLinesOptions {
34
+ /**
35
+ * How many decimals the masses on screen are written with, as `mzDecimalsOf`
36
+ * decides, so a nominal-mass table is not written out to four decimals it
37
+ * never measured.
38
+ * @default 4
39
+ */
40
+ mzDecimals?: number;
41
+ /**
42
+ * Whether a peak whose charge was established says so. A charge of `0` means
43
+ * none was established and is never written, whatever this says.
44
+ * @default false
45
+ */
46
+ showCharges?: boolean;
47
+ /**
48
+ * The name of whatever explains this peak, absent when nothing does.
49
+ * @default undefined
50
+ */
51
+ annotationLabel?: string;
52
+ /**
53
+ * What one unit of the measured intensity is written as.
54
+ *
55
+ * One for every spectrum on the 0–100 scale; a spectrum that kept the counts
56
+ * its instrument recorded — a pixel of an imaging run — is written through a
57
+ * factor its host settles for the whole chart, so the numbers over the peaks
58
+ * and the numbers up the axis cannot disagree.
59
+ * @default 1
60
+ */
61
+ intensityScale?: number;
62
+ }
63
+
64
+ /**
65
+ * The lines the stack above one peak is made of.
66
+ *
67
+ * Ordered by how much of an answer each line is, the answer farthest from the
68
+ * stick and the measurement nearest it: the name of whatever explains the peak,
69
+ * then the charge, which qualifies the mass below it, then the m/z, which is
70
+ * what a chemist came to read, and the intensity last, sitting on the stick
71
+ * whose height already said it.
72
+ * @param peak - The peak being labelled.
73
+ * @param options - What the stack is allowed to say.
74
+ * @returns The lines, farthest from the peak first, never empty.
75
+ */
76
+ export function peakLabelLines(
77
+ peak: MassPeakObject,
78
+ options: PeakLabelLinesOptions = {},
79
+ ): PeakLabelLine[] {
80
+ const {
81
+ mzDecimals = MZ_DECIMALS.high,
82
+ showCharges = false,
83
+ annotationLabel,
84
+ intensityScale = 1,
85
+ } = options;
86
+
87
+ const lines: PeakLabelLine[] = [];
88
+ if (annotationLabel !== undefined && annotationLabel !== '') {
89
+ lines.push({ kind: 'annotation', text: annotationLabel });
90
+ }
91
+ if (showCharges && peak.charge !== 0) {
92
+ lines.push({ kind: 'charge', text: `z = ${peak.charge}` });
93
+ }
94
+ lines.push(
95
+ { kind: 'mz', text: formatMz(peak.x, mzDecimals) },
96
+ {
97
+ kind: 'intensity',
98
+ text: formatIntensity(peak.y * intensityScale, mzDecimals),
99
+ },
100
+ );
101
+ return lines;
102
+ }
103
+
104
+ /**
105
+ * How one peak of one spectrum is keyed, wherever something is said about it.
106
+ * @param spectrumId - Identity of the spectrum.
107
+ * @param index - Where the peak sits in that spectrum's centroid.
108
+ * @returns `${spectrumId}:${index}`.
109
+ */
110
+ export function peakKey(spectrumId: string, index: number): string {
111
+ return `${spectrumId}:${index}`;
112
+ }