aind-data-schema 2.6.0__tar.gz → 2.7.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 (208) hide show
  1. aind_data_schema-2.7.1/.github/workflows/link-issues-by-milestone.yml +56 -0
  2. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/.github/workflows/run_dev_tests.yml +0 -1
  3. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/.github/workflows/run_main_tests.yml +0 -1
  4. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/.github/workflows/tag_and_publish_main.yml +1 -0
  5. aind_data_schema-2.7.1/.github/workflows/update_dev_docs.yml +34 -0
  6. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/.github/workflows/update_docs.yml +0 -1
  7. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/CONTRIBUTING.md +3 -1
  8. {aind_data_schema-2.6.0/src/aind_data_schema.egg-info → aind_data_schema-2.7.1}/PKG-INFO +2 -1
  9. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/base/core/acquisition.md +2 -2
  10. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/base/core/quality_control.md +1 -1
  11. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/acquisition.md +18 -6
  12. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/harp_types.md +4 -1
  13. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/organizations.md +1 -0
  14. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/components/configs.md +0 -1
  15. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/components/identifiers.md +1 -0
  16. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/components/injection_procedures.md +1 -1
  17. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/components/specimen_procedures.md +2 -2
  18. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/components/subject_procedures.md +14 -0
  19. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/components/surgery_procedures.md +2 -2
  20. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/index.rst +0 -1
  21. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/procedures.md +1 -1
  22. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/quality_control.md +1 -1
  23. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/subject.md +1 -1
  24. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/validation.md +1 -1
  25. aind_data_schema-2.7.1/examples/barseq_acquisition.py +40 -0
  26. aind_data_schema-2.7.1/examples/barseq_instrument.py +250 -0
  27. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/ephys_instrument.py +20 -23
  28. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/processing.py +1 -1
  29. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/pyproject.toml +1 -0
  30. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/schemas/acquisition_schema.json +238 -9
  31. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/schemas/instrument_schema.json +223 -4
  32. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/schemas/metadata_schema.json +684 -23
  33. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/schemas/model_schema.json +14 -0
  34. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/schemas/procedures_schema.json +168 -3
  35. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/schemas/processing_schema.json +16 -2
  36. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/schemas/subject_schema.json +217 -3
  37. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/__init__.py +1 -1
  38. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/base.py +5 -3
  39. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/devices.py +4 -2
  40. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/identifiers.py +25 -1
  41. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/injection_procedures.py +6 -1
  42. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/measurements.py +2 -2
  43. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/reagent.py +1 -1
  44. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/specimen_procedures.py +8 -8
  45. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/stimulus.py +1 -1
  46. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/subject_procedures.py +12 -0
  47. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/surgery_procedures.py +4 -1
  48. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/core/acquisition.py +78 -28
  49. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/core/instrument.py +20 -4
  50. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/core/metadata.py +21 -9
  51. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/core/procedures.py +30 -6
  52. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/core/processing.py +1 -1
  53. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/core/quality_control.py +3 -3
  54. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/core/subject.py +3 -3
  55. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/utils/compatibility_check.py +3 -1
  56. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/utils/docs/model_generator.py +1 -1
  57. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/utils/docs/registries_generator.py +2 -2
  58. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/utils/examples_generator.py +4 -2
  59. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/utils/merge.py +3 -1
  60. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/utils/validators.py +6 -3
  61. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1/src/aind_data_schema.egg-info}/PKG-INFO +2 -1
  62. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema.egg-info/SOURCES.txt +4 -1
  63. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema.egg-info/requires.txt +1 -0
  64. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_acquisition.py +49 -1
  65. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_base.py +6 -6
  66. aind_data_schema-2.7.1/tests/test_identifiers.py +58 -0
  67. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_instrument.py +42 -9
  68. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_metadata.py +14 -0
  69. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_procedures.py +56 -0
  70. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_quality_control.py +12 -0
  71. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_utils_validators.py +16 -16
  72. aind_data_schema-2.6.0/CHANGELOG.md +0 -186
  73. aind_data_schema-2.6.0/tests/test_identifiers.py +0 -27
  74. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/.flake8 +0 -0
  75. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  76. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  77. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/.github/ISSUE_TEMPLATE/user-story.md +0 -0
  78. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/.github/workflows/publish_dev.yml +0 -0
  79. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/.gitignore +0 -0
  80. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/.readthedocs.yaml +0 -0
  81. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/CODE_OF_CONDUCT.md +0 -0
  82. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/LICENSE +0 -0
  83. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/README.md +0 -0
  84. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/Makefile +0 -0
  85. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/base/core/data_description.md +0 -0
  86. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/base/core/instrument.md +0 -0
  87. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/base/core/metadata.md +0 -0
  88. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/base/core/model.md +0 -0
  89. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/base/core/procedures.md +0 -0
  90. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/base/core/processing.md +0 -0
  91. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/base/core/subject.md +0 -0
  92. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/make.bat +0 -0
  93. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/_static/bregma_and_lambda2.png +0 -0
  94. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/_static/coordinates2.png +0 -0
  95. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/_static/coordinates2_original.png +0 -0
  96. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/_static/custom.css +0 -0
  97. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/_static/dark-logo.svg +0 -0
  98. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/_static/favicon.ico +0 -0
  99. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/_static/light-logo.svg +0 -0
  100. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/_static/session_image_1.png +0 -0
  101. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/_static/session_image_2.png +0 -0
  102. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/_static/session_image_3.png +0 -0
  103. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/atlas.md +0 -0
  104. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/brain_atlas.md +0 -0
  105. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/coordinates.md +0 -0
  106. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/data_name_patterns.md +0 -0
  107. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/devices.md +0 -0
  108. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/external.md +0 -0
  109. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/licenses.md +0 -0
  110. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/modalities.md +0 -0
  111. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/pid_names.md +0 -0
  112. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/process_names.md +0 -0
  113. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/reagent.md +0 -0
  114. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/registries.md +0 -0
  115. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/species.md +0 -0
  116. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/specimen_procedure_types.md +0 -0
  117. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/stimulus_modality.md +0 -0
  118. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/system_architecture.md +0 -0
  119. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/aind_data_schema_models/units.md +0 -0
  120. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/components/connections.md +0 -0
  121. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/components/coordinates.md +0 -0
  122. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/components/devices.md +0 -0
  123. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/components/measurements.md +0 -0
  124. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/components/reagent.md +0 -0
  125. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/components/stimulus.md +0 -0
  126. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/components/subjects.md +0 -0
  127. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/components.rst +0 -0
  128. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/conf.py +0 -0
  129. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/coordinate_systems.md +0 -0
  130. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/data_description.md +0 -0
  131. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/example_workflow/example_workflow.md +0 -0
  132. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/example_workflow/example_workflow.py +0 -0
  133. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/example_workflow/example_workflow.xlsx +0 -0
  134. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/general.md +0 -0
  135. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/instrument.md +0 -0
  136. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/metadata.md +0 -0
  137. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/model.md +0 -0
  138. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/processing.md +0 -0
  139. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/registries.rst +0 -0
  140. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/docs/source/related_standards.md +0 -0
  141. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/__init__.py +0 -0
  142. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/aibs_smartspim_instrument.py +0 -0
  143. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/aibs_smartspim_procedures.py +0 -0
  144. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/aind_smartspim_instrument.py +0 -0
  145. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/bergamo_ophys_acquisition.py +0 -0
  146. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/data_description.py +0 -0
  147. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/ephys_acquisition.py +0 -0
  148. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/exaspim_acquisition.py +0 -0
  149. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/exaspim_instrument.py +0 -0
  150. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/exaspim_quality_control.py +0 -0
  151. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/fip_behavior_instrument.py +0 -0
  152. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/fip_ophys_acquisition.py +0 -0
  153. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/fip_ophys_instrument.py +0 -0
  154. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/model.py +0 -0
  155. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/mri_acquisition.py +0 -0
  156. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/multiplane_ophys_acquisition.py +0 -0
  157. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/multiplane_ophys_instrument.py +0 -0
  158. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/ophys_acquisition.py +0 -0
  159. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/ophys_procedures.py +0 -0
  160. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/procedures.py +0 -0
  161. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/quality_control.py +0 -0
  162. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/slap2_acquisition.py +0 -0
  163. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/slap2_instrument.py +0 -0
  164. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/slap2_structure_acquisition.py +0 -0
  165. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/examples/subject.py +0 -0
  166. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/schemas/data_description_schema.json +0 -0
  167. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/schemas/quality_control_schema.json +0 -0
  168. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/setup.cfg +0 -0
  169. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/setup.py +0 -0
  170. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/__init__.py +0 -0
  171. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/configs.py +3 -3
  172. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/connections.py +0 -0
  173. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/coordinates.py +0 -0
  174. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/subjects.py +0 -0
  175. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/components/wrappers.py +0 -0
  176. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/core/__init__.py +0 -0
  177. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/core/data_description.py +0 -0
  178. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/core/model.py +0 -0
  179. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/utils/__init__.py +0 -0
  180. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/utils/docs/doc_generator.py +0 -0
  181. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/utils/docs/utils.py +0 -0
  182. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/utils/exceptions.py +0 -0
  183. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/utils/json_writer.py +0 -0
  184. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema/utils/schema_version_bump.py +0 -0
  185. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema.egg-info/dependency_links.txt +0 -0
  186. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/src/aind_data_schema.egg-info/top_level.txt +0 -0
  187. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/__init__.py +0 -0
  188. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_acquisition_configs.py +0 -0
  189. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_aind_generic.py +0 -0
  190. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_bump_schema_versions.py +0 -0
  191. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_compatibility_check.py +0 -0
  192. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_composability_merge.py +0 -0
  193. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_configs.py +0 -0
  194. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_coordinates.py +0 -0
  195. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_data_description.py +0 -0
  196. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_device.py +0 -0
  197. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_examples.py +0 -0
  198. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_imaging.py +0 -0
  199. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_inst_acq_compatibility.py +0 -0
  200. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_json_writer.py +0 -0
  201. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_measurements.py +0 -0
  202. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_model.py +0 -0
  203. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_processing.py +0 -0
  204. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_stimulus.py +0 -0
  205. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_subject.py +0 -0
  206. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_subjects.py +0 -0
  207. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_utils_merge.py +0 -0
  208. {aind_data_schema-2.6.0 → aind_data_schema-2.7.1}/tests/test_wrappers.py +0 -0
