Convert MIHCSME metadata from Excel to Pydantic model and upload to OMERO
Project description
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.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mihcsme_py-0.1.3.tar.gz.
File metadata
- Download URL: mihcsme_py-0.1.3.tar.gz
- Upload date:
- Size: 37.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
82c33b56f6308aa63eb84452fe7254e902a9d59d289de794b562cbeb0eafffb1
|
|
| MD5 |
b7d818f7b797a5bd0fa58611d7d01ce1
|
|
| BLAKE2b-256 |
dd9a45f40cc91bda5654e677f428ce796d176c047a66a7f273bb2cc6ba0cfa81
|
File details
Details for the file mihcsme_py-0.1.3-py3-none-any.whl.
File metadata
- Download URL: mihcsme_py-0.1.3-py3-none-any.whl
- Upload date:
- Size: 36.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d6a7cab4740acfcfa7c377c8cb14c96a6d969eb069c115538e0d868f32798fb
|
|
| MD5 |
597d1e3ef5e87602d2ffb22f086ae69e
|
|
| BLAKE2b-256 |
9e1e1336b8b8f4c80cd193900beb680b2b2879c17213bd2e9f175ab50329c335
|