{"name":"WellMapper","display_name":"WellMapper","visibility":"public","icon":"","categories":[],"schema_version":"0.2.1","on_activate":null,"on_deactivate":null,"contributions":{"commands":[{"id":"WellMapper.create_widget","title":"Create Plate Layout Widget","python_name":"WellMapper._layout_widget:create_plate_layout_widget","short_title":null,"category":null,"icon":null,"enablement":null},{"id":"WellMapper.set_parameters","title":"Set Plate Layout Parameters","python_name":"WellMapper._parameter_widget:set_plate_layout_parameters","short_title":null,"category":null,"icon":null,"enablement":null},{"id":"WellMapper.set_storage","title":"Set Storage Solution","python_name":"WellMapper._storage_widget:set_storage_solution","short_title":null,"category":null,"icon":null,"enablement":null}],"readers":null,"writers":null,"widgets":[{"command":"WellMapper.create_widget","display_name":"Well Plate Layout","autogenerate":false},{"command":"WellMapper.set_parameters","display_name":"Set Plate Layout Parameters","autogenerate":false},{"command":"WellMapper.set_storage","display_name":"Set Storage Solution","autogenerate":false}],"sample_data":null,"themes":null,"menus":{},"submenus":null,"keybindings":null,"configuration":[]},"package_metadata":{"metadata_version":"2.4","name":"WellMapper","version":"0.2.0","dynamic":["license-file"],"platform":null,"supported_platform":null,"summary":"well plate layout designer and exporter for napari","description":"# WellMapper\n\nA flexible, configurable well plate layout designer and exporter for napari. Design plate layouts with dynamic field configuration and export to local or cloud storage (AWS S3, Azure Blob, Google Cloud Storage).\n\n![License](https://img.shields.io/badge/license-Apache%20License%202.0-blue)\n![Python Version](https://img.shields.io/badge/python-3.9%2B-blue)\n![napari hub](https://img.shields.io/badge/napari-hub-blue)\n\n## Features\n\n- **Flexible Configuration**: Define experiment and well metadata fields via YAML config\n- **Visual Plate Design**: Interactive grid for selecting and annotating wells\n- **Color-Coded Wells**: Automatic color assignment based on well metadata for easy visualization\n- **Multiple Storage Backends**: Export to local filesystem, AWS S3, Azure Blob Storage, or Google Cloud Storage\n- **Dynamic Field Types**: Support for text, integer, date fields with autocompletion\n- **Incomplete Well Detection**: Visual warnings for partially filled wells\n- **Configuration GUI**: Built-in editors for plate parameters and storage settings\n\n## Installation\n\n### Basic Installation\n\n```bash\npip install WellMapper\n```\n\n### With Cloud Storage Support\n\nFor AWS S3:\n```bash\npip install WellMapper[s3]\n```\n\nFor Azure Blob Storage:\n```bash\npip install WellMapper[azure]\n```\n\nFor Google Cloud Storage:\n```bash\npip install WellMapper[gcs]\n```\n\nFor all storage backends:\n```bash\npip install WellMapper[all]\n```\n\n## Quick Start\n\n1. **Launch napari** and open the plugin:\n   - Plugins → WellMapper → Well Plate Layout\n\n2. **Configure your plate** (optional):\n   - Plugins → WellMapper → Set Plate Layout Parameters\n   - Add/remove experiment and well information fields\n\n3. **Set up storage** (optional):\n   - Plugins → WellMapper → Set Storage Solution\n   - Configure local or cloud storage backend\n\n4. **Design your layout**:\n   - Fill in experiment information (barcode, date, etc.)\n   - Select wells and apply metadata\n   - Export to CSV\n\n## Usage\n\n### Basic Workflow\n\n1. **Enter Experiment Information**\n   - Barcode (required)\n   - Number of rows and columns\n   - Date and any custom fields\n   - Click \"Confirm Experiment Info\"\n\n2. **Annotate Wells**\n   - Fill in well metadata fields (donor, condition, concentration, etc.)\n   - Select one or multiple wells in the plate grid\n   - Click \"Apply to Selected\"\n   - Wells are automatically color-coded based on their metadata\n\n3. **Export Layout**\n   - Click \"Export CSV\"\n   - File is saved to configured storage backend\n   - Default location: `./data/{barcode}/layout.csv`\n\n### Configuration\n\n#### Plate Parameters (`plate_config.yaml`)\n\nDefine custom fields for your experiments:\n\n```yaml\nexperiment_information:\n  barcode:\n    label: Barcode\n    type: text\n    required: true\n  date:\n    label: Date\n    type: date\n    default: today\n    required: true\n  interval:\n    label: Interval (min)\n    type: int\n    default: 10\n    min: 1\n    max: 1440\n\nwell_information:\n  donor:\n    label: Donor ID\n    type: text\n  condition:\n    label: Treatment\n    type: text\n    completer:\n      - Control\n      - Drug A\n      - Drug B\n  concentration:\n    label: Concentration (µM)\n    type: text\n    completer:\n      - \"0\"\n      - \"0.1\"\n      - \"1\"\n      - \"10\"\n```\n\n**Field Types:**\n- `text`: Free text input with optional autocomplete\n- `int`: Integer input with min/max constraints\n- `date`: Date picker\n\n**Mandatory Fields:**\n- `rows`, `cols`, `barcode`, `date` in experiment_information\n\n#### Storage Configuration\n\nConfigure storage via GUI (Plugins → Set Storage Solution) or manually create `.env`:\n\n**Local Storage** (default):\n```env\nSTORAGE_TYPE=local\nSTORAGE_PATH=./data\n```\n\n**AWS S3**:\n```env\nSTORAGE_TYPE=s3\nS3_BUCKET=my-bucket\nS3_PREFIX=plate-layouts\nAWS_REGION=us-east-1\nAWS_ACCESS_KEY_ID=your-key\nAWS_SECRET_ACCESS_KEY=your-secret\n```\n\n**Azure Blob Storage**:\n```env\nSTORAGE_TYPE=azure\nAZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...\nAZURE_CONTAINER=data\nAZURE_PREFIX=plate-layouts\n```\n\n**Google Cloud Storage**:\n```env\nSTORAGE_TYPE=gcs\nGCS_BUCKET=my-bucket\nGCS_PREFIX=plate-layouts\nGCS_PROJECT=my-project\nGOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json\n```\n\n### CSV Output Format\n\nThe exported CSV includes all configured fields:\n\n```csv\nbarcode,date,interval,well,donor,condition,concentration\nABC123,2024-01-15,10,A1,D001,Control,0\nABC123,2024-01-15,10,A2,D001,Drug A,0.1\nABC123,2024-01-15,10,A3,D001,Drug A,1\nABC123,2024-01-15,10,B1,D002,Control,0\n...\n```\n\n## Advanced Features\n\n### Color Coding\n\nWells are automatically assigned distinct colors based on their complete metadata profile. This helps visually identify:\n- **White**: Empty wells\n- **Colored**: Wells with complete metadata (same metadata = same color)\n- **Yellow \"!\" marker**: Incomplete wells (partial metadata)\n\n### Multi-Well Selection\n\n- Click individual wells or drag to select multiple wells\n- Apply the same metadata to all selected wells at once\n- Efficient for replicates and structured plate designs\n\n### Configuration Editor\n\nUse the built-in GUI to:\n- Add/remove experiment and well fields\n- Set field types and constraints\n- Define autocomplete options\n- Configure default values\n\n### Storage Backend Testing\n\nThe storage configuration widget includes a \"Test Connection\" button to verify:\n- Credentials are valid\n- Bucket/container exists and is accessible\n- Write permissions are correct\n\n## File Structure\n\n```\nWellMapper/\n├── WellMapper/\n│   ├── __init__.py\n│   ├── _layout_widget.py       # Main plate layout widget\n│   ├── _parameter_widget.py    # Configuration editor\n│   ├── _storage_widget.py      # Storage setup widget\n│   ├── storage_backends.py     # Storage implementations\n│   ├── plate_config.yaml       # Default plate configuration\n│   └── .env                    # Storage configuration (user-created)\n├── napari.yaml                 # Plugin manifest\n├── pyproject.toml             # Package configuration\n└── README.md\n```\n\n## Examples\n\n### Example 1: Drug Screening Plate\n\n```yaml\nexperiment_information:\n  barcode:\n    label: Plate Barcode\n    type: text\n    required: true\n  assay_date:\n    label: Assay Date\n    type: date\n    default: today\n    required: true\n  cell_line:\n    label: Cell Line\n    type: text\n  passage:\n    label: Passage Number\n    type: int\n    min: 1\n    max: 100\n\nwell_information:\n  compound:\n    label: Compound\n    type: text\n    completer:\n      - DMSO (Control)\n      - Compound A\n      - Compound B\n      - Compound C\n  concentration:\n    label: Concentration (µM)\n    type: text\n    completer:\n      - \"0\"\n      - \"0.01\"\n      - \"0.1\"\n      - \"1\"\n      - \"10\"\n      - \"100\"\n  replicate:\n    label: Replicate\n    type: text\n    completer:\n      - \"1\"\n      - \"2\"\n      - \"3\"\n```\n\n## Troubleshooting\n\n### Storage Configuration Not Found\n\n**Error**: \"Could not initialize storage backend\"\n\n**Solution**: Create `.env` file in napari by Plugins -> WellMapper -> Set Storage Solution\n\n### Cloud Storage Dependencies Missing\n\n**Error**: \"boto3 required for S3 storage\"\n\n**Solution**: Install with storage extras:\n```bash\npip install WellMapper[s3]\n```\n\n### Wells Not Updating Colors\n\n**Issue**: Wells stay white after applying metadata\n\n**Solution**: Ensure all fields are filled. Partial data triggers incomplete well warning (yellow \"!\").\n\n### CSV Export Path Issues\n\n**Issue**: Can't find exported files\n\n**Solution**: Check storage configuration. Default is `./data/{barcode}/layout.csv` relative to where napari was launched.\n\n## License\n\nThis project is licensed under the Apache License 2.0 License - see the [LICENSE](LICENSE) file for details.\n\n## Citation\n\nIf you use this plugin in your research, please cite:\n\n```bibtex\n@software{WellMapper,\n  author = {van der Steen, Krijn H.},\n  affiliation = {Lab of Cellular Disease Models, Regenerative Medicine Center Utrecht, UMC Utrecht, The Netherlands},\n  title = {WellMapper: Well Plate Layout Designer for napari},\n  year = {2026},\n  url = {https://github.com/Living-Technologies/WellMapper}\n}\n```\n\n## Acknowledgments\n\n- Built with [napari](https://napari.org/)\n","description_content_type":"text/markdown","keywords":null,"home_page":null,"download_url":null,"author":null,"author_email":"\"Krijn H. van der Steen\" <k.h.vandersteen@umcutrecht.nl>","maintainer":null,"maintainer_email":null,"license":"Apache License 2.0","classifier":["Development Status :: 3 - Alpha","Framework :: napari","Intended Audience :: Science/Research","Programming Language :: Python :: 3","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Topic :: Scientific/Engineering :: Bio-Informatics","Topic :: Scientific/Engineering :: Image Processing"],"requires_dist":["napari[all]","qtpy","natsort","python-dotenv","pyyaml","boto3>=1.26.0; extra == \"s3\"","azure-storage-blob>=12.14.0; extra == \"azure\"","google-cloud-storage>=2.5.0; extra == \"gcs\"","pandas>=1.5.0; extra == \"parquet\"","pyarrow>=10.0.0; extra == \"parquet\"","pandas>=1.5.0; extra == \"xlsx\"","openpyxl>=3.0.0; extra == \"xlsx\"","pandas>=1.5.0; extra == \"formats\"","pyarrow>=10.0.0; extra == \"formats\"","openpyxl>=3.0.0; extra == \"formats\"","boto3>=1.26.0; extra == \"all\"","azure-storage-blob>=12.14.0; extra == \"all\"","google-cloud-storage>=2.5.0; extra == \"all\"","pandas>=1.5.0; extra == \"all\"","pyarrow>=10.0.0; extra == \"all\"","openpyxl>=3.0.0; extra == \"all\"","pytest>=7.0; extra == \"dev\"","pytest-qt; extra == \"dev\"","black; extra == \"dev\"","ruff; extra == \"dev\""],"requires_python":">=3.9","requires_external":null,"project_url":null,"provides_extra":["s3","azure","gcs","parquet","xlsx","formats","all","dev"],"provides_dist":null,"obsoletes_dist":null},"npe1_shim":false}