Skip to main content

wormscore

Blind scoring of fluorescent neurons in C. elegans, with measurement and genetics statistics. Built for scoring reporter neurons (normal / dim / missing) in confocal z-stacks. Nothing is tied to one neuron, marker or microscope: those are settings in each project's config.json, so other organisms work the same way.

  • Blind: every image gets a random code. Genotypes and file names stay in a sealed key until you finish scoring.
  • Fixed display: every image from the same microscope is shown with the same brightness range. You can page through z-planes and overlay brightfield.
  • Measured, not decided: suggested cell bodies and your drawn regions are measured (peak, mean, local background, sharpest plane, saturation). The numbers are written to files and never shown while you score. The software never labels a cell normal, dim or missing.
  • Traceable: every number links to the exact file, path, series and SHA-256 checksum it came from.
  • Reproducible: every parameter and software version is appended to log.md on each run.
  • Local: runs on your computer only. Nothing is uploaded.

Supported raw formats: Leica .lif, Zeiss .czi, OME-TIFF (including Micro-Manager style files with a .companion.ome). Channel identity (marker vs brightfield) is read from metadata, never guessed.

Install

Windows, no Python needed: download wormscore-windows.zip from the Releases page, unzip it, and double-click wormscore.exe.

With Python 3.12 or newer:

pip install git+https://github.com/arjunkai/wormscore.git

This installs a wormscore command and a wormscore-launcher window.

Try it in two minutes (simulated data)

wormscore demo my_demo
wormscore inventory my_demo
wormscore prepare my_demo
wormscore app my_demo

demo writes 20 simulated worm heads (controls with two normal cells; mutants with cells that are normal, dim or missing at random) and a demo_truth.csv you can check your calls against later. In the launcher window the same steps are buttons: Demo... > 1. Scan data > 2. Build blind set > 3. Score.

Real worms: wormscore demo my_demo --real (or Yes in the launcher's Demo dialog) downloads four L1 heads with an endogenous GFP reporter, about 150 MB, from Sun and Hobert 2021 (Zenodo 5602160, CC BY 4.0). Each file is checked against its MD5 from the Zenodo record and cached in %LOCALAPPDATA%\wormscore\demo_cache (~/.cache elsewhere). The two reporters stand in for two genotypes; both are normal animals, so this is for practice. The images are not part of this repository.

Using it on your own images

  1. Copy your data to a local folder (not a synced cloud folder if the data is not yours to share): wormscore copy D:\from\drive C:\data\my_copy copies every file, checks each one by SHA-256 and makes the copies read-only.
  2. Make a project: wormscore init C:\projects\my_project, then edit config.json: point sources at your images, write genotype rules, and name your neurons. See examples/config_example.json.
  3. Scan: wormscore inventory my_project lists every file (outputs/manifest.csv: raw image, duplicate, derived projection, reference, hidden system file) and every image with its metadata and channel identity (outputs/inventory.csv). Check the flags column.
  4. Build the blind set: wormscore prepare my_project applies the inclusion rules, assigns codes, finds and measures suggested cells, and writes the sealed key. Excluded images and the reasons are in outputs/excluded.csv. To leave out images by name (for example a plate with the wrong reporter), add "exclude": [{"match": "*pattern*", "reason": "why"}] to that source. Images taken after scoring started can be added with wormscore prepare my_project --add-new-images (scan first): existing codes stay the same and new images get codes after the last one.
  5. Score: wormscore app my_project. For each image: answer any yellow questions, score each neuron, save, then outline each cell body (or accept a suggestion) and save regions.
  6. Unblind after scoring: wormscore unblind my_project --i-have-finished-scoring. Writes outputs/unblinded/merged.csv (scores + numbers + key, one row per image), a summary, and results tables: per_neuron.csv (one row per animal and neuron, for plotting), penetrance.csv (animals with 0, 1, 2 ... affected neurons) and fisher_tests.csv (Fisher's exact within each microscope, Bonferroni-corrected). Set unblinding.reference_genotype in config.json to test against a control. Optional, off unless set in unblinding: question_outcomes turns the per-neuron questions into the same penetrance and Fisher tables (for example "process defect" when a dendrite question is answered "no"), and interaction tests a double mutant against the value two single mutants predict (Product model by default) with a binomial test. Also optional: a secondary definition of "affected" (descriptive, within one microscope), planned comparisons, one-sided tests, labelled sources, and comparisons across microscopes for chosen measures (with warnings). All of these are recorded as an analysis plan before scoring and locked once scoring starts. See docs/METHODS.md. methods_text.md is a draft Methods paragraph on blinding, measurement and statistics; fill in the blinding section of config.json (who coded, who scored) or edit the [brackets] it leaves.

Project folder

Path Contents Open while scoring?
config.json every parameter yes
log.md every run: parameters, software versions, counts yes
outputs/manifest.csv, inventory.csv, excluded.csv what was found and what was left out yes
outputs/auto_measurements.csv numbers for suggested spots avoid until done
blind/ images for scoring, named by code used by the app
scoring/ your scores, regions and their measurements scores yes; avoid roi_measurements.csv
key/ code to file, genotype, settings no, not until scoring is finished

How it works

See docs/METHODS.md for every step in plain language, suitable for adapting into a Methods section, including the measurement definitions and their limits.

Development

pip install -e .[dev]
pytest

The tests build a simulated project and check the measurements, the blinding (no genotype or file name reaches the scoring page), code stability, the unblinding locks and traceability. Leica and Zeiss readers are checked against real files locally; real images are never committed.

Build the Windows app: packaging\build_windows.bat.

Privacy

This repository contains code only. .gitignore excludes image formats, keys, scores and outputs. Do not commit or upload data that belongs to someone else.

License and citation

MIT License (see LICENSE). If you use wormscore in research, please cite it: GitHub's "Cite this repository" button (from CITATION.cff) gives the reference.

wormscore reads Leica files with liffile and Zeiss files with czifile (both BSD-3). The Windows app bundles these and other libraries; their licenses are in THIRD_PARTY_LICENSES.txt next to wormscore.exe.

Metadata

Release files for wormscore 0.6.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for wormscore 0.6.1
File Size Uploaded Provenance
wormscore-0.6.1.tar.gz 79.1 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for wormscore 0.6.1
File Interpreter ABI Platform
wormscore-0.6.1-py3-none-any.whl Python 3 none any Details

Total release size: 147.5 kB

Release files / wormscore-0.6.1.tar.gz

Download URL wormscore-0.6.1.tar.gz
Size 79.1 kB
Tags Source
SHA-256 checksum
How to use checksums
f4a3f9d508c2cb64bc8a048048c20e651f88798281c0287ce0af5f6bfebcabba
BLAKE2b-256 checksum
How to use checksums
342515c5dcd84740a17b5e4239a84007d1f1d29d602cf327095d09effbc6ac1f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.3

Release files / wormscore-0.6.1-py3-none-any.whl

Download URL wormscore-0.6.1-py3-none-any.whl
Size 68.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
43f922c595a091421034bff3f110636a7ac338987ff378afbf38ce131be11c83
BLAKE2b-256 checksum
How to use checksums
774134db06225951177fa78373a7dc92c19c0576eb390b775377fb29a87bbe03
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.3

Security for wormscore 0.6.1

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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page