thyra 4.6.2__tar.gz → 4.6.3__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 (163) hide show
  1. {thyra-4.6.2 → thyra-4.6.3}/PKG-INFO +43 -19
  2. {thyra-4.6.2 → thyra-4.6.3}/README.md +37 -15
  3. {thyra-4.6.2 → thyra-4.6.3}/pyproject.toml +18 -6
  4. {thyra-4.6.2 → thyra-4.6.3}/thyra/__init__.py +1 -1
  5. {thyra-4.6.2 → thyra-4.6.3}/thyra/__main__.py +9 -1
  6. {thyra-4.6.2 → thyra-4.6.3}/.gitignore +0 -0
  7. {thyra-4.6.2 → thyra-4.6.3}/LICENSE +0 -0
  8. {thyra-4.6.2 → thyra-4.6.3}/thyra/alignment/__init__.py +0 -0
  9. {thyra-4.6.2 → thyra-4.6.3}/thyra/alignment/affine.py +0 -0
  10. {thyra-4.6.2 → thyra-4.6.3}/thyra/alignment/teaching_points.py +0 -0
  11. {thyra-4.6.2 → thyra-4.6.3}/thyra/config.py +0 -0
  12. {thyra-4.6.2 → thyra-4.6.3}/thyra/convert.py +0 -0
  13. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/__init__.py +0 -0
  14. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/__init__.py +0 -0
  15. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/_chunking.py +0 -0
  16. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/acquisition_frame.py +0 -0
  17. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/base_spatialdata_converter.py +0 -0
  18. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/converter.py +0 -0
  19. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/csc_assembly.py +0 -0
  20. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/fused_passes.py +0 -0
  21. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/mobility_heatmap.py +0 -0
  22. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/mobility_table.py +0 -0
  23. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/msms_table.py +0 -0
  24. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/optical_image.py +0 -0
  25. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/root_attrs.py +0 -0
  26. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/sibling_tables.py +0 -0
  27. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/streaming_converter.py +0 -0
  28. {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/uns_assembler.py +0 -0
  29. {thyra-4.6.2 → thyra-4.6.3}/thyra/core/__init__.py +0 -0
  30. {thyra-4.6.2 → thyra-4.6.3}/thyra/core/base_converter.py +0 -0
  31. {thyra-4.6.2 → thyra-4.6.3}/thyra/core/base_extractor.py +0 -0
  32. {thyra-4.6.2 → thyra-4.6.3}/thyra/core/base_reader.py +0 -0
  33. {thyra-4.6.2 → thyra-4.6.3}/thyra/core/conversion_state.py +0 -0
  34. {thyra-4.6.2 → thyra-4.6.3}/thyra/core/drop_tally.py +0 -0
  35. {thyra-4.6.2 → thyra-4.6.3}/thyra/core/frames.py +0 -0
  36. {thyra-4.6.2 → thyra-4.6.3}/thyra/core/mass_axis.py +0 -0
  37. {thyra-4.6.2 → thyra-4.6.3}/thyra/core/mobility.py +0 -0
  38. {thyra-4.6.2 → thyra-4.6.3}/thyra/core/msms.py +0 -0
  39. {thyra-4.6.2 → thyra-4.6.3}/thyra/core/positions.py +0 -0
  40. {thyra-4.6.2 → thyra-4.6.3}/thyra/core/region_map.py +0 -0
  41. {thyra-4.6.2 → thyra-4.6.3}/thyra/core/registry.py +0 -0
  42. {thyra-4.6.2 → thyra-4.6.3}/thyra/errors.py +0 -0
  43. {thyra-4.6.2 → thyra-4.6.3}/thyra/mass_axis_plan.py +0 -0
  44. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/__init__.py +0 -0
  45. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/constants.py +0 -0
  46. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/document.py +0 -0
  47. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/__init__.py +0 -0
  48. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/bruker_extractor.py +0 -0
  49. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/imzml_extractor.py +0 -0
  50. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/imzml_header_extractor.py +0 -0
  51. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/mzpeak_extractor.py +0 -0
  52. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/phi_extractor.py +0 -0
  53. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/solarix_extractor.py +0 -0
  54. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/waters_extractor.py +0 -0
  55. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/ontology/__init__.py +0 -0
  56. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/ontology/_ims.py +0 -0
  57. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/ontology/_ms.py +0 -0
  58. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/ontology/_uo.py +0 -0
  59. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/ontology/cache.py +0 -0
  60. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/ontology/dump_obo_files.py +0 -0
  61. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/personal_data.py +0 -0
  62. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/__init__.py +0 -0
  63. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/axis_fingerprint.py +0 -0
  64. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/builder.py +0 -0
  65. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/cli.py +0 -0
  66. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/generate.py +0 -0
  67. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/metaspace.py +0 -0
  68. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/models.py +0 -0
  69. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/msi_metadata.linkml.yaml +0 -0
  70. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/msi_metadata_schema_v0_14.json +0 -0
  71. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/store_io.py +0 -0
  72. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/validate.py +0 -0
  73. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/vocab.py +0 -0
  74. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/types.py +0 -0
  75. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/uns_compat.py +0 -0
  76. {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/validator.py +0 -0
  77. {thyra-4.6.2 → thyra-4.6.3}/thyra/preview.py +0 -0
  78. {thyra-4.6.2 → thyra-4.6.3}/thyra/py.typed +0 -0
  79. {thyra-4.6.2 → thyra-4.6.3}/thyra/reader_options.py +0 -0
  80. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/__init__.py +0 -0
  81. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/__init__.py +0 -0
  82. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/base_bruker_reader.py +0 -0
  83. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/folder_structure.py +0 -0
  84. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/mis_parser.py +0 -0
  85. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/rapiflex/__init__.py +0 -0
  86. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/rapiflex/rapiflex_reader.py +0 -0
  87. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/solarix/__init__.py +0 -0
  88. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/solarix/solarix_reader.py +0 -0
  89. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/__init__.py +0 -0
  90. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/__init__.py +0 -0
  91. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/dll/LICENCE-BRUKER.txt +0 -0
  92. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/dll/README.md +0 -0
  93. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/dll/timsdata.dll +0 -0
  94. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/dll/timsdata.so +0 -0
  95. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/dll_manager.py +0 -0
  96. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/platform_detector.py +0 -0
  97. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/sdk_functions.py +0 -0
  98. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/timstof_reader.py +0 -0
  99. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/vendor_db.py +0 -0
  100. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/imzml/__init__.py +0 -0
  101. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/imzml/_pyimzml_compat.py +0 -0
  102. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/imzml/header.py +0 -0
  103. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/imzml/imzml_reader.py +0 -0
  104. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/imzml/mobility_array.py +0 -0
  105. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/mzpeak/__init__.py +0 -0
  106. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/mzpeak/chunk_decoding.py +0 -0
  107. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/mzpeak/mzpeak_reader.py +0 -0
  108. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/phi/__init__.py +0 -0
  109. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/phi/event_stream.py +0 -0
  110. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/phi/mass_axis.py +0 -0
  111. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/phi/phi_header.py +0 -0
  112. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/phi/phi_reader.py +0 -0
  113. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/__init__.py +0 -0
  114. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/imaging_grid.py +0 -0
  115. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/instrument.py +0 -0
  116. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/lib/MLReader.dll +0 -0
  117. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/lib/MassLynxRaw.dll +0 -0
  118. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/lib/libMLReader.so +0 -0
  119. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/lib/libMassLynxRaw.so +0 -0
  120. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/lockmass.py +0 -0
  121. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/masslynx_lib.py +0 -0
  122. {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/waters_reader.py +0 -0
  123. {thyra-4.6.2 → thyra-4.6.3}/thyra/regions.py +0 -0
  124. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/__init__.py +0 -0
  125. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/axis_planner.py +0 -0
  126. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/binning.py +0 -0
  127. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/common_axis.py +0 -0
  128. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/constants.py +0 -0
  129. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/data_characteristics.py +0 -0
  130. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/decision_tree.py +0 -0
  131. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/gaps.py +0 -0
  132. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/instrument_detectors.py +0 -0
  133. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/interpolation.py +0 -0
  134. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/__init__.py +0 -0
  135. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/base_generator.py +0 -0
  136. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/fticr_generator.py +0 -0
  137. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/linear_generator.py +0 -0
  138. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/linear_tof_generator.py +0 -0
  139. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/orbitrap_generator.py +0 -0
  140. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/reflector_tof_generator.py +0 -0
  141. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/tof_generator.py +0 -0
  142. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/memory_guard.py +0 -0
  143. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mobility_grid.py +0 -0
  144. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/plan.py +0 -0
  145. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/strategies/__init__.py +0 -0
  146. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/strategies/base.py +0 -0
  147. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/strategies/nearest_neighbor.py +0 -0
  148. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/strategies/tic_preserving.py +0 -0
  149. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/tic.py +0 -0
  150. {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/types.py +0 -0
  151. {thyra-4.6.2 → thyra-4.6.3}/thyra/tools/__init__.py +0 -0
  152. {thyra-4.6.2 → thyra-4.6.3}/thyra/tools/check_ontology.py +0 -0
  153. {thyra-4.6.2 → thyra-4.6.3}/thyra/tools/make_example_data.py +0 -0
  154. {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/__init__.py +0 -0
  155. {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/bruker_exceptions.py +0 -0
  156. {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/imzml_coordinate_base.py +0 -0
  157. {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/imzml_spectrum_terms.py +0 -0
  158. {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/logging_config.py +0 -0
  159. {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/ms_levels.py +0 -0
  160. {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/output_files.py +0 -0
  161. {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/pyimzml_direct.py +0 -0
  162. {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/store_lifecycle.py +0 -0
  163. {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/windows_paths.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: thyra
3
- Version: 4.6.2
4
- Summary: A modern Python library for converting Mass Spectrometry Imaging (MSI) data into SpatialData/Zarr format - your portal to spatial omics
3
+ Version: 4.6.3
4
+ Summary: Convert mass spectrometry imaging (MSI) data from Bruker, Waters, PHI and imzML, with ion mobility and MS/MS, into the open SpatialData/Zarr format
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
7
7
  Project-URL: Documentation, https://M4i-Imaging-Mass-Spectrometry.github.io/thyra/
@@ -15,11 +15,13 @@ Author-email: Theodoros Visvikis <t.visvikis@maastrichtuniversity.nl>
15
15
  Maintainer-email: Theodoros Visvikis <t.visvikis@maastrichtuniversity.nl>
16
16
  License-Expression: MIT
17
17
  License-File: LICENSE
18
- Keywords: bioinformatics,bruker,data-conversion,imaging,imzml,ion-mobility,mass-spectrometry,msi,msms,omics,pasef,scientific-computing,spatial-omics,spatialdata,tims,timstof,zarr
18
+ Keywords: anndata,bioinformatics,bruker,data-conversion,desi,imaging,imzml,ion-mobility,lipidomics,maldi,mass-spectrometry,mass-spectrometry-imaging,metabolomics,msi,msms,omics,pasef,scientific-computing,scverse,spatial-omics,spatialdata,tims,timstof,tof-sims,waters,zarr
19
19
  Classifier: Development Status :: 4 - Beta
20
20
  Classifier: Environment :: Console
21
21
  Classifier: Intended Audience :: Science/Research
22
- Classifier: Operating System :: OS Independent
22
+ Classifier: Operating System :: MacOS
23
+ Classifier: Operating System :: Microsoft :: Windows
24
+ Classifier: Operating System :: POSIX :: Linux
23
25
  Classifier: Programming Language :: Python :: 3
24
26
  Classifier: Programming Language :: Python :: 3.12
25
27
  Classifier: Programming Language :: Python :: 3.13
@@ -65,12 +67,18 @@ Description-Content-Type: text/markdown
65
67
  [![Docs](https://img.shields.io/badge/docs-mkdocs-blue)](https://M4i-Imaging-Mass-Spectrometry.github.io/thyra)
66
68
  [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/M4i-Imaging-Mass-Spectrometry/thyra/blob/main/notebooks/Thyra_Validation_Workflow.ipynb)
67
69
 
68
- **Thyra converts imaging mass spectrometry data into one open format.** It
69
- reads the files your instrument writes (Bruker, Waters, PHI, or imzML from any
70
- vendor) and saves them in [SpatialData](https://spatialdata.scverse.org/),
71
- which analysis and viewing tools can read. It keeps ion mobility (TIMS 1/K0)
72
- and MS/MS (PASEF, iprm-PASEF) data, not only the spectra. You do not need to
73
- know how to program.
70
+ **Thyra converts imaging mass spectrometry data into one open format: the
71
+ spectra, the ion mobility and the MS/MS.** It reads the MSI files your MALDI,
72
+ DESI or ToF-SIMS instrument writes (Bruker, Waters, PHI, or imzML from any
73
+ vendor) and saves them in [SpatialData](https://spatialdata.scverse.org/), the
74
+ open format of the [scverse](https://scverse.org/) tools. Ion mobility (TIMS
75
+ 1/K0, Waters drift time) and MS/MS (PASEF, iprm-PASEF) are kept beside the
76
+ spectra, not dropped. Converting needs no programming.
77
+
78
+ **What you gain:** your data leaves the vendor format and can sit beside the
79
+ microscopy and spatial transcriptomics data of the same tissue, in a format
80
+ built to hold them together. In Python it opens as an AnnData table, one row
81
+ per pixel, with the optical image next to it.
74
82
 
75
83
  **[Documentation](https://M4i-Imaging-Mass-Spectrometry.github.io/thyra)** | [Install](https://M4i-Imaging-Mass-Spectrometry.github.io/thyra/install/) | [Your first conversion](https://M4i-Imaging-Mass-Spectrometry.github.io/thyra/getting-started/) | [Tutorial](https://M4i-Imaging-Mass-Spectrometry.github.io/thyra/tutorial/) | [Technical reference](https://M4i-Imaging-Mass-Spectrometry.github.io/thyra/technical-reference/)
76
84
 
@@ -99,14 +107,15 @@ also converts the published example dataset
99
107
 
100
108
  ## What you can convert
101
109
 
102
- | Your instrument | Point Thyra at |
103
- |---|---|
104
- | Bruker timsTOF or solariX | the folder ending in `.d` |
105
- | Bruker rapifleX | the acquisition folder |
106
- | Waters (MassLynx) | the folder ending in `.raw` |
107
- | PHI nanoTOF (ToF-SIMS) | the file ending in `.raw` |
108
- | Any instrument that exports imzML | the `.imzML` file, with its `.ibd` file next to it |
109
- | mzPeak (experimental) | the `.mzpeak` file |
110
+ | Your instrument | Point Thyra at | Kept beside the spectra |
111
+ |---|---|---|
112
+ | Bruker timsTOF | the folder ending in `.d` | ion mobility (1/K0), MS/MS (PASEF, iprm-PASEF), optical image and its alignment, regions |
113
+ | Bruker solariX | the folder ending in `.d` | optical image |
114
+ | Bruker rapifleX | the acquisition folder | optical image and its alignment |
115
+ | Waters (MassLynx) | the folder ending in `.raw` | ion mobility (drift time, Synapt and Cyclic IMS), regions |
116
+ | PHI nanoTOF (ToF-SIMS) | the file ending in `.raw` | mosaic tiles joined into one image |
117
+ | Any instrument that exports imzML | the `.imzML` file, with its `.ibd` file next to it | ion mobility array, 3D data |
118
+ | mzPeak (experimental) | the `.mzpeak` file | |
110
119
 
111
120
  imzML with a mobility array is read too. In continuous mode, as TIMSImaging
112
121
  writes it, the mobility is kept as its own table. In processed mode, as
@@ -120,6 +129,20 @@ PHI mosaic, MS/MS and depth-profiling acquisitions have so far been tested
120
129
  only on synthetic files. If you have real data in those modes, please get in
121
130
  touch.
122
131
 
132
+ ### Not supported yet, and how to change that
133
+
134
+ Only the formats in the table are read natively. Other vendor formats
135
+ (Thermo, Shimadzu, Agilent, SCIEX and others) are not: export imzML from the
136
+ vendor software and convert that.
137
+
138
+ A gap is there because nobody has needed it yet or because time ran out, not
139
+ because it cannot be done. If your instrument, format or acquisition mode is
140
+ missing,
141
+ [tell us in the discussions](https://github.com/M4i-Imaging-Mass-Spectrometry/thyra/discussions).
142
+ A small example dataset is the fastest way to a new reader. Collaborations are
143
+ welcome: on formats, on tools that read the result, and on the metadata
144
+ schema.
145
+
123
146
  ## What you get
124
147
 
125
148
  One folder ending in `.zarr`, holding:
@@ -128,7 +151,8 @@ One folder ending in `.zarr`, holding:
128
151
  - an image of the total ion current (TIC)
129
152
  - the optical image of the slide, when the acquisition has one
130
153
  - ion mobility and MS/MS data, when the acquisition has them (below)
131
- - a validated description of the acquisition, ready for METASPACE
154
+ - a validated description of the acquisition, which Thyra can export as a
155
+ METASPACE submission file
132
156
 
133
157
  Thyra handles datasets larger than your computer's memory, slides with
134
158
  several regions, and 3D data.
@@ -10,12 +10,18 @@
10
10
  [![Docs](https://img.shields.io/badge/docs-mkdocs-blue)](https://M4i-Imaging-Mass-Spectrometry.github.io/thyra)
11
11
  [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/M4i-Imaging-Mass-Spectrometry/thyra/blob/main/notebooks/Thyra_Validation_Workflow.ipynb)
12
12
 
13
- **Thyra converts imaging mass spectrometry data into one open format.** It
14
- reads the files your instrument writes (Bruker, Waters, PHI, or imzML from any
15
- vendor) and saves them in [SpatialData](https://spatialdata.scverse.org/),
16
- which analysis and viewing tools can read. It keeps ion mobility (TIMS 1/K0)
17
- and MS/MS (PASEF, iprm-PASEF) data, not only the spectra. You do not need to
18
- know how to program.
13
+ **Thyra converts imaging mass spectrometry data into one open format: the
14
+ spectra, the ion mobility and the MS/MS.** It reads the MSI files your MALDI,
15
+ DESI or ToF-SIMS instrument writes (Bruker, Waters, PHI, or imzML from any
16
+ vendor) and saves them in [SpatialData](https://spatialdata.scverse.org/), the
17
+ open format of the [scverse](https://scverse.org/) tools. Ion mobility (TIMS
18
+ 1/K0, Waters drift time) and MS/MS (PASEF, iprm-PASEF) are kept beside the
19
+ spectra, not dropped. Converting needs no programming.
20
+
21
+ **What you gain:** your data leaves the vendor format and can sit beside the
22
+ microscopy and spatial transcriptomics data of the same tissue, in a format
23
+ built to hold them together. In Python it opens as an AnnData table, one row
24
+ per pixel, with the optical image next to it.
19
25
 
20
26
  **[Documentation](https://M4i-Imaging-Mass-Spectrometry.github.io/thyra)** | [Install](https://M4i-Imaging-Mass-Spectrometry.github.io/thyra/install/) | [Your first conversion](https://M4i-Imaging-Mass-Spectrometry.github.io/thyra/getting-started/) | [Tutorial](https://M4i-Imaging-Mass-Spectrometry.github.io/thyra/tutorial/) | [Technical reference](https://M4i-Imaging-Mass-Spectrometry.github.io/thyra/technical-reference/)
21
27
 
@@ -44,14 +50,15 @@ also converts the published example dataset
44
50
 
45
51
  ## What you can convert
46
52
 
47
- | Your instrument | Point Thyra at |
48
- |---|---|
49
- | Bruker timsTOF or solariX | the folder ending in `.d` |
50
- | Bruker rapifleX | the acquisition folder |
51
- | Waters (MassLynx) | the folder ending in `.raw` |
52
- | PHI nanoTOF (ToF-SIMS) | the file ending in `.raw` |
53
- | Any instrument that exports imzML | the `.imzML` file, with its `.ibd` file next to it |
54
- | mzPeak (experimental) | the `.mzpeak` file |
53
+ | Your instrument | Point Thyra at | Kept beside the spectra |
54
+ |---|---|---|
55
+ | Bruker timsTOF | the folder ending in `.d` | ion mobility (1/K0), MS/MS (PASEF, iprm-PASEF), optical image and its alignment, regions |
56
+ | Bruker solariX | the folder ending in `.d` | optical image |
57
+ | Bruker rapifleX | the acquisition folder | optical image and its alignment |
58
+ | Waters (MassLynx) | the folder ending in `.raw` | ion mobility (drift time, Synapt and Cyclic IMS), regions |
59
+ | PHI nanoTOF (ToF-SIMS) | the file ending in `.raw` | mosaic tiles joined into one image |
60
+ | Any instrument that exports imzML | the `.imzML` file, with its `.ibd` file next to it | ion mobility array, 3D data |
61
+ | mzPeak (experimental) | the `.mzpeak` file | |
55
62
 
56
63
  imzML with a mobility array is read too. In continuous mode, as TIMSImaging
57
64
  writes it, the mobility is kept as its own table. In processed mode, as
@@ -65,6 +72,20 @@ PHI mosaic, MS/MS and depth-profiling acquisitions have so far been tested
65
72
  only on synthetic files. If you have real data in those modes, please get in
66
73
  touch.
67
74
 
75
+ ### Not supported yet, and how to change that
76
+
77
+ Only the formats in the table are read natively. Other vendor formats
78
+ (Thermo, Shimadzu, Agilent, SCIEX and others) are not: export imzML from the
79
+ vendor software and convert that.
80
+
81
+ A gap is there because nobody has needed it yet or because time ran out, not
82
+ because it cannot be done. If your instrument, format or acquisition mode is
83
+ missing,
84
+ [tell us in the discussions](https://github.com/M4i-Imaging-Mass-Spectrometry/thyra/discussions).
85
+ A small example dataset is the fastest way to a new reader. Collaborations are
86
+ welcome: on formats, on tools that read the result, and on the metadata
87
+ schema.
88
+
68
89
  ## What you get
69
90
 
70
91
  One folder ending in `.zarr`, holding:
@@ -73,7 +94,8 @@ One folder ending in `.zarr`, holding:
73
94
  - an image of the total ion current (TIC)
74
95
  - the optical image of the slide, when the acquisition has one
75
96
  - ion mobility and MS/MS data, when the acquisition has them (below)
76
- - a validated description of the acquisition, ready for METASPACE
97
+ - a validated description of the acquisition, which Thyra can export as a
98
+ METASPACE submission file
77
99
 
78
100
  Thyra handles datasets larger than your computer's memory, slides with
79
101
  several regions, and 3D data.
@@ -4,8 +4,8 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "thyra"
7
- version = "4.6.2"
8
- description = "A modern Python library for converting Mass Spectrometry Imaging (MSI) data into SpatialData/Zarr format - your portal to spatial omics"
7
+ version = "4.6.3"
8
+ description = "Convert mass spectrometry imaging (MSI) data from Bruker, Waters, PHI and imzML, with ion mobility and MS/MS, into the open SpatialData/Zarr format"
9
9
  authors = [{ name = "Theodoros Visvikis", email = "t.visvikis@maastrichtuniversity.nl" }]
10
10
  maintainers = [{ name = "Theodoros Visvikis", email = "t.visvikis@maastrichtuniversity.nl" }]
11
11
  license = "MIT"
@@ -14,14 +14,23 @@ readme = "README.md"
14
14
  requires-python = ">=3.12, <3.15"
15
15
  keywords = [
16
16
  "mass-spectrometry",
17
+ "mass-spectrometry-imaging",
17
18
  "imaging",
18
19
  "spatialdata",
20
+ "anndata",
21
+ "scverse",
19
22
  "zarr",
20
23
  "omics",
24
+ "metabolomics",
25
+ "lipidomics",
21
26
  "bioinformatics",
22
27
  "msi",
28
+ "maldi",
29
+ "desi",
30
+ "tof-sims",
23
31
  "imzml",
24
32
  "bruker",
33
+ "waters",
25
34
  "timstof",
26
35
  "ion-mobility",
27
36
  "tims",
@@ -35,7 +44,11 @@ keywords = [
35
44
  classifiers = [
36
45
  "Development Status :: 4 - Beta",
37
46
  "Intended Audience :: Science/Research",
38
- "Operating System :: OS Independent",
47
+ # Not "OS Independent": the timsTOF and Waters readers load vendor
48
+ # libraries that exist for Windows and Linux only.
49
+ "Operating System :: Microsoft :: Windows",
50
+ "Operating System :: POSIX :: Linux",
51
+ "Operating System :: MacOS",
39
52
  "Programming Language :: Python :: 3",
40
53
  "Programming Language :: Python :: 3.12",
41
54
  "Programming Language :: Python :: 3.13",
@@ -86,7 +99,7 @@ dependencies = [
86
99
  # 8.3.1 and passes on what CI resolves. That cost a test on main -- see
87
100
  # tests/unit/test_cli_interactive_calibration.py. Green CI is evidence
88
101
  # about 8.4.2 and about nothing else in the declared range.
89
- "click>=8.1, <9", # verified 8.1.8, 8.4.2 and 8.5.0
102
+ "click>=8.1, <9", # verified 8.1.8, 8.4.2 and 8.5.1
90
103
  # Secure XML parsing for the shared Bruker `.mis` parser, which every
91
104
  # Bruker path goes through: the Rapiflex, timsTOF and solariX readers and
92
105
  # BrukerMetadataExtractor. `mis_parser` imports it unconditionally and has
@@ -253,8 +266,7 @@ Paper = "https://doi.org/10.1038/s41592-026-03305-5"
253
266
  "Bug Tracker" = "https://github.com/M4i-Imaging-Mass-Spectrometry/thyra/issues"
254
267
  Discussions = "https://github.com/M4i-Imaging-Mass-Spectrometry/thyra/discussions"
255
268
  Changelog = "https://github.com/M4i-Imaging-Mass-Spectrometry/thyra/blob/main/CHANGELOG.md"
256
- # There is no CONTRIBUTING.md at the repository root; the guide lives at
257
- # docs/contributing.md and is published as this page.
269
+ # The full guide lives at docs/contributing.md and is published as this page.
258
270
  Contributing = "https://M4i-Imaging-Mass-Spectrometry.github.io/thyra/contributing/"
259
271
 
260
272
  [project.scripts]
@@ -70,7 +70,7 @@ warnings.filterwarnings(
70
70
  category=FutureWarning,
71
71
  )
72
72
 
73
- __version__ = "4.6.2"
73
+ __version__ = "4.6.3"
74
74
 
75
75
  #: Public name -> the module that defines it, imported on first access.
76
76
  _LAZY_ATTRS = {
@@ -854,9 +854,17 @@ class GroupedCommand(click.Command):
854
854
 
855
855
  @staticmethod
856
856
  def _collect_options(ctx: click.Context) -> tuple:
857
- """Collect options and build name-to-record mapping."""
857
+ """Collect options and build name-to-record mapping.
858
+
859
+ Positional arguments are left out, as ``click.Command.format_options``
860
+ leaves them out: they are on the usage line and in the help text.
861
+ From click 8.5.1 an argument always has a help record, so without
862
+ this they would land in the trailing ``Options:`` section.
863
+ """
858
864
  opts = []
859
865
  for param in ctx.command.get_params(ctx):
866
+ if isinstance(param, click.Argument):
867
+ continue
860
868
  rv = param.get_help_record(ctx)
861
869
  if rv is not None:
862
870
  opts.append((param, rv))
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes