MIHCSME-py
Convert MIHCSME (Minimum Information about a High Content Screening Microscopy Experiment) metadata from Excel spreadsheets to validated Pydantic models and upload to OMERO.
Features
- Parse MIHCSME Excel templates into type-safe Pydantic models
- Automatic validation with clear error messages
- Bidirectional conversion between Excel, Pydantic, and OMERO key-pair value format
- Modern CLI with rich terminal output
- OMERO.script for server-side handling of MIHCSME templates
Installation
Development Installation
# Clone the repository
git clone https://github.com/Leiden-Cell-Observatory/MIHCSME_OMERO.git
cd MIHCSME_OMERO
# Create virtual environment with uv
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install in editable mode with dev dependencies
uv pip install -e ".[dev]"
User Installation (After PyPI Release)
uv pip install mihcsme-py
Quick Start
Command Line
# Validate MIHCSME Excel file
mihcsme validate LEI-MIHCSME.xlsx
# Parse Excel to JSON
mihcsme parse LEI-MIHCSME.xlsx --output metadata.json
# Upload to OMERO Screen
mihcsme upload LEI-MIHCSME.xlsx \
--screen-id 123 \
--host omero.example.com \
--user myuser
# Upload with replace (removes existing annotations)
mihcsme upload LEI-MIHCSME.xlsx \
--plate-id 456 \
--host omero.example.com \
--user myuser \
--replace
Python API
from pathlib import Path
from mihcsme_omero import connect, parse_excel_to_model, upload_metadata_to_omero
# Parse Excel file to Pydantic model
excel_path = Path("LEI-MIHCSME.xlsx")
metadata = parse_excel_to_model(excel_path)
# Inspect the model
print(f"Wells: {len(metadata.assay_conditions)}")
for condition in metadata.assay_conditions:
print(f"{condition.plate} / {condition.well}: {condition.conditions}")
# Connect to OMERO
conn = connect(
host="omero.example.com",
user="myuser",
password="mypassword",
port=4064,
secure=True,
)
# Upload to OMERO
result = upload_metadata_to_omero(
conn=conn,
metadata=metadata,
target_type="Screen",
target_id=123,
namespace="MIHCSME",
replace=False,
)
print(f"Status: {result['status']}")
print(f"Wells succeeded: {result['wells_succeeded']}")
conn.close()
Excel File Structure
The MIHCSME Excel file should contain these sheets:
- InvestigationInformation - Investigation-level metadata (grouped key-value pairs)
- StudyInformation - Study-level metadata (grouped key-value pairs)
- AssayInformation - Assay-level metadata (grouped key-value pairs)
- AssayConditions - Per-well metadata (tabular: Plate, Well, conditions...)
- _Reference sheets - Reference data (sheets starting with
_)
See LEI-MIHCSME.xlsx for an example.
Data Model
The package uses Pydantic models for type-safe metadata handling:
from mihcsme_omero.models import MIHCSMEMetadata, AssayCondition
# Create metadata programmatically
metadata = MIHCSMEMetadata(
assay_conditions=[
AssayCondition(
plate="Plate1",
well="A1", # Automatically normalized to "A01"
conditions={"Compound": "DMSO", "Concentration": "0.1%"},
)
]
)
# Convert to OMERO dict format
omero_dict = metadata.to_omero_dict()
# Create from OMERO dict format
metadata = MIHCSMEMetadata.from_omero_dict(omero_dict)
Development
Running Tests
# Run all tests
pytest
# Run with coverage
pytest --cov=mihcsme_omero --cov-report=html
# Run type checking
mypy src/mihcsme_omero
# Format code
black src/ tests/
# Lint code
ruff check src/ tests/ --fix
Project Structure
mihcsme-omero/
├── src/mihcsme_omero/ # Source code (src layout)
│ ├── __init__.py # Package exports
│ ├── models.py # Pydantic models
│ ├── parser.py # Excel → Pydantic
│ ├── omero_connection.py # OMERO connection utilities
│ ├── uploader.py # Pydantic → OMERO
│ └── cli.py # Typer CLI
├── tests/ # Test suite
├── original_scripts/ # Legacy scripts (reference only)
├── pyproject.toml # Package configuration
└── README.md # This file
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Make changes with tests
- Run quality checks (
black,ruff,mypy,pytest) - Commit with clear message
- Push and create pull request
License
See LICENSE file for details.
Metadata
Release files for mihcsme-py 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mihcsme_py-0.1.4.tar.gz | 37.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mihcsme_py-0.1.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 74.5 kB
Release files / mihcsme_py-0.1.4.tar.gz
| Download URL | mihcsme_py-0.1.4.tar.gz |
|---|---|
| Size | 37.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f33ad5d7eabf66be7036c1ed67e0f77726f94183e4648b01082de7cde19c5915
|
|
BLAKE2b-256 checksum How to use checksums |
4bafeb4c51aa8b2fd83eca6e085b07dc1f4682c13220061fb0d17f1e1775fa65
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / mihcsme_py-0.1.4-py3-none-any.whl
| Download URL | mihcsme_py-0.1.4-py3-none-any.whl |
|---|---|
| Size | 37.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
991e3e6f7f54c73e148025d8e9345ce39363675439a7ef2ae370c1c3cfdc7163
|
|
BLAKE2b-256 checksum How to use checksums |
46fb9e2eca8886790126028f70ef76c7632af7bb8f8b376d45e88fb0f46617a3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|