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.
- {thyra-4.6.2 → thyra-4.6.3}/PKG-INFO +43 -19
- {thyra-4.6.2 → thyra-4.6.3}/README.md +37 -15
- {thyra-4.6.2 → thyra-4.6.3}/pyproject.toml +18 -6
- {thyra-4.6.2 → thyra-4.6.3}/thyra/__init__.py +1 -1
- {thyra-4.6.2 → thyra-4.6.3}/thyra/__main__.py +9 -1
- {thyra-4.6.2 → thyra-4.6.3}/.gitignore +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/LICENSE +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/alignment/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/alignment/affine.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/alignment/teaching_points.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/config.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/convert.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/_chunking.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/acquisition_frame.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/base_spatialdata_converter.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/converter.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/csc_assembly.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/fused_passes.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/mobility_heatmap.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/mobility_table.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/msms_table.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/optical_image.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/root_attrs.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/sibling_tables.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/streaming_converter.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/converters/spatialdata/uns_assembler.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/core/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/core/base_converter.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/core/base_extractor.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/core/base_reader.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/core/conversion_state.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/core/drop_tally.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/core/frames.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/core/mass_axis.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/core/mobility.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/core/msms.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/core/positions.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/core/region_map.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/core/registry.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/errors.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/mass_axis_plan.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/constants.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/document.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/bruker_extractor.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/imzml_extractor.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/imzml_header_extractor.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/mzpeak_extractor.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/phi_extractor.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/solarix_extractor.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/extractors/waters_extractor.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/ontology/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/ontology/_ims.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/ontology/_ms.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/ontology/_uo.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/ontology/cache.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/ontology/dump_obo_files.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/personal_data.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/axis_fingerprint.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/builder.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/cli.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/generate.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/metaspace.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/models.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/msi_metadata.linkml.yaml +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/msi_metadata_schema_v0_14.json +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/store_io.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/validate.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/schema/vocab.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/types.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/uns_compat.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/metadata/validator.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/preview.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/py.typed +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/reader_options.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/base_bruker_reader.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/folder_structure.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/mis_parser.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/rapiflex/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/rapiflex/rapiflex_reader.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/solarix/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/solarix/solarix_reader.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/dll/LICENCE-BRUKER.txt +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/dll/README.md +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/dll/timsdata.dll +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/dll/timsdata.so +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/dll_manager.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/platform_detector.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/sdk/sdk_functions.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/timstof/timstof_reader.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/bruker/vendor_db.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/imzml/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/imzml/_pyimzml_compat.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/imzml/header.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/imzml/imzml_reader.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/imzml/mobility_array.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/mzpeak/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/mzpeak/chunk_decoding.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/mzpeak/mzpeak_reader.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/phi/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/phi/event_stream.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/phi/mass_axis.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/phi/phi_header.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/phi/phi_reader.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/imaging_grid.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/instrument.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/lib/MLReader.dll +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/lib/MassLynxRaw.dll +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/lib/libMLReader.so +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/lib/libMassLynxRaw.so +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/lockmass.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/masslynx_lib.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/readers/waters/waters_reader.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/regions.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/axis_planner.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/binning.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/common_axis.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/constants.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/data_characteristics.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/decision_tree.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/gaps.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/instrument_detectors.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/interpolation.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/base_generator.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/fticr_generator.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/linear_generator.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/linear_tof_generator.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/orbitrap_generator.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/reflector_tof_generator.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mass_axis/tof_generator.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/memory_guard.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/mobility_grid.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/plan.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/strategies/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/strategies/base.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/strategies/nearest_neighbor.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/strategies/tic_preserving.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/tic.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/resampling/types.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/tools/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/tools/check_ontology.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/tools/make_example_data.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/__init__.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/bruker_exceptions.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/imzml_coordinate_base.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/imzml_spectrum_terms.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/logging_config.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/ms_levels.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/output_files.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/pyimzml_direct.py +0 -0
- {thyra-4.6.2 → thyra-4.6.3}/thyra/utils/store_lifecycle.py +0 -0
- {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.
|
|
4
|
-
Summary:
|
|
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 ::
|
|
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
|
[](https://M4i-Imaging-Mass-Spectrometry.github.io/thyra)
|
|
66
68
|
[](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
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
|
105
|
-
| Bruker
|
|
106
|
-
|
|
|
107
|
-
|
|
|
108
|
-
|
|
|
109
|
-
|
|
|
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,
|
|
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
|
[](https://M4i-Imaging-Mass-Spectrometry.github.io/thyra)
|
|
11
11
|
[](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
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
|
50
|
-
| Bruker
|
|
51
|
-
|
|
|
52
|
-
|
|
|
53
|
-
|
|
|
54
|
-
|
|
|
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,
|
|
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.
|
|
8
|
-
description = "
|
|
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
|
-
|
|
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.
|
|
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
|
-
#
|
|
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]
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|