plate-overview 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- plate_overview-0.0.1/.github/workflows/test_and_deploy.yml +78 -0
- plate_overview-0.0.1/.gitignore +97 -0
- plate_overview-0.0.1/CHANGELOG.md +18 -0
- plate_overview-0.0.1/LICENSE +28 -0
- plate_overview-0.0.1/PKG-INFO +107 -0
- plate_overview-0.0.1/README.md +48 -0
- plate_overview-0.0.1/pyproject.toml +105 -0
- plate_overview-0.0.1/setup.cfg +4 -0
- plate_overview-0.0.1/src/plate_overview/__init__.py +19 -0
- plate_overview-0.0.1/src/plate_overview/_version.py +24 -0
- plate_overview-0.0.1/src/plate_overview/py.typed +0 -0
- plate_overview-0.0.1/src/plate_overview.egg-info/PKG-INFO +107 -0
- plate_overview-0.0.1/src/plate_overview.egg-info/SOURCES.txt +19 -0
- plate_overview-0.0.1/src/plate_overview.egg-info/dependency_links.txt +1 -0
- plate_overview-0.0.1/src/plate_overview.egg-info/requires.txt +3 -0
- plate_overview-0.0.1/src/plate_overview.egg-info/scm_file_list.json +15 -0
- plate_overview-0.0.1/src/plate_overview.egg-info/scm_version.json +8 -0
- plate_overview-0.0.1/src/plate_overview.egg-info/top_level.txt +1 -0
- plate_overview-0.0.1/tests/test_packaging.py +48 -0
- plate_overview-0.0.1/tox.ini +32 -0
- plate_overview-0.0.1/uv.lock +1366 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Tests on every push and PR; publishes to PyPI on a v* tag.
|
|
2
|
+
# Trusted publishing (OIDC) — no API token in secrets. Configure the
|
|
3
|
+
# `pypi` environment and the PyPI publisher before the first tag.
|
|
4
|
+
name: tests
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
branches:
|
|
9
|
+
- main
|
|
10
|
+
tags:
|
|
11
|
+
- "v*" # Push events to matching v*, i.e. v1.0, v20.15.10
|
|
12
|
+
pull_request:
|
|
13
|
+
branches:
|
|
14
|
+
- main
|
|
15
|
+
workflow_dispatch:
|
|
16
|
+
|
|
17
|
+
concurrency:
|
|
18
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
19
|
+
cancel-in-progress: true
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
test:
|
|
23
|
+
name: ${{ matrix.platform }} py${{ matrix.python-version }}
|
|
24
|
+
runs-on: ${{ matrix.platform }}
|
|
25
|
+
timeout-minutes: 30
|
|
26
|
+
strategy:
|
|
27
|
+
fail-fast: false
|
|
28
|
+
matrix:
|
|
29
|
+
platform: [ubuntu-latest, windows-latest, macos-latest]
|
|
30
|
+
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
31
|
+
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@v7
|
|
34
|
+
with:
|
|
35
|
+
# setuptools_scm derives the version from tags.
|
|
36
|
+
fetch-depth: 0
|
|
37
|
+
|
|
38
|
+
- name: Setup python
|
|
39
|
+
uses: astral-sh/setup-uv@v7
|
|
40
|
+
with:
|
|
41
|
+
python-version: ${{ matrix.python-version }}
|
|
42
|
+
activate-environment: "true"
|
|
43
|
+
|
|
44
|
+
# This runs the platform-specific tests declared in tox.ini.
|
|
45
|
+
- name: Test with tox
|
|
46
|
+
run: uvx --with tox-gh-actions tox
|
|
47
|
+
env:
|
|
48
|
+
PLATFORM: ${{ matrix.platform }}
|
|
49
|
+
|
|
50
|
+
- name: Coverage
|
|
51
|
+
uses: codecov/codecov-action@v7
|
|
52
|
+
|
|
53
|
+
build-and-inspect-package:
|
|
54
|
+
name: Build & inspect package.
|
|
55
|
+
runs-on: ubuntu-latest
|
|
56
|
+
|
|
57
|
+
steps:
|
|
58
|
+
- uses: actions/checkout@v7
|
|
59
|
+
with:
|
|
60
|
+
fetch-depth: 0
|
|
61
|
+
- uses: hynek/build-and-inspect-python-package@v3.0.1
|
|
62
|
+
|
|
63
|
+
deploy:
|
|
64
|
+
# Runs when a commit tagged v* is pushed.
|
|
65
|
+
needs: [test, build-and-inspect-package]
|
|
66
|
+
runs-on: ubuntu-latest
|
|
67
|
+
if: contains(github.ref, 'tags')
|
|
68
|
+
environment: pypi
|
|
69
|
+
permissions:
|
|
70
|
+
id-token: write
|
|
71
|
+
steps:
|
|
72
|
+
- name: Download built artifact to dist/
|
|
73
|
+
uses: actions/download-artifact@v8
|
|
74
|
+
with:
|
|
75
|
+
name: Packages
|
|
76
|
+
path: dist
|
|
77
|
+
- name: Publish to PyPI
|
|
78
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
env/
|
|
12
|
+
build/
|
|
13
|
+
develop-eggs/
|
|
14
|
+
dist/
|
|
15
|
+
downloads/
|
|
16
|
+
eggs/
|
|
17
|
+
.eggs/
|
|
18
|
+
lib/
|
|
19
|
+
lib64/
|
|
20
|
+
parts/
|
|
21
|
+
sdist/
|
|
22
|
+
var/
|
|
23
|
+
*.egg-info/
|
|
24
|
+
.installed.cfg
|
|
25
|
+
*.egg
|
|
26
|
+
|
|
27
|
+
# PyInstaller
|
|
28
|
+
# Usually these files are written by a python script from a template
|
|
29
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
30
|
+
*.manifest
|
|
31
|
+
*.spec
|
|
32
|
+
|
|
33
|
+
# Installer logs
|
|
34
|
+
pip-log.txt
|
|
35
|
+
pip-delete-this-directory.txt
|
|
36
|
+
|
|
37
|
+
# Unit test / coverage reports
|
|
38
|
+
htmlcov/
|
|
39
|
+
.tox/
|
|
40
|
+
.coverage
|
|
41
|
+
.coverage.*
|
|
42
|
+
.cache
|
|
43
|
+
nosetests.xml
|
|
44
|
+
coverage.xml
|
|
45
|
+
*,cover
|
|
46
|
+
.hypothesis/
|
|
47
|
+
.napari_cache
|
|
48
|
+
|
|
49
|
+
# Translations
|
|
50
|
+
*.mo
|
|
51
|
+
*.pot
|
|
52
|
+
|
|
53
|
+
# Django stuff:
|
|
54
|
+
*.log
|
|
55
|
+
local_settings.py
|
|
56
|
+
|
|
57
|
+
# Flask instance folder
|
|
58
|
+
instance/
|
|
59
|
+
|
|
60
|
+
# Sphinx documentation
|
|
61
|
+
docs/_build/
|
|
62
|
+
|
|
63
|
+
# MkDocs documentation
|
|
64
|
+
/site/
|
|
65
|
+
|
|
66
|
+
# PyBuilder
|
|
67
|
+
target/
|
|
68
|
+
|
|
69
|
+
# Pycharm and VSCode
|
|
70
|
+
.idea/
|
|
71
|
+
venv/
|
|
72
|
+
.vscode/
|
|
73
|
+
|
|
74
|
+
# IPython Notebook
|
|
75
|
+
.ipynb_checkpoints
|
|
76
|
+
|
|
77
|
+
# pyenv
|
|
78
|
+
.python-version
|
|
79
|
+
|
|
80
|
+
# OS
|
|
81
|
+
.DS_Store
|
|
82
|
+
|
|
83
|
+
# written by setuptools_scm
|
|
84
|
+
**/_version.py
|
|
85
|
+
|
|
86
|
+
# emacs files
|
|
87
|
+
*.el
|
|
88
|
+
|
|
89
|
+
# personal testing emacs org-mode file
|
|
90
|
+
README.org
|
|
91
|
+
notebook.org
|
|
92
|
+
|
|
93
|
+
# workshop
|
|
94
|
+
workshop/
|
|
95
|
+
|
|
96
|
+
# local triage notes and agent briefs (not published to the tracker)
|
|
97
|
+
.triage/
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
Versions are derived from git tags by `setuptools_scm` — never hand-edit
|
|
9
|
+
a version anywhere in this repo.
|
|
10
|
+
|
|
11
|
+
## [Unreleased]
|
|
12
|
+
|
|
13
|
+
## [0.0.1] - 2026-09-10
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- Repository scaffold: packaging, tox, CI, and a headless smoke test.
|
|
18
|
+
No renderer yet; see #1.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, Max Ferrin
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
9
|
+
list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
16
|
+
contributors may be used to endorse or promote products derived from
|
|
17
|
+
this software without specific prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
22
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
23
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
24
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
25
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
26
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: plate-overview
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Vendor-neutral whole-plate QC montages: one thumbnail per well, contrast normalized across the plate
|
|
5
|
+
Author: Max Ferrin
|
|
6
|
+
Author-email: ferrinmax@gmail.com
|
|
7
|
+
License: BSD 3-Clause License
|
|
8
|
+
|
|
9
|
+
Copyright (c) 2026, Max Ferrin
|
|
10
|
+
|
|
11
|
+
Redistribution and use in source and binary forms, with or without
|
|
12
|
+
modification, are permitted provided that the following conditions are met:
|
|
13
|
+
|
|
14
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
15
|
+
list of conditions and the following disclaimer.
|
|
16
|
+
|
|
17
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
18
|
+
this list of conditions and the following disclaimer in the documentation
|
|
19
|
+
and/or other materials provided with the distribution.
|
|
20
|
+
|
|
21
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
22
|
+
contributors may be used to endorse or promote products derived from
|
|
23
|
+
this software without specific prior written permission.
|
|
24
|
+
|
|
25
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
26
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
27
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
28
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
29
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
30
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
31
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
32
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
33
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
34
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
|
|
36
|
+
Project-URL: Bug Tracker, https://github.com/ferrinm/plate-overview/issues
|
|
37
|
+
Project-URL: Documentation, https://github.com/ferrinm/plate-overview#README.md
|
|
38
|
+
Project-URL: Source Code, https://github.com/ferrinm/plate-overview
|
|
39
|
+
Project-URL: User Support, https://github.com/ferrinm/plate-overview/issues
|
|
40
|
+
Classifier: Development Status :: 2 - Pre-Alpha
|
|
41
|
+
Classifier: Intended Audience :: Science/Research
|
|
42
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
43
|
+
Classifier: Operating System :: OS Independent
|
|
44
|
+
Classifier: Programming Language :: Python
|
|
45
|
+
Classifier: Programming Language :: Python :: 3
|
|
46
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
47
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
48
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
49
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
50
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
51
|
+
Classifier: Topic :: Scientific/Engineering :: Image Processing
|
|
52
|
+
Requires-Python: >=3.10
|
|
53
|
+
Description-Content-Type: text/markdown
|
|
54
|
+
License-File: LICENSE
|
|
55
|
+
Requires-Dist: numpy
|
|
56
|
+
Requires-Dist: Pillow
|
|
57
|
+
Requires-Dist: matplotlib
|
|
58
|
+
Dynamic: license-file
|
|
59
|
+
|
|
60
|
+
# plate-overview
|
|
61
|
+
|
|
62
|
+
Whole-plate overview images for multiwell fluorescence microscopy: one
|
|
63
|
+
thumbnail per well, laid out in plate geometry, with each channel's
|
|
64
|
+
contrast normalized **across the whole plate** so wells are comparable
|
|
65
|
+
to each other by eye.
|
|
66
|
+
|
|
67
|
+
Vendor-neutral. This package knows nothing about acquisition formats —
|
|
68
|
+
you hand it pixels through a small typed port and it draws.
|
|
69
|
+
|
|
70
|
+
> **Status: pre-alpha, empty.** The renderer has not landed yet. See
|
|
71
|
+
> [ferrinm/PyPhenix#32](https://github.com/ferrinm/PyPhenix/issues/32),
|
|
72
|
+
> which extracts it, and #1 here.
|
|
73
|
+
|
|
74
|
+
## Why this exists as its own package
|
|
75
|
+
|
|
76
|
+
There is exactly one renderer. Every acquisition format reaches it
|
|
77
|
+
through an adapter, so overviews from different instruments stay
|
|
78
|
+
comparable. `pyphenix` (Opera Phenix) is the first consumer. A Leica
|
|
79
|
+
Thunder `.lif` adapter is the second.
|
|
80
|
+
|
|
81
|
+
## Design notes
|
|
82
|
+
|
|
83
|
+
[CONTEXT.md](CONTEXT.md) covers the render port, the gathering loop, and
|
|
84
|
+
the resampling rule.
|
|
85
|
+
|
|
86
|
+
## Install
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
pip install plate-overview
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Contributing
|
|
93
|
+
|
|
94
|
+
Two house rules beyond the usual:
|
|
95
|
+
|
|
96
|
+
- **No real acquisition data, anywhere.** No fixture, example, sidecar
|
|
97
|
+
or docstring may derive from a real acquisition. No plate
|
|
98
|
+
identifiers, no operator-bearing paths, no source filenames. Test
|
|
99
|
+
fixtures are synthetic. This repository is public and the upstream
|
|
100
|
+
acquisitions are not.
|
|
101
|
+
- **Output paths are basenames.** The JSON sidecar records a filename,
|
|
102
|
+
never an absolute path, so a sidecar pasted into an issue does not
|
|
103
|
+
leak a filesystem layout.
|
|
104
|
+
|
|
105
|
+
## License
|
|
106
|
+
|
|
107
|
+
BSD 3-Clause. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# plate-overview
|
|
2
|
+
|
|
3
|
+
Whole-plate overview images for multiwell fluorescence microscopy: one
|
|
4
|
+
thumbnail per well, laid out in plate geometry, with each channel's
|
|
5
|
+
contrast normalized **across the whole plate** so wells are comparable
|
|
6
|
+
to each other by eye.
|
|
7
|
+
|
|
8
|
+
Vendor-neutral. This package knows nothing about acquisition formats —
|
|
9
|
+
you hand it pixels through a small typed port and it draws.
|
|
10
|
+
|
|
11
|
+
> **Status: pre-alpha, empty.** The renderer has not landed yet. See
|
|
12
|
+
> [ferrinm/PyPhenix#32](https://github.com/ferrinm/PyPhenix/issues/32),
|
|
13
|
+
> which extracts it, and #1 here.
|
|
14
|
+
|
|
15
|
+
## Why this exists as its own package
|
|
16
|
+
|
|
17
|
+
There is exactly one renderer. Every acquisition format reaches it
|
|
18
|
+
through an adapter, so overviews from different instruments stay
|
|
19
|
+
comparable. `pyphenix` (Opera Phenix) is the first consumer. A Leica
|
|
20
|
+
Thunder `.lif` adapter is the second.
|
|
21
|
+
|
|
22
|
+
## Design notes
|
|
23
|
+
|
|
24
|
+
[CONTEXT.md](CONTEXT.md) covers the render port, the gathering loop, and
|
|
25
|
+
the resampling rule.
|
|
26
|
+
|
|
27
|
+
## Install
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pip install plate-overview
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Contributing
|
|
34
|
+
|
|
35
|
+
Two house rules beyond the usual:
|
|
36
|
+
|
|
37
|
+
- **No real acquisition data, anywhere.** No fixture, example, sidecar
|
|
38
|
+
or docstring may derive from a real acquisition. No plate
|
|
39
|
+
identifiers, no operator-bearing paths, no source filenames. Test
|
|
40
|
+
fixtures are synthetic. This repository is public and the upstream
|
|
41
|
+
acquisitions are not.
|
|
42
|
+
- **Output paths are basenames.** The JSON sidecar records a filename,
|
|
43
|
+
never an absolute path, so a sidecar pasted into an issue does not
|
|
44
|
+
leak a filesystem layout.
|
|
45
|
+
|
|
46
|
+
## License
|
|
47
|
+
|
|
48
|
+
BSD 3-Clause. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "plate-overview"
|
|
3
|
+
dynamic = ["version"]
|
|
4
|
+
description = "Vendor-neutral whole-plate QC montages: one thumbnail per well, contrast normalized across the plate"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = {file = "LICENSE"}
|
|
7
|
+
authors = [
|
|
8
|
+
{name = "Max Ferrin"},
|
|
9
|
+
{email = "ferrinmax@gmail.com"},
|
|
10
|
+
]
|
|
11
|
+
classifiers = [
|
|
12
|
+
"Development Status :: 2 - Pre-Alpha",
|
|
13
|
+
"Intended Audience :: Science/Research",
|
|
14
|
+
"License :: OSI Approved :: BSD License",
|
|
15
|
+
"Operating System :: OS Independent",
|
|
16
|
+
"Programming Language :: Python",
|
|
17
|
+
"Programming Language :: Python :: 3",
|
|
18
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
19
|
+
"Programming Language :: Python :: 3.10",
|
|
20
|
+
"Programming Language :: Python :: 3.11",
|
|
21
|
+
"Programming Language :: Python :: 3.12",
|
|
22
|
+
"Programming Language :: Python :: 3.13",
|
|
23
|
+
"Topic :: Scientific/Engineering :: Image Processing",
|
|
24
|
+
]
|
|
25
|
+
requires-python = ">=3.10"
|
|
26
|
+
# Headless by design: no GUI toolkit, no acquisition-format reader.
|
|
27
|
+
# A consumer supplies pixels through the render port; this package draws.
|
|
28
|
+
dependencies = [
|
|
29
|
+
"numpy",
|
|
30
|
+
"Pillow",
|
|
31
|
+
"matplotlib",
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
[dependency-groups]
|
|
35
|
+
dev = [
|
|
36
|
+
"tox-uv",
|
|
37
|
+
"pytest",
|
|
38
|
+
"pytest-cov",
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
[project.urls]
|
|
42
|
+
"Bug Tracker" = "https://github.com/ferrinm/plate-overview/issues"
|
|
43
|
+
"Documentation" = "https://github.com/ferrinm/plate-overview#README.md"
|
|
44
|
+
"Source Code" = "https://github.com/ferrinm/plate-overview"
|
|
45
|
+
"User Support" = "https://github.com/ferrinm/plate-overview/issues"
|
|
46
|
+
|
|
47
|
+
[build-system]
|
|
48
|
+
requires = ["setuptools>=42.0.0", "setuptools_scm"]
|
|
49
|
+
build-backend = "setuptools.build_meta"
|
|
50
|
+
|
|
51
|
+
[tool.setuptools]
|
|
52
|
+
include-package-data = true
|
|
53
|
+
|
|
54
|
+
[tool.setuptools.packages.find]
|
|
55
|
+
where = ["src"]
|
|
56
|
+
|
|
57
|
+
[tool.setuptools.package-data]
|
|
58
|
+
"*" = ["py.typed"]
|
|
59
|
+
|
|
60
|
+
[tool.setuptools_scm]
|
|
61
|
+
write_to = "src/plate_overview/_version.py"
|
|
62
|
+
fallback_version = "0.0.1+nogit"
|
|
63
|
+
|
|
64
|
+
[tool.pytest.ini_options]
|
|
65
|
+
minversion = "6.0"
|
|
66
|
+
addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"]
|
|
67
|
+
xfail_strict = true
|
|
68
|
+
log_cli_level = "INFO"
|
|
69
|
+
testpaths = ["tests"]
|
|
70
|
+
|
|
71
|
+
[tool.black]
|
|
72
|
+
line-length = 79
|
|
73
|
+
target-version = ['py310', 'py311', 'py312', 'py313']
|
|
74
|
+
|
|
75
|
+
[tool.ruff]
|
|
76
|
+
line-length = 79
|
|
77
|
+
lint.select = [
|
|
78
|
+
"E", "F", "W", # flake8
|
|
79
|
+
"UP", # pyupgrade
|
|
80
|
+
"I", # isort
|
|
81
|
+
"BLE", # flake8-blind-exception
|
|
82
|
+
"B", # flake8-bugbear
|
|
83
|
+
"A", # flake8-builtins
|
|
84
|
+
"C4", # flake8-comprehensions
|
|
85
|
+
"ISC", # flake8-implicit-str-concat
|
|
86
|
+
"G", # flake8-logging-format
|
|
87
|
+
"PIE", # flake8-pie
|
|
88
|
+
"SIM", # flake8-simplify
|
|
89
|
+
]
|
|
90
|
+
lint.ignore = [
|
|
91
|
+
"E501", # line too long. let black handle this
|
|
92
|
+
]
|
|
93
|
+
|
|
94
|
+
exclude = [
|
|
95
|
+
".eggs",
|
|
96
|
+
".git",
|
|
97
|
+
".mypy_cache",
|
|
98
|
+
".ruff_cache",
|
|
99
|
+
".tox",
|
|
100
|
+
".venv",
|
|
101
|
+
"_build",
|
|
102
|
+
"build",
|
|
103
|
+
"dist",
|
|
104
|
+
]
|
|
105
|
+
fix = true
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""Vendor-neutral whole-plate QC montages.
|
|
2
|
+
|
|
3
|
+
One thumbnail per well, laid out in plate geometry, with each channel's
|
|
4
|
+
contrast normalized across the whole plate so wells are comparable to
|
|
5
|
+
each other by eye.
|
|
6
|
+
|
|
7
|
+
This package knows nothing about acquisition formats. A consumer
|
|
8
|
+
implements a narrow render port and this package draws.
|
|
9
|
+
|
|
10
|
+
Nothing is exported yet — the renderer is extracted in
|
|
11
|
+
https://github.com/ferrinm/PyPhenix/issues/32.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
from ._version import version as __version__
|
|
16
|
+
except ImportError: # pragma: no cover - source checkout without metadata
|
|
17
|
+
__version__ = "unknown"
|
|
18
|
+
|
|
19
|
+
__all__ = ["__version__"]
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# file generated by vcs-versioning
|
|
2
|
+
# don't change, don't track in version control
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"__version__",
|
|
7
|
+
"__version_tuple__",
|
|
8
|
+
"version",
|
|
9
|
+
"version_tuple",
|
|
10
|
+
"__commit_id__",
|
|
11
|
+
"commit_id",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
version: str
|
|
15
|
+
__version__: str
|
|
16
|
+
__version_tuple__: tuple[int | str, ...]
|
|
17
|
+
version_tuple: tuple[int | str, ...]
|
|
18
|
+
commit_id: str | None
|
|
19
|
+
__commit_id__: str | None
|
|
20
|
+
|
|
21
|
+
__version__ = version = '0.0.1'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 0, 1)
|
|
23
|
+
|
|
24
|
+
__commit_id__ = commit_id = 'g5c8667e41'
|
|
File without changes
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: plate-overview
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Vendor-neutral whole-plate QC montages: one thumbnail per well, contrast normalized across the plate
|
|
5
|
+
Author: Max Ferrin
|
|
6
|
+
Author-email: ferrinmax@gmail.com
|
|
7
|
+
License: BSD 3-Clause License
|
|
8
|
+
|
|
9
|
+
Copyright (c) 2026, Max Ferrin
|
|
10
|
+
|
|
11
|
+
Redistribution and use in source and binary forms, with or without
|
|
12
|
+
modification, are permitted provided that the following conditions are met:
|
|
13
|
+
|
|
14
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
15
|
+
list of conditions and the following disclaimer.
|
|
16
|
+
|
|
17
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
18
|
+
this list of conditions and the following disclaimer in the documentation
|
|
19
|
+
and/or other materials provided with the distribution.
|
|
20
|
+
|
|
21
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
22
|
+
contributors may be used to endorse or promote products derived from
|
|
23
|
+
this software without specific prior written permission.
|
|
24
|
+
|
|
25
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
26
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
27
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
28
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
29
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
30
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
31
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
32
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
33
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
34
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
|
|
36
|
+
Project-URL: Bug Tracker, https://github.com/ferrinm/plate-overview/issues
|
|
37
|
+
Project-URL: Documentation, https://github.com/ferrinm/plate-overview#README.md
|
|
38
|
+
Project-URL: Source Code, https://github.com/ferrinm/plate-overview
|
|
39
|
+
Project-URL: User Support, https://github.com/ferrinm/plate-overview/issues
|
|
40
|
+
Classifier: Development Status :: 2 - Pre-Alpha
|
|
41
|
+
Classifier: Intended Audience :: Science/Research
|
|
42
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
43
|
+
Classifier: Operating System :: OS Independent
|
|
44
|
+
Classifier: Programming Language :: Python
|
|
45
|
+
Classifier: Programming Language :: Python :: 3
|
|
46
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
47
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
48
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
49
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
50
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
51
|
+
Classifier: Topic :: Scientific/Engineering :: Image Processing
|
|
52
|
+
Requires-Python: >=3.10
|
|
53
|
+
Description-Content-Type: text/markdown
|
|
54
|
+
License-File: LICENSE
|
|
55
|
+
Requires-Dist: numpy
|
|
56
|
+
Requires-Dist: Pillow
|
|
57
|
+
Requires-Dist: matplotlib
|
|
58
|
+
Dynamic: license-file
|
|
59
|
+
|
|
60
|
+
# plate-overview
|
|
61
|
+
|
|
62
|
+
Whole-plate overview images for multiwell fluorescence microscopy: one
|
|
63
|
+
thumbnail per well, laid out in plate geometry, with each channel's
|
|
64
|
+
contrast normalized **across the whole plate** so wells are comparable
|
|
65
|
+
to each other by eye.
|
|
66
|
+
|
|
67
|
+
Vendor-neutral. This package knows nothing about acquisition formats —
|
|
68
|
+
you hand it pixels through a small typed port and it draws.
|
|
69
|
+
|
|
70
|
+
> **Status: pre-alpha, empty.** The renderer has not landed yet. See
|
|
71
|
+
> [ferrinm/PyPhenix#32](https://github.com/ferrinm/PyPhenix/issues/32),
|
|
72
|
+
> which extracts it, and #1 here.
|
|
73
|
+
|
|
74
|
+
## Why this exists as its own package
|
|
75
|
+
|
|
76
|
+
There is exactly one renderer. Every acquisition format reaches it
|
|
77
|
+
through an adapter, so overviews from different instruments stay
|
|
78
|
+
comparable. `pyphenix` (Opera Phenix) is the first consumer. A Leica
|
|
79
|
+
Thunder `.lif` adapter is the second.
|
|
80
|
+
|
|
81
|
+
## Design notes
|
|
82
|
+
|
|
83
|
+
[CONTEXT.md](CONTEXT.md) covers the render port, the gathering loop, and
|
|
84
|
+
the resampling rule.
|
|
85
|
+
|
|
86
|
+
## Install
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
pip install plate-overview
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Contributing
|
|
93
|
+
|
|
94
|
+
Two house rules beyond the usual:
|
|
95
|
+
|
|
96
|
+
- **No real acquisition data, anywhere.** No fixture, example, sidecar
|
|
97
|
+
or docstring may derive from a real acquisition. No plate
|
|
98
|
+
identifiers, no operator-bearing paths, no source filenames. Test
|
|
99
|
+
fixtures are synthetic. This repository is public and the upstream
|
|
100
|
+
acquisitions are not.
|
|
101
|
+
- **Output paths are basenames.** The JSON sidecar records a filename,
|
|
102
|
+
never an absolute path, so a sidecar pasted into an issue does not
|
|
103
|
+
leak a filesystem layout.
|
|
104
|
+
|
|
105
|
+
## License
|
|
106
|
+
|
|
107
|
+
BSD 3-Clause. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
.gitignore
|
|
2
|
+
CHANGELOG.md
|
|
3
|
+
LICENSE
|
|
4
|
+
README.md
|
|
5
|
+
pyproject.toml
|
|
6
|
+
tox.ini
|
|
7
|
+
uv.lock
|
|
8
|
+
.github/workflows/test_and_deploy.yml
|
|
9
|
+
src/plate_overview/__init__.py
|
|
10
|
+
src/plate_overview/_version.py
|
|
11
|
+
src/plate_overview/py.typed
|
|
12
|
+
src/plate_overview.egg-info/PKG-INFO
|
|
13
|
+
src/plate_overview.egg-info/SOURCES.txt
|
|
14
|
+
src/plate_overview.egg-info/dependency_links.txt
|
|
15
|
+
src/plate_overview.egg-info/requires.txt
|
|
16
|
+
src/plate_overview.egg-info/scm_file_list.json
|
|
17
|
+
src/plate_overview.egg-info/scm_version.json
|
|
18
|
+
src/plate_overview.egg-info/top_level.txt
|
|
19
|
+
tests/test_packaging.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"files": [
|
|
3
|
+
".github/workflows/test_and_deploy.yml",
|
|
4
|
+
".gitignore",
|
|
5
|
+
"CHANGELOG.md",
|
|
6
|
+
"LICENSE",
|
|
7
|
+
"README.md",
|
|
8
|
+
"pyproject.toml",
|
|
9
|
+
"src/plate_overview/__init__.py",
|
|
10
|
+
"src/plate_overview/py.typed",
|
|
11
|
+
"tests/test_packaging.py",
|
|
12
|
+
"tox.ini",
|
|
13
|
+
"uv.lock"
|
|
14
|
+
]
|
|
15
|
+
}
|