Skip to content

Commit 22a1e29

Browse files
authored
Merge pull request #1092 from AllenNeuralDynamics/release-v1.1.0
Release v1.1.0
2 parents 687b7a3 + 8db45da commit 22a1e29

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+5991
-3512
lines changed

.flake8

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,7 @@ exclude =
55
build
66
max-complexity = 10
77
max-line-length = 120
8+
9+
[flake8:local-plugins]
10+
extension =
11+
PF = aind_flake8_extensions.plugin:run_ast_checks

docs/source/aind_data_schema.core.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,14 @@ aind\_data\_schema.core.subject module
8484
:undoc-members:
8585
:show-inheritance:
8686

87+
aind\_data\_schema.core.quality_control module
88+
--------------------------------------
89+
90+
.. automodule:: aind_data_schema.core.quality_control
91+
:members:
92+
:undoc-members:
93+
:show-inheritance:
94+
8795
Module contents
8896
---------------
8997

docs/source/conf.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
rig,
2222
session,
2323
subject,
24+
quality_control
2425
)
2526

2627
dummy_object = [
@@ -33,6 +34,7 @@
3334
rig,
3435
session,
3536
subject,
37+
quality_control
3638
] # A temporary workaround to bypass "Imported but unused" error
3739

3840
INSTITUTE_NAME = "Allen Institute for Neural Dynamics"
@@ -55,6 +57,7 @@
5557
"sphinxcontrib.autodoc_pydantic",
5658
"sphinx.ext.napoleon",
5759
"sphinx_jinja",
60+
"myst_parser",
5861
]
5962
templates_path = ["_templates"]
6063
exclude_patterns = []
@@ -88,6 +91,7 @@
8891
"rig",
8992
"session",
9093
"subject",
94+
"quality_control",
9195
]
9296
rst_epilog = ""
9397
for diagram in diagrams_list:

docs/source/index.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ A given data asset will have the following JSON files:
2727
- :doc:`rig <rig>` or :doc:`instrument <rig>`: Metadata describing the equipment used to acquire data, including part names, serial numbers, and configuration details.
2828
- :doc:`session <session>` or :doc:`acquisition <acquisition>`: Metadata describing how the data was acquired
2929
- :doc:`processing <processing>`: Metadata describing how data has been processed and analyzed into derived data assets, including information on the software and parameters used for processing and analysis.
30+
- :doc:`quality_control <quality_control>`: Metadata describing how the data has been evaluated for quality control.
3031

3132
Example
3233
=======
@@ -175,6 +176,7 @@ build NWB extension that easily embeds metadata not covered by the core NWB sche
175176
session
176177
acquisition
177178
processing
179+
quality_control
178180

179181

180182
.. toctree::