@@ -0,0 +1,56 @@
1
+ name: Link issue to cross-repo milestone parent
2
+
3
+ on:
4
+ issues:
5
+ types: [milestoned]
6
+
7
+ jobs:
8
+ link:
9
+ runs-on: ubuntu-latest
10
+
11
+ steps:
12
+ - name: Link to parent issue in aind-scientific-computing
13
+ uses: actions/github-script@v7
14
+ with:
15
+ github-token: ${{ secrets.SERVICE_TOKEN }}
16
+ script: |
17
+ const issue = context.payload.issue;
18
+ const milestone = issue.milestone;
19
+
20
+ if (!milestone) return;
21
+
22
+ const targetOwner = "AllenNeuralDynamics";
23
+ const targetRepo = "aind-scientific-computing";
24
+
25
+ const url = milestone.description;
26
+ const match = url?.match(/\/issues\/(\d+)$/);
27
+
28
+ if (!match) {
29
+ console.log(`Milestone description is not a roadmap URL: ${url}`);
30
+ return;
31
+ }
32
+
33
+ const parentNumber = parseInt(match[1]);
34
+
35
+ const { data: parent } = await github.rest.issues.get({
36
+ owner: targetOwner,
37
+ repo: targetRepo,
38
+ issue_number: parentNumber
39
+ });
40
+
41
+ if (!parent) {
42
+ console.log(`No issue found at ${url}`);
43
+ return;
44
+ }
45
+
46
+ await github.request("POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues", {
47
+ owner: targetOwner,
48
+ repo: targetRepo,
49
+ issue_number: parentNumber,
50
+ sub_issue_id: issue.id,
51
+ headers: {
52
+ "X-GitHub-Api-Version": "2022-11-28"
53
+ }
54
+ });
55
+
56
+ console.log(`Linked issue #${issue.number} as sub-issue of ${targetRepo}#${parentNumber}`);
@@ -38,7 +38,6 @@ jobs:
38
38
  python-version: ${{ matrix.python-version }}
39
39
  - name: Install dependencies
40
40
  run: |
41
- sudo apt install graphviz libgraphviz-dev -y
42
41
  python -m pip install -e .[dev] -e .[docs] --no-cache-dir
43
42
  - name: Run tests and coverage
44
43
  run: coverage run -m unittest discover && coverage report
@@ -40,7 +40,6 @@ jobs:
40
40
  python-version: ${{ matrix.python-version }}
41
41
  - name: Install dependencies
42
42
  run: |
43
- sudo apt install graphviz libgraphviz-dev -y
44
43
  python -m pip install -e .[dev] -e .[docs] --no-cache-dir
45
44
  - name: Run tests and coverage
46
45
  run: coverage run -m unittest discover && coverage report
@@ -3,6 +3,7 @@ on:
3
3
  push:
4
4
  branches:
5
5
  - main
6
+ workflow_dispatch:
6
7
 
7
8
  jobs:
8
9
  tag_and_publish:
@@ -0,0 +1,34 @@
1
+ name: Update docs for dev PR
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - dev
7
+
8
+ jobs:
9
+ update_docs:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v3
13
+ with:
14
+ token: ${{ secrets.SERVICE_TOKEN }}
15
+ ref: ${{ github.head_ref }}
16
+ - name: Set up Python 3.10
17
+ uses: actions/setup-python@v3
18
+ with:
19
+ python-version: '3.10'
20
+ - name: Install dependencies
21
+ run: |
22
+ python -m pip install -e .[dev] -e .[docs] --no-cache-dir
23
+ - name: Generate docs
24
+ run: |
25
+ python src/aind_data_schema/utils/docs/model_generator.py
26
+ python src/aind_data_schema/utils/docs/registries_generator.py
27
+ python src/aind_data_schema/utils/docs/doc_generator.py
28
+ sphinx-build -b html docs/source/ docs/build/html
29
+ - name: Commit changes
30
+ uses: EndBug/add-and-commit@v9
31
+ with:
32
+ default_author: github_actions
33
+ message: "update docs"
34
+ add: '["docs"]'
@@ -60,7 +60,6 @@ jobs:
60
60
  python-version: '3.10'
61
61
  - name: Install dependencies
62
62
  run: |
63
- sudo apt install graphviz libgraphviz-dev -y
64
63
  python -m pip install -e .[dev] -e .[docs] --no-cache-dir
65
64
  - name: Commit changes
66
65
  uses: EndBug/add-and-commit@v9
@@ -39,7 +39,9 @@ Starting with the v2.0 release all changes must be accompanied by an [upgrader](
39
39
 
40
40
  ### Documentation
41
41
 
42
- **Note**: The core files (`docs/source/acquisition.md`, etc) are auto-generated from the base files in the folder `docs/base/core` with the model definitions appended. You must modify the **base** file or your changes will be overwritten when you run the documentation generators.
42
+ Documentation is automatically built when you open a PR into the aind-data-schema repository. For **core files, please make sure that you modify the base file**, these are used to construct the source files: i.e. `docs/base/core/acquisition.md` will over-write any changes made to `docs/source/acquisition.md`.
43
+
44
+ #### Manually build documentation
43
45
 
44
46
  To generate the source files for the documentation and model class links, run:
45
47
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aind-data-schema
3
- Version: 2.6.0
3
+ Version: 2.7.1
4
4
  Summary: A library that defines AIND data schema and validates JSON files.
5
5
  License: MIT
6
6
  Classifier: Programming Language :: Python :: 3
@@ -10,6 +10,7 @@ License-File: LICENSE
10
10
  Requires-Dist: aind-data-schema-models<6,>=5.4.1
11
11
  Requires-Dist: pydantic<2.12,>=2.7
12
12
  Requires-Dist: pydantic-extra-types
13
+ Requires-Dist: tzdata
13
14
  Provides-Extra: dev
14
15
  Requires-Dist: aind_data_schema[linters]; extra == "dev"
15
16
  Requires-Dist: pydantic!=2.9.0,!=2.9.1,>=2.7; extra == "dev"
@@ -19,9 +19,9 @@ Because the start and stop times are independent for data streams and stimulus e
19
19
 
20
20
  ## Uniqueness
21
21
 
22
- You can uniquely identify acquisition sessions (and therefore a specific data asset) by their acquisition datetime (`Acquisition.acquisition_end_time`). In addition, the `Acquisition.acquisition_type` is an open `str` field where you can put conceptual information that groups similar acquisitions together. This should not be completely redundant with project names, modalities, stimulus names, or any other fields in the metadata.
22
+ You can uniquely identify acquisition sessions (and therefore a specific data asset) by their acquisition datetime (`Acquisition.acquisition_start_time`). In addition, the `Acquisition.acquisition_type` is an open `str` field where you can put conceptual information that groups similar acquisitions together. This should not be completely redundant with project names, modalities, stimulus names, or any other fields in the metadata.
23
23
 
24
- For example, in the `"Brain Computer Interface"` project name, good acquisition types would be strings like: `"BCI: Single neuron stim"` and `"BCI: Group neuron stim"`. These phrases clearly identify what part of a project these acquisitions belong to, without being overly redundant with controlled fields in the metadata.
24
+ For example, in the `"Brain Computer Interface"` project name, good acquisition types would be strings like: `"Single neuron stim"` and `"Group neuron stim"`. These phrases clearly identify what part of a project these acquisitions belong to, without being overly redundant with controlled fields in the metadata.
25
25
 
26
26
  ## Stimulus parameters
27
27
 
@@ -26,7 +26,7 @@ If you find yourself computing a value for something smaller than an entire moda
26
26
 
27
27
  `tags` are groups of descriptors that define how metrics are organized hierarchically, making it easier to visualize metrics. Good tag keys (groups) are things like "probe" and good tag values are things like "Probe A" or just "A".
28
28
 
29
- ```{python}
29
+ ```python
30
30
  # For an electrophysiology metric
31
31
  tags = {
32
32
  "probe": "A",
@@ -19,9 +19,9 @@ Because the start and stop times are independent for data streams and stimulus e
19
19
 
20
20
  ## Uniqueness
21
21
 
22
- You can uniquely identify acquisition sessions (and therefore a specific data asset) by their acquisition datetime (`Acquisition.acquisition_end_time`). In addition, the `Acquisition.acquisition_type` is an open `str` field where you can put conceptual information that groups similar acquisitions together. This should not be completely redundant with project names, modalities, stimulus names, or any other fields in the metadata.
22
+ You can uniquely identify acquisition sessions (and therefore a specific data asset) by their acquisition datetime (`Acquisition.acquisition_start_time`). In addition, the `Acquisition.acquisition_type` is an open `str` field where you can put conceptual information that groups similar acquisitions together. This should not be completely redundant with project names, modalities, stimulus names, or any other fields in the metadata.
23
23
 
24
- For example, in the `"Brain Computer Interface"` project name, good acquisition types would be strings like: `"BCI: Single neuron stim"` and `"BCI: Group neuron stim"`. These phrases clearly identify what part of a project these acquisitions belong to, without being overly redundant with controlled fields in the metadata.
24
+ For example, in the `"Brain Computer Interface"` project name, good acquisition types would be strings like: `"Single neuron stim"` and `"Group neuron stim"`. These phrases clearly identify what part of a project these acquisitions belong to, without being overly redundant with controlled fields in the metadata.
25
25
 
26
26
  ## Stimulus parameters
27
27
 
@@ -78,23 +78,23 @@ while the StimulusEpoch represents all stimuli being presented.
78
78
  | Field | Type | Title (Description) |
79
79
  |-------|------|-------------|
80
80
  | `subject_id` | `str` | Subject ID (Unique identifier for the subject) |
81
- | `specimen_id` | `Optional[str]` | Specimen ID (Specimen ID is required for in vitro imaging modalities) |
81
+ | `specimen_id` | `str or List[str] or NoneType` | Specimen ID (Required for in vitro modalities. Standard format is {subject_id} with a _### suffix, as needed) |
82
82
  | `acquisition_start_time` | `datetime (timezone-aware)` | Acquisition start time (During validation, timezone information will be moved into the acquisition_start_tz field.) |
83
83
  | `acquisition_start_tz` | `int or pydantic_extra_types.timezone_name.TimeZoneName or NoneType` | Acquisition start timezone (Automatically populated by a validator based on acquisition_start_time. Will be a TimeZoneName (IANA name) when the datetime uses a ZoneInfo timezone, or an integer UTC offset in hours for fixed-offset timezones. Use ZoneInfo (from the zoneinfo standard library) to preserve the named timezone.) |
84
84
  | `acquisition_end_time` | `datetime (timezone-aware)` | Acquisition end time |
85
85
  | `experimenters` | `List[str]` | experimenter(s) |
86
86
  | `protocol_id` | `Optional[List[str]]` | Protocol ID (DOI for protocols.io) |
87
87
  | `ethics_review_id` | `Optional[List[str]]` | Ethics review ID |
88
- | `instrument_id` | `str` | Instrument ID (Should match the Instrument.instrument_id) |
88
+ | `instrument_id` | `Optional[str]` | Instrument ID (Should match the Instrument.instrument_id. Required when instrument metadata is available.) |
89
89
  | `acquisition_type` | `str` | Acquisition type (Descriptive string detailing the type of acquisition, should be consistent across similar acquisitions for the same experiment.) |
90
90
  | `notes` | `Optional[str]` | Notes |
91
91
  | `coordinate_system` | Optional[[CoordinateSystem](components/coordinates.md#coordinatesystem)] | Coordinate system (Origin and axis definitions for determining the configured position of devices during acquisition. Required when coordinates are provided within the Acquisition) |
92
92
  | `calibrations` | List[[Calibration](components/measurements.md#calibration) or [VolumeCalibration](components/measurements.md#volumecalibration) or [PowerCalibration](components/measurements.md#powercalibration)] | Calibrations (List of calibration measurements taken prior to acquisition.) |
93
93
  | `maintenance` | List[[Maintenance](components/measurements.md#maintenance)] | Maintenance (List of maintenance on instrument prior to acquisition.) |
94
- | `data_streams` | List[[DataStream](acquisition.md#datastream)] | Data streams (A data stream is a collection of devices that are acquiring data simultaneously. Each acquisition can include multiple streams. Streams should be split when configurations are changed.) |
94
+ | `data_streams` | List[[DataStream](acquisition.md#datastream) or [ExternalDataStream](acquisition.md#externaldatastream)] | Data streams (A data stream is a collection of devices that are acquiring data simultaneously. Each acquisition can include multiple streams. Streams should be split when configurations are changed. Use ExternalDataStream for acquisitions where instrument metadata is unavailable.) |
95
95
  | `stimulus_epochs` | List[[StimulusEpoch](acquisition.md#stimulusepoch)] | Stimulus (A stimulus epoch captures all stimuli being presented during an acquisition. Epochs should be split when the purpose of the stimulus changes.) |
96
96
  | `manipulations` | List[[Manipulation](acquisition.md#manipulation)] | Manipulations (Procedures performed during the acquisition.) |
97
- | `subject_details` | Optional[[AcquisitionSubjectDetails](acquisition.md#acquisitionsubjectdetails)] | Subject details |
97
+ | `subject_details` | Optional[[AcquisitionSubjectDetails](acquisition.md#acquisitionsubjectdetails)] | Subject details (Required for in vivo acquisitions.) |
98
98
 
99
99
 
100
100
  ## Model definitions
@@ -131,6 +131,18 @@ same time.
131
131
  | `connections` | List[[Connection](components/connections.md#connection)] | Connections (Connections are links between devices that are specific to this acquisition (i.e. not already defined in the Instrument)) |
132
132
 
133
133
 
134
+ ### ExternalDataStream
135
+
136
+ A simplified data stream for acquisitions where instrument metadata is unavailable.
137
+
138
+ | Field | Type | Title (Description) |
139
+ |-------|------|-------------|
140
+ | `stream_start_time` | `datetime (timezone-aware)` | Stream start time |
141
+ | `stream_end_time` | `datetime (timezone-aware)` | Stream stop time |
142
+ | `modalities` | List[[Modality](aind_data_schema_models/modalities.md#modality)] | Modalities (Modalities that are acquired in this stream) |
143
+ | `notes` | `Optional[str]` | Notes |
144
+
145
+
134
146
  ### Manipulation
135
147
 
136
148
  Description of procedures performed during an acquisition.
@@ -10,10 +10,12 @@ Harp device types
10
10
  |------|------|------|
11
11
  | `ANALOGINPUT` | `AnalogInput` | `1236` |
12
12
  | `ARCHIMEDES` | `Archimedes` | `1136` |
13
+ | `AUDIOSWITCH` | `AudioSwitch` | `1248` |
13
14
  | `BEHAVIOR` | `Behavior` | `1216` |
14
15
  | `CAMERACONTROLLER` | `CameraController` | `1168` |
15
16
  | `CAMERACONTROLLERGEN2` | `CameraControllerGen2` | `1170` |
16
17
  | `CLOCKSYNCHRONIZER` | `ClockSynchronizer` | `1152` |
18
+ | `CURRENTDRIVER` | `CurrentDriver` | `1282` |
17
19
  | `CUTTLEFISH` | `cuTTLefish` | `1403` |
18
20
  | `CUTTLEFISHFIP` | `cuTTLefishFip` | `1407` |
19
21
  | `DRIVER12VOLTS` | `Driver12Volts` | `1072` |
@@ -22,6 +24,7 @@ Harp device types
22
24
  | `HOBGOBLIN` | `Hobgoblin` | `123` |
23
25
  | `IBL_BEHAVIOR_CONTROL` | `Ibl_behavior_control` | `2080` |
24
26
  | `INPUTEXPANDER` | `InputExpander` | `1106` |
27
+ | `LASERDRIVERCONTROLLER` | `LaserDriverController` | `1298` |
25
28
  | `LEDCONTROLLER` | `LedController` | `1088` |
26
29
  | `LICKETYSPLIT` | `LicketySplit` | `1400` |
27
30
  | `LOADCELLS` | `LoadCells` | `1232` |
@@ -33,7 +36,7 @@ Harp device types
33
36
  | `POKE` | `Poke` | `1024` |
34
37
  | `PYCONTROLADAPTER` | `PyControlAdapter` | `1184` |
35
38
  | `RFIDREADER` | `RfidReader` | `2094` |
36
- | `RGBARRAY` | `RgbArray` | `1248` |
39
+ | `RGBARRAY` | `RgbArray` | `1264` |
37
40
  | `SIMPLEANALOGGENERATOR` | `SimpleAnalogGenerator` | `1121` |
38
41
  | `SNIFFDETECTOR` | `SniffDetector` | `1401` |
39
42
  | `SOUNDCARD` | `SoundCard` | `1280` |
@@ -86,6 +86,7 @@ Organization
86
86
  | `MIT_BCS` | `MIT-BCS` | `MIT Department of Brain and Cognitive Sciences` | `None` | `None` |
87
87
  | `MJFF` | `MJFF` | `Michael J. Fox Foundation for Parkinson's Research` | `Research Organization Registry (ROR)` | `03arq3225` |
88
88
  | `MKS_NEWPORT` | `None` | `MKS Newport` | `Research Organization Registry (ROR)` | `00k17f049` |
89
+ | `MOLECULAR_INSTRUMENTS` | `None` | `Molecular Instruments` | `None` | `None` |
89
90
  | `MONITOR_MANUFACTURERS` | `N/A` | `N/A` | `N/A` | `N/A` |
90
91
  | `MPI` | `MPI` | `MPI` | `None` | `None` |
91
92
  | `NATIONAL_INSTRUMENTS` | `None` | `National Instruments` | `Research Organization Registry (ROR)` | `026exqw73` |
@@ -476,7 +476,6 @@ Configuration of a SLAP2 imaging plane (all imaging ROIs of a specific acquisiti
476
476
  | `specimen_id` | `Optional[str]` | Specimen ID (Unique index identifying the cell being imaged: <subject_id>_###) |
477
477
  | `fov_index` | `Optional[int]` | Field of view index (For FOVs that are imaged multiple times, assign a shared index to each instance of the FOV) |
478
478
  | `structure_types` | Optional[List[[NeuronStructure](#neuronstructure)]] | Structure type |
479
- | `target_name` | `Optional[str]` | Name of imaged target |
480
479
  | `y_dilations` | `List[int]` | Unique Y dilations |
481
480
  | `y_dilations_unit` | [SizeUnit](../aind_data_schema_models/units.md#sizeunit) | Dilation unit |
482
481
  | `frame_rates` | `List[float]` | Unique frame rates |
@@ -11,6 +11,7 @@ Code or script identifier
11
11
  | `url` | `str` | Code URL (URL to code repository) |
12
12
  | `name` | `Optional[str]` | Name |
13
13
  | `version` | `Optional[str]` | Code version |
14
+ | `commit_hash` | `Optional[str]` | Commit hash (Commit hash of the code.) |
14
15
  | `container` | Optional[[Container](#container)] | Container |
15
16
  | `run_script` | `Optional[pathlib.Path]` | Run script (Path to run script) |
16
17
  | `language` | `Optional[str]` | Programming language (Programming language used) |
@@ -12,7 +12,7 @@ Description of an injection procedure
12
12
  | `targeted_structure` | Optional[[MouseAnatomyModel](../aind_data_schema_models/external.md#mouseanatomymodel)] | Injection target (Use InjectionTargets) |
13
13
  | `relative_position` | Optional[List[[AnatomicalRelative](../aind_data_schema_models/coordinates.md#anatomicalrelative)]] | Relative position |
14
14
  | `dynamics` | List[[InjectionDynamics](#injectiondynamics)] | Injection dynamics (List of injection events, one per location/depth) |
15
- | `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
15
+ | <del>`protocol_id`</del> | `Optional[str]` | **[DEPRECATED]** Use protocol_id in Surgery or NonSurgicalInjection instead. Protocol ID (DOI for protocols.io) |
16
16
 
17
17
 
18
18
  ### InjectionDynamics
@@ -41,7 +41,7 @@ Description of a single planar section of brain tissue
41
41
  | `thickness` | `Optional[float]` | Slice thickness |
42
42
  | `thickness_unit` | Optional[[SizeUnit](../aind_data_schema_models/units.md#sizeunit)] | Slice thickness unit |
43
43
  | `partial_slice` | Optional[List[[AnatomicalRelative](../aind_data_schema_models/coordinates.md#anatomicalrelative)]] | Partial slice (If sectioning does not include the entire slice, indicate which part of the slice is retained.) |
44
- | `output_specimen_id` | `str` | Specimen ID |
44
+ | `output_specimen_id` | `str` | Specimen ID (Output IDs should generally follow the format {input_specimen_id}_###) |
45
45
  | `targeted_structure` | Optional[[BrainAtlas](../aind_data_schema_models/brain_atlas.md#ccfv3)] | Targeted structure |
46
46
  | `includes_surrounding_tissue` | `Optional[bool]` | Includes surrounding tissue (Whether the section includes additional tissue surrounding the targeted structure.) |
47
47
 
@@ -63,7 +63,7 @@ Description of a single section of brain tissue. Slices should use PlanarSection
63
63
 
64
64
  | Field | Type | Title (Description) |
65
65
  |-------|------|-------------|
66
- | `output_specimen_id` | `str` | Specimen ID |
66
+ | `output_specimen_id` | `str` | Specimen ID (Output IDs should generally follow the format {input_specimen_id}_###) |
67
67
  | `targeted_structure` | Optional[[BrainAtlas](../aind_data_schema_models/brain_atlas.md#ccfv3)] | Targeted structure |
68
68
  | `includes_surrounding_tissue` | `Optional[bool]` | Includes surrounding tissue (Whether the section includes additional tissue surrounding the targeted structure.) |
69
69
  | <del>`coordinate_system_name`</del> | `Optional[str]` | **[DEPRECATED]** Use PlanarSection instead. Coordinate system name |
@@ -16,6 +16,20 @@ Description of a non-surgical procedure performed on a subject
16
16
  | `notes` | `Optional[str]` | Notes |
17
17
 
18
18
 
19
+ ### NonSurgicalInjection
20
+
21
+ Injection procedure performed outside of surgery,
22
+ which may include one or more injections at different locations/depths
23
+
24
+ | Field | Type | Title (Description) |
25
+ |-------|------|-------------|
26
+ | `start_date` | `datetime.date` | Start date |
27
+ | `ethics_review_id` | `str` | Ethics review ID |
28
+ | `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
29
+ | `injections` | List[[Injection](injection_procedures.md#injection)] | Injections |
30
+ | `notes` | `Optional[str]` | Notes |
31
+
32
+
19
33
  ### Surgery
20
34
 
21
35
  Description of subject procedures performed at one time
@@ -26,7 +26,7 @@ Description of an injection procedure into a brain
26
26
  | `injection_materials` | List[[ViralMaterial](injection_procedures.md#viralmaterial) or [NonViralMaterial](injection_procedures.md#nonviralmaterial)] | Injection material |
27
27
  | `relative_position` | Optional[List[[AnatomicalRelative](../aind_data_schema_models/coordinates.md#anatomicalrelative)]] | Relative position |
28
28
  | `dynamics` | List[[InjectionDynamics](injection_procedures.md#injectiondynamics)] | Injection dynamics (List of injection events, one per location/depth) |
29
- | `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
29
+ | <del>`protocol_id`</del> | `Optional[str]` | **[DEPRECATED]** Use protocol_id in Surgery or NonSurgicalInjection instead. Protocol ID (DOI for protocols.io) |
30
30
 
31
31
 
32
32
  ### CatheterImplant
@@ -147,7 +147,7 @@ Description of a perfusion procedure that creates a specimen
147
147
  | Field | Type | Title (Description) |
148
148
  |-------|------|-------------|
149
149
  | `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
150
- | `output_specimen_ids` | `List[str]` | Specimen ID (IDs of specimens resulting from this procedure.) |
150
+ | `output_specimen_ids` | `List[str]` | Specimen ID (IDs of specimens resulting from this procedure. Whole brains can use the {subject_id}, partial sections should always include a suffix {subject_id}_###) |
151
151
 
152
152
 
153
153
  ### ProbeImplant
@@ -33,7 +33,6 @@ I want to...
33
33
  ------------
34
34
 
35
35
  - :doc:`Create metadata for my data assets <example_workflow/example_workflow>`.
36
- - :doc:`Create metadata using the AIND metadata-mapper <todo>`.
37
36
  - :doc:`Learn about the philosophy behind aind-data-schema<general>`.
38
37
  - :doc:`Learn about how coordinate systems work<coordinate_systems>`.
39
38
  - `Report an issue or request an addition to the metadata schema <https://github.com/AllenNeuralDynamics/aind-data-schema/issues>`_.
@@ -27,7 +27,7 @@ Description of all procedures performed on a subject, including surgeries, injec
27
27
  | Field | Type | Title (Description) |
28
28
  |-------|------|-------------|
29
29
  | `subject_id` | `str` | Subject ID (Unique identifier for the subject of data acquisition) |
30
- | `subject_procedures` | List[[Surgery](components/subject_procedures.md#surgery) or [Injection](components/injection_procedures.md#injection) or [TrainingProtocol](components/subject_procedures.md#trainingprotocol) or [WaterRestriction](components/subject_procedures.md#waterrestriction) or [GenericSubjectProcedure](components/subject_procedures.md#genericsubjectprocedure)] | Subject Procedures (Procedures performed on a live subject) |
30
+ | `subject_procedures` | List[[Surgery](components/subject_procedures.md#surgery) or [Injection](components/injection_procedures.md#injection) or [NonSurgicalInjection](components/subject_procedures.md#nonsurgicalinjection) or [TrainingProtocol](components/subject_procedures.md#trainingprotocol) or [WaterRestriction](components/subject_procedures.md#waterrestriction) or [GenericSubjectProcedure](components/subject_procedures.md#genericsubjectprocedure)] | Subject Procedures (Procedures performed on a live subject) |
31
31
  | `specimen_procedures` | List[[SpecimenProcedure](components/specimen_procedures.md#specimenprocedure)] | Specimen Procedures (Procedures performed on tissue extracted after perfusion) |
32
32
  | `coordinate_system` | Optional[[CoordinateSystem](components/coordinates.md#coordinatesystem)] | Coordinate System (Origin and axis definitions for determining the configured position of devices implanted during procedures. Required when coordinates are provided within the Procedures) |
33
33
  | `notes` | `Optional[str]` | Notes |
@@ -26,7 +26,7 @@ If you find yourself computing a value for something smaller than an entire moda
26
26
 
27
27
  `tags` are groups of descriptors that define how metrics are organized hierarchically, making it easier to visualize metrics. Good tag keys (groups) are things like "probe" and good tag values are things like "Probe A" or just "A".
28
28
 
29
- ```{python}
29
+ ```python
30
30
  # For an electrophysiology metric
31
31
  tags = {
32
32
  "probe": "A",
@@ -21,5 +21,5 @@ Description of a subject of data collection
21
21
  | Field | Type | Title (Description) |
22
22
  |-------|------|-------------|
23
23
  | `subject_id` | `str` | Subject ID (Unique identifier for the subject of data acquisition) |
24
- | `subject_details` | [MouseSubject](components/subjects.md#mousesubject) or [HumanSubject](components/subjects.md#humansubject) or [CalibrationObject](components/subjects.md#calibrationobject) | Subject Details |
24
+ | `subject_details` | [MouseSubject](components/subjects.md#mousesubject) or [HumanSubject](components/subjects.md#humansubject) or [NonHumanPrimateSubject](components/subjects.md#nonhumanprimatesubject) or [CalibrationObject](components/subjects.md#calibrationobject) | Subject Details |
25
25
  | `notes` | `Optional[str]` | Notes |
@@ -14,7 +14,7 @@ The following consistency rules are enforced:
14
14
 
15
15
  Construct it as follows:
16
16
 
17
- ```{python}
17
+ ```python
18
18
  from aind_data_schema.utils.compatibility_check import InstrumentAcquisitionCompatibility
19
19
 
20
20
  # Construct your Instrument and Acquisition objects
@@ -0,0 +1,40 @@
1
+ """Example of a BARseq acquisition using ExternalDataStream.
2
+
3
+ BARseq is acquired by the AIBS Molecular Anatomy team using an instrument
4
+ and workflows not yet fully documented in the AIND schema. ExternalDataStream
5
+ is used here to record acquisition metadata without requiring full instrument
6
+ configuration details, treating the data as if it were acquired externally.
7
+ """
8
+
9
+ import argparse
10
+ from datetime import datetime
11
+ from zoneinfo import ZoneInfo
12
+
13
+ from aind_data_schema_models.modalities import Modality
14
+
15
+ from aind_data_schema.core.acquisition import Acquisition, ExternalDataStream
16
+
17
+ acquisition = Acquisition(
18
+ subject_id="123456",
19
+ specimen_id=["123456_bar001", "123456_bar002"],
20
+ acquisition_start_time=datetime(2025, 1, 1, 9, 0, 0, tzinfo=ZoneInfo("America/Los_Angeles")),
21
+ acquisition_end_time=datetime(2025, 1, 31, 17, 0, 0, tzinfo=ZoneInfo("America/Los_Angeles")),
22
+ acquisition_type="BarcodeSequencing",
23
+ data_streams=[
24
+ ExternalDataStream(
25
+ stream_start_time=datetime(2025, 1, 1, 9, 0, 0, tzinfo=ZoneInfo("America/Los_Angeles")),
26
+ stream_end_time=datetime(2025, 1, 31, 17, 0, 0, tzinfo=ZoneInfo("America/Los_Angeles")),
27
+ modalities=[Modality.BARSEQ],
28
+ notes="Acquired externally.",
29
+ )
30
+ ],
31
+ )
32
+
33
+ if __name__ == "__main__":
34
+ parser = argparse.ArgumentParser()
35
+ parser.add_argument("--output-dir", default=None, help="Output directory for generated JSON file")
36
+ args = parser.parse_args()
37
+
38
+ serialized = acquisition.model_dump_json()
39
+ deserialized = Acquisition.model_validate_json(serialized)
40
+ deserialized.write_standard_file(prefix="barseq", output_directory=args.output_dir)