thyra 4.3.0__tar.gz → 4.3.1__tar.gz

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 (149) hide show
  1. {thyra-4.3.0 → thyra-4.3.1}/PKG-INFO +1 -1
  2. {thyra-4.3.0 → thyra-4.3.1}/pyproject.toml +1 -1
  3. {thyra-4.3.0 → thyra-4.3.1}/thyra/__init__.py +1 -1
  4. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/mzpeak/mzpeak_reader.py +77 -7
  5. {thyra-4.3.0 → thyra-4.3.1}/.gitignore +0 -0
  6. {thyra-4.3.0 → thyra-4.3.1}/LICENSE +0 -0
  7. {thyra-4.3.0 → thyra-4.3.1}/README.md +0 -0
  8. {thyra-4.3.0 → thyra-4.3.1}/thyra/__main__.py +0 -0
  9. {thyra-4.3.0 → thyra-4.3.1}/thyra/alignment/__init__.py +0 -0
  10. {thyra-4.3.0 → thyra-4.3.1}/thyra/alignment/affine.py +0 -0
  11. {thyra-4.3.0 → thyra-4.3.1}/thyra/alignment/teaching_points.py +0 -0
  12. {thyra-4.3.0 → thyra-4.3.1}/thyra/config.py +0 -0
  13. {thyra-4.3.0 → thyra-4.3.1}/thyra/convert.py +0 -0
  14. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/__init__.py +0 -0
  15. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/spatialdata/__init__.py +0 -0
  16. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/spatialdata/_chunking.py +0 -0
  17. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/spatialdata/base_spatialdata_converter.py +0 -0
  18. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/spatialdata/converter.py +0 -0
  19. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/spatialdata/csc_assembly.py +0 -0
  20. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/spatialdata/fused_passes.py +0 -0
  21. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/spatialdata/mobility_heatmap.py +0 -0
  22. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/spatialdata/mobility_table.py +0 -0
  23. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/spatialdata/msms_table.py +0 -0
  24. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/spatialdata/optical_image.py +0 -0
  25. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/spatialdata/root_attrs.py +0 -0
  26. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/spatialdata/sibling_tables.py +0 -0
  27. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/spatialdata/streaming_converter.py +0 -0
  28. {thyra-4.3.0 → thyra-4.3.1}/thyra/converters/spatialdata/uns_assembler.py +0 -0
  29. {thyra-4.3.0 → thyra-4.3.1}/thyra/core/__init__.py +0 -0
  30. {thyra-4.3.0 → thyra-4.3.1}/thyra/core/base_converter.py +0 -0
  31. {thyra-4.3.0 → thyra-4.3.1}/thyra/core/base_extractor.py +0 -0
  32. {thyra-4.3.0 → thyra-4.3.1}/thyra/core/base_reader.py +0 -0
  33. {thyra-4.3.0 → thyra-4.3.1}/thyra/core/conversion_state.py +0 -0
  34. {thyra-4.3.0 → thyra-4.3.1}/thyra/core/drop_tally.py +0 -0
  35. {thyra-4.3.0 → thyra-4.3.1}/thyra/core/frames.py +0 -0
  36. {thyra-4.3.0 → thyra-4.3.1}/thyra/core/mass_axis.py +0 -0
  37. {thyra-4.3.0 → thyra-4.3.1}/thyra/core/mobility.py +0 -0
  38. {thyra-4.3.0 → thyra-4.3.1}/thyra/core/msms.py +0 -0
  39. {thyra-4.3.0 → thyra-4.3.1}/thyra/core/registry.py +0 -0
  40. {thyra-4.3.0 → thyra-4.3.1}/thyra/errors.py +0 -0
  41. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/__init__.py +0 -0
  42. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/constants.py +0 -0
  43. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/document.py +0 -0
  44. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/extractors/__init__.py +0 -0
  45. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/extractors/bruker_extractor.py +0 -0
  46. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/extractors/imzml_extractor.py +0 -0
  47. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/extractors/imzml_header_extractor.py +0 -0
  48. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/extractors/mzpeak_extractor.py +0 -0
  49. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/extractors/phi_extractor.py +0 -0
  50. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/extractors/solarix_extractor.py +0 -0
  51. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/extractors/waters_extractor.py +0 -0
  52. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/ontology/__init__.py +0 -0
  53. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/ontology/_ims.py +0 -0
  54. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/ontology/_ms.py +0 -0
  55. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/ontology/_uo.py +0 -0
  56. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/ontology/cache.py +0 -0
  57. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/ontology/dump_obo_files.py +0 -0
  58. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/personal_data.py +0 -0
  59. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/schema/__init__.py +0 -0
  60. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/schema/builder.py +0 -0
  61. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/schema/cli.py +0 -0
  62. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/schema/generate.py +0 -0
  63. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/schema/metaspace.py +0 -0
  64. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/schema/models.py +0 -0
  65. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/schema/msi_metadata.linkml.yaml +0 -0
  66. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/schema/msi_metadata_schema_v0_10.json +0 -0
  67. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/schema/store_io.py +0 -0
  68. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/schema/validate.py +0 -0
  69. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/schema/vocab.py +0 -0
  70. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/types.py +0 -0
  71. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/uns_compat.py +0 -0
  72. {thyra-4.3.0 → thyra-4.3.1}/thyra/metadata/validator.py +0 -0
  73. {thyra-4.3.0 → thyra-4.3.1}/thyra/preview.py +0 -0
  74. {thyra-4.3.0 → thyra-4.3.1}/thyra/py.typed +0 -0
  75. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/__init__.py +0 -0
  76. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/__init__.py +0 -0
  77. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/base_bruker_reader.py +0 -0
  78. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/folder_structure.py +0 -0
  79. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/mis_parser.py +0 -0
  80. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/rapiflex/__init__.py +0 -0
  81. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/rapiflex/rapiflex_reader.py +0 -0
  82. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/solarix/__init__.py +0 -0
  83. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/solarix/solarix_reader.py +0 -0
  84. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/timstof/__init__.py +0 -0
  85. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/timstof/sdk/__init__.py +0 -0
  86. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/timstof/sdk/dll/LICENCE-BRUKER.txt +0 -0
  87. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/timstof/sdk/dll/README.md +0 -0
  88. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/timstof/sdk/dll/timsdata.dll +0 -0
  89. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/timstof/sdk/dll/timsdata.so +0 -0
  90. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/timstof/sdk/dll_manager.py +0 -0
  91. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/timstof/sdk/platform_detector.py +0 -0
  92. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/timstof/sdk/sdk_functions.py +0 -0
  93. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/timstof/timstof_reader.py +0 -0
  94. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/bruker/vendor_db.py +0 -0
  95. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/imzml/__init__.py +0 -0
  96. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/imzml/_pyimzml_compat.py +0 -0
  97. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/imzml/header.py +0 -0
  98. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/imzml/imzml_reader.py +0 -0
  99. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/imzml/mobility_array.py +0 -0
  100. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/mzpeak/__init__.py +0 -0
  101. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/mzpeak/chunk_decoding.py +0 -0
  102. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/phi/__init__.py +0 -0
  103. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/phi/event_stream.py +0 -0
  104. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/phi/mass_axis.py +0 -0
  105. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/phi/phi_header.py +0 -0
  106. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/phi/phi_reader.py +0 -0
  107. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/waters/__init__.py +0 -0
  108. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/waters/imaging_grid.py +0 -0
  109. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/waters/instrument.py +0 -0
  110. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/waters/lib/MLReader.dll +0 -0
  111. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/waters/lib/MassLynxRaw.dll +0 -0
  112. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/waters/lib/libMLReader.so +0 -0
  113. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/waters/lib/libMassLynxRaw.so +0 -0
  114. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/waters/masslynx_lib.py +0 -0
  115. {thyra-4.3.0 → thyra-4.3.1}/thyra/readers/waters/waters_reader.py +0 -0
  116. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/__init__.py +0 -0
  117. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/axis_planner.py +0 -0
  118. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/binning.py +0 -0
  119. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/common_axis.py +0 -0
  120. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/constants.py +0 -0
  121. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/data_characteristics.py +0 -0
  122. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/decision_tree.py +0 -0
  123. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/gaps.py +0 -0
  124. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/instrument_detectors.py +0 -0
  125. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/interpolation.py +0 -0
  126. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/mass_axis/__init__.py +0 -0
  127. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/mass_axis/base_generator.py +0 -0
  128. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/mass_axis/fticr_generator.py +0 -0
  129. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/mass_axis/linear_generator.py +0 -0
  130. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/mass_axis/linear_tof_generator.py +0 -0
  131. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/mass_axis/orbitrap_generator.py +0 -0
  132. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/mass_axis/reflector_tof_generator.py +0 -0
  133. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/mass_axis/tof_generator.py +0 -0
  134. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/mobility_grid.py +0 -0
  135. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/strategies/__init__.py +0 -0
  136. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/strategies/base.py +0 -0
  137. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/strategies/nearest_neighbor.py +0 -0
  138. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/strategies/tic_preserving.py +0 -0
  139. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/tic.py +0 -0
  140. {thyra-4.3.0 → thyra-4.3.1}/thyra/resampling/types.py +0 -0
  141. {thyra-4.3.0 → thyra-4.3.1}/thyra/tools/__init__.py +0 -0
  142. {thyra-4.3.0 → thyra-4.3.1}/thyra/tools/check_ontology.py +0 -0
  143. {thyra-4.3.0 → thyra-4.3.1}/thyra/tools/make_example_data.py +0 -0
  144. {thyra-4.3.0 → thyra-4.3.1}/thyra/utils/__init__.py +0 -0
  145. {thyra-4.3.0 → thyra-4.3.1}/thyra/utils/bruker_exceptions.py +0 -0
  146. {thyra-4.3.0 → thyra-4.3.1}/thyra/utils/imzml_coordinate_base.py +0 -0
  147. {thyra-4.3.0 → thyra-4.3.1}/thyra/utils/logging_config.py +0 -0
  148. {thyra-4.3.0 → thyra-4.3.1}/thyra/utils/pyimzml_direct.py +0 -0
  149. {thyra-4.3.0 → thyra-4.3.1}/thyra/utils/windows_paths.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: thyra