docs/source/quality_control.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# Quality control
2+
3+
## Overview
4+
5+
Quality control is a collection of **evaluations** based on sets of **metrics** about the data.
6+
7+
`QCEvaluation`s should be generated during pipelines: before raw data upload, during processing, and during analysis by researchers.
8+
9+
Each `QualityControl`, `QCEvaluation`, and `QCMetric` includes a `aind_data_schema.quality_control.State` which is a timestamped object indicating that the Overall QC/Evaluation/Metric passes, fails, or is in a pending state waiting for manual annotation.
10+
11+
The state of an evaluation is set automatically to the lowest of its metric's states. A single failed metric sets an entire evaluation to fail. While a single pending metric (with all other metrics passing) sets an entire evaluation to pending. An optional setting `QCEvaluation.allow_failed_metrics` allows you to ignore failures, which can be useful in situations where an evaluation is not critical for quality control.
12+
13+
## Details
14+
15+
**Q: What is an evaluation?**
16+
17+
Each `QCEvaluation` should be thought of as a single aspect of the data asset, from one `Modality`, that is evaluated for quality at a specific `Stage` in data acquisition or analysis. For example, the brain moves a small amount during electrophysiology. This evaluation would be marked with `Stage:RAW` and `Modality:ECEPHYS`. Evaluations will often consist of multiple metrics, some of which can be measured and evaluated automatically, as well as qualititative metrics that need to be evaluated by a human observer.
18+
19+
The state of an evaluation depends on the state of its metrics according to these rules:
20+
21+
- If any metric fails the evaluation fails (except when `allow_failed_metrics=True`, see below)
22+
- If any metric is pending and the rest pass the evaluation is pending
23+
- If all metrics pass the evaluation passes
24+
25+
There are many situations where quality control is evaluated on an aspect of the data that isn't critical to the overall experimental goals. For example, you may have a `QCEvaluation` that checks whether the temperature and humidity sensors on the rig were functional, but the overall analysis can proceed with or without the these data. In these situations set `QCEvaluation.allow_failed_metrics=True` to allow the evaluation to pass even if these sensors actually failed. This ensures that the overall `QualityControl` for the data asset can also pass, without regard to these optional elements of the data.
26+
27+
**Q: What is a metric?**
28+
29+
Each `QCMetric` is a single value or set of values that can be computed, or observed, about a set of data as part of an evaluation. These can have any type. See the AIND section for special rules for annotating metrics with options.
30+
31+
`QCMetric`s have a `Status`. The `Status` should depend directly on the `QCMetric.value`, either by a simple function: "value>5", or by a qualitative rule: "Field of view includes visual areas". The `QCMetric.description` field should be used to describe the rule used to set the status. Metrics can be evaluated multiple times, in which case the new status should be appended the `QCMetric.status_history`.
32+
33+
Metrics should include a `QCMetric.reference`. References are intended to be publicly accessible images, figures, combined figures with multiple panels, or videos that support the metric or provide information necessary for manual annotation of a metric's status.
34+
35+
**Q: What are the status options for metrics?**
36+
37+
In our quality control a metric's status is always `PASS`, `PENDING` (waiting for manual annotation), or `FAIL`. `PENDING` should be used when a user must manually annotated the metric's state.
38+
39+
We enforce this minimal set of states to prevent ambiguity and make it easier to build tools that can interpret the status of a data asset.
40+
41+
## Details for AIND users
42+
43+
### Uploading QC
44+
45+
#### Preferred workflow
46+
47+
**Metadata**
48+
49+
If you are building `QCEvaluation` and `QCMetric` objects prior to raw data upload or in a capsule alongside your processing or analysis, your workflow is:
50+
51+
```
52+
from aind_data_schema.core.quality_control import QualityControl
53+
54+
# Build your QCEvaluations and metrics
55+
evaluations = [QCEvaluation(), ...]
56+
57+
# Build your QualityControl object
58+
qc = QualityControl(evaluations=evaluations)
59+
60+
qc.write_standard_file()
61+
```
62+
63+
The indexer will pick up this file alongside the other metadata files and handle it appropriately.
64+
65+
**References**
66+
67+
Each `QCMetric` you build should have an attached reference. Our preference is that you post these images to [FigURL](https://github.com/flatironinstitute/figurl/blob/main/doc/intro.md) and put the generated URL into the reference.
68+
69+
We recommend that you write PNG files for images and static multi-panel figures, MP4 files for videos, and Altair charts for interactive figures.
70+
71+
#### Alternate workflows
72+
73+
**Metadata**
74+
75+
We'll post documentation on how to append `QCEvaluations` to pre-existing quality_control.json files, via DocDB using the `aind-data-access-api`, in the future.
76+
77+
**References**
78+
79+
You can also place the references in the data asset itself, to do this include the relative path "qc_images/your_image.png" to that asset inside of the results folder.
80+
81+
### QC Portal
82+
83+
The QC Portal is a browser application that allows users to view and interact with the AIND QC metadata and to annotate ``PENDING`` metrics with qualitative evaluations. The portal is maintained by scientific computing, reach out to us with any questions or concerns.
84+
85+
The portal works by pulling the metadata object from the Document Database (DocDB). When you make changes to metrics or add notes the **submit** button will be enabled, submitting pushes your updates to the DocDB along with a timestamp and your name.
86+
87+
**Q: When does the state get set for the QCEvaluation and QualityControl objects?**
88+
89+
The QC portal automatically calls ``QualityControl.evaluate_status()`` whenever you submit changes to the metrics. This first evaluates the individual `QCEvaluation` objects, and then evaluates the overall status.
90+
91+
**Q: How do reference URLs get pulled into the QC Portal?**
92+
93+
Each metric is associated with a reference figure, image, or video. The QC portal can interpret four ways of setting the reference field:
94+
95+
- Provide a relative path to a file in this data asset's S3 bucket
96+
- Provide a url to a FigURL figure
97+
- Provide the name of one of the interactive plots, e.g. "ecephys-drift-map"
98+
99+
<!-- There are many situations where it's helpful to be able to "swipe" between two images. If you have two identical images separated by a ';' the portal will allow users to swipe between them. For example, you might show snippets of the raw electrophysiology raster with detected spikes overlaid on the swipe. -->
100+
101+
**Q: I saw fancy things like dropdowns in the QC Portal, how do I do that?**
102+
103+
By default the QC portal displays dictionaries as tables where the values can be edited. We also support a few special cases to allow a bit more flexibility or to constrain the actions that manual annotators can take. Install the `aind-qcportal-schema` package and set the `value` field to the corresponding pydantic object to use these.
104+
105+
### Multi-session QC
106+
107+
[Details coming soon, this is under discussion]

examples/aibs_smartspim_instrument.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/instrument.py",
3-
"schema_version": "1.0.0",
3+
"schema_version": "1.0.1",
44
"instrument_id": "440_SmartSPIM2_20231004",
55
"modification_date": "2023-10-04",
66
"instrument_type": "SmartSPIM",

examples/aibs_smartspim_procedures.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/procedures.py",
3-
"schema_version": "1.0.0",
3+
"schema_version": "1.1.1",
44
"subject_id": "651286",
55
"subject_procedures": [
66
{

examples/aind_smartspim_instrument.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/instrument.py",
3-
"schema_version": "1.0.0",
3+
"schema_version": "1.0.1",
44
"instrument_id": "440_SmartSPIM1_20231004",
55
"modification_date": "2023-10-04",
66
"instrument_type": "SmartSPIM",

examples/bergamo_ophys_session.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/session.py",
3-
"schema_version": "1.0.0",
3+
"schema_version": "1.0.1",
44
"protocol_id": [],
55
"experimenter_full_name": [
66
"John Doe"

examples/data_description.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/data_description.py",
3-
"schema_version": "1.0.0",
3+
"schema_version": "1.0.1",
44
"license": "CC-BY-4.0",
55
"platform": {
66
"name": "Electrophysiology platform",

0 commit comments

Comments
 (0)