diff --git a/latest/index.bs b/latest/index.bs
index 461f6e00..eaf6d6fc 100644
--- a/latest/index.bs
+++ b/latest/index.bs
@@ -161,7 +161,7 @@ High-content screening {#hcs-layout}
------------------------------------
The following specification defines the hierarchy for a high-content screening
-dataset. Three groups must be defined above the images:
+dataset. Three groups MUST be defined above the images:
- the group above the images defines the well and MUST implement the
[well specification](#well-md). All images contained in a well are fields
@@ -171,6 +171,9 @@ dataset. Three groups must be defined above the images:
collection of wells organized in rows and columns. It MUST implement the
[plate specification](#plate-md)
+A well row group SHOULD NOT be present if there are no images in the well row.
+A well group SHOULD NOT be present if there are no images in the well.
+
. # Root folder, potentially in S3,
@@ -415,8 +418,13 @@ custom attributes of the plate group under the `plate` key.
columns
A list of JSON objects defining the columns of the plate. Each column
object defines the properties of the column at the index of the object
- in the list. If not empty, it MUST contain a `name` key specifying the
- column name.
+ in the list. Each column in the physical plate MUST be defined, even
+ if no wells in the column are defined. Each defined column MUST contain
+ a `name` key specifying the column name. The `name` MUST contain only
+ alphanumeric characters, MUST be case-sensitive, and MUST NOT be a
+ duplicate of any other `name` in the `columns` list. Care SHOULD be
+ taken to avoid collisions on case-insensitive filesystems
+ (e.g. avoid using both `Aa` and `aA`).
field_count
An integer defining the maximum number of fields per view across all
wells.
@@ -425,17 +433,30 @@ custom attributes of the plate group under the `plate` key.
rows
A list of JSON objects defining the rows of the plate. Each row object
defines the properties of the row at the index of the object in the
- list. If not empty, it MUST contain a `name` key specifying the row
- name.
+ list. Each row in the physical plate MUST be defined, even if no wells
+ in the row are defined. Each defined row MUST contain a `name` key
+ specifying the row name. The `name` MUST contain only alphanumeric
+ characters, MUST be case-sensitive, and MUST NOT be a duplicate
+ of any other `name` in the `rows` list. Care SHOULD be taken to avoid
+ collisions on case-insensitive filesystems (e.g. avoid using both `Aa`
+ and `aA`).
version
A string defining the version of the specification.
wells
A list of JSON objects defining the wells of the plate. Each well object
- MUST contain a `path` key identifying the path to the well subgroup.
+ MUST contain a `path` key identifying the path to the well subgroup.
+ The `path` MUST consist of a `name` in the `rows` list, a file separator (`/`),
+ and a `name` from the `columns` list, in that order. The `path` MUST NOT contain
+ additional leading or trailing directories.
+ Each well object MUST contain both a `rowIndex` key identifying the index into
+ the `rows` list and a `columnIndex` key indentifying the index into
+ the `columns` list. `rowIndex` and `columnIndex` MUST be 0-based.
+ The `rowIndex`, `columnIndex`, and `path` MUST all refer to the same
+ row/column pair.
-For example the following JSON object defines a plate with two acquisition and
-6 wells (2 rows and 3 columns), containing up 2 fields of view per acquistion.
+For example the following JSON object defines a plate with two acquisitions and
+6 wells (2 rows and 3 columns), containing up to 2 fields of view per acquisition.
```json
"plate": {
@@ -477,22 +498,129 @@ For example the following JSON object defines a plate with two acquisition and
"version": "0.3",
"wells": [
{
- "path": "2020-10-10/A/1"
+ "path": "A/1",
+ "rowIndex": 0,
+ "columnIndex": 0
+ },
+ {
+ "path": "A/2"
+ "rowIndex": 0,
+ "columnIndex": 1
+ },
+ {
+ "path": "A/3"
+ "rowIndex": 0,
+ "columnIndex": 2
+ },
+ {
+ "path": "B/1"
+ "rowIndex": 1,
+ "columnIndex": 0
+ },
+ {
+ "path": "B/2"
+ "rowIndex": 1,
+ "columnIndex": 1
+ },
+ {
+ "path": "B/3"
+ "rowIndex": 1,
+ "columnIndex": 2
+ }
+ ]
+ }
+```
+
+The following JSON object defines a sparse plate with one acquisition and
+2 wells in a 96 well plate, containing one field of view per acquisition.
+
+```json
+"plate": {
+ "acquisitions": [
+ {
+ "id": 1,
+ "maximumfieldcount": 1,
+ "name": "single acquisition",
+ "starttime": 1343731272000
+ },
+ ],
+ "columns": [
+ {
+ "name": "1"
+ },
+ {
+ "name": "2"
+ },
+ {
+ "name": "3"
+ },
+ {
+ "name": "4"
+ },
+ {
+ "name": "5"
+ },
+ {
+ "name": "6"
+ },
+ {
+ "name": "7"
+ },
+ {
+ "name": "8"
+ },
+ {
+ "name": "9"
+ },
+ {
+ "name": "10"
+ },
+ {
+ "name": "11"
+ },
+ {
+ "name": "12"
+ }
+ ],
+ "field_count": 1,
+ "name": "sparse test",
+ "rows": [
+ {
+ "name": "A"
+ },
+ {
+ "name": "B"
+ },
+ {
+ "name": "C"
},
{
- "path": "2020-10-10/A/2"
+ "name": "D"
},
{
- "path": "2020-10-10/A/3"
+ "name": "E"
},
{
- "path": "2020-10-10/B/1"
+ "name": "F"
},
{
- "path": "2020-10-10/B/2"
+ "name": "G"
},
{
- "path": "2020-10-10/B/3"
+ "name": "H"
+ }
+ ],
+ "version": "0.1",
+ "wells": [
+ {
+ "path": "C/5"
+ "rowIndex": 2,
+ "columnIndex": 4
+ },
+ {
+ "path": "D/7"
+ "rowIndex": 3,
+ "columnIndex": 6
}
]
}
@@ -502,7 +630,7 @@ For example the following JSON object defines a plate with two acquisition and
--------------------------
For high-content screening datasets, the metadata about all fields of views
-under a given well can be found under the "well" key in the attributes of the
+under a given well can be found under the "well" key in the attributes of the
well group.
@@ -510,7 +638,7 @@ well group.
- A list of JSON objects defining the fields of views for a given well.
Each object MUST contain a `path` key identifying the path to the
field of view. If multiple acquisitions were performed in the plate, it
- SHOULD contain an `acquisition` key identifying the id of the
+ MUST contain an `acquisition` key identifying the id of the
acquisition which must match one of acquisition JSON objects defined in
the plate metadata.
- version
@@ -518,7 +646,7 @@ well group.
For example the following JSON object defines a well with four fields of
-views. The first two fields of view were part of the first acquisition while
+view. The first two fields of view were part of the first acquisition while
the last two fields of view were part of the second acquisition.
```json
@@ -545,6 +673,26 @@ the last two fields of view were part of the second acquisition.
}
```
+The following JSON object defines a well with two fields of view in a plate with
+four acquisitions. The first field is part of the first acquisition, and the second
+field is part of the last acquisition.
+
+```json
+"well": {
+ "images": [
+ {
+ "acquisition": 0,
+ "path": "0"
+ },
+ {
+ "acquisition": 3,
+ "path": "1"
+ }
+ ],
+ "version": "0.1"
+}
+```
+
Specification naming style {#naming-style}
==========================================