3
- Version: 4.3.0
3
+ Version: 4.3.1
4
4
  Summary: A modern Python library for converting Mass Spectrometry Imaging (MSI) data into SpatialData/Zarr format - your portal to spatial omics
5
5
  Project-URL: Homepage, https://github.com/M4i-Imaging-Mass-Spectrometry/thyra
6
6
  Project-URL: Repository, https://github.com/M4i-Imaging-Mass-Spectrometry/thyra
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "thyra"
7
- version = "4.3.0"
7
+ version = "4.3.1"
8
8
  description = "A modern Python library for converting Mass Spectrometry Imaging (MSI) data into SpatialData/Zarr format - your portal to spatial omics"
9
9
  authors = [{ name = "Theodoros Visvikis", email = "t.visvikis@maastrichtuniversity.nl" }]
10
10
  maintainers = [{ name = "Theodoros Visvikis", email = "t.visvikis@maastrichtuniversity.nl" }]
@@ -67,7 +67,7 @@ warnings.filterwarnings(
67
67
  category=FutureWarning,
68
68
  )
69
69
 
70
- __version__ = "4.3.0"
70
+ __version__ = "4.3.1"
71
71
 
72
72
  #: Public name -> the module that defines it, imported on first access.
73
73
  _LAZY_ATTRS = {
@@ -186,6 +186,32 @@ def _lazy_pyarrow() -> Tuple[Any, Any]:
186
186
  return pyarrow, pq
187
187
 
188
188
 
189
+ def _positions(column: Any) -> Tuple[NDArray[np.int64], NDArray[np.bool_]]:
190
+ """Read one position column, keeping apart the scans that have none.
191
+
192
+ A null is a scan that belongs to no pixel. Cast straight to an integer
193
+ it becomes the smallest one there is, and the minimum of the column
194
+ would then put the origin of the grid at that scan.
195
+
196
+ Args:
197
+ column: The position column of the scans member, as pyarrow reads it.
198
+
199
+ Returns:
200
+ The positions as integers, 0 where there is none, and a mask that is
201
+ ``True`` where the scan has a position.
202
+ """
203
+ if column.null_count == len(column):
204
+ # Nothing to fill, and a column of the null type cannot be filled.
205
+ return np.zeros(len(column), dtype=np.int64), np.zeros(len(column), dtype=bool)
206
+ present = np.asarray(column.is_valid().to_numpy(), dtype=bool)
207
+ values = np.asarray(column.fill_null(0).to_numpy())
208
+ if values.dtype.kind == "f":
209
+ finite = np.isfinite(values)
210
+ present = present & finite
211
+ values = np.where(finite, values, 0)
212
+ return values.astype(np.int64), present
213
+
214
+
189
215
  class MzPeakSpatialIndex(NamedTuple):
190
216
  """Everything about the archive that is one value per spectrum.
191
217
 
@@ -572,9 +598,13 @@ class MzPeakArchive:
572
598
  (``scan_index``) and nothing promises the two members are ordered
573
599
  alike.
574
600
 
601
+ A spectrum whose scan has a null position belongs to no pixel and is
602
+ left out, as a spectrum with no scan row is.
603
+
575
604
  Raises:
576
- ValueError: If the archive is not an imaging acquisition, or
577
- carries no positioned spectra.
605
+ ConversionRefused: If the archive is not an imaging acquisition,
606
+ carries no positioned spectra, or gives a scan one position
607
+ without the other.
578
608
  """
579
609
  if self._spatial_index is not None:
580
610
  return self._spatial_index
@@ -592,14 +622,36 @@ class MzPeakArchive:
592
622
  columns=["source_index", x_column, y_column]
593
623
  )
594
624
  source = np.asarray(scans.column("source_index").to_numpy(), dtype=np.int64)
595
- xs = np.asarray(scans.column(x_column).to_numpy(), dtype=np.int64)
596
- ys = np.asarray(scans.column(y_column).to_numpy(), dtype=np.int64)
625
+ xs, has_x = _positions(scans.column(x_column))
626
+ ys, has_y = _positions(scans.column(y_column))
627
+
628
+ # The imaging profile sets both positions of a scan or neither. A
629
+ # scan that belongs to no pixel, a calibration scan for instance, has
630
+ # both null. One without the other places the scan nowhere.
631
+ half = has_x != has_y
632
+ if half.any():
633
+ raise ConversionRefused(
634
+ f"{self.path} gives {int(half.sum())} of {half.size} scans one "
635
+ f"position but not the other ({IMS_POSITION_X} without "
636
+ f"{IMS_POSITION_Y}, or the reverse). A scan on a pixel has "
637
+ f"both, and a scan on no pixel has neither."
638
+ )
639
+ placed = has_x & has_y
597
640
 
598
641
  # One spectrum may own several scans; imaging acquisitions write one.
599
642
  # Keeping the first per spectrum means a multi-scan file resolves to a
600
- # single pixel rather than silently overwriting itself.
643
+ # single pixel rather than silently overwriting itself. A scan with a
644
+ # position goes before one without, so a spectrum is only unplaced
645
+ # when none of its scans is on a pixel.
646
+ first_placed = np.argsort(~placed, kind="stable")
647
+ source, xs, ys, placed = (
648
+ source[first_placed],
649
+ xs[first_placed],
650
+ ys[first_placed],
651
+ placed[first_placed],
652
+ )
601
653
  _, first = np.unique(source, return_index=True)
602
- source, xs, ys = source[first], xs[first], ys[first]
654
+ source, xs, ys, placed = source[first], xs[first], ys[first], placed[first]
603
655
 
604
656
  spectrum_index, counts = self._read_point_counts()
605
657
  order = np.argsort(spectrum_index, kind="stable")
@@ -618,10 +670,28 @@ class MzPeakArchive:
618
670
  self.path.name,
619
671
  )
620
672
  spectrum_index, counts = spectrum_index[keep], counts[keep]
673
+ rows = np.array([lookup[int(s)] for s in spectrum_index], dtype=np.int64)
674
+
675
+ # A spectrum whose scan has no position belongs to no pixel. It is
676
+ # left out as an unacquired pixel is, and must not reach the minimum
677
+ # below, where it would set the origin of the grid.
678
+ on_pixel = placed[rows]
679
+ if not on_pixel.all():
680
+ logger.warning(
681
+ "%d of %d spectra in %s have no position and belong to no "
682
+ "pixel; they are left out",
683
+ int((~on_pixel).sum()),
684
+ on_pixel.size,
685
+ self.path.name,
686
+ )
687
+ spectrum_index, counts, rows = (
688
+ spectrum_index[on_pixel],
689
+ counts[on_pixel],
690
+ rows[on_pixel],
691
+ )
621
692
  if spectrum_index.size == 0:
622
693
  raise ConversionRefused(f"{self.path} contains no positioned spectra.")
623
694
 
624
- rows = np.array([lookup[int(s)] for s in spectrum_index], dtype=np.int64)
625
695
  raw = np.stack([xs[rows], ys[rows]], axis=1)
626
696
 
627
697
  # Positions are 1-based in the reference archives, but the format
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes