labware 0.1.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.
Files changed (76) hide show
  1. labware-0.1.1/LICENSE.txt +28 -0
  2. labware-0.1.1/PKG-INFO +58 -0
  3. labware-0.1.1/README.md +44 -0
  4. labware-0.1.1/labware/__init__.py +24 -0
  5. labware-0.1.1/labware/_static_version.py +2 -0
  6. labware-0.1.1/labware/_version.py +184 -0
  7. labware-0.1.1/labware/definitions/Akura_384_spheroid_microplate.json +65 -0
  8. labware-0.1.1/labware/definitions/Akura_96_spheroid_microplate.json +62 -0
  9. labware-0.1.1/labware/definitions/Axion_M768-SPH-48B_48_well_plate.json +35 -0
  10. labware-0.1.1/labware/definitions/CellVis_24_well_plate.json +36 -0
  11. labware-0.1.1/labware/definitions/Corning_3335_6_well_plate.json +35 -0
  12. labware-0.1.1/labware/definitions/Corning_351146_6_well_plate.json +35 -0
  13. labware-0.1.1/labware/definitions/Corning_3512_12_well_plate.json +35 -0
  14. labware-0.1.1/labware/definitions/Corning_3527_24_well_plate.json +35 -0
  15. labware-0.1.1/labware/definitions/Corning_353502_6_well_plate.json +35 -0
  16. labware-0.1.1/labware/definitions/Corning_3548_48_well_plate.json +55 -0
  17. labware-0.1.1/labware/definitions/Corning_3599_96_well_plate.json +35 -0
  18. labware-0.1.1/labware/definitions/Corning_3601_96_well_plate.json +35 -0
  19. labware-0.1.1/labware/definitions/Corning_3610_96_well_plate.json +35 -0
  20. labware-0.1.1/labware/definitions/Corning_3764_384_well_plate.json +35 -0
  21. labware-0.1.1/labware/definitions/Corning_3830_384_well_plate.json +35 -0
  22. labware-0.1.1/labware/definitions/Corning_costar_12_well_plate.json +35 -0
  23. labware-0.1.1/labware/definitions/Corning_costar_24_well_plate.json +35 -0
  24. labware-0.1.1/labware/definitions/Corning_costar_6_well_plate.json +31 -0
  25. labware-0.1.1/labware/definitions/Genesee_25-105_6_well_plate.json +35 -0
  26. labware-0.1.1/labware/definitions/Greiner_655090_96_well_plate.json +35 -0
  27. labware-0.1.1/labware/definitions/Greiner_655161_96_well_plate.json +35 -0
  28. labware-0.1.1/labware/definitions/Greiner_655180_96_well_plate.json +35 -0
  29. labware-0.1.1/labware/definitions/Greiner_783092_1536_well_plate.json +35 -0
  30. labware-0.1.1/labware/definitions/Ibidi_80636_6_well_plate.json +35 -0
  31. labware-0.1.1/labware/definitions/Ibidi_82426_24_well_plate.json +31 -0
  32. labware-0.1.1/labware/definitions/InSphero_GRI3D-96IBI_96_well_plate.json +35 -0
  33. labware-0.1.1/labware/definitions/InSphero_GRI3D-96P_96_well_plate.json +35 -0
  34. labware-0.1.1/labware/definitions/Mimetas_4004-400-B_384_well_plate.json +36 -0
  35. labware-0.1.1/labware/definitions/Mimetas_6401-400-B_384_well_plate.json +36 -0
  36. labware-0.1.1/labware/definitions/Mimetas_6405-400-B_384_well_plate.json +36 -0
  37. labware-0.1.1/labware/definitions/Ramona_petri_dish_insert_30_mm.json +144 -0
  38. labware-0.1.1/labware/definitions/Ramona_petri_dish_insert_35_mm.json +144 -0
  39. labware-0.1.1/labware/definitions/Ramona_petri_dish_insert_40_mm.json +144 -0
  40. labware-0.1.1/labware/definitions/Ramona_petri_dish_insert_45_mm.json +144 -0
  41. labware-0.1.1/labware/definitions/Ramona_petri_dish_insert_50_mm.json +144 -0
  42. labware-0.1.1/labware/definitions/Ramona_petri_dish_insert_55_mm.json +144 -0
  43. labware-0.1.1/labware/definitions/Ramona_petri_dish_insert_60_mm.json +144 -0
  44. labware-0.1.1/labware/definitions/Ramona_petri_dish_insert_65_mm.json +144 -0
  45. labware-0.1.1/labware/definitions/Ramona_petri_dish_insert_70_mm.json +144 -0
  46. labware-0.1.1/labware/definitions/Ramona_petri_dish_insert_75_mm.json +144 -0
  47. labware-0.1.1/labware/definitions/Ramona_petri_dish_insert_80_mm.json +144 -0
  48. labware-0.1.1/labware/definitions/Ramona_petri_dish_insert_85_mm.json +144 -0
  49. labware-0.1.1/labware/definitions/Ramona_petri_dish_insert_90_mm.json +122 -0
  50. labware-0.1.1/labware/definitions/Ramona_petri_dish_insert_95_mm.json +122 -0
  51. labware-0.1.1/labware/definitions/Revvity_phenoplate_384_well_plate.json +35 -0
  52. labware-0.1.1/labware/definitions/Revvity_phenoplate_96_well_plate.json +35 -0
  53. labware-0.1.1/labware/definitions/SBS_1536_well_plate.json +36 -0
  54. labware-0.1.1/labware/definitions/SBS_384_well_plate.json +36 -0
  55. labware-0.1.1/labware/definitions/SBS_96_well_plate.json +38 -0
  56. labware-0.1.1/labware/definitions/TPP_92406_6_well_plate.json +35 -0
  57. labware-0.1.1/labware/definitions/TPP_92412_12_well_plate.json +35 -0
  58. labware-0.1.1/labware/definitions/TPP_92424_24_well_plate.json +35 -0
  59. labware-0.1.1/labware/definitions/Thermo_nunc_142475_24_well_plate.json +32 -0
  60. labware-0.1.1/labware/definitions/Thermo_nunc_142485_24_well_plate.json +32 -0
  61. labware-0.1.1/labware/definitions/Thermo_nunc_150628_12_well_plate.json +75 -0
  62. labware-0.1.1/labware/definitions/Thermo_nunc_165305_96_well_plate.json +36 -0
  63. labware-0.1.1/labware/definitions/Thermo_nunc_167008_96_well_plate.json +55 -0
  64. labware-0.1.1/labware/definitions/Watson_bio_24_well_plate.json +36 -0
  65. labware-0.1.1/labware/labware.v1.schema.json +580 -0
  66. labware-0.1.1/labware/py.typed +0 -0
  67. labware-0.1.1/labware/schema.py +521 -0
  68. labware-0.1.1/labware.egg-info/PKG-INFO +58 -0
  69. labware-0.1.1/labware.egg-info/SOURCES.txt +74 -0
  70. labware-0.1.1/labware.egg-info/dependency_links.txt +1 -0
  71. labware-0.1.1/labware.egg-info/requires.txt +1 -0
  72. labware-0.1.1/labware.egg-info/top_level.txt +1 -0
  73. labware-0.1.1/pyproject.toml +47 -0
  74. labware-0.1.1/setup.cfg +4 -0
  75. labware-0.1.1/setup.py +11 -0
  76. labware-0.1.1/tests/test_labware.py +897 -0
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Ramona Optics Inc.
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.
labware-0.1.1/PKG-INFO ADDED
@@ -0,0 +1,58 @@
1
+ Metadata-Version: 2.4
2
+ Name: labware
3
+ Version: 0.1.1
4
+ Summary: Microplate and dish definitions: footprint, well geometry, skirt, material and vendor drawing
5
+ Author-email: Ramona Optics <jed@ramonaoptics.com>
6
+ License-Expression: BSD-3-Clause
7
+ Project-URL: Homepage, https://github.com/ramonaoptics/labware
8
+ Project-URL: Viewer, https://docs.ramonaoptics.com/tools/labware_viewer.html
9
+ Requires-Python: >=3.11
10
+ Description-Content-Type: text/markdown
11
+ License-File: LICENSE.txt
12
+ Requires-Dist: pydantic>=2
13
+ Dynamic: license-file
14
+
15
+ # labware
16
+
17
+ Microplate and dish definitions for software: outer footprint, well geometry,
18
+ skirt, material, and the vendor drawing each dimension came from.
19
+
20
+ Browse them in 3D: https://docs.ramonaoptics.com/tools/labware_viewer.html
21
+
22
+ ## Example
23
+
24
+ ```python
25
+ from labware import load_labware
26
+
27
+ plates = load_labware()
28
+ plate = plates["SBS_96_well_plate"]
29
+
30
+ print(plate.name) # SBS 96 well
31
+ print(plate.well_dimensions.rows, plate.well_dimensions.columns) # 8 12
32
+ print(plate.well_dimensions.pitch) # 0.009, in meters
33
+ ```
34
+
35
+ ## Layout
36
+
37
+ - `labware/definitions/` holds one JSON file per part. The file name, without
38
+ `.json`, is the key `load_labware()` returns it under.
39
+ - `labware/schema.py` is the pydantic model every definition is validated
40
+ against.
41
+ - `labware/labware.v1.schema.json` is that model published as a JSON schema.
42
+ Each definition names it in its `$schema` key.
43
+
44
+ ## Releasing
45
+
46
+ Uploads to PyPI are automatic, and the version comes from the git tag, so
47
+ there is no version number to edit in the source.
48
+
49
+ To release, create the tag from the GitHub web interface:
50
+
51
+ 1. Open https://github.com/ramonaoptics/labware/releases/new
52
+ 2. Under "Choose a tag", type the new version with a leading `v`, for example
53
+ `v0.1.1`, and pick "Create new tag on publish".
54
+ 3. Leave the target as `main`, click "Generate release notes", then
55
+ "Publish release".
56
+
57
+ The `pypi` workflow then builds the sdist and wheel and publishes them, and
58
+ `labware.__version__` in the installed package reports that same version.
@@ -0,0 +1,44 @@
1
+ # labware
2
+
3
+ Microplate and dish definitions for software: outer footprint, well geometry,
4
+ skirt, material, and the vendor drawing each dimension came from.
5
+
6
+ Browse them in 3D: https://docs.ramonaoptics.com/tools/labware_viewer.html
7
+
8
+ ## Example
9
+
10
+ ```python
11
+ from labware import load_labware
12
+
13
+ plates = load_labware()
14
+ plate = plates["SBS_96_well_plate"]
15
+
16
+ print(plate.name) # SBS 96 well
17
+ print(plate.well_dimensions.rows, plate.well_dimensions.columns) # 8 12
18
+ print(plate.well_dimensions.pitch) # 0.009, in meters
19
+ ```
20
+
21
+ ## Layout
22
+
23
+ - `labware/definitions/` holds one JSON file per part. The file name, without
24
+ `.json`, is the key `load_labware()` returns it under.
25
+ - `labware/schema.py` is the pydantic model every definition is validated
26
+ against.
27
+ - `labware/labware.v1.schema.json` is that model published as a JSON schema.
28
+ Each definition names it in its `$schema` key.
29
+
30
+ ## Releasing
31
+
32
+ Uploads to PyPI are automatic, and the version comes from the git tag, so
33
+ there is no version number to edit in the source.
34
+
35
+ To release, create the tag from the GitHub web interface:
36
+
37
+ 1. Open https://github.com/ramonaoptics/labware/releases/new
38
+ 2. Under "Choose a tag", type the new version with a leading `v`, for example
39
+ `v0.1.1`, and pick "Create new tag on publish".
40
+ 3. Leave the target as `main`, click "Generate release notes", then
41
+ "Publish release".
42
+
43
+ The `pypi` workflow then builds the sdist and wheel and publishes them, and
44
+ `labware.__version__` in the installed package reports that same version.
@@ -0,0 +1,24 @@
1
+ import importlib.resources
2
+
3
+ from ._version import __version__
4
+ from .schema import AlignmentReference, Labware, OuterDimensions, WellDimensions
5
+
6
+ __all__ = [
7
+ 'AlignmentReference',
8
+ 'Labware',
9
+ 'OuterDimensions',
10
+ 'WellDimensions',
11
+ '__version__',
12
+ 'load_labware',
13
+ ]
14
+
15
+
16
+ def load_labware() -> dict[str, Labware]:
17
+ """Return every labware definition, keyed by its file name without ``.json``."""
18
+ definitions = {}
19
+ for entry in (importlib.resources.files(__name__) / 'definitions').iterdir():
20
+ if entry.name.endswith('.json'):
21
+ definitions[entry.name.removesuffix('.json')] = (
22
+ Labware.model_validate_json_file(entry)
23
+ )
24
+ return definitions
@@ -0,0 +1,2 @@
1
+ # This file has been created by setup.py.
2
+ version = '0.1.1'
@@ -0,0 +1,184 @@
1
+ # -*- coding: utf-8 -*-
2
+ # This file is part of 'miniver': https://github.com/jbweston/miniver
3
+ #
4
+ import os
5
+ from collections import namedtuple
6
+
7
+ Version = namedtuple("Version", ("release", "dev", "labels"))
8
+
9
+ # No public API
10
+ __all__ = []
11
+
12
+ package_root = os.path.dirname(os.path.realpath(__file__))
13
+ package_name = os.path.basename(package_root)
14
+
15
+ STATIC_VERSION_FILE = "_static_version.py"
16
+
17
+
18
+ def get_version(version_file=STATIC_VERSION_FILE):
19
+ version_info = get_static_version_info(version_file)
20
+ version = version_info["version"]
21
+ if version == "__use_git__":
22
+ version = get_version_from_git()
23
+ if not version:
24
+ version = get_version_from_git_archive(version_info)
25
+ if not version:
26
+ version = Version("unknown", None, None)
27
+ return pep440_format(version)
28
+ else:
29
+ return version
30
+
31
+
32
+ def get_static_version_info(version_file=STATIC_VERSION_FILE):
33
+ version_info = {}
34
+ with open(os.path.join(package_root, version_file), "rb") as f:
35
+ exec(f.read(), {}, version_info)
36
+ return version_info
37
+
38
+
39
+ def version_is_from_git(version_file=STATIC_VERSION_FILE):
40
+ return get_static_version_info(version_file)["version"] == "__use_git__"
41
+
42
+
43
+ def pep440_format(version_info):
44
+ release, dev, labels = version_info
45
+
46
+ version_parts = [release]
47
+ if dev:
48
+ # prefer PEP440 over strict adhesion to semver
49
+ version_parts.append(".post{}".format(dev))
50
+
51
+ if labels:
52
+ version_parts.append("+")
53
+ version_parts.append(".".join(labels))
54
+
55
+ return "".join(version_parts)
56
+
57
+
58
+ def get_version_from_git():
59
+ import subprocess
60
+
61
+ # The '--long' flag gets us the 'dev' version and
62
+ # The '--dirty' flag helps identify if files have been modified
63
+ # git hash, '--always' returns the git hash even if there are no tags.
64
+ for opts in [[]]:
65
+ try:
66
+ p = subprocess.Popen(
67
+ ["git", "describe", "--long", "--always", "--dirty", "--tags"] + opts,
68
+ cwd=package_root,
69
+ stdout=subprocess.PIPE,
70
+ stderr=subprocess.PIPE,
71
+ )
72
+ except OSError:
73
+ return
74
+ if p.wait() == 0:
75
+ break
76
+ else:
77
+ return
78
+
79
+ description = (
80
+ p.communicate()[0]
81
+ .decode()
82
+ .lstrip("v") # Tags can have a leading 'v', but the version should not
83
+ .rstrip("\n")
84
+ .split("-") # Split the latest tag, commits since tag, and hash
85
+ )
86
+
87
+ try:
88
+ release, dev, git = description[:3]
89
+ except ValueError: # No tags, only the git hash
90
+ # prepend 'g' to match with format returned by 'git describe'
91
+ git = "g{}".format(*description)
92
+ release = "unknown"
93
+ dev = None
94
+
95
+ labels = []
96
+ if dev == "0":
97
+ dev = None
98
+ else:
99
+ labels.append(git)
100
+
101
+ if description[-1] == "dirty":
102
+ labels.append("dirty")
103
+
104
+ return Version(release, dev, labels)
105
+
106
+
107
+ # TODO: change this logic when there is a git pretty-format
108
+ # that gives the same output as 'git describe'.
109
+ # Currently we can only tell the tag the current commit is
110
+ # pointing to, or its hash (with no version info)
111
+ # if it is not tagged.
112
+ def get_version_from_git_archive(version_info):
113
+ try:
114
+ refnames = version_info["refnames"]
115
+ git_hash = version_info["git_hash"]
116
+ except KeyError:
117
+ # These fields are not present if we are running from an sdist.
118
+ # Execution should never reach here, though
119
+ return None
120
+
121
+ if git_hash.startswith("$Format") or refnames.startswith("$Format"):
122
+ # variables not expanded during 'git archive'
123
+ return None
124
+
125
+ VTAG = "tag: v"
126
+ refs = set(r.strip() for r in refnames.split(","))
127
+ version_tags = set(r[len(VTAG):] for r in refs if r.startswith(VTAG))
128
+ if version_tags:
129
+ release, *_ = sorted(version_tags) # prefer e.g. "2.0" over "2.0rc1"
130
+ return Version(release, dev=None, labels=None)
131
+ else:
132
+ return Version("unknown", dev=None, labels=["g{}".format(git_hash)])
133
+
134
+
135
+ __version__ = get_version()
136
+
137
+
138
+ # The following section defines a 'get_cmdclass' function
139
+ # that can be used from setup.py. The '__version__' module
140
+ # global is used (but not modified).
141
+
142
+
143
+ def _write_version(fname):
144
+ # This could be a hard link, so try to delete it first. Is there any way
145
+ # to do this atomically together with opening?
146
+ try:
147
+ os.remove(fname)
148
+ except OSError:
149
+ pass
150
+ with open(fname, "w", encoding='utf-8') as f:
151
+ f.write(
152
+ "# This file has been created by setup.py.\n"
153
+ "version = '{}'\n".format(__version__)
154
+ )
155
+
156
+
157
+ def get_cmdclass(pkg_source_path):
158
+ from setuptools.command.build_py import build_py as build_py_orig
159
+ from setuptools.command.sdist import sdist as sdist_orig
160
+
161
+ class _build_py(build_py_orig):
162
+ def run(self):
163
+ super().run()
164
+
165
+ src_marker = "".join(["src", os.path.sep])
166
+
167
+ if pkg_source_path.startswith(src_marker):
168
+ path = pkg_source_path[len(src_marker):]
169
+ else:
170
+ path = pkg_source_path
171
+ _write_version(
172
+ os.path.join(
173
+ self.build_lib, path, STATIC_VERSION_FILE
174
+ )
175
+ )
176
+
177
+ class _sdist(sdist_orig):
178
+ def make_release_tree(self, base_dir, files):
179
+ super().make_release_tree(base_dir, files)
180
+ _write_version(
181
+ os.path.join(base_dir, pkg_source_path, STATIC_VERSION_FILE)
182
+ )
183
+
184
+ return dict(sdist=_sdist, build_py=_build_py)
@@ -0,0 +1,65 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/ramonaoptics/labware/main/labware/labware.v1.schema.json",
3
+ "name": "Akura 384 Spheroid Microplate",
4
+ "number_of_wells": 384,
5
+ "manufacturer": "InSphero AG",
6
+ "author": "InSphero AG",
7
+ "last_updated": "2026-09-28T11:25:03Z",
8
+ "part_number": "CS-PC24",
9
+ "web_reference": "https://insphero.com/3d-cell-culture-tools/akura-384-spheroid-microplate/",
10
+ "drawing_reference": "https://insphero.com/wp-content/uploads/2025/10/Technical-Specifications-Akura-384-Spheroid-Microplate_Oct-2025.pdf",
11
+ "applications": [
12
+ "3D culture",
13
+ "spheroids",
14
+ "organoids",
15
+ "tumor",
16
+ "imaging",
17
+ "fluorescence",
18
+ "high-content screening",
19
+ "high-throughput screening"
20
+ ],
21
+
22
+ "outer_plate_dimensions": {
23
+ "length": 0.12776,
24
+ "width": 0.08548,
25
+ "height": 0.01435,
26
+ "skirt_height": 0.00252
27
+ },
28
+
29
+ "well_dimensions": {
30
+ "pitch": 0.0045,
31
+ "rows": 16,
32
+ "columns": 24,
33
+ "shape": "circle",
34
+ "top_shape": "square",
35
+ "diameter": 0.001,
36
+ "diameter_top": 0.00365,
37
+ "depth": 0.01171,
38
+ "working_volume_min": 4e-05,
39
+ "working_volume_max": 5e-05,
40
+
41
+ "bottom_shape": "flat",
42
+ "bottom_color": "clear",
43
+ "bottom_material": "polystyrene",
44
+ "bottom_thickness": 0.000125,
45
+ "bottom_refractive_index": 1.58,
46
+ "bottom_elevation": 0.00252,
47
+ "floor_height": 0.002645,
48
+ "wall_material": "polystyrene",
49
+ "wall_color": "black",
50
+ "surface_treatments": [
51
+ "ultra-low attachment"
52
+ ]
53
+ },
54
+
55
+ "alignment_reference": {
56
+ "origin_reference": "A1 well center",
57
+ "offset_from_left_edge": 0.01205,
58
+ "offset_from_top_edge": 0.00989,
59
+ "top_offset_from_left_edge": 0.01205,
60
+ "top_offset_from_top_edge": 0.00899,
61
+ "z_reference": "top surface of plate"
62
+ },
63
+
64
+ "notes": "InSphero Akura 384 Spheroid Microplate, article CS-PC24, black-walled polystyrene bonded to a transparent 0.125 mm polystyrene membrane (refractive index 1.58), ULA coated, with lid. Every dimension is from InSphero's Technical Specifications SPEC007, October 2025 (drawing_reference), which supersedes the 2023 editions (plate height 14.80, well height 11.93, skirt 2.77, A1 to side 12.13 there). WELL SHAPE: a 3.65 x 3.65 mm square opening at the top (Figure 1B; diameter_top is its side, top_shape square) narrowing to a round 1.00 mm spheroid observation cavity with a flat optically clear base (Detail D, Figure 3; diameter, shape circle, bottom_shape flat). Height of well 11.71, plate height 14.35 (skirt 2.52 plus membrane 0.125 plus well 11.71). WALLS AND BOTTOM: black polystyrene walls (walls; no wall thickness is published) bonded to a transparent, continuous 0.125 mm polystyrene membrane of refractive index 1.58 (bottom), whose underside sits 2.52 mm above the plane the plate rests on (bottom_elevation). SKIRT: SPEC007 prints 'Skirt height: 2.52 mm' and defines it as the distance between the plate bottom and the rim (Figure 2C), the membrane's underside (Figure 5); Section A-A (Figure 2B) shows the outer wall ending in a foot at the base whose top, scaled off that low-resolution figure against the printed 14.35 mm, sits about 2.3 mm (+/-0.3) above the base, level with the membrane within what the figure resolves, so skirt_height records the printed 2.52 mm. No flange width is printed, so skirt_thickness is not recorded. CAVITY OFFSET: the cavity is not centred under the square; its centre sits 0.90 mm further from the top edge than the square's (Figure 4: 9.89 mm to the cavity centre, 8.99 mm to the square's centre). offset_from_top_edge is 9.89, the cavity centre, so the grid points at the spheroid; top_offset_from_top_edge is 8.99, the centre of the square opening 0.90 mm above it, on the standard 384-well row (top_offset_from_left_edge 12.05, the same column as the cavity). offset_from_left_edge 12.05, pitch 4.50 mm. Working volume 40-50 uL. Dimensions are in meters."
65
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/ramonaoptics/labware/main/labware/labware.v1.schema.json",
3
+ "name": "Akura 96 Spheroid Microplate",
4
+ "number_of_wells": 96,
5
+ "manufacturer": "InSphero AG",
6
+ "author": "Ramona Optics",
7
+ "last_updated": "2026-09-27T00:18:31Z",
8
+ "part_number": "CS-PB13/15",
9
+ "web_reference": "https://insphero.com/3d-cell-culture-tools/akura-96-spheroid-microplate/",
10
+ "drawing_reference": "https://insphero.com/wp-content/uploads/2023/09/Akura%E2%84%A2-96-Spheroid-Microplate-Technical-Specifications.pdf",
11
+ "applications": [
12
+ "3D culture",
13
+ "spheroids",
14
+ "organoids",
15
+ "tumor",
16
+ "liver",
17
+ "imaging"
18
+ ],
19
+
20
+ "outer_plate_dimensions": {
21
+ "length": 0.12776,
22
+ "width": 0.08548,
23
+ "height": 0.01435,
24
+ "height_with_lid": 0.01535,
25
+ "skirt_height": 0.0025
26
+ },
27
+
28
+ "well_dimensions": {
29
+ "pitch": 0.009,
30
+ "rows": 8,
31
+ "columns": 12,
32
+ "shape": "circle",
33
+ "top_shape": "circle",
34
+ "diameter": 0.001,
35
+ "diameter_top": 0.0067,
36
+ "depth": 0.01295,
37
+ "working_volume_min": 7e-05,
38
+ "working_volume_max": 8e-05,
39
+ "bottom_shape": "flat",
40
+ "bottom_color": "clear",
41
+ "bottom_material": "cyclo_olefin",
42
+ "bottom_thickness": 0.0008,
43
+ "bottom_elevation": 0.0004,
44
+ "floor_height": 0.0012,
45
+ "wall_material": "cyclo_olefin",
46
+ "wall_color": "clear",
47
+ "surface_treatments": [
48
+ "ultra-low attachment"
49
+ ]
50
+ },
51
+
52
+ "alignment_reference": {
53
+ "origin_reference": "A1 well center",
54
+ "offset_from_left_edge": 0.01438,
55
+ "offset_from_top_edge": 0.01124,
56
+ "top_offset_from_left_edge": 0.01438,
57
+ "top_offset_from_top_edge": 0.01124,
58
+ "z_reference": "top surface of plate"
59
+ },
60
+
61
+ "notes": "InSphero Akura 96 Spheroid Microplate, article CS-PB13 (5 plates) / CS-PB15 (20 plates): COP (cyclo-olefin polymer) plate with a polystyrene lid, ULA coated, sterile. Every dimension is from InSphero's Technical Specifications SPEC001, July 2023 (drawing_reference); the June 2023 edition of SPEC001 is the same plate but its table prints the well height as 12.75 mm, against 12.95 mm on its own drawing (Figure 4) and in the July table, so 12.95 is used. WELL SHAPE: a round 6.70 mm opening at the top ('Diameter well opening'; diameter_top, top_shape circle) narrowing in steps to a round 1.00 mm cavity with a flat, optically clear base ('Diameter well bottom', Figure 1B: 'the well diameter is exactly 1 mm'; diameter, shape circle, bottom_shape flat), for spheroids up to 750 um. The drawing shows the cavity centred under the opening, so the opening's centre (top_offset_from_left_edge, top_offset_from_top_edge) is the same as A1's, recorded explicitly. Height of well 12.95 mm (depth), plate height 14.35 mm (15.35 mm with the lid), skirt 0.4 mm, well bottom 0.8 mm thick; 0.4 + 0.8 + 12.95 = 14.15, 0.2 mm short of the plate height, and each value is recorded as printed. A1 centre 14.38 mm from the left edge and 11.24 mm from the top edge, pitch 9.00 mm (Figure 2). WALLS AND BOTTOM: the plate, walls and bottom alike, is clear COP (walls, bottom; the lid is polystyrene); bottom 0.8 mm thick, its underside 0.4 mm above the plane the plate rests on (the skirt height, bottom_elevation). No refractive index or wall thickness is published. SureXchange tip position: 1.71 mm horizontal offset, 9.86 mm below the plate top. Working volume 70-80 uL. Skirt height 2.50 mm from the side view in InSphero's specification (Figure 2); InSphero's own 'skirt height' of 0.4 mm is the well bottom's height above the resting plane, not the flange. Dimensions are in meters."
62
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/ramonaoptics/labware/main/labware/labware.v1.schema.json",
3
+ "name": "Axion SpheroGuide MEA M768-SPH-48B 48 well",
4
+ "number_of_wells": 48,
5
+ "manufacturer": "Axion BioSystems",
6
+ "author": "Ramona Optics",
7
+ "last_updated": "2026-08-31T00:00:00Z",
8
+ "part_number": "M768-SPH-48B",
9
+ "web_reference": "https://www.axionbiosystems.com/sites/default/files/resources/M768-SPH-48B%20DATASHEET%20v2.pdf",
10
+
11
+ "outer_plate_dimensions": {
12
+ "length": 0.12776,
13
+ "width": 0.08548,
14
+ "height": 0.01435
15
+ },
16
+
17
+ "well_dimensions": {
18
+ "pitch": 0.01308,
19
+ "rows": 6,
20
+ "columns": 8,
21
+ "shape": "circle",
22
+ "diameter": 0.007,
23
+ "depth": 0.0132,
24
+ "bottom_shape": "flat"
25
+ },
26
+
27
+ "alignment_reference": {
28
+ "origin_reference": "A1 well center",
29
+ "offset_from_left_edge": 0.0181,
30
+ "offset_from_top_edge": 0.01004,
31
+ "z_reference": "top surface of plate"
32
+ },
33
+
34
+ "notes": "Axion BioSystems SpheroGuide MEA 48, black-walled microelectrode array plate with a transparent well bottom, for spheroid and organoid MEA assays on Maestro Pro / Maestro Edge. Single catalogue number M768-SPH-48B; Axion lists no other well count or colour variant of the SpheroGuide line as of 2026-08. Units in meters. All dimensions from the Axion datasheet 'SPHEROGUIDE MEA 48 DATASHEET', document M768-SPH-48B DATASHEET v2: plate length (A) 127.76 mm, plate width (B) 85.48 mm, A1 offset row (C) 10.04 mm, A1 offset column (D) 18.10 mm, well-to-well distance (E) 13.08 mm, well top diameter (F) 7.0 mm, well bottom diameter (G) 2.5 mm, well height (H) 13.2 mm, well bottom elevation (I) 1.15 mm, base thickness (J) 150 um, well volume 435 uL, working volume 300 uL. Grid is 6 rows x 8 columns, read from the datasheet plan view. Axion's 'A1 Offset (Row) (C)' is measured from the top edge and 'A1 Offset (Column) (D)' from the left edge, confirmed against the dimensioned plan view; both are exactly the centred values, (85.48 - 5 x 13.08) / 2 = 10.04 and (127.76 - 7 x 13.08) / 2 = 18.10. Plate height is NOT published by Axion; the 14.35 mm here is derived as well bottom elevation + well height (1.15 + 13.2), which coincides with the usual ANSI/SLAS 1-2004 plate height - it is unverified against a physical plate. Well cross-section is a cylindrical upper bore of 7.0 mm tapering through the SpheroGuide placement funnel to a flat 2.5 mm transparent recording floor; 'diameter' is the top diameter and 'bottom_shape' flat describes that floor, so the funnel wall is not represented by the schema. The frustum volume of a pure 7.0 -> 2.5 mm cone over 13.2 mm is only about 251 uL against the stated 435 uL, which is consistent with the funnel occupying just the lower part of the well rather than the whole depth. Base thickness 150 um is the working-distance number. Each well carries 16 PEDOT electrodes (50 um diameter, 350 um spacing) on SU-8 insulation over an 1.1 x 1.1 mm recording area centred in the well floor; these sit in the imaging field. Axion publishes no plate material, no lid dimension and no tolerances. The Axion CytoView MEA 48 (M768-tMEA-48B / -48W) shares this footprint, pitch and both A1 offsets but is a different mould - 10.35 mm top diameter, 5.30 mm bottom, 12.15 mm well height - so do not use this definition for a CytoView plate."
35
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/ramonaoptics/labware/main/labware/labware.v1.schema.json",
3
+ "name": "CellVis 24 well",
4
+ "number_of_wells": 24,
5
+ "manufacturer": "CellVis",
6
+ "author": "CellVis",
7
+ "last_updated": "2025-08-07T00:00:00Z",
8
+ "part_number": "P24-1.5H-N",
9
+ "web_reference": "https://www.cellvis.com/_24-well-glass-bottom-plate-with-number-0-cover-glass-(0.085-0.115-mm)_/product_detail.php?product_id=56",
10
+
11
+ "outer_plate_dimensions": {
12
+ "length": 0.1275,
13
+ "width": 0.08525,
14
+ "height": 0.0225
15
+ },
16
+
17
+ "well_dimensions": {
18
+ "pitch": 0.0193,
19
+ "rows": 4,
20
+ "columns": 6,
21
+ "shape": "circle",
22
+ "diameter": 0.01554,
23
+ "depth": 0.020,
24
+
25
+ "bottom_shape": "flat"
26
+ },
27
+
28
+ "alignment_reference": {
29
+ "origin_reference": "A1 well center",
30
+ "offset_from_left_edge": 0.01705,
31
+ "offset_from_top_edge": 0.01367,
32
+ "z_reference": "top surface of plate"
33
+ },
34
+
35
+ "notes": "Dimensions are in meters per ANSI/SLAS 1-2004 standard. Use 'well_pitch' and origin reference to compute all well centers."
36
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/ramonaoptics/labware/main/labware/labware.v1.schema.json",
3
+ "name": "Corning Costar 3335 6 well",
4
+ "number_of_wells": 6,
5
+ "manufacturer": "Corning Life Sciences (Corning Incorporated)",
6
+ "author": "Ramona Optics",
7
+ "last_updated": "2026-08-28T00:00:00Z",
8
+ "part_number": "3335",
9
+ "web_reference": "https://www.corning.com/catalog/cls/documents/drawings/DWG00673.PDF",
10
+
11
+ "outer_plate_dimensions": {
12
+ "length": 0.12776,
13
+ "width": 0.08547,
14
+ "height": 0.02027
15
+ },
16
+
17
+ "well_dimensions": {
18
+ "pitch": 0.03912,
19
+ "rows": 2,
20
+ "columns": 3,
21
+ "shape": "circle",
22
+ "diameter": 0.03543,
23
+ "depth": 0.01740,
24
+ "bottom_shape": "flat"
25
+ },
26
+
27
+ "alignment_reference": {
28
+ "origin_reference": "A1 well center",
29
+ "offset_from_left_edge": 0.02476,
30
+ "offset_from_top_edge": 0.02316,
31
+ "z_reference": "top surface of plate"
32
+ },
33
+
34
+ "notes": "Corning Costar 6 well cell culture multiple well plate, cat# 3335, CellBIND surface, clear virgin polystyrene (meets USP Class VI), flat-bottom round wells, sterile, with lid. SURFACE: 3335 is the CellBIND-treated item; the identical mould is also sold as 3506 (standard TC-treated), 3516 and 3471 - Corning's cell culture dimension sheet lists 3335, 3506, 3516 and 3471 on a single row with one set of dimensions, so this definition covers all four. Surface chemistry does not change any geometry in this file. CONTROLLING DOCUMENT: Corning customer drawing DWG00673 Rev D, 'COSTAR 6 WELL PLATE WITH COVER', drawn CBL 10/03/96, rev D dated 6/22/18, prod code 144. The drawing's own revision block ties it to catalogue 3506 ('REVISED PER CO# 05780 WAS 144-3506'), not to 3335; it is used for 3335 because the dimension sheet puts 3335 and 3506 on the same mould row and because the per-catalogue Product Description for 3335 (rev 9, 2 Feb 2026, certs-ecatalog.corning.com/life-sciences/product-descriptions/3335.pdf) reproduces the drawing exactly - plate 5.030 x 3.365 in (127.76 x 85.47 mm), well top diameter 1.395 in (35.43 mm), well bottom diameter 1.370 in (34.80 mm), well depth 0.685 in (17.40 mm). The drawing is vector with no text layer and was read as a 100 dpi render, with the section view re-cropped at 300 dpi. Every dimension in this file is a millimetre value in parentheses on that drawing: plate length 127.76 mm, plate width 85.47 mm, plate height without cover 20.27 mm (the .798 in dimension on the section view; the base-plus-cover stack view gives 22.63 mm WITH the cover on, matching the Product Description's 'Height with lid 0.891 in' - the lid is not modelled here, so the lid-off 20.27 mm is used). Well center-to-center 39.12 mm, marked 'Typ.' and dimensioned on both the horizontal and the vertical run. Well top inside diameter 35.43 mm, recorded in 'diameter' per the top-diameter convention; well bottom inside diameter 34.80 mm. Well depth 17.40 mm. Grid is 2 rows (A-B) x 3 columns (1-3) with A1 top-left, as drawn and as numbered 1-6 on the top view. A1 well center offsets are dimensioned directly on the drawing's top view: 24.76 mm from the left edge and 23.16 mm from the top edge - nothing derived, and they agree with Corning's convention that 'A1 Column Offset' is measured from the left and 'A1 Row Offset' from the top. Bottom thickness 1.27 mm and well bottom elevation above the plate underside 2.54 mm (the working-distance numbers; neither is a field in this schema). Well volume 16.8 mL, working volume 5 mL per the Product Description, growth/bottom area 9.5 cm^2, flange/skirt height 13.74 mm. VENDOR ARITHMETIC: the drawing's own vertical dimensions do not close - well depth 17.40 + bottom thickness 1.27 + well bottom elevation 2.54 = 21.21 mm against the stated plate height of 20.27 mm. The identical 0.94 mm gap appears on the 12 well sheet DWG00674 (17.53 + 1.27 + 2.16 = 20.96 vs 20.02), so it is a datum convention on Corning's sheets rather than a misread; each value is recorded here as printed. Drawing tolerances are 'nominal for reference only'; the Product Description states +/- 0.050 in on its dimensions. CROSS-CHECK: Corning's family sheet 'Microplate Dimensions for Corning Cell Culture Microplates' dated 1/16/2019 (footer 'Corning Restricted'; no longer served from corning.com and read from the Internet Archive snapshot web.archive.org/web/20240119081431if_/https://www.corning.com/catalog/cls/documents/drawings/MD_Microplate_Dimension_Sheets_Multiple_Well.pdf) agrees with the drawing on every value in this file, including both A1 offsets. Note that www.corning.com returns 403 to a bare curl and to a browser user-agent alone; a full browser header set including Referer and Sec-Fetch-* is needed to download DWG00673. Units in meters. Use 'pitch' and origin reference to compute all well centers."
35
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/ramonaoptics/labware/main/labware/labware.v1.schema.json",
3
+ "name": "Corning Falcon 351146 6 well",
4
+ "number_of_wells": 6,
5
+ "manufacturer": "Corning Life Sciences (Corning Incorporated)",
6
+ "author": "Ramona Optics",
7
+ "last_updated": "2026-08-25T00:00:00Z",
8
+ "part_number": "351146",
9
+ "web_reference": "https://pdf.dutscher.com/doc/3/35/351/351146/351146_FTen.pdf",
10
+
11
+ "outer_plate_dimensions": {
12
+ "length": 0.12763,
13
+ "width": 0.08547,
14
+ "height": 0.02019
15
+ },
16
+
17
+ "well_dimensions": {
18
+ "pitch": 0.03924,
19
+ "rows": 2,
20
+ "columns": 3,
21
+ "shape": "circle",
22
+ "diameter": 0.03571,
23
+ "depth": 0.01765,
24
+ "bottom_shape": "flat"
25
+ },
26
+
27
+ "alignment_reference": {
28
+ "origin_reference": "A1 well center",
29
+ "offset_from_left_edge": 0.024575,
30
+ "offset_from_top_edge": 0.023115,
31
+ "z_reference": "top surface of plate"
32
+ },
33
+
34
+ "notes": "Corning Falcon 6 well multiwell cell culture plate, clear crystal-grade polystyrene, flat-bottom round wells, low-evaporation lid, sterile (gamma irradiated). Cat# 351146 is the non-treated item, registered here; the same mould (one Corning technical data sheet covers all of them) is sold as 353046 (TC-treated, 1/tray), 353224 (TC-treated, 6/bag), 353934 (TC-treated, 10/tray), 353846 (Primaria) and 353502 (notched TC plate for inserts) - any of these can use this definition. Dimensions are from the Corning Life Sciences 'Customer Technical Data Sheet - Multiwell TC Plates - 6 Well', document LSR00001; rev 5 (2018) was read from the 353046 copy hosted by Dutscher (pdf.dutscher.com/doc/3/35/353/353046/353046_FTen.pdf) and rev 4 (2013) from the 351146 copy at web_reference; the two revisions carry identical numbers. Corning's own site links this sheet from the product page's Documents tab but refuses non-browser downloads, hence the distributor-hosted copy is cited. Units in meters. Plate (without lid) length D = 127.63 mm, width E = 85.47 mm, height F = 20.19 mm; height with lid on is 21.43 mm; the lid (127.20 x 85.14 x 10.03 mm) is not modeled. Well top internal diameter 35.71 mm, recorded in 'diameter' per the top-diameter convention; bottom internal diameter 35.00 mm; depth 17.65 mm; growth area 9.619 cm^2; center-to-center 39.24 mm (assumed equal in both directions, the sheet gives one value); bottom thickness 1.52 mm. Media working volume 2.5-3.0 mL. DERIVED: Corning does not publish the A1 well center position on this sheet. The offsets here place the 2x3 grid centered on the plate footprint: offset_from_left_edge = (127.63 - 2 x 39.24) / 2 = 24.575 mm, offset_from_top_edge = (85.47 - 39.24) / 2 = 23.115 mm. This is consistent with Corning's Costar 6 well drawing DWG00673 (24.76 / 23.16 mm at 39.12 mm pitch on a 127.76 x 85.47 mm footprint, i.e. also centered to within 0.1 mm) but has not been checked against a physical Falcon plate. Use 'pitch' and origin reference to compute all well centers."
35
+ }