scigantic-cryoet
Search the CZ CryoET Data Portal from Python.
import scigantic_cryoet as cryoet
cat = cryoet.CryoetCatalog()
cat.search("Legionella", has_annotations=True)
Installation
$ pip install scigantic-cryoet
Why this exists
s3://cryoet-data-portal-public is public and anonymous, but its top level is nothing but numeric dataset ids. There is no search: finding "a tomogram of a ribosome in a mammalian neuron" otherwise means opening dataset_metadata.json by hand, once per dataset, across all ~370 of them. This package is a catalog and search layer on top of that bucket, the same move scigantic-empiar and scigantic-emdb made for their own archives.
It does not read tomogram pixel data or reimplement OME-Zarr access. The portal already ships a thumbnail.gif/snapshot.gif per dataset (unlike EMPIAR, which ships no previews at all), and the official cryoet-data-portal client already reads the zarr volumes well. This package's job ends at "which dataset, and where."
The catalog
CryoetCatalog loads a pre-built index so search/filter across every dataset is instant, no live reads. Measured against the full portal, 2026-09-02 (370/370 datasets, 0 failures, 129s to build):
| field | fill rate | scope |
|---|---|---|
| title, description, organism, sample_type, disease, assay | 100% | every dataset |
| n_runs, authors, release/deposition dates | 100% | every dataset |
| organism (named), tissue, cell_type | 97% / 96% / 94% | every dataset |
| voxel_spacings, reconstruction_method, annotation_objects | 98% / 98% / 92% | one run per dataset |
| emdb_ids / empiar_ids present | 12% / 6.5% | cross-reference, when deposited |
Read catalog_meta before trusting a fill rate. Fields drawn from dataset_metadata.json (title, organism, sample_type, disease, assay, cross-references, ...) are COMPLETE: every dataset has one. Fields that live one level down at the run/tomogram level (voxel_spacings, reconstruction_method, ctf_corrected, annotation_objects, ...) describe one run, named in sampled_run: walking every run of every dataset is thousands of listings for detail that barely varies within a dataset. catalog_meta names exactly which fields are sampled, so this can't be missed the way an earlier internal EMPIAR catalog once advertised "all ~3,000 entries" while actually holding 12.
cat = cryoet.CryoetCatalog()
cat.catalog_meta # {"catalog_entries": 370, "sampled_fields": [...], ...}
cat.search(organism="Homo sapiens", has_annotations=True, sort="runs")
cat.search(has_emdb=True, sort="runs") # datasets cross-referenced to EMDB, most runs first
cat.gallery(cat.search("spike")) # HTML gallery, portal thumbnails
CryoetCatalog() with no argument loads the published index directly, no setup needed. To develop against a fresher build (or before a new portal dataset has been re-indexed), point it at a local file instead:
cat = cryoet.CryoetCatalog(url="/path/to/cryoet-catalog.json")
# or: export SCIGANTIC_CRYOET_CATALOG=/path/to/cryoet-catalog.json
Cross-referencing EMDB and EMPIAR
Many CryoET Data Portal datasets cite an EMDB structure or an EMPIAR raw-data deposit in their own cross-references. with_emdb()/with_empiar() join on those ids directly, no separate download or lookup table:
$ pip install "scigantic-cryoet[bridge]" # pulls in scigantic-emdb / scigantic-empiar
cat.with_emdb() # every (dataset, EMDB structure, resolution) pair the portal cites
cat.with_empiar() # every (dataset, EMPIAR raw deposit, size, method) pair
Measured against the full portal, 2026-09-02: 160 dataset-to-EMDB pairs across 45 datasets, 27 dataset-to-EMPIAR pairs across 24 datasets. Both raise RuntimeError if the sibling package isn't installed, rather than returning an empty (and misleadingly "no cross-references") result.
Live reads
CryoetClient hits the portal's bucket directly, for a dataset newer than whatever snapshot is loaded, or to double-check a stale field:
client = cryoet.CryoetClient()
client.dataset_metadata(10000) # full dataset_metadata.json, live
client.runs(10000) # run directory names, COMPLETE (not sampled)
Data license
The portal describes its data as "publicly available" / "open access" (checked 2026-09-02, portal homepage and Terms of Use), but does not state a specific license designation (CC0, CC-BY, or otherwise) on either page. Check a dataset's own citation/attribution requirements (via dataset_metadata.json's authors/publications fields, or the portal's own dataset page) before redistributing.
What this doesn't do (yet)
No synonym/alias expansion in search() (a plain "GPCR" won't match "G protein-coupled receptor"); scigantic-empiar's query expansion is the template once this has real query traffic to tune against. No walk of every run per dataset (see the fill-rate table above); if you need every run's metadata for a specific dataset of interest, use CryoetClient.runs() plus the official cryoet-data-portal client.
Metadata
Release files for scigantic-cryoet 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| scigantic_cryoet-0.1.3.tar.gz | 16.6 kB | Without provenance | Details for scigantic_cryoet-0.1.3.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| scigantic_cryoet-0.1.3-py3-none-any.whl | Python 3 | none | any | Details for scigantic_cryoet-0.1.3-py3-none-any.whl |
Total release size: 29.1 kB
Release files / scigantic_cryoet-0.1.3.tar.gz
| Download URL | scigantic_cryoet-0.1.3.tar.gz |
|---|---|
| Size | 16.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cf764da3a2907af527712d2b00f685d8047c9ae655cc6a0e01494b3869f2d35a
|
|
BLAKE2b-256 checksum How to use checksums |
58af02fa4853a7c6d6a2b892f1022df0ecdd925ee0b7a7a29da6fc61d425e57f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / scigantic_cryoet-0.1.3-py3-none-any.whl
| Download URL | scigantic_cryoet-0.1.3-py3-none-any.whl |
|---|---|
| Size | 12.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f9e6ae73353adce58ba74a466738861eded114637dc1e05de9d92994ee47e9f3
|
|
BLAKE2b-256 checksum How to use checksums |
2f3cc9dad743bfdb64a756cc12eac7b64ebc97844c346488e7a807cc9a323ba5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Security for scigantic-cryoet 0.1.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.